ddns 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/bin/ddns +23 -9
  2. data/bin/ddnsctl +24 -9
  3. data/lib/ddns-server.rb +5 -3
  4. metadata +6 -9
  5. 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 (default #{options[:gaddress]})") {|v| options[:gaddress] = v }
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
- $stderr.puts 'Please pass gossip service address'
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
- $DDNS_GOSSIP = DRb.start_service("drbunix:#{options[:sock]}", $DDNS_ATTR.gossip)
92
+ $RDDNS_ATTR = DRb.start_service("drbunix:#{options[:sock]}", $DDNS_ATTR)
79
93
  rescue => e
80
94
  $stderr.puts(e.message)
81
95
  end
@@ -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
- $gossip = DRbObject.new_with_uri("drbunix:#{options[:sock]}")
71
+ $DDNS_ATTR = DRbObject.new_with_uri("drbunix:#{options[:sock]}")
72
+ $gossip = $DDNS_ATTR.gossip
64
73
 
65
- case options[:command]
66
- when :list then list
67
- when :add then add(options[:arg])
68
- when :delete then delete(options[:arg])
69
- when :clear then clear
70
- else
71
- $stdout.puts opts.help
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
@@ -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
- $DDNS_GOSSIP = DRb.start_service("drbunix:#{$DDNS_ATTR.sock}", $DDNS_ATTR.gossip)
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: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 5
10
- version: 0.1.5
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-25 00:00:00 +09:00
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.4.2
95
+ rubygems_version: 1.8.1
99
96
  signing_key:
100
97
  specification_version: 3
101
98
  summary: Distributed name server
@@ -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
-