ddns 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/ddns +23 -9
- data/bin/ddnsctl +24 -9
- data/lib/ddns-server.rb +5 -3
- metadata +6 -9
- data/bin/ddns.orig +0 -80
data/bin/ddns
CHANGED
@@ -10,11 +10,6 @@ require 'socket'
|
|
10
10
|
LOGGER = Logger.new($stderr)
|
11
11
|
default_gaddress = nil
|
12
12
|
|
13
|
-
begin
|
14
|
-
default_gaddress = IPSocket.getaddress(Socket.gethostname)
|
15
|
-
rescue SocketError
|
16
|
-
end
|
17
|
-
|
18
13
|
options = {
|
19
14
|
:hostname => Socket.gethostname,
|
20
15
|
:address => '0.0.0.0',
|
@@ -25,19 +20,21 @@ options = {
|
|
25
20
|
:resolver => Resolv::DNS.new,
|
26
21
|
:daemon => false,
|
27
22
|
:logger => LOGGER,
|
28
|
-
:loglevel => Logger::INFO
|
23
|
+
:loglevel => Logger::INFO,
|
24
|
+
:ttl => 300,
|
29
25
|
}
|
30
26
|
|
31
27
|
opts = OptionParser.new
|
32
28
|
opts.on('-H', '--hostname HOST', "Own hostname (default #{options[:hostname]})") {|v| options[:hostname] = v }
|
33
29
|
opts.on('-A', '--address ADDRESS', "Name service ip address (default #{options[:address]})") {|v| options[:address] = v }
|
34
30
|
opts.on('-P', '--port PORT', Integer, "Name service port (default #{options[:port]})") {|v| options[:port] = v }
|
35
|
-
opts.on('-a', '--gaddress ADDRESS', "Gossip service ip address
|
31
|
+
opts.on('-a', '--gaddress ADDRESS', "Gossip service ip address") {|v| options[:gaddress] = v }
|
36
32
|
opts.on('-p', '--gport PORT', Integer, "Gossip service port (default #{options[:gport]})") {|v| options[:gport] = v }
|
37
33
|
opts.on('-S', '--socket SOCK', "Socket file path (default #{options[:sock]})") {|v| options[:sock] = v }
|
38
34
|
opts.on('-d', '--daemon COMMAND', "Directive of daemonize (start|stop|restart|status)") {|v| options[:daemon] = v }
|
39
35
|
opts.on('-r', '--resolver CONF', "Default resolver (default /etc/resolv.conf)") {|v| options[:resolver] = Resolv::DNS.new(v) }
|
40
36
|
opts.on('-N', '--no-resolver', "Not use default resolver") {|v| options[:resolver] = nil }
|
37
|
+
opts.on('-T', '--ttl TTL', "Time to live (#{options[:ttl]})") {|v| options[:ttl] = v.to_i }
|
41
38
|
|
42
39
|
opts.on('-L', '--loglevel LEVEL',
|
43
40
|
[:fatal, :error, :warn, :info, :debug], "Log level (default info)") {|v| options[:loglevel] = Logger.const_get(v.to_s.upcase) }
|
@@ -57,9 +54,26 @@ rescue => e
|
|
57
54
|
end
|
58
55
|
|
59
56
|
unless options[:gaddress]
|
60
|
-
|
57
|
+
if ['stop', 'status'].include?(options[:daemon])
|
58
|
+
options[:gaddress] = '127.0.0.1'
|
59
|
+
else
|
60
|
+
begin
|
61
|
+
options[:gaddress] = IPSocket.getaddress(Socket.gethostname)
|
62
|
+
rescue SocketError
|
63
|
+
end
|
64
|
+
|
65
|
+
unless options[:gaddress]
|
66
|
+
$stderr.puts 'Please pass gossip service address'
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
if options[:ttl] < 1
|
73
|
+
$stderr.puts "invalid TTL: #{options[:ttl]}"
|
61
74
|
exit 1
|
62
75
|
end
|
76
|
+
|
63
77
|
|
64
78
|
#RGossip.debug = true
|
65
79
|
RGossip.port = options[:gport]
|
@@ -75,7 +89,7 @@ if options[:daemon]
|
|
75
89
|
else
|
76
90
|
begin
|
77
91
|
at_exit { FileUtils.rm_f(options[:sock]) }
|
78
|
-
$
|
92
|
+
$RDDNS_ATTR = DRb.start_service("drbunix:#{options[:sock]}", $DDNS_ATTR)
|
79
93
|
rescue => e
|
80
94
|
$stderr.puts(e.message)
|
81
95
|
end
|
data/bin/ddnsctl
CHANGED
@@ -29,6 +29,13 @@ def clear
|
|
29
29
|
$gossip.clear_dead_list
|
30
30
|
end
|
31
31
|
|
32
|
+
def ttl(time)
|
33
|
+
time = time.to_i
|
34
|
+
raise "invalid TTL: #{time}" if time < 1
|
35
|
+
puts "Update TTL: #{time}"
|
36
|
+
$DDNS_ATTR.ttl = time
|
37
|
+
end
|
38
|
+
|
32
39
|
options = {
|
33
40
|
:sock => '/tmp/ddns.sock',
|
34
41
|
}
|
@@ -38,6 +45,7 @@ opts.on('-L', "List nodes") {|v| options[:command] = :list }
|
|
38
45
|
opts.on('-A ADDREDD', "Add node") {|v| options[:command] = :add ; options[:arg] = v }
|
39
46
|
opts.on('-D ADDREDD', "Delete node") {|v| options[:command] = :delete ; options[:arg] = v }
|
40
47
|
opts.on('-C', "Clear dead list") {|v| options[:command] = :clear }
|
48
|
+
opts.on('-T TTL', "Update TTL") {|v| options[:command] = :ttl ; options[:arg] = v }
|
41
49
|
opts.on('-S', '--socket SOCK', "Socket file path (default #{options[:sock]})") {|v| options[:sock] = v }
|
42
50
|
opts.on('-h', '--help', "Display this help") { $stdout.puts opts.help ; exit 1 }
|
43
51
|
|
@@ -47,7 +55,7 @@ if ARGV.empty?
|
|
47
55
|
end
|
48
56
|
|
49
57
|
begin
|
50
|
-
raise "invalid arguments: #{ARGV.join ' '}" if 1 < ARGV.select {|i| %w(-L -A -D -C).include?(i) }.length
|
58
|
+
raise "invalid arguments: #{ARGV.join ' '}" if 1 < ARGV.select {|i| %w(-L -A -D -C -T).include?(i) }.length
|
51
59
|
opts.parse!(ARGV)
|
52
60
|
rescue => e
|
53
61
|
$stderr.puts e.message
|
@@ -60,14 +68,21 @@ unless File.exist?(options[:sock])
|
|
60
68
|
exit 1
|
61
69
|
end
|
62
70
|
|
63
|
-
$
|
71
|
+
$DDNS_ATTR = DRbObject.new_with_uri("drbunix:#{options[:sock]}")
|
72
|
+
$gossip = $DDNS_ATTR.gossip
|
64
73
|
|
65
|
-
|
66
|
-
|
67
|
-
when :
|
68
|
-
when :
|
69
|
-
when :
|
70
|
-
|
71
|
-
|
74
|
+
begin
|
75
|
+
case options[:command]
|
76
|
+
when :list then list
|
77
|
+
when :add then add(options[:arg])
|
78
|
+
when :delete then delete(options[:arg])
|
79
|
+
when :clear then clear
|
80
|
+
when :ttl then ttl(options[:arg])
|
81
|
+
else
|
82
|
+
$stdout.puts opts.help
|
83
|
+
exit 1
|
84
|
+
end
|
85
|
+
rescue => e
|
86
|
+
$stderr.puts e.message
|
72
87
|
exit 1
|
73
88
|
end
|
data/lib/ddns-server.rb
CHANGED
@@ -20,6 +20,7 @@ class DDNS < RExec::Daemon::Base
|
|
20
20
|
attr_reader :resolver
|
21
21
|
attr_reader :logger
|
22
22
|
attr_reader :loglevel
|
23
|
+
attr_accessor :ttl
|
23
24
|
attr_reader :gossip
|
24
25
|
|
25
26
|
def initialize(options = {})
|
@@ -32,6 +33,7 @@ class DDNS < RExec::Daemon::Base
|
|
32
33
|
@resolver = options[:resolver]
|
33
34
|
@logger = options[:logger] || Logger.new($stderr)
|
34
35
|
@loglevel = options[:loglevel] || Logger::INFO
|
36
|
+
@ttl = options[:ttl] || 300
|
35
37
|
@logger.level = @loglevel
|
36
38
|
|
37
39
|
@gossip = RGossip::Client.new(
|
@@ -77,19 +79,19 @@ class DDNS < RExec::Daemon::Base
|
|
77
79
|
logger.level = $DDNS_ATTR.loglevel
|
78
80
|
|
79
81
|
if $DDNS_ATTR.daemon and $DDNS_ATTR.sock
|
80
|
-
$
|
82
|
+
$RDDNS_ATTR = DRb.start_service("drbunix:#{$DDNS_ATTR.sock}", $DDNS_ATTR)
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
86
|
match($DDNS_ATTR.method(:lookup_a_record).to_proc, :A) do |transaction|
|
85
87
|
address, timestamp, data = $DDNS_ATTR.gossip.select {|a, t, d| d == transaction.name }.sort_by{ rand }.first
|
86
|
-
transaction.respond!(address)
|
88
|
+
transaction.respond!(address, :ttl => $DDNS_ATTR.ttl)
|
87
89
|
end
|
88
90
|
|
89
91
|
match($DDNS_ATTR.method(:lookup_ptr_record).to_proc, :PTR) do |transaction|
|
90
92
|
name = transaction.name.sub(/\.in-addr\.arpa\Z/, '').split('.').reverse.join('.')
|
91
93
|
address, timestamp, data = $DDNS_ATTR.gossip.find {|a, t, d| a == name }
|
92
|
-
transaction.respond!(Resolv::DNS::Name.create("#{data}."))
|
94
|
+
transaction.respond!(Resolv::DNS::Name.create("#{data}."), :ttl => $DDNS_ATTR.ttl)
|
93
95
|
end
|
94
96
|
|
95
97
|
if $DDNS_ATTR.resolver
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 6
|
10
|
+
version: 0.1.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- winebarrel
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-05-29 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: rubydns
|
@@ -61,11 +60,9 @@ extra_rdoc_files: []
|
|
61
60
|
|
62
61
|
files:
|
63
62
|
- README
|
64
|
-
- bin/ddns
|
65
|
-
- bin/ddns.orig
|
66
63
|
- bin/ddnsctl
|
64
|
+
- bin/ddns
|
67
65
|
- lib/ddns-server.rb
|
68
|
-
has_rdoc: true
|
69
66
|
homepage: https://bitbucket.org/winebarrel/ddns
|
70
67
|
licenses: []
|
71
68
|
|
@@ -95,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
92
|
requirements: []
|
96
93
|
|
97
94
|
rubyforge_project:
|
98
|
-
rubygems_version: 1.
|
95
|
+
rubygems_version: 1.8.1
|
99
96
|
signing_key:
|
100
97
|
specification_version: 3
|
101
98
|
summary: Distributed name server
|
data/bin/ddns.orig
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'fileutils'
|
4
|
-
require 'drb/drb'
|
5
|
-
require 'ddns-server'
|
6
|
-
require 'optparse'
|
7
|
-
require 'resolv'
|
8
|
-
require 'socket'
|
9
|
-
|
10
|
-
LOGGER = Logger.new($stderr)
|
11
|
-
default_gaddress = nil
|
12
|
-
|
13
|
-
begin
|
14
|
-
default_gaddress = IPSocket.getaddress(Socket.gethostname)
|
15
|
-
rescue SocketError
|
16
|
-
end
|
17
|
-
|
18
|
-
options = {
|
19
|
-
:hostname => Socket.gethostname,
|
20
|
-
:address => '0.0.0.0',
|
21
|
-
:port => 10053,
|
22
|
-
:gaddress => default_gaddress,
|
23
|
-
:gport => 10870,
|
24
|
-
:sock => '/tmp/ddns.sock',
|
25
|
-
:resolver => Resolv::DNS.new,
|
26
|
-
:daemon => false,
|
27
|
-
:logger => LOGGER,
|
28
|
-
:loglevel => Logger::INFO
|
29
|
-
}
|
30
|
-
|
31
|
-
opts = OptionParser.new
|
32
|
-
opts.on('-H', '--hostname HOST', "Own hostname (default #{options[:hostname]})") {|v| options[:hostname] = v }
|
33
|
-
opts.on('-A', '--address ADDRESS' "Name service ip address (default #{options[:address]})") {|v| options[:address] = v }
|
34
|
-
opts.on('-P', '--port PORT', Integer, "Name service port (default #{options[:port]})") {|v| options[:port] = v }
|
35
|
-
opts.on('-a', '--gaddress ADDRESS' "Gossip service ip address (default #{options[:gaddress]})") {|v| options[:gaddress] = v }
|
36
|
-
opts.on('-p', '--gport PORT', Integer, "Gossip service port (default #{options[:gport]})") {|v| options[:gport] = v }
|
37
|
-
opts.on('-S', '--socket SOCK', "Socket file path (default #{options[:sock]})") {|v| options[:sock] = v }
|
38
|
-
opts.on('-d', '--daemon COMMAND', "Directive of daemonize (start|stop|restart|status)") {|v| options[:daemon] = v }
|
39
|
-
opts.on('-r', '--resolver CONF', "Default resolver (default /etc/resolv.conf)") {|v| options[:resolver] = Resolv::DNS.new(v) }
|
40
|
-
opts.on('-N', '--no-resolver', "Not use default resolver") {|v| options[:resolver] = nil }
|
41
|
-
|
42
|
-
opts.on('-L', '--loglevel LEVEL',
|
43
|
-
[:fatal, :error, :warn, :info, :debug], "Log level (default info)") {|v| options[:loglevel] = Logger.const_get(v.to_s.upcase) }
|
44
|
-
|
45
|
-
opts.on('-i', '--initial NODES', "Initial access node list (ex 10.0.0.1,10.0.0.2)") do |v|
|
46
|
-
options[:initial_nodes] = v.split(/\s*,\s*/)
|
47
|
-
end
|
48
|
-
|
49
|
-
opts.on('-h', '--help', "Display this help") { $stdout.puts opts.help ; exit 1 }
|
50
|
-
|
51
|
-
begin
|
52
|
-
opts.parse!(ARGV)
|
53
|
-
rescue => e
|
54
|
-
$stderr.puts e.message
|
55
|
-
$stdout.puts opts.help
|
56
|
-
exit 1
|
57
|
-
end
|
58
|
-
|
59
|
-
#RGossip.debug = true
|
60
|
-
RGossip.port = options[:gport]
|
61
|
-
DDNS::Attributes.new(options)
|
62
|
-
|
63
|
-
LOGGER.info("Name service at #{options[:address]}:#{options[:port]}")
|
64
|
-
LOGGER.info("Gossip service at #{options[:gaddress]}:#{options[:gport]}")
|
65
|
-
LOGGER.info("Hostname: #{options[:hostname]}")
|
66
|
-
|
67
|
-
if options[:daemon]
|
68
|
-
ARGV.unshift options[:daemon]
|
69
|
-
DDNS.daemonize
|
70
|
-
else
|
71
|
-
begin
|
72
|
-
at_exit { FileUtils.rm_f(options[:sock]) }
|
73
|
-
$DDNS_GOSSIP = DRb.start_service("drbunix:#{options[:sock]}", $DDNS_ATTR.gossip)
|
74
|
-
rescue => e
|
75
|
-
$stderr.puts(e.message)
|
76
|
-
end
|
77
|
-
|
78
|
-
DDNS.run
|
79
|
-
end
|
80
|
-
|