dnsimple-ruby 1.7.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +3 -9
  4. data/{CHANGELOG.markdown → CHANGELOG.md} +4 -0
  5. data/Gemfile +0 -2
  6. data/LICENSE +1 -1
  7. data/README.md +5 -0
  8. data/Rakefile +0 -15
  9. data/dnsimple-ruby.gemspec +11 -19
  10. data/lib/dnsimple-ruby.rb +2 -0
  11. metadata +20 -288
  12. data/README.markdown +0 -159
  13. data/bin/dnsimple +0 -4
  14. data/bin/dnsimple.rb +0 -156
  15. data/features/README.md +0 -9
  16. data/features/cli/certificates/purchase_certificate.feature +0 -10
  17. data/features/cli/contacts/create_contact.feature +0 -10
  18. data/features/cli/domains/check_domain.feature +0 -10
  19. data/features/cli/domains/create_domain.feature +0 -10
  20. data/features/cli/domains/delete_domain.feature +0 -11
  21. data/features/cli/domains/register_domain.feature +0 -10
  22. data/features/cli/records/create_ptr_record.feature +0 -11
  23. data/features/cli/records/create_record.feature +0 -12
  24. data/features/cli/records/delete_record.feature +0 -14
  25. data/features/cli/templates/apply_template.feature +0 -11
  26. data/features/step_definitions/certificate_steps.rb +0 -3
  27. data/features/step_definitions/cli_steps.rb +0 -8
  28. data/features/step_definitions/domain_steps.rb +0 -32
  29. data/features/step_definitions/record_steps.rb +0 -38
  30. data/features/step_definitions/template_steps.rb +0 -9
  31. data/features/support/env.rb +0 -19
  32. data/lib/dnsimple.rb +0 -33
  33. data/lib/dnsimple/base.rb +0 -10
  34. data/lib/dnsimple/certificate.rb +0 -140
  35. data/lib/dnsimple/cli.rb +0 -121
  36. data/lib/dnsimple/client.rb +0 -128
  37. data/lib/dnsimple/commands/certificate_describe.rb +0 -34
  38. data/lib/dnsimple/commands/certificate_list.rb +0 -15
  39. data/lib/dnsimple/commands/certificate_purchase.rb +0 -17
  40. data/lib/dnsimple/commands/certificate_submit.rb +0 -17
  41. data/lib/dnsimple/commands/contact_create.rb +0 -23
  42. data/lib/dnsimple/commands/contact_delete.rb +0 -14
  43. data/lib/dnsimple/commands/contact_describe.rb +0 -25
  44. data/lib/dnsimple/commands/contact_list.rb +0 -13
  45. data/lib/dnsimple/commands/contact_update.rb +0 -25
  46. data/lib/dnsimple/commands/domain_apply_template.rb +0 -15
  47. data/lib/dnsimple/commands/domain_check.rb +0 -11
  48. data/lib/dnsimple/commands/domain_clear.rb +0 -16
  49. data/lib/dnsimple/commands/domain_create.rb +0 -16
  50. data/lib/dnsimple/commands/domain_delete.rb +0 -14
  51. data/lib/dnsimple/commands/domain_describe.rb +0 -14
  52. data/lib/dnsimple/commands/domain_list.rb +0 -13
  53. data/lib/dnsimple/commands/domain_register.rb +0 -33
  54. data/lib/dnsimple/commands/domain_transfer.rb +0 -21
  55. data/lib/dnsimple/commands/extended_attribute_list.rb +0 -25
  56. data/lib/dnsimple/commands/me.rb +0 -18
  57. data/lib/dnsimple/commands/record_create.rb +0 -18
  58. data/lib/dnsimple/commands/record_delete.rb +0 -16
  59. data/lib/dnsimple/commands/record_describe.rb +0 -16
  60. data/lib/dnsimple/commands/record_list.rb +0 -19
  61. data/lib/dnsimple/commands/record_update.rb +0 -23
  62. data/lib/dnsimple/commands/service_add.rb +0 -14
  63. data/lib/dnsimple/commands/service_describe.rb +0 -12
  64. data/lib/dnsimple/commands/service_list.rb +0 -14
  65. data/lib/dnsimple/commands/service_list_applied.rb +0 -16
  66. data/lib/dnsimple/commands/service_list_available.rb +0 -16
  67. data/lib/dnsimple/commands/service_remove.rb +0 -14
  68. data/lib/dnsimple/commands/template_create.rb +0 -14
  69. data/lib/dnsimple/commands/template_delete.rb +0 -13
  70. data/lib/dnsimple/commands/template_list.rb +0 -13
  71. data/lib/dnsimple/commands/template_record_create.rb +0 -18
  72. data/lib/dnsimple/commands/template_record_delete.rb +0 -16
  73. data/lib/dnsimple/commands/template_record_list.rb +0 -17
  74. data/lib/dnsimple/contact.rb +0 -154
  75. data/lib/dnsimple/domain.rb +0 -217
  76. data/lib/dnsimple/error.rb +0 -32
  77. data/lib/dnsimple/extended_attribute.rb +0 -52
  78. data/lib/dnsimple/record.rb +0 -94
  79. data/lib/dnsimple/service.rb +0 -42
  80. data/lib/dnsimple/template.rb +0 -63
  81. data/lib/dnsimple/template_record.rb +0 -80
  82. data/lib/dnsimple/transfer_order.rb +0 -34
  83. data/lib/dnsimple/user.rb +0 -51
  84. data/lib/dnsimple/version.rb +0 -3
  85. data/spec/ci/.dnsimple.test +0 -3
  86. data/spec/commands/certificate_purchase_spec.rb +0 -25
  87. data/spec/commands/certificate_submit_spec.rb +0 -18
  88. data/spec/commands/record_create_spec.rb +0 -23
  89. data/spec/commands/record_list_spec.rb +0 -23
  90. data/spec/commands/service_add_spec.rb +0 -20
  91. data/spec/dnsimple/certificate_spec.rb +0 -59
  92. data/spec/dnsimple/client_spec.rb +0 -154
  93. data/spec/dnsimple/contact_spec.rb +0 -45
  94. data/spec/dnsimple/domain_spec.rb +0 -133
  95. data/spec/dnsimple/extended_attributes_spec.rb +0 -54
  96. data/spec/dnsimple/record_spec.rb +0 -51
  97. data/spec/dnsimple/template_spec.rb +0 -31
  98. data/spec/dnsimple/user_spec.rb +0 -70
  99. data/spec/files/2fa/error-badtoken.http +0 -22
  100. data/spec/files/2fa/error-required.http +0 -23
  101. data/spec/files/2fa/exchange-token.http +0 -25
  102. data/spec/files/account/user/success.http +0 -19
  103. data/spec/files/certificates/index/success.http +0 -19
  104. data/spec/files/certificates/show/notfound.http +0 -17
  105. data/spec/files/certificates/show/success.http +0 -19
  106. data/spec/files/contacts/show/notfound.http +0 -17
  107. data/spec/files/contacts/show/success.http +0 -19
  108. data/spec/files/domains/auto_renewal_disable/notfound.http +0 -21
  109. data/spec/files/domains/auto_renewal_disable/success.http +0 -23
  110. data/spec/files/domains/auto_renewal_enable/notfound.http +0 -21
  111. data/spec/files/domains/auto_renewal_enable/success.http +0 -23
  112. data/spec/files/domains/show/notfound.http +0 -17
  113. data/spec/files/domains/show/success.http +0 -19
  114. data/spec/files/extended_attributes/ca.http +0 -19
  115. data/spec/files/extended_attributes/com.http +0 -19
  116. data/spec/files/extended_attributes/success.http +0 -19
  117. data/spec/files/records/index/success.http +0 -19
  118. data/spec/files/records/show/notfound.http +0 -17
  119. data/spec/files/records/show/success.http +0 -19
  120. data/spec/files/templates/show/notfound.http +0 -17
  121. data/spec/files/templates/show/success.http +0 -19
  122. data/spec/spec_helper.rb +0 -39
  123. data/spec/support/helpers.rb +0 -15
  124. data/spec/support/webmock.rb +0 -11
