engineyard-dns 0.5.0 → 1.0.0
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/.travis.yml +4 -0
- data/engineyard-dns.gemspec +3 -3
- data/features/assign_dns_to_environment.feature +14 -14
- data/features/missing_credentials.feature +17 -0
- data/features/step_definitions/common_steps.rb +1 -1
- data/features/step_definitions/fog_steps.rb +4 -0
- data/features/support/fog_helpers.rb +10 -4
- data/lib/engineyard-dns.rb +0 -1
- data/lib/engineyard-dns/cli.rb +98 -70
- data/lib/engineyard-dns/version.rb +1 -1
- data/posts/engineyard-2011-05-24.md +55 -10
- metadata +97 -35
- data/features/step_definitions/dnsimple_steps.rb +0 -9
data/.travis.yml
CHANGED
data/engineyard-dns.gemspec
CHANGED
@@ -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("
|
23
|
-
s.add_dependency("
|
24
|
-
s.add_dependency("
|
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
|
-
|
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 -->
|
20
|
+
Assigning myapp.com --> 127.0.0.0 (main/giblets)
|
21
21
|
Created A record for myapp.com
|
22
|
-
Assigning www.myapp.com -->
|
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)->
|
29
|
-
# www.myapp.com (A)->
|
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 --
|
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
|
-
|
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 -->
|
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 -->
|
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)->
|
53
|
-
# www.myapp.com (A)->
|
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
|
-
|
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 -->
|
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)->
|
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
|
+
|
@@ -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(
|
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
|
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)
|
data/lib/engineyard-dns.rb
CHANGED
data/lib/engineyard-dns/cli.rb
CHANGED
@@ -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 [
|
22
|
-
method_option :
|
23
|
-
method_option :
|
24
|
-
method_option :
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
44
|
-
|
32
|
+
public_ip = fetch_public_ip(environment)
|
33
|
+
|
45
34
|
say ""
|
46
|
-
say "Searching for #{domain_name} amongst your DNS providers..."
|
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 ""
|
54
|
-
|
55
|
-
assign_dns(domain,
|
56
|
-
assign_dns(domain,
|
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
|
-
|
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
|
-
|
84
|
+
say text
|
96
85
|
exit
|
97
86
|
end
|
98
87
|
|
99
88
|
def error(text)
|
100
|
-
|
101
|
-
exit
|
89
|
+
say "ERROR: #{text}", :red
|
90
|
+
exit(1)
|
102
91
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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,
|
138
|
-
if record = domain.records.select {|r| r.name ==
|
139
|
-
if override || ask_override_dns?(domain,
|
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,
|
123
|
+
say "Deleted #{domain_name domain, subdomain}"
|
142
124
|
else
|
143
|
-
error "Cannot replace existing #{domain_name domain,
|
125
|
+
error "Cannot replace existing #{domain_name domain, subdomain} DNS"
|
144
126
|
end
|
145
127
|
end
|
146
|
-
say "Assigning "
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
say "
|
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.
|
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
|
@@ -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
|
-
|
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
|
12
|
-
2. Transfer your domain to
|
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
|
-
|
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-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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
|