pdns_api 0.0.5 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c1a4f09dcbfd236725e10397468a523a9b9a19d4
4
- data.tar.gz: 4294fc6d7f39065d5c64bdfe902a290def36b48d
3
+ metadata.gz: fc62c8d844cbb2661dc1f19f56e6a12b4f659095
4
+ data.tar.gz: 28c1046f94f11236f1c4ab43ecce060976351104
5
5
  SHA512:
6
- metadata.gz: 5ddabc8ebca91f59ddb30cded068d20aba62054266d1c6faf7d89781037bfef3064ba0d046085dd78daecfd085c5a5bbbdd9021e4ba0af590d2fbb06b1073b9f
7
- data.tar.gz: d26e976a7a9e62d8225193d848894337afe5b39a5272b7e78e92bb175cab7ae86f3b79575c6839ba85e0369878d0da815dfc248d66548e6aa9bf9412a29304fd
6
+ metadata.gz: 02ea243ba0cba7ea74b905c6b6475682e94227f0a97899a01d9a4167651440512e73d720baad8b5a804886e6f7c7c9cd4b43a9c1ae8f329b0e399526649b852d
7
+ data.tar.gz: d069a42d616b1b48d65ca6a4f41bd31be5204284308545763b59dbecc982ca0a8c3afb8ba13fce0275e7729440b6c634f1841c328f449428c58987ae538978f2
data/lib/pdns_api/api.rb CHANGED
@@ -1,58 +1,74 @@
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
1
18
  require 'pdns_api/http'
2
19
 
3
- # PDNS API interface
20
+ ##
21
+ #
4
22
  module PDNS
5
- # Class for interacting with the API
23
+ ##
24
+ # The superclass for all PDNS objects.
6
25
  class API
7
- attr_reader :url, :class, :version
8
-
9
- def initialize(args)
10
- @class = :client
11
- @http = PDNS::HTTP.new(args)
12
- @version = @http.version
13
- @parent = self
14
- @url = @http.uri
15
- @info = {}
16
- end
26
+ ##
27
+ # The url of the resource object.
28
+ attr_reader :url
17
29
 
18
- ## Standard manipulation methods
30
+ ##
31
+ # The class of the resource object.
32
+ attr_reader :class
19
33
 
20
- # Get information for this object
34
+ ##
35
+ # Gets the information of this object from the API and use it
36
+ # to update the object's information.
21
37
  def get
22
38
  @info = @http.get @url
23
39
  end
24
40
 
25
- # Delete this object
41
+ ##
42
+ # Deletes this object
26
43
  def delete
27
44
  @http.delete @url
28
45
  end
29
46
 
30
- # Create this object on the server
47
+ ##
48
+ # Creates this object on the server
31
49
  def create(info = nil)
32
50
  info(info)
33
51
  @http.post("#{@parent.url}/#{@class}", @info)
34
52
  end
35
53
 
36
- # Get/set info
54
+ ##
55
+ # Gets and sets the object information.
56
+ # This does not cause an API request.
57
+ #
58
+ # If +info+ is set this method updates the current information.
59
+ #
37
60
  def info(info = nil)
38
61
  return @info if info.nil?
39
62
 
40
63
  @info.merge!(info)
41
64
  end
42
65
 
43
- ## Helper methods
44
-
66
+ ##
67
+ # Ensures the object is an array.
68
+ # If it is not, an array containing the item is returned
45
69
  def ensure_array(item)
46
70
  return item if item.is_a? Array
47
71
  [item]
48
72
  end
49
-
50
- def self.hash_sym_to_string(hash)
51
- hash.map { |symbol, value| [symbol.to_s, value] }.to_h
52
- end
53
-
54
- def self.hash_string_to_sym(hash)
55
- hash.map { |string, value| [string.to_sym, value] }.to_h
56
- end
57
73
  end
58
74
  end
@@ -1,14 +1,54 @@
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
1
18
  require 'pdns_api/version'
2
19
  require 'pdns_api/api'
3
20
  require 'pdns_api/server'
4
21
 
5
- # PDNS client
22
+ ##
23
+ #
6
24
  module PDNS
7
- # Client
25
+ ##
26
+ # Class for interaction with the top level API.
8
27
  class Client < API
28
+ ##
29
+ # The PowerDNS API version in use.
9
30
  attr_reader :version
10
31
 
