dynect 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/dynect.rb +149 -0
- data/spec/dynec_a_record_spec.rb +64 -0
- data/spec/dynec_cname_record_spec.rb +65 -0
- data/spec/dynec_soa_record_spec.rb +32 -0
- data/spec/dynect_zone_spec.rb +53 -0
- metadata +74 -0
data/lib/dynect.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'soap4r'
|
3
|
+
|
4
|
+
require 'soap/rpc/driver'
|
5
|
+
|
6
|
+
class Dynect
|
7
|
+
# Provide the customer, user, and password information to intiate the SOAP connection.
|
8
|
+
# If desired, an alternate driver can be supplied to enable mocking or the use of different protocols.
|
9
|
+
def initialize(customer, user, password, driver = nil)
|
10
|
+
@driver = driver || setup_driver
|
11
|
+
@creds = {"cust" => customer, "user" => user, "pass" => password }
|
12
|
+
|
13
|
+
add_methods
|
14
|
+
end
|
15
|
+
|
16
|
+
# Lists the zones associated with the accout. Specify a zone to get information on a specific one
|
17
|
+
def list_zones(zone = nil)
|
18
|
+
args = @creds
|
19
|
+
args["zone"] = zone if zone
|
20
|
+
|
21
|
+
response = @driver.ZoneGet args
|
22
|
+
check_for_errors("when listing zone(s)", response)
|
23
|
+
response.zones
|
24
|
+
end
|
25
|
+
|
26
|
+
# Create a new zone
|
27
|
+
def create_zone(zone, type, options ={})
|
28
|
+
args = @creds.merge("zone" => zone, "type" => type)
|
29
|
+
args.merge!(options)
|
30
|
+
|
31
|
+
response = @driver.ZoneAdd args
|
32
|
+
check_for_errors("when creating a zone", response)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Lists all the A records associated with the account.
|
36
|
+
#
|
37
|
+
# == Options
|
38
|
+
# * +node+ -- The fully qualified domain name of the node to retreive records from. Omit or enter an empty string to get the records of the root node
|
39
|
+
# * +record_id+ -- The ID of the record to retreive information of
|
40
|
+
#
|
41
|
+
# == Useage
|
42
|
+
#
|
43
|
+
# d = Dynect.new("customer", "username", "password")
|
44
|
+
# d.list_a_records("myzone.domain.com")
|
45
|
+
#
|
46
|
+
def list_a_records(zone, options ={})
|
47
|
+
args = @creds.merge("type" => "A", "zone" => zone)
|
48
|
+
args.merge!(options)
|
49
|
+
|
50
|
+
response = @driver.RecordGet args
|
51
|
+
check_for_errors("when listing records", response)
|
52
|
+
response.records
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_a_record(zone, address, options = {})
|
56
|
+
args = @creds.merge("type" => "A", "zone" => zone, "rdata" => {"address" => address})
|
57
|
+
args.merge!(options)
|
58
|
+
|
59
|
+
response = @driver.RecordAdd args
|
60
|
+
check_for_errors("when adding an A record", response)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Updates A records identified by the ID
|
64
|
+
def update_a_record(id, options = {})
|
65
|
+
args = @creds.merge("record_id" => id)
|
66
|
+
args.merge!(options)
|
67
|
+
|
68
|
+
response = @driver.RecordUpdate args
|
69
|
+
check_for_errors("when updating an A record", response)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Deletes an A record identified by the ID
|
73
|
+
def delete_a_record(id)
|
74
|
+
response = @driver.RecordDelete @creds.merge("record_id" => id)
|
75
|
+
check_for_errors("when removing an A record", response)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Lists the CNAME records associated with an account
|
79
|
+
def list_cname_records(zone, options ={})
|
80
|
+
args = @creds.merge("type" => "CNAME", "zone" => zone)
|
81
|
+
args.merge!(options)
|
82
|
+
|
83
|
+
response = @driver.RecordGet args
|
84
|
+
check_for_errors("when listing CNAME records", response)
|
85
|
+
response.records
|
86
|
+
end
|
87
|
+
|
88
|
+
# Adds a CNAME record for the specified zone
|
89
|
+
def add_cname_record(zone, hostname, options = {} )
|
90
|
+
args = @creds.merge("type" => "CNAME", "zone" => zone, "rdata" => {"cname" => hostname})
|
91
|
+
args.merge!(options)
|
92
|
+
|
93
|
+
response = @driver.RecordAdd args
|
94
|
+
check_for_errors("when adding a CNAME record", response)
|
95
|
+
end
|
96
|
+
|
97
|
+
def update_cname_record(id, options = {})
|
98
|
+
args = @creds.merge("id" => id)
|
99
|
+
args.merge!(options)
|
100
|
+
|
101
|
+
response = @driver.RecordUpdate args
|
102
|
+
check_for_errors("when updating a CNAME record", response)
|
103
|
+
end
|
104
|
+
|
105
|
+
def delete_cname_record(id)
|
106
|
+
response = @driver.RecordDelete @creds.merge("record_id" => id)
|
107
|
+
check_for_errors("when removing a CNAME record", response)
|
108
|
+
end
|
109
|
+
|
110
|
+
def update_soa(id, options = {})
|
111
|
+
args = @creds.merge("record_id" => id)
|
112
|
+
args.merge!(options)
|
113
|
+
|
114
|
+
response = @driver.RecordUpdate args
|
115
|
+
check_for_errors("when updating a SOA record", response)
|
116
|
+
end
|
117
|
+
|
118
|
+
def list_soa(zone, options = {})
|
119
|
+
args = @creds.merge("type" => "SOA", "zone" => zone)
|
120
|
+
args.merge!(options)
|
121
|
+
|
122
|
+
response = @driver.RecordGet args
|
123
|
+
check_for_errors("when listing SOA records", response)
|
124
|
+
response.records.first
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def check_for_errors(message, response)
|
130
|
+
if response["errors"]
|
131
|
+
raise "#{message}, you got this error: #{response["errors"]["action"]}" unless response["errors"]["action"].nil?
|
132
|
+
end
|
133
|
+
response
|
134
|
+
end
|
135
|
+
|
136
|
+
def setup_driver
|
137
|
+
SOAP::RPC::Driver.new('https://api.dynect.net/soap/', '/DynectAPI/')
|
138
|
+
end
|
139
|
+
|
140
|
+
def add_methods
|
141
|
+
@driver.add_method("ZoneGet", "args")
|
142
|
+
@driver.add_method("ZoneAdd", "args")
|
143
|
+
@driver.add_method("RecordGet", "args")
|
144
|
+
@driver.add_method("RecordAdd", "args")
|
145
|
+
@driver.add_method("RecordUpdate", "args")
|
146
|
+
@driver.add_method("RecordDelete", "args")
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/dynect.rb'
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
3
|
+
|
4
|
+
describe Dynect, "when used to manage A records" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@driver = mock("driver")
|
8
|
+
@driver.should_receive(:add_method).at_least(:once)
|
9
|
+
|
10
|
+
@d = Dynect.new("customer", "username", "password", @driver)
|
11
|
+
|
12
|
+
@result = mock("test")
|
13
|
+
@result.stub!(:errors).and_return(false)
|
14
|
+
@result.stub!(:[])
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to list records" do
|
18
|
+
@d.should respond_to(:list_a_records)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be able to accept additional parameters to filter the records you want" do
|
22
|
+
@driver.should_receive(:RecordGet).and_return(@result)
|
23
|
+
@result.stub!(:records)
|
24
|
+
@d.list_a_records("myzone.domain.com")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to add an A record" do
|
28
|
+
@d.should respond_to(:add_a_record)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should require zone, address information when adding an A record" do
|
32
|
+
@driver.should_receive(:RecordAdd).and_return(@result)
|
33
|
+
@d.add_a_record("test.domain.com", "192.168.1.1" )
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be able to accept additional parameters when creating an A record" do
|
37
|
+
@driver.should_receive(:RecordAdd).and_return(@result)
|
38
|
+
@d.add_a_record("test.domain.com", "192.168.1.1", "ttl" => "64")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be able to update A records" do
|
42
|
+
@d.should respond_to(:update_a_record)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should require the A record id to update" do
|
46
|
+
@driver.should_receive(:RecordUpdate).and_return(@result)
|
47
|
+
@d.update_a_record("id")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to accept additional parameters when updating an A record" do
|
51
|
+
@driver.should_receive(:RecordUpdate).and_return(@result)
|
52
|
+
@d.update_a_record("id", "address" => "192.168.1.1")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should be able to delete A records" do
|
56
|
+
@d.should respond_to(:delete_a_record)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should require the A record id to delete" do
|
60
|
+
@driver.should_receive(:RecordDelete).and_return(@result)
|
61
|
+
@d.delete_a_record("id")
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/dynect.rb'
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
3
|
+
|
4
|
+
describe Dynect, "when used to manage CNAME records" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@driver = mock("driver")
|
8
|
+
@driver.should_receive(:add_method).at_least(:once)
|
9
|
+
|
10
|
+
@d = Dynect.new("customer", "username", "password", @driver)
|
11
|
+
|
12
|
+
@result = mock("test")
|
13
|
+
@result.stub!(:errors).and_return(false)
|
14
|
+
@result.stub!(:[])
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to list records" do
|
18
|
+
@d.should respond_to(:list_cname_records)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be able to accept additional parameters to filter the records you want" do
|
22
|
+
@driver.should_receive(:RecordGet).and_return(@result)
|
23
|
+
@result.stub!(:records)
|
24
|
+
@d.list_cname_records("zone.domain.com")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be able to add an CNAME record" do
|
28
|
+
@d.should respond_to(:add_cname_record)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should require zone, hostname information when adding an CNAME record" do
|
32
|
+
@driver.should_receive(:RecordAdd).and_return(@result)
|
33
|
+
@d.add_cname_record("test.domain.com", "cname.domain.com" )
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be able to accept additional parameters when creating an CNAME record" do
|
37
|
+
@driver.should_receive(:RecordAdd).and_return(@result)
|
38
|
+
@d.add_cname_record("test.domain.com", "cname.domain.com")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should be able to update CNAME records" do
|
42
|
+
@d.should respond_to(:update_cname_record)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should require the CNAME record id to update" do
|
46
|
+
@driver.should_receive(:RecordUpdate).and_return(@result)
|
47
|
+
@d.update_cname_record("id")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to accept additional parameters when updating an CNAME record" do
|
51
|
+
@driver.should_receive(:RecordUpdate).and_return(@result)
|
52
|
+
@d.update_cname_record("id", "address" => "192.168.1.1")
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should be able to delete CNAME records" do
|
56
|
+
@d.should respond_to(:delete_cname_record)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should require the CNAME record id to delete" do
|
60
|
+
@driver.should_receive(:RecordDelete).and_return(@result)
|
61
|
+
@d.delete_cname_record("id")
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/dynect.rb'
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
3
|
+
|
4
|
+
|
5
|
+
describe Dynect, "when used to manage SOA" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@driver = mock("driver")
|
9
|
+
@driver.should_receive(:add_method).at_least(:once)
|
10
|
+
|
11
|
+
@d = Dynect.new("customer", "username", "password", @driver)
|
12
|
+
|
13
|
+
@result = mock("test")
|
14
|
+
@result.stub!(:errors).and_return(false)
|
15
|
+
@result.stub!(:[])
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be able to update SOA elements" do
|
19
|
+
@d.should respond_to(:update_soa)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should accept options to update" do
|
23
|
+
@driver.should_receive(:RecordUpdate).and_return(@result)
|
24
|
+
@d.update_soa("rname" => "root.domain.com")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should list SOA elements" do
|
28
|
+
@driver.should_receive(:RecordGet).and_return(@result)
|
29
|
+
@result.stub!(:records).and_return([])
|
30
|
+
@d.list_soa("foo.domain.com")
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/dynect.rb'
|
2
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
3
|
+
|
4
|
+
|
5
|
+
describe Dynect, "when used to manage zones" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@driver = mock("driver")
|
9
|
+
@driver.should_receive(:add_method).at_least(:once)
|
10
|
+
|
11
|
+
@d = Dynect.new("customer", "username", "password", @driver)
|
12
|
+
|
13
|
+
@result = mock("test")
|
14
|
+
@result.stub!(:errors).and_return(false)
|
15
|
+
@result.stub!(:[])
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a list zones method" do
|
19
|
+
@d.should respond_to(:list_zones)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be able to retireve info about a specific zone" do
|
23
|
+
@driver.should_receive(:ZoneGet).and_return(@result)
|
24
|
+
@result.stub!(:zones)
|
25
|
+
@d.list_zones("test.domain.com")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should call the driver when list zones is called" do
|
29
|
+
expected_creds = {"cust" => "customer", "user" => "username", "pass" => "password"}
|
30
|
+
@driver.should_receive(:ZoneGet).with(expected_creds).and_return(@result)
|
31
|
+
@result.stub!(:zones)
|
32
|
+
@d.list_zones
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should have a create zone method" do
|
36
|
+
@d.should respond_to(:create_zone)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should require a zone name and type when creating a zone" do
|
40
|
+
@driver.should_receive(:ZoneAdd).and_return(@result)
|
41
|
+
@d.create_zone("test.domain.com", "primary")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to accept additional parameters when creating a zone" do
|
45
|
+
@result.stub!(:call)
|
46
|
+
@driver.should_receive(:ZoneAdd).and_return(@result)
|
47
|
+
|
48
|
+
options = {"ttl" => "24", "data" => {"rname" => "test@example.com", "master" => "192.168.1.1"}}
|
49
|
+
|
50
|
+
@d.create_zone("test.domain.com", "primary", options).should_not raise_error
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dynect
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dave Hoover
|
8
|
+
- Colin Harris
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2008-01-02 00:00:00 -06:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: soap4r
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
version_requirement:
|
28
|
+
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: "0"
|
33
|
+
version:
|
34
|
+
description: Simple wrapper for Dynect SOAP API.
|
35
|
+
email: dave@obtiva.com
|
36
|
+
executables: []
|
37
|
+
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files: []
|
41
|
+
|
42
|
+
files:
|
43
|
+
- lib/dynect.rb
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://rubyforge.org/projects/dynect/
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
56
|
+
version:
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
requirements: []
|
64
|
+
|
65
|
+
rubyforge_project: dynect
|
66
|
+
rubygems_version: 1.0.0
|
67
|
+
signing_key:
|
68
|
+
specification_version: 2
|
69
|
+
summary: Simple wrapper for Dynect SOAP API.
|
70
|
+
test_files:
|
71
|
+
- spec/dynec_a_record_spec.rb
|
72
|
+
- spec/dynec_cname_record_spec.rb
|
73
|
+
- spec/dynec_soa_record_spec.rb
|
74
|
+
- spec/dynect_zone_spec.rb
|