tapajos-slicehost-tools 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2008 Cameron Cox <cameroncox@gmail.com>
4
+ "SliceHost" and "slice" are trademarks of Slicehost, LLC.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,44 @@
1
+ # slicehost-tools
2
+
3
+ Manage Slicehost Slices and DNS records/zones from the command line.
4
+
5
+ ## WARNING
6
+
7
+ I am not responsible if this eats your data or destroys your life. YOU HAVE BEEN WARNED.
8
+
9
+ ## Installation
10
+
11
+ gem sources -a http://gems.github.com
12
+
13
+ sudo gem install wycats-thor
14
+ sudo gem install uhlenbrock-slicehost-tools
15
+
16
+ ## Usage
17
+
18
+ slicehost-dns
19
+
20
+ add [DOMAIN] [IP] add a domain for the given ip
21
+ google_apps [DOMAIN] [IP] configure Google Apps for the given domain (new or existing)
22
+ add_a [DOMAIN] [NAME] [IP] add a A record to an existing domain
23
+ add_assets [DOMAIN] [IP] add a 4 assets hosts (assets0..assets3) to an existing domain
24
+ add_cname [DOMAIN] [NAME] [CNAME] add a CNAME record to an existing domain
25
+ list lists all zones and their associated records
26
+ delete [DOMAIN] removes a domain
27
+ apikey [APIKEY] set your Slicehost API Key and save it to ~/.slicehost-tools
28
+ to_zonefile [DOMAIN] output a zone file for the given domain
29
+ help [TASK] describe available tasks or one specific task
30
+
31
+ slicehost-slice
32
+
33
+ add [SLICE NAME] [--force] add a new slice
34
+ delete [SLICE] delete a slice
35
+ list list slices
36
+ hard_reboot [SLICE] perform a hard reboot
37
+ soft_reboot [SLICE] perform a soft reboot
38
+ apikey [APIKEY] set your Slicehost API Key and save it to ~/.slicehost-tools
39
+ help [TASK] describe available tasks or one specific task
40
+
41
+ ## TODO
42
+
43
+ [DONE] Finish up the slice tool
44
+ Multiple Slicehost accounts? (not likely, but an idea)
data/Rakefile ADDED
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/gempackagetask'
4
+
5
+ gem_spec = Gem::Specification.new do |s|
6
+ s.name = %q{slicehost-tools}
7
+ s.version = "0.0.8"
8
+
9
+ s.specification_version = 2 if s.respond_to? :specification_version=
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.authors = ["Cameron Cox", "Bobby Uhlenbrock", "Corey Martella"]
13
+ s.date = %q{2008-09-10}
14
+ s.summary = %q{tools utilizing the slicehost api}
15
+ s.email = %q{bobby@uhlenbrock.us}
16
+ s.executables = ["slicehost-dns", "slicehost-slice"]
17
+ s.extra_rdoc_files = ["README.markdown", "LICENSE"]
18
+ s.files = Dir['**/**'].reject{ |f| f =~ /pkg/i }
19
+ s.has_rdoc = false
20
+ s.homepage = %q{http://github.com/uhlenbrock/slicehost-tools/}
21
+ s.require_paths = ["lib"]
22
+ s.rubygems_version = %q{1.1.1}
23
+ s.add_dependency("wycats-thor", ">= 0.9.2")
24
+ s.add_dependency("activeresource", ">= 2.1.1")
25
+ end
26
+
27
+ Rake::GemPackageTask.new(gem_spec) do |p|
28
+ p.gem_spec = gem_spec
29
+ p.need_tar = true
30
+ p.need_zip = true
31
+ end
32
+
33
+ namespace :gem do
34
+ namespace :spec do
35
+ desc "Update slicehost-tools.gemspec"
36
+ task :generate do
37
+ File.open("slicehost-tools.gemspec", "w") do |f|
38
+ f.puts(gem_spec.to_ruby)
39
+ end
40
+ end
41
+ end
42
+ end
data/bin/slicehost-dns ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + "/../lib/slicehost-tools"
3
+ require File.dirname(__FILE__) + "/../lib/slicehost-tools/tools/dns"
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + "/../lib/slicehost-tools"
3
+ require File.dirname(__FILE__) + "/../lib/slicehost-tools/tools/slice"
@@ -0,0 +1,20 @@
1
+ class Zone < Resource
2
+
3
+ def records(reload = false)
4
+ @records = nil if reload
5
+ @records ||= Record.find(:all, :params => { :zone_id => self.id })
6
+ end
7
+
8
+ class << self
9
+ def find_by_origin(origin)
10
+ find(:first, :params => { :origin => "#{origin}." })
11
+ end
12
+ end
13
+ end
14
+
15
+ class Record < Resource
16
+ def self.to_zone_rr(options = {})
17
+ id = "; ID=#{options[:id]}" if options[:id]
18
+ "%-20s %-10s IN %-10s %-25s %s" % [options[:name], options[:ttl], options[:type], options[:data], id]
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ class Address < String
2
+ end
3
+
4
+ class Slice < Resource
5
+ class << self
6
+ def find_by_name(name)
7
+ find(:first, :params => { :name => name })
8
+ end
9
+ end
10
+
11
+ def flavor
12
+ Flavor.find(flavor_id)
13
+ end
14
+
15
+ def image
16
+ Image.find(image_id)
17
+ end
18
+ end
19
+
20
+ class Flavor < Resource
21
+ def to_s; self.name;
22
+ end
23
+ end
24
+
25
+ class Image < Resource
26
+ def to_s; self.name;
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+
2
+ if File.exists? File.join(ENV['HOME'], ".slicehost-tools")
3
+ load File.join(ENV['HOME'], ".slicehost-tools")
4
+ else
5
+ require File.expand_path(File.dirname(__FILE__) + "/tools")
6
+ Tools::Default.start(['apikey'])
7
+ exit
8
+ end
9
+
10
+ class Resource < ActiveResource::Base
11
+ self.site = "http://#{SlicehostSecretKey}@api.slicehost.com" if defined?(SlicehostSecretKey)
12
+ end
@@ -0,0 +1,205 @@
1
+ require File.dirname(__FILE__) + "/../resources/dns"
2
+
3
+ module Tools
4
+ class DNS < Default
5
+
6
+ map "-L" => :list
7
+
8
+ desc "add [DOMAIN] [IP]", "add a domain for the given ip"
9
+ def add(domain = nil, ip = nil)
10
+ unless domain
11
+ puts "Please give a domain to add:"
12
+ domain = STDIN.gets.chomp
13
+ end
14
+
15
+ unless ip
16
+ puts "Please give the IP to use for this domain:"
17
+ ip = STDIN.gets.chomp
18
+ end
19
+
20
+ zone = Zone.new( :origin => "#{domain}.", :ttl => 3660, :active => "Y" )
21
+
22
+ if zone.save
23
+ Record.new( :record_type => 'NS', :zone_id => zone.id, :name => "#{domain}.", :data => "ns1.slicehost.net" ).save
24
+ Record.new( :record_type => 'NS', :zone_id => zone.id, :name => "#{domain}.", :data => "ns2.slicehost.net" ).save
25
+ Record.new( :record_type => 'NS', :zone_id => zone.id, :name => "#{domain}.", :data => "ns3.slicehost.net" ).save
26
+ Record.new( :record_type => 'A', :zone_id => zone.id, :name => "#{domain}.", :data => "#{ip}" ).save
27
+ Record.new( :record_type => 'CNAME', :zone_id => zone.id, :name => "www", :data => "#{domain}.").save
28
+ Record.new( :record_type => 'CNAME', :zone_id => zone.id, :name => "ftp", :data => "#{domain}.").save
29
+ puts "#{domain} added successfully."
30
+ else
31
+ puts "\n#{domain} could not be added."
32
+ puts zone.errors.full_messages.to_yaml
33
+ end
34
+ end
35
+
36
+ desc "google_apps [DOMAIN] [IP]", "cofigure Google Apps for the given domain (new or existing)"
37
+ def google_apps(domain = nil, ip = nil)
38
+ unless domain
39
+ puts "Please give a domain to configure:"
40
+ domain = STDIN.gets.chomp
41
+ end
42
+ unless zone = Zone.find(:first, :params => { :origin => "#{domain}." })
43
+ add(domain, ip)
44
+ zone = Zone.find(:first, :params => { :origin => "#{domain}." })
45
+ end
46
+
47
+ Record.new( :record_type => 'CNAME', :zone_id => zone.id, :name => "mail", :data => "ghs.google.com." ).save
48
+ Record.new( :record_type => 'MX', :zone_id => zone.id, :name => "#{domain}.", :data => "ASPMX.L.GOOGLE.COM.", :aux => "1" ).save
49
+ Record.new( :record_type => 'MX', :zone_id => zone.id, :name => "#{domain}.", :data => "ALT1.ASPMX.L.GOOGLE.COM.", :aux => "5" ).save
50
+ Record.new( :record_type => 'MX', :zone_id => zone.id, :name => "#{domain}.", :data => "ALT2.ASPMX.L.GOOGLE.COM.", :aux => "5" ).save
51
+ Record.new( :record_type => 'MX', :zone_id => zone.id, :name => "#{domain}.", :data => "ASPMX2.GOOGLEMAIL.COM.", :aux => "10" ).save
52
+ Record.new( :record_type => 'MX', :zone_id => zone.id, :name => "#{domain}.", :data => "ASPMX3.GOOGLEMAIL.COM.", :aux => "10" ).save
53
+ puts "#{domain} configured for Google Apps."
54
+ end
55
+
56
+ desc "list [DOMAIN]", "lists all zones and their associated records"
57
+ def list(domain = nil)
58
+ list_params = { :origin => "#{domain}." } unless domain.nil?
59
+ list_params ||= {}
60
+ Zone.find(:all, :params => list_params).each do |zone|
61
+ puts "+ #{zone.origin}"
62
+ zone.records.each do |record|
63
+ puts [' -', "[#{record.record_type}]".ljust(7, ' '), "#{record.name}"].join(' ')
64
+ end
65
+ end
66
+ end
67
+
68
+ desc "to_zonefile [DOMAIN]", "output a zone file for the given domain"
69
+ def to_zonefile(domain = nil)
70
+ abort "You must give a domain" if domain.nil?
71
+ zone = Zone.find_by_origin(domain)
72
+
73
+ puts "\$ORIGIN #{zone.origin.sub(/\.$/, '')}"
74
+ puts "\$TTL #{zone.ttl}"
75
+ puts "@ IN SOA ns.slicehost.net. hostmaster.#{zone.origin} ("
76
+ puts " %-14s ; serial number" % Time.now.strftime('%Y%m%d%H%M%S')
77
+ puts " %-14s ; time to refresh" % '1d'
78
+ puts " %-14s ; time to retry" % '1d'
79
+ puts " %-14s ; time to expire" % '4w'
80
+ puts " %-14s ; minimum ttl" % '1h'
81
+ puts ")"
82
+ puts ""
83
+ [1,2,3].each do |i|
84
+ puts Record.to_zone_rr(:name => '@',
85
+ :type => 'NS',
86
+ :data => "ns#{i}.slicehost.net")
87
+ end
88
+
89
+ records_by_type = {}
90
+ zone.records.each do |r|
91
+ records_by_type[r.record_type] ||= []
92
+ records_by_type[r.record_type] << r
93
+ end
94
+
95
+ ['NS', 'MX', 'TXT', 'SRV', 'A', 'PTR', 'AAAA', 'CNAME'].each do |type|
96
+ next if records_by_type[type].nil?
97
+ puts ""
98
+ records_by_type[type].sort {|a,b| a.name == zone.origin ? -1 : a.name <=> b.name}.each do |record|
99
+ name = record.name == zone.origin ? '@' : record.name
100
+ ttl = '' if record.ttl == zone.ttl
101
+ aux = ''
102
+ data = record.data
103
+ case record.record_type
104
+ when 'MX'
105
+ data = "#{record.aux} #{data}"
106
+ when 'SRV'
107
+ data = "#{record.aux} #{data}"
108
+ when 'TXT'
109
+ data = "\"#{record.data}\""
110
+ end
111
+ puts Record.to_zone_rr(:id => record.id,
112
+ :name => name,
113
+ :ttl => ttl,
114
+ :type => record.record_type,
115
+ :data => data)
116
+ end
117
+ end
118
+ end
119
+
120
+ desc "delete [DOMAIN]", "removes a domain"
121
+ def delete(domain = nil)
122
+ abort "You must give a domain" if domain.nil?
123
+
124
+ puts "Type the phrase \"I am sure\" to remove this zone"
125
+ @sure = false
126
+ case STDIN.gets.chomp
127
+ when "I am sure"
128
+ @sure = true
129
+ end
130
+
131
+ if @sure && domain
132
+ Zone.find_by_origin(domain).destroy
133
+ puts "#{domain} is no more."
134
+ else
135
+ puts "aborting"
136
+ end
137
+ end
138
+
139
+ desc "add_a [DOMAIN] [NAME] [IP]", "Add an A record to an existing domain"
140
+ def add_a(domain=nil,name=nil,ip=nil)
141
+ unless domain
142
+ puts "Please give a domain to configure:"
143
+ domain = STDIN.gets.chomp
144
+ end
145
+ #lookup the zone
146
+ unless zone = Zone.find(:first, :params => { :origin => "#{domain}." })
147
+ error "Zone #{domain} does not exist, use slicetool-dns add #{domain} IP first!"
148
+ end
149
+ unless name
150
+ puts "Please give a name to configure:"
151
+ name = STDIN.gets.chomp
152
+ end
153
+ unless ip
154
+ puts "Please give a IP to map:"
155
+ ip = STDIN.gets.chomp
156
+ end
157
+ Record.new( :record_type => 'A', :zone_id => zone.id, :name => name, :data => "#{ip}" ).save
158
+ puts "Added #{name} ==> #{ip} to #{domain}"
159
+ end
160
+ desc "add_cname [DOMAIN] [NAME] [CNAME]", "Add a CNAME record to an existing domain"
161
+ def add_cname(domain,name,cname)
162
+ unless domain
163
+ puts "Please give a domain to configure:"
164
+ domain = STDIN.gets.chomp
165
+ end
166
+ #lookup the zone
167
+ unless zone = Zone.find(:first, :params => { :origin => "#{domain}." })
168
+ error "Zone #{domain} does not exist, use slicetool-dns add #{domain} IP first!"
169
+ end
170
+ unless name
171
+ puts "Please give a name to configure:"
172
+ name = STDIN.gets.chomp
173
+ end
174
+ unless cname
175
+ puts "Please give a CNAME to map:"
176
+ cname = STDIN.gets.chomp
177
+ end
178
+ Record.new( :record_type => 'CNAME', :zone_id => zone.id, :name => name, :data => cname ).save
179
+ puts "Added #{name} ==> #{cname} to #{domain}"
180
+ end
181
+ desc "add_assets [DOMAIN] [IP]", "Add a assets0..3 to an existing domain"
182
+
183
+ def add_assets(domain,ip)
184
+ unless domain
185
+ puts "Please give a domain to configure:"
186
+ domain = STDIN.gets.chomp
187
+ end
188
+ #lookup the zone
189
+ unless zone = Zone.find(:first, :params => { :origin => "#{domain}." })
190
+ error "Zone #{domain} does not exist, use slicetool-dns add #{domain} IP first!"
191
+ end
192
+ unless ip
193
+ puts "Please give a IP to map:"
194
+ cname = STDIN.gets.chomp
195
+ end
196
+ 0.upto(3) do |i|
197
+ Record.new( :record_type => 'A', :zone_id => zone.id, :name => "assets#{i}" , :data => ip).save
198
+ end
199
+ puts "Added 4 assets hosts at ip to #{domain}"
200
+ end
201
+ # init Thor
202
+ start
203
+
204
+ end
205
+ end
@@ -0,0 +1,131 @@
1
+ require File.dirname(__FILE__) + "/../resources/slice"
2
+
3
+ module Tools
4
+ class Slice < Default
5
+
6
+ map "-L" => :list
7
+
8
+ desc "add [SLICE NAME]", "add a new slice"
9
+ method_options :force => :boolean
10
+ def add(slice_name, opts)
11
+ images = ::Image.find(:all)
12
+ flavors = ::Flavor.find(:all)
13
+
14
+ puts "Available Images: "
15
+ image_id = select_image_from(images)
16
+
17
+ puts "Available Flavors: "
18
+ flavor_id = select_flavor_from(flavors)
19
+
20
+ @add = false
21
+ # confirm you want to do this, it does cost money
22
+ unless opts[:force]
23
+ print "Are you sure you want do this? [y/N]: "
24
+ case STDIN.gets.chomp
25
+ when /y/i
26
+ @add = true
27
+ end
28
+ end
29
+
30
+ if @add
31
+ slice = ::Slice.new(:name => slice_name, :flavor_id => flavor_id, :image_id => image_id)
32
+ slice.save
33
+ end
34
+
35
+ end
36
+
37
+ desc "delete [SLICE]", "delete a slice"
38
+ def delete(slice_name = nil)
39
+ slice_name = select_slice.name if slice_name.nil?
40
+
41
+ @abort = true
42
+ slice = ::Slice.find_by_name(slice_name)
43
+ puts "Please type 'I understand this is not undoable' to proceed: "
44
+ case STDIN.gets.chomp
45
+ when "I understand this is not undoable"
46
+ @abort = false
47
+ end
48
+
49
+ unless @abort
50
+ puts "You have 5 seconds to change your mind (CTRL+C)"
51
+ sleep 5
52
+ puts "Say goodnight gracie."
53
+ slice.destroy
54
+ sleep 3
55
+ puts "Goodnight gracie."
56
+ else
57
+ puts "Your slice has not been nuked. (I hope)"
58
+ end
59
+
60
+ end
61
+
62
+ desc "list", "list slices"
63
+ def list
64
+ ::Slice.find(:all).each do |slice|
65
+ puts "+ #{slice.name} (#{slice.addresses})"
66
+ end
67
+ end
68
+
69
+ desc "status [SLICENAME]", "get information about a slice"
70
+ def status(slice_name = nil)
71
+ slice_name = select_slice.name if slice_name.nil?
72
+
73
+ slice = ::Slice.find_by_name(slice_name)
74
+ puts "Name: #{slice.name} (#{slice.addresses})"
75
+ puts "Flavor: #{slice.flavor} (#{slice.image})"
76
+ puts "Status: #{slice.status}"
77
+ puts "Bandwidth (in/out): #{slice.bw_in}/#{slice.bw_out}"
78
+ end
79
+
80
+ desc "hard_reboot [SLICE]", "perform a hard reboot"
81
+ def hard_reboot(slice_name = nil)
82
+ slice_name = select_slice.name if slice_name.nil?
83
+
84
+ puts "(hard) rebooting #{slice_name}"
85
+ reboot(:hard_reboot, slice_name)
86
+ end
87
+
88
+ desc "soft_reboot [SLICE]", "perform a soft reboot"
89
+ def soft_reboot(slice_name = nil)
90
+ slice_name = select_slice.name if slice_name.nil?
91
+
92
+ puts "(soft) rebooting #{slice_name}"
93
+ reboot(:reboot, slice_name)
94
+ end
95
+
96
+
97
+ protected
98
+
99
+ def select_slice
100
+ slices = ::Slice.find(:all)
101
+ slices.each_index { |i| puts "[#{i}] #{slices[i].name}" }
102
+ print "Select a Slice by #: "
103
+ input = STDIN.gets.chomp.to_i
104
+ slices[input]
105
+ end
106
+
107
+ def select_image_from(images)
108
+ images.each_index { |i| puts "[#{i}] #{images[i].name}" }
109
+ print "Select an Image by #: "
110
+ input = STDIN.gets.chomp.to_i
111
+ images[input].id
112
+ end
113
+
114
+ def select_flavor_from(flavors)
115
+ flavors.each_index { |i| puts "[#{i}] #{flavors[i].name} (#{flavors[i].ram}mb) ($#{flavors[i].price}/month)" }
116
+ print "Select an Image by #: "
117
+ input = STDIN.gets.chomp.to_i
118
+ flavors[input].id
119
+ end
120
+
121
+ def reboot(type, slice_name)
122
+ slice = ::Slice.find_by_name(slice_name)
123
+ slice.put(type)
124
+ end
125
+
126
+ public
127
+
128
+ # init thor
129
+ start
130
+ end
131
+ end
@@ -0,0 +1,35 @@
1
+ module Tools
2
+
3
+ class Default < Thor
4
+
5
+ desc "apikey [APIKEY]",
6
+ "set your Slicehost API Key and save it to ~/.slicehost-tools"
7
+ def apikey(apikey = nil)
8
+ @write_file = false
9
+ unless File.exists? File.join(ENV['HOME'], '.slicehost-tools')
10
+ @write_file = true
11
+ else
12
+ # it does exist, ask.
13
+ print "This will replace the stored key, are you sure? [y/N] "
14
+ case STDIN.gets.chomp
15
+ when /y/i
16
+ @write_file = true
17
+ end
18
+ end
19
+
20
+ # ask for api key if none is given
21
+ if apikey.nil? && @write_file
22
+ puts "Please enter your API key since you did not provide one: "
23
+ apikey = STDIN.gets.chomp
24
+ end
25
+
26
+ # write the api key to file
27
+ if @write_file
28
+ File.open( File.join(ENV['HOME'], '.slicehost-tools'), File::RDWR|File::TRUNC|File::CREAT, 0664 ) do |f|
29
+ f.puts "SlicehostSecretKey = '#{apikey}'"
30
+ f.close
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ %w( rubygems thor activeresource fileutils ).each do |dep|
2
+ begin
3
+ require dep
4
+ rescue LoadError
5
+ abort "#{dep} is required for the slicehost-tools suite to run."
6
+ end
7
+ end
8
+
9
+ require File.dirname(__FILE__) + "/slicehost-tools/resources"
10
+ require File.dirname(__FILE__) + "/slicehost-tools/tools"
11
+
12
+ trap('INT') { exit }
@@ -0,0 +1,32 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{slicehost-tools}
3
+ s.version = "0.0.8"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["Cameron Cox", "Bobby Uhlenbrock", "Corey Martella"]
7
+ s.date = %q{2008-09-10}
8
+ s.email = %q{bobby@uhlenbrock.us}
9
+ s.executables = ["slicehost-dns", "slicehost-slice"]
10
+ s.extra_rdoc_files = ["README.markdown", "LICENSE"]
11
+ s.files = ["bin", "bin/slicehost-dns", "bin/slicehost-slice", "lib", "lib/slicehost-tools", "lib/slicehost-tools/resources", "lib/slicehost-tools/resources/dns.rb", "lib/slicehost-tools/resources/slice.rb", "lib/slicehost-tools/resources.rb", "lib/slicehost-tools/tools", "lib/slicehost-tools/tools/dns.rb", "lib/slicehost-tools/tools/slice.rb", "lib/slicehost-tools/tools.rb", "lib/slicehost-tools.rb", "LICENSE", "Rakefile", "README.markdown", "slicehost-tools.gemspec"]
12
+ s.homepage = %q{http://github.com/uhlenbrock/slicehost-tools/}
13
+ s.require_paths = ["lib"]
14
+ s.rubygems_version = %q{1.2.0}
15
+ s.summary = %q{tools utilizing the slicehost api}
16
+
17
+ if s.respond_to? :specification_version then
18
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
19
+ s.specification_version = 2
20
+
21
+ if current_version >= 3 then
22
+ s.add_runtime_dependency(%q<wycats-thor>, [">= 0.9.2"])
23
+ s.add_runtime_dependency(%q<activeresource>, [">= 2.1.1"])
24
+ else
25
+ s.add_dependency(%q<wycats-thor>, [">= 0.9.2"])
26
+ s.add_dependency(%q<activeresource>, [">= 2.1.1"])
27
+ end
28
+ else
29
+ s.add_dependency(%q<wycats-thor>, [">= 0.9.2"])
30
+ s.add_dependency(%q<activeresource>, [">= 2.1.1"])
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tapajos-slicehost-tools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.8
5
+ platform: ruby
6
+ authors:
7
+ - Cameron Cox
8
+ - Bobby Uhlenbrock
9
+ - Corey Martella
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+
14
+ date: 2008-09-10 00:00:00 -07:00
15
+ default_executable:
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: wycats-thor
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.9.2
25
+ version:
26
+ - !ruby/object:Gem::Dependency
27
+ name: activeresource
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.1
34
+ version:
35
+ description:
36
+ email: bobby@uhlenbrock.us
37
+ executables:
38
+ - slicehost-dns
39
+ - slicehost-slice
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - README.markdown
44
+ - LICENSE
45
+ files:
46
+ - bin
47
+ - bin/slicehost-dns
48
+ - bin/slicehost-slice
49
+ - lib
50
+ - lib/slicehost-tools
51
+ - lib/slicehost-tools/resources
52
+ - lib/slicehost-tools/resources/dns.rb
53
+ - lib/slicehost-tools/resources/slice.rb
54
+ - lib/slicehost-tools/resources.rb
55
+ - lib/slicehost-tools/tools
56
+ - lib/slicehost-tools/tools/dns.rb
57
+ - lib/slicehost-tools/tools/slice.rb
58
+ - lib/slicehost-tools/tools.rb
59
+ - lib/slicehost-tools.rb
60
+ - LICENSE
61
+ - Rakefile
62
+ - README.markdown
63
+ - slicehost-tools.gemspec
64
+ has_rdoc: false
65
+ homepage: http://github.com/uhlenbrock/slicehost-tools/
66
+ post_install_message:
67
+ rdoc_options: []
68
+
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "0"
82
+ version:
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.2.0
87
+ signing_key:
88
+ specification_version: 2
89
+ summary: tools utilizing the slicehost api
90
+ test_files: []
91
+