11
- ## Main methods
32
+ ##
33
+ # Creates a client object.
34
+ # +args+ is used to create an HTTP object,
35
+ # which is used by all created objects.
36
+ def initialize(args)
37
+ @class = :client
38
+ @http = PDNS::HTTP.new(args)
39
+ @version = @http.version
40
+ @parent = self
41
+ @url = @http.uri
42
+ @info = {}
43
+ end
44
+
45
+ ##
46
+ # Returns existing or creates a +Server+ object.
47
+ #
48
+ # If +id+ is not set the current servers are returned in a hash
49
+ # containing +Server+ objects.
50
+ #
51
+ # If +id+ is set a +Server+ object with the provided ID is returned.
12
52
  def servers(id = nil)
13
53
  return Server.new(@http, self, id) unless id.nil?
14
54
 
@@ -1,9 +1,41 @@
1
- # PDNS Server config
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ ##
19
+ #
2
20
  module PDNS
3
- # Server config
21
+ ##
22
+ # Configuration option for a DNS Server.
4
23
  class Config < API
5
- attr_accessor :name, :value
24
+ ##
25
+ # The name of the configuration option.
26
+ attr_accessor :name
27
+
28
+ ##
29
+ # The value of the configuration option.
30
+ attr_accessor :value
6
31
 
32
+ ##
33
+ # Creates a configuration option object.
34
+ #
35
+ # - +http+: An HTTP object for interaction with the PowerDNS server.
36
+ # - +parent+: This object's parent.
37
+ # - +name+: Name of the configuration option.
38
+ # - +value+: Optional value of the configuration option.
7
39
  def initialize(http, parent, name, value = nil)
8
40
  @class = :config
9
41
  @http = http
@@ -14,21 +46,31 @@ module PDNS
14
46
  value(@value)
15
47
  end
16
48
 
17
- ## Simple interfaces to metadata
18
- # Get/set config value
49
+ ##
50
+ # Gets or sets the +value+ attribute.
51
+ #
52
+ # If +value+ is not set the current +value+ is returned.
53
+ # If +value+ is set the object's +value+ is updated and +info+ is set and returned
19
54
  def value(value = nil)
20
- return @info[:value] if value.nil?
55
+ return @value if value.nil?
21
56
  @value = value
22
57
  @info = { type: 'ConfigSetting', name: @name, value: value }
23
58
  end
24
59
 
25
- # Get configuration value
60
+ ##
61
+ # Gets the current information.
62
+ # This also updates +value+.
26
63
  def get
27
- res = @http.get(@url)
28
- return value if res.key? :value
64
+ res = @http.get @url
65
+ value(res[:value]) if res.key? :value
66
+ res
29
67
  end
30
68
 
31
- # Change configuration
69
+ ##
70
+ # Updates the object on the server.
71
+ #
72
+ # If +value+ is set, the current +value+ is used.
73
+ # If +value+ is not set, +value+ is updated and then used.
32
74
  def change(value = nil)
33
75
  value(value)
34
76
  @http.put(@url, @info)
@@ -1,7 +1,33 @@
1
- # PDNS Zone CryptoKeys
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ ##
19
+ #
2
20
  module PDNS
3
- # Zone CryptoKey
21
+ ##
22
+ # Cryptokey for a zone.
4
23
  class CryptoKey < API
24
+ ##
25
+ # Creates a cryptokey object.
26
+ #
27
+ # - +http+: An HTTP object for interaction with the PowerDNS server.
28
+ # - +parent+: This object's parent.
29
+ # - +id+: Identifier of the cryptokey.
30
+ # - +info+: Optional information about the cryptokey.
5
31
  def initialize(http, parent, id, info = {})
6
32
  @class = :cryptokeys
7
33
  @http = http
@@ -11,9 +37,10 @@ module PDNS
11
37
  @url = "#{parent.url}/#{@class}/#{id}"
12
38
  end
13
39
 
14
- ## Simple interfaces to metadata
15
-
16
- # Change cryptokey information
40
+ ##
41
+ # Changes cryptokey information
42
+ #
43
+ # +rrset+ is used as changeset for the update.
17
44
  def change(rrsets)
18
45
  @http.put(@url, rrsets)
19
46
  end
data/lib/pdns_api/http.rb CHANGED
@@ -1,10 +1,47 @@
1
- # PDNS HTTP API interface
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ ##
19
+ #
2
20
  module PDNS
3
- # Class for doing HTTP requests
21
+ ##
22
+ # Class for connecting to the PowerDNS API.
4
23
  class HTTP
