knife-dns-update 0.0.1

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NjJiMjE0YjgyYWQzMTY0OWQzODM0OTVmMzQ3MTc0OGU5ZGEzM2IzYQ==
5
+ data.tar.gz: !binary |-
6
+ NTg4NmFjMDI4OTllZDlkZjIxYTEwNGEyNDNmZmNmZTkzNjhmYzE4ZA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NWU1OWFlMTg5YjU2NzE0NmY1NzJhNDdmNTQwYzYyN2MzODU3MmY5NDIxMGI4
10
+ MjUwNmJhYzNmYTY1MzNhNDE3NjM4ODlkZjM0YmUxMGJiNzQ0MDI2MjIxN2I5
11
+ YWRhMGIyZWMzZTIyZjBjYjIzMmIyMTM0ZWE5ZWVmYjZkODcwNjg=
12
+ data.tar.gz: !binary |-
13
+ MjI1Y2IyNjFmOTEzMTc4ZDI4NjA1MmY4ZjQ5NWI5YTA0Mzc5NjNkOWZhMzNj
14
+ NDlhNmM0M2ZjYzI5MTlmOTY4NjcxOWYyZGUyZDY3YzdiMmI5NDg3YTNjZmRi
15
+ ZWY3NWI5ZDI3YTFkYzk3YTlmNTRkMDQ0YzVhOTgzZDVjNGYwODI=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ *~
4
+ .*.swp
5
+ .DS_Store
6
+ /.bundle
7
+ /.config
8
+ /.yardoc
9
+ /Gemfile.lock
10
+ /InstalledFiles
11
+ /coverage
12
+ /doc/public
13
+ /lib/bundler/man
14
+ /pkg
15
+ /spec/reports
16
+ /tmp
17
+ /vendor/cache
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ ---
2
+ bundler_args: --without developer_workstation
3
+ script: bundle exec thor spec:ci
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ notifications:
8
+ hipchat:
9
+ secure: ! 'XggFlX0Al0nEMLl0X3Fsyr8X5NSdXwfyhBhKg3bskYoKzbIcexA8eDJBiuSa
10
+
11
+ ych7knx0SI/Dzhvs+WnQjWyBhu5VwHBnQvBxMGqVZ71WLn7IbzAME1W8q0b0
12
+
13
+ mRzkvCIRWuMaPz3m24LuTyga9w0XB1AFN5+tlP6fCuYXglCOYws='
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ # Changes
2
+
3
+ ## 0.0.1
4
+
5
+ * Initial release
6
+ * Created on Friday, 2013-06-21
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,43 @@
1
+ # Contributing
2
+
3
+ ## Developing
4
+
5
+ 1. Fork the repository on GitHub
6
+ 2. Create your feature branch (`git checkout -b feature/awesomeness`)
7
+ 3. Create your changes.
8
+ * Add test cases in `spec/`. It's best if you first write a failing
9
+ test case, commit it, and then fix it in next commit - this makes
10
+ the whole change easier to review.
11
+ * Document your changes.
12
+ 4. Commit your changes (`git commit -am 'Add more awesomeness'`)
13
+ 5. Push to the branch (`git push -u origin feature/awesomeness`)
14
+ 6. Create new Pull Request on GitHub
15
+
16
+ ## Testing
17
+
18
+ ### Install what's needed
19
+
20
+ Make sure you have [http://gembundler.com/](Gem Bundler) version 1.3
21
+ or greater installed. If in doubt, just use [http://rvm.io/](RVM) or
22
+ [http://rbenv.org/](rbenv).
23
+
24
+ $ gem install bundler
25
+
26
+ Clone the project:
27
+
28
+ $ git clone git://github.com/3ofcoins/knife-dns-update.git
29
+
30
+ Then, run:
31
+
32
+ $ cd knife-dns-update
33
+ $ bundle install
34
+
35
+ Bundler will install all the needed gems and their dependencies.
36
+
37
+ ### Running tests
38
+
39
+ $ bundle exec thor spec
40
+
41
+ To generate test coverage report, tell it to Thor
42
+
43
+ $ bundle exec thor spec --coverage
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ # Helpers used with development, but not needed in runtime, build
6
+ # time, or for tests.
7
+ group :developer_workstation do
8
+ gem 'awesome_print'
9
+ gem 'pry'
10
+ gem 'pry-debugger'
11
+ gem 'pry-rescue'
12
+ gem 'pry-stack_explorer'
13
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Maciej Pasternacki <maciej@3ofcoins.net>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Knife Dns Update
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'knife-dns-update'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install knife-dns-update
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ See the [CONTRIBUTING.md](CONTRIBUTING.md) file
data/Thorfile ADDED
@@ -0,0 +1,60 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+ require 'rubygems'
3
+
4
+ require 'bundler/setup'
5
+
6
+ require 'rake/testtask'
7
+ require 'thor/rake_compat'
8
+
9
+ class Default < Thor
10
+ class Gem < Thor
11
+ namespace :gem
12
+
13
+ include Thor::RakeCompat
14
+ Bundler::GemHelper.install_tasks
15
+
16
+ desc "build", "Build knife-dns-update-#{KnifeDnsUpdate::VERSION}.gem into the pkg directory"
17
+ def build
18
+ Rake::Task["build"].execute
19
+ end
20
+
21
+ desc "release", "Create tag v#{KnifeDnsUpdate::VERSION} and build and push knife-dns-update-#{KnifeDnsUpdate::VERSION}.gem to Rubygems"
22
+ def release
23
+ Rake::Task["release"].execute
24
+ end
25
+
26
+ desc "install", "Build and install knife-dns-update-#{KnifeDnsUpdate::VERSION}.gem into system gems"
27
+ def install
28
+ Rake::Task["install"].execute
29
+ end
30
+ end
31
+
32
+ class Test < Thor
33
+ namespace :test
34
+ default_command :all
35
+
36
+ include Thor::RakeCompat
37
+
38
+ Rake::TestTask.new :spec do |task|
39
+ task.libs << 'spec'
40
+ task.test_files = FileList['spec/**/*_spec.rb']
41
+ end
42
+
43
+ desc 'spec', 'Run specs'
44
+ def spec
45
+ Rake::Task['spec'].execute
46
+ end
47
+
48
+ desc 'all', 'Run all tests'
49
+ def all
50
+ invoke(:spec)
51
+ end
52
+
53
+ desc 'ci', 'Run all tests for continuous integration'
54
+ def ci
55
+ ENV['CI'] = 'true'
56
+ invoke(:all)
57
+ end
58
+ end
59
+ end
60
+
@@ -0,0 +1,29 @@
1
+ # -*- mode: ruby; coding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'knife-dns-update/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "knife-dns-update"
8
+ spec.version = KnifeDnsUpdate::VERSION
9
+ spec.authors = ["Maciej Pasternacki"]
10
+ spec.email = ["maciej@pasternacki.net"]
11
+ spec.description = "Updates DNS based on Chef database"
12
+ spec.summary = "Updates Route 53 DNS entries based on Chef database contents"
13
+ spec.homepage = "https://github.com/3ofcoins/knife-dns-update/"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "chef"
22
+ spec.add_dependency "fog", "~> 1.9"
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "minitest"
25
+ spec.add_development_dependency "mocha"
26
+ spec.add_development_dependency 'simplecov'
27
+ spec.add_development_dependency "thor", "~> 0.18.1"
28
+ spec.add_development_dependency "wrong", ">= 0.7.0"
29
+ end
@@ -0,0 +1,127 @@
1
+ require 'chef/knife'
2
+
3
+ module KnifeDnsUpdate
4
+ class DnsUpdate < Chef::Knife
5
+ banner "knife dns update"
6
+
7
+ deps do
8
+ require 'set'
9
+ require 'chef/node'
10
+ require 'chef/api_client'
11
+ require 'chef/search/query'
12
+ require 'fog'
13
+ require 'knife-dns-update'
14
+ end
15
+
16
+ option :dry_run,
17
+ :short => "-n",
18
+ :long => "--dry-run",
19
+ :description => "Don't execute updates",
20
+ :boolean => false
21
+
22
+ option :aws_access_key_id,
23
+ :short => "-A ID",
24
+ :long => "--aws-access-key-id KEY",
25
+ :description => "Your AWS Access Key ID",
26
+ :proc => Proc.new { |key| Chef::Config[:knife][:aws_access_key_id] = key }
27
+
28
+ option :aws_secret_access_key,
29
+ :short => "-K SECRET",
30
+ :long => "--aws-secret-access-key SECRET",
31
+ :description => "Your AWS API Secret Access Key",
32
+ :proc => Proc.new { |key| Chef::Config[:knife][:aws_secret_access_key] = key }
33
+
34
+ attr_reader :entries, :cfg
35
+
36
+ def entry(name, type, data)
37
+ @entries ||= {}
38
+
39
+ name = nil if name == '@'
40
+ fqdn = [name, cfg.subdomain, cfg.zone].compact.join('.') + '.'
41
+ type = type.to_s.upcase
42
+
43
+ if entries.key?([fqdn, type])
44
+ ui.warn("Redefining #{fqdn} IN #{type} #{entries[[name,type]]} --> #{data}")
45
+ elsif config[:verbosity] >= 2
46
+ ui.info("Defining: #{fqdn} IN #{type} #{data}")
47
+ end
48
+ entries[[fqdn, type]] = data
49
+ end
50
+
51
+ def run
52
+ @cfg = Config.new('config/dns.rb')
53
+
54
+ Chef::Node.list.keys.sort.map(&Chef::Node.method(:load)).each do |node|
55
+ entry(node.name.gsub(/[^a-z0-9-]+/, '-'), *cfg.record_for_node(node))
56
+ end
57
+
58
+ cfg.entries.each do |name, optses|
59
+ optses.each do |opts|
60
+ entry(name, opts[:type], opts[:data]) if opts[:type] && opts[:data]
61
+ entry(name, :a, opts[:a]) if opts[:a]
62
+ entry(name, :cname, opts[:cname]) if opts[:cname]
63
+
64
+ if opts[:block] && !(opts[:node] || opts[:query])
65
+ # Bare block
66
+ entry(name, *opts[:block].call)
67
+ end
68
+
69
+ is_root_record = (name == '@')
70
+
71
+ if opts[:node]
72
+ entry(name, *cfg.record_for_node(
73
+ Chef::Node.load(opts[:node]), is_root_record, &opts[:block]))
74
+ end
75
+
76
+ if opts[:query]
77
+ q = Chef::Search::Query.new
78
+ q.search(:node, opts[:query]).first.each do |node|
79
+ entry( name.sub('*', cfg.personalization_token(node)),
80
+ *cfg.record_for_node(node, is_root_record, &opts[:block]))
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ dns_config = Chef::Config[:dns].dup
87
+ dns_config[:provider] ||= 'AWS'
88
+ if dns_config[:provider] == 'AWS'
89
+ dns_config[:aws_access_key_id] ||= config[:aws_access_key_id]
90
+ dns_config[:aws_secret_access_key] ||= config[:aws_secret_access_key]
91
+ end
92
+ dns = Fog::DNS.new(dns_config)
93
+ zone = dns.zones.find { |z| z.domain =~ /#{Regexp.quote(cfg.zone)}\.?$/ }
94
+ raise "No zone found for #{cfg.zone}; available zones: #{dns.zones.map(&:domain).join(', ')}" unless zone
95
+
96
+ managed = Set.new
97
+
98
+ zone.records.each do |rec|
99
+ ui.info("Looking at: #{rec.name} IN #{rec.type} #{rec.value}") if config[:verbosity] >= 3
100
+
101
+ if cfg.subdomain && rec.name !~ /#{Regexp.quote(cfg.subdomain)}\.#{Regexp.quote(cfg.zone)}\.?$/
102
+ ui.info("Not in subdomain, skipping: #{rec.name} IN #{rec.type} #{rec.value}") if config[:verbosity] >= 2
103
+ next
104
+ end
105
+
106
+ value = rec.value.respond_to?(:first) ? rec.value.first : rec.value
107
+ if entries[[rec.name, rec.type]] == value
108
+ # Record exists on server and has the same value. We leave it be.
109
+ ui.info("= #{rec.name} IN #{rec.type} #{value}") if config[:verbosity] >= 1
110
+ managed.add([rec.name, rec.type])
111
+ else
112
+ ui.info "- #{rec.name} IN #{rec.type} #{value}"
113
+ rec.destroy unless config[:dry_run]
114
+ end
115
+
116
+ # FIXME next if cfg.subdomain && rec.name !~ /#{Regex.quote(cfg.subdomain).
117
+ end
118
+
119
+ entries.each do |resource, value|
120
+ next if managed.include?(resource)
121
+ name, type = resource
122
+ ui.info "+ #{name} IN #{type} #{value}"
123
+ zone.records.create(:name => name, :type => type, :value => value, :ttl => cfg.ttl) unless config[:dry_run]
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,75 @@
1
+ module KnifeDnsUpdate
2
+ class Config
3
+ class << self
4
+ def option(name, default=nil)
5
+ ivar = "@#{name}".to_sym
6
+ define_method name do |*args|
7
+ if args.length.zero?
8
+ if instance_variable_defined?(ivar)
9
+ instance_variable_get(ivar)
10
+ else
11
+ default
12
+ end
13
+ elsif block_given?
14
+ instance_variable_set(ivar, yield(*args))
15
+ elsif args.length == 1
16
+ instance_variable_set(ivar, args[0])
17
+ else
18
+ instance_variable_set(ivar, args)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ option(:zone) { |domain| domain.gsub(/^\.*|\.*$/, '') }
25
+ option :subdomain
26
+ option :ttl, 3600
27
+ attr_reader :entries
28
+
29
+ def initialize(path=nil)
30
+ @entries = {}
31
+ instance_eval(File.read(path), path, 1) if path
32
+ end
33
+
34
+ def entry(name, opt={}, &block)
35
+ raise "Entry #{name} without definition or block" unless opt||block_given?
36
+
37
+ case opt
38
+ when /^\d+\.\d+\.\d+\.\d+$/ then opt = { :a => opt }
39
+ when /^[a-z0-9.-]+\.$/ then opt = { :cname => opt }
40
+ when /^[a-z0-9.-]+$/ then opt = { :cname => "#{opt}.#{zone}." }
41
+ when /^name:[a-z0-9.-]+$/ then opt = { :node => opt[5..-1] }
42
+ when /:/ then opt = { :query => opt }
43
+ end
44
+
45
+ opt[:block] = block if block_given?
46
+
47
+ if opt[:q]
48
+ opt[:query] = opt[:q]
49
+ opt.delete(:q)
50
+ end
51
+
52
+ entries[name] ||= []
53
+ entries[name] << opt
54
+ end
55
+
56
+ def record_for_node(node, is_root_record=false)
57
+ case
58
+ when block_given?
59
+ yield node
60
+ when !is_root_record && node['cloud'] && node['cloud']['public_hostname']
61
+ [ :cname, node['cloud']['public_hostname'] ]
62
+ when node['cloud'] && node['cloud']['public_ipv4']
63
+ [ :a, node['cloud']['public_ipv4'] ]
64
+ when !is_root_record && node['fqdn'] && node['fqdn'] !~ /#{Regexp.escape(zone)}$/
65
+ [ :cname, node['fqdn'] ]
66
+ when node['ipaddress']
67
+ [ :a, node['ipaddress'] ]
68
+ end
69
+ end
70
+
71
+ def personalization_token(node)
72
+ node.name.gsub(/[^a-z0-9-]+/, '-')
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,3 @@
1
+ module KnifeDnsUpdate
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "knife-dns-update/version"
2
+ require "knife-dns-update/config"
3
+
4
+ module KnifeDnsUpdate
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ # A smoke test spec to make sure tests actually work
4
+
5
+ module KnifeDnsUpdate
6
+ describe VERSION do
7
+ it 'is equal to itself' do
8
+ expect { VERSION == KnifeDnsUpdate::VERSION }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'minitest/autorun'
5
+ require 'minitest/spec'
6
+ require 'mocha/setup'
7
+ require 'wrong'
8
+ require 'wrong/adapters/minitest'
9
+
10
+ Wrong.config.alias_assert :expect, override: true
11
+ include Wrong
12
+
13
+ if ENV['COVERAGE']
14
+ require 'simplecov'
15
+ SimpleCov.start
16
+ SimpleCov.command_name 'rake spec'
17
+ end
18
+
19
+ require "knife-dns-update"
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knife-dns-update
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Maciej Pasternacki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chef
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: fog
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.9'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: thor
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 0.18.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.18.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: wrong
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.7.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.7.0
125
+ description: Updates DNS based on Chef database
126
+ email:
127
+ - maciej@pasternacki.net
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - .gitignore
133
+ - .travis.yml
134
+ - CHANGELOG.md
135
+ - CONTRIBUTING.md
136
+ - Gemfile
137
+ - LICENSE.txt
138
+ - README.md
139
+ - Thorfile
140
+ - knife-dns-update.gemspec
141
+ - lib/chef/knife/dns_update.rb
142
+ - lib/knife-dns-update.rb
143
+ - lib/knife-dns-update/config.rb
144
+ - lib/knife-dns-update/version.rb
145
+ - spec/knife-dns-update/version_spec.rb
146
+ - spec/spec_helper.rb
147
+ homepage: https://github.com/3ofcoins/knife-dns-update/
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 2.0.5
168
+ signing_key:
169
+ specification_version: 4
170
+ summary: Updates Route 53 DNS entries based on Chef database contents
171
+ test_files:
172
+ - spec/knife-dns-update/version_spec.rb
173
+ - spec/spec_helper.rb