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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e6f3d87c00985c078ee4cc74bc8b65ed5c81a94
4
- data.tar.gz: c304fb1275845242be180ec3daad77cfd30eb6de
3
+ metadata.gz: 041f7b796c0fbc1aa45969382b429fd77b8f43f5
4
+ data.tar.gz: 29e85135c8226e9211eb79451245bb23ef357b31
5
5
  SHA512:
6
- metadata.gz: ea8c9a5dcec8fba3c60202970d2ac957018893c9f319117504f3c660b8d9b8a44cdfbe9889423ee11b871e9f44956b5ee315b79d87f6483402f2dcf536a98acc
7
- data.tar.gz: c7b495741d6d3f9dfb8b23cff779f46ef38975cac1fae6f56e3a55f01dbd76049615d43a5b1606ca0f30562d53437db2c51d13a44fe649f06da235cb9cf6a09e
6
+ metadata.gz: 62e12b5ca43fa88d5781d718e99300f235d840cbe6b9e5cbaa8b9ff4ba2825fafe0af0aa3369723e51877360e29a6876bbd41bf8423467e38863fe6cdb88c72c
7
+ data.tar.gz: d14579a3a107701f2d92b5c04a80dae00c03b9d8196fe0540113fe2c99d1dd02b6266aee0bc1031d31bb8aa6c46afe239f57a0c38647432c2356b80254678873
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
+
4
+ gem 'pg'
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
@@ -5,4 +5,4 @@ $:.unshift(lib) unless $:.include?(lib)
5
5
 
6
6
  require 'powerdns_db_cli'
7
7
 
8
- PowerDNS::DB::CLI.start
8
+ PowerDNS::DB::CLI::Main.start
@@ -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.yaml')
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
- if File.exists?(PATH)
22
- self.merge!(YAML.load_file(PATH))
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
@@ -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'
@@ -1,22 +1,23 @@
1
- Gem::Specification.new do |spec|
2
- spec.name = 'powerdns_db_cli'
3
- spec.version = '0.0.1'
4
- spec.authors = ['henning mueller']
5
- spec.email = ['mail@nning.io']
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
- spec.summary = 'Minimal command-line interface for PowerDNS database administration.'
8
- # spec.description = %q{TODO: Write a longer description. Optional.}
9
- spec.homepage = ''
10
- spec.license = 'MIT'
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
- spec.files = `git ls-files -z`.split("\x0")
13
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
- spec.require_paths = ['lib']
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
- spec.add_development_dependency 'bundler', '~> 1.7'
18
- spec.add_development_dependency 'rake', '~> 10.0'
17
+ s.add_development_dependency 'bundler', '~> 1.7'
18
+ s.add_development_dependency 'rake', '~> 10.0'
19
19
 
20
- spec.add_runtime_dependency 'activerecord', '~> 4.1'
21
- spec.add_runtime_dependency 'thor', '~> 0.19'
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.1
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-10-12 00:00:00.000000000 Z
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
@@ -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