24
+ ##
25
+ # The headers used for requests.
5
26
  attr_accessor :headers
27
+
28
+ ##
29
+ # The PowerDNS API version in use.
6
30
  attr_reader :version
7
31
 
32
+ ##
33
+ # Creates a PDNS connection.
34
+ #
35
+ # +args+ is a a hash which should include:
36
+ # - +:host+: hostname or IP address of the PowerDNS server.
37
+ # - +:key+: API key for the PowerDNS server.
38
+ #
39
+ # It may include:
40
+ # - +:port+: Port the server listens on. Defaults to +8081+.
41
+ # - +:version+: Version of the API to use. Defaults to +1+.
42
+ # The version of the API depends on the version of PowerDNS.
43
+ #
44
+ # TODO: retrieve endpoint from +/api+ if version is not provided.
8
45
  def initialize(args)
9
46
  @host = args[:host]
10
47
  @key = args[:key]
@@ -13,25 +50,17 @@ module PDNS
13
50
  @headers = { 'X-API-Key' => @key }
14
51
  end
15
52
 
53
+ ##
54
+ # Returns the correct URI for a request.
55
+ # This depends on the API version.
16
56
  def uri(request = '')
17
57
  base = ''
18
- base = "/api/v#{@version}" unless @version == 0 || request[0..4] == '/api/'
58
+ base = "/api/v#{@version}" unless @version == 0 || request[0..3] == '/api'
19
59
  base + request
20
60
  end
21
61
 
22
- # Create the right method object
23
- def http_method(method, uri)
24
- # Create the right request
25
- case method
26
- when 'GET' then Net::HTTP::Get.new(uri, @headers)
27
- when 'PATCH' then Net::HTTP::Patch.new(uri, @headers)
28
- when 'POST' then Net::HTTP::Post.new(uri, @headers)
29
- when 'PUT' then Net::HTTP::Put.new(uri, @headers)
30
- when 'DELETE' then Net::HTTP::Delete.new(uri, @headers)
31
- else abort('Unknown method: ' + method)
32
- end
33
- end
34
-
62
+ ##
63
+ # Decodes the response from the server.
35
64
  def response_decode(response)
36
65
  return {} if response.body.nil?
37
66
 
@@ -43,17 +72,21 @@ module PDNS
43
72
  end
44
73
  end
45
74
 
46
- # Do an HTTP request
47
- def http(method, request, body = nil)
75
+ ##
76
+ # Does an HTTP request and returns the response.
77
+ # Parameters are:
78
+ # - +net+: Net::HTTP method object to use in request.
79
+ # - +body+: Optional body of the request.
80
+ # Returns the decoded response.
81
+ def http(net, body = nil)
82
+ # Debug output
83
+ puts 'Body: ' + body.to_json if ENV['DEBUG']
84
+
48
85
  # Start an HTTP connection
49
86
  begin
50
87
  response = Net::HTTP.start(@host, @port) do |http|
51
- # Create uri & request
52
- uri = uri(request)
53
- req = http_method(method, uri)
54
-
55
88
  # Do the request
56
- http.request(req, body.to_json)
89
+ http.request(net, body.to_json)
57
90
  end
58
91
  rescue StandardError, Timeout::Error => e
59
92
  abort("Error: #{e}")
@@ -62,29 +95,49 @@ module PDNS
62
95
  response_decode(response)
63
96
  end
64
97
 
65
- # Do a DELETE request
98
+ ##
99
+ # Does an HTTP +DELETE+ request to +uri+.
100
+ # Returns the decoded response.
66
101
  def delete(uri)
67
- http('DELETE', uri)
102
+ uri = uri(uri)
103
+ net = Net::HTTP::Delete.new(uri, @headers)
104
+ http(net)
68
105
  end
69
106
 
70
- # Do a GET request
107
+ ##
108
+ # Does an HTTP +GET+ request to +uri+.
109
+ # Returns the decoded response.
71
110
  def get(uri)
72
- http('GET', uri)
111
+ uri = uri(uri)
112
+ net = Net::HTTP::Get.new(uri, @headers)
113
+ http(net)
73
114
  end
74
115
 
75
- # Do a PATCH request
116
+ ##
117
+ # Does an HTTP +PATCH+ request to +uri+.
118
+ # Returns the decoded response.
76
119
  def patch(uri, body = nil)
