smart_proxy_dns_route53 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -4
- data/lib/smart_proxy_dns_route53/dns_route53_main.rb +48 -67
- data/lib/smart_proxy_dns_route53/dns_route53_plugin.rb +5 -3
- data/lib/smart_proxy_dns_route53/dns_route53_version.rb +1 -1
- data/lib/smart_proxy_dns_route53/route53_dependencies.rb +5 -0
- data/test/dns_route53_record_test.rb +36 -43
- metadata +20 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afc68be7898dff76e610ac85e992e403f86d6c92
|
4
|
+
data.tar.gz: e88894baa652431ea063b23287c9f9ff909da377
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64b97a5cbfd2150c4df89b57d86acc26b07c10cc4ca6f630f39533bbfe35ad3e417bf39e998f60b5ec64726fcd7319e5555b3ae05a62c8ca2bac5b11a86dc12b
|
7
|
+
data.tar.gz: 39da40207db0a7083db676da32b085edb38b53c7a63f528a92638c5c4304521995d5e48cdc8210cdf70db5079b4805f4318cd5c64b6618f7eabac2b7fc7b8750
|
data/README.md
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
-
#
|
1
|
+
# Route 53 smart proxy plugin
|
2
2
|
|
3
|
-
This plugin adds a new DNS provider for managing records in Amazon's
|
3
|
+
This plugin adds a new DNS provider for managing records in Amazon's Route 53 service.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
See [How_to_Install_a_Smart-Proxy_Plugin](http://projects.theforeman.org/projects/foreman/wiki/How_to_Install_a_Smart-Proxy_Plugin)
|
8
8
|
for how to install Smart Proxy plugins
|
9
9
|
|
10
|
-
|
10
|
+
## Compatibility
|
11
|
+
|
12
|
+
| Smart Proxy Version | Plugin Version |
|
13
|
+
| ------------------- | --------------:|
|
14
|
+
| >= 1.10, < 1.11 | ~> 1.0 |
|
15
|
+
| >= 1.11 | ~> 2.0 |
|
11
16
|
|
12
17
|
## Configuration
|
13
18
|
|
@@ -15,7 +20,7 @@ To enable this DNS provider, edit `/etc/foreman-proxy/settings.d/dns.yml` and se
|
|
15
20
|
|
16
21
|
:use_provider: dns_route53
|
17
22
|
|
18
|
-
You will need an active Amazon Web Services account and to create a new IAM account with access to manage
|
23
|
+
You will need an active Amazon Web Services account and to create a new IAM account with access to manage Route 53 for the Smart Proxy plugin to work.
|
19
24
|
|
20
25
|
Configuration options for this plugin are in `/etc/foreman-proxy/settings.d/dns_route53.yml` and include:
|
21
26
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dns/dns'
|
2
|
+
require 'dns_common/dns_common'
|
2
3
|
require 'resolv'
|
3
4
|
require 'route53'
|
4
5
|
|
@@ -9,92 +10,72 @@ module Proxy::Dns::Route53
|
|
9
10
|
|
10
11
|
attr_reader :aws_access_key, :aws_secret_key
|
11
12
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
))
|
13
|
+
def initialize(a_server = nil, a_ttl = nil)
|
14
|
+
@aws_access_key = Proxy::Dns::Route53::Plugin.settings.aws_access_key
|
15
|
+
@aws_secret_key = Proxy::Dns::Route53::Plugin.settings.aws_secret_key
|
16
|
+
super(a_server, a_ttl || ::Proxy::Dns::Plugin.settings.dns_ttl)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
def create_a_record(fqdn, ip)
|
20
|
+
if found = dns_find(fqdn)
|
21
|
+
raise(Proxy::Dns::Collision, "#{fqdn} is already used by #{ip}") unless found == ip
|
22
|
+
else
|
23
|
+
zone = get_zone(fqdn)
|
24
|
+
new_record = Route53::DNSRecord.new(fqdn, 'A', ttl, [ip], zone)
|
25
|
+
resp = new_record.create
|
26
|
+
raise "AWS Response Error: #{resp}" if resp.error?
|
27
|
+
true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_ptr_record(fqdn, ip)
|
32
|
+
if found = dns_find(ip)
|
33
|
+
raise(Proxy::Dns::Collision, "#{ip} is already used by #{found}") unless found == fqdn
|
34
|
+
else
|
35
|
+
zone = get_zone(ip)
|
36
|
+
new_record = Route53::DNSRecord.new(ip, 'PTR', ttl, [fqdn], zone)
|
37
|
+
resp = new_record.create
|
38
|
+
raise "AWS Response Error: #{resp}" if resp.error?
|
39
|
+
true
|
40
|
+
end
|
24
41
|
end
|
25
42
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
raise "AWS Response Error: #{resp}" if resp.error?
|
36
|
-
true
|
37
|
-
end
|
38
|
-
when "PTR"
|
39
|
-
if name = dns_find(@value)
|
40
|
-
raise(Proxy::Dns::Collision, "#{@value} is already used by #{name}") unless name == @fqdn
|
41
|
-
else
|
42
|
-
zone = get_zone(@value)
|
43
|
-
new_record = Route53::DNSRecord.new(@value, 'PTR', @ttl, [@fqdn], zone)
|
44
|
-
resp = new_record.create
|
45
|
-
raise "AWS Response Error: #{resp}" if resp.error?
|
46
|
-
true
|
47
|
-
end
|
43
|
+
def remove_a_record(fqdn)
|
44
|
+
zone = get_zone(fqdn)
|
45
|
+
recordset = zone.get_records
|
46
|
+
recordset.each do |rec|
|
47
|
+
if rec.name == fqdn + '.'
|
48
|
+
resp = rec.delete
|
49
|
+
raise "AWS Response Error: #{resp}" if resp.error?
|
50
|
+
return true
|
51
|
+
end
|
48
52
|
end
|
53
|
+
raise Proxy::Dns::NotFound, "Could not find forward record #{fqdn}"
|
49
54
|
end
|
50
55
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
return true
|
61
|
-
end
|
62
|
-
end
|
63
|
-
raise Proxy::Dns::NotFound, "Could not find forward record #{@fqdn}"
|
64
|
-
when "PTR"
|
65
|
-
zone = get_zone(@value)
|
66
|
-
recordset = zone.get_records
|
67
|
-
recordset.each do |rec|
|
68
|
-
if rec.name == @value + '.'
|
69
|
-
resp = rec.delete
|
70
|
-
raise "AWS Response Error: #{resp}" if resp.error?
|
71
|
-
return true
|
72
|
-
end
|
73
|
-
end
|
74
|
-
raise Proxy::Dns::NotFound, "Could not find reverse record #{@value}"
|
56
|
+
def remove_ptr_record(ip)
|
57
|
+
zone = get_zone(ip)
|
58
|
+
recordset = zone.get_records
|
59
|
+
recordset.each do |rec|
|
60
|
+
if rec.name == ip + '.'
|
61
|
+
resp = rec.delete
|
62
|
+
raise "AWS Response Error: #{resp}" if resp.error?
|
63
|
+
return true
|
64
|
+
end
|
75
65
|
end
|
66
|
+
raise Proxy::Dns::NotFound, "Could not find reverse record #{ip}"
|
76
67
|
end
|
77
68
|
|
78
69
|
private
|
79
70
|
|
80
71
|
def conn
|
81
|
-
@conn ||= Route53::Connection.new(
|
72
|
+
@conn ||= Route53::Connection.new(aws_access_key, aws_secret_key)
|
82
73
|
end
|
83
74
|
|
84
75
|
def resolver
|
85
76
|
@resolver ||= Resolv::DNS.new
|
86
77
|
end
|
87
78
|
|
88
|
-
def dns_find key
|
89
|
-
if match = key.match(/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/)
|
90
|
-
resolver.getname(match[1..4].reverse.join(".")).to_s
|
91
|
-
else
|
92
|
-
resolver.getaddress(key).to_s
|
93
|
-
end
|
94
|
-
rescue Resolv::ResolvError
|
95
|
-
false
|
96
|
-
end
|
97
|
-
|
98
79
|
def get_zone(fqdn)
|
99
80
|
domain = fqdn.split('.', 2).last + '.'
|
100
81
|
conn.get_zones(domain)[0]
|
@@ -2,13 +2,15 @@ require 'smart_proxy_dns_route53/dns_route53_version'
|
|
2
2
|
|
3
3
|
module Proxy::Dns::Route53
|
4
4
|
class Plugin < ::Proxy::Provider
|
5
|
-
plugin :dns_route53, ::Proxy::Dns::Route53::VERSION
|
6
|
-
:factory => proc { |attrs| ::Proxy::Dns::Route53::Record.record(attrs) }
|
5
|
+
plugin :dns_route53, ::Proxy::Dns::Route53::VERSION
|
7
6
|
|
8
|
-
requires :dns, '>= 1.
|
7
|
+
requires :dns, '>= 1.11'
|
8
|
+
|
9
|
+
validate_presence :aws_access_key, :aws_secret_key
|
9
10
|
|
10
11
|
after_activation do
|
11
12
|
require 'smart_proxy_dns_route53/dns_route53_main'
|
13
|
+
require 'smart_proxy_dns_route53/route53_dependencies'
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
@@ -1,97 +1,92 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
require 'smart_proxy_dns_route53/dns_route53_plugin'
|
3
4
|
require 'smart_proxy_dns_route53/dns_route53_main'
|
4
5
|
|
5
6
|
class DnsRoute53RecordTest < Test::Unit::TestCase
|
6
|
-
# Test that a missing :example_setting throws an error
|
7
|
-
def test_initialize_without_settings
|
8
|
-
assert_raise(RuntimeError) do
|
9
|
-
klass.new(settings.delete_if { |k,v| k == :aws_secret_key || k == :aws_access_key })
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
7
|
# Test that correct initialization works
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
def test_provider_initialization
|
9
|
+
Proxy::Dns::Route53::Plugin.load_test_settings(:aws_access_key => 'foo', :aws_secret_key => 'bar')
|
10
|
+
provider = klass.new
|
11
|
+
assert_equal 'foo', provider.aws_access_key
|
12
|
+
assert_equal 'bar', provider.aws_secret_key
|
18
13
|
end
|
19
14
|
|
20
15
|
# Test A record creation
|
21
16
|
def test_create_a
|
22
|
-
record = klass.new
|
17
|
+
record = klass.new
|
23
18
|
record.expects(:dns_find).returns(false)
|
24
19
|
|
25
20
|
zone = mock()
|
26
21
|
record.expects(:get_zone).with('test.example.com').returns(zone)
|
27
22
|
|
28
23
|
dnsrecord = mock(:create => mock(:error? => false))
|
29
|
-
Route53::DNSRecord.expects(:new).with('test.example.com', 'A',
|
24
|
+
Route53::DNSRecord.expects(:new).with('test.example.com', 'A', 86400, ['10.1.1.1'], zone).returns(dnsrecord)
|
30
25
|
|
31
|
-
assert record.
|
26
|
+
assert record.create_a_record(fqdn, ip)
|
32
27
|
end
|
33
28
|
|
34
29
|
# Test A record creation fails if the record exists
|
35
30
|
def test_create_a_conflict
|
36
|
-
record = klass.new
|
31
|
+
record = klass.new
|
37
32
|
record.expects(:dns_find).returns('10.2.2.2')
|
38
|
-
assert_raise(Proxy::Dns::Collision) { record.
|
33
|
+
assert_raise(Proxy::Dns::Collision) { record.create_a_record(fqdn, ip) }
|
39
34
|
end
|
40
35
|
|
41
36
|
# Test PTR record creation
|
42
37
|
def test_create_ptr
|
43
|
-
record = klass.new
|
38
|
+
record = klass.new
|
44
39
|
record.expects(:dns_find).returns(false)
|
45
40
|
|
46
41
|
zone = mock()
|
47
42
|
record.expects(:get_zone).with('10.1.1.1').returns(zone)
|
48
43
|
|
49
44
|
dnsrecord = mock(:create => mock(:error? => false))
|
50
|
-
Route53::DNSRecord.expects(:new).with('10.1.1.1', 'PTR',
|
45
|
+
Route53::DNSRecord.expects(:new).with('10.1.1.1', 'PTR', 86400, ['test.example.com'], zone).returns(dnsrecord)
|
51
46
|
|
52
|
-
assert record.
|
47
|
+
assert record.create_ptr_record(fqdn, ip)
|
53
48
|
end
|
54
49
|
|
55
50
|
# Test PTR record creation fails if the record exists
|
56
51
|
def test_create_ptr_conflict
|
57
|
-
record = klass.new
|
52
|
+
record = klass.new
|
58
53
|
record.expects(:dns_find).returns('else.example.com')
|
59
|
-
assert_raise(Proxy::Dns::Collision) { record.
|
54
|
+
assert_raise(Proxy::Dns::Collision) { record.create_ptr_record(fqdn, ip) }
|
60
55
|
end
|
61
56
|
|
62
57
|
# Test A record removal
|
63
58
|
def test_remove_a
|
64
59
|
zone = mock(:get_records => [mock(:name => 'test.example.com.', :delete => mock(:error? => false))])
|
65
|
-
record = klass.new
|
60
|
+
record = klass.new
|
66
61
|
record.expects(:get_zone).with('test.example.com').returns(zone)
|
67
|
-
assert record.
|
62
|
+
assert record.remove_a_record(fqdn)
|
68
63
|
end
|
69
64
|
|
70
65
|
# Test A record removal fails if the record doesn't exist
|
71
66
|
def test_remove_a_not_found
|
72
|
-
record = klass.new
|
67
|
+
record = klass.new
|
73
68
|
record.expects(:get_zone).with('test.example.com').returns(mock(:get_records => []))
|
74
|
-
assert_raise(Proxy::Dns::NotFound) { assert record.
|
69
|
+
assert_raise(Proxy::Dns::NotFound) { assert record.remove_a_record(fqdn) }
|
75
70
|
end
|
76
71
|
|
77
72
|
# Test PTR record removal
|
78
73
|
def test_remove_ptr
|
79
74
|
# FIXME: record name seems incorrect for rDNS
|
80
75
|
zone = mock(:get_records => [mock(:name => '10.1.1.1.', :delete => mock(:error? => false))])
|
81
|
-
record = klass.new
|
76
|
+
record = klass.new
|
82
77
|
record.expects(:get_zone).with('10.1.1.1').returns(zone)
|
83
|
-
assert record.
|
78
|
+
assert record.remove_ptr_record(ip)
|
84
79
|
end
|
85
80
|
|
86
81
|
# Test PTR record removal fails if the record doesn't exist
|
87
82
|
def test_remove_ptr_not_found
|
88
|
-
record = klass.new
|
83
|
+
record = klass.new
|
89
84
|
record.expects(:get_zone).with('10.1.1.1').returns(mock(:get_records => []))
|
90
|
-
assert_raise(Proxy::Dns::NotFound) { assert record.
|
85
|
+
assert_raise(Proxy::Dns::NotFound) { assert record.remove_ptr_record(ip) }
|
91
86
|
end
|
92
87
|
|
93
88
|
def test_get_zone_forward
|
94
|
-
record = klass.new
|
89
|
+
record = klass.new
|
95
90
|
conn = mock()
|
96
91
|
conn.expects(:get_zones).with('example.com.').returns([:zone])
|
97
92
|
record.expects(:conn).returns(conn)
|
@@ -99,7 +94,7 @@ class DnsRoute53RecordTest < Test::Unit::TestCase
|
|
99
94
|
end
|
100
95
|
|
101
96
|
def test_get_zone_reverse
|
102
|
-
record = klass.new
|
97
|
+
record = klass.new
|
103
98
|
conn = mock()
|
104
99
|
conn.expects(:get_zones).with('1.1.1.').returns([:zone]) # FIXME, incorrect rDNS zone
|
105
100
|
record.expects(:conn).returns(conn)
|
@@ -107,7 +102,7 @@ class DnsRoute53RecordTest < Test::Unit::TestCase
|
|
107
102
|
end
|
108
103
|
|
109
104
|
def test_dns_find_forward
|
110
|
-
record = klass.new
|
105
|
+
record = klass.new
|
111
106
|
resolver = mock()
|
112
107
|
resolver.expects(:getaddress).with('test.example.com').returns('10.1.1.1')
|
113
108
|
record.expects(:resolver).returns(resolver)
|
@@ -115,7 +110,7 @@ class DnsRoute53RecordTest < Test::Unit::TestCase
|
|
115
110
|
end
|
116
111
|
|
117
112
|
def test_dns_find_forward_not_found
|
118
|
-
record = klass.new
|
113
|
+
record = klass.new
|
119
114
|
resolver = mock()
|
120
115
|
resolver.expects(:getaddress).with('test.example.com').raises(Resolv::ResolvError)
|
121
116
|
record.expects(:resolver).returns(resolver)
|
@@ -123,7 +118,7 @@ class DnsRoute53RecordTest < Test::Unit::TestCase
|
|
123
118
|
end
|
124
119
|
|
125
120
|
def test_dns_find_reverse
|
126
|
-
record = klass.new
|
121
|
+
record = klass.new
|
127
122
|
resolver = mock()
|
128
123
|
resolver.expects(:getname).with('3.2.1.10').returns('test.example.com')
|
129
124
|
record.expects(:resolver).returns(resolver)
|
@@ -131,7 +126,7 @@ class DnsRoute53RecordTest < Test::Unit::TestCase
|
|
131
126
|
end
|
132
127
|
|
133
128
|
def test_dns_find_reverse_not_found
|
134
|
-
record = klass.new
|
129
|
+
record = klass.new
|
135
130
|
resolver = mock()
|
136
131
|
resolver.expects(:getname).with('3.2.1.10').raises(Resolv::ResolvError)
|
137
132
|
record.expects(:resolver).returns(resolver)
|
@@ -144,13 +139,11 @@ class DnsRoute53RecordTest < Test::Unit::TestCase
|
|
144
139
|
Proxy::Dns::Route53::Record
|
145
140
|
end
|
146
141
|
|
147
|
-
def
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
:type => 'A'
|
154
|
-
}
|
142
|
+
def fqdn
|
143
|
+
'test.example.com'
|
144
|
+
end
|
145
|
+
|
146
|
+
def ip
|
147
|
+
'10.1.1.1'
|
155
148
|
end
|
156
149
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_proxy_dns_route53
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Foreman developers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: route53
|
@@ -26,6 +26,20 @@ dependencies:
|
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '11'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "<"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '11'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mocha
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
@@ -39,7 +53,7 @@ dependencies:
|
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: test-unit
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - ">="
|
@@ -52,7 +66,7 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
|
-
description:
|
69
|
+
description: Route 53 DNS provider plugin for Foreman's smart proxy
|
56
70
|
email:
|
57
71
|
- foreman-dev@googlegroups.com
|
58
72
|
executables: []
|
@@ -67,6 +81,7 @@ files:
|
|
67
81
|
- lib/smart_proxy_dns_route53/dns_route53_main.rb
|
68
82
|
- lib/smart_proxy_dns_route53/dns_route53_plugin.rb
|
69
83
|
- lib/smart_proxy_dns_route53/dns_route53_version.rb
|
84
|
+
- lib/smart_proxy_dns_route53/route53_dependencies.rb
|
70
85
|
- test/dns_route53_record_test.rb
|
71
86
|
- test/test_helper.rb
|
72
87
|
homepage: https://github.com/theforeman/smart_proxy_dns_route53
|
@@ -92,7 +107,7 @@ rubyforge_project:
|
|
92
107
|
rubygems_version: 2.2.1
|
93
108
|
signing_key:
|
94
109
|
specification_version: 4
|
95
|
-
summary:
|
110
|
+
summary: Route 53 DNS provider plugin for Foreman's smart proxy
|
96
111
|
test_files:
|
97
112
|
- test/dns_route53_record_test.rb
|
98
113
|
- test/test_helper.rb
|