r53z 0.2.0 → 0.3.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: cadc6896a66b6d8b2ebf236434f0e927a64181c5
4
- data.tar.gz: 5b2fae7827027b48628d85205606c7d3886c4ea3
3
+ metadata.gz: cbefca21e3aaf8ddf5f9898696868aecbe8ec550
4
+ data.tar.gz: 7c064f9024e238ed16a4d1d76e986f2f5b39218a
5
5
  SHA512:
6
- metadata.gz: adb8ab8ccc1507c842c2d651d1540f5dc932adfb049f47f5e2ed27273f3e3e1ae86558b6ac4a25b7b8a4d3cdd5a2e5a816162d9cece0385c9e2db0303c0b492e
7
- data.tar.gz: 7c839ca913e0ee1f694f631a54c6c0c1bbfb4014543f87b4ccb9050ee0aa77b76c084e69942d2eab258e90b583464f71f6a83a17912742aa15ba16cbf3d714c2
6
+ metadata.gz: 4c23a1baba90b83bd42f0f1d62eaca1ad8e29e9b44c8a8b5fdb3c94d11a1c9f2a104f60422899d496ad1941f2f92a6050beda845e6b3981d6c64ade114895f1c
7
+ data.tar.gz: 1de9e5ba20d9d8230f16c60270c88e23ca3f9c86709b10e3acf62f8db0a5d29a014b01c3f1b4f9f82b19fa29ea3eae6eb50e7b2c3ef401d74e39a2908794ff94
data/Gemfile.lock CHANGED
@@ -16,12 +16,12 @@ GEM
16
16
  ffi (~> 1.9.10)
17
17
  rspec-expectations (>= 2.99)
18
18
  thor (~> 0.19)
19
- aws-sdk (2.3.18)
20
- aws-sdk-resources (= 2.3.18)
21
- aws-sdk-core (2.3.18)
19
+ aws-sdk (2.3.11)
20
+ aws-sdk-resources (= 2.3.11)
21
+ aws-sdk-core (2.3.11)
22
22
  jmespath (~> 1.0)
23
- aws-sdk-resources (2.3.18)
24
- aws-sdk-core (= 2.3.18)
23
+ aws-sdk-resources (2.3.11)
24
+ aws-sdk-core (= 2.3.11)
25
25
  builder (3.2.2)
26
26
  childprocess (0.5.9)
27
27
  ffi (~> 1.0, >= 1.0.11)
data/bin/r53z CHANGED
@@ -17,16 +17,19 @@ class App
17
17
  description "Simple CLI to manage, backup, and restore, Route 53 zones"
18
18
  #
19
19
  # Accept flags via:
20
- on("-x", "--export", "Export zones to files in specified directory, optionally specify one or more zones")
21
- on("-r", "--restore", "Restore zone from directory, optionally specify one or more zones")
22
- on("-l", "--list", "List name and ID of one or all zones")
23
- on("-s", "--record-sets", "List record sets for the given zone")
20
+ on("-x", "--export", "Export zones to files in specified directory, optionally specify one or more zones.")
21
+ on("-r", "--restore", "Restore zone from directory, optionally specify one or more zones.")
22
+ on("-l", "--list", "List name and ID of one or all zones.")
23
+ on("-s", "--record-sets", "List record sets for the given zone.")
24
+ on("-c NAME", "--create", "Create a zone with the given name and optional --comment and --delegation-set.")
25
+ on("-n COMMENT", "--comment", "Optional comment when creating a zone.")
24
26
  on("-d", "--delete", "Delete one or more zone(s) by name (WARNING: No confirmation!)")
25
- on("-c", "--credentials", "File containing credentials information")
26
- on("-u", "--section", "Section (user) in the credentials file to use")
27
- on("-g ID", "--delegation-set", "Delegation set ID to use for various operations")
28
- on("-t", "--list-delegation-sets", "List all delegation sets")
29
- on("-n ID", "--name-servers", "List name servers for delegation set")
27
+ on("-C", "--credentials", "File containing credentials information.")
28
+ on("-u", "--section", "Section (user) in the credentials file to use.")
29
+ on("-g ID", "--delegation-set", "Delegation set ID to use for various operations.")
30
+ on("-t", "--list-delegation-sets", "List delegation set for named zone, or all sets if no zone specified.")
31
+ on("-D", "--delete-delegation-sets", "Delete one or more delegation sets by ID (WARNING: No confirmation!")
32
+ on("-N ID", "--name-servers", "List name servers for delegation set.")
30
33
  # args greedily grabs any files or zones listed after the options