77
- http('PATCH', uri, body)
120
+ uri = uri(uri)
121
+ net = Net::HTTP::Patch.new(uri, @headers)
122
+ http(net, body)
78
123
  end
79
124
 
80
- # Do a POST request
125
+ ##
126
+ # Does an HTTP +POST+ request to +uri+.
127
+ # Returns the decoded response.
81
128
  def post(uri, body = nil)
82
- http('POST', uri, body)
129
+ uri = uri(uri)
130
+ net = Net::HTTP::Post.new(uri, @headers)
131
+ http(net, body)
83
132
  end
84
133
 
85
- # Do a PUT request
134
+ ##
135
+ # Does an HTTP +PUT+ request to +uri+.
136
+ # Returns the decoded response.
86
137
  def put(uri, body = nil)
87
- http('PUT', uri, body)
138
+ uri = uri(uri)
139
+ net = Net::HTTP::Put.new(uri, @headers)
140
+ http(net, body)
88
141
  end
89
142
  end
90
143
  end
@@ -1,37 +1,82 @@
1
- # PDNS Zone Metadata
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ ##
19
+ #
2
20
  module PDNS
3
- # Zone Metadata
21
+ ##
22
+ # Metadata for a zone.
4
23
  class Metadata < API
5
- def initialize(http, parent, kind, info = {})
24
+ ##
25
+ # The kind of metadata.
26
+ attr_accessor :kind
27
+
28
+ ##
29
+ # The value of the metadata.
30
+ attr_accessor :value
31
+
32
+ ##
33
+ # Creates a configuration option object.
34
+ #
35
+ # - +http+: An HTTP object for interaction with the PowerDNS server.
36
+ # - +parent+: This object's parent.
37
+ # - +kind+: Name of the metadata.
38
+ # - +value+: Optional value of the metadata.
39
+ def initialize(http, parent, kind, value = [])
6
40
  @class = :metadata
7
41
  @http = http
8
42
  @parent = parent
9
43
  @kind = kind
10
- @info = info
11
- @url = "#{parent.url}/metadata/#{kind}"
44
+ @url = "#{parent.url}/#{@class}/#{kind}"
45
+ @value = value.get if value.empty?
46
+ value(@value)
12
47
  end
13
48
 
14
- ## Simple interfaces to metadata
15
-
16
- # Set the metadata value
49
+ ##
50
+ # Gets or sets the +value+ attribute.
51
+ #
52
+ # If +value+ is not set the current +value+ is returned.
53
+ # If +value+ is set the object's +value+ is updated and +info+ is set and returned.
17
54
  def value(value = nil)
18
55
  return @info[:metadata] if value.nil?
19
56
 
20
57
  # Convert to array if value is string
21
- value = [value] if value.is_a? String
58
+ value = ensure_array(value)
22
59
 
23
- # Set info
24
- @info = { type: 'Metadata', kind: @kind, metadata: value }
60
+ # Set value and info
61
+ @value = value
62
+ @info = { type: 'Metadata', kind: @kind, metadata: value }
25
63
  end
26
64
 
27
- # Retrieve metadata value
65
+ ##
66
+ # Gets the current information.
67
+ # This also updates +value+.
28
68
  def get
29
69
  res = @http.get @url
30
- return value if res.key? :value
70
+ value(res[:value]) if res.key? :value
71
+ res
31
72
  end
32
73
 
33
- # Change metadata
34
- def change(value)
74
+ ##
75
+ # Updates the object on the server.
76
+ #
77
+ # If +value+ is set, the current +value+ is used.
78
+ # If +value+ is not set, +value+ is updated and then used.
79
+ def change(value = nil)
35
80
  value(value)
36
81
  @http.put(@url, @info)
37
82
  end
@@ -1,9 +1,37 @@
1
- # PDNS Server Override
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ ##
19
+ #
2
20
  module PDNS
3
- # Server override
21
+ ##
22
+ # Override for a server.
4
23
  class Override < API
5
- attr_reader :id, :url, :info
24
+ ##
25
+ # The ID of the override.
26
+ attr_reader :id
6
27
 
28
+ ##
29
+ # Creates a configuration option object.
30
+ #
31
+ # - +http+: An HTTP object for interaction with the PowerDNS server.
32
+ # - +parent+: This object's parent.
33
+ # - +id+: ID of the override.
34
+ # - +info+: Optional information of the override.
7
35
  def initialize(http, parent, id, info = {})
