engineyard-dns 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,3 +3,7 @@ rvm:
3
3
  - 1.9.2
4
4
  - rbx
5
5
  - ree
6
+ notifications:
7
+ recipients:
8
+ - drnicwilliams@gmail.com
9
+ - me@martinemde.com
@@ -19,9 +19,9 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency("thor")
23
- s.add_dependency("engineyard")
24
- s.add_dependency("fog")
22
+ s.add_dependency("engineyard", "1.3.20")
23
+ s.add_dependency("fog", "~> 0.8.2")
24
+ s.add_dependency("ipaddress", "~> 0.8")
25
25
 
26
26
  s.add_development_dependency("rake", ["~> 0.9.0"])
27
27
  s.add_development_dependency("cucumber", ["~> 0.10"])
@@ -12,63 +12,63 @@ Feature: Assign DNS to environment IP address via DNSimple
12
12
  Then I should see exactly
13
13
  """
14
14
  Fetching AppCloud environment information...
15
- Found AppCloud environment giblets on account main with IP 174.129.7.113
15
+ AppCloud environment main/giblets has IP 127.0.0.0
16
16
 
17
17
  Searching for myapp.com amongst your DNS providers...
18
18
  Found myapp.com in DNSimple account
19
19
 
20
- Assigning myapp.com --> 174.129.7.113 (main/giblets)
20
+ Assigning myapp.com --> 127.0.0.0 (main/giblets)
21
21
  Created A record for myapp.com
22
- Assigning www.myapp.com --> 174.129.7.113 (main/giblets)
22
+ Assigning www.myapp.com --> 127.0.0.0 (main/giblets)
23
23
  Created A record for www.myapp.com
24
24
  Complete!
25
25
 
26
26
  """
27
27
  # Found 2 records for myapp.com
28
- # .myapp.com (A)-> 174.129.7.113 (ttl:60, id:\d+)
29
- # www.myapp.com (A)-> 174.129.7.113 (ttl:60, id:\d+)
28
+ # .myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
29
+ # www.myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
30
30
 
31
31
  Scenario: Resssign DNS A Record to an environment
32
32
  When I run local executable "ey-dns" with arguments "assign myapp.com --account main --environment giblets"
33
- And I run local executable "ey-dns" with arguments "assign myapp.com --account main --environment giblets --override"
33
+ And I run local executable "ey-dns" with arguments "assign myapp.com --account main --environment giblets --force"
34
34
  Then I should see matching
35
35
  """
36
36
  Fetching AppCloud environment information...
37
- Found AppCloud environment giblets on account main with IP 174.129.7.113
37
+ AppCloud environment main/giblets has IP 127.0.0.0
38
38
 
39
39
  Searching for myapp.com amongst your DNS providers...
40
40
  Found myapp.com in DNSimple account
41
41
 
42
42
  Deleted myapp.com
43
- Assigning myapp.com --> 174.129.7.113 (main/giblets)
43
+ Assigning myapp.com --> 127.0.0.0 (main/giblets)
44
44
  Created A record for myapp.com
45
45
  Deleted www.myapp.com
46
- Assigning www.myapp.com --> 174.129.7.113 (main/giblets)
46
+ Assigning www.myapp.com --> 127.0.0.0 (main/giblets)
47
47
  Created A record for www.myapp.com
48
48
  Complete!
49
49
 
50
50
  """
51
51
  # Found 2 records for myapp.com
52
- # .myapp.com (A)-> 174.129.7.113 (ttl:60, id:\d+)
53
- # www.myapp.com (A)-> 174.129.7.113 (ttl:60, id:\d+)
52
+ # .myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
53
+ # www.myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
54
54
 
55
55
  Scenario: Assign subdomain A Record to an environment
56
56
  When I run local executable "ey-dns" with arguments "assign myapp.com staging --account main --environment giblets"
57
57
  Then I should see exactly
58
58
  """
59
59
  Fetching AppCloud environment information...
60
- Found AppCloud environment giblets on account main with IP 174.129.7.113
60
+ AppCloud environment main/giblets has IP 127.0.0.0
61
61
 
62
62
  Searching for myapp.com amongst your DNS providers...
63
63
  Found myapp.com in DNSimple account
64
64
 
65
- Assigning staging.myapp.com --> 174.129.7.113 (main/giblets)
65
+ Assigning staging.myapp.com --> 127.0.0.0 (main/giblets)
66
66
  Created A record for staging.myapp.com
67
67
  Complete!
68
68
 
69
69
  """
