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 +4 -0
- data/Rakefile +14 -0
- data/VERSION +1 -0
- data/config.ru +3 -0
- data/lib/dnsimple-pdns-provider.rb +55 -0
- data/lib/dnsimple-pdns.rb +108 -0
- data/readme.md +4 -0
- metadata +121 -0
data/Gemfile
ADDED
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,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
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
|
+
|