8
36
  @class = :overrides
9
37
  @http = http
@@ -13,9 +41,10 @@ module PDNS
13
41
  @url = "#{parent.url}/#{@class}/#{id}"
14
42
  end
15
43
 
16
- ## Simple interfaces to overrides
17
-
18
- # Change override settings
44
+ ##
45
+ # Changes override information.
46
+ #
47
+ # +rrset+ is used as changeset for the update.
19
48
  def change(rrsets)
20
49
  @http.put(@url, rrsets)
21
50
  end
@@ -1,13 +1,41 @@
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
1
18
  require 'pdns_api/config'
2
19
  require 'pdns_api/override'
3
20
  require 'pdns_api/zone'
4
21
 
5
- # PDNS Server
22
+ ##
23
+ #
6
24
  module PDNS
7
- # PDNS Server
25
+ ##
26
+ # Server object for accessing data for a particular server.
8
27
  class Server < API
28
+ ##
29
+ # The ID of the server.
9
30
  attr_reader :id
10
31
 
32
+ ##
33
+ # Creates a Server object.
34
+ #
35
+ # - +http+: An HTTP object for interaction with the PowerDNS server.
36
+ # - +parent+: This object's parent.
37
+ # - +id+: ID of the server.
38
+ # - +info+: Optional information of the server.
11
39
  def initialize(http, parent, id, info = {})
12
40
  @class = :servers
13
41
  @http = http
@@ -17,36 +45,45 @@ module PDNS
17
45
  @info = info
18
46
  end
19
47
 
20
- ## Server interfaces
21
- # TODO: /servers/:server_id: ?
22
-
23
- ## Server actions
24
-
48
+ ##
49
+ # Flushes cache for +domain+.
25
50
  def cache(domain)
26
51
  # TODO: #{url}/cache/flush?domain=:domain: PUT
27
52
  end
28
53
 
54
+ ##
55
+ # Searches through the server's log with +search_term+.
29
56
  def search_log(search_term)
30
57
  # TODO: /servers/:server_id/search-log?q=:search_term: GET
31
58
  end
32
59
 
60
+ ##
61
+ # Gets the statistics for the server.
33
62
  def statistics
34
63
  # TODO: /servers/:server_id/statistics: GET
35
64
  end
36
65
 
66
+ ##
67
+ # Manipulates the query tracing log.
37
68
  def trace
38
69
  # TODO: /servers/:server_id/trace: GET, PUT
39
70
  end
40
71
 
72
+ ##
73
+ # Manipulates failure logging.
41
74
  def failures
42
75
  # TODO: /servers/:server_id/failures: GET, PUT
43
76
  end
44
77
 
45
- ## Server resources
46
-
47
- # Get or set server config
78
+ ##
79
+ # Returns existing configuration or creates a +Config+ object.
80
+ #
81
+ # If +name+ is not set the current configuration is returned in a hash.
82
+ #
83
+ # If +name+ is set a +Config+ object is returned using the provided +name+.
84
+ # If +value+ is set as well, a complete config object is returned.
48
85
  def config(name = nil, value = nil)
49
- return Config.new(@http, self, name, value).create unless name.nil? || value.nil?
86
+ return Config.new(@http, self, name, value) unless name.nil? || value.nil?
50
87
  return Config.new(@http, self, name) unless name.nil?
51
88
 
52
89
  # Get all current configuration
@@ -54,7 +91,13 @@ module PDNS
54
91
  config.map { |c| [c[:name], c[:value]] }.to_h
55
92
  end
56
93
 
57
- # Get or set server overrides, not yet implemented
94
+ ##
95
+ # Returns existing or creates an +Override+ object.
96
+ #
97
+ # If +id+ is not set the current servers are returned in a hash
98
+ # containing +Override+ objects.
99
+ #
100
+ # If +id+ is set an +Override+ object with the provided ID is returned.
58
101
  def overrides(id = nil)
59
102
  return Override.new(@http, self, id) unless id.nil?
60
103
 
@@ -62,9 +105,15 @@ module PDNS
62
105
  overrides.map { |o| [o[:id], Override.new(@http, self, o[:id], o)] }.to_h
63
106
  end
64
107
 
