zerigodns 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|