dnsimple-pdns-provider 0.2.0

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.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "grape"
4
+ gem "sqlite3-ruby"
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'jeweler'
2
+
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "dnsimple-pdns-provider"
5
+ gem.homepage = "https://github.com/aetrion/powerdns-sqlite-provider"
6
+ gem.license = "Apache"
7
+ gem.summary = %Q{DNSimple service provider}
8
+ gem.description = %Q{SQLite3 backed PowerDNS service provider for DNSimple}
9
+ gem.email = "dje@dnsimple.com"
10
+ gem.authors = ["Darrin Eden"]
11
+ gem.add_dependency "grape"
12
+ gem.add_dependency "sqlite3-ruby"
13
+ end
14
+ Jeweler::RubygemsDotOrgTasks.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
data/config.ru ADDED
@@ -0,0 +1,3 @@
1
+ require "powerdns-sqlite-provider"
2
+
3
+ run PowerDNSSQLite::API
@@ -0,0 +1,55 @@
1
+ require "grape"
2
+ require "yaml"
3
+ require "dnsimple-pdns"
4
+
5
+ module DNSimple
6
+ class Pdns::API < Grape::API
7
+
8
+ helpers do
9
+ def config
10
+ @config ||= YAML.load_file( ENV["pdns.config"] )
11
+ end
12
+
13
+ def pdns
14
+ @pdns = Pdns.new( config["db"], config["nameservers"] )
15
+ end
16
+
17
+ def authenticate( secret )
18
+ if secret != config["shared_secret"]
19
+ error!( "401 Unauthorized", 401 )
20
+ end
21
+ end
22
+ end
23
+
24
+ resources :domain do
25
+ post :create do
26
+ authenticate( params[:secret] )
27
+ pdns.create_domain( params[:domain] )
28
+ pdns.list_name_servers( params[:domain] )
29
+ end
30
+
31
+ post :delete do
32
+ authenticate( params[:secret] )
33
+ pdns.delete_domain( params[:domain] )
34
+ end
35
+ end
36
+
37
+ resources :record do
38
+ post :create do
39
+ authenticate( params[:secret] )
40
+ pdns.create_record( params )
41
+ end
42
+
43
+ post :update do
44
+ authenticate( params[:secret] )
45
+ pdns.update_record( params )
46
+ end
47
+
48
+ post :delete do
49
+ authenticate( params[:secret] )
50
+ pdns.delete_record( params )
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,108 @@
1
+ require "sqlite3"
2
+
3
+ module DNSimple
4
+ class Pdns
5
+
6
+ def initialize( db_path, nameservers )
7
+ @db_path = db_path
8
+ @nameservers = nameservers
9
+ end
10
+
11
+ def db
12
+ @db ||= SQLite3::Database.new @db_path
13
+ end
14
+
15
+ def create_domain( domain )
16
+
17
+ nameserver = @nameservers.first
18
+ email = "dnsadmin.#{domain}"
19
+ serial = Time.now.strftime( "%Y%m%d%H%M%S" )
20
+ ttl = 3600
21
+
22
+ begin
23
+ db.execute "insert into domains " +
24
+ "(name, type) values ('#{domain}', 'NATIVE')"
25
+
26
+ # Start of authority (SOA) record
27
+ db.execute "insert into records " +
28
+ "(domain_id, name, type, content, ttl, prio) " +
29
+ "select id, '#{domain}', 'SOA', " +
30
+ "'#{nameserver} #{email} #{serial} 3600 600 86400', #{ttl}, 0 " +
31
+ "from domains where name='#{domain}'"
32
+
33
+ # Name server record
34
+ db.execute "insert into records " +
35
+ "(domain_id, name, type, content, ttl, prio) " +
36
+ "select id, '#{domain}', 'NS', '#{nameserver}', #{ttl}, 0 " +
37
+ "from domains where name='#{domain}'"
38
+ rescue SQLite3::ConstraintException
39
+ "Domain already exists."
40
+ end
41
+
42
+ "Domain created."
43
+ end
44
+
45
+ def delete_domain( domain )
46
+ db.execute "delete from records where name = '#{domain}'"
47
+ db.execute "delete from domains where name = '#{domain}'"
48
+ "Domain deleted."
49
+ end
50
+
51
+ def list_name_servers( domain )
52
+ db.execute( "select content from records " +
53
+ "where type = 'NS' and " +
54
+ "name = '#{domain}'" ).flatten
55
+ end
56
+
57
+ def create_record( params )
58
+ name = record_name( params )
59
+ type = params[:record_type]
60
+ content = params[:content]
61
+ ttl = params[:ttl]
62
+ prio = params[:prio] ||= 0
63
+
64
+ db.execute "insert into records " +
65
+ "(domain_id, name, type, content, ttl, prio) " +
66
+ "select id, '#{name}', '#{type}', '#{content}', #{ttl}, #{prio} " +
67
+ "from domains where name = '#{params[:domain]}'"
68
+
69
+ "Record created."
70
+ end
71
+
72
+ def update_record( params )
73
+ name = record_name( params )
74
+ type = params[:record_type]
75
+ previous_content = params[:previous_content]
76
+ content = params[:content]
77
+ ttl = params[:ttl]
78
+ prio = params[:prio] ||= 0
79
+
80
+ db.execute "update records set " +
81
+ "content = '#{content}', ttl = #{ttl}, prio = #{prio} " +
82
+ "where type = '#{type}' " +
83
+ "and content = '#{previous_content}' " +
84
+ "and name = '#{name}'"
85
+
86
+ "Record updated."
87
+ end
88
+
89
+ def delete_record( params )
90
+ db.execute "delete from records " +
91
+ "where type = '#{params[:record_type]}' " +
92
+ "and name = '#{record_name( params )}'"
93
+ "Record deleted."
94
+ end
95
+
96
+ private
97
+
98
+ # Create the fully-qualified record name from the parameters.
99
+ def record_name( params )
100
+ if params[:name].nil? || params[:name] == ''
101
+ params[:domain] + "."
102
+ else
103
+ "#{params[:name]}.#{params[:domain]}"
104
+ end
105
+ end
106
+
107
+ end
108
+ end
data/readme.md ADDED
@@ -0,0 +1,4 @@
1
+ SQLite backed PowerDNS provider for DNSimple
2
+ ============================================
3
+
4
+ TODO: Write README
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dnsimple-pdns-provider
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
+ platform: ruby
11
+ authors:
12
+ - Darrin Eden
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-27 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: grape
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ prerelease: false
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: sqlite3-ruby
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 0
42
+ version: "0"
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: grape
48
+ requirement: &id003 !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *id003
59
+ - !ruby/object:Gem::Dependency
60
+ name: sqlite3-ruby
61
+ requirement: &id004 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ type: :runtime
70
+ prerelease: false
71
+ version_requirements: *id004
72
+ description: SQLite3 backed PowerDNS service provider for DNSimple
73
+ email: dje@dnsimple.com
74
+ executables: []
75
+
76
+ extensions: []
77
+
78
+ extra_rdoc_files: []
79
+
80
+ files:
81
+ - Gemfile
82
+ - Rakefile
83
+ - VERSION
84
+ - config.ru
85
+ - lib/dnsimple-pdns-provider.rb
86
+ - lib/dnsimple-pdns.rb
87
+ - readme.md
88
+ has_rdoc: true
89
+ homepage: https://github.com/aetrion/powerdns-sqlite-provider
90
+ licenses:
91
+ - Apache
92
+ post_install_message:
93
+ rdoc_options: []
94
+
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ segments:
111
+ - 0
112
+ version: "0"
113
+ requirements: []
114
+
115
+ rubyforge_project:
116
+ rubygems_version: 1.3.7
117
+ signing_key:
118
+ specification_version: 3
119
+ summary: DNSimple service provider
120
+ test_files: []
121
+