65
- # Get zones or create one
66
- def zones(zone_id = nil)
67
- return Zone.new(@http, self, zone_id) unless zone_id.nil?
108
+ ##
109
+ # Returns existing or creates a +Zone+ object.
110
+ #
111
+ # If +id+ is not set the current servers are returned in a hash
112
+ # containing +Zone+ objects.
113
+ #
114
+ # If +id+ is set a +Server+ object with the provided ID is returned.
115
+ def zones(id = nil)
116
+ return Zone.new(@http, self, id) unless id.nil?
68
117
 
69
118
  zones = @http.get("#{@url}/zones")
70
119
  zones.map { |z| [z[:id], Zone.new(@http, self, z[:id], z)] }.to_h
@@ -1,4 +1,24 @@
1
- # PDNS version
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ ##
19
+ #
2
20
  module PDNS
3
- VERSION = '0.0.5'.freeze
21
+ ##
22
+ # The version of +pdns_api+.
23
+ VERSION = '0.1.0'.freeze
4
24
  end
data/lib/pdns_api/zone.rb CHANGED
@@ -1,12 +1,40 @@
1
- # PDNS Zone
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
18
+ require 'pdns_api/metadata'
19
+ require 'pdns_api/cryptokey'
20
+
21
+ ##
22
+ #
2
23
  module PDNS
3
- require_relative 'metadata'
4
- require_relative 'cryptokey'
5
-
6
- # Zone
24
+ ##
25
+ # Zone on a server.
7
26
  class Zone < API
27
+ ##
28
+ # The ID of the zone.
8
29
  attr_reader :id
9
30
 
31
+ ##
32
+ # Creates a Zone object.
33
+ #
34
+ # - +http+: An HTTP object for interaction with the PowerDNS server.
35
+ # - +parent+: This object's parent.
36
+ # - +id+: ID of the zone.
37
+ # - +info+: Optional information of the zone.
10
38
  def initialize(http, parent, id, info = {})
11
39
  @class = :zones
12
40
  @http = http
@@ -16,47 +44,113 @@ module PDNS
16
44
  @url = "#{parent.url}/#{@class}/#{id}"
17
45
  end
18
46
 
19
- ## Zone interfaces
20
-
21
- # Modifies present RRsets and comments.
47
+ ##
48
+ # Modifies information (records) of a zone.
49
+ # Also formats records to match the API requirements.
22
50
  def modify(rrsets)
23
- rrsets.map! { |rrset| format_records(rrset) if rrset.key?(:records) }
51
+ rrsets.map! do |rrset|
52
+ rrset = format_records(rrset) if rrset.key?(:records)
53
+ rrset
54
+ end
24
55
 
25
56
  @http.patch(@url, rrsets: rrsets)
26
57
  end
27
58
 
59
+ ##
28
60
  # Modifies basic zone data (metadata).
61
+ # +rrset+ is used as changeset for the update.
29
62
  def change(rrsets)
30
63
  @http.put(@url, rrsets)
31
64
  end
32
65
 
33
- ## Zone actions
34
-
35
- # Notify slaves for a zone
66
+ ##
67
+ # Notifies slaves for a zone.
68
+ # Only works for domains for which the server is a master.
69
+ # Returns the result of the notification.
36
70
  def notify
37
71
  @http.put "#{@url}/notify"
38
72
  end
39
73
 
40
- # Get the AXFR for a zone
74
+ ##
75
+ # Retrieves the data for a zone.
76
+ # Only works for domains for which the server is a slave.
77
+ # Returns the result of the retrieval.
41
78
  def axfr_retrieve
42
79
  @http.put "#{@url}/axfr-retrieve"
43
80
  end
44
81
 
45
- # Export a zone
82
+ ##
83
+ # Exports the zone as a bind zone file.
84
+ # Returns a hash containing the zone in +:result+.
46
85
  def export
47
- @http.get "#{@url}/export"
86
+ data = @http.get "#{@url}/export"
87
+ data.delete(:error) if data[:error] == 'Non-JSON response'
88
+ data
48
89
  end
49
90
 
50
- # Check a zone
91
+ ##
92
+ # Checks the zone for errors.
93
+ # Returns the result of the check.
51
94
  def check
52
95
  @http.get "#{@url}/check"
53
96
  end
54
97
 
