splicer-dns_made_easy 1.0.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/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ splicer-dns_made_easy
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in splicer-dns_made_easy.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Matthew Johnston
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Splicer::DnsMadeEasy
2
+
3
+ [![Code Climate](https://codeclimate.com/github/zippykid/splicer-dns_made_easy.png)](https://codeclimate.com/github/zippykid/splicer-dns_made_easy)
4
+
5
+ TODO: Write a gem description
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'splicer-dns_made_easy'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install splicer-dns_made_easy
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,122 @@
1
+ module Splicer
2
+ module DnsMadeEasy
3
+
4
+ # The client that talks to DnsMadeEasy
5
+ #
6
+ # ## Example Usage
7
+ # client = Splicer::DnsMadeEasy::Client.new('key','secret')
8
+ # client.get('dns/managed/123456')
9
+ #
10
+ # client.post('dns/managed', {name: 'mydumbdomain.com'})
11
+ #
12
+ # @author Matthew A. Johnston
13
+ class Client
14
+ # @param [String] key
15
+ # @param [String] secret
16
+ def initialize(key, secret)
17
+ @key = key
18
+ @secret = secret
19
+ end
20
+
21
+ # @param [String] resource the resource path
22
+ #
23
+ # @raise [Splicer::Errors::Error] when the request fails
24
+ # @return [String]
25
+ def get(resource, params={})
26
+ execute({
27
+ method: :get,
28
+ url: resource_url(resource),
29
+ headers: headers('params' => params)
30
+ })
31
+ end
32
+
33
+
34
+ # @param [String] resource the resource path
35
+ # @param [Hash] payload the data you wish to send
36
+ #
37
+ # @raise [Splicer::Errors::Error] when the request fails
38
+ # @return [String]
39
+ def post(resource, payload)
40
+ execute({
41
+ method: :post,
42
+ url: resource_url(resource),
43
+ payload: process_payload(payload),
44
+ headers: headers
45
+ })
46
+ end
47
+
48
+ # @param [String] resource the resource path
49
+ # @param [Hash] payload the data you wish to send
50
+ #
51
+ # @raise [Splicer::Errors::Error] when the request fails
52
+ # @return [String]
53
+ def put(resource, payload)
54
+ execute({
55
+ method: :put,
56
+ url: resource_url(resource),
57
+ payload: process_payload(payload),
58
+ headers: headers
59
+ })
60
+ end
61
+
62
+ # @param [String] resource the resource path
63
+ # @param [Hash] payload the data you wish to send
64
+ #
65
+ # @raise [Splicer::Errors::Error] when the request fails
66
+ # @return [String]
67
+ def delete(resource, payload={})
68
+ execute({
69
+ method: :delete,
70
+ url: resource_url(resource),
71
+ payload: process_payload(payload),
72
+ headers: headers
73
+ })
74
+ end
75
+
76
+ private
77
+
78
+ # Wrapper around RestClient::Request.execute method
79
+ #
80
+ # @param [Hash] args
81
+ # @raise [Splicer::Errors::Error] when the request fails
82
+ # @return [Hash]
83
+ def execute(args={})
84
+ RestClient::Request.execute(args)
85
+ rescue RestClient::Exception => error
86
+ raise Splicer::Errors::Error.new(error)
87
+ end
88
+
89
+ # Processes the payload to see if it needs to be turned in to JSON
90
+ #
91
+ # @return [String]
92
+ def process_payload(payload)
93
+ payload.is_a?(String) ? payload : payload.to_json
94
+ end
95
+
96
+ # @param [Hash] params
97
+ # @return [Hash]
98
+ def headers(params={})
99
+ @headers ||= {}
100
+ @headers['x-dnsme-apiKey'] = @key
101
+ @headers['x-dnsme-requestDate'] = Splicer::DnsMadeEasy::Time.now.to_date_header
102
+ @headers['x-dnsme-hmac'] = signature
103
+ @headers['Accept'] = 'application/json'
104
+ @headers['Content-Type'] = 'application/json'
105
+ @headers.merge!(params)
106
+ @headers
107
+ end
108
+
109
+ # @param [Hash] params
110
+ # @return [String]
111
+ def signature
112
+ OpenSSL::HMAC.hexdigest('sha1', @secret, @headers['x-dnsme-requestDate'])
113
+ end
114
+
115
+ def resource_url(resource)
116
+ ["https://api.dnsmadeeasy.com/V2.0", resource.gsub(/^\//,'')].join('/')
117
+ end
118
+
119
+ end
120
+
121
+ end
122
+ end
@@ -0,0 +1,22 @@
1
+ module Splicer
2
+ module DnsMadeEasy
3
+
4
+ class Config
5
+ attr_reader :key, :secret
6
+
7
+ def initialize(key, secret)
8
+ @key = key
9
+ @secret = secret
10
+ end
11
+
12
+ def provider
13
+ Provider.new(self)
14
+ end
15
+
16
+ def client
17
+ Client.new(key, secret)
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,130 @@
1
+ module Splicer
2
+ module DnsMadeEasy
3
+
4
+ class Provider
5
+ attr_reader :client
6
+
7
+ def initialize(config)
8
+ @config = config
9
+ @client = config.client
10
+ end
11
+
12
+ def publish(zone, method)
13
+ case method
14
+ when :rewrite
15
+ rewrite(zone)
16
+ when :merge
17
+ merge(zone)
18
+ else
19
+ false
20
+ end
21
+ end
22
+
23
+ # Destroys a zone
24
+ def destroy(zone)
25
+ domain = search(zone.name)
26
+ id = domain['id']
27
+ client.delete("dns/managed/#{id}")
28
+ true
29
+ end
30
+
31
+ private
32
+
33
+ def rewrite(zone)
34
+ domain = search(zone.name)
35
+ unless domain
36
+ domain = create_domain(zone.name)
37
+ end
38
+
39
+ # Nuke all of the records in a zone
40
+ records = JSON.parse(client.get(domain_records_url(domain)))['data']
41
+ unless records.empty?
42
+ delete_records(domain, records.collect { |r| r['id'] })
43
+ end
44
+
45
+ # Time to populate the zone
46
+ zone.records.each do |record|
47
+ create_record(domain, record)
48
+ end
49
+ end
50
+
51
+ def merge(zone)
52
+ domain = search(zone.name)
53
+ unless domain
54
+ domain = create_domain(zone.name)
55
+ end
56
+
57
+ zone.records.each do |record|
58
+ records = search_for_record(domain, record)
59
+ if records
60
+ delete_records(domain, records.collect { |r| r['id'] })
61
+ end
62
+ create_record(domain, record)
63
+ end
64
+ end
65
+
66
+ def create_record(domain, record)
67
+ payload = { type: record.type, gtdLocation: 'DEFAULT', ttl: record.ttl }
68
+ payload[:name] = record.name ? record.name : ''
69
+ case record
70
+ when Splicer::Records::ARecord
71
+ payload.merge!({ value: record.ip })
72
+ when Splicer::Records::AAAARecord
73
+ payload.merge!({ value: record.ip })
74
+ when Splicer::Records::CNAMERecord
75
+ payload.merge!({ value: record.cname })
76
+ when Splicer::Records::MXRecord
77
+ payload.merge!({ value: record.exchanger, mxLevel: record.priority })
78
+ when Splicer::Records::NSRecord
79
+ payload.merge!({ value: record.server })
80
+ when Splicer::Records::PTRRecord
81
+ payload.merge!({ value: record.host })
82
+ when Splicer::Records::SRVRecord
83
+ payload.merge!({
84
+ value: record.target,
85
+ weight: record.weight,
86
+ priority: record.priority,
87
+ port: record.port
88
+ })
89
+ when Splicer::Records::TXTRecord
90
+ payload.merge!({
91
+ value: record.text
92
+ })
93
+ else
94
+ return nil
95
+ end
96
+ client.post(domain_records_url(domain), payload)
97
+ end
98
+
99
+ def search_for_record(domain, record)
100
+ payload = { type: record.type }
101
+ payload[:recordName] = record.name ? record.name : ''
102
+ resp = client.get(domain_records_url(domain), payload)
103
+ JSON.parse(resp)['data']
104
+ end
105
+
106
+ def domain_records_url(domain)
107
+ "dns/managed/#{domain['id']}/records"
108
+ end
109
+
110
+ def create_domain(name)
111
+ JSON.parse(client.post('dns/managed', name: name))
112
+ end
113
+
114
+ def delete_records(domain, ids)
115
+ return true if ids.empty?
116
+ client.delete(domain_records_url(domain), ids: ids)
117
+ end
118
+
119
+ # Search for a domain
120
+ # @param [String] name the name of the domain you wish to look for
121
+ # @return [Hash] nil if it can't be found
122
+ def search(name)
123
+ JSON.parse(client.get("dns/managed/id/#{name}"))
124
+ rescue Splicer::Errors::RequestError => error
125
+ nil
126
+ end
127
+ end
128
+
129
+ end
130
+ end
@@ -0,0 +1,14 @@
1
+ module Splicer
2
+ module DnsMadeEasy
3
+
4
+ class Time < ::Time
5
+ DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
6
+ MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
7
+
8
+ def to_date_header
9
+ self.utc.strftime("#{DAYS[self.utc.wday]}, %d #{MONTHS[self.utc.month - 1]} %Y %H:%M:%S +0000")
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Splicer
2
+ module DnsMadeEasy
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ require 'splicer'
2
+
3
+ require 'restclient'
4
+ require 'json'
5
+
6
+ require 'splicer/dns_made_easy/version'
7
+ require 'splicer/dns_made_easy/time'
8
+ require 'splicer/dns_made_easy/provider'
9
+ require 'splicer/dns_made_easy/config'
10
+ require 'splicer/dns_made_easy/client'
11
+
12
+ module Splicer
13
+ module DnsMadeEasy
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require 'rspec'
2
+ require 'splicer'
3
+ require 'splicer/dns_made_easy'
4
+
5
+ RSpec.configure do |config|
6
+ config.mock_with :rspec
7
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Splicer::DnsMadeEasy::Config do
4
+ let(:config) { Splicer::DnsMadeEasy::Config.new('key', 'secret') }
5
+
6
+ describe '#initialize' do
7
+ subject { config }
8
+ its(:key) { should eq('key') }
9
+ its(:secret) { should eq('secret') }
10
+ end
11
+
12
+ describe '#provider' do
13
+ subject { config.provider }
14
+ it { should be_a(Splicer::DnsMadeEasy::Provider) }
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'splicer/dns_made_easy/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "splicer-dns_made_easy"
8
+ spec.version = Splicer::DnsMadeEasy::VERSION
9
+ spec.authors = ["Matthew Johnston"]
10
+ spec.email = ["warmwaffles@gmail.com"]
11
+ spec.description = %q{The splicer adapter for interacting DnsMadeEasy}
12
+ spec.summary = %q{The splicer adapter for interacting DnsMadeEasy}
13
+ spec.homepage = "https://github.com/zippykid/dns_made_easy"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency('splicer', '~> 1.0')
22
+ spec.add_dependency('rest-client')
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: splicer-dns_made_easy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matthew Johnston
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: splicer
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rest-client
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.3'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: The splicer adapter for interacting DnsMadeEasy
95
+ email:
96
+ - warmwaffles@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - .rspec
103
+ - .ruby-gemset
104
+ - .ruby-version
105
+ - Gemfile
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - lib/splicer/dns_made_easy.rb
110
+ - lib/splicer/dns_made_easy/client.rb
111
+ - lib/splicer/dns_made_easy/config.rb
112
+ - lib/splicer/dns_made_easy/provider.rb
113
+ - lib/splicer/dns_made_easy/time.rb
114
+ - lib/splicer/dns_made_easy/version.rb
115
+ - spec/spec_helper.rb
116
+ - spec/splicer/dns_made_easy/config_spec.rb
117
+ - splicer-dns_made_easy.gemspec
118
+ homepage: https://github.com/zippykid/dns_made_easy
119
+ licenses:
120
+ - MIT
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ segments:
132
+ - 0
133
+ hash: -1356569842571179341
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ segments:
141
+ - 0
142
+ hash: -1356569842571179341
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.25
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: The splicer adapter for interacting DnsMadeEasy
149
+ test_files:
150
+ - spec/spec_helper.rb
151
+ - spec/splicer/dns_made_easy/config_spec.rb