@@ -1,3 +0,0 @@
1
- Then /^the output should show that a certificate was purchased$/ do
2
- steps %Q(Then the output should contain "Purchased certificate for #{@domain_name}")
3
- end
@@ -1,8 +0,0 @@
1
- Given /^I have set up my credentials$/ do
2
- path = DNSimple::Client.config_path
3
- File.exists?(File.expand_path(path)).should be_truthy, "Please set up your #{path} file to continue"
4
- credentials = YAML.load(File.new(File.expand_path(path)))
5
- expect(credentials['username']).to_not be_nil, "You must specify a username in your #{path} file"
6
- expect(credentials['password']).to_not be_nil, "You must specify a password in your #{path} file"
7
- expect(credentials['base_uri']).to_not be_nil, "For cucumber to run, you must specify a base_uri in your #{path} file"
8
- end
@@ -1,32 +0,0 @@
1
- When /^I run `(.*)` with a new domain$/ do |cmd|
2
- @domain_name = "cli-test-#{Time.now.to_i}.com"
3
- steps %Q(When I run `#{cmd} #{@domain_name}`)
4
- end
5
-
6
- When /^I run `(.*)` with a in\-addr\.arpa domain$/ do |cmd|
7
- @domain_name = '0.0.10.in-addr.arpa'
8
- steps %Q(When I run `#{cmd} #{@domain_name}`)
9
- end
10
-
11
- When /^I run `(.*)` with a domain I created$/ do |cmd|
12
- steps %Q(
13
- When I run `dnsimple create` with a new domain
14
- )
15
- steps %Q(
16
- And I run `#{cmd} #{@domain_name}`
17
- )
18
- end
19
-
20
- Then /^the output should show that the domain was created$/ do
21
- steps %Q(Then the output should contain "Created #{@domain_name}")
22
- end
23
-
24
- Then /^the output should show that the domain was deleted$/ do
25
- steps %Q(Then the output should contain "Deleted #{@domain_name}")
26
- end
27
-
28
- Then /^the output should show that the domain was registered$/ do
29
- steps %Q(Then the output should contain "Registered #{@domain_name}")
30
- end
31
-
32
-
@@ -1,38 +0,0 @@
1
- When /^I run `(.*)` with the domain I added and no name and the type "([^\"]*)" and the content "([^\"]*)"$/ do |cmd, type, content|
2
- steps %Q(When I run `#{cmd} #{@domain_name} '' #{type} #{content}`)
3
- end
4
-
5
- When /^I run `(.*)` with the domain I added and the name "([^\"]*)" and the type "([^\"]*)" and the content "([^\"]*)"$/ do |cmd, name, type, content|
6
- steps %Q(When I run `#{cmd} #{@domain_name} #{name} #{type} #{content}`)
7
- end
8
-
9
- When /^I run `(.*)` with the id of the record$/ do |cmd|
10
- steps %Q(When I run `#{cmd} #{@domain_name} #{@record_id}`)
11
- end
12
-
13
- When /^I note the id of the record I added$/ do
14
- ps = only_processes.last
15
- fail "No last process" unless ps
16
- m = ps.stdout.match(/id:(\d+)/)
17
- fail "Unable to find ID of record" unless m
18
- @record_id = m[1]
19
- end
20
-
21
- Then /^the output should show that the "([^\"]*)" record was created$/ do |type|
22
- steps %Q(Then the output should contain "Created #{type} record for #{@domain_name}")
23
- end
24
-
25
- Then /^the output should include the record id$/ do
26
- steps %Q(Then the output should match /id:(\\d+)/)
27
- end
28
-
29
- Then /^the output should show that the record was deleted$/ do
30
- steps %Q(Then the output should contain "Deleted #{@record_id} from #{@domain_name}")
31
- end
32
-
33
- Then /^I the domain should have (\d+) records$/ do |n|
34
- steps %Q(
35
- When I run `dnsimple record:list #{@domain_name}`
36
- Then the output should contain "Found #{n} records for #{@domain_name}"
37
- )
38
- end
@@ -1,9 +0,0 @@
1
- When /^I run `(.*)` with the domain and the template named "([^\"]*)"$/ do |cmd, template|
2
- @template_name = template
3
- steps %Q(When I run `#{cmd} #{@domain_name} #{template}`)
4
- end
5
-
6
- Then /^the output should show that the template was applied$/ do
7
- steps %Q(Then the output should contain "Applied template #{@template_name} to #{@domain_name}")
8
- end
9
-
@@ -1,19 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'aruba/cucumber'
4
-
5
- $:.unshift(File.dirname(__FILE__) + '/lib')
6
- require 'dnsimple'
7
-
8
- Before do
9
- @aruba_timeout_seconds = 30
10
- ENV['DNSIMPLE_CONFIG'] = '~/.dnsimple.test'
11
- end
12
-
13
- After do |scenario|
14
- unless ENV['NODELETE'] || scenario.source_tag_names.include?('@skip-delete')
15
- if @domain_name && (@domain_name =~ /^cli-/ || @domain_name =~ /in-addr\.arpa/)
16
- steps %Q(When I run `dnsimple delete #{@domain_name}`)
17
- end
18
- end
19
- end
@@ -1,33 +0,0 @@
1
- require 'httparty'
2
-
3
- module DNSimple
4
-
5
- BLANK_REGEX = /\S+/
6
-
7
- # Echoes a deprecation warning message.
8
- #
9
- # @param [String] message The message to display.
10
- # @return [void]
11
- #
12
- # @api internal
13
- # @private
14
- def self.deprecate(message = nil)
15
- message ||= "You are using deprecated behavior which will be removed from the next major or minor release."
16
- warn("DEPRECATION WARNING: #{message}")
17
- end
18
-
19
- end
20
-
21
- require 'dnsimple/base'
22
- require 'dnsimple/client'
23
- require 'dnsimple/error'
24
- require 'dnsimple/user'
25
- require 'dnsimple/contact'
26
- require 'dnsimple/domain'
27
- require 'dnsimple/record'
28
- require 'dnsimple/template'
29
- require 'dnsimple/template_record'
30
- require 'dnsimple/transfer_order'
31
- require 'dnsimple/extended_attribute'
32
- require 'dnsimple/service'
33
- require 'dnsimple/certificate'
@@ -1,10 +0,0 @@
1
- module DNSimple
2
- class Base
3
- def initialize(attributes = {})
4
- attributes.each do |key, value|
5
- m = "#{key}=".to_sym
6
- self.send(m, value) if self.respond_to?(m)
7
- end
8
- end
9
- end
10
- end
@@ -1,140 +0,0 @@
1
- module DNSimple
2
-
3
- # Represents an SSL certificate that has been purchased.
4
- #
5
- # The certificate must also be submitted using the #submit method
6
- # before the Certificate Authority will issue a signed certificate.
7
- class Certificate < Base
8
-
9
- # The Fixnum certificate ID in DNSimple.
10
- attr_accessor :id
11
-
12
- # The Fixnum associated domain ID.
13
- attr_accessor :domain_id
14
-
15
- # The Fixnum associated contact ID.
16
- attr_accessor :contact_id
17
-
18
- # The String subdomain on the certificate.
19
- attr_accessor :name
20
-
21
- # The String state.
22
- attr_accessor :state
23
-
24
- # The String Certificate Signing Request.
25
- attr_accessor :csr
26
-
27
- # The String SSL certificate.
28
- # It is set only if the order issued by the Certificate Authority.
29
- attr_accessor :ssl_certificate
30
-
31
- # The String private key.
32
- # It is set only if DNSimple generated the Certificate Signing Request.
33
- attr_accessor :private_key
34
-
35
- # The String approver email address
36
- # It is set only if the state is submitted.
37
- attr_accessor :approver_email
38
-
39
- # The Array of all emails that can be used to approve the certificate.
40
- # It is set only if the state is configured.
41
- attr_accessor :approver_emails
42
-
43
- # The Date the certificate was purchased
44
- attr_accessor :created_at
45
-
46
- # The Date the certificate was last updated
47
- attr_accessor :updated_at
48
-
49
- # The Date the certificate was configured
50
- attr_accessor :configured_at
51
-
52
- # The Date the Certificate will expire
53
- attr_accessor :expires_on
54
-
55
- # The associated Domain.
56
- attr_accessor :domain
57
-
58
-
59
- # Purchase a certificate under the given domain with the given name. The
60
- # name will be appended to the domain name, and thus should only be the
61
- # subdomain part.
62
- #
63
- # Example: DNSimple::Certificate.purchase(domain, 'www', contact)
64
- #
65
- # Please note that by invoking this method DNSimple will immediately charge
66
- # your credit card on file at DNSimple for the full certificate price.
67
- #
68
- # For wildcard certificates an asterisk must appear in the name.
69
- #
70
- # Example: DNSimple::Certificate.purchase(domain, '*', contact)
71
- def self.purchase(domain, name, contact, options={})
72
- certificate_hash = {
73
- :name => name,
74
- :contact_id => contact.id
75
- }
76
-
77
- options.merge!({:body => {:certificate => certificate_hash}})
78
-
79
- response = DNSimple::Client.post("/v1/domains/#{domain.name}/certificates", options)
80
-
81
- case response.code
82
- when 201
83
- new({ :domain => domain }.merge(response["certificate"]))
84
- when 406
85
- raise RecordExists, "Certificate for #{domain.name} already exists"
86
- else
87
- raise RequestError.new("Error purchasing certificate", response)
88
- end
89
- end
90
-
91
- # Get an array of all certificates for the given domain.
92
- def self.all(domain, options={})
93
- response = DNSimple::Client.get("/v1/domains/#{domain.name}/certificates", options)
94
-
95
- case response.code
96
- when 200
97
- response.map { |r| new({:domain => domain}.merge(r["certificate"])) }
98
- else
99
- raise RequestError.new("Error listing certificates", response)
100
- end
101
- end
102
-
103
- # Find a specific certificate for the given domain.
104
- def self.find(domain, id, options = {})
105
- response = DNSimple::Client.get("/v1/domains/#{domain.name}/certificates/#{id}", options)
106
-
107
- case response.code
108
- when 200
109
- new({:domain => domain}.merge(response["certificate"]))
110
- when 404
111
- raise RecordNotFound, "Could not find certificate #{id} for domain #{domain.name}"
112
- else
113
- raise RequestError.new("Error finding certificate", response)
114
- end
115
- end
116
-
117
-
118
- # Get the fully-qualified domain name for the certificate. This is the
119
- # domain.name joined with the certificate name, separated by a period.
120
- def fqdn
121
- [name, domain.name].delete_if { |p| p !~ DNSimple::BLANK_REGEX }.join(".")
122
- end
123
-
124
- def submit(approver_email, options={})
125
- raise DNSimple::Error, "Approver email is required" unless approver_email
126
-
127
- options.merge!(:body => {:certificate => {:approver_email => approver_email}})
128
-
129
- response = DNSimple::Client.put("/v1/domains/#{domain.name}/certificates/#{id}/submit", options)
130
-
131
- case response.code
132
- when 200
133
- Certificate.new({ :domain => domain }.merge(response["certificate"]))
134
- else
135
- raise RequestError.new("Error submitting certificate", response)
136
- end
137
- end
138
-
139
- end
140
- end
@@ -1,121 +0,0 @@
1
- module DNSimple
2
-
3
- class CommandNotFound < RuntimeError
4
- end
5
-
6
- class CLI
7
-
8
- def execute(command_name, args, options={})
9
- DNSimple::Client.load_credentials_if_necessary
10
- command = commands[command_name]
11
- if command
12
- begin
13
- command.new.execute(args, options)
14
- rescue DNSimple::Error => e
15
- puts "An error occurred: #{e.message}"
16
- rescue RuntimeError => e
17
- puts "An error occurred: #{e.message}"
18
- end
19
- else
20
- raise CommandNotFound, "Unknown command: #{command_name}"
21
- end
22
- end
23
-
24
- def commands
25
- {
26
- 'info' => DNSimple::Commands::Me,
27
-
28
- 'list' => DNSimple::Commands::DomainList,
29
- 'describe' => DNSimple::Commands::DomainDescribe,
30
- 'check' => DNSimple::Commands::DomainCheck,
31
- 'create' => DNSimple::Commands::DomainCreate,
32
- 'register' => DNSimple::Commands::DomainRegister,
33
- 'transfer' => DNSimple::Commands::DomainTransfer,
34
- 'delete' => DNSimple::Commands::DomainDelete,
35
- 'clear' => DNSimple::Commands::DomainClear,
36
- 'apply' => DNSimple::Commands::DomainApplyTemplate,
37
-
38
- 'record:describe' => DNSimple::Commands::RecordDescribe,
39
- 'record:create' => DNSimple::Commands::RecordCreate,
40
- 'record:list' => DNSimple::Commands::RecordList,
41
- 'record:update' => DNSimple::Commands::RecordUpdate,
42
- 'record:delete' => DNSimple::Commands::RecordDelete,
43
-
44
- 'template:create' => DNSimple::Commands::TemplateCreate,
45
- 'template:list' => DNSimple::Commands::TemplateList,
46
- 'template:delete' => DNSimple::Commands::TemplateDelete,
47
-
48
- 'template:list_records' => DNSimple::Commands::TemplateRecordList,
49
- 'template:add_record' => DNSimple::Commands::TemplateRecordCreate,
50
- 'template:delete_record' => DNSimple::Commands::TemplateRecordDelete,
51
-
52
- 'contact:create' => DNSimple::Commands::ContactCreate,
53
- 'contact:list' => DNSimple::Commands::ContactList,
54
- 'contact:describe' => DNSimple::Commands::ContactDescribe,
55
- 'contact:update' => DNSimple::Commands::ContactUpdate,
56
- 'contact:delete' => DNSimple::Commands::ContactDelete,
57
-
58
- 'extended-attributes:list' => DNSimple::Commands::ExtendedAttributeList,
59
-
60
- 'service:list' => DNSimple::Commands::ServiceList,
61
- 'service:describe' => DNSimple::Commands::ServiceDescribe,
62
-
63
- 'service:applied' => DNSimple::Commands::ServiceListApplied,
64
- 'service:available' => DNSimple::Commands::ServiceListAvailable,
65
- 'service:add' => DNSimple::Commands::ServiceAdd,
66
- 'service:remove' => DNSimple::Commands::ServiceRemove,
67
-
68
- 'certificate:list' => DNSimple::Commands::CertificateList,
69
- 'certificate:describe' => DNSimple::Commands::CertificateDescribe,
70
- 'certificate:purchase' => DNSimple::Commands::CertificatePurchase,
71
- 'certificate:submit' => DNSimple::Commands::CertificateSubmit,
72
- }
73
- end
74
- end
75
- end
76
-
77
- require 'dnsimple/commands/me'
78
-
79
- require 'dnsimple/commands/domain_list'
80
- require 'dnsimple/commands/domain_describe'
81
- require 'dnsimple/commands/domain_check'
82
- require 'dnsimple/commands/domain_create'
83
- require 'dnsimple/commands/domain_register'
84
- require 'dnsimple/commands/domain_transfer'
85
- require 'dnsimple/commands/domain_delete'
86
- require 'dnsimple/commands/domain_clear'
87
- require 'dnsimple/commands/domain_apply_template'
88
-
89
- require 'dnsimple/commands/record_list'
90
- require 'dnsimple/commands/record_describe'
91
- require 'dnsimple/commands/record_create'
92
- require 'dnsimple/commands/record_update'
93
- require 'dnsimple/commands/record_delete'
94
-
95
- require 'dnsimple/commands/template_list'
96
- require 'dnsimple/commands/template_create'
97
- require 'dnsimple/commands/template_delete'
98
- require 'dnsimple/commands/template_record_list'
99
- require 'dnsimple/commands/template_record_create'
100
- require 'dnsimple/commands/template_record_delete'
101
-
102
- require 'dnsimple/commands/contact_list'
103
- require 'dnsimple/commands/contact_describe'
104
- require 'dnsimple/commands/contact_create'
105
- require 'dnsimple/commands/contact_update'
106
- require 'dnsimple/commands/contact_delete'
107
-
108
- require 'dnsimple/commands/extended_attribute_list'
109
-
110
- require 'dnsimple/commands/service_list'
111
- require 'dnsimple/commands/service_describe'
112
-
113
- require 'dnsimple/commands/service_list_available'
114
- require 'dnsimple/commands/service_list_applied'
115
- require 'dnsimple/commands/service_add'
116
- require 'dnsimple/commands/service_remove'
117
-
118
- require 'dnsimple/commands/certificate_list'
119
- require 'dnsimple/commands/certificate_describe'
120
- require 'dnsimple/commands/certificate_purchase'
121
- require 'dnsimple/commands/certificate_submit'
@@ -1,128 +0,0 @@
1
- require 'dnsimple/version'
2
- require 'yaml'
3
-
4
- module DNSimple
5
- class Client
6
-
7
- DEFAULT_BASE_URI = "https://api.dnsimple.com/"
8
- HEADER_2FA_STRICT = "X-DNSimple-2FA-Strict"
9
- HEADER_API_TOKEN = "X-DNSimple-Token"
10
- HEADER_DOMAIN_API_TOKEN = "X-DNSimple-Domain-Token"
11
- HEADER_OTP_TOKEN = "X-DNSimple-OTP"
12
- HEADER_EXCHANGE_TOKEN = "X-DNSimple-OTP-Token"
13
-
14
- class << self
15
- # @return [Boolean] if the debug mode is enabled.
16
- # Defaults to false.
17
- attr_accessor :debug
18
-
19
- attr_accessor :username, :password, :exchange_token, :api_token, :domain_api_token
20
- end
21
-
22
- # Gets the qualified API base uri.
23
- #
24
- # @return [String] The qualified API base uri.
25
- def self.base_uri
26
- @base_uri ||= DEFAULT_BASE_URI.chomp("/")
27
- end
28
-
29
- # Sets the qualified API base uri.
30
- #
31
- # @param [String] value The qualified API base uri.
32
- def self.base_uri=(value)
33
- @base_uri = value.to_s.chomp("/")
34
- end
35
-
36
- def self.http_proxy
37
- @http_proxy
38
- end
39
-
40
- def self.load_credentials_if_necessary
41
- load_credentials unless credentials_loaded?
42
- end
43
-
44
- def self.config_path
45
- ENV['DNSIMPLE_CONFIG'] || '~/.dnsimple'
46
- end
47
-
48
- def self.load_credentials(path = config_path)
49
- begin
50
- credentials = YAML.load_file(File.expand_path(path))
51
- self.username = credentials['username']
52
- self.password = credentials['password']
53
- self.exchange_token = credentials['exchange_token']
54
- self.api_token = credentials['api_token']
55
- self.domain_api_token = credentials['domain_api_token']
56
- self.base_uri = credentials['site'] if credentials['site']
57
- self.base_uri = credentials['base_uri'] if credentials['base_uri']
58
- @http_proxy = { :addr => credentials['proxy_addr'], :port => credentials['proxy_port'] } if credentials['proxy_addr'] || credentials['proxy_port']
59
- @credentials_loaded = true
60
- puts "Credentials loaded from #{path}"
61
- rescue => error
62
- puts "Error loading your credentials: #{error.message}"
63
- exit 1
64
- end
65
- end
66
-
67
- def self.credentials_loaded?
68
- (@credentials_loaded ||= false) or domain_api_token or (username and (password or api_token))
69
- end
70
-
71
- def self.base_options
72
- options = {
73
- :format => :json,
74
- :headers => { 'Accept' => 'application/json', 'User-Agent' => "dnsimple-ruby/#{DNSimple::VERSION}" },
75
- }
76
-
77
- if http_proxy
78
- options.merge!(
79
- :http_proxyaddr => http_proxy[:addr],
80
- :http_proxyport => http_proxy[:port]
81
- )
82
- end
83
-
84
- if exchange_token
85
- options[:basic_auth] = { :username => exchange_token, :password => "x-2fa-basic" }
86
- elsif password
87
- options[:basic_auth] = { :username => username, :password => password }
88
- elsif domain_api_token
89
- options[:headers][HEADER_DOMAIN_API_TOKEN] = domain_api_token
90
- elsif api_token
91
- options[:headers][HEADER_API_TOKEN] = "#{username}:#{api_token}"
92
- else
93
- raise Error, 'A password or API token is required for all API requests.'
94
- end
95
-
96
- options
97
- end
98
-
99
- def self.get(path, options = {})
100
- request :get, path, options
101
- end
102
-
103
- def self.post(path, options = {})
104
- request :post, path, options
105
- end
106
-
107
- def self.put(path, options = {})
108
- request :put, path, options
109
- end
110
-
111
- def self.delete(path, options = {})
112
- request :delete, path, options
113
- end
114
-
115
- def self.request(method, path, options)
116
- response = HTTParty.send(method, "#{base_uri}#{path}", base_options.merge(options))
117
-
118
- if response.code == 401 && response.headers[HEADER_OTP_TOKEN] == "required"
119
- raise TwoFactorAuthenticationRequired, response["message"]
120
- elsif response.code == 401
121
- raise AuthenticationFailed, response["message"]
122
- end
123
-
124
- response
125
- end
126
-
127
- end
128
- end