55
- ## Zone resources
98
+ ##
99
+ # Adds records to the ones already existing in the zone.
100
+ #
101
+ # The existing records are retrieved and merged with the ones given in +rrsets+.
102
+ def add(*rrsets)
103
+ # Get current zone data
104
+ data = get
105
+
106
+ # Return any errors
107
+ return data if data.key?(:error)
108
+
109
+ # Add these records to the rrset
110
+ rrsets.map! do |rrset|
111
+ # Get current data from rrset
112
+ current = current_records(rrset, data)
113
+
114
+ # Merge data
115
+ rrset[:records] = current + ensure_array(rrset[:records])
116
+ rrset[:changetype] = 'REPLACE'
117
+ rrset
118
+ end
119
+ modify(rrsets)
120
+ end
121
+
122
+ ##
123
+ # Updates (replaces) records for a name/type combination in the zone.
124
+ def update(*rrsets)
125
+ # Set type and format records
126
+ rrsets.map! do |rrset|
127
+ rrset[:changetype] = 'REPLACE'
128
+ rrset[:records] = ensure_array(rrset[:records])
129
+ rrset
130
+ end
131
+ modify(rrsets)
132
+ end
133
+
134
+ ##
135
+ # Removes all records for a name/type combination from the zone.
136
+ def remove(*rrsets)
137
+ # Set type and format records
138
+ rrsets.map! do |rrset|
139
+ rrset[:changetype] = 'DELETE'
140
+ rrset
141
+ end
142
+ modify(rrsets)
143
+ end
56
144
 
57
- # Manipulate metadata for a zone
145
+ ##
146
+ # Returns existing metadata or creates a +Metadata+ object.
147
+ #
148
+ # If +kind+ is not set the current metadata is returned in a hash.
149
+ #
150
+ # If +kind+ is set a +Metadata+ object is returned using the provided +kind+.
151
+ # If +value+ is set as well, a complete Metadata object is returned.
58
152
  def metadata(kind = nil, value = nil)
59
- return Metadata.new(@http, self, kind, value).create unless kind.nil? || value.nil?
153
+ return Metadata.new(@http, self, kind, value) unless kind.nil? || value.nil?
60
154
  return Metadata.new(@http, self, kind) unless kind.nil?
61
155
 
62
156
  # Get all current metadata
@@ -66,10 +160,16 @@ module PDNS
66
160
  return metadata if metadata.is_a?(Hash) && metadata.key?(:error)
67
161
 
68
162
  # Convert metadata to hash
69
- metadata.map! { |c| [c[:kind], c[:metadata]] }.to_h
163
+ metadata.map { |c| [c[:kind], c[:metadata]] }.to_h
70
164
  end
71
165
 
72
- # Change cryptokeys for a zone
166
+ ##
167
+ # Returns existing or creates a +CryptoKey+ object.
168
+ #
169
+ # If +id+ is not set the current servers are returned in a hash
170
+ # containing +CryptoKey+ objects.
171
+ #
172
+ # If +id+ is set a +CryptoKey+ object with the provided ID is returned.
73
173
  def cryptokeys(id = nil)
74
174
  return CryptoKey.new(@http, self, id) unless id.nil?
75
175
 
@@ -77,11 +177,13 @@ module PDNS
77
177
  cryptokeys = @http.get("#{@url}/cryptokeys")
78
178
 
79
179
  # Convert cryptokeys to hash
80
- cryptokeys.map! { |c| [c[:id], CryptoKey.new(@http, self, c[:id], c)] }.to_h
180
+ cryptokeys.map { |c| [c[:id], CryptoKey.new(@http, self, c[:id], c)] }.to_h
81
181
  end
82
182
 
83
- ## Additional methods
183
+ private
84
184
 
185
+ ##
186
+ # Formats a single record to match what is required by the API.
85
187
  def format_single_record(record)
86
188
  # Ensure content
87
189
  record = { content: record } if record.is_a? String
@@ -95,11 +197,9 @@ module PDNS
95
197
  record
96
198
  end
97
199
 
98
- # Add required items to records in an rrset
200
+ ##
201
+ # Format the records in an RRset te match what is required by the API.
99
202
  def format_records(rrset)
100
- # Abort if rrset is something else than an array
101
- abort('Error: records needs to be array') unless rrset[:records].is_a? Array
102
-
103
203
  # Ensure existence of required keys
104
204
  rrset[:records].map! do |record|
105
205
  # Format the record content
@@ -117,69 +217,26 @@ module PDNS
117
217
  rrset
118
218
  end
119
219
 