31
34
  arg(:args, :any)
32
35
 
data/lib/r53z/cli.rb CHANGED
@@ -11,7 +11,7 @@ module R53z
11
11
  creds = R53z::Config.new(config_file)
12
12
  @client = R53z::Client.new(section, creds)
13
13
 
14
- # XXX Dispath table seems smarter...can't figure out how to calls methods based
14
+ # XXX Dispath table seems smarter...can't figure out how to call methods based
15
15
  # directly on hash keys at the moment.
16
16
  if options[:export]
17
17
  help_now! "Export requires a directory path for zone files" if args.length < 1
@@ -20,7 +20,7 @@ module R53z
20
20
 
21
21
  if options[:restore]
22
22
  if args.empty?
23
- help_now! "Restore requires a directory containing zone files and optionally one or more zones to restore"
23
+ help_now! "Restore requires a directory containing zone files and optionally one or more zones to restore."
24
24
  end
25
25
  restore(:options => options, :args => args)
26
26
  end
@@ -29,34 +29,45 @@ module R53z
29
29
  list(options: options, args: args)
30
30
  end
31
31
 
32
+ if options[:create]
33
+ create(options)
34
+ end
35
+
32
36
  if options[:delete]
33
37
  if args.empty?
34
- help_now! "Delete requires one or more zone names"
38
+ help_now! "Delete requires one or more zone names."
35
39
  end
36
40
  args.each do |name|
37
- @client.delete(name)
41
+ if @client.list(name: name).any?
42
+ @client.delete(name)
43
+ else
44
+ exit_now! "Could not locate zone named " + name
45
+ end
38
46
  end
39
47
  end
40
48
 
41
49
  if options['list-delegation-sets']
42
- sets = @client.list_delegation_sets
43
- sets.each do |set|
44
- puts JSON.pretty_generate(set.to_h)
50
+ delegation_sets(args)
51
+ end
52
+
53
+ if options['delete-delegation-sets']
54
+ if args.empty?
55
+ help_now! "Delete delegation sets requires one or more delegation set IDs."
56
+ end
57
+ args.each do |id|
58
+ @client.delete_delegation_set(id: id)
45
59
  end
46
60
  end
47
61
 
48
62
  if options['record-sets']
49
63
  if args.empty?
50
- help_now! "List record sets requires one or more zone names"
51
- end
52
- args.each do |name|
53
- sets = @client.record_list(@client.get_zone_id(name))
54
- puts JSON.pretty_generate(sets)
64
+ help_now! "List record sets requires one or more zone names."
55
65
  end
66
+ record_sets(args)
56
67
  end
57
68
 
58
69
  if options['name-servers']
59
- dset = @client.get_delegation_set(id: options['name-servers'])
70
+ dset = @client.get_delegation_set(options['name-servers'])
60
71
  puts JSON.pretty_generate(dset.delegation_set[:name_servers])
61
72
  end
62
73
  end
@@ -112,6 +123,56 @@ module R53z
112
123
  )
113
124
  end
114
125
  end
126
+
127
+ def create(options)
128
+ # Populate a zone hash
129
+ zone_data = {:hosted_zone => { :hosted_zone_config => {}}, :delegation_set =>{}}
130
+ zone_data[:hosted_zone][:name] = options[:create]
131
+ if options[:comment]
132
+ zone_data[:hosted_zone][:config] = {}
133
+ zone_data[:hosted_zone][:config][:comment] = options[:comment]
134
+ end
135
+ if options['delegation-set']
136
+ zone_data[:delegation_set][:id] = options['delegation-set']
137
+ end
138
+ @client.create(info: zone_data)
139
+ end
140
+
141
+ def delegation_sets(args)
142
+ # show them all
143
+ if args.empty?
144
+ sets = @client.list_delegation_sets
145
+ sets.each do |set|
146
+ puts JSON.pretty_generate(set.to_h)
147
+ end
148
+ else # only show specified zones
149
+ args.each do |name|
150
+ dset_id = @client.get_delegation_set_id(name)
151
+ if dset_id
152
+ dset = @client.get_delegation_set(dset_id)
153
+ puts JSON.pretty_generate(dset.delegation_set.to_h)
154
+ else
155
+ exit_now!("Could not find a delegation set for " + name)
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ def record_sets(args)
162
+ args.each do |name|
163
+ zone_id = @client.get_zone_id(name)
164
+ if zone_id
165
+ sets = @client.list_records(@client.get_zone_id(name))
166
+ else
167
+ exit_now!("Could not locate zone " + name)
168
+ end
169
+ if sets
170
+ puts JSON.pretty_generate(sets)
171
+ else
172
+ exit_now!("Could not locate record list for " + name)
173
+ end
174
+ end
175
+ end
115
176
  end