70
70
  # Found 1 records for myapp.com
71
- # staging.myapp.com (A)-> 174.129.7.113 (ttl:60, id:\d+)
71
+ # staging.myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
72
72
 
73
73
 
74
74
 
@@ -0,0 +1,17 @@
1
+ Feature: Missing credentials
2
+ I want to be educated/helped when I don't have credentials setup correctly
3
+
4
+ Scenario: Show example .fog file if credentials are missing
5
+ Given I have not setup my fog credentials
6
+ When I run local executable "ey-dns" with arguments "domains"
7
+ Then I should see exactly
8
+ """
9
+ ERROR: Missing credentials for DNS providers.
10
+ An example ~/.fog credentials file has been created for you.
11
+
12
+ """
13
+ And file "~/.fog" is created
14
+
15
+
16
+
17
+
@@ -63,7 +63,7 @@ end
63
63
 
64
64
  Then /^file "(.*)" (is|is not) created/ do |file, is|
65
65
  in_project_folder do
66
- File.exists?(file).should(is == 'is' ? be_true : be_false)
66
+ File.exists?(File.expand_path(file)).should(is == 'is' ? be_true : be_false)
67
67
  end
68
68
  end
69
69
 
@@ -2,6 +2,10 @@ Given /^I have setup my fog credentials for "([^"]*)"$/ do |provider|
2
2
  setup_dns_credentials(provider)
3
3
  end
4
4
 
