esgob 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.md +22 -0
- data/README.md +100 -0
- data/Rakefile +18 -0
- data/esgob.gemspec +39 -0
- data/lib/esgob.rb +4 -0
- data/lib/esgob/client.rb +133 -0
- data/lib/esgob/version.rb +3 -0
- data/test/esgob_client_test.rb +228 -0
- data/test/esgob_version_test.rb +14 -0
- data/test/fixtures/accounts_get.json +7 -0
- data/test/fixtures/domains_list.json +12 -0
- data/test/fixtures/domains_slaves_add.json +3 -0
- data/test/fixtures/domains_slaves_axfrout_add.json +3 -0
- data/test/fixtures/domains_slaves_axfrout_delete.json +3 -0
- data/test/fixtures/domains_slaves_delete.json +3 -0
- data/test/fixtures/domains_slaves_forcetransfer.json +3 -0
- data/test/fixtures/domains_slaves_list.json +14 -0
- data/test/fixtures/domains_slaves_updatemasterip.json +3 -0
- data/test/fixtures/domains_tools_soacheck.json +185 -0
- data/test/test_helper.rb +28 -0
- metadata +165 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c771929d5f34833c2a7b647e05c11686e0ecd9db
|
4
|
+
data.tar.gz: c0c648e1341855edd956c83d29b373e107e8db8e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6650464bd90d58172139131df815d59f7b8601c9f75cd5a2b214ed9bded0b393e81ff4252e782f03ee10cfce2679a927bcfeba9dd655acb81740269c976a556b
|
7
|
+
data.tar.gz: 35b9700a1ec0f86df74720e404ea5ebb5ee08e33ecb0a7885d1f8cb5874d369d68a7af7029dd3e8d4e263259af0b2941c900a862be3e4f2edb3e62b8f484c07e
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
=====================
|
3
|
+
|
4
|
+
Copyright (c) Nicholas J Humfrey
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
8
|
+
in the Software without restriction, including without limitation the rights
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
11
|
+
furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included in
|
14
|
+
all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
[](https://travis-ci.org/njh/ruby-esgob)
|
2
|
+
|
3
|
+
Esgob Ruby Client
|
4
|
+
=================
|
5
|
+
|
6
|
+
[Esgob Ltd] operate an [international network] of anycast servers.
|
7
|
+
Their [Secondary DNS] service is available for free.
|
8
|
+
This Ruby Gem provides convenient access to the [Esgob API].
|
9
|
+
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
gem 'esgob'
|
17
|
+
```
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
|
21
|
+
$ bundle
|
22
|
+
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
$ gem install esgob
|
26
|
+
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
First create a new client instance, by passing in your account name and API key:
|
30
|
+
|
31
|
+
esgob = Esgob::Client.new('account', 'key')
|
32
|
+
|
33
|
+
Alternatively, as it is often desirable to keep secrets outside of the source code, it is also possible to pass in the account name and API key using environment variables set in the shell:
|
34
|
+
|
35
|
+
export ESGOB_ACCOUNT=accountname
|
36
|
+
export ESGOB_API_KEY=4472ed80e0f511e4aee13c0754043581
|
37
|
+
|
38
|
+
The client instance can then be initialised without passing any arguments:
|
39
|
+
|
40
|
+
esgob = Esgob::Client.new
|
41
|
+
|
42
|
+
|
43
|
+
Add a new slave domain, passing in the domain and the master DNS server to fetch the zone from:
|
44
|
+
|
45
|
+
esgob.domains_slaves_add('example.org', '192.168.0.1')
|
46
|
+
|
47
|
+
Get a list of the registered slave domains:
|
48
|
+
|
49
|
+
domains = esgob.domains_slaves_list
|
50
|
+
|
51
|
+
Here is an example of what can be done in an IRB session:
|
52
|
+
|
53
|
+
$ irb -resgob
|
54
|
+
irb(main):001:0> esgob = Esgob::Client.new
|
55
|
+
=> #<Esgob::Client:0x007fd2e3b13420>
|
56
|
+
irb(main):002:0> esgob.domains_slaves_list
|
57
|
+
=> {"example.com"=>"192.168.0.1", "example.uk"=>"192.168.0.1"}
|
58
|
+
irb(main):003:0> esgob.domains_slaves_list.keys
|
59
|
+
=> ["example.com", "example.uk"]
|
60
|
+
irb(main):004:0>
|
61
|
+
|
62
|
+
See the [API documentation] for full details.
|
63
|
+
|
64
|
+
|
65
|
+
## More information
|
66
|
+
|
67
|
+
* https://noc.esgob.com/secondary_dns
|
68
|
+
* https://noc.esgob.com/docs/api
|
69
|
+
|
70
|
+
## Contributing
|
71
|
+
|
72
|
+
1. Fork it ( https://github.com/njh/esgob/fork )
|
73
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
74
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
75
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
76
|
+
5. Create a new Pull Request
|
77
|
+
|
78
|
+
|
79
|
+
## License
|
80
|
+
|
81
|
+
The esgob ruby gem is licensed under the terms of the MIT license.
|
82
|
+
See the file LICENSE for details.
|
83
|
+
|
84
|
+
|
85
|
+
## Contact
|
86
|
+
|
87
|
+
* Author: Nicholas J Humfrey
|
88
|
+
* Email: njh@aelius.com
|
89
|
+
* Twitter: [@njh]
|
90
|
+
* Home Page: http://www.aelius.com/njh/
|
91
|
+
|
92
|
+
|
93
|
+
[@njh]: http://twitter.com/njh
|
94
|
+
|
95
|
+
[Esgob Ltd]: https://www.esgob.com/
|
96
|
+
[Esgob API]: https://noc.esgob.com/docs/api
|
97
|
+
[international network]: https://noc.esgob.com/status/anycast_instances
|
98
|
+
[Secondary DNS]: https://noc.esgob.com/secondary_dns
|
99
|
+
|
100
|
+
[API documentation]: http://www.rubydoc.info/gems/esgob
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.push File.expand_path("./lib", __FILE__)
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'yard'
|
7
|
+
require 'rake/testtask'
|
8
|
+
require "bundler/gem_tasks"
|
9
|
+
|
10
|
+
Rake::TestTask.new do |t|
|
11
|
+
t.pattern = "test/*_test.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
namespace :doc do
|
15
|
+
YARD::Rake::YardocTask.new
|
16
|
+
end
|
17
|
+
|
18
|
+
task :default => :test
|
data/esgob.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'esgob/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "esgob"
|
8
|
+
spec.version = Esgob::VERSION
|
9
|
+
spec.authors = ["Nicholas Humfrey"]
|
10
|
+
spec.email = ["njh@aelius.com"]
|
11
|
+
spec.summary = %q{Client library for talking to the Esgob anycast DNS API.}
|
12
|
+
#spec.description = %q{TODO: Write a longer description. Optional.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
|
22
|
+
spec.add_dependency "json", "~> 1.8"
|
23
|
+
|
24
|
+
if Gem.ruby_version > Gem::Version.new('1.9')
|
25
|
+
spec.add_development_dependency 'bundler', '>= 1.5.0'
|
26
|
+
spec.add_development_dependency 'rake', '>= 0.10.0'
|
27
|
+
spec.add_development_dependency 'yard', '>= 0.8.0'
|
28
|
+
spec.add_development_dependency 'fakeweb', '~> 1.3.0'
|
29
|
+
spec.add_development_dependency 'simplecov'
|
30
|
+
elsif Gem.ruby_version > Gem::Version.new('1.8')
|
31
|
+
spec.add_development_dependency 'bundler', '>= 1.1.0'
|
32
|
+
spec.add_development_dependency 'rake', '~> 0.9.0'
|
33
|
+
spec.add_development_dependency 'yard', '~> 0.8.0'
|
34
|
+
spec.add_development_dependency 'minitest', '~> 5.5.0'
|
35
|
+
spec.add_development_dependency 'fakeweb', '~> 1.3.0'
|
36
|
+
else
|
37
|
+
raise "#{Gem.ruby_version} is an unsupported version of ruby"
|
38
|
+
end
|
39
|
+
end
|
data/lib/esgob.rb
ADDED
data/lib/esgob/client.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
require "net/https"
|
2
|
+
require "uri"
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
class Esgob::Client
|
6
|
+
attr_accessor :endpoint
|
7
|
+
attr_accessor :account
|
8
|
+
attr_accessor :api_key
|
9
|
+
|
10
|
+
DEFAULT_API_ENDPOINT = "https://api.esgob.com/1.0/".freeze
|
11
|
+
|
12
|
+
def initialize(*args)
|
13
|
+
if args.first.kind_of?(Hash)
|
14
|
+
args.first.each_pair { |k,v| send("#{k}=", v) }
|
15
|
+
else
|
16
|
+
self.account = args[0]
|
17
|
+
self.api_key = args[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
self.endpoint ||= DEFAULT_API_ENDPOINT
|
21
|
+
self.account ||= ENV['ESGOB_ACCOUNT']
|
22
|
+
self.api_key ||= ENV['ESGOB_API_KEY']
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(function_name, arguments={})
|
26
|
+
uri = URI(endpoint + function_name)
|
27
|
+
uri.query = build_query(default_arguments.merge(arguments))
|
28
|
+
|
29
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
|
30
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
31
|
+
req['Accept'] = 'application/json'
|
32
|
+
http.request(req)
|
33
|
+
end
|
34
|
+
|
35
|
+
if res.code =~ /^2/
|
36
|
+
if res.content_type == 'application/json'
|
37
|
+
symbolize_keys! JSON.parse(res.body)
|
38
|
+
else
|
39
|
+
raise "HTTP response from ESGOB is not of type JSON"
|
40
|
+
end
|
41
|
+
else
|
42
|
+
# The badly named method throws an Net::HTTP exception
|
43
|
+
res.value
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# Return account status; credit balance, etc
|
49
|
+
def accounts_get
|
50
|
+
call('accounts.get')
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns all hosted domains
|
54
|
+
def domains_list
|
55
|
+
call('domains.list')[:domains]
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns all hosted slave domains as a hash
|
59
|
+
#
|
60
|
+
def domains_slaves_list
|
61
|
+
Hash[
|
62
|
+
call('domains.slaves.list')[:domains].map do |item|
|
63
|
+
[item[:domain], item[:masterip]]
|
64
|
+
end
|
65
|
+
]
|
66
|
+
end
|
67
|
+
|
68
|
+
# Adds a new slave domain
|
69
|
+
def domains_slaves_add(domain, masterip)
|
70
|
+
call('domains.slaves.add', :domain => domain, :masterip => masterip)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Deletes a slave domain
|
74
|
+
def domains_slaves_delete(domain)
|
75
|
+
call('domains.slaves.delete', :domain => domain)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Force AXFR / transfer from master of a slave domain
|
79
|
+
def domains_slaves_forcetransfer(domain)
|
80
|
+
call('domains.slaves.forcetransfer', :domain => domain)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Updates the master IP of a slave domain
|
84
|
+
def domains_slaves_updatemasterip(domain, masterip)
|
85
|
+
call('domains.slaves.updatemasterip', :domain => domain, :masterip => masterip)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Add a host allowed to AXFR out
|
89
|
+
def domains_slaves_axfrout_add(domain, axfrip)
|
90
|
+
call('domains.slaves.axfrout.add', :domain => domain, :axfrip => axfrip)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Account Delete a host allowed to AXFR out
|
94
|
+
def domains_slaves_axfrout_delete(domain, axfrip)
|
95
|
+
call('domains.slaves.axfrout.delete', :domain => domain, :axfrip => axfrip)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Retrieve the domain SOA serial number from the master and each anycast node
|
99
|
+
def domains_tools_soacheck(domain)
|
100
|
+
call('domains.tools.soacheck', :domain => domain)
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
protected
|
105
|
+
|
106
|
+
def symbolize_keys!(hash)
|
107
|
+
hash.keys.each do |key|
|
108
|
+
ks = key.to_sym
|
109
|
+
hash[ks] = hash.delete(key)
|
110
|
+
case hash[ks]
|
111
|
+
when Hash
|
112
|
+
symbolize_keys!(hash[ks])
|
113
|
+
when Array
|
114
|
+
hash[ks].each {|item| symbolize_keys!(item) if item.kind_of?(Hash)}
|
115
|
+
end
|
116
|
+
end
|
117
|
+
return hash
|
118
|
+
end
|
119
|
+
|
120
|
+
def default_arguments
|
121
|
+
{
|
122
|
+
:account => account,
|
123
|
+
:key => api_key,
|
124
|
+
:f => 'json'
|
125
|
+
}
|
126
|
+
end
|
127
|
+
|
128
|
+
def build_query(hash)
|
129
|
+
hash.keys.sort{|a,b| a.to_s <=> b.to_s}.map { |key|
|
130
|
+
URI::escape(key.to_s) + '=' + URI::escape(hash[key].to_s)
|
131
|
+
}.join('&')
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'esgob'
|
5
|
+
|
6
|
+
class TestClient < MiniTest::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
# Run before each test
|
9
|
+
FakeWeb.clean_registry
|
10
|
+
@client = Esgob::Client.new('acct', 'xxxx')
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
# Reset environment variables after each test
|
15
|
+
ENV.delete('ESGOB_ACCOUNT')
|
16
|
+
ENV.delete('ESGOB_API_KEY')
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_new_client_using_environment
|
20
|
+
ENV['ESGOB_ACCOUNT'] = 'envacct'
|
21
|
+
ENV['ESGOB_API_KEY'] = 'envkey'
|
22
|
+
|
23
|
+
client = Esgob::Client.new
|
24
|
+
assert_equal 'envacct', client.account
|
25
|
+
assert_equal 'envkey', client.api_key
|
26
|
+
assert_equal 'https://api.esgob.com/1.0/', client.endpoint
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_new_client_using_arguments
|
30
|
+
client = Esgob::Client.new('foobar', 'mykey')
|
31
|
+
assert_equal 'foobar', client.account
|
32
|
+
assert_equal 'mykey', client.api_key
|
33
|
+
assert_equal 'https://api.esgob.com/1.0/', client.endpoint
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_new_client_using_hash
|
37
|
+
client = Esgob::Client.new(
|
38
|
+
:account => 'hashacct',
|
39
|
+
:api_key => 'hashkey',
|
40
|
+
:endpoint => 'http://api.example.com/'
|
41
|
+
)
|
42
|
+
assert_equal 'hashacct', client.account
|
43
|
+
assert_equal 'hashkey', client.api_key
|
44
|
+
assert_equal 'http://api.example.com/', client.endpoint
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_call_with_no_parameters
|
48
|
+
register_fixture('accounts.get')
|
49
|
+
response = @client.call('accounts.get')
|
50
|
+
|
51
|
+
assert_equal(
|
52
|
+
'/1.0/accounts.get?account=acct&f=json&key=xxxx',
|
53
|
+
FakeWeb.last_request.path
|
54
|
+
)
|
55
|
+
assert_equal(
|
56
|
+
{:credits=>48, :users=>[], :added=>1422792434, :id=>"xyz", :name=>"Person Name"},
|
57
|
+
response
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_call_with_extra_params
|
62
|
+
register_fixture('accounts.get')
|
63
|
+
response = @client.call('accounts.get', :foo => :bar)
|
64
|
+
|
65
|
+
assert_equal(
|
66
|
+
'/1.0/accounts.get?account=acct&f=json&foo=bar&key=xxxx',
|
67
|
+
FakeWeb.last_request.path
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_call_with_overriding_params
|
72
|
+
register_fixture('accounts.get')
|
73
|
+
response = @client.call('accounts.get', :account => 'acct2')
|
74
|
+
|
75
|
+
assert_equal(
|
76
|
+
'/1.0/accounts.get?account=acct2&f=json&key=xxxx',
|
77
|
+
FakeWeb.last_request.path
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_call_with_404_error
|
82
|
+
assert_raises(Net::HTTPServerException) do
|
83
|
+
FakeWeb.register_uri(
|
84
|
+
:get, %r[^https?://api\.esgob\.com(:443)?/],
|
85
|
+
:status => ["404", "Not Found"],
|
86
|
+
:content_type => "application/json",
|
87
|
+
:body => '{}'
|
88
|
+
)
|
89
|
+
response = @client.call('accounts.get')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_call_with_non_json_reponse
|
94
|
+
assert_raises(RuntimeError) do
|
95
|
+
FakeWeb.register_uri(
|
96
|
+
:get, %r[^https?://api\.esgob\.com(:443)?/],
|
97
|
+
:status => ["200", "OK"],
|
98
|
+
:content_type => "text/plain",
|
99
|
+
:body => 'This is plain text'
|
100
|
+
)
|
101
|
+
response = @client.call('accounts.get')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_accounts_get
|
106
|
+
register_fixture('accounts.get')
|
107
|
+
response = @client.accounts_get
|
108
|
+
|
109
|
+
assert_equal(
|
110
|
+
'/1.0/accounts.get?account=acct&f=json&key=xxxx',
|
111
|
+
FakeWeb.last_request.path
|
112
|
+
)
|
113
|
+
assert_equal(
|
114
|
+
{:credits=>48, :users=>[], :added=>1422792434, :id=>"xyz", :name=>"Person Name"},
|
115
|
+
response
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_domains_list
|
120
|
+
register_fixture('domains.list')
|
121
|
+
response = @client.domains_list
|
122
|
+
|
123
|
+
assert_equal(
|
124
|
+
'/1.0/domains.list?account=acct&f=json&key=xxxx',
|
125
|
+
FakeWeb.last_request.path
|
126
|
+
)
|
127
|
+
assert_equal(
|
128
|
+
[
|
129
|
+
{:domain => "example.com", :type => "slave"},
|
130
|
+
{:domain => "example.uk", :type => "slave"}
|
131
|
+
],
|
132
|
+
response
|
133
|
+
)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_domains_slaves_list
|
137
|
+
register_fixture('domains.slaves.list')
|
138
|
+
response = @client.domains_slaves_list
|
139
|
+
|
140
|
+
assert_equal(
|
141
|
+
'/1.0/domains.slaves.list?account=acct&f=json&key=xxxx',
|
142
|
+
FakeWeb.last_request.path
|
143
|
+
)
|
144
|
+
assert_equal(
|
145
|
+
{"example.com"=>"195.177.253.166", "example.uk"=>"195.177.253.166"},
|
146
|
+
response
|
147
|
+
)
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_domains_slaves_add
|
151
|
+
register_fixture('domains.slaves.add')
|
152
|
+
response = @client.domains_slaves_add('example.org', '195.177.253.166')
|
153
|
+
|
154
|
+
assert_equal(
|
155
|
+
'/1.0/domains.slaves.add?account=acct&domain=example.org&f=json&key=xxxx&masterip=195.177.253.166',
|
156
|
+
FakeWeb.last_request.path
|
157
|
+
)
|
158
|
+
assert_equal({:action=>"domain added"}, response)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_domains_slaves_delete
|
162
|
+
register_fixture('domains.slaves.delete')
|
163
|
+
response = @client.domains_slaves_delete('example.org')
|
164
|
+
|
165
|
+
assert_equal(
|
166
|
+
'/1.0/domains.slaves.delete?account=acct&domain=example.org&f=json&key=xxxx',
|
167
|
+
FakeWeb.last_request.path
|
168
|
+
)
|
169
|
+
assert_equal({:action=>"domain deleted"}, response)
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_domains_slaves_forcetransfer
|
173
|
+
register_fixture('domains.slaves.forcetransfer')
|
174
|
+
response = @client.domains_slaves_forcetransfer('example.org')
|
175
|
+
|
176
|
+
assert_equal(
|
177
|
+
'/1.0/domains.slaves.forcetransfer?account=acct&domain=example.org&f=json&key=xxxx',
|
178
|
+
FakeWeb.last_request.path
|
179
|
+
)
|
180
|
+
assert_equal({:action=>"Domain AXFR requested from master"}, response)
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_domains_slaves_updatemasterip
|
184
|
+
register_fixture('domains.slaves.updatemasterip')
|
185
|
+
response = @client.domains_slaves_updatemasterip('example.org', '195.177.253.167')
|
186
|
+
|
187
|
+
assert_equal(
|
188
|
+
'/1.0/domains.slaves.updatemasterip?account=acct&domain=example.org&f=json&key=xxxx&masterip=195.177.253.167',
|
189
|
+
FakeWeb.last_request.path
|
190
|
+
)
|
191
|
+
assert_equal({:action=>"domain master IP updated"}, response)
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_domains_slaves_axfrout_add
|
195
|
+
register_fixture('domains.slaves.axfrout.add')
|
196
|
+
response = @client.domains_slaves_axfrout_add('example.org', '195.177.253.1')
|
197
|
+
|
198
|
+
assert_equal(
|
199
|
+
'/1.0/domains.slaves.axfrout.add?account=acct&axfrip=195.177.253.1&domain=example.org&f=json&key=xxxx',
|
200
|
+
FakeWeb.last_request.path
|
201
|
+
)
|
202
|
+
assert_equal({:action=>"domain AXFR out IPs updated"}, response)
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_domains_slaves_axfrout_delete
|
206
|
+
register_fixture('domains.slaves.axfrout.delete')
|
207
|
+
response = @client.domains_slaves_axfrout_delete('example.org', '195.177.253.1')
|
208
|
+
|
209
|
+
assert_equal(
|
210
|
+
'/1.0/domains.slaves.axfrout.delete?account=acct&axfrip=195.177.253.1&domain=example.org&f=json&key=xxxx',
|
211
|
+
FakeWeb.last_request.path
|
212
|
+
)
|
213
|
+
assert_equal({:action=>"domain AXFR out IPs updated"}, response)
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_domains_tools_soacheck
|
217
|
+
register_fixture('domains.tools.soacheck')
|
218
|
+
response = @client.domains_tools_soacheck('example.org')
|
219
|
+
|
220
|
+
assert_equal(
|
221
|
+
'/1.0/domains.tools.soacheck?account=acct&domain=example.org&f=json&key=xxxx',
|
222
|
+
FakeWeb.last_request.path
|
223
|
+
)
|
224
|
+
assert_equal('example.org', response[:domain])
|
225
|
+
refute_empty(response[:responses])
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'esgob'
|
5
|
+
|
6
|
+
class TestVersion < MiniTest::Unit::TestCase
|
7
|
+
|
8
|
+
def test_version_number_looks_sensible
|
9
|
+
assert_equal 'constant', defined?(Esgob::VERSION)
|
10
|
+
assert_kind_of String, Esgob::VERSION
|
11
|
+
assert_match /^\d{1,2}\.\d{1,2}\.\d{1,2}$/, Esgob::VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
{
|
2
|
+
"domain": "example.org",
|
3
|
+
"responses": {
|
4
|
+
"masters": [
|
5
|
+
{
|
6
|
+
"soa": null,
|
7
|
+
"ip": "195.177.253.167",
|
8
|
+
"response": "fail"
|
9
|
+
}
|
10
|
+
],
|
11
|
+
"anycastnodes": [
|
12
|
+
{
|
13
|
+
"soa": null,
|
14
|
+
"country": "dk",
|
15
|
+
"ref": "b767bbde",
|
16
|
+
"location": "Denmark, Copenhagen",
|
17
|
+
"response": "fail"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"soa": null,
|
21
|
+
"country": "ie",
|
22
|
+
"ref": "a5829255",
|
23
|
+
"location": "Dublin, Ireland",
|
24
|
+
"response": "fail"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"soa": null,
|
28
|
+
"country": "gb",
|
29
|
+
"ref": "3b3ba18c",
|
30
|
+
"location": "England, Fareham",
|
31
|
+
"response": "fail"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"soa": null,
|
35
|
+
"country": "gb",
|
36
|
+
"ref": "pw77xk42",
|
37
|
+
"location": "England, Hemel Hempstead",
|
38
|
+
"response": "fail"
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"soa": null,
|
42
|
+
"country": "gb",
|
43
|
+
"ref": "b0r2k2c4",
|
44
|
+
"location": "England, London, A",
|
45
|
+
"response": "fail"
|
46
|
+
},
|
47
|
+
{
|
48
|
+
"soa": null,
|
49
|
+
"country": "gb",
|
50
|
+
"ref": "ql7f823b",
|
51
|
+
"location": "England, London, B",
|
52
|
+
"response": "fail"
|
53
|
+
},
|
54
|
+
{
|
55
|
+
"soa": null,
|
56
|
+
"country": "gb",
|
57
|
+
"ref": "a645b1b8",
|
58
|
+
"location": "England, Studley",
|
59
|
+
"response": "fail"
|
60
|
+
},
|
61
|
+
{
|
62
|
+
"soa": null,
|
63
|
+
"country": "de",
|
64
|
+
"ref": "zeij3q25",
|
65
|
+
"location": "Germany, Bremen",
|
66
|
+
"response": "fail"
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"soa": null,
|
70
|
+
"country": "gb",
|
71
|
+
"ref": "a9a9aa41",
|
72
|
+
"location": "London, England, D",
|
73
|
+
"response": "fail"
|
74
|
+
},
|
75
|
+
{
|
76
|
+
"soa": null,
|
77
|
+
"country": "us",
|
78
|
+
"ref": "eeedd3pp",
|
79
|
+
"location": "Los Angeles, US",
|
80
|
+
"response": "fail"
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"soa": null,
|
84
|
+
"country": "nl",
|
85
|
+
"ref": "5cf4cc31",
|
86
|
+
"location": "Netherlands, Amsterdam",
|
87
|
+
"response": "fail"
|
88
|
+
},
|
89
|
+
{
|
90
|
+
"soa": null,
|
91
|
+
"country": "gb",
|
92
|
+
"ref": "4f31ad80",
|
93
|
+
"location": "Northern Ireland, Belfast",
|
94
|
+
"response": "fail"
|
95
|
+
},
|
96
|
+
{
|
97
|
+
"soa": null,
|
98
|
+
"country": "is",
|
99
|
+
"ref": "2be59c70",
|
100
|
+
"location": "Reykjavik, Iceland",
|
101
|
+
"response": "fail"
|
102
|
+
},
|
103
|
+
{
|
104
|
+
"soa": null,
|
105
|
+
"country": "is",
|
106
|
+
"ref": "5a235000",
|
107
|
+
"location": "Reykjavik, Iceland (RIX)",
|
108
|
+
"response": "fail"
|
109
|
+
},
|
110
|
+
{
|
111
|
+
"soa": null,
|
112
|
+
"country": "gb",
|
113
|
+
"ref": "oeo8uewk",
|
114
|
+
"location": "Scotland, Edinburgh",
|
115
|
+
"response": "fail"
|
116
|
+
},
|
117
|
+
{
|
118
|
+
"soa": null,
|
119
|
+
"country": "sg",
|
120
|
+
"ref": "a4fd893c",
|
121
|
+
"location": "Singapore",
|
122
|
+
"response": "fail"
|
123
|
+
},
|
124
|
+
{
|
125
|
+
"soa": null,
|
126
|
+
"country": "au",
|
127
|
+
"ref": "1277c255",
|
128
|
+
"location": "Sydney, Australia",
|
129
|
+
"response": "fail"
|
130
|
+
},
|
131
|
+
{
|
132
|
+
"soa": null,
|
133
|
+
"country": "ru",
|
134
|
+
"ref": "a661cda4",
|
135
|
+
"location": "Ulyanovsk, Russia (ULN-IX)",
|
136
|
+
"response": "fail"
|
137
|
+
},
|
138
|
+
{
|
139
|
+
"soa": null,
|
140
|
+
"country": "us",
|
141
|
+
"ref": "h1m9maf8",
|
142
|
+
"location": "United States, Boston",
|
143
|
+
"response": "fail"
|
144
|
+
},
|
145
|
+
{
|
146
|
+
"soa": null,
|
147
|
+
"country": "us",
|
148
|
+
"ref": "fgej72a1",
|
149
|
+
"location": "United States, Detroit",
|
150
|
+
"response": "fail"
|
151
|
+
},
|
152
|
+
{
|
153
|
+
"soa": null,
|
154
|
+
"country": "at",
|
155
|
+
"ref": "dc6aaec4",
|
156
|
+
"location": "Vienna, Austria",
|
157
|
+
"response": "fail"
|
158
|
+
},
|
159
|
+
{
|
160
|
+
"soa": null,
|
161
|
+
"country": "pl",
|
162
|
+
"ref": "60c64eb3",
|
163
|
+
"location": "Warsaw, Poland",
|
164
|
+
"response": "fail"
|
165
|
+
}
|
166
|
+
],
|
167
|
+
"axfrnodes": [
|
168
|
+
{
|
169
|
+
"soa": null,
|
170
|
+
"ref": "1cd05e5d",
|
171
|
+
"response": "fail"
|
172
|
+
}
|
173
|
+
]
|
174
|
+
},
|
175
|
+
"cached": false,
|
176
|
+
"timestamp": 1428774478,
|
177
|
+
"analysis": {
|
178
|
+
"mastersok": true,
|
179
|
+
"consistent": true,
|
180
|
+
"earliest": null,
|
181
|
+
"nodesok": false,
|
182
|
+
"latest": null
|
183
|
+
},
|
184
|
+
"cachefor": 60
|
185
|
+
}
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__),'..','lib'))
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
Bundler.require(:default, :development)
|
6
|
+
require 'minitest/autorun'
|
7
|
+
|
8
|
+
unless RUBY_VERSION =~ /^1\.8/
|
9
|
+
SimpleCov.start
|
10
|
+
end
|
11
|
+
|
12
|
+
FakeWeb.allow_net_connect = false
|
13
|
+
|
14
|
+
|
15
|
+
def register_fixture(api_call, fixture_name=nil)
|
16
|
+
if fixture_name.nil?
|
17
|
+
fixture_name = api_call.gsub(/\W+/, '_')
|
18
|
+
end
|
19
|
+
|
20
|
+
fixture_file = File.join(File.dirname(__FILE__), 'fixtures', fixture_name + '.json')
|
21
|
+
|
22
|
+
FakeWeb.register_uri(
|
23
|
+
:get, %r[^https?://api\.esgob\.com(:443)?/1.0/#{api_call}],
|
24
|
+
:status => ["200", "OK"],
|
25
|
+
:content_type => "application/json",
|
26
|
+
:body => File.read(fixture_file)
|
27
|
+
)
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: esgob
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nicholas Humfrey
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.5.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.5.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.10.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.10.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.8.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.8.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: fakeweb
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.3.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
- njh@aelius.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".travis.yml"
|
106
|
+
- Gemfile
|
107
|
+
- LICENSE.md
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- esgob.gemspec
|
111
|
+
- lib/esgob.rb
|
112
|
+
- lib/esgob/client.rb
|
113
|
+
- lib/esgob/version.rb
|
114
|
+
- test/esgob_client_test.rb
|
115
|
+
- test/esgob_version_test.rb
|
116
|
+
- test/fixtures/accounts_get.json
|
117
|
+
- test/fixtures/domains_list.json
|
118
|
+
- test/fixtures/domains_slaves_add.json
|
119
|
+
- test/fixtures/domains_slaves_axfrout_add.json
|
120
|
+
- test/fixtures/domains_slaves_axfrout_delete.json
|
121
|
+
- test/fixtures/domains_slaves_delete.json
|
122
|
+
- test/fixtures/domains_slaves_forcetransfer.json
|
123
|
+
- test/fixtures/domains_slaves_list.json
|
124
|
+
- test/fixtures/domains_slaves_updatemasterip.json
|
125
|
+
- test/fixtures/domains_tools_soacheck.json
|
126
|
+
- test/test_helper.rb
|
127
|
+
homepage: ''
|
128
|
+
licenses:
|
129
|
+
- MIT
|
130
|
+
metadata: {}
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
requirements: []
|
146
|
+
rubyforge_project:
|
147
|
+
rubygems_version: 2.2.2
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: Client library for talking to the Esgob anycast DNS API.
|
151
|
+
test_files:
|
152
|
+
- test/esgob_client_test.rb
|
153
|
+
- test/esgob_version_test.rb
|
154
|
+
- test/fixtures/accounts_get.json
|
155
|
+
- test/fixtures/domains_list.json
|
156
|
+
- test/fixtures/domains_slaves_add.json
|
157
|
+
- test/fixtures/domains_slaves_axfrout_add.json
|
158
|
+
- test/fixtures/domains_slaves_axfrout_delete.json
|
159
|
+
- test/fixtures/domains_slaves_delete.json
|
160
|
+
- test/fixtures/domains_slaves_forcetransfer.json
|
161
|
+
- test/fixtures/domains_slaves_list.json
|
162
|
+
- test/fixtures/domains_slaves_updatemasterip.json
|
163
|
+
- test/fixtures/domains_tools_soacheck.json
|
164
|
+
- test/test_helper.rb
|
165
|
+
has_rdoc:
|