lost-socks 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,95 @@
1
+ This library is for automating the resolution of DNS records, allowing you to
2
+ hit arbitrary name servers, and your own local DNS. If you have to migrate
3
+ a boatload of DNS, this library will allow you to verify your migration has
4
+ completed successfully and nothing has been left behind (something that is
5
+ very easy to do in these kinds of jobs).
6
+
7
+ NOTE: This requires that you have the *nix <code>dig</code> utility installed,
8
+ so it's probably safe to say that this library only work on linux/unix. It
9
+ hasn't been tested on Windows, so there!
10
+
11
+ If you're like me and you're fickle about hosting providers, you'd have done
12
+ this a few times. On the last migration I performed this saved me hours of
13
+ manual checking, and saved me from the embarressment of services disappearing
14
+ or whatnot. So let's walk through how you'd use that (full example source is
15
+ in example.rb).
16
+
17
+ First, you need to require the DNS library:
18
+
19
+ require 'lost-socks'
20
+
21
+ We'll set up some instance variables for the name servers we're going to check
22
+ against:
23
+
24
+ @local_dns = [nil]
25
+ @slicehost_dns = %w(ns1.slicehost.net ns2.slicehost.net)
26
+
27
+ To prevent name servers from blocking our dig requests, we'll put a delay of
28
+ one second in so that they don't start ignoring us (this happened to me a few
29
+ times, sometimes you can remove it, sometimes you can set it to a lower
30
+ threshold, experiment would you already!):
31
+
32
+ LostSocks.delay = 1
33
+
34
+ And the rest should be self-explainitory. The API is pretty damn intuitive if
35
+ you ask me after all, I wrote the damn thing). You can check A records, MX
36
+ records, CNAME records and even NS authority! Fwoar!
37
+
38
+ (@local_dns + @slicehost_dns).each do |server|
39
+
40
+ LostSocks.verify('yeahnah.org').with_server(server) do |it|
41
+ # checks A records
42
+ it.resolves_to('208.78.102.114')
43
+ # checks MX records
44
+ it.maps_mail_to('ASPMX.L.GOOGLE.COM', :priority => 10)
45
+ it.maps_mail_to('ALT1.ASPMX.L.GOOGLE.COM', :priority => 20)
46
+ it.maps_mail_to('ALT2.ASPMX.L.GOOGLE.COM', :priority => 30)
47
+ end
48
+
49
+ LostSocks.verify('www.yeahnah.org').with_server(server) do |it|
50
+ # checks CNAME records
51
+ it.is_aliased_to('yeahnah.org')
52
+ end
53
+
54
+ LostSocks.verify('tumble.yeahnah.org').with_server(server) do |it|
55
+ it.resolves_to('72.32.231.8') # tumblr :)
56
+ end
57
+
58
+ end
59
+
60
+ # shorthand that checks against your local dns
61
+ LostSocks.verify('yeahnah.org').resolves_to('208.78.102.114')
62
+ LostSocks.verify('tumble.yeahnah.org').resolves_to('72.32.231.8')
63
+
64
+ # oh, and check authorative ns :)
65
+ LostSocks.verify('yeahnah.org').has_authorative_nameserver_of('ns1.slicehost.net')
66
+ LostSocks.verify('yeahnah.org').has_authorative_nameserver_of('ns2.slicehost.net')
67
+
68
+ And this is the output the script will produce if everything works. If it fails
69
+ it'll say FAIL and print the dig output as well (this output is not shown here):
70
+
71
+ PASS: yeahnah.org A 208.78.102.114
72
+ PASS: yeahnah.org MX ASPMX.L.GOOGLE.COM {:priority=>10}
73
+ PASS: yeahnah.org MX ALT1.ASPMX.L.GOOGLE.COM {:priority=>20}
74
+ PASS: yeahnah.org MX ALT2.ASPMX.L.GOOGLE.COM {:priority=>30}
75
+ PASS: www.yeahnah.org CNAME yeahnah.org
76
+ PASS: tumble.yeahnah.org A 72.32.231.8
77
+ PASS: yeahnah.org A 208.78.102.114 @ns1.slicehost.net
78
+ PASS: yeahnah.org MX ASPMX.L.GOOGLE.COM @ns1.slicehost.net {:priority=>10}
79
+ PASS: yeahnah.org MX ALT1.ASPMX.L.GOOGLE.COM @ns1.slicehost.net {:priority=>20}
80
+ PASS: yeahnah.org MX ALT2.ASPMX.L.GOOGLE.COM @ns1.slicehost.net {:priority=>30}
81
+ PASS: www.yeahnah.org CNAME yeahnah.org @ns1.slicehost.net
82
+ PASS: tumble.yeahnah.org A 72.32.231.8 @ns1.slicehost.net
83
+ PASS: yeahnah.org A 208.78.102.114 @ns2.slicehost.net
84
+ PASS: yeahnah.org MX ASPMX.L.GOOGLE.COM @ns2.slicehost.net {:priority=>10}
85
+ PASS: yeahnah.org MX ALT1.ASPMX.L.GOOGLE.COM @ns2.slicehost.net {:priority=>20}
86
+ PASS: yeahnah.org MX ALT2.ASPMX.L.GOOGLE.COM @ns2.slicehost.net {:priority=>30}
87
+ PASS: www.yeahnah.org CNAME yeahnah.org @ns2.slicehost.net
88
+ PASS: tumble.yeahnah.org A 72.32.231.8 @ns2.slicehost.net
89
+ PASS: yeahnah.org A 208.78.102.114
90
+ PASS: tumble.yeahnah.org A 72.32.231.8
91
+ PASS: yeahnah.org NS ns1.slicehost.net
92
+ PASS: yeahnah.org NS ns2.slicehost.net
93
+
94
+ And that's about it! If you're using this library and enjoying it, please drop
95
+ me a line and let me know!
data/lib/lost-socks.rb CHANGED
@@ -1,7 +1,89 @@
1
- require "lost-socks/version"
1
+ module LostSocks
2
2
 
