smart_proxy_dns_infoblox 1.0.0 → 1.2.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
  SHA256:
3
- metadata.gz: f0cd133f133a42e4d8bb583d7566d3ef78caaf9f088a95f589c950f5abc73d99
4
- data.tar.gz: b6a90cd39ac38ff25d40c557a4f615b6d4339a3841015157dfb99525890d7973
3
+ metadata.gz: b3a0500e2d29b0e17690364666974cec3258457b8806c4ff743fc85179e9c67b
4
+ data.tar.gz: df9c2f18edb7a29ce56090ef1ca03f34e6454ec88d9c492c1e23d274e03717bb
5
5
  SHA512:
6
- metadata.gz: de50121fbebd43ca08d483bd1332988e7c2ab6b4659d7605b16de613ac6cbbd6b1190c680b449cc4c11073187d148c4cfe32818a9a2b2a1fa7d48a0137a574a8
7
- data.tar.gz: 63865b57418f08551a82af80ff526c62b3c78ba364bfe9136d9f0dc8bea8e7489aa23fc3d6af80c596940609ac09ec25f58e66a3a2b75352e771e5854f170a12
6
+ metadata.gz: eb8d100b528571220d9f08cda5d9772819114a2712bc2cfff82f5352d92bdeacd5163bad9465c51d6497aff9c346343d66207c7b2f579ce4c4eeee478af137bd
7
+ data.tar.gz: 916a54d5a0aa1610a4a9d034c27c913f922ad29172a10bf503f3403db182c91d2b20cbc3d250dc04a084ab8936d0f91f07cbdc454047d31fcfcde54f1b14adef
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # SmartProxyDnsInfoblox
2
2
 