120
- # Add records to the ones already existing
121
- # Only works from API v1 and up
122
- def add(*rrsets)
123
- # Get current zone data
124
- data = get
220
+ ##
221
+ # Returns the records matching the ones in +rrset+ from +data+.
222
+ # +data+ should be the result from +get+.
223
+ def current_records(rrset, data)
224
+ # Get the records from the data, `records` is v0, `rrset` is v1
225
+ records = data[:records] || data[:rrset]
125
226
 
126
- # Return any errors
127
- return data if data.key?(:error)
128
-
129
- # Run v0 version
130
- return add_v0(rrsets, data) if @http.version == 0
227
+ # Select records matching type/name
228
+ current = records.select { |r| r[:name] == rrset[:name] && r[:type] == rrset[:type] }
131
229
 
132
- # Add these records to the rrset
133
- rrsets.map! do |rrset|
134
- # Get current data from rrset
135
- current = data[:rrsets].select { |r| r[:name] == rrset[:name] && r[:type] == rrset[:type] }
136
-
137
- # Merge data
138
- rrset[:records] = current.first[:records] + ensure_array(rrset[:records])
139
- rrset[:changetype] = 'REPLACE'
140
- rrset
230
+ # Get only content/disabled for API v0
231
+ if @http.version == 0
232
+ current.map! { |record| { content: record[:content], disabled: record[:disabled] } }
141
233
  end
142
- modify(rrsets)
143
- end
144
234
 
145
- # Add records to the ones already existing
146
- # Only works from API v1 and down
147
- def add_v0(rrsets, data)
148
- # Add these records to the rrset
149
- rrsets.map! do |rrset|
150
- current = data[:records].select do |r|
151
- r[:name] == rrset[:name] && r[:type] == rrset[:type]
152
- end
153
- current.map! do |record|
154
- {
155
- content: record[:content],
156
- disabled: record[:disabled]
157
- }
158
- end
159
- rrset[:records] = current + ensure_array(rrset[:records])
160
- rrset[:changetype] = 'REPLACE'
161
- rrset
162
- end
163
- modify(rrsets)
164
- end
165
-
166
- def update(*rrsets)
167
- # Set type and format records
168
- rrsets.map! do |rrset|
169
- rrset[:changetype] = 'REPLACE'
170
- rrset[:records] = ensure_array(rrset[:records])
171
- rrset
172
- end
173
- modify(rrsets)
174
- end
235
+ # For API v1 there is only one element containing all records
236
+ current = current.first[:records] unless @http.version == 0
175
237
 
176
- def remove(*rrsets)
177
- # Set type and format records
178
- rrsets.map! do |rrset|
179
- rrset[:changetype] = 'DELETE'
180
- rrset
181
- end
182
- modify(rrsets)
238
+ # Return the records
239
+ current
183
240
  end
184
241
  end
185
242
  end
data/lib/pdns_api.rb CHANGED
@@ -1,11 +1,33 @@
1
+ # Copyright 2016 - Silke Hofstra
2
+ #
3
+ # Licensed under the EUPL, Version 1.1 or -- as soon they will be approved by
4
+ # the European Commission -- subsequent versions of the EUPL (the "Licence");
5
+ # You may not use this work except in compliance with the Licence.
6
+ # You may obtain a copy of the Licence at:
7
+ #
8
+ # https://joinup.ec.europa.eu/software/page/eupl
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the Licence is distributed on an "AS IS" basis,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ # express or implied.
14
+ # See the Licence for the specific language governing
15
+ # permissions and limitations under the Licence.
16
+ #
17
+
1
18
  require 'json'
2
19
  require 'net/http'
3
20
 
4
- # PDNS module
21
+ ##
22
+ # Module for interaction with the PowerDNS HTTP API.
5
23
  module PDNS
6
24
  require_relative 'pdns_api/client'
7
25
 
26
+ ##
27
+ # Class for creation of PDNS objects.
8
28
  class << self
29
+ ##
30
+ # Create a PDNS::Client object.
9
31
  def new(args)
10
32
  Client.new(args)
11
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdns_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Silke Hofstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-24 00:00:00.000000000 Z
11
+ date: 2016-05-30 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A gem for manipulation of DNS through the PowerDNS API
14
14
  email: silke@slxh.eu
@@ -29,7 +29,7 @@ files:
29
29
  - lib/pdns_api/zone.rb
30
30
  homepage: https://github.com/silkeh/ruby-pdns_api
31
31
  licenses:
32
- - GPLv3+
32
+ - EUPL
33
33
  metadata: {}
34
34
  post_install_message:
35
35
  rdoc_options: []