3
- module Lost
4
- module Socks
5
- # Your code goes here...
3
+ VERSION = "0.0.1"
4
+
5
+ def self.delay=(seconds)
6
+ Verifier.delay = seconds
7
+ end
8
+
9
+ def self.verify(domain)
10
+ Verifier.new(domain)
6
11
  end
12
+
13
+ class Verifier
14
+
15
+ @@delay = nil
16
+
17
+ def self.delay=(seconds)
18
+ @@delay = seconds
19
+ end
20
+
21
+ def initialize(domain)
22
+ @server = nil
23
+ @domain = domain
24
+ yield self if block_given?
25
+ self
26
+ end
27
+
28
+ def with_server(server)
29
+ @server = server
30
+ yield self if block_given?
31
+ self
32
+ end
33
+
34
+ def resolves_to(ip)
35
+ check! 'A', ip
36
+ end
37
+
38
+ def is_aliased_to(domain)
39
+ check! 'CNAME', domain
40
+ end
41
+
42
+ def maps_mail_to(domain, args = {})
43
+ check! 'MX', domain, args
44
+ end
45
+
46
+ # or it.answers_to ??
47
+ def has_authorative_nameserver_of(domain)
48
+ check! 'NS', domain
49
+ end
50
+
51
+ private
52
+
53
+ def check!(query, against, args = {})
54
+ if ['A', 'CNAME', 'NS'].include?(query)
55
+ pattern = /#{@domain}\.\s+\d+\s+IN\s+#{query}\s+#{against}/
56
+ elsif query == 'MX'
57
+ pattern = /#{@domain}\.\s+\d+\s+IN\s+MX\s+#{args[:priority]}\s+#{against}/
58
+ else
59
+ raise "Unsupported query (#{query.inspect}): only A, CNAME and MX."
60
+ end
61
+ send(result!(query) =~ pattern ? :pass! : :fail!, query, against, args)
62
+ end
63
+
64
+ def result!(query)
65
+ @last_dig_command = if @server
66
+ "dig @#{@server} #{@domain} #{query}"
67
+ else
68
+ "dig #{@domain} #{query}"
69
+ end
70
+ sleep(@@delay) if @@delay
71
+ @last_dig_output = `#{@last_dig_command}`
72
+ end
73
+
74
+ def pass!(*args)
75
+ report! 'PASS', *args
76
+ end
77
+
78
+ def fail!(*args)
79
+ report! 'FAIL', *args
80
+ puts @last_dig_command
81
+ puts @last_dig_output
82
+ end
83
+
84
+ def report!(result, query, against, args = {})
85
+ puts "#{result}: #{@domain} #{query} #{against} #{"@#{@server}" if @server} #{args.inspect if args.any?}"
86
+ end
87
+ end
88
+
7
89
  end
data/lost-socks.gemspec CHANGED
@@ -1,10 +1,10 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "lost-socks/version"
3
+ require "lost-socks"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "lost-socks"
7
- s.version = Lost::Socks::VERSION
7
+ s.version = LostSocks::VERSION
8
8
  s.authors = ["Ryan Allen"]
9
9
  s.email = ["ryan@yeahnah.org"]
10
10
  s.homepage = "https://github.com/ryan-allen/lost-socks"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lost-socks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -23,9 +23,9 @@ files:
23
23
  - .gitignore
24
24
  - Gemfile
25
25
  - MIT-LICENSE
26
+ - README.md
26
27
  - Rakefile
27
28
  - lib/lost-socks.rb
28
- - lib/lost-socks/version.rb
29
29
  - lost-socks.gemspec
30
30
  homepage: https://github.com/ryan-allen/lost-socks
31
31
  licenses: []
@@ -1,5 +0,0 @@
1
- module Lost
2
- module Socks
3
- VERSION = "0.0.0"
4
- end
5
- end