sparqcode-dnsimple-ruby 1.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.bundle/config +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +71 -0
- data/LICENSE +22 -0
- data/README +125 -0
- data/README.rdoc +125 -0
- data/README.textile +161 -0
- data/Rakefile +33 -0
- data/VERSION +1 -0
- data/bin/dnsimple +4 -0
- data/bin/dnsimple.rb +153 -0
- data/dnsimple-ruby.gemspec +191 -0
- data/features/README +12 -0
- data/features/cli/certificates/purchase_certificate.feature +10 -0
- data/features/cli/contacts/create_contact.feature +10 -0
- data/features/cli/domains/check_domain.feature +10 -0
- data/features/cli/domains/create_domain.feature +10 -0
- data/features/cli/domains/delete_domain.feature +11 -0
- data/features/cli/domains/register_domain.feature +10 -0
- data/features/cli/records/create_ptr_record.feature +11 -0
- data/features/cli/records/create_record.feature +12 -0
- data/features/cli/records/delete_record.feature +14 -0
- data/features/cli/templates/apply_template.feature +11 -0
- data/features/step_definitions/certificate_steps.rb +3 -0
- data/features/step_definitions/cli_steps.rb +8 -0
- data/features/step_definitions/domain_steps.rb +32 -0
- data/features/step_definitions/record_steps.rb +38 -0
- data/features/step_definitions/template_steps.rb +9 -0
- data/features/support/env.rb +17 -0
- data/fixtures/vcr_cassettes/DNSimple_Certificate/_all.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Certificate/_purchase.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Certificate/_submit.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Contact/a_new_contact.yml +42 -0
- data/fixtures/vcr_cassettes/DNSimple_Contact/an_existing_contact.yml +42 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/_all.yml +130 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/applying_templates.yml +216 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/creating_a_new_domain.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/finding_an_existing_domain/by_id.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/finding_an_existing_domain/by_name.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/registration/with_a_new_registrant_contact.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/registration/with_an_existing_contact.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Domain/setting_name_servers.yml +30 -0
- data/fixtures/vcr_cassettes/DNSimple_ExtendedAttribute/list_extended_attributes/for_ca.yml +40 -0
- data/fixtures/vcr_cassettes/DNSimple_ExtendedAttribute/list_extended_attributes/for_com.yml +40 -0
- data/fixtures/vcr_cassettes/DNSimple_Record/_all.yml +173 -0
- data/fixtures/vcr_cassettes/DNSimple_Record/creating_a_new_record.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Record/find_a_record.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_Template/a_template.yml +44 -0
- data/fixtures/vcr_cassettes/DNSimple_User/_me.yml +42 -0
- data/lib/dnsimple.rb +19 -0
- data/lib/dnsimple/certificate.rb +158 -0
- data/lib/dnsimple/cli.rb +122 -0
- data/lib/dnsimple/client.rb +74 -0
- data/lib/dnsimple/command.rb +10 -0
- data/lib/dnsimple/commands/add_service.rb +16 -0
- data/lib/dnsimple/commands/add_template_record.rb +18 -0
- data/lib/dnsimple/commands/apply_template.rb +15 -0
- data/lib/dnsimple/commands/check_domain.rb +11 -0
- data/lib/dnsimple/commands/clear_domain.rb +16 -0
- data/lib/dnsimple/commands/create_contact.rb +21 -0
- data/lib/dnsimple/commands/create_domain.rb +16 -0
- data/lib/dnsimple/commands/create_record.rb +20 -0
- data/lib/dnsimple/commands/create_template.rb +14 -0
- data/lib/dnsimple/commands/delete_contact.rb +14 -0
- data/lib/dnsimple/commands/delete_domain.rb +14 -0
- data/lib/dnsimple/commands/delete_record.rb +16 -0
- data/lib/dnsimple/commands/delete_template.rb +13 -0
- data/lib/dnsimple/commands/delete_template_record.rb +16 -0
- data/lib/dnsimple/commands/describe_certificate.rb +34 -0
- data/lib/dnsimple/commands/describe_contact.rb +25 -0
- data/lib/dnsimple/commands/describe_domain.rb +14 -0
- data/lib/dnsimple/commands/describe_record.rb +16 -0
- data/lib/dnsimple/commands/describe_service.rb +12 -0
- data/lib/dnsimple/commands/describe_user.rb +18 -0
- data/lib/dnsimple/commands/list_applied_services.rb +16 -0
- data/lib/dnsimple/commands/list_available_services.rb +16 -0
- data/lib/dnsimple/commands/list_certificates.rb +15 -0
- data/lib/dnsimple/commands/list_contacts.rb +13 -0
- data/lib/dnsimple/commands/list_domains.rb +13 -0
- data/lib/dnsimple/commands/list_extended_attributes.rb +25 -0
- data/lib/dnsimple/commands/list_records.rb +21 -0
- data/lib/dnsimple/commands/list_services.rb +14 -0
- data/lib/dnsimple/commands/list_template_records.rb +17 -0
- data/lib/dnsimple/commands/list_templates.rb +13 -0
- data/lib/dnsimple/commands/purchase_certificate.rb +19 -0
- data/lib/dnsimple/commands/register_domain.rb +33 -0
- data/lib/dnsimple/commands/remove_service.rb +14 -0
- data/lib/dnsimple/commands/submit_certificate.rb +19 -0
- data/lib/dnsimple/commands/transfer_domain.rb +21 -0
- data/lib/dnsimple/commands/update_contact.rb +25 -0
- data/lib/dnsimple/commands/update_record.rb +23 -0
- data/lib/dnsimple/contact.rb +181 -0
- data/lib/dnsimple/domain.rb +246 -0
- data/lib/dnsimple/error.rb +32 -0
- data/lib/dnsimple/extended_attribute.rb +73 -0
- data/lib/dnsimple/record.rb +128 -0
- data/lib/dnsimple/service.rb +58 -0
- data/lib/dnsimple/template.rb +91 -0
- data/lib/dnsimple/template_record.rb +103 -0
- data/lib/dnsimple/transfer_order.rb +45 -0
- data/lib/dnsimple/user.rb +44 -0
- data/spec/README +10 -0
- data/spec/certificate_spec.rb +46 -0
- data/spec/command_spec.rb +19 -0
- data/spec/commands/add_service_spec.rb +29 -0
- data/spec/commands/create_record_spec.rb +23 -0
- data/spec/commands/list_records_spec.rb +34 -0
- data/spec/commands/purchase_certificate_spec.rb +24 -0
- data/spec/commands/submit_certificate_spec.rb +19 -0
- data/spec/contact_spec.rb +35 -0
- data/spec/domain_spec.rb +97 -0
- data/spec/extended_attributes_spec.rb +19 -0
- data/spec/record_spec.rb +59 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/template_spec.rb +11 -0
- data/spec/user_spec.rb +23 -0
- metadata +353 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
module DNSimple
|
2
|
+
module Commands
|
3
|
+
class ListTemplates
|
4
|
+
def execute(args, options={})
|
5
|
+
templates = Template.all
|
6
|
+
puts "Found #{templates.length} templates:"
|
7
|
+
templates.each do |template|
|
8
|
+
puts "\t#{template.name} (short_name:#{template.short_name})"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'dnsimple/command'
|
2
|
+
|
3
|
+
module DNSimple
|
4
|
+
module Commands
|
5
|
+
class PurchaseCertificate < Command
|
6
|
+
def execute(args, options={})
|
7
|
+
domain_name = args.shift
|
8
|
+
name = args.shift
|
9
|
+
contact_id = args.shift
|
10
|
+
|
11
|
+
domain = Domain.find(domain_name)
|
12
|
+
contact = Contact.find(contact_id)
|
13
|
+
|
14
|
+
certificate = Certificate.purchase(domain, name, contact)
|
15
|
+
say "Purchased certificate for #{certificate.fqdn}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module DNSimple
|
2
|
+
module Commands
|
3
|
+
class RegisterDomain
|
4
|
+
def execute(args, options={})
|
5
|
+
name = args.shift
|
6
|
+
registrant = nil
|
7
|
+
|
8
|
+
registrant_id_or_attribute = args.shift
|
9
|
+
if registrant_id_or_attribute
|
10
|
+
if registrant_id_or_attribute =~ /^\d+$/
|
11
|
+
registrant = {:id => registrant_id_or_attribute}
|
12
|
+
else
|
13
|
+
args.unshift(registrant_id_or_attribute)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
extended_attributes = {}
|
18
|
+
args.each do |arg|
|
19
|
+
n, v = arg.split(":")
|
20
|
+
extended_attributes[n] = v
|
21
|
+
end
|
22
|
+
|
23
|
+
domain = Domain.register(name, registrant, extended_attributes)
|
24
|
+
puts "Registered #{domain.name}"
|
25
|
+
|
26
|
+
if template = options.delete(:template)
|
27
|
+
domain.apply(template)
|
28
|
+
puts "Applied template #{template} to #{domain.name}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DNSimple
|
2
|
+
module Commands
|
3
|
+
class RemoveService
|
4
|
+
def execute(args, options={})
|
5
|
+
domain_name = args.shift
|
6
|
+
domain = Domain.find(domain_name)
|
7
|
+
short_name = args.shift
|
8
|
+
service = Service.find(short_name)
|
9
|
+
domain.remove_service(service.id)
|
10
|
+
puts "Removed #{service.name} from #{domain_name}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'dnsimple/command'
|
2
|
+
|
3
|
+
module DNSimple
|
4
|
+
module Commands
|
5
|
+
class SubmitCertificate < Command
|
6
|
+
def execute(args, options={})
|
7
|
+
domain_name = args.shift
|
8
|
+
certificate_id = args.shift
|
9
|
+
approver_email = args.shift
|
10
|
+
|
11
|
+
domain = DNSimple::Domain.find(domain_name)
|
12
|
+
certificate = DNSimple::Certificate.find(domain, certificate_id)
|
13
|
+
certificate.submit(approver_email)
|
14
|
+
|
15
|
+
say "Certificate submitted, authorization by email required"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DNSimple
|
2
|
+
module Commands
|
3
|
+
class TransferDomain
|
4
|
+
def execute(args, options={})
|
5
|
+
name = args.shift
|
6
|
+
registrant = {:id => args.shift}
|
7
|
+
authinfo = args.shift unless args.empty?
|
8
|
+
authinfo ||= ''
|
9
|
+
|
10
|
+
extended_attributes = {}
|
11
|
+
args.each do |arg|
|
12
|
+
n, v = arg.split(":")
|
13
|
+
extended_attributes[n] = v
|
14
|
+
end
|
15
|
+
|
16
|
+
transfer_order = TransferOrder.create(name, authinfo, registrant, extended_attributes)
|
17
|
+
puts "Transfer order issued for #{name}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module DNSimple
|
2
|
+
module Commands
|
3
|
+
class UpdateContact
|
4
|
+
# Execute the contact:update command.
|
5
|
+
#
|
6
|
+
# Args expected:
|
7
|
+
# id [name:value name:value ...]
|
8
|
+
def execute(args, options={})
|
9
|
+
attributes = {}
|
10
|
+
id = args.shift
|
11
|
+
args.each do |arg|
|
12
|
+
name, value = arg.split(":")
|
13
|
+
attributes[Contact.resolve(name)] = value
|
14
|
+
end
|
15
|
+
|
16
|
+
contact = Contact.find(id)
|
17
|
+
attributes.each do |name, value|
|
18
|
+
contact.send("#{name}=", value)
|
19
|
+
end
|
20
|
+
contact.save
|
21
|
+
puts "Updated contact #{contact.name} (id: #{contact.id})"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module DNSimple
|
2
|
+
module Commands
|
3
|
+
class UpdateRecord
|
4
|
+
def execute(args, options={})
|
5
|
+
attributes = {}
|
6
|
+
domain_name = args.shift
|
7
|
+
id = args.shift
|
8
|
+
args.each do |arg|
|
9
|
+
name, value = arg.split(":")
|
10
|
+
attributes[Record.resolve(name)] = value
|
11
|
+
end
|
12
|
+
|
13
|
+
domain = Domain.find(domain_name)
|
14
|
+
record = Record.find(domain, id)
|
15
|
+
attributes.each do |name, value|
|
16
|
+
record.send("#{name}=", value)
|
17
|
+
end
|
18
|
+
record.save
|
19
|
+
puts "Updated record #{record.fqdn} (id: #{record.id})"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
module DNSimple #:nodoc:
|
2
|
+
# CLass representing a contact in DNSimple
|
3
|
+
class Contact
|
4
|
+
include HTTParty
|
5
|
+
|
6
|
+
# The contact ID in DNSimple
|
7
|
+
attr_accessor :id
|
8
|
+
|
9
|
+
# The name of the organization in which the contact works
|
10
|
+
# (may be omitted)
|
11
|
+
attr_accessor :organization_name
|
12
|
+
|
13
|
+
# The contact first name
|
14
|
+
attr_accessor :first_name
|
15
|
+
|
16
|
+
# The contact last name
|
17
|
+
attr_accessor :last_name
|
18
|
+
|
19
|
+
# The contact's job title (may be omitted)
|
20
|
+
attr_accessor :job_title
|
21
|
+
|
22
|
+
# The contact street address
|
23
|
+
attr_accessor :address1
|
24
|
+
|
25
|
+
# Apartment or suite number
|
26
|
+
attr_accessor :address2
|
27
|
+
|
28
|
+
# The city name
|
29
|
+
attr_accessor :city
|
30
|
+
|
31
|
+
# The state or province name
|
32
|
+
attr_accessor :state_province
|
33
|
+
|
34
|
+
# The contact postal code
|
35
|
+
attr_accessor :postal_code
|
36
|
+
|
37
|
+
# The contact country (as a 2-character country code)
|
38
|
+
attr_accessor :country
|
39
|
+
|
40
|
+
# The contact email address
|
41
|
+
attr_accessor :email_address
|
42
|
+
|
43
|
+
# The contact phone number
|
44
|
+
attr_accessor :phone
|
45
|
+
|
46
|
+
# The contact phone extension (may be omitted)
|
47
|
+
attr_accessor :phone_ext
|
48
|
+
|
49
|
+
# The contact fax number (may be omitted)
|
50
|
+
attr_accessor :fax
|
51
|
+
|
52
|
+
# When the contact was created in DNSimple
|
53
|
+
attr_accessor :created_at
|
54
|
+
|
55
|
+
# When the contact was last updated in DNSimple
|
56
|
+
attr_accessor :updated_at
|
57
|
+
|
58
|
+
#:nodoc:
|
59
|
+
def initialize(attributes)
|
60
|
+
attributes.each do |key, value|
|
61
|
+
m = "#{key}=".to_sym
|
62
|
+
self.send(m, value) if self.respond_to?(m)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def name
|
67
|
+
[first_name, last_name].join(' ')
|
68
|
+
end
|
69
|
+
|
70
|
+
def save(options={})
|
71
|
+
contact_hash = {}
|
72
|
+
%w(first_name last_name organization_name job_title address1 address2 city
|
73
|
+
state_province postal_code country email_address phone phone_ext fax).each do |attribute|
|
74
|
+
contact_hash[Contact.resolve(attribute)] = self.send(attribute)
|
75
|
+
end
|
76
|
+
|
77
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
78
|
+
options.merge!({:body => {:contact => contact_hash}})
|
79
|
+
|
80
|
+
response = self.class.put("#{Client.base_uri}/contacts/#{id}", options)
|
81
|
+
|
82
|
+
pp response if Client.debug?
|
83
|
+
|
84
|
+
case response.code
|
85
|
+
when 200
|
86
|
+
return self
|
87
|
+
when 401
|
88
|
+
raise RuntimeError, "Authentication failed"
|
89
|
+
else
|
90
|
+
raise RuntimeError, "Failed to update contact: #{response.inspect}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Delete the contact from DNSimple. WARNING: this cannot be undone.
|
95
|
+
def delete(options={})
|
96
|
+
options.merge!({:basic_auth => Client.credentials})
|
97
|
+
self.class.delete("#{Client.base_uri}/contacts/#{id}.json", options)
|
98
|
+
end
|
99
|
+
alias :destroy :delete
|
100
|
+
|
101
|
+
# Map an aliased field name to it's real name. For example, if you
|
102
|
+
# pass "first" it will be resolved to "first_name", "email" is resolved
|
103
|
+
# to "email_address" and so on.
|
104
|
+
def self.resolve(name)
|
105
|
+
aliases = {
|
106
|
+
'first' => 'first_name',
|
107
|
+
'last' => 'last_name',
|
108
|
+
'state' => 'state_province',
|
109
|
+
'province' => 'state_province',
|
110
|
+
'state_or_province' => 'state_province',
|
111
|
+
'email' => 'email_address',
|
112
|
+
}
|
113
|
+
aliases[name.to_s] || name
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.resolve_attributes(attributes)
|
117
|
+
resolved_attributes = {}
|
118
|
+
attributes.each do |k, v|
|
119
|
+
resolved_attributes[resolve(k)] = v
|
120
|
+
end
|
121
|
+
resolved_attributes
|
122
|
+
end
|
123
|
+
|
124
|
+
# Create the contact with the given attributes in DNSimple.
|
125
|
+
# This method returns a Contact instance of the contact is created
|
126
|
+
# and raises an error otherwise.
|
127
|
+
def self.create(attributes, options={})
|
128
|
+
contact_hash = resolve_attributes(attributes)
|
129
|
+
|
130
|
+
options.merge!({:body => {:contact => contact_hash}})
|
131
|
+
options.merge!({:basic_auth => Client.credentials})
|
132
|
+
|
133
|
+
response = self.post("#{Client.base_uri}/contacts.json", options)
|
134
|
+
|
135
|
+
pp response if Client.debug?
|
136
|
+
|
137
|
+
case response.code
|
138
|
+
when 201
|
139
|
+
return Contact.new(response["contact"])
|
140
|
+
when 401
|
141
|
+
raise RuntimeError, "Authentication failed"
|
142
|
+
else
|
143
|
+
raise RuntimeError, "Failed to create contact: #{response.inspect}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.find(id, options={})
|
148
|
+
options.merge!({:basic_auth => Client.credentials})
|
149
|
+
response = self.get("#{Client.base_uri}/contacts/#{id}.json", options)
|
150
|
+
|
151
|
+
pp response if Client.debug?
|
152
|
+
|
153
|
+
case response.code
|
154
|
+
when 200
|
155
|
+
return Contact.new(response["contact"])
|
156
|
+
when 401
|
157
|
+
raise RuntimeError, "Authentication failed"
|
158
|
+
when 404
|
159
|
+
raise RuntimeError, "Could not find contact #{id}"
|
160
|
+
else
|
161
|
+
raise DNSimple::Error.new(id, response["errors"])
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def self.all(options={})
|
166
|
+
options.merge!({:basic_auth => Client.credentials})
|
167
|
+
response = self.get("#{Client.base_uri}/contacts.json", options)
|
168
|
+
|
169
|
+
pp response if Client.debug?
|
170
|
+
|
171
|
+
case response.code
|
172
|
+
when 200
|
173
|
+
response.map { |r| Contact.new(r["contact"]) }
|
174
|
+
when 401
|
175
|
+
raise RuntimeError, "Authentication failed"
|
176
|
+
else
|
177
|
+
raise RuntimeError, "Error: #{response.code}"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,246 @@
|
|
1
|
+
module DNSimple #:nodoc:
|
2
|
+
# Class representing a single domain in DNSimple.
|
3
|
+
class Domain
|
4
|
+
include HTTParty
|
5
|
+
|
6
|
+
# The domain ID in DNSimple
|
7
|
+
attr_accessor :id
|
8
|
+
|
9
|
+
# The domain name
|
10
|
+
attr_accessor :name
|
11
|
+
|
12
|
+
# When the domain was created in DNSimple
|
13
|
+
attr_accessor :created_at
|
14
|
+
|
15
|
+
# When the domain was last update in DNSimple
|
16
|
+
attr_accessor :updated_at
|
17
|
+
|
18
|
+
# The current known name server status
|
19
|
+
attr_accessor :name_server_status
|
20
|
+
|
21
|
+
#:nodoc:
|
22
|
+
def initialize(attributes)
|
23
|
+
attributes.each do |key, value|
|
24
|
+
m = "#{key}=".to_sym
|
25
|
+
self.send(m, value) if self.respond_to?(m)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Delete the domain from DNSimple. WARNING: this cannot
|
30
|
+
# be undone.
|
31
|
+
def delete(options={})
|
32
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
33
|
+
self.class.delete("#{DNSimple::Client.base_uri}/domains/#{name}", options)
|
34
|
+
end
|
35
|
+
alias :destroy :delete
|
36
|
+
|
37
|
+
# Apply the given named template to the domain. This will add
|
38
|
+
# all of the records in the template to the domain.
|
39
|
+
def apply(template, options={})
|
40
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
41
|
+
options.merge!(:body => {})
|
42
|
+
template = resolve_template(template)
|
43
|
+
self.class.post("#{DNSimple::Client.base_uri}/domains/#{name}/templates/#{template.id}/apply", options)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Overwrite the nameservers for a given domain.
|
47
|
+
def update_name_servers(name_servers, options = {})
|
48
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
49
|
+
|
50
|
+
name_servers_hash = {}
|
51
|
+
ns_index = 1
|
52
|
+
|
53
|
+
name_servers.each do |name_server|
|
54
|
+
name_servers_hash["ns#{ns_index}"] = name_server
|
55
|
+
ns_index += 1
|
56
|
+
end
|
57
|
+
|
58
|
+
options.merge!(:body => { :name_servers => name_servers_hash })
|
59
|
+
|
60
|
+
response = self.class.post("#{DNSimple::Client.base_uri}/domains/#{name}/name_servers.json", options)
|
61
|
+
pp response if DNSimple::Client.debug?
|
62
|
+
|
63
|
+
case response.code
|
64
|
+
|
65
|
+
when 200
|
66
|
+
name_servers
|
67
|
+
else
|
68
|
+
raise RuntimeError, "Error: #{response.code}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
#:nodoc:
|
73
|
+
def resolve_template(template)
|
74
|
+
case template
|
75
|
+
when DNSimple::Template
|
76
|
+
template
|
77
|
+
else
|
78
|
+
DNSimple::Template.find(template)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def applied_services(options={})
|
83
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
84
|
+
response = self.class.get("#{Client.base_uri}/domains/#{name}/applied_services", options)
|
85
|
+
pp response if DNSimple::Client.debug?
|
86
|
+
case response.code
|
87
|
+
when 200
|
88
|
+
response.map { |r| DNSimple::Service.new(r["service"]) }
|
89
|
+
when 401
|
90
|
+
raise RuntimeError, "Authentication failed"
|
91
|
+
else
|
92
|
+
raise RuntimeError, "Error: #{response.code}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def available_services(options={})
|
97
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
98
|
+
response = self.class.get("#{DNSimple::Client.base_uri}/domains/#{name}/available_services", options)
|
99
|
+
pp response if DNSimple::Client.debug?
|
100
|
+
case response.code
|
101
|
+
when 200
|
102
|
+
response.map { |r| DNSimple::Service.new(r["service"]) }
|
103
|
+
when 401
|
104
|
+
raise RuntimeError, "Authentication failed"
|
105
|
+
else
|
106
|
+
raise RuntimeError, "Error: #{response.code}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def add_service(id_or_short_name, options={})
|
111
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
112
|
+
options.merge!(:body => {:service => {:id => id_or_short_name}})
|
113
|
+
response = self.class.post("#{DNSimple::Client.base_uri}/domains/#{name}/applied_services", options)
|
114
|
+
pp response if DNSimple::Client.debug?
|
115
|
+
case response.code
|
116
|
+
when 200
|
117
|
+
true
|
118
|
+
when 401
|
119
|
+
raise RuntimeError, "Authentication failed"
|
120
|
+
else
|
121
|
+
raise "Error: #{response.code}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def remove_service(id, options={})
|
126
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
127
|
+
response = self.class.delete("#{DNSimple::Client.base_uri}/domains/#{name}/applied_services/#{id}", options)
|
128
|
+
pp response if DNSimple::Client.debug?
|
129
|
+
case response.code
|
130
|
+
when 200
|
131
|
+
true
|
132
|
+
when 401
|
133
|
+
raise RuntimeError, "Authentication failed"
|
134
|
+
else
|
135
|
+
raise "Error: #{response.code}"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Check the availability of a name
|
140
|
+
def self.check(name, options={})
|
141
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
142
|
+
response = self.get("#{DNSimple::Client.base_uri}/domains/#{name}/check", options)
|
143
|
+
pp response if DNSimple::Client.debug?
|
144
|
+
case response.code
|
145
|
+
when 200
|
146
|
+
"registered"
|
147
|
+
when 401
|
148
|
+
raise RuntimeError, "Authentication failed"
|
149
|
+
when 404
|
150
|
+
"available"
|
151
|
+
else
|
152
|
+
raise "Error: #{response.code}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# Create the domain with the given name in DNSimple. This
|
157
|
+
# method returns a Domain instance if the name is created
|
158
|
+
# and raises an error otherwise.
|
159
|
+
def self.create(name, options={})
|
160
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
161
|
+
|
162
|
+
domain_hash = {:name => name}
|
163
|
+
options.merge!({:body => {:domain => domain_hash}})
|
164
|
+
|
165
|
+
response = self.post("#{DNSimple::Client.base_uri}/domains", options)
|
166
|
+
|
167
|
+
pp response if DNSimple::Client.debug?
|
168
|
+
|
169
|
+
case response.code
|
170
|
+
when 201
|
171
|
+
return DNSimple::Domain.new(response["domain"])
|
172
|
+
when 401
|
173
|
+
raise RuntimeError, "Authentication failed"
|
174
|
+
else
|
175
|
+
raise DNSimple::DomainError.new(name, response["errors"])
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# Purchase a domain name.
|
180
|
+
def self.register(name, registrant={}, extended_attributes={}, options={})
|
181
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
182
|
+
|
183
|
+
body = {:domain => {:name => name}}
|
184
|
+
if registrant
|
185
|
+
if registrant[:id]
|
186
|
+
body[:domain][:registrant_id] = registrant[:id]
|
187
|
+
else
|
188
|
+
body.merge!(:contact => Contact.resolve_attributes(registrant))
|
189
|
+
end
|
190
|
+
end
|
191
|
+
body.merge!(:extended_attribute => extended_attributes)
|
192
|
+
options.merge!({:body => body})
|
193
|
+
|
194
|
+
response = self.post("#{DNSimple::Client.base_uri}/domain_registrations", options)
|
195
|
+
|
196
|
+
pp response if DNSimple::Client.debug?
|
197
|
+
|
198
|
+
case response.code
|
199
|
+
when 201
|
200
|
+
return DNSimple::Domain.new(response["domain"])
|
201
|
+
when 401
|
202
|
+
raise RuntimeError, "Authentication failed"
|
203
|
+
else
|
204
|
+
raise DNSimple::DomainError.new(name, response["errors"])
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
# Find a specific domain in the account either by the numeric ID
|
209
|
+
# or by the fully-qualified domain name.
|
210
|
+
def self.find(id_or_name, options={})
|
211
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
212
|
+
response = self.get("#{DNSimple::Client.base_uri}/domains/#{id_or_name}", options)
|
213
|
+
|
214
|
+
pp response if DNSimple::Client.debug?
|
215
|
+
|
216
|
+
case response.code
|
217
|
+
when 200
|
218
|
+
return DNSimple::Domain.new(response["domain"])
|
219
|
+
when 401
|
220
|
+
raise RuntimeError, "Authentication failed"
|
221
|
+
when 404
|
222
|
+
raise RuntimeError, "Could not find domain #{id_or_name}"
|
223
|
+
else
|
224
|
+
raise DNSimple::DomainError.new(id_or_name, response["errors"])
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# Get all domains for the account.
|
229
|
+
def self.all(options={})
|
230
|
+
options.merge!(DNSimple::Client.standard_options_with_credentials)
|
231
|
+
response = self.get("#{DNSimple::Client.base_uri}/domains", options)
|
232
|
+
|
233
|
+
pp response if DNSimple::Client.debug?
|
234
|
+
|
235
|
+
case response.code
|
236
|
+
when 200
|
237
|
+
response.map { |r| DNSimple::Domain.new(r["domain"]) }
|
238
|
+
when 401
|
239
|
+
raise RuntimeError, "Authentication failed"
|
240
|
+
else
|
241
|
+
raise RuntimeError, "Error: #{response.code}"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
end
|