zerigodns 1.0.2 → 1.1.0
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/lib/zerigodns.rb +14 -2
- data/lib/zerigodns/client.rb +67 -0
- data/lib/zerigodns/client/response_code.rb +29 -0
- data/lib/zerigodns/config.rb +24 -9
- data/lib/zerigodns/host.rb +23 -19
- data/lib/zerigodns/host_template.rb +4 -1
- data/lib/zerigodns/middleware.rb +3 -0
- data/lib/zerigodns/middleware/error_handler.rb +22 -0
- data/lib/zerigodns/middleware/xml.rb +29 -0
- data/lib/zerigodns/middleware/zerigo_auth.rb +26 -0
- data/lib/zerigodns/resource.rb +38 -0
- data/lib/zerigodns/resource/attributes.rb +59 -0
- data/lib/zerigodns/resource/naming.rb +47 -0
- data/lib/zerigodns/resource/rest.rb +80 -0
- data/lib/zerigodns/tools.rb +4 -4
- data/lib/zerigodns/zone.rb +8 -4
- data/lib/zerigodns/zone_template.rb +6 -4
- metadata +47 -7
- data/lib/activeresource-ext.rb +0 -43
- data/lib/zerigodns/base.rb +0 -47
data/lib/zerigodns.rb
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
# Copyright 2009 Zerigo, Inc. See MIT-LICENSE for license information.
|
2
2
|
# Visit http://www.zerigo.com/docs/managed-dns for updates and documentation.
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'faraday'
|
4
|
+
require 'multi_xml'
|
5
|
+
require 'zerigodns/client'
|
6
|
+
require 'zerigodns/client/response_code'
|
7
|
+
|
8
|
+
require 'zerigodns/middleware'
|
9
|
+
require 'zerigodns/middleware/xml'
|
10
|
+
require 'zerigodns/middleware/error_handler'
|
11
|
+
require 'zerigodns/middleware/zerigo_auth'
|
12
|
+
|
13
|
+
require 'zerigodns/resource'
|
14
|
+
require 'zerigodns/resource/rest'
|
15
|
+
require 'zerigodns/resource/naming'
|
16
|
+
require 'zerigodns/resource/attributes'
|
5
17
|
require 'zerigodns/config'
|
6
18
|
require 'zerigodns/host'
|
7
19
|
require 'zerigodns/zone'
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module ZerigoDNS
|
2
|
+
class Client
|
3
|
+
|
4
|
+
#@!attribute response [r]
|
5
|
+
# @return [Faraday::Response] exposes the response.
|
6
|
+
ResponseError = Class.new(RuntimeError) do
|
7
|
+
attr_reader :response
|
8
|
+
|
9
|
+
# Initialize a new ResponseError with a response.
|
10
|
+
def initialize response=nil
|
11
|
+
@response=response
|
12
|
+
end
|
13
|
+
|
14
|
+
# Convert to a string
|
15
|
+
# @return [String] The error's message.
|
16
|
+
def to_s
|
17
|
+
inspect
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [String] The error's message
|
21
|
+
def message
|
22
|
+
inspect
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [String] The error's message
|
26
|
+
def inspect
|
27
|
+
"HTTP Response Error: #{response && response.status}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Standard REST Actions
|
32
|
+
ACTIONS = %w(get post put patch delete)
|
33
|
+
|
34
|
+
ACTIONS.each do |action|
|
35
|
+
define_method action do |*args|
|
36
|
+
self.class.send(action, *args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
class <<self
|
42
|
+
# Gets or creates a new faraday connection.
|
43
|
+
def connection
|
44
|
+
|
45
|
+
# => Note: Order matters here!
|
46
|
+
@connection ||= Faraday.new(
|
47
|
+
url: ZerigoDNS.config.site,
|
48
|
+
) do |faraday|
|
49
|
+
faraday.request :zerigo_auth
|
50
|
+
faraday.request :multipart
|
51
|
+
faraday.request :url_encoded
|
52
|
+
|
53
|
+
faraday.adapter Faraday.default_adapter
|
54
|
+
|
55
|
+
faraday.response :custom_xml
|
56
|
+
faraday.response :custom_error_handler
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
ACTIONS.each do |action|
|
61
|
+
define_method action do |*args|
|
62
|
+
connection.send action, *args
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Represents a response code and allows more expressive querying of response status.
|
2
|
+
# e.g. +response.env[:code].ok?+ as opposed to +(200..299).include?(response.status)+
|
3
|
+
class ZerigoDNS::Client::ResponseCode
|
4
|
+
attr_reader :raw_code
|
5
|
+
|
6
|
+
def initialize raw_code
|
7
|
+
@raw_code = raw_code
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Boolean] true if the response was OK
|
11
|
+
def ok?
|
12
|
+
(200..299).include?(raw_code) || raw_code == 302
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Boolean] true if the response was not OK
|
16
|
+
def error?
|
17
|
+
!ok?
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Boolean] true if response is 500 internal server error.
|
21
|
+
def server_error?
|
22
|
+
raw_code == 500
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Boolean] true if response is 404
|
26
|
+
def not_found?
|
27
|
+
raw_code == 404
|
28
|
+
end
|
29
|
+
end
|
data/lib/zerigodns/config.rb
CHANGED
@@ -3,16 +3,31 @@ module ZerigoDNS
|
|
3
3
|
#@attr [String] user Your e-mail address
|
4
4
|
#@attr [Boolean] secure Whether to use HTTPS
|
5
5
|
class Config
|
6
|
+
attr_accessor :api_key, :user, :secure, :site
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
def initialize
|
9
|
+
@site = 'https://ns.zerigo.com/api/1.1'
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [Boolean] +true+ if +https+ is used
|
13
|
+
def secure?
|
14
|
+
!!secure
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
# Set +https+ or +http+
|
19
|
+
# @param [Boolean] value +true+ to use +https+, false for +http+
|
20
|
+
# Note: Will change the value of +site+!
|
21
|
+
def secure= value
|
22
|
+
@secure=value
|
23
|
+
|
24
|
+
if secure?
|
25
|
+
site = 'https://ns.zerigo.com/api/1.1'
|
26
|
+
else
|
27
|
+
site = 'http://ns.zerigo.com/api/1.1'
|
16
28
|
end
|
29
|
+
|
30
|
+
secure
|
31
|
+
end
|
17
32
|
end
|
18
33
|
end
|
data/lib/zerigodns/host.rb
CHANGED
@@ -1,23 +1,39 @@
|
|
1
|
-
class ZerigoDNS::Host < ZerigoDNS::
|
1
|
+
class ZerigoDNS::Host < ZerigoDNS::Client
|
2
|
+
include ZerigoDNS::Resource
|
3
|
+
|
4
|
+
|
2
5
|
class << self
|
3
6
|
|
7
|
+
|
4
8
|
# Find host record(s) by zone and hostname
|
5
|
-
# @param [Symbol, #read] which One of :one, :first, :last, or :all.
|
9
|
+
# @param [Symbol, #read] which One of :one, :first, :last, or :all.
|
6
10
|
# @param [Zone, #read] zone The zone from which to find the host record.
|
11
|
+
|
7
12
|
# @param [String, #read] hostname The hostname to find.
|
8
13
|
# @return Host records, or an empty list if no records found.
|
9
14
|
def find_by_zone_and_hostname which, zone, hostname
|
10
|
-
|
11
|
-
|
15
|
+
if which == :all
|
16
|
+
find_all_by_hostname(zone, hostname)
|
17
|
+
else
|
18
|
+
find_all_by_hostname(zone, hostname).send(which)
|
19
|
+
end
|
12
20
|
end
|
13
21
|
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
# Find host record(s) by zone and hostname
|
26
|
+
# @param [Zone, #read] zone The zone from which to find the host record.
|
27
|
+
# @param [String, #read] hostname The hostname to find.
|
28
|
+
# @return Host records, or an empty list if no records found.
|
14
29
|
def find_all_by_hostname zone, hostname
|
15
|
-
|
30
|
+
fqdn = [hostname, zone.domain].reject(&:nil?).reject(&:empty?).join('.')
|
31
|
+
all(fqdn: fqdn, zone_id: zone.id)
|
16
32
|
end
|
17
33
|
|
18
34
|
# @return [Host] The record found, or nil.
|
19
35
|
def find_first_by_hostname zone, hostname
|
20
|
-
|
36
|
+
find_all_by_hostname(zone, hostname).first
|
21
37
|
end
|
22
38
|
|
23
39
|
# Update or Create Host for a zone
|
@@ -31,7 +47,7 @@ class ZerigoDNS::Host < ZerigoDNS::Base
|
|
31
47
|
def update_or_create(zone, hostname, type, ttl, data)
|
32
48
|
host = find_first_by_hostname(zone, hostname)
|
33
49
|
if host
|
34
|
-
host.
|
50
|
+
host.update(ttl: ttl, host_type: type, data: data)
|
35
51
|
else
|
36
52
|
host = create(
|
37
53
|
:zone_id => zone.id,
|
@@ -44,16 +60,4 @@ class ZerigoDNS::Host < ZerigoDNS::Base
|
|
44
60
|
host
|
45
61
|
end
|
46
62
|
end
|
47
|
-
|
48
|
-
# Convienence method to update the record.
|
49
|
-
# @param [String, #read] type
|
50
|
-
# @param [String, #read] ttl
|
51
|
-
# @param [String, #read] data
|
52
|
-
# @return [Boolean, #read] True if saved, false otherwise.
|
53
|
-
def update_record type, ttl, data
|
54
|
-
self.host_type = type
|
55
|
-
self.data = data
|
56
|
-
self.ttl = ttl
|
57
|
-
save
|
58
|
-
end
|
59
63
|
end
|
@@ -1,4 +1,7 @@
|
|
1
|
-
class ZerigoDNS::HostTemplate < ZerigoDNS::
|
1
|
+
class ZerigoDNS::HostTemplate < ZerigoDNS::Client
|
2
|
+
|
3
|
+
include ZerigoDNS::Resource
|
4
|
+
|
2
5
|
|
3
6
|
# Fetches the zone template to which the host template belongs.
|
4
7
|
# @return [ZoneTemplate] The zone template to which the host template belongs.
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Rasies exceptions on errors
|
2
|
+
class ZerigoDNS::Middleware::ErrorHandler < Faraday::Middleware
|
3
|
+
# Constructs new middleware instance
|
4
|
+
def initialize app=nil, options={}
|
5
|
+
@app = app
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
# Rasies an exception on a response code that is not HTTP OK
|
10
|
+
def call request_env
|
11
|
+
@app.call(request_env).on_complete do |response|
|
12
|
+
response[:code] = ZerigoDNS::Client::ResponseCode.new(response.status)
|
13
|
+
if response[:code].ok?
|
14
|
+
response
|
15
|
+
else
|
16
|
+
raise ZerigoDNS::Client::ResponseError.new(response)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Faraday::Response.register_middleware custom_error_handler: lambda {ZerigoDNS::Middleware::ErrorHandler}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Simple XML parsing middleware for Faraday.
|
2
|
+
# uses +multi_xml+.
|
3
|
+
class ZerigoDNS::Middleware::Xml < Faraday::Middleware
|
4
|
+
|
5
|
+
XML_REGEXP = /xml/
|
6
|
+
|
7
|
+
|
8
|
+
# Parse the XML, if XML exists.
|
9
|
+
# Note: This +must+ return the response in order for the stack of middleware to continue.
|
10
|
+
# @return [Faraday::Response] The response received
|
11
|
+
def call request_env
|
12
|
+
@app.call(request_env).on_complete do |response|
|
13
|
+
if xml?(response)
|
14
|
+
response[:raw_body] = response[:body]
|
15
|
+
response[:body] = MultiXml.parse(response[:body])
|
16
|
+
end
|
17
|
+
response
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def xml? env
|
25
|
+
!!XML_REGEXP.match(env[:response_headers]['Content-Type'])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Faraday::Response.register_middleware custom_xml: ZerigoDNS::Middleware::Xml
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Handles authentication using the Zerigo config.
|
2
|
+
class ZerigoDNS::Middleware::ZerigoAuth < Faraday::Middleware
|
3
|
+
# Constructs new middleware instance
|
4
|
+
def initialize app=nil, options={}
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
# Adds username & api key to Basic Auth header.
|
9
|
+
# @param [Faraday::Request] env The request
|
10
|
+
def call env
|
11
|
+
# => Ruby 1.8.7 does not support Base64.strict_encode64
|
12
|
+
auth_enc = Base64.encode64(formatted_login).gsub("\n", '')
|
13
|
+
env.request_headers['Authorization'] = "Basic #{auth_enc}"
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Gets the user:password format from ZerigoDNS.config
|
20
|
+
# @return [String] formatted login details
|
21
|
+
def formatted_login
|
22
|
+
[ZerigoDNS.config.user, ZerigoDNS.config.api_key].join(':')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Faraday::Request.register_middleware zerigo_auth: ZerigoDNS::Middleware::ZerigoAuth
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# A lightweight resource class that will do much of the work of ActiveResource
|
2
|
+
# without the big dependencies.
|
3
|
+
|
4
|
+
module ZerigoDNS::Resource
|
5
|
+
module ClassMethods
|
6
|
+
# Removes the root from the response and hands it off to the class to process it
|
7
|
+
# Processes an array response by delegating to the includer's self.from_response
|
8
|
+
# @param [Faraday::Response] response The response
|
9
|
+
# @return [Object] The result of the parsed response.
|
10
|
+
def process_response response
|
11
|
+
without_root = response.body.values.first
|
12
|
+
case
|
13
|
+
when without_root.is_a?(Array) then process_array(response, without_root)
|
14
|
+
when without_root.is_a?(Hash) then from_response(response, without_root)
|
15
|
+
else without_root
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# Processes an array response by delegating to the includer's self.from_response
|
21
|
+
# @param [Faraday::Response] response The response
|
22
|
+
# @param [Array] body The response body, with root removed
|
23
|
+
# @return [Array] The resultant array.
|
24
|
+
def process_array response, body
|
25
|
+
body.map do |element|
|
26
|
+
from_response response, element
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def self.included includer
|
33
|
+
includer.send :include, Attributes
|
34
|
+
includer.send :include, Rest
|
35
|
+
includer.send :include, Naming
|
36
|
+
includer.send :extend, ClassMethods
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Simple attribute handling for resources
|
2
|
+
# Ties in with ZerigoDNS::Resource by defining a
|
3
|
+
# from_response method to initialize the class by its attributes.
|
4
|
+
module ZerigoDNS::Resource::Attributes
|
5
|
+
module InstanceMethods
|
6
|
+
attr_accessor :attributes
|
7
|
+
|
8
|
+
|
9
|
+
# Allows method-style access to the attributes.
|
10
|
+
def method_missing mtd, *args
|
11
|
+
if mtd.to_s.chars.to_a.last == '='
|
12
|
+
raise ArgumentError, "Invalid number of arguments (#{args.length} for 1)" if args.length != 1
|
13
|
+
attributes[mtd.to_s.slice(0,mtd.to_s.length-1)] = args.first
|
14
|
+
else
|
15
|
+
raise ArgumentError, "Invalid number of arguments (#{args.length} for 0)" if args.length != 0
|
16
|
+
attributes[mtd.to_s]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Converts the resource to a hash
|
21
|
+
# @return [Hash] The attributes
|
22
|
+
def to_hash
|
23
|
+
attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
# Initialize a new resource
|
27
|
+
# @param [Hash] attributes Initial attributes.
|
28
|
+
def initialize attributes={}
|
29
|
+
@attributes = {}
|
30
|
+
merge_attributes attributes
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Merge current attributes with specified ones.
|
36
|
+
# Will handle symbols as well as strings as keys
|
37
|
+
# @param [Hash] attrs Attributes to merge
|
38
|
+
def merge_attributes attrs
|
39
|
+
attrs.each do |key, val|
|
40
|
+
send("#{key}=", val)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
module ClassMethods
|
47
|
+
# Constructs a new resource from a response
|
48
|
+
# @param [Faraday::Response] response The response
|
49
|
+
# @param [Hash] body The response body without root
|
50
|
+
def from_response response, body
|
51
|
+
new body
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.included includer
|
56
|
+
includer.send :include, InstanceMethods
|
57
|
+
includer.send :extend, ClassMethods
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Simple attribute handling for resources
|
2
|
+
# Ties in with ZerigoDNS::Resource by defining a
|
3
|
+
# from_response method to initialize the class by its attributes.
|
4
|
+
module ZerigoDNS::Resource::Naming
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
# Default Resource Name
|
8
|
+
# @return [String] generated resource name from class name "e.g. ZerigoDNS::ZoneTemplate -> zone_template"
|
9
|
+
def default_resource_name
|
10
|
+
result = self.to_s.split("::").last.gsub(/([A-Z])/, '_\1').downcase
|
11
|
+
result.slice 1, result.length
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
# Default base path.
|
16
|
+
# @return [String] Generated base path from class name (default_resource_name + "s")
|
17
|
+
def default_base_path
|
18
|
+
"#{resource_name}s"
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# Sets & gets the "resource name", which is required for the create & update actions.
|
23
|
+
# @param [String] name resource name
|
24
|
+
# @return [String] the base path
|
25
|
+
def resource_name name=nil
|
26
|
+
if name
|
27
|
+
@resource_name = name
|
28
|
+
end
|
29
|
+
@resource_name || default_resource_name
|
30
|
+
end
|
31
|
+
|
32
|
+
# Sets or gets the "base path", where the resource is located.
|
33
|
+
# @param [String] path base path
|
34
|
+
# @return [String] the base path
|
35
|
+
def base_path path=nil
|
36
|
+
if path
|
37
|
+
@base_path = path
|
38
|
+
end
|
39
|
+
@base_path || default_base_path
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def self.included includer
|
45
|
+
includer.send :extend, ClassMethods
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Puts a basic resource abstraction over basic REST calls.
|
2
|
+
module ZerigoDNS::Resource::Rest
|
3
|
+
module InstanceMethods
|
4
|
+
|
5
|
+
# Update this instance's resource with attributes supplied into +params+
|
6
|
+
# @param [Hash] params The attributes to set
|
7
|
+
# @return [Object] The instance on which +update+ was called
|
8
|
+
def update params
|
9
|
+
self.class.update id, params
|
10
|
+
merge_attributes params
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
# Destroy this instance's resource
|
15
|
+
# @param [Hash] params The attributes to set
|
16
|
+
# @raise [ZerigoDNS::Client::ResponseError] if delete does not succeed.
|
17
|
+
# @return [Faraday::Response] The response returned from the server.
|
18
|
+
def destroy params={}
|
19
|
+
self.class.destroy id, params
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module ClassMethods
|
24
|
+
|
25
|
+
# Lists all resources
|
26
|
+
# @return [Array] The resources as an array
|
27
|
+
def all params={}
|
28
|
+
process_response get("#{base_path}.xml", params)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Find a single resource
|
32
|
+
# @param [Object] id_or_name The id or name of the resource to find
|
33
|
+
# @raise [ZerigoDNS::Client::ResponseError] if the find does not succeed.
|
34
|
+
# @return [Object] The requested resource.
|
35
|
+
def find id_or_name, params={}
|
36
|
+
process_response get("#{base_path}/#{id_or_name}.xml", params)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Updates a single resource
|
40
|
+
# @param [Object] id_or_name Id or name of the resource
|
41
|
+
# @raise [ZerigoDNS::Client::ResponseError] if update does not succeed.
|
42
|
+
# @return [Faraday::Response] The response returned by the server.
|
43
|
+
def update id_or_name, params={}
|
44
|
+
put "#{base_path}/#{id_or_name}.xml", convert(params)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Creates a resource
|
48
|
+
# @param [Object] params Parameters to pass to create action
|
49
|
+
# @raise [ZerigoDNS::Client::ResponseError] if create does not succeed.
|
50
|
+
# @return [Object] the created resource
|
51
|
+
def create params={}
|
52
|
+
process_response(post "#{base_path}.xml", convert(params))
|
53
|
+
end
|
54
|
+
|
55
|
+
# Deletes a resource
|
56
|
+
# @param [Object] params Parameters to pass to delete action
|
57
|
+
# @raise [ZerigoDNS::Client::ResponseError] if destroy does not succeed.
|
58
|
+
def destroy id_or_name, params={}
|
59
|
+
delete "#{base_path}/#{id_or_name}.xml", params
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# Converts a resource object to a hash.
|
66
|
+
# @param [Object] object to convert to a hash
|
67
|
+
# @raise [ArgumentError] if the object given does not respond to to_hash
|
68
|
+
def convert object
|
69
|
+
return {resource_name => object} if object.is_a? Hash
|
70
|
+
{resource_name => object.to_hash}
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.included includer
|
76
|
+
includer.send :include, InstanceMethods
|
77
|
+
includer.send :extend, ClassMethods
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
data/lib/zerigodns/tools.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
class ZerigoDNS::Tools < ZerigoDNS::
|
1
|
+
class ZerigoDNS::Tools < ZerigoDNS::Client
|
2
2
|
class <<self
|
3
3
|
|
4
4
|
# Fetch current public ipv4 address
|
5
5
|
# @return [String] Current public ipv4 address or "unknown"
|
6
6
|
def public_ipv4
|
7
|
-
get
|
7
|
+
get('tools/public_ipv4.xml').body['ipv4']
|
8
8
|
end
|
9
9
|
|
10
10
|
# Fetch current public ipv6 address
|
11
11
|
# @return [String] Current public ipv6 address or "unknown"
|
12
12
|
def public_ipv6
|
13
|
-
get
|
13
|
+
get('tools/public_ipv6.xml').body['ipv6']
|
14
14
|
end
|
15
15
|
|
16
16
|
# Fetch the current public IP address (either ipv4 or ipv6)
|
17
17
|
# @return [String] Current public ip address (ipv4 or ipv6)
|
18
18
|
def public_ip
|
19
|
-
get
|
19
|
+
get('tools/public_ip').body['ipv4'] || get('tools/public_ip').body['ipv6']
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
data/lib/zerigodns/zone.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
class ZerigoDNS::Zone < ZerigoDNS::
|
1
|
+
class ZerigoDNS::Zone < ZerigoDNS::Client
|
2
|
+
include ZerigoDNS::Resource
|
3
|
+
|
2
4
|
class <<self
|
5
|
+
|
3
6
|
# Get count of all zones
|
4
7
|
# @return [Fixnum] Count of all zones
|
5
8
|
def count
|
6
|
-
get(
|
9
|
+
get('zones/count.xml').body['count'].to_i
|
7
10
|
end
|
8
11
|
|
9
12
|
# Find zone by domain name
|
@@ -19,7 +22,8 @@ class ZerigoDNS::Zone < ZerigoDNS::Base
|
|
19
22
|
# @return [Zone] the zone found or created.
|
20
23
|
def find_or_create(domain)
|
21
24
|
find_by_domain(domain)
|
22
|
-
rescue
|
25
|
+
rescue ZerigoDNS::Client::ResponseError => e
|
26
|
+
raise unless e.response.code.not_found?
|
23
27
|
create(:domain=> domain, :ns_type=>'pri_sec')
|
24
28
|
end
|
25
29
|
end
|
@@ -27,6 +31,6 @@ class ZerigoDNS::Zone < ZerigoDNS::Base
|
|
27
31
|
# Get count of all hosts belonging to this zone
|
28
32
|
# @return [Fixnum] Count of all hosts belonging to this zone.
|
29
33
|
def count_hosts
|
30
|
-
get(
|
34
|
+
get("zones/#{id}/hosts/count.xml").body['count'].to_i
|
31
35
|
end
|
32
36
|
end
|
@@ -1,15 +1,17 @@
|
|
1
|
-
class ZerigoDNS::ZoneTemplate < ZerigoDNS::
|
1
|
+
class ZerigoDNS::ZoneTemplate < ZerigoDNS::Client
|
2
|
+
|
3
|
+
include ZerigoDNS::Resource
|
2
4
|
|
3
5
|
# Get count of zone templates
|
4
6
|
# @return [Fixnum] the count of zone templates
|
5
7
|
def self.count
|
6
|
-
get(
|
8
|
+
get('zone_templates/count.xml').body['count'].to_i
|
7
9
|
end
|
8
10
|
|
9
11
|
# Get count of host templates
|
10
12
|
# @return [Fixnum] the count of host templates for this zone template
|
11
13
|
def count_host_templates
|
12
|
-
get(
|
14
|
+
get("zone_templates/#{id}/host_templates/count.xml").body['count'].to_i
|
13
15
|
end
|
14
16
|
|
15
17
|
# Create a zone using the zone template
|
@@ -28,7 +30,7 @@ class ZerigoDNS::ZoneTemplate < ZerigoDNS::Base
|
|
28
30
|
# List all host templates of this zone template
|
29
31
|
# @return [Array] An array of host templates
|
30
32
|
def host_templates
|
31
|
-
@host_templates ||= ZerigoDNS::HostTemplate.
|
33
|
+
@host_templates ||= ZerigoDNS::HostTemplate.all(zone_template_id: id)
|
32
34
|
end
|
33
35
|
|
34
36
|
# Create a host template for this template
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zerigodns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,16 +10,32 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-02-
|
13
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: faraday
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 0.9.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 0.9.1
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: multi_xml
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 0.5.5
|
23
39
|
type: :runtime
|
24
40
|
prerelease: false
|
25
41
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,7 +43,7 @@ dependencies:
|
|
27
43
|
requirements:
|
28
44
|
- - ~>
|
29
45
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
46
|
+
version: 0.5.5
|
31
47
|
- !ruby/object:Gem::Dependency
|
32
48
|
name: yard
|
33
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,6 +108,22 @@ dependencies:
|
|
92
108
|
- - ~>
|
93
109
|
- !ruby/object:Gem::Version
|
94
110
|
version: 0.9.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.10.1
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 0.10.1
|
95
127
|
description: Gem for interacting with the Zerigo DNS REST API.
|
96
128
|
email: support@zerigo.com
|
97
129
|
executables: []
|
@@ -101,11 +133,19 @@ extra_rdoc_files:
|
|
101
133
|
files:
|
102
134
|
- LICENSE
|
103
135
|
- Rakefile
|
104
|
-
- lib/
|
105
|
-
- lib/zerigodns/
|
136
|
+
- lib/zerigodns/client/response_code.rb
|
137
|
+
- lib/zerigodns/client.rb
|
106
138
|
- lib/zerigodns/config.rb
|
107
139
|
- lib/zerigodns/host.rb
|
108
140
|
- lib/zerigodns/host_template.rb
|
141
|
+
- lib/zerigodns/middleware/error_handler.rb
|
142
|
+
- lib/zerigodns/middleware/xml.rb
|
143
|
+
- lib/zerigodns/middleware/zerigo_auth.rb
|
144
|
+
- lib/zerigodns/middleware.rb
|
145
|
+
- lib/zerigodns/resource/attributes.rb
|
146
|
+
- lib/zerigodns/resource/naming.rb
|
147
|
+
- lib/zerigodns/resource/rest.rb
|
148
|
+
- lib/zerigodns/resource.rb
|
109
149
|
- lib/zerigodns/tools.rb
|
110
150
|
- lib/zerigodns/zone.rb
|
111
151
|
- lib/zerigodns/zone_template.rb
|
data/lib/activeresource-ext.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'active_resource'
|
2
|
-
require 'active_support/core_ext/module'
|
3
|
-
|
4
|
-
module ActiveResource
|
5
|
-
module CaptureHeaders
|
6
|
-
module InstanceMethods
|
7
|
-
private
|
8
|
-
def request_with_headers(method, path, *arguments)
|
9
|
-
request_without_headers(method, path, *arguments).tap do |resp|
|
10
|
-
@headers = resp.to_hash
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.included(receiver)
|
17
|
-
receiver.class_eval do
|
18
|
-
include InstanceMethods
|
19
|
-
alias_method_chain :request, :headers
|
20
|
-
attr :headers
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module RetrieveHeaders
|
26
|
-
module InstanceMethods
|
27
|
-
def last_count
|
28
|
-
@last_count ||= (c = connection.headers['x-query-count']) ? c[0].to_i : nil
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.included(receiver)
|
34
|
-
receiver.class_eval do
|
35
|
-
include InstanceMethods
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
ActiveResource::Connection.send :include, ActiveResource::CaptureHeaders
|
43
|
-
ActiveResource::Base.send :include, ActiveResource::RetrieveHeaders
|
data/lib/zerigodns/base.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module ZerigoDNS
|
2
|
-
class Base < ActiveResource::Base
|
3
|
-
class << self
|
4
|
-
attr_reader :secure
|
5
|
-
alias_method :api_key, :password
|
6
|
-
alias_method :api_key=, :password=
|
7
|
-
def secure=(bool)
|
8
|
-
@secure=bool
|
9
|
-
self.site = @secure ? 'https://ns.zerigo.com/api/1.1/' : 'http://ns.zerigo.com/api/1.1/'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
self.site='https://ns.zerigo.com/api/1.1/'
|
14
|
-
self.timeout = 5 # timeout after 5 seconds
|
15
|
-
self.format = ActiveResource::Formats::XmlFormat
|
16
|
-
@secure = true
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
# fix load() so that it no longer clobbers @prefix_options
|
21
|
-
# also fix bug exposed by reload() where attributes is effectively parsed twice, causing the first line to raise an exception the 2nd time
|
22
|
-
def load(attributes, remove_root = false)
|
23
|
-
raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
|
24
|
-
new_prefix_options, attributes = split_options(attributes)
|
25
|
-
@prefix_options.merge!(new_prefix_options)
|
26
|
-
attributes.each do |key, value|
|
27
|
-
@attributes[key.to_s] =
|
28
|
-
case value
|
29
|
-
when Array
|
30
|
-
if value.all?{|v2| v2.kind_of?(ActiveResource::Base)}
|
31
|
-
value.dup rescue value
|
32
|
-
else
|
33
|
-
resource = find_or_create_resource_for_collection(key)
|
34
|
-
value.map { |attrs| attrs.is_a?(String) ? attrs.dup : resource.new(attrs) }
|
35
|
-
end
|
36
|
-
when Hash
|
37
|
-
resource = find_or_create_resource_for(key)
|
38
|
-
resource.new(value)
|
39
|
-
else
|
40
|
-
value.dup rescue value
|
41
|
-
end
|
42
|
-
end
|
43
|
-
self
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|