esgob 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/njh/ruby-esgob.svg)](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:
|