116
177
  end
117
178
 
data/lib/r53z/client.rb CHANGED
@@ -23,22 +23,24 @@ module R53z
23
23
  end
24
24
 
25
25
  rv = []
26
- zones.each do |zone|
27
- if name
28
- unless name[-1] == '.'
29
- name = name + '.'
30
- end
31
- unless name == zone[:name]
32
- next
26
+ if zones
27
+ zones.each do |zone|
28
+ if name
29
+ unless name[-1] == '.'
30
+ name = name + '.'
31
+ end
32
+ unless name == zone[:name]
33
+ next
34
+ end
33
35
  end
36
+ rv.push({:name => zone[:name], :id => zone[:id]})
34
37
  end
35
- rv.push({:name => zone[:name], :id => zone[:id]})
36
38
  end
37
39
  rv
38
40
  end
39
41
 
40
42
  # Create zone with record(s) from an info and records hash
41
- def create(info:, records:)
43
+ def create(info:, records: nil)
42
44
  rv = {} # pile up the responses in a single hash
43
45
  #if self.list(info[:name]).any?
44
46
  # error(info[:name] + "exists")
@@ -47,37 +49,39 @@ module R53z
47
49
  # hosted_zone_config on create/restore. argh.
48
50
  # XXX: also, private_zone is not accepted here for some reason
49
51
  zone = info[:hosted_zone]
50
- zone_data = {
51
- :name => zone[:name],
52
- :caller_reference => 'r53z-create-' + self.random_string,
53
- :hosted_zone_config => {
54
- :comment => zone[:config][:comment]
55
- }
56
- }
57
- # command line overrides everything else
58
- if options['delegation-set']
59
- zone_data[:delegation_set_id] = options['delegation-set']
60
- elsif info[:delegation_set] and info[:delegation_set][:id]
52
+ # Populate a zone_data hash with options for zone creation
53
+ zone_data = {}
54
+ zone_data[:name] = zone[:name]
55
+ zone_data[:caller_reference] = 'r53z-create-' + self.random_string
56
+ if zone[:config] and zone[:config][:comment]
57
+ zone_data[:hosted_zone_config] = {}
58
+ zone_data[:hosted_zone_config][:comment] = zone[:config][:comment]
59
+ end
60
+ if info[:delegation_set] and info[:delegation_set][:id]
61
61
  zone_data[:delegation_set_id] = info[:delegation_set][:id]
62
62
  end
63
63
  zone_resp = self.client.create_hosted_zone(zone_data)
64
64
  rv[:hosted_zone_resp] = zone_resp
65
+
65
66
  rv[:record_set_resp] = []
66
- records.each do |record|
67
- # skip these, as they are handled separately (delegation set?)
68
- unless (record[:type] == "NS" || record[:type] == "SOA")
69
- record_resp = self.client.change_resource_record_sets({
70
- :hosted_zone_id => zone_resp[:hosted_zone][:id],
71
- :change_batch => {
72
- :changes => [
73
- {
74
- :action => "CREATE",
75
- :resource_record_set => record
76
- }
77
- ]
78
- }
79
- })
80
- rv[:record_set_resp].push(record_resp)
67
+ # Optionally populate records
68
+ if records
69
+ records.each do |record|
70
+ # skip these, as they are handled separately (delegation set?)
71
+ unless (record[:type] == "NS" || record[:type] == "SOA")
72
+ record_resp = self.client.change_resource_record_sets({
73
+ :hosted_zone_id => zone_resp[:hosted_zone][:id],
74
+ :change_batch => {
75
+ :changes => [
76
+ {
77
+ :action => "CREATE",
78
+ :resource_record_set => record
79
+ }
80
+ ]
81
+ }
82
+ })
83
+ rv[:record_set_resp].push(record_resp)
84
+ end
81
85
  end
