ddns 0.1.5 → 0.1.6

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.
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
-