powerdns_db_cli 0.0.1 → 0.0.2

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