dirndl 0.0.1

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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dirndl.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,6 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'dirndl'
4
+
5
+ command = Dirndl::CommandLine.new ARGV
6
+ command.execute
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "dirndl/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "dirndl"
7
+ s.version = Dirndl::VERSION
8
+ s.authors = ["Craig R Webster"]
9
+ s.email = ["craig@barkingiguana.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A terribly naive DNS zone server}
12
+ s.description = %q{Use Latte and DNS::Zonefile to serve text based zonefiles via DNS. This is a toy project, I don't intend to use it in production anywhere.}
13
+
14
+ s.rubyforge_project = "dirndl"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_runtime_dependency "latte"
22
+ s.add_runtime_dependency "dns-zonefile", ">= 1.0.0"
23
+ end
@@ -0,0 +1,21 @@
1
+ require "pethau"
2
+
3
+ class Object
4
+ include Pethau::InitializeWith
5
+ include Pethau::DefaultValueOf
6
+ include Pethau::PrivateAttrAccessor
7
+ end
8
+
9
+ require "logger"
10
+ require "optparse"
11
+ require "ostruct"
12
+
13
+ require "latte"
14
+ require "dns/zonefile"
15
+
16
+ require "dirndl/version"
17
+ require "dirndl/resolver"
18
+ require "dirndl/command_line"
19
+
20
+ module Dirndl
21
+ end
@@ -0,0 +1,43 @@
1
+ module Dirndl
2
+ class CommandLine
3
+ initialize_with :arguments
4
+
5
+ def parse_arguments
6
+ parsed = { addresses: [] }
7
+ OptionParser.new do |o|
8
+ o.on '-l', '--listen ADDRESS', 'Serve DNS on this address' do |addr|
9
+ address = Latte::Address.new addr
10
+ parsed[:addresses] << address
11
+ parsed[:addresses].uniq!
12
+ end
13
+
14
+ o.on '-z', '--zone-db PATH', 'Path to the root of the zone db' do |path|
15
+ parsed[:zone_db] = path
16
+ end
17
+
18
+ o.separator ''
19
+ o.separator 'Common options:'
20
+
21
+ o.on_tail '-h', '--help', 'Show this message' do
22
+ puts o
23
+ exit
24
+ end
25
+
26
+ o.on_tail '--version', 'Show version' do
27
+ puts Dirndl::VERSION
28
+ exit
29
+ end
30
+ end.parse arguments
31
+ OpenStruct.new parsed
32
+ end
33
+
34
+ def execute
35
+ arguments = parse_arguments
36
+ resolver = Resolver.new arguments.zone_db
37
+ logger = Logger.new STDOUT
38
+ server = Latte::Server.new resolver, logger
39
+ server.listen_on *arguments.addresses
40
+ server.run
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,35 @@
1
+ module Dirndl
2
+ class Resolver
3
+ initialize_with :zone_db_root_path
4
+
5
+ def call query, response
6
+ zone = load_zone_for query.human_qname
7
+ return unless zone
8
+ zone.records_of(DNS::Zonefile::A).each do |rr|
9
+ next unless rr.host == query.human_qname
10
+ answer = "#{rr.host} #{rr.klass} A #{rr.ttl} #{rr.address}"
11
+ response.add answer
12
+ end
13
+ end
14
+
15
+ def load_zone_for qname
16
+ parts = qname.split /\./
17
+ parts.reverse!
18
+ zone_file_path = parts.inject(zone_db_root_path) { |path, part|
19
+ file = File.join path, "#{part}.zone"
20
+ if File.exists? file
21
+ file
22
+ else
23
+
24
+ if path !~ /\.zone$/
25
+ File.join path, part
26
+ else
27
+ path
28
+ end
29
+ end
30
+ }
31
+ return unless zone_file_path =~ /\.zone$/
32
+ DNS::Zonefile.load File.read(zone_file_path)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module Dirndl
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dirndl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Craig R Webster
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-26 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: latte
16
+ requirement: &70207096539080 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70207096539080
25
+ - !ruby/object:Gem::Dependency
26
+ name: dns-zonefile
27
+ requirement: &70207096538580 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70207096538580
36
+ description: Use Latte and DNS::Zonefile to serve text based zonefiles via DNS. This
37
+ is a toy project, I don't intend to use it in production anywhere.
38
+ email:
39
+ - craig@barkingiguana.com
40
+ executables:
41
+ - dirndl
42
+ extensions: []
43
+ extra_rdoc_files: []
44
+ files:
45
+ - .gitignore
46
+ - Gemfile
47
+ - Rakefile
48
+ - bin/dirndl
49
+ - dirndl.gemspec
50
+ - lib/dirndl.rb
51
+ - lib/dirndl/command_line.rb
52
+ - lib/dirndl/resolver.rb
53
+ - lib/dirndl/version.rb
54
+ homepage: ''
55
+ licenses: []
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project: dirndl
74
+ rubygems_version: 1.8.10
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: A terribly naive DNS zone server
78
+ test_files: []