dyndyndong 0.0.1 → 0.0.2

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.
@@ -29,6 +29,9 @@ def help
29
29
  DynDynDong v#{DynDynDong::VERSION} is distributed under the GNU Affero General Public License.
30
30
 
31
31
  USAGE: #{$0} [-d|-h|-1] [-c <config file>] [-D <delay>] [-s <service> <service args>]
32
+ -l|--logfile Set the logfile (default /var/log/dyndyndong.log).
33
+ -P|--pidfile Set pidfile (default /var/run/dyndyndong.pid).
34
+ -- Null action, to breaks parsing of a service.
32
35
  -d|--daemon Run DynDynDong as a daemon (default no).
33
36
  -h|--help Show this help.
34
37
  -D|--delay Set time to wait between two cycles (default 600).
@@ -52,6 +55,8 @@ end
52
55
 
53
56
  CONFIG = '/etc/dyndyndong.conf'
54
57
  DEFAULT_CONFIG = CONFIG.dup
58
+ PIDFILE = '/var/run/dyndyndong.pid'
59
+ LOGFILE = '/var/log/dyndyndong.log'
55
60
  oneshot = daemon = false
56
61
 
57
62
  i, SERVICES = 0, {
@@ -63,8 +68,26 @@ i, SERVICES = 0, {
63
68
  while i < ARGV.size
64
69
  parsed = false
65
70
  case ARGV[i]
71
+ when '--'
72
+ parsed = true
73
+ when /^-l/, '--logfile'
74
+ if %w{-l --logfile}.include?(ARGV[i])
75
+ LOGFILE.replace ARGV[i += 1]
76
+ else
77
+ LOGFILE.replace ARGV[i].gsub(/^-l/, '')
78
+ end
79
+ STDERR.reopen(File.open(LOGFILE))
80
+ STDOUT.reopen(STDERR)
81
+ parsed = true
82
+ when /^-P/, '--pidfile'
83
+ if %w{-P --pidfile}.include?(ARGV[i])
84
+ PIDFILE.replace ARGV[i += 1]
85
+ else
86
+ PIDFILE.replace ARGV[i].gsub(/^-P/, '')
87
+ end
88
+ parsed = true
66
89
  when '-d', '--daemon'
67
- daemon = true
90
+ daemon = parsed = true
68
91
  when '-h', '--help'
69
92
  help
70
93
  when /^-D/, '--delay'
@@ -209,7 +232,16 @@ else
209
232
  end
210
233
 
211
234
  if DAEMONIZE
212
- DynDynDong::Daemon.start
235
+ Daemons.daemonize
236
+
237
+ File.open(PIDFILE) {|f|
238
+ f.write(Process.pid.to_s)
239
+ }
240
+
241
+ STDOUT.reopen(File.open(LOGFILE))
242
+ STDERR.reopen(STDOUT)
243
+
244
+ DynDynDong::Client.start_loop
213
245
  else
214
246
  if oneshot
215
247
  DynDynDong::Client.start
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,7 +14,8 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  require 'dyndyndong/client'
19
21
  require 'dyndyndong/daemon'
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,7 +14,8 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  require 'dyndyndong/services'
19
21
  require 'dyndyndong/dyndyndong'
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,7 +14,8 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  require 'dyndyndong/client'
19
21
  require 'daemons'
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,7 +14,8 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  module DynDynDong
19
21
  def self.delay
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,7 +14,10 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ $DEBUG = true
17
21
 
18
22
  module DynDynDong
19
23
 
@@ -28,24 +32,24 @@ class Service
28
32
 
29
33
  def fetch
30
34
  begin
31
- prefetch if (self.method(:prefetch) rescue nil)
35
+ prefetch if self.respond_to?(:prefetch)
32
36
  rescue Exception => e
33
37
  STDERR.puts("Prefetch error: #{e}, skipping...")
34
38
  return
35
39
  end
36
40
 
37
41
  @hosts.each {|args|
38
- STDOUT.write("Aliasing #{args.first}...")
42
+ STDOUT.write("Aliasing #{args.is_a?(Array) ? args.first : args}...")
39
43
  begin
40
44
  res = alias_host(*args)
41
- STDOUT.write("\r--- #{args.first} \n\t#{res.gsub(/\n/, "\n\t")}\n")
45
+ STDOUT.write("\r--- #{args.is_a?(Array) ? args.first : args} \n\t#{res.gsub(/\n/, "\n\t")}\n")
42
46
  rescue Exception => e
43
47
  STDERR.puts("\tFetch error: #{e}, skipping...")
44
48
  end
45
49
  }
46
50
 
47
51
  begin
48
- postfetch if self.method(:postfetch) rescue nil
52
+ postfetch if self.respond_to?(:postfetch)
49
53
  rescue Exception => e
50
54
  STDERR.puts("Postfetch error: #{e}")
51
55
  end
@@ -87,5 +91,6 @@ end
87
91
 
88
92
  end
89
93
 
90
- require 'dyndyndong/services/afraid'
91
- require 'dyndyndong/services/dyndns'
94
+ %w{afraid dyndns zoneedit}.each {|s|
95
+ require "dyndyndong/services/#{s}"
96
+ }
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,7 +14,8 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  require 'net/http'
19
21
 
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,27 +14,31 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  require 'net/http'
21
+ require 'resolv'
19
22
 
20
23
  module DynDynDong
21
24
 
22
25
  class DynDNS < Service
23
- MSGTABLE = {
24
- 'badauth' => 'The username and password pair do not match a real user.',
25
- '!donator' => 'Option available only to credited users.',
26
- 'good' => 'The update was successful, and the hostname is now updated.',
27
- 'nochg' => 'The update changed no settings, and is considered abusive.',
28
- 'notfqdn' => 'The hostname specified is not a fully-qualified domain name.',
29
- 'nohost' => 'The hostname specified does not exist in this user account.',
30
- 'numhost' => 'Too many hosts specified in an update.',
31
- 'abuse' => 'The hostname specified is blocked for update abuse.',
32
- 'badagent' => 'The user agent was not sent or HTTP method is not permitted.',
33
- 'good 127.0.0.1' => 'Request was ignored because of agent that does not follow our specifications.',
34
- 'dnserr' => 'DNS error encountered.',
35
- '911' => 'There is a problem or scheduled maintenance on our side.'
36
- }
26
+ def MSGTABLE(x)
27
+ {
28
+ 'badauth' => 'The username and password pair do not match a real user.',
29
+ '!donator' => 'Option available only to credited users.',
30
+ 'good' => 'The update was successful, and the hostname is now updated.',
31
+ 'nochg' => 'The update changed no settings, and is considered abusive.',
32
+ 'notfqdn' => 'The hostname specified is not a fully-qualified domain name.',
33
+ 'nohost' => 'The hostname specified does not exist in this user account.',
34
+ 'numhost' => 'Too many hosts specified in an update.',
35
+ 'abuse' => 'The hostname specified is blocked for update abuse.',
36
+ 'badagent' => 'The user agent was not sent or HTTP method is not permitted.',
37
+ 'good 127.0.0.1' => 'Request was ignored because of agent that does not follow our specifications.',
38
+ 'dnserr' => 'DNS error encountered.',
39
+ '911' => 'There is a problem or scheduled maintenance on our side.'
40
+ }[x]
41
+ end
37
42
 
38
43
  def initialize(*args)
39
44
  @user = nil
@@ -78,24 +83,29 @@ class DynDNS < Service
78
83
  def alias_host(h, ip, offline = false)
79
84
  return "Nothing to update." if ip == @ip
80
85
 
81
- Net::HTTP.start('members.dyndns.org') {|http|
86
+ Net::HTTP.start(update_host) {|http|
82
87
  req = Net::HTTP::Get.new('/nic/update?hostname=%s&myip=%s&offline=%s' % [
83
- URI.escape(h), @ip, (offline ? 'YES' : 'NOCHG')])
88
+ URI.escape(h), @ip, offline?(offline)])
84
89
  req.basic_auth @user, @pass
85
90
  x = http.request(req).body.gsub(/#{Regexp.escape(@ip)}/, '').strip
86
- MSGTABLE[x]
91
+ self::MSGTABLE(x)
87
92
  }
88
93
  end
89
94
 
90
95
  private
96
+ def update_host
97
+ 'members.dyndns.org'
98
+ end
99
+
100
+ def offline?(offline)
101
+ offline ? 'YES' : 'NOCHG'
102
+ end
103
+
91
104
  def getip(h = nil)
92
105
  if h
93
- addr = Socket::getaddrinfo(h, 'www', nil, Socket::SOCK_STREAM)[0][3]
94
- if addr == Socket::getaddrinfo(Socket::gethostname, 'www', nil, Socket::SOCK_STREAM)[0][3]
95
- return @ip
96
- else
97
- return addr
98
- end
106
+ hosts = ""
107
+ Resolv.new.each_address(h){|ho| hosts = ho }
108
+ return hosts
99
109
  end
100
110
  str = Net::HTTP.get(URI.parse('http://checkip.dyndns.org/')).
101
111
  match(/<body>(.+?)<\/body>/)[1] rescue ""
@@ -0,0 +1,47 @@
1
+ #--
2
+ # Copyleft shura. [shura1991@gmail.com]
3
+ #
4
+ # This file is part of DynDynDong.
5
+ #
6
+ # DynDynDong is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DynDynDong is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module DynDynDong
21
+
22
+ class NoIp < DynDNS
23
+ def MSGTABLE(x)
24
+ {
25
+ 'good' => 'DNS hostname update successful.',
26
+ 'nochg' => 'IP address is current, no update performed.',
27
+ 'nohost' => 'Hostname supplied does not exist under specified account.',
28
+ 'badauth' => 'Invalid username password combination.',
29
+ 'badagent' => 'Client disabled.',
30
+ '!donator' => 'An update request was sent including a feature that is not available to that particular user such as offline options.',
31
+ 'abuse' => 'Username is blocked due to abuse.',
32
+ '911' => 'A fatal error on our side such as a database outage.'
33
+ }
34
+ end
35
+
36
+ private
37
+
38
+ def update_host
39
+ 'dynupdate.no-ip.com'
40
+ end
41
+
42
+ def offline?(offline)
43
+ super(offline).gsub(/CHG$/, '')
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,60 @@
1
+ #--
2
+ # Copyleft shura. [shura1991@gmail.com]
3
+ #
4
+ # This file is part of DynDynDong.
5
+ #
6
+ # DynDynDong is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # DynDynDong is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module DynDynDong
21
+
22
+ class ZoneEdit < Service
23
+ def initialize(*args)
24
+ @user = nil
25
+ @pass = nil
26
+ super(*args)
27
+ end
28
+
29
+ def username(u)
30
+ @user = u.to_s
31
+ end
32
+
33
+ def password(p)
34
+ @pass = p.to_s
35
+ end
36
+
37
+ alias username= username
38
+ alias password= password
39
+
40
+ def host(h)
41
+ @hosts << h.to_s
42
+ end
43
+
44
+ def prefetch
45
+ if !(@user and @pass)
46
+ raise "username or password ungiven"
47
+ end
48
+ end
49
+
50
+ def alias_host(h)
51
+ Net::HTTP.start('dynamic.zoneedit.com') {|http|
52
+ req = Net::HTTP::Get.new('/auth/dynamic.html?host=%s' % [URI.escape(h)])
53
+ req.basic_auth @user, @pass
54
+ http.request(req)
55
+ "DONE"
56
+ }
57
+ end
58
+ end
59
+
60
+ end
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Copyleft shura. [shura1991@gmail.com]
2
3
  #
3
4
  # This file is part of DynDynDong.
@@ -13,10 +14,11 @@
13
14
  # GNU Affero General Public License for more details.
14
15
  #
15
16
  # You should have received a copy of the GNU Affero General Public License
16
- # along with failirc. If not, see <http://www.gnu.org/licenses/>.
17
+ # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
17
19
 
18
20
  module DynDynDong
19
21
 
20
- VERSION = '0.0.1'
22
+ VERSION = '0.0.2'
21
23
 
22
24
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - shura
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-02 00:00:00 +01:00
17
+ date: 2010-11-15 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -40,13 +40,15 @@ extra_rdoc_files: []
40
40
 
41
41
  files:
42
42
  - lib/dyndyndong.rb
43
+ - lib/dyndyndong/dyndyndong.rb
43
44
  - lib/dyndyndong/services.rb
44
- - lib/dyndyndong/version.rb
45
+ - lib/dyndyndong/services/zoneedit.rb
45
46
  - lib/dyndyndong/services/dyndns.rb
46
47
  - lib/dyndyndong/services/afraid.rb
47
- - lib/dyndyndong/dyndyndong.rb
48
+ - lib/dyndyndong/services/no-ip.rb
48
49
  - lib/dyndyndong/daemon.rb
49
50
  - lib/dyndyndong/client.rb
51
+ - lib/dyndyndong/version.rb
50
52
  - bin/dyndyndong
51
53
  has_rdoc: true
52
54
  homepage: http://github.com/shurizzle/DynDynDong