knife-dns-update 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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