82
86
  end
83
87
  return rv
@@ -94,7 +98,7 @@ module R53z
94
98
  # delete all of the resource record sets in a zone (this is required to delete
95
99
  # a zone
96
100
  def delete_all_rr_sets(zone_id)
97
- self.record_list(zone_id).reject do |rs|
101
+ self.list_records(zone_id).reject do |rs|
98
102
  (rs[:type] == "NS" || rs[:type] == "SOA")
99
103
  end.each do |record_set|
100
104
  self.client.change_resource_record_sets({
@@ -123,7 +127,7 @@ module R53z
123
127
  # dump the record sets
124
128
  R53z::JsonFile.write_json(
125
129
  path: File.join(dirpath, name),
126
- data: self.record_list(zone_id))
130
+ data: self.list_records(zone_id))
127
131
 
128
132
  # Dump the zone metadata, plus the delegated set info
129
133
  out = { :hosted_zone =>
@@ -154,7 +158,7 @@ module R53z
154
158
  self.create(:info => info, :records => records)
155
159
  end
156
160
 
157
- def record_list(zone_id)
161
+ def list_records(zone_id)
158
162
  records = self.client.list_resource_record_sets(hosted_zone_id: zone_id)
159
163
  rv = []
160
164
  records[:resource_record_sets].each do |record|
data/lib/r53z/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module R53z
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/r53z.gemspec CHANGED
@@ -13,19 +13,12 @@ Gem::Specification.new do |spec|
13
13
  spec.summary = %q{Simple zone manager for Route 53.}
14
14
  spec.homepage = "http://github.com/swelljoe/r53z"
15
15
 
16
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
- # to allow pushing to a single host or delete this section to allow pushing to any host.
18
- if spec.respond_to?(:metadata)
19
- spec.metadata['allowed_push_host'] = 'http://blahblah.mygemserver.com'
20
- else
21
- raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
- end
23
-
24
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
17
  spec.bindir = "exe"
26
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
19
  spec.require_paths = ["lib"]
28
20
 
21
+ spec.required_ruby_version = '>= 2.1.0'
29
22
  spec.add_development_dependency "bundler", "~> 1.12"
30
23
  spec.add_development_dependency "rake", "~> 10.0"
31
24
  spec.add_development_dependency('rdoc')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: r53z
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Cooper
@@ -14,126 +14,126 @@ dependencies:
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.12'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.12'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rdoc
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: aruba
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: methadone
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 1.9.2
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.9.2
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: aws-sdk
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: inifile
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: pry
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: test-unit
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  description:
@@ -143,7 +143,7 @@ executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
- - .gitignore
146
+ - ".gitignore"
147
147
  - Gemfile
148
148
  - Gemfile.lock
149
149
  - LICENSE
@@ -164,25 +164,24 @@ files:
164
164
  homepage: http://github.com/swelljoe/r53z
165
165
  licenses:
166
166
  - gplv3
167
- metadata:
168
- allowed_push_host: http://blahblah.mygemserver.com
167
+ metadata: {}
169
168
  post_install_message:
170
169
  rdoc_options: []
171
170
  require_paths:
172
171
  - lib
173
172
  required_ruby_version: !ruby/object:Gem::Requirement
174
173
  requirements:
175
- - - '>='
174
+ - - ">="
176
175
  - !ruby/object:Gem::Version
177
- version: '0'
176
+ version: 2.1.0
178
177
  required_rubygems_version: !ruby/object:Gem::Requirement
179
178
  requirements:
180
- - - '>='
179
+ - - ">="
181
180
  - !ruby/object:Gem::Version
182
181
  version: '0'
183
182
  requirements: []
184
183
  rubyforge_project:
185
- rubygems_version: 2.0.14
184
+ rubygems_version: 2.4.8
186
185
  signing_key:
187
186
  specification_version: 4
188
187
  summary: Simple zone manager for Route 53.