dnsmadeeasy-api 0.9.7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +6 -0
- data/Rakefile +3 -3
- data/bin/dme +98 -6
- data/dnsmadeeasy-api.gemspec +4 -4
- data/lib/dnsmadeeasy/api.rb +38 -64
- metadata +7 -7
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== Release 1.0.0 - Jul 08, 2011
|
4
|
+
|
5
|
+
* CHANGE: The hashes returned by api methods now have symbols as keys, as opposed to string. This makes them consistent with the hashes used for creating and updating records.
|
6
|
+
* CHANGE: The update_record! method does not require the entire record to be re-specified. Only the parameters to be changed need to be specified.
|
7
|
+
* NEW: Command level help in the command line utility
|
8
|
+
|
3
9
|
== Release 0.9.7 - Jul 08, 2011
|
4
10
|
|
5
11
|
* FIX: API Documentation
|
data/Rakefile
CHANGED
@@ -2,9 +2,9 @@ require "rubygems"
|
|
2
2
|
require "rake"
|
3
3
|
require "echoe"
|
4
4
|
|
5
|
-
Echoe.new("dnsmadeeasy-api", "0.
|
6
|
-
p.description = "Ruby client for DNSMadeEasy API."
|
7
|
-
p.summary = "Ruby client for DNSMadeEasy API."
|
5
|
+
Echoe.new("dnsmadeeasy-api", "1.0.0") do |p|
|
6
|
+
p.description = "Ruby client and commandline utility for the DNSMadeEasy API."
|
7
|
+
p.summary = "Ruby client and commandline utility for the DNSMadeEasy API."
|
8
8
|
p.url = "http://rubygems.org/gems/dnsmadeeasy-api"
|
9
9
|
p.author = "Nitesh Goel"
|
10
10
|
p.email = "nitesh@sigfig.com"
|
data/bin/dme
CHANGED
@@ -30,16 +30,99 @@ module DnsMadeEasy
|
|
30
30
|
"delete-records" => "Delete multiple dns records",
|
31
31
|
"delete-record" => "Delete a dns record",
|
32
32
|
"update-record" => "Update an existing dns record",
|
33
|
-
"describe-record" => "Describe an existing dns record"
|
33
|
+
"describe-record" => "Describe an existing dns record",
|
34
|
+
"help" => "Print help message"
|
34
35
|
}
|
35
36
|
help = "Usage: dme command [options]"
|
36
37
|
help << "\nValid commands\n"
|
37
38
|
valid_commands.each do |name, description|
|
38
39
|
help << "\t#{name.ljust(18)}=> #{description}\n"
|
39
40
|
end
|
41
|
+
help << %Q[To know more about a command, use "dme help <command name>"]
|
40
42
|
return help
|
41
43
|
end
|
42
44
|
|
45
|
+
def show_help(command)
|
46
|
+
options = ""
|
47
|
+
footnote = ""
|
48
|
+
|
49
|
+
case command
|
50
|
+
when "list-domains", "delete-domains"
|
51
|
+
options = ""
|
52
|
+
when "create-domain", "delete-domain", "describe-domain"
|
53
|
+
options = "--doman <domain name>"
|
54
|
+
when "list-records"
|
55
|
+
options = "--domain <domain name> [--name <name>] [--type <type>] [--gtd <gtd location>]"
|
56
|
+
footnote = "* Without any of --name, --type, and --gtd, all records are listed.
|
57
|
+
* Valid --type values are A, CNAME, MX, TXT, SRV, NS, AAAA, HTTPRED, PTR.
|
58
|
+
* Valid --gtd values are DEFAULT, US_EAST, US_WEST, EUROPE"
|
59
|
+
when "create-record"
|
60
|
+
options = "--domain <domain name> --name <name> --type <type> --value <value> --ttl <ttl> [--gtd <gtd location>]"
|
61
|
+
footnote = %Q[* Valid --type values are A, CNAME, MX, TXT, SRV, NS, AAAA, HTTPRED, PTR.
|
62
|
+
* Valid --gtd values are DEFAULT, US_EAST, US_WEST, EUROPE. DEFAULT is used when none is provided.
|
63
|
+
|
64
|
+
* Here's a list of possible --value values, with the record type they are used with:
|
65
|
+
- A: [host IP]
|
66
|
+
- AAAA: [IPv6 host IP]
|
67
|
+
- CNAME: [target name]
|
68
|
+
- HTTPRED: [redirection URL]
|
69
|
+
- MX: [priority] [target name]
|
70
|
+
- NS: [name server]
|
71
|
+
- PTR: [target name]
|
72
|
+
- SRV: [priority] [weight] [port] [target name]
|
73
|
+
- TXT: [text value]
|
74
|
+
|
75
|
+
* For CNAME, MX, NS, PTR, and SRV records, the domain name of the dns record is automatically
|
76
|
+
appended to the given data unless the data ends with a "." So, to map, say mail to mail.google.com,
|
77
|
+
use "mail.google.com." as the data value. By the same logic, to map "www.sigfig.com" to, say, "server1.sigfig.com",
|
78
|
+
just use "server1" as the data value or "server1.sigfig.com."; don't give "server1.sigfig.com" because that'll
|
79
|
+
essentially resolve to server1.sigfig.com.sigfig.com.
|
80
|
+
]
|
81
|
+
when "update-record"
|
82
|
+
options = "--domain <domain name> --record <record id> [--name <name>] [--type <type>] [--value <value>] [--ttl <ttl>] [--gtd <gtd location>]"
|
83
|
+
footnote = %Q[* Valid --type values are A, CNAME, MX, TXT, SRV, NS, AAAA, HTTPRED, PTR.
|
84
|
+
* Valid --gtd values are DEFAULT, US_EAST, US_WEST, EUROPE. DEFAULT is used when none is provided.
|
85
|
+
|
86
|
+
* Here's a list of possible --value values, with the record type they are used with:
|
87
|
+
- A: [host IP]
|
88
|
+
- AAAA: [IPv6 host IP]
|
89
|
+
- CNAME: [target name]
|
90
|
+
- HTTPRED: [redirection URL]
|
91
|
+
- MX: [priority] [target name]
|
92
|
+
- NS: [name server]
|
93
|
+
- PTR: [target name]
|
94
|
+
- SRV: [priority] [weight] [port] [target name]
|
95
|
+
- TXT: [text value]
|
96
|
+
|
97
|
+
* For CNAME, MX, NS, PTR, and SRV records, the domain name of the dns record is automatically
|
98
|
+
appended to the given data unless the data ends with a "." So, to map, say mail to mail.google.com,
|
99
|
+
use "mail.google.com." as the data value. By the same logic, to map "www.sigfig.com" to, say, "server1.sigfig.com",
|
100
|
+
just use "server1" as the data value or "server1.sigfig.com."; don't give "server1.sigfig.com" because that'll
|
101
|
+
essentially resolve to server1.sigfig.com.sigfig.com.
|
102
|
+
|
103
|
+
* The params not specified in the command remain unchanged.]
|
104
|
+
when "delete-record", "describe-record"
|
105
|
+
options = "--domain <domain name> --record <record id>"
|
106
|
+
when "delete-records"
|
107
|
+
options = "--domain <domain name> [--name <name>] [--type <type>] [--gtd <gtd location>]"
|
108
|
+
footnote = "* Unless a --force param is given, confirmation is seeked before any deletions.
|
109
|
+
* Without any of --name, --type, and --gtd, all records are deleted.
|
110
|
+
* Valid --type values are A, CNAME, MX, TXT, SRV, NS, AAAA, HTTPRED, PTR.
|
111
|
+
* Valid --gtd values are DEFAULT, US_EAST, US_WEST, EUROPE"
|
112
|
+
else
|
113
|
+
show_error "Please enter a valid command"
|
114
|
+
end
|
115
|
+
|
116
|
+
footnote << "\n" unless footnote.empty?
|
117
|
+
footnote << %Q[* Use --sandbox option to run the command in sandbox mode
|
118
|
+
* Use --json to get output in json format]
|
119
|
+
|
120
|
+
puts "Usage: dme #{command} #{options}"
|
121
|
+
puts "\nNotes:\n"
|
122
|
+
puts footnote.split("\n").map { |x| x.strip }.join("\n") unless footnote.empty?
|
123
|
+
exit 0
|
124
|
+
end
|
125
|
+
|
43
126
|
def show_error(message)
|
44
127
|
if @json
|
45
128
|
output = { "error" => message }
|
@@ -124,9 +207,10 @@ options = {}
|
|
124
207
|
force = false
|
125
208
|
record_id = nil
|
126
209
|
sandbox = false
|
210
|
+
help = false
|
127
211
|
optparse = OptionParser.new do |opts|
|
128
212
|
opts.banner = printer.help_text + "\nOptions\n"
|
129
|
-
opts.on("-f", "--force", "Force operation") do
|
213
|
+
opts.on("-f", "--force", "Force operation. No confirmation is requested when a command runs with this parameter. Use prudentially!") do
|
130
214
|
force = true
|
131
215
|
end
|
132
216
|
opts.on("-j", "--json", "Format output as json") do
|
@@ -144,11 +228,14 @@ optparse = OptionParser.new do |opts|
|
|
144
228
|
opts.on("-v", "--value VALUE", "The destination of the entry (IP/relative hostname/hostname)") do |v|
|
145
229
|
options[:data] = v
|
146
230
|
end
|
231
|
+
opts.on("-D", "--data VALUE", "Alias for --value") do |v|
|
232
|
+
options[:data] = v
|
233
|
+
end
|
147
234
|
opts.on("-g", "--gtd GTD", "GTD Location") do |g|
|
148
235
|
options[:gtdLocation] = g
|
149
236
|
end
|
150
237
|
opts.on("-t", "--type TYPE", "The type of dns record") do |t|
|
151
|
-
options[:type] = t.upcase
|
238
|
+
options[:type] = t.upcase
|
152
239
|
end
|
153
240
|
opts.on("-l", "--ttl TTL", "Time to live") do |l|
|
154
241
|
options[:ttl] = l
|
@@ -159,6 +246,7 @@ optparse = OptionParser.new do |opts|
|
|
159
246
|
end
|
160
247
|
|
161
248
|
optparse.parse!
|
249
|
+
command = ARGV.shift
|
162
250
|
|
163
251
|
auth_file = sandbox ? "/etc/dnsmadeeasy/api_sandbox.keys" : "/etc/dnsmadeeasy/api.keys"
|
164
252
|
begin
|
@@ -176,8 +264,6 @@ end
|
|
176
264
|
|
177
265
|
api = DnsMadeEasy::Api.new(api_key, secret_key, sandbox)
|
178
266
|
|
179
|
-
command = ARGV.shift
|
180
|
-
|
181
267
|
begin
|
182
268
|
case command
|
183
269
|
when "list-domains"
|
@@ -256,7 +342,13 @@ begin
|
|
256
342
|
puts "Done"
|
257
343
|
end
|
258
344
|
when "help"
|
259
|
-
|
345
|
+
if ARGV.empty?
|
346
|
+
puts optparse.help
|
347
|
+
exit 0
|
348
|
+
else
|
349
|
+
command = ARGV.shift
|
350
|
+
printer.show_help command
|
351
|
+
end
|
260
352
|
else
|
261
353
|
printer.show_error "Please enter a valid command"
|
262
354
|
end
|
data/dnsmadeeasy-api.gemspec
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{dnsmadeeasy-api}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "1.0.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = [%q{Nitesh Goel}]
|
9
|
-
s.date = %q{2011-07-
|
10
|
-
s.description = %q{Ruby client for DNSMadeEasy API.}
|
9
|
+
s.date = %q{2011-07-08}
|
10
|
+
s.description = %q{Ruby client and commandline utility for the DNSMadeEasy API.}
|
11
11
|
s.email = %q{nitesh@sigfig.com}
|
12
12
|
s.executables = [%q{dme}]
|
13
13
|
s.extra_rdoc_files = [%q{CHANGELOG.rdoc}, %q{README.rdoc}, %q{bin/dme}, %q{lib/dnsmadeeasy/api.rb}, %q{lib/dnsmadeeasy/exceptions.rb}]
|
@@ -21,7 +21,7 @@ to use the dme binary.}
|
|
21
21
|
s.require_paths = [%q{lib}]
|
22
22
|
s.rubyforge_project = %q{dnsmadeeasy-api}
|
23
23
|
s.rubygems_version = %q{1.8.5}
|
24
|
-
s.summary = %q{Ruby client for DNSMadeEasy API.}
|
24
|
+
s.summary = %q{Ruby client and commandline utility for the DNSMadeEasy API.}
|
25
25
|
|
26
26
|
if s.respond_to? :specification_version then
|
27
27
|
s.specification_version = 3
|
data/lib/dnsmadeeasy/api.rb
CHANGED
@@ -12,7 +12,7 @@ Ruby client for DNSMadeEasy API.
|
|
12
12
|
|
13
13
|
== Installation
|
14
14
|
|
15
|
-
|
15
|
+
gem install environment
|
16
16
|
|
17
17
|
== Usage
|
18
18
|
|
@@ -31,10 +31,10 @@ This is a great way to test your application without changing your production DN
|
|
31
31
|
api.list_records "sigfig.com"
|
32
32
|
|
33
33
|
The api calls throw the following exceptions:
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
* <b>BadRequestError</b>: For cases when there is missing information or the api limits have been exceeded
|
35
|
+
* <b>ResourceNotFoundError</b>: For cases when a request is made for an unknown domain or record
|
36
|
+
* <b>AuthorizationFailedError</b>: For cases when the request cannot be authorized
|
37
|
+
* <b>InvalidRecordError</b>: When a record to be created or updated is not well formed
|
38
38
|
|
39
39
|
== Command line tool
|
40
40
|
|
@@ -72,8 +72,8 @@ module DnsMadeEasy
|
|
72
72
|
def list_domains
|
73
73
|
execute_with_caution do
|
74
74
|
response = RestClient.get request_url, headers
|
75
|
-
response_hash = JSON.parse(response)
|
76
|
-
return response_hash.has_key?(
|
75
|
+
response_hash = JSON.parse(response, :symbolize_names => true)
|
76
|
+
return response_hash.has_key?(:list) ? response_hash[:list] : []
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -92,18 +92,18 @@ module DnsMadeEasy
|
|
92
92
|
# Create a new domain entry.
|
93
93
|
#
|
94
94
|
# Returns a hash of the newly created domain entry, e.g.
|
95
|
-
# {
|
95
|
+
# { :name => "sigfig.com", :nameServer => ["ns66.dnsmadeeasy.com", "ns99.dnsmadeeasy.com"], :gtdEnabled => true }
|
96
96
|
def create_domain!(domain)
|
97
97
|
execute_with_caution :domain => domain do
|
98
98
|
response = RestClient.put request_url(:path => "#{domain}"), {}, headers
|
99
|
-
return JSON.parse(response)
|
99
|
+
return JSON.parse(response, :symbolize_names => true)
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
103
|
# Delete a domain entry.
|
104
104
|
#
|
105
105
|
# Returns a hash of the deleted domain entry, e.g.
|
106
|
-
# {
|
106
|
+
# { :nameServer => "sigfig.com", :nameServer => ["ns66.dnsmadeeasy.com", "ns99.dnsmadeeasy.com"], :gtdEnabled => true }
|
107
107
|
def delete_domain!(domain)
|
108
108
|
execute_with_caution :domain => domain do
|
109
109
|
description = describe_domain(domain)
|
@@ -115,11 +115,11 @@ module DnsMadeEasy
|
|
115
115
|
# Describe a domain entry.
|
116
116
|
#
|
117
117
|
# Returns a hash of the domain entry, e.g.
|
118
|
-
# {
|
118
|
+
# { :name => "sigfig.com", :nameServer => ["ns66.dnsmadeeasy.com", "ns99.dnsmadeeasy.com"], :gtdEnabled => true }
|
119
119
|
def describe_domain(domain)
|
120
120
|
execute_with_caution :domain => domain do
|
121
121
|
response = RestClient.get request_url(:path => "#{domain}"), headers
|
122
|
-
return JSON.parse(response)
|
122
|
+
return JSON.parse(response, :symbolize_names => true)
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
@@ -132,13 +132,13 @@ module DnsMadeEasy
|
|
132
132
|
#
|
133
133
|
# Returns an array of hashes, each hash representing a dns entry, e.g.
|
134
134
|
# [
|
135
|
-
# {
|
136
|
-
# {
|
135
|
+
# { :name => "", :type => "A", "data" => "127.0.0.1", :ttl => 7200, :id => 12345, :gtdLocation => "DEFAULT" },
|
136
|
+
# { :name => "www", :type => "CNAME", :data => "sigfig.com.", :ttl => 7200, id => 23456, :gtdLocation => "DEFAULT" }
|
137
137
|
# ]
|
138
138
|
def list_records(domain, filter={})
|
139
139
|
execute_with_caution :domain => domain do
|
140
140
|
response = RestClient.get request_url(:path => "#{domain}/records", :query => filter), headers
|
141
|
-
return JSON.parse(response)
|
141
|
+
return JSON.parse(response, :symbolize_names => true)
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
@@ -147,7 +147,7 @@ module DnsMadeEasy
|
|
147
147
|
# Record should be a hash with the following values:
|
148
148
|
#
|
149
149
|
# :name => Hostname. E.g. www, or empty string for root domain
|
150
|
-
# :type => Record type. E.g.
|
150
|
+
# :type => Record type. E.g. A, CNAME, MX, TXT, SRV, NS, AAAA, HTTPRED, PTR
|
151
151
|
# :data => Public name. E.g. "66.88.99.44" or "ec2-gibberish.amazonaws.com."
|
152
152
|
# :gtdLocation => Global Traffic Director location. Values: DEFAULT, US_EAST, US_WEST, EUROPE (optional, defaults to DEFAULT)
|
153
153
|
# :ttl => Time to live. The amount of time a record will be cached before being refreshed. E.g. 300
|
@@ -170,7 +170,7 @@ module DnsMadeEasy
|
|
170
170
|
# essentially resolve to server1.sigfig.com.sigfig.com.
|
171
171
|
#
|
172
172
|
# Returns a hash of the newly created dns entry, e.g.
|
173
|
-
# {
|
173
|
+
# { :name => "www", :type => "CNAME", :data => "sigfig.com.", :ttl => 7200, id => 23456, :gtdLocation => "DEFAULT" }
|
174
174
|
def create_record!(domain, record)
|
175
175
|
validate_record(record)
|
176
176
|
request_data = {
|
@@ -178,14 +178,14 @@ module DnsMadeEasy
|
|
178
178
|
}.merge(record)
|
179
179
|
execute_with_caution :domain => domain do
|
180
180
|
response = RestClient.post request_url(:path => "#{domain}/records"), request_data.to_json, headers(:content_type => "application/json")
|
181
|
-
return JSON.parse(response)
|
181
|
+
return JSON.parse(response, :symbolize_names => true)
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
185
185
|
# Delete a dns record.
|
186
186
|
#
|
187
187
|
# Returns a hash of the deleted dns entry, e.g.
|
188
|
-
# {
|
188
|
+
# { :name => "", :type => "A", "data" => "127.0.0.1", :ttl => 7200, :id => 12345, :gtdLocation => "DEFAULT" }
|
189
189
|
def delete_record!(domain, record_id)
|
190
190
|
execute_with_caution :domain => domain, :record => record_id do
|
191
191
|
record = describe_record(domain, record_id)
|
@@ -196,29 +196,25 @@ module DnsMadeEasy
|
|
196
196
|
|
197
197
|
# Delete multiple records for a domain.
|
198
198
|
#
|
199
|
-
#
|
200
|
-
# * { :name => "www" }: Lists all entries for host "www"
|
201
|
-
# * { :type => :A }: Lists all A records
|
202
|
-
# * { :gtdLocation => :EUROPE } List all entries for EUROPE Traffic Director
|
199
|
+
# Refer to list_records for available filters.
|
203
200
|
#
|
204
|
-
# N.B. Given that there are limits to the number of api requests, the
|
201
|
+
# N.B. Given that there are limits to the number of api requests, the atomicity of this action is not guaranteed.
|
205
202
|
# This means that it is possible under certain circumstances that not all records that match the given criteria
|
206
203
|
# will be deleted.
|
207
204
|
#
|
208
205
|
# Returns an array of hashes, each hash representing a deleted dns entry, e.g.
|
209
206
|
# [
|
210
|
-
# {
|
211
|
-
# {
|
207
|
+
# { :name => "", :type => "A", "data" => "127.0.0.1", :ttl => 7200, :id => 12345, :gtdLocation => "DEFAULT" },
|
208
|
+
# { :name => "www", :type => "CNAME", :data => "sigfig.com.", :ttl => 7200, :id => 23456, :gtdLocation => "DEFAULT" }
|
212
209
|
# ]
|
213
|
-
# An empty array is returned if no deletions are made.
|
214
210
|
def delete_records!(domain, filter={})
|
215
211
|
record_list = list_records(domain, filter)
|
216
212
|
unless record_list.empty?
|
217
213
|
if record_list.size == 1
|
218
|
-
delete_record!(domain, record_list[0][
|
214
|
+
delete_record!(domain, record_list[0][:id])
|
219
215
|
elsif requests_remaining >= record_list.size
|
220
216
|
record_list.each do |record|
|
221
|
-
delete_record!(domain, record[
|
217
|
+
delete_record!(domain, record[:id])
|
222
218
|
end
|
223
219
|
else
|
224
220
|
raise DnsMadeEasy::BadRequestError, "Not enough requests remaining to complete the operation"
|
@@ -229,35 +225,13 @@ module DnsMadeEasy
|
|
229
225
|
|
230
226
|
# Update an existing dns record.
|
231
227
|
#
|
232
|
-
#
|
233
|
-
#
|
234
|
-
# :name => Hostname. E.g. www, or empty string for root domain
|
235
|
-
# :type => Record type. E.g. :A, :CNAME, :MX, :TXT, :SRV, :NS, :AAAA, :HTTPRED, :PTR
|
236
|
-
# :data => Public name. E.g. "66.88.99.44" or "ec2-gibberish.amazonaws.com."
|
237
|
-
# :gtdLocation => Global Traffic Director location. Values: DEFAULT, US_EAST, US_WEST, EUROPE (optional, defaults to DEFAULT)
|
238
|
-
# :ttl => Time to live. The amount of time a record will be cached before being refreshed. E.g. 300
|
239
|
-
#
|
240
|
-
# Here's a list of possible data values, with the record type they are used with:
|
241
|
-
# * A: [host IP]
|
242
|
-
# * AAAA: [IPv6 host IP]
|
243
|
-
# * CNAME: [target name]
|
244
|
-
# * HTTPRED: [redirection URL]
|
245
|
-
# * MX: [priority] [target name]
|
246
|
-
# * NS: [name server]
|
247
|
-
# * PTR: [target name]
|
248
|
-
# * SRV: [priority] [weight] [port] [target name]
|
249
|
-
# * TXT: [text value]
|
250
|
-
#
|
251
|
-
# N.B. for CNAME, MX, NS, PTR, and SRV records, the domain name of the dns record is automatically
|
252
|
-
# appended to the given data unless the data ends with a "." So, to map, say mail to mail.google.com,
|
253
|
-
# use "mail.google.com." as the data value. By the same logic, to map "www.sigfig.com" to, say, "server1.sigfig.com",
|
254
|
-
# just use "server1" as the data value or "server1.sigfig.com."; don't give "server1.sigfig.com" because that'll
|
255
|
-
# essentially resolve to server1.sigfig.com.sigfig.com.
|
228
|
+
# Refer to create_record! documentation for record format. The params not specified remain unchanged
|
256
229
|
#
|
257
230
|
# Returns a hash of the newly updated dns entry, e.g.
|
258
|
-
# {
|
231
|
+
# { :name => "www", :type => "CNAME", :data => "sigfig.com.", :ttl => 7200, :id => 23456, :gtdLocation => "DEFAULT" }
|
259
232
|
def update_record!(domain, record_id, record)
|
260
|
-
|
233
|
+
existing_record = describe_record(domain, record_id)
|
234
|
+
record = existing_record.merge(record)
|
261
235
|
execute_with_caution :domain => domain, :record => record_id do
|
262
236
|
response = RestClient.put request_url(:path => "#{domain}/records/#{record_id}"), record.to_json, headers(:content_type => "application/json")
|
263
237
|
return describe_record(domain, record_id)
|
@@ -267,15 +241,15 @@ module DnsMadeEasy
|
|
267
241
|
# Describe an existing dns record.
|
268
242
|
#
|
269
243
|
# Returns a hash of the dns entry.
|
270
|
-
# {
|
244
|
+
# { :name => "www", :type => "CNAME", :data => "sigfig.com.", :ttl => 7200, :id => 23456, :gtdLocation => "DEFAULT" }
|
271
245
|
def describe_record(domain, record_id)
|
272
246
|
execute_with_caution :domain => domain, :record => record_id do
|
273
247
|
response = RestClient.get request_url(:path => "#{domain}/records/#{record_id}"), headers
|
274
|
-
return JSON.parse(response)
|
248
|
+
return JSON.parse(response, :symbolize_names => true)
|
275
249
|
end
|
276
250
|
end
|
277
251
|
|
278
|
-
# Return the
|
252
|
+
# Return the number of api requests remaining.
|
279
253
|
def requests_remaining
|
280
254
|
begin
|
281
255
|
execute_with_caution do
|
@@ -298,12 +272,12 @@ module DnsMadeEasy
|
|
298
272
|
end
|
299
273
|
|
300
274
|
# check record types
|
301
|
-
acceptable_types = [
|
302
|
-
raise DnsMadeEasy::InvalidRecordError, "Invalid record type #{record[:type]}" unless acceptable_types.include?(record[:type]
|
275
|
+
acceptable_types = ["A", "CNAME", "MX", "TXT", "SRV", "NS", "AAAA", "HTTPRED", "PTR"]
|
276
|
+
raise DnsMadeEasy::InvalidRecordError, "Invalid record type #{record[:type]}" unless acceptable_types.include?(record[:type])
|
303
277
|
|
304
278
|
# check gtd location
|
305
|
-
acceptable_location = [
|
306
|
-
if record.has_key?(:gtdLocation) && acceptable_location.include?(record[:gtdLocation]
|
279
|
+
acceptable_location = ["DEFAULT", "US_EAST", "US_WEST", "EUROPE"]
|
280
|
+
if record.has_key?(:gtdLocation) && acceptable_location.include?(record[:gtdLocation])
|
307
281
|
raise DnsMadeEasy::InvalidRecordError, "Invalid gtd location #{record[:gtdLocation]}"
|
308
282
|
end
|
309
283
|
|
@@ -344,8 +318,8 @@ module DnsMadeEasy
|
|
344
318
|
begin
|
345
319
|
return yield
|
346
320
|
rescue RestClient::BadRequest => e
|
347
|
-
error = JSON.parse(e.http_body)
|
348
|
-
raise DnsMadeEasy::BadRequestError, error[
|
321
|
+
error = JSON.parse(e.http_body, :symbolize_names => true)
|
322
|
+
raise DnsMadeEasy::BadRequestError, error[:error][0]
|
349
323
|
rescue RestClient::ResourceNotFound => e
|
350
324
|
raise DnsMadeEasy::ResourceNotFoundError, namespace
|
351
325
|
rescue RestClient::Forbidden => e
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dnsmadeeasy-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.9.7
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nitesh Goel
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-07-
|
18
|
+
date: 2011-07-08 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rest-client
|
@@ -73,7 +73,7 @@ dependencies:
|
|
73
73
|
version: "0"
|
74
74
|
type: :development
|
75
75
|
version_requirements: *id004
|
76
|
-
description: Ruby client for DNSMadeEasy API.
|
76
|
+
description: Ruby client and commandline utility for the DNSMadeEasy API.
|
77
77
|
email: nitesh@sigfig.com
|
78
78
|
executables:
|
79
79
|
- dme
|
@@ -136,6 +136,6 @@ rubyforge_project: dnsmadeeasy-api
|
|
136
136
|
rubygems_version: 1.8.5
|
137
137
|
signing_key:
|
138
138
|
specification_version: 3
|
139
|
-
summary: Ruby client for DNSMadeEasy API.
|
139
|
+
summary: Ruby client and commandline utility for the DNSMadeEasy API.
|
140
140
|
test_files: []
|
141
141
|
|