vagrant-powerdns 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5b98ac2809c2093b13f504075eec9735f4481722
4
+ data.tar.gz: 3cda97d2e2071e4dc42c72f7a03c4cc431ec1d18
5
+ SHA512:
6
+ metadata.gz: 6fe362fb842a4b5502f5c53e049d968048f216e48f5d3dd85190c94bbe4799d57fef412b5b977ca25b4d85655bae4edb1246d6ab1d30c70cf12219637ba2b3d2
7
+ data.tar.gz: 71767572bba48605415ffd2febc5b56a09e5bf7fab432e8d186013337ca606d08295ffdc58b2f7ce583fcce0a177b48bc0bcf76c09d4dea5bdf00c9f1d310d9a
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ Vagrantfile
12
+ .vagrant/
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.3
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "https://rubygems.org"
2
+
3
+ group :development do
4
+ gem "vagrant", git: "https://github.com/mitchellh/vagrant.git"
5
+ end
6
+
7
+ group :plugins do
8
+ # gem "vagrant-env"
9
+ # gem "pry-byebug"
10
+ # gem "httparty"
11
+ # gem "vagrant-xenserver", :path => "/Users/ayik/Repositories/xen/vagrant-xenserver"
12
+ gem "vagrant-powerdns", path: "."
13
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Sayid Munawar
4
+ Copyright (c) 2013 Matthias Kadenbach (https://github.com/mattes/vagrant-dnsmasq)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # Vagrant PowerDNS
2
+
3
+ This Vagrant Plugins manage DNS `A` Record whenever you do `vagrant up` or `vagrant destroy`. Tested with old/compatible API of PowerDNS 4, so it should be configured with `last-3x-compat` tag
4
+
5
+ ## Installation
6
+
7
+ $ vagrant plugin install vagrant-powerdns
8
+
9
+ ## Usage
10
+
11
+ Vagrantfile Example
12
+
13
+ ```ruby
14
+ VAGRANTFILE_API_VERSION = "2"
15
+
16
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
17
+ config.vm.box = "centos7"
18
+ config.vm.hostname = "ayik"
19
+
20
+ # PowerDNS API Configuration
21
+ config.powerdns.api_url = "http://powerdns:8081"
22
+ config.powerdns.api_key = "rahasia"
23
+ config.powerdns.default_zone = "dev.example.com"
24
+
25
+ config.vm.network "public_network", ip: "192.168.2.2"
26
+ end
27
+ ```
28
+
29
+ ## Contributing
30
+
31
+ Bug reports and pull requests are welcome on GitHub at https://github.com/chenull/vagrant-powerdns.
32
+
33
+
34
+ ## License
35
+
36
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
37
+
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler::GemHelper.install_tasks
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "vagrant-powerdns"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
File without changes
File without changes
@@ -0,0 +1,146 @@
1
+ module Vagrant
2
+ module Action
3
+
4
+ class Up
5
+ def initialize(app, env)
6
+ @app = app
7
+ @machine = env[:machine]
8
+ @host = env[:machine].config.vm.hostname.nil? ?
9
+ env[:machine].name.to_s : env[:machine].config.vm.hostname.to_s
10
+ @domain = @host + env[:machine].config.powerdns.default_zone.to_s
11
+ @zone = env[:machine].config.powerdns.default_zone.name
12
+
13
+ # Identify who i am
14
+ @myname = Etc.getpwuid[:gecos]
15
+ @myuser = Etc.getlogin.gsub(/\s+/, '')
16
+ @myhost = Socket.gethostname
17
+ end
18
+
19
+ def call(env)
20
+ if @machine.config.powerdns.enabled?
21
+ # assume default gateway address
22
+ @machine.communicate.sudo "ip route get to 8.8.8.8 | head -n 1" do |type,data|
23
+ stdout = data.chomp if type == :stdout
24
+ if !stdout.empty?
25
+ re = /src ([0-9\.]+)/
26
+ ip = stdout.match(re)[1]
27
+
28
+ p = PdnsRestApiClient.new(env[:machine].config.powerdns.api_url,
29
+ env[:machine].config.powerdns.api_key)
30
+
31
+ # Only update if IP changed
32
+ if p.zone(@zone)["records"].select { |v| v["type"] == "A" and
33
+ v["name"] == @domain and v["content"] == ip}.empty?
34
+
35
+ env[:ui].info "PowerDNS action..."
36
+ # Append new comment
37
+ new_comment = {
38
+ content: "#{@myname} (#{@myuser}) added this record from #{@myhost}",
39
+ account: @myname,
40
+ name: @domain,
41
+ type: "A"
42
+ }
43
+ comments = p.zone(@zone)["comments"].delete_if { |v| v["name"] != @domain }
44
+ comments << new_comment
45
+
46
+ ret = p.modify_domain(domain: @domain, ip: ip, zone_id: @zone,
47
+ comments: comments)
48
+
49
+ # Check return
50
+ error = nil
51
+ if ret.is_a?(String)
52
+ error = ret
53
+ else
54
+ if ret.is_a?(Hash)
55
+ error = ret.values[0] if ret.keys[0] == "error"
56
+ else
57
+ raise "Unknown esponse from PowerDNS API"
58
+ end
59
+ end
60
+
61
+ # Display ui
62
+ if error.nil?
63
+ env[:ui].detail "=> record #{@domain}(#{ip}) in zone #{@zone} added !"
64
+ else
65
+ env[:ui].detail "=> failed to add record #{@domain}(#{ip}) in zone #{@zone}. Error was: #{error}"
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ @app.call(env)
72
+ end
73
+ end
74
+ end
75
+
76
+
77
+ class Destroy
78
+ def initialize(app, env)
79
+ @app = app
80
+ @machine = env[:machine]
81
+ @host = env[:machine].config.vm.hostname.nil? ?
82
+ env[:machine].name.to_s : env[:machine].config.vm.hostname.to_s
83
+ @domain = @host + env[:machine].config.powerdns.default_zone.to_s
84
+ @zone = env[:machine].config.powerdns.default_zone.name
85
+
86
+ # Identify who i am
87
+ @myname = Etc.getpwuid[:gecos]
88
+ @myuser = Etc.getlogin.gsub(/\s+/, '')
89
+ @myhost = Socket.gethostname
90
+ end
91
+
92
+ def call(env)
93
+ if @machine.config.powerdns.enabled?
94
+ p = PdnsRestApiClient.new(env[:machine].config.powerdns.api_url,
95
+ env[:machine].config.powerdns.api_key)
96
+
97
+ # Get A record
98
+ record = p.zone(@zone)
99
+
100
+ # only disable if active
101
+ if not record["records"].find {|v| v["name"] == @domain}["disabled"]
102
+ env[:ui].info "PowerDNS action..."
103
+
104
+ # Prepare comment to be appended
105
+ new_comment = {
106
+ content: "#{@myname} (#{@myuser}) disabled this record from #{@myhost}",
107
+ account: @myname,
108
+ name: @domain,
109
+ type: "A"
110
+ }
111
+ comments = record["comments"].delete_if { |v| v["name"] != @domain }
112
+ comments << new_comment
113
+
114
+ # Get the old IP
115
+ ip = record["records"].find {|v| v["name"] == @domain}["content"]
116
+
117
+ ret = p.disable_domain(domain: @domain, ip: ip, zone_id: @zone,
118
+ comments: comments)
119
+
120
+ # Check return
121
+ error = nil
122
+ if ret.is_a?(String)
123
+ error = ret
124
+ else
125
+ if ret.is_a?(Hash)
126
+ error = ret.values[0] if ret.keys[0] == "error"
127
+ else
128
+ raise "Unknown esponse from PowerDNS API"
129
+ end
130
+ end
131
+
132
+ # Display ui
133
+ if error.nil?
134
+ env[:ui].detail "=> record #{@domain}(#{ip}) in zone #{@zone} disabled !"
135
+ else
136
+ env[:ui].detail "=> failed to disab;e record #{@domain} in zone #{@zone}. Error was: #{error}"
137
+ end
138
+ end
139
+
140
+ @app.call(env)
141
+ end
142
+ end
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,80 @@
1
+ module Vagrant
2
+ module PowerDNS
3
+ class Config < Vagrant.plugin("2", :config)
4
+
5
+ attr_accessor :api_url
6
+ attr_accessor :api_key
7
+ attr_accessor :default_zone
8
+ attr_accessor :disable
9
+
10
+ def initialize
11
+ @api_url = UNSET_VALUE
12
+ @api_key = UNSET_VALUE
13
+ @default_zone = UNSET_VALUE
14
+ @disable = UNSET_VALUE
15
+ end
16
+
17
+ def finalize!
18
+
19
+ if @default_zone == UNSET_VALUE
20
+ @default_zone = nil
21
+ elsif !@default_zone.is_a?(Zone)
22
+ @default_zone = Zone.new @default_zone;
23
+ end
24
+
25
+ @disable = false if @disable == UNSET_VALUE
26
+
27
+ # default way to obtain ip address
28
+ if @ip == UNSET_VALUE
29
+ @ip = proc do |guest_machine|
30
+ ips = nil
31
+ puts "SUDO SUUUUUU............"
32
+ guest_machine.communicate.sudo("hostname -I") do |type, data|
33
+ ips = data.scan /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
34
+ end
35
+ ips
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ def enabled?
42
+ not @disable and not @api_url.nil? and not @api_key.nil?
43
+ end
44
+
45
+ def validate(machine)
46
+ return unless enabled?
47
+
48
+ errors = []
49
+
50
+ # verify @disable
51
+ if @disable != true and @disable != false then errors << 'invalid disable setting' end
52
+
53
+ # verify zone
54
+ begin @default_zone = Zone.new @default_zone; rescue => e; errors << e.message end
55
+
56
+ # verify ip
57
+ if @ip.is_a? Array
58
+ @ip.map!{|ip| begin Ip.new(ip); rescue => e; errors << e.message end}
59
+
60
+ elsif @ip.is_a? String
61
+ begin @ip = Ip.new(@ip); rescue => e; errors << e.message end
62
+ @ip = [@ip]
63
+
64
+ elsif @ip.is_a? Proc
65
+ # okay, there is nothing to verify at the moment
66
+ else
67
+ @ip = nil
68
+ end
69
+
70
+ # verify API URL/key
71
+ #if @resolver
72
+ # errors << "file '#{@dnsmasqconf}' does not exist" unless File.exists? @dnsmasqconf
73
+ #end
74
+
75
+ return { 'PowerDNS configuration' => errors }
76
+ end
77
+
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,17 @@
1
+ require "vagrant"
2
+
3
+ module Vagrant
4
+ module PowerDNS
5
+ module Errors
6
+ class PowerDNSError < Vagrant::Errors::VagrantError
7
+ error_namespace("vagrant_powerdns.errors")
8
+ end
9
+
10
+ class APIError < PowerDNSError
11
+ error_key(:api_error)
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2013 Matthias Kadenbach
2
+ # https://github.com/mattes/vagrant-dnsmasq
3
+
4
+ class Ip
5
+
6
+ MATCH_IP4 = /^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})){3}$/
7
+
8
+ def initialize(ipv4)
9
+
10
+ if ipv4.is_a? Ip
11
+ ipv4 = ipv4.v4
12
+ end
13
+
14
+ raise ArgumentError, "IPv4 '#{ipv4}' must match #{MATCH_IP4}" unless Ip::ipv4_valid?(ipv4)
15
+
16
+ @ipv4 = ipv4
17
+ end
18
+
19
+ def self.ipv4_valid?(ipv4)
20
+ if not ipv4.blank? and Ip::MATCH_IP4.match(ipv4) then true else false end
21
+ end
22
+
23
+ def v4
24
+ @ipv4
25
+ end
26
+
27
+ def to_s
28
+ v4
29
+ end
30
+
31
+ end
@@ -0,0 +1,41 @@
1
+ # Copyright (c) 2013 Matthias Kadenbach
2
+ # https://github.com/mattes/vagrant-dnsmasq
3
+
4
+ class Zone
5
+
6
+ MATCH = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*$/
7
+
8
+ def initialize(name)
9
+ @name = nil
10
+
11
+ if name.is_a? Zone
12
+ name = name.dotted
13
+ end
14
+
15
+ raise ArgumentError, "no domain name given" if name.empty?
16
+
17
+ # parse domain name ...
18
+ name = name.to_s
19
+ name = name[1..-1] if name.start_with? '.'
20
+ name = name.downcase
21
+ raise ArgumentError, "Zone '#{name}' must match #{MATCH}" unless Zone::valid?(name)
22
+ @name = name # without leading .
23
+ end
24
+
25
+ def self.valid?(name)
26
+ if not name.empty? and Zone::MATCH.match(name.downcase) then true else false end
27
+ end
28
+
29
+ def dotted
30
+ '.' + @name
31
+ end
32
+
33
+ def name
34
+ @name
35
+ end
36
+
37
+ def to_s
38
+ dotted
39
+ end
40
+
41
+ end
@@ -0,0 +1,177 @@
1
+ # Copyright 2015 Arnoud Vermeer (https://github.com/funzoneq/powerdns-rest-api-client)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'httparty'
16
+ require 'json'
17
+
18
+ # A class to interact with the PowerDNS REST API
19
+ # https://doc.powerdns.com/md/httpapi/api_spec/
20
+ class PdnsRestApiClient
21
+ include HTTParty
22
+ attr_accessor :base_uri
23
+
24
+ def initialize(base_uri, api_key)
25
+ self.class.base_uri base_uri
26
+
27
+ self.class.headers 'X-API-Key' => api_key
28
+
29
+ @api_key = api_key
30
+ end
31
+
32
+ def servers
33
+ self.class.get('/servers')
34
+ end
35
+
36
+ def server(server_id)
37
+ self.class.get("/servers/#{server_id}")
38
+ end
39
+
40
+ def config(server_id)
41
+ self.class.get("/servers/#{server_id}/config")
42
+ end
43
+
44
+ def setting(server_id, config_setting_name)
45
+ self.class.get("/servers/#{server_id}/config/#{config_setting_name}")
46
+ end
47
+
48
+ def zones(server_id='localhost')
49
+ self.class.get("/servers/#{server_id}/zones")
50
+ end
51
+
52
+ def zone(zone_id, server_id='localhost')
53
+ self.class.get("/servers/#{server_id}/zones/#{zone_id}")
54
+ end
55
+
56
+ def modify_zone(zone, server_id='localhost')
57
+ self.class.post("/servers/#{server_id}/zones", body: zone.to_json)
58
+ end
59
+
60
+ def create_zone(domain, nsServers=[], kind='Native', masters=[], server_id='localhost')
61
+ zone = { name: domain, kind: kind, masters: masters, nameservers: nsServers }
62
+
63
+ modify_zone(zone, server_id)
64
+ end
65
+
66
+ def delete_zone(zone_id, server_id='localhost')
67
+ self.class.delete("/servers/#{server_id}/zones/#{zone_id}")
68
+ end
69
+
70
+ def notify(zone_id, server_id='localhost')
71
+ self.class.put("/servers/#{server_id}/zones/#{zone_id}/notify")
72
+ end
73
+
74
+ def axfr_retrieve(zone_id, server_id='localhost')
75
+ self.class.put("/servers/#{server_id}/zones/#{zone_id}/axfr-retrieve")
76
+ end
77
+
78
+ def zone_export(zone_id, server_id='localhost')
79
+ self.class.get("/servers/#{server_id}/zones/#{zone_id}/export")
80
+ end
81
+
82
+ def search_log(search_term, server_id='localhost')
83
+ self.class.get("/servers/#{server_id}/search-log", query: { q: search_term })
84
+ end
85
+
86
+ def stats(server_id='localhost')
87
+ self.class.get("/servers/#{server_id}/statistics")
88
+ end
89
+
90
+ def get_comments(domain, zone_id, server_id='localhost')
91
+ puts
92
+ end
93
+
94
+ def modify_domain(domain:, ip:, zone_id:, server_id:'localhost', comments: nil)
95
+ # {
96
+ # :rrsets => [
97
+ # [0] {
98
+ # :name => "gundul.dev.jcamp.net",
99
+ # :type => "A",
100
+ # :records => [
101
+ # [0] {
102
+ # :name => "gundul.dev.jcamp.net",
103
+ # :type => "A",
104
+ # :ttl => 3600,
105
+ # :disabled => false,
106
+ # :content => "192.168.10.11"
107
+ # }
108
+ # ],
109
+ # :comments => [
110
+ # [0] {
111
+ # :name => "gundul.dev.jcamp.net",
112
+ # :type => "A",
113
+ # :modified_at => 1461239952,
114
+ # :account => "ayik",
115
+ # :content => "NGopoE cuk..."
116
+ # }
117
+ # ],
118
+ # :changetype => "replace"
119
+ # }
120
+ # ]
121
+ # }
122
+ @body = {
123
+ rrsets: [
124
+ {
125
+ name: domain,
126
+ type: "A",
127
+ records: [
128
+ {
129
+ name: domain,
130
+ type: "A",
131
+ ttl: 300,
132
+ disabled: false,
133
+ content: ip
134
+ }
135
+ ],
136
+ changetype: "replace"
137
+ }
138
+ ]
139
+ }
140
+ if !comments.nil?
141
+ @body[:rrsets][0][:comments] = comments
142
+ end
143
+ self.class.patch("/servers/#{server_id}/zones/#{zone_id}", body: @body.to_json)
144
+ end
145
+
146
+ def disable_domain(domain:, zone_id:, ip:, server_id:'localhost', comments: nil)
147
+ @body = {
148
+ rrsets: [
149
+ {
150
+ name: domain,
151
+ type: "A",
152
+ records: [
153
+ {
154
+ name: domain,
155
+ type: "A",
156
+ ttl: 300,
157
+ content: ip,
158
+ disabled: true
159
+ }
160
+ ],
161
+ changetype: "replace"
162
+ }
163
+ ]
164
+ }
165
+ if !comments.nil?
166
+ @body[:rrsets][0][:comments] = comments
167
+ end
168
+ self.class.patch("/servers/#{server_id}/zones/#{zone_id}", body: @body.to_json)
169
+ end
170
+ # def trace(server_id='localhost')
171
+ # self.class.get("/servers/#{server_id}/trace")
172
+ # end
173
+
174
+ # def zone_check(zone_id, server_id='localhost')
175
+ # self.class.get("/servers/#{server_id}/zones/#{zone_id}/check")
176
+ # end
177
+ end
@@ -0,0 +1,5 @@
1
+ module Vagrant
2
+ module PowerDNS
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,45 @@
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "The Vagrant-PowerDNS plugin must be run within Vagrant."
5
+ end
6
+
7
+
8
+ module Vagrant
9
+ module PowerDNS
10
+ class Plugin < Vagrant.plugin("2")
11
+ name "vagrant-powerdns"
12
+ description "A PowerDNS Vagrant plugin that manages the zone record via vagrant up/destroy"
13
+
14
+ inc_path = Pathname.new(File.expand_path("../vagrant-powerdns/includes", __FILE__))
15
+ require inc_path.join("Zone.class.rb")
16
+ require inc_path.join("Ip.class.rb")
17
+
18
+ util_path = Pathname.new(File.expand_path("../vagrant-powerdns/util", __FILE__))
19
+ require util_path.join("pdns_api")
20
+
21
+ lib_path = Pathname.new(File.expand_path("../vagrant-powerdns", __FILE__))
22
+ require lib_path.join("action")
23
+
24
+ config "powerdns" do
25
+ require lib_path.join("config")
26
+ Config
27
+ end
28
+
29
+ action_hook(:powerdns, :machine_action_up) do |hook|
30
+ hook.append(Vagrant::Action::Up)
31
+ end
32
+
33
+ action_hook(:powerdns, :machine_action_destroy) do |hook|
34
+ hook.append(Vagrant::Action::Destroy)
35
+ end
36
+
37
+ autoload :Errors, lib_path.join("errors")
38
+
39
+ source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
40
+ I18n.load_path << File.expand_path('locales/en.yml', source_root)
41
+ I18n.reload!
42
+ end
43
+ end
44
+
45
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,15 @@
1
+ en:
2
+ vagrant_powerdns:
3
+ config:
4
+ api_url: |-
5
+ powerdns URL must be defined via "api_url"
6
+ api_key: |-
7
+ powerdns API Key must be defined via "api_key"
8
+ errors:
9
+ api_error: |-
10
+ API authentication error. Please check "api_url" and "api_key"
11
+ info:
12
+ post_record: |-
13
+ Creating record %{host} with address %{ip} into zone %{zone}
14
+ delete_record: |-
15
+ Deleting record %{host} from zone %{zone}
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vagrant-powerdns/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vagrant-powerdns"
8
+ spec.version = Vagrant::PowerDNS::VERSION
9
+ spec.authors = ["Sayid Munawar"]
10
+ spec.email = ["sayid.munawar@gmail.com"]
11
+
12
+ spec.summary = "Vagrant plugin to manage powerdns zone record"
13
+ spec.description = "This plugin will push changes to PowerDNS API after vagrant up / halt"
14
+ spec.homepage = "https://github.com/chenull/vagrant-powerdns"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.10"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+
25
+ spec.add_runtime_dependency "httparty", "~> 0.13.7"
26
+ spec.add_runtime_dependency "json"
27
+
28
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-powerdns
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sayid Munawar
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-04-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.13.7
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.13.7
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: This plugin will push changes to PowerDNS API after vagrant up / halt
70
+ email:
71
+ - sayid.munawar@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".ruby-version"
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - bin/console
83
+ - bin/setup
84
+ - lib/vagrant-powerdns.rb
85
+ - lib/vagrant-powerdns/action.rb
86
+ - lib/vagrant-powerdns/action/add_record.rb
87
+ - lib/vagrant-powerdns/action/del_record.rb
88
+ - lib/vagrant-powerdns/config.rb
89
+ - lib/vagrant-powerdns/errors.rb
90
+ - lib/vagrant-powerdns/includes/Ip.class.rb
91
+ - lib/vagrant-powerdns/includes/Zone.class.rb
92
+ - lib/vagrant-powerdns/util/pdns_api.rb
93
+ - lib/vagrant-powerdns/version.rb
94
+ - locales/en.yml
95
+ - vagrant-powerdns.gemspec
96
+ homepage: https://github.com/chenull/vagrant-powerdns
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.4.5.1
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Vagrant plugin to manage powerdns zone record
120
+ test_files: []