3
- [![Build Status](https://travis-ci.org/theforeman/smart_proxy_dns_infoblox.svg?branch=master)](https://travis-ci.org/theforeman/smart_proxy_dns_infoblox)
4
-
5
3
  This plugin adds a new DNS provider for managing records in MyService.
6
4
 
7
5
  ## Installation
@@ -11,12 +11,14 @@ module Proxy::Dns::Infoblox
11
11
  def do_create(name, value, type)
12
12
  method = "ib_create_#{type.downcase}_record".to_sym
13
13
  raise(Proxy::Dns::Error, "Creation of #{type} records not implemented") unless respond_to?(method, true)
14
+
14
15
  send(method, name, value)
15
16
  end
16
17
 
17
18
  def do_remove(name, type)
18
19
  method = "ib_remove_#{type.downcase}_record".to_sym
19
20
  raise(Proxy::Dns::Error, "Deletion of #{type} records not implemented") unless respond_to?(method, true)
21
+
20
22
  send(method, name)
21
23
  end
22
24
 
@@ -24,11 +26,17 @@ module Proxy::Dns::Infoblox
24
26
  # 0 = already exists and do nothing
25
27
  # 1 = conflict and error out
26
28
  def record_conflicts_ip(fqdn, type, address)
27
- method = "ib_find_#{type.name.split('::').last.downcase}_record".to_sym
29
+ if type == Resolv::DNS::Resource::IN::PTR
30
+ ip = IPAddr.new(ptr_to_ip(address))
31
+ method = "ib_find_#{type.name.split('::').last.downcase}#{ip.ipv4? ? 4 : 6}_record".to_sym
32
+ else
33
+ method = "ib_find_#{type.name.split('::').last.downcase}_record".to_sym
34
+ end
28
35
  raise(Proxy::Dns::Error, "Finding of #{type} records not implemented") unless respond_to?(method, true)
29
36
 
30
37
  return -1 if send(method, fqdn).empty?
31
38
  return 0 if send(method, fqdn, address).any?
39
+
32
40
  1
33
41
  end
34
42
 
@@ -62,15 +70,31 @@ module Proxy::Dns::Infoblox
62
70
  Infoblox::AAAArecord.find(connection, params)
63
71
  end
64
72
 
65
- def ib_find_ptr_record(fqdn, ptr = nil)
73
+ def ib_find_ptr4_record(fqdn, ptr = nil)
66
74
  params = {
67
75
  :_max_results => 1,
68
76
  :view => dns_view,
69
- :ptrdname => fqdn
77
+ :ptrdname => fqdn,
78
+ :'name~' => 'in-addr\.arpa$'
70
79
  }
71
80
  if ptr
72
81
  ip = IPAddr.new(ptr_to_ip(ptr))
73
- params["ipv#{ip.ipv4? ? 4 : 6}addr".to_sym] = ip.to_s
82
+ params[:ipv4addr] = ip.to_s
83
+ params[:name] = ptr
84
+ end
85
+ Infoblox::Ptr.find(connection, params)
86
+ end
87
+
88
+ def ib_find_ptr6_record(fqdn, ptr = nil)
89
+ params = {
90
+ :_max_results => 1,
91
+ :view => dns_view,
92
+ :ptrdname => fqdn,
93
+ :'name~' => 'ip6\.arpa$'
94
+ }
95
+ if ptr
96
+ ip = IPAddr.new(ptr_to_ip(ptr))
97
+ params[:ipv6addr] = ip.to_s
74
98
  params[:name] = ptr
75
99
  end
76
100
  Infoblox::Ptr.find(connection, params)
@@ -136,14 +160,15 @@ module Proxy::Dns::Infoblox
136
160
  end
137
161
 
138
162
  def ib_delete(clazz, params)
139
- record = clazz.find(connection, params.merge(_max_results: 1, view: dns_view)).first
163
+ records = clazz.find(connection, params.merge(view: dns_view))
164
+ raise Proxy::Dns::NotFound, "Cannot find #{clazz.class.name} entry for #{params}" if records.empty?
140
165
 
141
- raise Proxy::Dns::NotFound, "Cannot find #{clazz.class.name} entry for #{params}" if record.nil?
142
- ret_value = record.delete || (raise Proxy::Dns::NotFound, "Cannot find #{clazz.class.name} entry for #{params}")
143
-
144
- ib_clear_dns_cache(record)
166
+ records.each do |record|
167
+ record.delete
168
+ ib_clear_dns_cache(record)
169
+ end
145
170
 
146
- ret_value
171
+ true
147
172
  end
148
173
 
149
174
  def ib_clear_dns_cache(record)
@@ -153,9 +178,9 @@ module Proxy::Dns::Infoblox
153
178
  MemberDns.all(connection).each do |member|
154
179
  member.clear_dns_cache(view: record.view, domain: record.name)
155
180
  end
156
- rescue StandardError => ex
181
+ rescue StandardError => e
157
182
  # Failing to clear the DNS cache should never be an error
158
- logger.warn("Exception #{ex} was raised when clearing DNS cache")
183
+ logger.warn("Exception #{e} was raised when clearing DNS cache")
159
184
  end
160
185
  end
161
186
  end
@@ -2,7 +2,8 @@ module Proxy::Dns::Infoblox
2
2
  class Plugin < ::Proxy::Provider
3
3
  plugin :dns_infoblox, ::Proxy::Dns::Infoblox::VERSION
4
4
 
5
- default_settings :username => 'infoblox', :password => 'infoblox', :dns_server => 'localhost', :dns_view => 'default', :timeout => 60
5
+ default_settings :username => 'infoblox', :password => 'infoblox', :dns_server => 'localhost',
6
+ :dns_view => 'default', :timeout => 60
6
7
 
7
8
  requires :dns, '>= 1.12'
8
9
 
@@ -1,7 +1,7 @@
1
1
  module Proxy
2
2
  module Dns
3
3
  module Infoblox
4
- VERSION = '1.0.0'.freeze
4
+ VERSION = '1.2.0'.freeze
5
5
  end
6
6
  end
7
7
  end
@@ -13,7 +13,7 @@ module Proxy::Dns::Infoblox
13
13
  post_body[:domain] = domain unless domain.nil?
14
14
  post_body[:view] = view unless view.nil?
15
15
 
16
- JSON.parse(connection.post(resource_uri + "?_function=clear_dns_cache", post_body).body)
16
+ JSON.parse(connection.post("#{resource_uri}?_function=clear_dns_cache", post_body).body)
17
17
  end
18
18
  end
19
19
  end
@@ -48,20 +48,31 @@ class InfobloxTest < Test::Unit::TestCase
48
48
  end
49
49
 
50
50
  def test_conflict_ptr_ok
51
- @provider.expects(:ib_find_ptr_record).with("13.202.168.192.in-addr.arpa").returns([])
52
- assert_equal(-1, @provider.record_conflicts_ip("13.202.168.192.in-addr.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
51
+ @provider.expects(:ib_find_ptr4_record).with("test.example.com").returns([])
52
+ assert_equal(-1, @provider.record_conflicts_name("13.202.168.192.in-addr.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
53
+
54
+ @provider.expects(:ib_find_ptr6_record).with("test.example.com").returns([])
55
+ assert_equal(-1, @provider.record_conflicts_name("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
53
56
  end
54
57
 
55
58
  def test_conflict_ptr_already_exists
56
- @provider.expects(:ib_find_ptr_record).with("13.202.168.192.in-addr.arpa").returns([true])
57
- @provider.expects(:ib_find_ptr_record).with("13.202.168.192.in-addr.arpa", "test.example.com").returns([true])
58
- assert_equal(0, @provider.record_conflicts_ip("13.202.168.192.in-addr.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
59
+ @provider.expects(:ib_find_ptr4_record).with("test.example.com").returns([true])
60
+ @provider.expects(:ib_find_ptr4_record).with("test.example.com", "13.202.168.192.in-addr.arpa").returns([true])
61
+ assert_equal(0, @provider.record_conflicts_name("13.202.168.192.in-addr.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
62
+
63
+ @provider.expects(:ib_find_ptr6_record).with("test.example.com").returns([true])
64
+ @provider.expects(:ib_find_ptr6_record).with("test.example.com", "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa").returns([true])
65
+ assert_equal(0, @provider.record_conflicts_name("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
59
66
  end
60
67
 
61
68
  def test_conflict_ptr_conflict
62
- @provider.expects(:ib_find_ptr_record).with("13.202.168.192.in-addr.arpa").returns([false])
63
- @provider.expects(:ib_find_ptr_record).with("13.202.168.192.in-addr.arpa", "test.example.com").returns([false])
64
- assert_equal(1, @provider.record_conflicts_ip("13.202.168.192.in-addr.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
69
+ @provider.expects(:ib_find_ptr4_record).with("test.example.com").returns([false])
70
+ @provider.expects(:ib_find_ptr4_record).with("test.example.com", "13.202.168.192.in-addr.arpa").returns([false])
71
+ assert_equal(1, @provider.record_conflicts_name("13.202.168.192.in-addr.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
72
+
73
+ @provider.expects(:ib_find_ptr6_record).with("test.example.com").returns([false])
74
+ @provider.expects(:ib_find_ptr6_record).with("test.example.com", "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa").returns([false])
75
+ assert_equal(1, @provider.record_conflicts_name("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", Resolv::DNS::Resource::IN::PTR, "test.example.com"))
65
76
  end
66
77
 
67
78
  def test_conflict_cname_ok
@@ -160,6 +171,35 @@ class InfobloxTest < Test::Unit::TestCase
160
171
  @provider.do_remove(ptr, 'PTR')
161
172
  end
162
173
 
174
+ def test_wapi_remove_multi_a_records
175
+ address1 = '192.168.1.11'
176
+ address2 = '192.168.2.22'
177
+ fqdn = 'test.example.com'
178
+
179
+ record1 = Infoblox::Arecord.new name: fqdn, :ipv4addr => address1
180
+ record1.expects(:delete).returns(record1)
181
+ record2 = Infoblox::Arecord.new name: fqdn, :ipv4addr => address2
182
+ record2.expects(:delete).returns(record2)
183
+
184
+ Infoblox::Arecord.expects(:find).returns([record1, record2])
185
+ @provider.do_remove(fqdn, 'A')
186
+ end
187
+
188
+ def test_wapi_remove_multi_ptr_records
189
+ ptr = '1.1.1.10.in-addr.arpa'
190
+ ip = '10.1.1.1'
191
+ fqdn1 = 'test1.example.com'
192
+ fqdn2 = 'test2.example.com'
193
+
194
+ record1 = Infoblox::Ptr.new name: ptr, :ptrdname => fqdn1, :ipv4addr => ip
195
+ record1.expects(:delete).returns(record1)
196
+ record2 = Infoblox::Ptr.new name: ptr, :ptrdname => fqdn2, :ipv4addr => ip
197
+ record2.expects(:delete).returns(record2)
198
+
199
+ Infoblox::Ptr.expects(:find).returns([record1, record2])
200
+ @provider.do_remove(ptr, 'PTR')
201
+ end
202
+
163
203
  def test_wapi_old
164
204
  fqdn = 'test.example.com'
165
205
  record = Infoblox::Arecord.new name: fqdn
@@ -21,8 +21,11 @@ class IntegrationTest < ::Test::Unit::TestCase
21
21
  include Rack::Test::Methods
22
22
 
23
23
  class DnsProviderForTesting < Proxy::Dns::Infoblox::Record
24
+ # This explicitly doesn't want to do anything
25
+ # rubocop:disable Lint/MissingSuper Style/RedundantInitialize
24
26
  def initialize
25
27
  end
28
+ # rubocop:enable Lint/MissingSuper Style/RedundantInitialize
26
29
  end
27
30
 
28
31
  def app
@@ -41,12 +44,20 @@ class IntegrationTest < ::Test::Unit::TestCase
41
44
  assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
42
45
  end
43
46
 
44
- def test_create_ptr_record
45
- @server.expects(:create_ptr_record).with("test.com", "33.33.168.192.in-addr.arpa")
47
+ def test_create_ptr4_record
48
+ @server.expects(:ib_find_ptr4_record).with('test.com').returns([])
49
+ @server.expects(:ib_create_ptr_record).with('33.33.168.192.in-addr.arpa', 'test.com')
46
50
  post '/', :fqdn => 'test.com', :value => '33.33.168.192.in-addr.arpa', :type => 'PTR'
47
51
  assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
48
52
  end
49
53
 
54
+ def test_create_ptr6_record
55
+ @server.expects(:ib_find_ptr6_record).with('test.com').returns([])
56
+ @server.expects(:ib_create_ptr_record).with('1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa', 'test.com')
57
+ post '/', :fqdn => 'test.com', :value => '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa', :type => 'PTR'
58
+ assert last_response.ok?, "Last response was not ok: #{last_response.status} #{last_response.body}"
59
+ end
60
+
50
61
  def test_delete_a_record
51
62
  @server.expects(:remove_a_record).with("test.com")
52
63
  delete '/test.com'
data/test/test_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'mocha/setup'
2
+ require 'mocha/test_unit'
3
3
  require 'json'
4
4
  require 'ostruct'
5
5
 
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_dns_infoblox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Nicholson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-25 00:00:00.000000000 Z
11
+ date: 2024-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rubocop
14
+ name: infoblox
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.50.0
20
- type: :development
19
+ version: '3.0'
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.50.0
26
+ version: '3.0'
27
27
  description: Infoblox DNS provider plugin for Foreman's smart proxy
28
28
  email:
29
29
  - matthew.a.nicholson@gmail.com
@@ -57,19 +57,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: '2.5'
61
61
  required_rubygems_version: !ruby/object:Gem::Requirement
62
62
  requirements:
63
63
  - - ">="
64
64
  - !ruby/object:Gem::Version
65
65
  version: '0'
66
66
  requirements: []
67
- rubygems_version: 3.0.3
67
+ rubygems_version: 3.3.27
68
68
  signing_key:
69
69
  specification_version: 4
70
70
  summary: Infoblox DNS provider plugin for Foreman's smart proxy
71
71
  test_files:
72
- - test/test_helper.rb
73
72
  - test/configuration_test.rb
74
73
  - test/infoblox_test.rb
75
74
  - test/integration_test.rb
75
+ - test/test_helper.rb