zonify 0.4.3 → 0.4.6
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 +7 -0
- data/README +4 -0
- data/bin/zonify +17 -5
- data/lib/zonify.rb +27 -12
- metadata +38 -59
- data/lib/zonify/log.rb +0 -36
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1e30191a3ca007c303fe49c7e5ae55d9dbb1f29f
|
4
|
+
data.tar.gz: e7f5d12cc76788684ab3940786ed741290a06a50
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b5ed894a4cd3b0d60318e25ea352e9b283a65fc74582bdc3a388df5e346d8ebe2779ad2b68d92d6482b2113c189ad968a947f0c51ec3eb341983987597ca4252
|
7
|
+
data.tar.gz: 9f7d532d7d0cad92a4a485162d0767a43dda163e08449b5e59a1f2b880df32fed0fe82c775e4042b27e574cfbc9d7b25d5359f51a97f4958795522a92caf7a15
|
data/README
CHANGED
@@ -34,6 +34,10 @@ DESCRIPTION
|
|
34
34
|
|
35
35
|
AWS_REGION=eu-west-1
|
36
36
|
|
37
|
+
One may specify --use-iam-profile option to configure the zonify tool
|
38
|
+
with AWS IAM-provided access and secret keys. This capability is avail-
|
39
|
+
able only when running the tool on an EC2 instance with an IAM role.
|
40
|
+
|
37
41
|
The Zonify subcommands allow staged generation, transformation and
|
38
42
|
auditing of entries as well as straightforward, one-step synchroniza-
|
39
43
|
tion.
|
data/bin/zonify
CHANGED
@@ -18,7 +18,7 @@ class CLIAWS
|
|
18
18
|
@options = {}
|
19
19
|
@options.merge!(options) if options
|
20
20
|
env_adapter
|
21
|
-
{ :region => ENV['
|
21
|
+
{ :region => ENV['AWS_DEFAULT_REGION'],
|
22
22
|
:aws_access_key_id => (access or ENV['AWS_ACCESS_KEY']),
|
23
23
|
:aws_secret_access_key => (secret or ENV['AWS_SECRET_KEY'])
|
24
24
|
}.each{|k,v| @options.merge!(k=>v) if v }
|
@@ -27,8 +27,9 @@ class CLIAWS
|
|
27
27
|
aws.respond_to?(sym)
|
28
28
|
end
|
29
29
|
def env_adapter
|
30
|
-
[ %w|
|
31
|
-
%w|
|
30
|
+
[ %w| AWS_REGION AWS_DEFAULT_REGION |,
|
31
|
+
%w| AWS_ACCESS_KEY_ID AWS_ACCESS_KEY |,
|
32
|
+
%w| AWS_SECRET_ACCESS_KEY AWS_SECRET_KEY | ].each do |a, b|
|
32
33
|
ENV[a] = ENV[b] if ENV[b] # Ensure new variable takes precedence.
|
33
34
|
ENV[b] = ENV[a] unless ENV[b]
|
34
35
|
end
|
@@ -151,7 +152,9 @@ def main
|
|
151
152
|
netlogging = (ARGV.delete("-n") or ARGV.delete("--net"))
|
152
153
|
norm = (ARGV.delete("--srv-singleton") or not
|
153
154
|
ARGV.delete("--no-srv-singleton"))
|
155
|
+
use_iam_profile = ARGV.delete("--use-iam-profile")
|
154
156
|
aws = CLIAWS.new
|
157
|
+
aws.options[:use_iam_profile] = true if use_iam_profile
|
155
158
|
types = nil
|
156
159
|
while i = ARGV.index('--types')
|
157
160
|
ARGV.delete_at(i)
|
@@ -183,13 +186,22 @@ def main
|
|
183
186
|
Zonify::YAML.trim_lines(dumped).join.sub(/ *\[\]$/,'')
|
184
187
|
end.join
|
185
188
|
STDOUT.write entries
|
189
|
+
when 'merge'
|
190
|
+
parsed = ARGV[1..-1].map{|path| Zonify::YAML.read(File.read(path)) }
|
191
|
+
unless parsed.empty?
|
192
|
+
suffix, records = parsed[0]
|
193
|
+
rebased = parsed[1..-1].map do |sfx, recs|
|
194
|
+
Zonify::Mappings.rewrite(recs, [[sfx,[suffix]]])
|
195
|
+
end
|
196
|
+
STDOUT.write Zonify::YAML.format(Zonify.merge(records, *rebased), suffix)
|
197
|
+
end
|
186
198
|
when 'diff'
|
187
199
|
suffix, old_records = Zonify::YAML.read(File.read(ARGV[1]))
|
188
200
|
new_suffix, new_records = Zonify::YAML.read(File.read(ARGV[2]))
|
189
201
|
qualified = Zonify::Mappings.rewrite(new_records, [[new_suffix,[suffix]]])
|
190
202
|
changes = Zonify.diff(qualified, old_records, (types or %w| * |))
|
191
203
|
STDERR.puts(display(changes)) unless quiet
|
192
|
-
STDOUT.write(Zonify::YAML.trim_lines(YAML.dump(changes)))
|
204
|
+
STDOUT.write(Zonify::YAML.trim_lines(YAML.dump(changes)).join)
|
193
205
|
when 'sync'
|
194
206
|
suffix = ARGV[1]
|
195
207
|
check_name(suffix)
|
@@ -214,7 +226,7 @@ def main
|
|
214
226
|
_, old_records = aws.route53_zone(suffix)
|
215
227
|
changes = Zonify.diff(mapped, old_records, (types or %w| CNAME SRV |))
|
216
228
|
STDERR.puts(display(changes)) unless quiet
|
217
|
-
STDOUT.write(Zonify::YAML.trim_lines(YAML.dump(changes)))
|
229
|
+
STDOUT.write(Zonify::YAML.trim_lines(YAML.dump(changes)).join)
|
218
230
|
when 'summarize'
|
219
231
|
handle = ARGV[1] ? File.open(ARGV[1]) : STDIN
|
220
232
|
changes = yaml_with_default(handle, [])
|
data/lib/zonify.rb
CHANGED
@@ -95,7 +95,8 @@ class AWS
|
|
95
95
|
dns = i.dns_name
|
96
96
|
# The default hostname for EC2 instances is derived from their internal
|
97
97
|
# DNS entry.
|
98
|
-
|
98
|
+
terminal_states = %w| terminated shutting-down |
|
99
|
+
unless dns.nil? or dns.empty? or terminal_states.member? i.state
|
99
100
|
groups = (i.groups or [])
|
100
101
|
attrs = { :sg => groups,
|
101
102
|
:tags => (i.tags or []),
|
@@ -111,7 +112,7 @@ class AWS
|
|
111
112
|
def load_balancers
|
112
113
|
elb.load_balancers.map do |elb|
|
113
114
|
{ :instances => elb.instances,
|
114
|
-
:prefix => Zonify.cut_down_elb_name(elb.dns_name) }
|
115
|
+
:prefix => Zonify.cut_down_elb_name(elb.dns_name.downcase) }
|
115
116
|
end
|
116
117
|
end
|
117
118
|
def eips
|
@@ -170,8 +171,8 @@ def zone(hosts, elbs)
|
|
170
171
|
host_records = hosts.map do |id,info|
|
171
172
|
name = "#{id}.inst."
|
172
173
|
priv = "#{info[:priv]}.priv."
|
173
|
-
[ Zonify::RR.cname(name, info[:dns], '
|
174
|
-
Zonify::RR.cname(priv, info[:dns], '
|
174
|
+
[ Zonify::RR.cname(name, info[:dns], '600'),
|
175
|
+
Zonify::RR.cname(priv, info[:dns], '600'),
|
175
176
|
Zonify::RR.srv('inst.', name) ] +
|
176
177
|
info[:tags].map do |tag|
|
177
178
|
k, v = tag
|
@@ -464,17 +465,31 @@ end
|
|
464
465
|
module YAML
|
465
466
|
extend self
|
466
467
|
def format(records, suffix='')
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
468
|
+
_suffix_ = Zonify._dot(Zonify.dot_(suffix))
|
469
|
+
entries = records.keys.sort.map do |k|
|
470
|
+
if k == 'CNAME'
|
471
|
+
STDERR.puts(::YAML.dump(records))
|
472
|
+
abort "A problem was found // #{ARGV[0]}"
|
473
|
+
end
|
474
|
+
[ k + ":\n" ] + records[k].keys.sort_by{|kk| kk.to_s }.map do |kk|
|
475
|
+
sorted = Zonify::YAML.sorted_hash(records[k][kk])
|
476
|
+
lines = Zonify::YAML.trim_lines(sorted)
|
477
|
+
[ kk + ":\n" ] + lines.map{|ln| ' ' + ln }
|
478
|
+
end.flatten.map{|ln| ' ' + ln }
|
479
|
+
end.flatten.map{|ln| ' ' + ln }.join
|
480
|
+
"suffix: #{_suffix_}\nrecords:\n" + entries
|
481
|
+
end
|
482
|
+
def sorted_hash(h)
|
483
|
+
result = ::YAML::quick_emit(h.object_id, {}) do |out|
|
484
|
+
out.map("") do |map|
|
485
|
+
h.keys.sort_by{|k| k.to_s }.each{|k| map.add(k, h[k]) }
|
486
|
+
end
|
487
|
+
end
|
473
488
|
end
|
474
489
|
def read(text)
|
475
490
|
yaml = ::YAML.load(text)
|
476
|
-
if yaml['suffix']
|
477
|
-
[yaml['suffix'], yaml['records']]
|
491
|
+
if yaml['suffix']
|
492
|
+
[yaml['suffix'], (yaml['records'] or {})]
|
478
493
|
end
|
479
494
|
end
|
480
495
|
def trim_lines(yaml)
|
metadata
CHANGED
@@ -1,85 +1,64 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: zonify
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 4
|
9
|
-
- 3
|
10
|
-
version: 0.4.3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.6
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
6
|
+
authors:
|
7
|
+
- Jason Dusek
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: fog
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
32
20
|
type: :runtime
|
33
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
34
27
|
description: |
|
35
28
|
Zonify provides a command line tool for generating DNS records from EC2
|
36
29
|
instances, instance tags, load balancers and security groups. A mechanism for
|
37
30
|
syncing these records with a zone stored in Route 53 is also provided.
|
38
|
-
|
39
|
-
|
40
|
-
executables:
|
31
|
+
email: oss@solidsnack.be
|
32
|
+
executables:
|
41
33
|
- zonify
|
42
34
|
extensions: []
|
43
|
-
|
44
35
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
47
|
-
- lib/zonify/log.rb
|
36
|
+
files:
|
48
37
|
- lib/zonify.rb
|
49
38
|
- README
|
50
39
|
- bin/zonify
|
51
|
-
homepage: https://github.com/
|
52
|
-
licenses:
|
40
|
+
homepage: https://github.com/solidsnack/zonify
|
41
|
+
licenses:
|
53
42
|
- BSD
|
43
|
+
metadata: {}
|
54
44
|
post_install_message:
|
55
45
|
rdoc_options: []
|
56
|
-
|
57
|
-
require_paths:
|
46
|
+
require_paths:
|
58
47
|
- lib
|
59
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
none: false
|
70
|
-
requirements:
|
71
|
-
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
hash: 3
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
version: "0"
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
77
58
|
requirements: []
|
78
|
-
|
79
59
|
rubyforge_project:
|
80
|
-
rubygems_version:
|
60
|
+
rubygems_version: 2.0.14
|
81
61
|
signing_key:
|
82
|
-
specification_version:
|
62
|
+
specification_version: 4
|
83
63
|
summary: Generate DNS information from EC2 metadata.
|
84
64
|
test_files: []
|
85
|
-
|
data/lib/zonify/log.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'time'
|
2
|
-
|
3
|
-
require 'sqlite3'
|
4
|
-
|
5
|
-
module Zonify
|
6
|
-
module Log
|
7
|
-
|
8
|
-
class SQLite
|
9
|
-
attr_reader :connection_string, :connection
|
10
|
-
def initialize(connection_string=':memory:')
|
11
|
-
@connection_string = connection_string
|
12
|
-
@connection = SQLite3::Database.new(@connection_string)
|
13
|
-
end
|
14
|
-
|
15
|
-
def log(record)
|
16
|
-
name, type, ttl, value,
|
17
|
-
weight, set = [ record[:name], record[:type],
|
18
|
-
record[:ttl], record[:value],
|
19
|
-
record[:weight], record[:set_identifier] ]
|
20
|
-
name, type, ttl, value,
|
21
|
-
weight, set = [ record[:name], record[:type],
|
22
|
-
record[:ttl], record[:value],
|
23
|
-
record[:weight], record[:set_identifier] ]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
extend self
|
28
|
-
|
29
|
-
def now
|
30
|
-
x = Time.now.utc
|
31
|
-
x.iso8601.sub('T', ' ').sub('Z','.') + ("%0.3f" % x.to_f).split('.').last
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|