dnsimple-pdns-provider 0.2.0

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