nominet-epp 0.0.4 → 0.0.5
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.
- data/History.md +6 -0
- data/README.rdoc +8 -2
- data/VERSION +1 -1
- data/lib/nominet-epp/helpers.rb +4 -4
- data/lib/nominet-epp/operations/create.rb +10 -6
- data/lib/nominet-epp/operations/update.rb +108 -3
- data/lib/nominet-epp.rb +11 -2
- data/nominet-epp.gemspec +3 -3
- metadata +5 -5
data/History.md
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
=
|
1
|
+
= Nominet EPP
|
2
2
|
|
3
|
-
|
3
|
+
Ruby interface to the {Nominet EPP}[http://www.nominet.org.uk/registrars/systems/nominetepp] registrar interface.
|
4
|
+
|
5
|
+
== Initialise a client
|
6
|
+
|
7
|
+
require 'nominet-epp'
|
8
|
+
client = NominetEPP::Client.new('TAGNAME', 'password')
|
9
|
+
testclient = NominetEPP::Client.new('TAGNAME', 'password', 'testbed-epp.nominet.org.uk')
|
4
10
|
|
5
11
|
== Note on Patches/Pull Requests
|
6
12
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/lib/nominet-epp/helpers.rb
CHANGED
@@ -8,15 +8,15 @@ module NominetEPP
|
|
8
8
|
def domain_ns_xml(nameservers, ns)
|
9
9
|
ns_el = XML::Node.new('ns', nil, ns)
|
10
10
|
|
11
|
-
case nameservers
|
11
|
+
case nameservers
|
12
12
|
when String
|
13
|
-
ns_el << (
|
13
|
+
ns_el << domain_host_xml(nameservers, ns)
|
14
14
|
when Array
|
15
15
|
nameservers.each do |nameserver|
|
16
16
|
ns_el << domain_host_xml(nameserver, ns)
|
17
17
|
end
|
18
18
|
else
|
19
|
-
raise ArgumentError, "nameservers must either be a string or array
|
19
|
+
raise ArgumentError, "nameservers must either be a string or array"
|
20
20
|
end
|
21
21
|
|
22
22
|
ns_el
|
@@ -28,7 +28,7 @@ module NominetEPP
|
|
28
28
|
def domain_host_xml(nameserver, ns)
|
29
29
|
host = XML::Node.new('host', nil, ns)
|
30
30
|
|
31
|
-
case nameserver
|
31
|
+
case nameserver
|
32
32
|
when String
|
33
33
|
host << XML::Node.new('hostName', nameserver, ns)
|
34
34
|
when Hash
|
@@ -22,8 +22,8 @@ module NominetEPP
|
|
22
22
|
# - (Integer) +:order+ -- Contacts order in the list of contacts
|
23
23
|
#
|
24
24
|
# @param [String] name Domain name to register
|
25
|
-
# @param [String] acct
|
26
|
-
# @param [Array] nameservers Nameservers to set for the domain
|
25
|
+
# @param [String, Hash] acct
|
26
|
+
# @param [String, Array] nameservers Nameservers to set for the domain
|
27
27
|
# @param [Hash] options Registration options
|
28
28
|
# @option options [String] :period
|
29
29
|
# @option options [String] :first_bill
|
@@ -57,7 +57,7 @@ module NominetEPP
|
|
57
57
|
|
58
58
|
return false unless @resp.success?
|
59
59
|
|
60
|
-
creData = @resp.data.find('
|
60
|
+
creData = @resp.data.find('//domain:creData', namespaces).first
|
61
61
|
h = { :name => node_value(creData, 'domain:name'),
|
62
62
|
:crDate => Time.parse(node_value(creData, 'domain:crDate')),
|
63
63
|
:exDate => Time.parse(node_value(creData, 'domain:exDate')) }
|
@@ -86,11 +86,11 @@ module NominetEPP
|
|
86
86
|
|
87
87
|
acct[:contacts].each_with_index do |cont, i|
|
88
88
|
c = XML::Node.new('contact', nil, ns)
|
89
|
-
c['order'] = i
|
89
|
+
c['order'] = i.to_s
|
90
90
|
node << (c << create_account_contact(cont))
|
91
91
|
end
|
92
92
|
|
93
|
-
node << create_account_address(acct[:addr], ns)
|
93
|
+
node << create_account_address(acct[:addr], ns) unless acct[:addr].nil?
|
94
94
|
end
|
95
95
|
else
|
96
96
|
raise ArgumentError, "acct must be String or Hash"
|
@@ -104,7 +104,8 @@ module NominetEPP
|
|
104
104
|
# @raise [ArgumentError] name or email key is missing
|
105
105
|
# @return [XML::Node]
|
106
106
|
def create_account_contact(cont)
|
107
|
-
raise ArgumentError, "
|
107
|
+
raise ArgumentError, "cont must be a hash" unless cont.is_a?(Hash)
|
108
|
+
raise ArgumentError, "Contact allowed keys are name, email, phone and mobile" unless (cont.keys - [:name, :email, :phone, :mobile]).empty?
|
108
109
|
raise ArgumentError, "Contact requires name and email keys" unless cont.has_key?(:name) && cont.has_key?(:email)
|
109
110
|
|
110
111
|
contact('create') do |node, ns|
|
@@ -117,9 +118,12 @@ module NominetEPP
|
|
117
118
|
# Create contact address
|
118
119
|
#
|
119
120
|
# @param [Hash] addr Address fields
|
121
|
+
# @param [XML::Namespace] ns XML Namespace
|
120
122
|
# @raise [ArgumentError] invalid keys in addr
|
121
123
|
# @return [XML::Node]
|
122
124
|
def create_account_address(addr, ns)
|
125
|
+
raise ArgumentError, "addr must be a hash" unless addr.is_a?(Hash)
|
126
|
+
raise ArgumentError, "ns must be an xml namespace" unless ns.is_a?(XML::Namespace)
|
123
127
|
raise ArgumentError, "Address allowed keys are street, locality, city, county, postcode, country" unless (addr.keys - [:street, :locality, :city, :county, :postcode, :country]).empty?
|
124
128
|
|
125
129
|
addr = XML::Node.new('addr', nil, ns)
|
@@ -1,10 +1,59 @@
|
|
1
1
|
module NominetEPP
|
2
2
|
module Operations
|
3
|
-
# EPP Update Operation
|
3
|
+
# == EPP Update Operation
|
4
|
+
#
|
5
|
+
# === Domain Update
|
6
|
+
# The +id+ field for domain updates is the domain name to be modified.
|
7
|
+
#
|
8
|
+
# Fields options
|
9
|
+
# - (Hash) +:account+ -- Hash of account details to be updated
|
10
|
+
# - (String,Hash) +:ns+ -- Single or array of nameservers to set on the domain
|
11
|
+
# - (String) +:first_bill+ -- Set first-bill
|
12
|
+
# - (String) +:recur_bill+ -- Set recur-bill
|
13
|
+
# - (String) +:auto_bill+ -- Set auto-bill
|
14
|
+
# - (String) +:purchase_order+ -- Set purchase-oder
|
15
|
+
# - (String) +:notes+ -- Notes about the domain
|
16
|
+
# - (Boolean) +:renew_not_required+ -- Mark a domain as no longer needed
|
17
|
+
# - (String) +:reseller+ -- Set reseller
|
18
|
+
# ... etc ... any other permitted account fields
|
19
|
+
#
|
20
|
+
# === Account Update
|
21
|
+
# The +id+ field for account updates is the ROID identifying
|
22
|
+
# the account record on the remote endpoint.
|
23
|
+
#
|
24
|
+
# Fields options
|
25
|
+
# - (Array) +:contacts+ -- Array of contacts to create on the account
|
26
|
+
# - (Hash) +:addr+ -- Hash of address fields to modify on the account
|
27
|
+
# - (String) +:name+ -- Account holder name
|
28
|
+
# ... etc ... any other permitted account fields
|
29
|
+
#
|
30
|
+
# === Contact Update
|
31
|
+
# The +id+ field for contact updates is the ROID identifying
|
32
|
+
# the contact record on the remote endpoint.
|
33
|
+
#
|
34
|
+
# Fields options
|
35
|
+
# - (String) +:name+ -- Contacts new name
|
36
|
+
# - (String) +:email+ -- Contacts new email address
|
37
|
+
# - (String) +:phone+ -- Contacts new phone number
|
38
|
+
# - (String) +:mobile+ -- Contacts new mobile number
|
39
|
+
#
|
40
|
+
# === Nameserver Update
|
41
|
+
# The +id+ field for nameserver updates is the fully qualified
|
42
|
+
# hostname for the name server you wish to update.
|
43
|
+
#
|
44
|
+
# Fields options
|
45
|
+
# - (Hash) +:add+ -- Addresses to add to the nameserver
|
46
|
+
# - (Hash) +:rem+ -- Addresses to remove from the nameserver
|
47
|
+
# - (String) +:chg+ -- New hostname of the nameserver
|
48
|
+
#
|
49
|
+
# Fields +:add+ and +:rem+ options
|
50
|
+
# - (String) +:v4+ -- IPv4 address to add or remove from the nameserver
|
51
|
+
# - (String) +:v6+ -- IPv6 address to add or remove from the nameserver
|
4
52
|
module Update
|
5
|
-
# @param [Symbol] entity Entity to update
|
6
|
-
# @param [String] id Domain, Account or
|
53
|
+
# @param [Symbol] entity Entity to update, one of domain, account, contact or nameserver
|
54
|
+
# @param [String] id Domain, Account, Contact or Nameserver to update
|
7
55
|
# @param [Hash] fields Fields to update
|
56
|
+
# @return [Boolean] request successful
|
8
57
|
def update(entity, id, fields = {})
|
9
58
|
@resp = @client.update do
|
10
59
|
self.send(:"update_#{entity}", id, fields)
|
@@ -62,6 +111,62 @@ module NominetEPP
|
|
62
111
|
end
|
63
112
|
end
|
64
113
|
end
|
114
|
+
|
115
|
+
# Generate +host:update+ payload to modify a nameserver entry
|
116
|
+
# ---
|
117
|
+
# We need to know nameserver old data as well.
|
118
|
+
# If we are changing the nameserver name and keeping the info the same
|
119
|
+
# then we do a host:chg. If we are adding an IPv{4,6} address we use
|
120
|
+
# the host:add wrapper, and to remove we do a host:rem. As Nominet only
|
121
|
+
# allow one IPv{4,6} address per nameserver we should remove the old
|
122
|
+
# IP address from the server before adding the one. Alternatively if
|
123
|
+
# Nominet will automatically drop previous address then we need only
|
124
|
+
# do a host:add call.
|
125
|
+
# +++
|
126
|
+
#
|
127
|
+
# Fields options
|
128
|
+
# - (Hash) +:add+ -- Addresses to add to the nameserver
|
129
|
+
# - (Hash) +:rem+ -- Addresses to remove from the nameserver
|
130
|
+
# - (String) +:chg+ -- New hostname of the nameserver
|
131
|
+
#
|
132
|
+
# Fields +:add+ and +:rem+ options
|
133
|
+
# - (String) +:v4+ -- IPv4 address to add or remove from the nameserver
|
134
|
+
# - (String) +:v6+ -- IPv6 address to add or remove from the nameserver
|
135
|
+
#
|
136
|
+
# @param [String] name Nameserver host to update
|
137
|
+
# @param [Hash] fields Nameserver update information
|
138
|
+
# @raise [ArgumentError] invalid keys, either on fields or fields[:add] or fields[:rem]
|
139
|
+
# @return [XML::Node] +host:update+ payload
|
140
|
+
def update_nameserver(name, fields = {})
|
141
|
+
raise ArgumentError, "allowed keys :add, :rem, :chg" unless (fields.keys - [:add, :rem, :chg]).empty?
|
142
|
+
|
143
|
+
host('update') do |node, ns|
|
144
|
+
node << XML::Node.new('name', name, ns)
|
145
|
+
|
146
|
+
if fields.has_key?(:add) && fields[:add].kind_of?(Hash)
|
147
|
+
raise ArgumentError, "allowed :add keys are :v4 and :v6" unless (fields[:add].keys - [:v4, :v6]).empty?
|
148
|
+
node << (add = XML::Node.new('add', nil, ns))
|
149
|
+
fields[:add].each do |k,v|
|
150
|
+
add << (n = XML::Node.new('addr', v, ns))
|
151
|
+
n['ip'] = k.to_s
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
if fields.has_key?(:rem) && fields[:rem].kind_of?(Hash)
|
156
|
+
raise ArgumentError, "allowed :rem keys are :v4 and :v6" unless (fields[:rem].keys - [:v4, :v6]).empty?
|
157
|
+
node << (rem = XML::Node.new('rem', nil, ns))
|
158
|
+
fields[:rem].each do |k,v|
|
159
|
+
rem << (n = XML::Node.new('addr', v, ns))
|
160
|
+
n['ip'] = k.to_s
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
if fields.has_key?(:chg) && fields[:chg].kind_of?(String)
|
165
|
+
node << (chg = XML::Node.new('chg', nil, ns))
|
166
|
+
chg << XML::Node.new('name', fields[:chg], ns)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
65
170
|
end
|
66
171
|
end
|
67
172
|
end
|
data/lib/nominet-epp.rb
CHANGED
@@ -49,7 +49,8 @@ module NominetEPP
|
|
49
49
|
:account => 'http://www.nominet.org.uk/epp/xml/nom-account-2.0',
|
50
50
|
:contact => 'http://www.nominet.org.uk/epp/xml/nom-contact-2.0',
|
51
51
|
:tag => 'http://www.nominet.org.uk/epp/xml/nom-tag-1.0',
|
52
|
-
:n => 'http://www.nominet.org.uk/epp/xml/nom-notifications-2.0'
|
52
|
+
:n => 'http://www.nominet.org.uk/epp/xml/nom-notifications-2.0',
|
53
|
+
:host => 'urn:ietf:params:xml:ns:host-1.0' }
|
53
54
|
end
|
54
55
|
|
55
56
|
# @return [Hash] Nominet Schema Locations by prefix
|
@@ -97,7 +98,7 @@ module NominetEPP
|
|
97
98
|
def new_node(name, ns_prefix, &block)
|
98
99
|
node = XML::Node.new(name)
|
99
100
|
node.namespaces.namespace = ns = XML::Namespace.new(node, ns_prefix.to_s, namespaces[ns_prefix])
|
100
|
-
node['xsi:schemaLocation'] = schemaLocations[ns_prefix]
|
101
|
+
node['xsi:schemaLocation'] = schemaLocations[ns_prefix] if schemaLocations.has_key?(ns_prefix)
|
101
102
|
|
102
103
|
case block.arity
|
103
104
|
when 0
|
@@ -150,5 +151,13 @@ module NominetEPP
|
|
150
151
|
def notification(node_name, &block)
|
151
152
|
new_node(node_name, :n, &block)
|
152
153
|
end
|
154
|
+
|
155
|
+
# @param [String] node_name XML Element name
|
156
|
+
# @yield [node, ns] block to populate node
|
157
|
+
# @return [XML::Node] new node in :host namespace
|
158
|
+
# @see new_node
|
159
|
+
def host(node_name, &block)
|
160
|
+
new_node(node_name, :host, &block)
|
161
|
+
end
|
153
162
|
end
|
154
163
|
end
|
data/nominet-epp.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{nominet-epp}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Geoff Garside"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-02-24}
|
13
13
|
s.description = %q{Client for communicating with the Nominet EPP}
|
14
14
|
s.email = %q{geoff@geoffgarside.co.uk}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -47,7 +47,7 @@ Gem::Specification.new do |s|
|
|
47
47
|
]
|
48
48
|
s.homepage = %q{http://github.com/geoffgarside/nominet-epp}
|
49
49
|
s.require_paths = ["lib"]
|
50
|
-
s.rubygems_version = %q{1.
|
50
|
+
s.rubygems_version = %q{1.5.2}
|
51
51
|
s.summary = %q{Nominet EPP (Extensible Provisioning Protocol) Client}
|
52
52
|
s.test_files = [
|
53
53
|
"test/helper.rb",
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nominet-epp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Geoff Garside
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-02-24 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
127
|
requirements: []
|
128
128
|
|
129
129
|
rubyforge_project:
|
130
|
-
rubygems_version: 1.
|
130
|
+
rubygems_version: 1.5.2
|
131
131
|
signing_key:
|
132
132
|
specification_version: 3
|
133
133
|
summary: Nominet EPP (Extensible Provisioning Protocol) Client
|