powerdns_db_cli 0.0.1 → 0.0.2
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 +4 -4
- data/Gemfile +2 -0
- data/TODO +11 -0
- data/bin/pdns +1 -1
- data/lib/powerdns_db_cli/cli/domain.rb +29 -0
- data/lib/powerdns_db_cli/cli/main.rb +22 -0
- data/lib/powerdns_db_cli/cli/record.rb +58 -0
- data/lib/powerdns_db_cli/config.rb +5 -7
- data/lib/powerdns_db_cli/domain.rb +20 -0
- data/lib/powerdns_db_cli/record.rb +24 -0
- data/lib/powerdns_db_cli.rb +4 -1
- data/powerdns_db_cli.gemspec +18 -17
- metadata +20 -3
- data/lib/powerdns_db_cli/cli.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 041f7b796c0fbc1aa45969382b429fd77b8f43f5
|
4
|
+
data.tar.gz: 29e85135c8226e9211eb79451245bb23ef357b31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62e12b5ca43fa88d5781d718e99300f235d840cbe6b9e5cbaa8b9ff4ba2825fafe0af0aa3369723e51877360e29a6876bbd41bf8423467e38863fe6cdb88c72c
|
7
|
+
data.tar.gz: d14579a3a107701f2d92b5c04a80dae00c03b9d8196fe0540113fe2c99d1dd02b6266aee0bc1031d31bb8aa6c46afe239f57a0c38647432c2356b80254678873
|
data/Gemfile
CHANGED
data/TODO
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
More sources of inspiration for the models:
|
2
|
+
|
3
|
+
* https://github.com/liom/nessie/tree/master/app/models
|
4
|
+
* https://github.com/up_the_irons/powerdns-models/tree/master/lib/models
|
5
|
+
* https://github.com/aageyev/pdns-backend/tree/master/app/models
|
6
|
+
* https://github.com/zenops/zendns/tree/master/app/models
|
7
|
+
* https://github.com/meineerde/powerdns_api/tree/master/app/models
|
8
|
+
|
9
|
+
Inspiration for DynDNS:
|
10
|
+
|
11
|
+
* https://github.com/jfqd/dyndns
|
data/bin/pdns
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
module PowerDNS
|
2
|
+
module DB
|
3
|
+
module CLI
|
4
|
+
class Domain < Thor
|
5
|
+
desc 'create <name>', 'Create domain.'
|
6
|
+
def create(name)
|
7
|
+
DB::Domain.create!(name: name, type: 'MASTER')
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'list', 'List domains.'
|
11
|
+
def list
|
12
|
+
headings = [:name, :type]
|
13
|
+
rows = DB::Domain.order(*headings).pluck(*headings)
|
14
|
+
puts Terminal::Table.new(headings: headings, rows: rows)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'remove <name>', 'Remove domain.'
|
18
|
+
def remove(name)
|
19
|
+
DB::Domain.where(name: name, type: 'MASTER').first!.destroy!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Main
|
24
|
+
desc 'domain <action> [args..]', 'Domain actions.'
|
25
|
+
subcommand 'domain', Domain
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PowerDNS
|
2
|
+
module DB
|
3
|
+
module CLI
|
4
|
+
class Main < Thor
|
5
|
+
package_name 'pdns'
|
6
|
+
|
7
|
+
map '-i' => :irb
|
8
|
+
|
9
|
+
desc 'irb', 'Start interactive shell.'
|
10
|
+
def irb
|
11
|
+
Shell.start(PowerDNS::DB)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(*)
|
15
|
+
@config = Config.instance
|
16
|
+
ActiveRecord::Base.establish_connection(@config)
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module PowerDNS
|
2
|
+
module DB
|
3
|
+
module CLI
|
4
|
+
class Record < Thor
|
5
|
+
include Thor::Actions
|
6
|
+
|
7
|
+
desc 'create <domain> <name> <type> <content> [prio] [ttl] [auth]', 'Create record.'
|
8
|
+
def create(domain, name, type, content, prio = 0, ttl = 38400, auth = 'true')
|
9
|
+
d = DB::Domain.where(name: domain).first!
|
10
|
+
|
11
|
+
d.records.create! \
|
12
|
+
name: name,
|
13
|
+
type: type,
|
14
|
+
content: content,
|
15
|
+
prio: prio,
|
16
|
+
ttl: ttl,
|
17
|
+
auth: auth == 'true'
|
18
|
+
end
|
19
|
+
|
20
|
+
desc 'list <domain>', 'List records of domain.'
|
21
|
+
def list(domain)
|
22
|
+
d = DB::Domain.where(name: domain).first!
|
23
|
+
|
24
|
+
h = [:name, :type, :prio, :content, :ttl, :auth]
|
25
|
+
r = d.records.order(*h[0..1]).pluck(*h)
|
26
|
+
|
27
|
+
t = Terminal::Table.new(headings: h, rows: r)
|
28
|
+
t.align_column(0, :right)
|
29
|
+
|
30
|
+
puts t
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'remove <domain> <name> <type> [content] [prio]', 'Remove record.'
|
34
|
+
def remove(domain, name, type, content = nil, prio = nil)
|
35
|
+
d = DB::Domain.where(name: domain).first!
|
36
|
+
|
37
|
+
h = { name: name, type: type }
|
38
|
+
h[:content] = content unless content.nil?
|
39
|
+
h[:prio] = prio unless prio.nil?
|
40
|
+
|
41
|
+
r = d.records.where(h)
|
42
|
+
c = r.size
|
43
|
+
|
44
|
+
if c > 0
|
45
|
+
r.destroy_all if yes?("Delete #{c} records?")
|
46
|
+
else
|
47
|
+
say("No records found.")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Main
|
53
|
+
desc 'record <action> [args..]', 'Record actions.'
|
54
|
+
subcommand 'record', Record
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -6,7 +6,7 @@ module PowerDNS
|
|
6
6
|
class Config < Hash
|
7
7
|
include Singleton
|
8
8
|
|
9
|
-
PATH = File.expand_path('~/.config/PowerDNS/db_cli.
|
9
|
+
PATH = File.expand_path('~/.config/PowerDNS/db_cli.yml')
|
10
10
|
|
11
11
|
DEFAULT = {
|
12
12
|
adapter: 'postgresql',
|
@@ -14,15 +14,13 @@ module PowerDNS
|
|
14
14
|
port: 5432,
|
15
15
|
database: 'pdns',
|
16
16
|
username: 'postgres',
|
17
|
-
password: ''
|
17
|
+
password: '',
|
18
|
+
default_soa: 'ns.example.com. dns.example.com. 1970010100 60 3600 604800 40000'
|
18
19
|
}
|
19
20
|
|
20
21
|
def initialize
|
21
|
-
|
22
|
-
|
23
|
-
else
|
24
|
-
self.merge!(DEFAULT)
|
25
|
-
end
|
22
|
+
self.merge!(DEFAULT)
|
23
|
+
self.merge!(YAML.load_file(PATH)) if File.exists?(PATH)
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -6,6 +6,8 @@ module PowerDNS
|
|
6
6
|
|
7
7
|
has_many :records, dependent: :destroy
|
8
8
|
|
9
|
+
after_create :create_soa_record
|
10
|
+
|
9
11
|
self.inheritance_column = :sti
|
10
12
|
|
11
13
|
validates :name,
|
@@ -31,6 +33,24 @@ module PowerDNS
|
|
31
33
|
def slave?
|
32
34
|
self.type == 'SLAVE'
|
33
35
|
end
|
36
|
+
|
37
|
+
def soa_record
|
38
|
+
records.where(type: 'SOA').first!
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def create_soa_record
|
44
|
+
records.create! \
|
45
|
+
name: self.name,
|
46
|
+
type: 'SOA',
|
47
|
+
content: Config.instance[:default_soa],
|
48
|
+
ttl: 38400,
|
49
|
+
prio: 0,
|
50
|
+
auth: true
|
51
|
+
|
52
|
+
soa_record.update_serial!
|
53
|
+
end
|
34
54
|
end
|
35
55
|
end
|
36
56
|
end
|
@@ -19,6 +19,23 @@ module PowerDNS
|
|
19
19
|
|
20
20
|
before_validation :append_domain_name!, if: :domain_id?
|
21
21
|
before_save :update_change_date
|
22
|
+
after_save :update_soa_serial
|
23
|
+
|
24
|
+
def update_serial
|
25
|
+
return if self.type != 'SOA'
|
26
|
+
|
27
|
+
a = self.content.split(' ')
|
28
|
+
i = a[2][8..-1].to_i + 1
|
29
|
+
t = Time.now.strftime('%Y%m%d')
|
30
|
+
|
31
|
+
a[2] = t + "%02d" % i
|
32
|
+
self.content = a.join(' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_serial!
|
36
|
+
update_serial
|
37
|
+
save!
|
38
|
+
end
|
22
39
|
|
23
40
|
private
|
24
41
|
|
@@ -35,6 +52,13 @@ module PowerDNS
|
|
35
52
|
def update_change_date
|
36
53
|
self.change_date = Time.now.to_i
|
37
54
|
end
|
55
|
+
|
56
|
+
def update_soa_serial
|
57
|
+
unless self.type == 'SOA' || @serial_updated || self.domain.slave?
|
58
|
+
self.domain.soa_record.update_serial!
|
59
|
+
@serial_updated = true
|
60
|
+
end
|
61
|
+
end
|
38
62
|
end
|
39
63
|
end
|
40
64
|
end
|
data/lib/powerdns_db_cli.rb
CHANGED
@@ -4,6 +4,7 @@ module PowerDNS
|
|
4
4
|
end
|
5
5
|
|
6
6
|
require 'active_record'
|
7
|
+
require 'terminal-table'
|
7
8
|
require 'thor'
|
8
9
|
|
9
10
|
require 'powerdns_db_cli/cryptokey'
|
@@ -16,4 +17,6 @@ require 'powerdns_db_cli/tsigkey'
|
|
16
17
|
require 'powerdns_db_cli/config'
|
17
18
|
require 'powerdns_db_cli/shell'
|
18
19
|
|
19
|
-
require 'powerdns_db_cli/cli'
|
20
|
+
require 'powerdns_db_cli/cli/main'
|
21
|
+
require 'powerdns_db_cli/cli/domain'
|
22
|
+
require 'powerdns_db_cli/cli/record'
|
data/powerdns_db_cli.gemspec
CHANGED
@@ -1,22 +1,23 @@
|
|
1
|
-
Gem::Specification.new do |
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'powerdns_db_cli'
|
3
|
+
s.version = '0.0.2'
|
4
|
+
s.authors = ['henning mueller']
|
5
|
+
s.email = ['mail@nning.io']
|
6
6
|
|
7
|
-
|
8
|
-
#
|
9
|
-
|
10
|
-
|
7
|
+
s.summary = 'Minimal command-line interface for PowerDNS database administration.'
|
8
|
+
# s.description = %q{TODO: Write a longer description. Optional.}
|
9
|
+
s.homepage = ''
|
10
|
+
s.license = 'MIT'
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
s.files = `git ls-files -z`.split("\x0")
|
13
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
15
|
+
s.require_paths = ['lib']
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
s.add_development_dependency 'bundler', '~> 1.7'
|
18
|
+
s.add_development_dependency 'rake', '~> 10.0'
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
s.add_runtime_dependency 'activerecord', '~> 4.1'
|
21
|
+
s.add_runtime_dependency 'thor', '~> 0.19'
|
22
|
+
s.add_runtime_dependency 'terminal-table', '~> 1.4.5'
|
22
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: powerdns_db_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- henning mueller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.19'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: terminal-table
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.4.5
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.4.5
|
69
83
|
description:
|
70
84
|
email:
|
71
85
|
- mail@nning.io
|
@@ -79,9 +93,12 @@ files:
|
|
79
93
|
- LICENSE
|
80
94
|
- README.md
|
81
95
|
- Rakefile
|
96
|
+
- TODO
|
82
97
|
- bin/pdns
|
83
98
|
- lib/powerdns_db_cli.rb
|
84
|
-
- lib/powerdns_db_cli/cli.rb
|
99
|
+
- lib/powerdns_db_cli/cli/domain.rb
|
100
|
+
- lib/powerdns_db_cli/cli/main.rb
|
101
|
+
- lib/powerdns_db_cli/cli/record.rb
|
85
102
|
- lib/powerdns_db_cli/config.rb
|
86
103
|
- lib/powerdns_db_cli/cryptokey.rb
|
87
104
|
- lib/powerdns_db_cli/domain.rb
|
data/lib/powerdns_db_cli/cli.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module PowerDNS
|
2
|
-
module DB
|
3
|
-
class CLI < Thor
|
4
|
-
package_name 'pdns'
|
5
|
-
|
6
|
-
map '-i' => :irb
|
7
|
-
|
8
|
-
desc 'irb', 'Start interactive shell.'
|
9
|
-
def irb
|
10
|
-
PowerDNS::DB::Shell.start(PowerDNS::DB)
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize(*)
|
14
|
-
@config = Config.instance
|
15
|
-
ActiveRecord::Base.establish_connection(@config)
|
16
|
-
super
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|