5
+ Given /^I have not setup my fog credentials$/ do
6
+ remove_dns_credentials
7
+ end
8
+
5
9
  Given /^I have DNS domain "([^"]*)" with provider "([^"]*)"$/ do |domain, provider|
6
10
  setup_domain(provider, domain)
7
11
  end
@@ -1,7 +1,7 @@
1
1
  module FogHelpers
2
2
  def setup_dns_credentials(provider)
3
3
  email, password = "ossgrants+dns@engineyard.com", "ossgrants1"
4
- File.open("#{ENV['HOME']}/.fog", "w") do |file|
4
+ File.open(fog_credentials_file, "w") do |file|
5
5
  @credentials = case provider.to_sym
6
6
  when :DNSimple
7
7
  { :dnsimple_email => email, :dnsimple_password => password}
@@ -12,15 +12,21 @@ module FogHelpers
12
12
  end
13
13
  end
14
14
 
15
+ def remove_dns_credentials
16
+ FileUtils.rm_rf(fog_credentials_file)
17
+ end
18
+
15
19
  def setup_domain(provider, domain)
16
- dns_provider(provider).zones.select { |z| z.domain == domain }.each do |domain|
17
- domain.destroy
18
- end
20
+ dns_provider(provider).zones.select { |z| z.domain == domain }.each { |z| z.destroy }
19
21
  dns_provider(provider).zones.create(:domain => domain)
20
22
  end
21
23
 
22
24
  def dns_provider(provider)
23
25
  @dns_provider ||= Fog::DNS.new({:provider => provider})
24
26
  end
27
+
28
+ def fog_credentials_file
29
+ File.expand_path("#{ENV['HOME']}/.fog")
30
+ end
25
31
  end
26
32
  World(FogHelpers)
@@ -1,5 +1,4 @@
1
1
  module EngineYard
2
2
  module DNS
3
- # Your code goes here...
4
3
  end
5
4
  end
@@ -5,12 +5,12 @@ require "engineyard/cli/ui"
5
5
  require "engineyard/error"
6
6
  require "fog"
7
7
  require "fog/bin"
8
+ require "ipaddress"
8
9
 
9
10
  module EngineYard
10
11
  module DNS
11
12
  class CLI < Thor
12
13
  include EY::UtilityMethods
13
- # include Thor::Actions
14
14
 
15
15
  def self.start(*)
16
16
  Thor::Base.shell = EY::CLI::UI
@@ -18,54 +18,42 @@ module EngineYard
18
18
  super
19
19
  end
20
20
 
21
- desc "assign DOMAIN [NAME]", "Assign DNS domain/tld (or name.tld) to your AppCloud environment"
22
- method_option :verbose, :aliases => ["-V"], :desc => "Display more output"
23
- method_option :environment, :aliases => ["-e"], :desc => "Environment in which to deploy this application", :type => :string
24
- method_option :account, :aliases => ["-c"], :desc => "Name of the account you want to deploy in"
25
- method_option :override, :aliases => ["-o"], :type => :boolean, :desc => "Override DNSimple records if they already exist"
26
- def assign(domain_name, name = "")
27
- say "Fetching AppCloud environment information..."; $stdout.flush
21
+ desc "assign DOMAIN [SUBDOMAIN]", "Assign DNS domain/tld (or name.tld) to your AppCloud environment"
22
+ method_option :environment, :aliases => ["-e"], :desc => "Environment containing the IP to which to resolve", :type => :string
23
+ method_option :account, :aliases => ["-c"], :desc => "Name of the account where the environment is found"
24
+ method_option :force, :aliases => ["-f"], :desc => "Override DNS records if they already exist", :type => :boolean
25
+ def assign(domain_name, subdomain = "")
26
+ $stdout.sync
27
+ validate_fog_credentials
28
28
 
29
+ say "Fetching AppCloud environment information..."
29
30
  environment = fetch_environment(options[:environment], options[:account])
30
- account_name, env_name = environment.account.name, environment.name
31
- unless environment.instances.first
32
- error "Environment #{account_name}/#{env_name} has no booted instances."
33
- end
34
- public_hostname = environment.instances.first.public_hostname
35
- status = environment.instances.first.status
36
-
37
- # TODO - use DNS client to convert public_hostname into IP address
38
- unless public_hostname =~ /ec2-(\d+)-(\d+)-(\d+)-(\d+)/
39
- error "Cannot determine public IP from current hostname #{public_hostname}"
40
- end
41
- public_ip = "#{$1}.#{$2}.#{$3}.#{$4}"
42
31
 
43
- say "Found AppCloud environment #{env_name} on account #{account_name} with IP #{public_ip}"
44
-
32
+ public_ip = fetch_public_ip(environment)
33
+
45
34
  say ""
46
- say "Searching for #{domain_name} amongst your DNS providers..."; $stdout.flush
35
+ say "Searching for #{domain_name} amongst your DNS providers..."
47
36
 
48
37
  domain, provider_name = find_domain(domain_name)
49
38
  unless domain
50
39
  error "Please register domain #{domain_name} with your DNS provider"
51
40
  end
52
41
  say "Found #{domain_name} in #{provider_name} account"
53
- say ""; $stdout.flush
54
-
55
- assign_dns(domain, account_name, env_name, public_ip, name, options[:override])
56
- assign_dns(domain, account_name, env_name, public_ip, "www", options[:override]) if name == ""
57
-
42
+ say ""
43
+
44
+ assign_dns(domain, environment.account.name, environment.name, public_ip, subdomain, options[:force])
45
+ assign_dns(domain, environment.account.name, environment.name, public_ip, "www", options[:force]) if subdomain == ""
46
+
58
47
  say "Complete!", :green
59
-
60
- # ::DNSimple::Commands::ListRecords.new.execute([domain])
61
48
  end
62
-
49
+
63
50
  desc "domains", "List available domains/zones from your DNS providers"
64
51
  def domains
52
+ validate_fog_credentials
65
53
  dns_provider_names.each do |provider_name|
66
54
  dns_provider = ::Fog::DNS.new({:provider => provider_name})
67
55
  domains = dns_provider.zones
68
-
56
+
69
57
  if domains.size == 0
70
58
  say "#{provider_name}: ", :yellow; say "none"
71
59
  else
@@ -77,11 +65,11 @@ module EngineYard
77
65
  end
78
66
  end
79
67
  end
80
-
68
+
81
69
  desc "version", "show version information"
82
70
  def version
83
71
  require 'engineyard-dns/version'
84
- shell.say Engineyard::DNS::VERSION
72
+ say EngineYard::DNS::VERSION
85
73
  end
86
74
 
87
75
  map "-v" => :version, "--version" => :version, "-h" => :help, "--help" => :help
@@ -89,36 +77,30 @@ module EngineYard
89
77
  private
90
78
  def say(msg, color = nil)
91
79
  color ? shell.say(msg, color) : shell.say(msg)
80
+ $stdout.flush
92
81
  end
93
82
 
94
83
  def display(text)
95
- shell.say text
84
+ say text
96
85
  exit
97
86
  end
98
87
 
99
88
  def error(text)
100
- shell.say "ERROR: #{text}", :red
101
- exit
89
+ say "ERROR: #{text}", :red
90
+ exit(1)
102
91
  end
103
-
104
- def watch_page_while(host, port, path)
105
- waiting = true
106
- while waiting
107
- begin
108
- Net::HTTP.start(host, port) do |http|
109
- req = http.get(path)
110
- waiting = yield req
111
- end
112
- sleep 1; print '.'; $stdout.flush
113
- rescue SocketError => e
114
- sleep 1; print 'x'; $stdout.flush
115
- rescue Exception => e
116
- puts e.message
117
- sleep 1; print '.'; $stdout.flush
118
- end
92
+
93
+ # Return the public IP assigned to an environment (which may or may not be a booted cluster of instances)
94
+ # Displays error and exits if no public IP assigned to the environment
95
+ def fetch_public_ip(environment)
96
+ unless environment.load_balancer_ip_address
97
+ error "#{environment_display environment} has no assigned public IP address."
119
98
  end
99
+
100
+ say "#{environment_display environment} has IP #{environment.load_balancer_ip_address}"
101
+ environment.load_balancer_ip_address
120
102
  end
121
-
103
+
122
104
  # Discover which DNS provider (DNSimple, etc) is controlling +domain_name+ (a zone)
123
105
  # and return [domain/zone, provider name]
124
106
  #
@@ -133,28 +115,43 @@ module EngineYard
133
115
  end
134
116
  [nil, nil]
135
117
  end
136
-
137
- def assign_dns(domain, account_name, env_name, public_ip, name = "", override = false)
138
- if record = domain.records.select {|r| r.name == name}.first
139
- if override || ask_override_dns?(domain, name)
118
+
119
+ def assign_dns(domain, account_name, env_name, public_ip, subdomain = "", override = false)
120
+ if record = domain.records.select {|r| r.name == subdomain}.first
121
+ if override || ask_override_dns?(domain, subdomain)
140
122
  record.destroy
141
- say "Deleted #{domain_name domain, name}"
123
+ say "Deleted #{domain_name domain, subdomain}"
142
124
  else
143
- error "Cannot replace existing #{domain_name domain, name} DNS"
125
+ error "Cannot replace existing #{domain_name domain, subdomain} DNS"
144
126
  end
145
127
  end
146
- say "Assigning "; say "#{domain_name domain, name} ", :green; say "--> "; say "#{public_ip} ", :green; say "(#{account_name}/#{env_name})"
147
- $stdout.flush
148
-
149
- record = domain.records.create(:ip => public_ip, :name => name, :type => "A", :ttl => "60")
150
- say "Created A record for #{domain_name domain, name}"
128
+ say "Assigning "
129
+ say "#{domain_name domain, subdomain} ", :green
130
+ say "--> "
131
+ say "#{public_ip} ", :green
132
+ say "(#{account_name}/#{env_name})"
133
+
134
+ record = domain.records.create(:ip => public_ip, :name => subdomain, :type => record_type(public_ip), :ttl => "60")
135
+ say "Created #{record.type} record for #{domain_name domain, subdomain}"
151
136
  end
152
-
137
+
138
+ # "A" for IPv4 and "AAAA" for IPv6; else display error and exit
139
+ def record_type(public_ip)
140
+ address = IPAddress(public_ip)
141
+ if address.ipv4?
142
+ "A"
143
+ elsif address.ipv6?
144
+ "AAAA"
145
+ else
146
+ error "Cannot recognize IP #{public_ip} as either IPv4 or IPv6 format"
147
+ end
148
+ end
149
+
153
150
  def ask_override_dns?(domain, name)
154
151
  ui = EY::CLI::UI::Prompter.backend
155
152
  ui.agree("Replace #{domain_name domain, name}: ", "y")
156
153
  end
157
-
154
+
158
155
  # "myapp.com", "name" => "name.myapp.com"
159
156
  # "myapp.com", "" => "myapp.com"
160
157
  def domain_name(domain, name = nil)
@@ -164,20 +161,51 @@ module EngineYard
164
161
  domain.domain
165
162
  end
166
163
  end
167
-
164
+
168
165
  # Returns the list of DNS providers that the current user has access to
169
166
  # Includes the +fog_dns_providers+ list
170
167
  # TODO find credentials in alternate locations (e.g. ~/.dnsimple)
171
168
  def dns_provider_names
172
169
  fog_dns_provider_names
173
170
  end
174
-
171
+
175
172
  # Returns the list of DNS providers that the current user has fog credentials
176
173
  # TODO how do I get the base list from fog?
177
174
  def fog_dns_provider_names
178
- ['AWS', 'Bluebox', 'DNSimple', 'Linode', 'Slicehost', 'Zerigo'] & Fog.providers
175
+ ['AWS', 'Bluebox', 'DNSimple', 'Linode', 'Slicehost', 'Zerigo'] & Fog.available_providers
179
176
  end
180
177
 
178
+ def environment_display(environment)
179
+ "AppCloud environment #{environment.account.name}/#{environment.name}"
180
+ end
181
+
182
+ def validate_fog_credentials
183
+ return if File.exist?(Fog.credentials_path)
184
+
185
+ File.open(Fog.credentials_path, "w") do |file|
186
+ file << <<-CREDENTIALS
187
+ :default:
188
+ :aws_access_key_id: ACCESSKEY
189
+ :aws_secret_access_key: SECRETKEY
190
+ :bluebox_customer_id: ID
191
+ :bluebox_api_key: APITOKEN
192
+ :dnsimple_email: EMAIL
193
+ :dnsimple_password: PASSWORD
194
+ :linode_api_key: APITOKEN
195
+ :slicehost_password: APITOKEN
196
+ :zerigo_email: EMAIL
197
+ :zerigo_token: APITOKEN
198
+ CREDENTIALS
199
+ end
200
+ FileUtils.chmod(0600, Fog.credentials_path)
201
+
202
+ pretty_path = Fog.credentials_path
203
+ pretty_path = "~/.fog" if Fog.credentials_path == File.expand_path("~/.fog")
204
+ error <<-HELP
205
+ Missing credentials for DNS providers.
206
+ An example #{pretty_path} credentials file has been created for you.
207
+ HELP
208
+ end
181
209
  end
182
210
  end
183
211
  end
@@ -1,5 +1,5 @@
1
1
  module EngineYard
2
2
  module DNS
3
- VERSION = "0.5.0"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -2,15 +2,13 @@
2
2
 
3
3
  For me, one of the things I liked to do with a new AppCloud application is to attached a pretty domain. The default AWS EC2 URL doesn't glorify my fine efforts.
4
4
 
5
- I've started using the new [DNSimple](http://dnsimple.com/) as my DNS registrar and name server, and I believe an increasing number of AppCloud customers are too.
6
-
7
- To make setting up DNS easier with AppCloud, we've released the `ey-dns` command line application.
5
+ To make setting up DNS easier with AppCloud, we've released the `ey-dns` command line application as an open source project ([readme](https://github.com/engineyard/engineyard-dns#readme)).
8
6
 
9
7
  It's really quite easy to use:
10
8
 
11
- 1. Register your application's domain with [DNSimple](http://dnsimple.com/)
12
- 2. Transfer your domain to DNSimple or change the name servers to ns1.dnsimple.com (ns2, ns3, etc)
13
- 3. Install and run the command line application:
9
+ 1. Register your application's domain with a DNS provider (see supported list below), such as DNSimple.
10
+ 2. Transfer your domain to the DNS provider or change to use their name servers, such as ns1.dnsimple.com (ns2, ns3, etc) for DNSimple.
11
+ 3. Install and run the command line application within your Rails/Ruby app:
14
12
 
15
13
  $ gem install engineyard-dns
16
14
  $ cd path/to/my/app
@@ -18,10 +16,6 @@ It's really quite easy to use:
18
16
  Assigning myapp.com --> 1.2.3.4 (drnic/myapp_production)
19
17
  Assigning www.myapp.com --> 1.2.3.4 (drnic/myapp_production)
20
18
 
21
- Found 2 records for myapp.com
22
- .myapp.com (A)-> 1.2.3.4 (ttl:, id:12345)
23
- www.myapp.com (A)-> 1.2.3.4 (ttl:, id:12346)
24
-
25
19
  If you have previously assigned the domain records to another host, it will prompt you to change them.
26
20
 
27
21
  If there is any confusion about which AppCloud environment is hosting your application, it will show you your options and then you can use the `--environment` and `--account` options to be more specific:
@@ -29,6 +23,57 @@ If there is any confusion about which AppCloud environment is hosting your appli
29
23
  $ ey-dns apply myapp.com --environment myapp_production
30
24
  $ ey-dns apply myapp.com staging --environment myapp_staging
31
25
 
26
+ ## Supported DNS providers
27
+
28
+ This tool will automatically determine which DNS provider is managing the domain/zone that you are wiring up to your AppCloud environment.
29
+
30
+ The `ey-dns` uses [fog](https://github.com/geemus/fog) to access DNS providers. The current list of available DNS providers for fog is: AWS, Bluebox, DNSimple, Linode, Slicehost, Zerigo. The next section shows how to setup fog credentials.
31
+
32
+ ## DNS credentials
33
+
34
+ To access your DNS provider, you need to add your account/API credentials into `~/.fog` file. I currently have DNS access to DNSimple, Slicehost and AWS Route 53. My `~/.fog` file looks a little bit like:
35
+
36
+ :default:
37
+ :dnsimple_email: MYEMAIL
38
+ :dnsimple_password: XXXXXXXXXXX
39
+ :aws_access_key_id: 0NJRCXXXXXXXXXXXX
40
+ :aws_secret_access_key: QGtnbXXXXXXXXXXXX/qQ4lXXXXXXXXXXXXXX
41
+ :slicehost_password: f9a265f66XXXXXXXXXXXXXXXXXXXXXXXXXXX
42
+
43
+ ### DNSimple credentials
44
+
45
+ I currently use [DNSimple](https://dnsimple.com/r/a72aa4340dce68) for registering and serving all my new domains. Their API credentials are the same email/password you use to login to the service.
46
+
47
+ Note the surreptitious referral used here, giving me a free month for each DNSimple sign-up, bwhahahaha. To avoid gifting me a free month, use [http://dnsimple.com](http://dnsimple.com/) link. A free month isn't as cool as free swag, but I don't think DNSimple has free swag. Well, I don't have any of it.
48
+
49
+ ### AWS credentials
50
+
51
+ Recently AWS began offering an API-driven DNS server [Route 53](http://aws.amazon.com/route53/). The AWS credentials for access DNS are the same credentials you use in CarrierWave or PaperClip to access AWS S3. To find them, log into your [AWS Account](http://aws.amazon.com/account/) and navigate to "Security Credentials", then "Access Credentials",
52
+ and click "Show" to see your secret access key.
53
+
54
+ <img src="https://img.skitch.com/20110524-m7d5js2nrfwxynbw14hh9qqf3f.png">
55
+
56
+ ### Slicehost credentials
57
+
58
+ Until I switched to DNSimple and to fog, I used Slicehost for its [API/CLI-driven](https://github.com/cameroncox/slicehost-tools) DNS. I still have many domains managed by Slicehost. To enable API access to your Slicehost account in `fog` (and hence `ey-dns`) go to [https://manage.slicehost.com/api](https://manage.slicehost.com/api), enabled API access and copy your API token into the `slicehost_password` field of `~/.fog` above.
59
+
60
+ <img src="https://img.skitch.com/20110524-jbmkcwumrdgw2pgrt7kpe1mbga.png">
61
+
62
+ ### Testing credentials
63
+
64
+ You can test your DNS credentials with the `ey-dns domains` command:
65
+
66
+ $ ey-dns domains
67
+ AWS: none
68
+ DNSimple:
69
+ drnicwilliams.com - 0 records
70
+ emrubyconf.com - 2 records
71
+ mocra.com - 27 records
72
+ Slicehost:
73
+ myconfplan.com. - 0 records
74
+
75
+ ## Summary
76
+
32
77
  Hopefully this tool makes it much easier to setup or change DNS for your AppCloud environments. Let us know in the comments or in the project's [Issues](https://github.com/engineyard/engineyard-dns/issues) if you love it, find bugs or have feature requests.
33
78
 
34
79
  The source and instructions for the project is [available on GitHub](https://github.com/engineyard/engineyard-dns#readme).
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard-dns
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease:
5
- version: 0.5.0
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
6
11
  platform: ruby
7
12
  authors:
8
13
  - Dr Nic Williams
@@ -10,139 +15,190 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-05-24 00:00:00 -07:00
18
+ date: 2011-05-27 00:00:00 -07:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
17
- name: thor
18
- prerelease: false
19
22
  requirement: &id001 !ruby/object:Gem::Requirement
20
23
  none: false
21
24
  requirements:
22
- - - ">="
25
+ - - "="
23
26
  - !ruby/object:Gem::Version
24
- version: "0"
27
+ hash: 51
28
+ segments:
29
+ - 1
30
+ - 3
31
+ - 20
32
+ version: 1.3.20
33
+ name: engineyard
34
+ prerelease: false
25
35
  type: :runtime
26
36
  version_requirements: *id001
27
37
  - !ruby/object:Gem::Dependency
28
- name: engineyard
29
- prerelease: false
30
38
  requirement: &id002 !ruby/object:Gem::Requirement
31
39
  none: false
32
40
  requirements:
33
- - - ">="
41
+ - - ~>
34
42
  - !ruby/object:Gem::Version
35
- version: "0"
43
+ hash: 59
44
+ segments:
45
+ - 0
46
+ - 8
47
+ - 2
48
+ version: 0.8.2
49
+ name: fog
50
+ prerelease: false
36
51
  type: :runtime
37
52
  version_requirements: *id002
38
53
  - !ruby/object:Gem::Dependency
39
- name: fog
40
- prerelease: false
41
54
  requirement: &id003 !ruby/object:Gem::Requirement
42
55
  none: false
43
56
  requirements:
44
- - - ">="
57
+ - - ~>
45
58
  - !ruby/object:Gem::Version
46
- version: "0"
59
+ hash: 27
60
+ segments:
61
+ - 0
62
+ - 8
63
+ version: "0.8"
64
+ name: ipaddress
65
+ prerelease: false
47
66
  type: :runtime
48
67
  version_requirements: *id003
49
68
  - !ruby/object:Gem::Dependency
50
- name: rake
51
- prerelease: false
52
69
  requirement: &id004 !ruby/object:Gem::Requirement
53
70
  none: false
54
71
  requirements:
55
72
  - - ~>
56
73
  - !ruby/object:Gem::Version
74
+ hash: 59
75
+ segments:
76
+ - 0
77
+ - 9
78
+ - 0
57
79
  version: 0.9.0
80
+ name: rake
81
+ prerelease: false
58
82
  type: :development
59
83
  version_requirements: *id004
60
84
  - !ruby/object:Gem::Dependency
61
- name: cucumber
62
- prerelease: false
63
85
  requirement: &id005 !ruby/object:Gem::Requirement
64
86
  none: false
65
87
  requirements:
66
88
  - - ~>
67
89
  - !ruby/object:Gem::Version
90
+ hash: 31
91
+ segments:
92
+ - 0
93
+ - 10
68
94
  version: "0.10"
95
+ name: cucumber
96
+ prerelease: false
69
97
  type: :development
70
98
  version_requirements: *id005
71
99
  - !ruby/object:Gem::Dependency
72
- name: rspec
73
- prerelease: false
74
100
  requirement: &id006 !ruby/object:Gem::Requirement
75
101
  none: false
76
102
  requirements:
77
103
  - - ~>
78
104
  - !ruby/object:Gem::Version
105
+ hash: 9
106
+ segments:
107
+ - 2
108
+ - 5
79
109
  version: "2.5"
110
+ name: rspec
111
+ prerelease: false
80
112
  type: :development
81
113
  version_requirements: *id006
82
114
  - !ruby/object:Gem::Dependency
83
- name: json
84
- prerelease: false
85
115
  requirement: &id007 !ruby/object:Gem::Requirement
86
116
  none: false
87
117
  requirements:
88
118
  - - ~>
89
119
  - !ruby/object:Gem::Version
120
+ hash: 7
121
+ segments:
122
+ - 1
123
+ - 4
124
+ - 0
90
125
  version: 1.4.0
126
+ name: json
127
+ prerelease: false
91
128
  type: :development
92
129
  version_requirements: *id007
93
130
  - !ruby/object:Gem::Dependency
94
- name: awesome_print
95
- prerelease: false
96
131
  requirement: &id008 !ruby/object:Gem::Requirement
97
132
  none: false
98
133
  requirements:
99
134
  - - ">="
100
135
  - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
101
139
  version: "0"
140
+ name: awesome_print
141
+ prerelease: false
102
142
  type: :development
103
143
  version_requirements: *id008
104
144
  - !ruby/object:Gem::Dependency
105
- name: realweb
106
- prerelease: false
107
145
  requirement: &id009 !ruby/object:Gem::Requirement
108
146
  none: false
109
147
  requirements:
110
148
  - - ~>
111
149
  - !ruby/object:Gem::Version
150
+ hash: 23
151
+ segments:
152
+ - 0
153
+ - 1
154
+ - 6
112
155
  version: 0.1.6
156
+ name: realweb
157
+ prerelease: false
113
158
  type: :development
114
159
  version_requirements: *id009
115
160
  - !ruby/object:Gem::Dependency
116
- name: open4
117
- prerelease: false
118
161
  requirement: &id010 !ruby/object:Gem::Requirement
119
162
  none: false
120
163
  requirements:
121
164
  - - ">="
122
165
  - !ruby/object:Gem::Version
166
+ hash: 3
167
+ segments:
168
+ - 0
123
169
  version: "0"
170
+ name: open4
171
+ prerelease: false
124
172
  type: :development
125
173
  version_requirements: *id010
126
174
  - !ruby/object:Gem::Dependency
127
- name: sinatra
128
- prerelease: false
129
175
  requirement: &id011 !ruby/object:Gem::Requirement
130
176
  none: false
131
177
  requirements:
132
178
  - - ">="
133
179
  - !ruby/object:Gem::Version
180
+ hash: 3
181
+ segments:
182
+ - 0
134
183
  version: "0"
184
+ name: sinatra
185
+ prerelease: false
135
186
  type: :development
136
187
  version_requirements: *id011
137
188
  - !ruby/object:Gem::Dependency
138
- name: fakeweb
139
- prerelease: false
140
189
  requirement: &id012 !ruby/object:Gem::Requirement
141
190
  none: false
142
191
  requirements:
143
192
  - - ~>
144
193
  - !ruby/object:Gem::Version
194
+ hash: 27
195
+ segments:
196
+ - 1
197
+ - 3
198
+ - 0
145
199
  version: 1.3.0
200
+ name: fakeweb
201
+ prerelease: false
146
202
  type: :development
147
203
  version_requirements: *id012
148
204
  description: Easily configure your DNS with Engine Yard AppCloud via DNSimple.
@@ -166,8 +222,8 @@ files:
166
222
  - engineyard-dns.gemspec
167
223
  - features/assign_dns_to_environment.feature
168
224
  - features/list_available_domains.feature
225
+ - features/missing_credentials.feature
169
226
  - features/step_definitions/common_steps.rb
170
- - features/step_definitions/dnsimple_steps.rb
171
227
  - features/step_definitions/ey_api_steps.rb
172
228
  - features/step_definitions/fog_steps.rb
173
229
  - features/support/common.rb
@@ -194,25 +250,31 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
250
  requirements:
195
251
  - - ">="
196
252
  - !ruby/object:Gem::Version
253
+ hash: 3
254
+ segments:
255
+ - 0
197
256
  version: "0"
198
257
  required_rubygems_version: !ruby/object:Gem::Requirement
199
258
  none: false
200
259
  requirements:
201
260
  - - ">="
202
261
  - !ruby/object:Gem::Version
262
+ hash: 3
263
+ segments:
264
+ - 0
203
265
  version: "0"
204
266
  requirements: []
205
267
 
206
268
  rubyforge_project: engineyard-dns
207
- rubygems_version: 1.6.2
269
+ rubygems_version: 1.5.0
208
270
  signing_key:
209
271
  specification_version: 3
210
272
  summary: Configure your Engine Yard AppCloud environment and your DNSimple domain.
211
273
  test_files:
212
274
  - features/assign_dns_to_environment.feature
213
275
  - features/list_available_domains.feature
276
+ - features/missing_credentials.feature
214
277
  - features/step_definitions/common_steps.rb
215
- - features/step_definitions/dnsimple_steps.rb
216
278
  - features/step_definitions/ey_api_steps.rb
217
279
  - features/step_definitions/fog_steps.rb
218
280
  - features/support/common.rb
@@ -1,9 +0,0 @@
1
- Given /^I have setup my dnsimple credentials$/ do
2
- setup_dnsimple_credentials
3
- end
4
-
5
- Given /^I have DNSimple domain "([^"]*)"$/ do |domain|
6
- create_dnsimple_domain domain
7
- end
8
-
9
-