dyndyndong 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -40,14 +40,26 @@ USAGE: #{$0} [-d|-h|-1] [-c <config file>] [-D <delay>] [-s <service> <service a
40
40
  -s|--service Start to parse a service, no defaults, you have to choose between:
41
41
  - afraid For freedns.afraid.org
42
42
  AVAILABLE ARGUMENTS:
43
- -H|-host Set a single host or more hosts separated with ',' (comma), it can be repeated
44
- - dyndns Fro dyndns.com
43
+ -H|--host Set a single host or more hosts separated with ',' (comma), it can be repeated
44
+ - dyndns For dyndns.com
45
+ AVAILABLE ARGUMENTS:
46
+ -u|--username Set username for login, it can't be repeated
47
+ -p|--password Set password for login, it can't be repeated
48
+ -H|--host Set a single host or more hosts separated with ',' (comma), it can be repeated
49
+ -o|--offline Set a single host or more hosts separated with ',' (comma) to make offline, it
50
+ can be repeated
51
+ - no-ip For no-ip-com
45
52
  AVAILABLE ARGUMENTS:
46
53
  -u|--username Set username for login, it can't be repeated
47
54
  -p|--password Set password for login, it can't be repeated
48
55
  -H|--host Set a single host or more hosts separated with ',' (comma), it can be repeated
49
56
  -o|--offline Set a single host or more hosts separated with ',' (comma) to make offline, it
50
57
  can be repeated
58
+ - zoneedit For zoneedit.com
59
+ AVAILABLE ARGUMENTS:
60
+ -u|--username Set username for login, it can't be repeated
61
+ -p|--password Set password for login, it can't be repeated
62
+ -H|--host Set a single host or more hosts separated with ',' (comma), it can be repeated
51
63
  Parsing of services' arguments stop when an unrelated argument is given.
52
64
  HELP
53
65
  exit 0
@@ -114,7 +126,7 @@ while i < ARGV.size
114
126
  end
115
127
 
116
128
  case service
117
- when 'dyndns'
129
+ when 'dyndns', 'no-ip'
118
130
  srv = {:hosts => [], :offline => []}
119
131
  while (i += 1) < ARGV.size
120
132
  parsed = true
@@ -154,6 +166,40 @@ while i < ARGV.size
154
166
  end
155
167
  srv[:hosts].flatten!
156
168
  srv[:offline].flatten!
169
+ when 'zoneedit'
170
+ srv = {:hosts => []}
171
+ while (i += 1) < ARGV.size
172
+ parsed = true
173
+ case ARGV[i]
174
+ when /^-u/, '--username'
175
+ die "Can't add more than one username" if srv[:username]
176
+
177
+ if %w{-u --username}.include?(ARGV[1])
178
+ srv[:username] = ARGV[i += 1]
179
+ else
180
+ srv[:username] = ARGV[i].gsub(/^-u/, '')
181
+ end
182
+ when /^-p/, '--password'
183
+ die "Can't add more than one password" if srv[:password]
184
+
185
+ if %w{-p --password}.include?(ARGV[1])
186
+ srv[:password] = ARGV[i += 1]
187
+ else
188
+ srv[:password] = ARGV[i].gsub(/^-p/, '')
189
+ end
190
+ when /^-H/, '--host'
191
+ if %w{-H --host}.include?(ARGV[i])
192
+ srv[:hosts] << ARGV[i += 1].split(',')
193
+ else
194
+ srv[:hosts] << ARGV[i].gsub(/^-H/, '').split(',')
195
+ end
196
+ else
197
+ parsed = false
198
+ break
199
+ end
200
+ end
201
+ srv[:hosts].flatten!
202
+ srv[:offline].flatten!
157
203
  when 'afraid'
158
204
  srv = []
159
205
 
@@ -180,10 +226,10 @@ while i < ARGV.size
180
226
  parsed = true
181
227
 
182
228
  case service
183
- when 'dyndns'
184
- SERVICES[service.to_sym] << srv
185
229
  when 'afraid'
186
230
  SERVICES[service.to_sym] += srv
231
+ else
232
+ SERVICES[service.to_sym] << srv
187
233
  end
188
234
  end
189
235
 
@@ -220,6 +266,27 @@ if SERVICES != {:dyndns=>[],:afraid=>[]}
220
266
  die "Respect the syntax of afraid please."
221
267
  end
222
268
  }
269
+
270
+ SERVICES[:zoneedit],each {|zoneedit|
271
+ z = DynDynDong::ZoneEdit.new
272
+ z.username = zoneedit[:username]
273
+ z.password = zoneedit[:password]
274
+ zoneedit[:hosts].each {|host|
275
+ z.host host
276
+ }
277
+ }
278
+
279
+ SERVICES[:'no-ip'].each {|noip|
280
+ n = DynDynDong::NoIp.new
281
+ n.username = noip[:username]
282
+ n.password = noip[:password]
283
+ noip[:hosts].each {|host|
284
+ n.host host
285
+ }
286
+ noip[:offline].each {|offline|
287
+ n.offline offline
288
+ }
289
+ }
223
290
  else
224
291
  die "You can't use a configure file with custom services"
225
292
  end
@@ -17,8 +17,6 @@
17
17
  # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
18
  #++
19
19
 
20
- $DEBUG = true
21
-
22
20
  module DynDynDong
23
21
 
24
22
  class Service
@@ -91,6 +89,6 @@ end
91
89
 
92
90
  end
93
91
 
94
- %w{afraid dyndns zoneedit}.each {|s|
92
+ %w{generic afraid dyndns zoneedit no-ip}.each {|s|
95
93
  require "dyndyndong/services/#{s}"
96
94
  }
@@ -17,14 +17,10 @@
17
17
  # along with dyndyndong. If not, see <http://www.gnu.org/licenses/>.
18
18
  #++
19
19
 
20
- require 'net/http'
21
- require 'resolv'
22
-
23
20
  module DynDynDong
24
21
 
25
- class DynDNS < Service
26
- def MSGTABLE(x)
27
- {
22
+ class DynDNS < Generic
23
+ set :MSGTABLE, {
28
24
  'badauth' => 'The username and password pair do not match a real user.',
29
25
  '!donator' => 'Option available only to credited users.',
30
26
  'good' => 'The update was successful, and the hostname is now updated.',
@@ -37,84 +33,9 @@ class DynDNS < Service
37
33
  'good 127.0.0.1' => 'Request was ignored because of agent that does not follow our specifications.',
38
34
  'dnserr' => 'DNS error encountered.',
39
35
  '911' => 'There is a problem or scheduled maintenance on our side.'
40
- }[x]
41
- end
42
-
43
- def initialize(*args)
44
- @user = nil
45
- @pass = nil
46
- @ip = getip
47
- super(*args)
48
- end
49
-
50
- def username(u)
51
- @user = u.to_s
52
- end
53
-
54
- def password(p)
55
- @pass = p.to_s
56
- end
57
-
58
- alias username= username
59
- alias password= password
60
-
61
- def host(h)
62
- begin
63
- @hosts << [h.to_s, getip(h)]
64
- rescue Exception => e
65
- STDERR.puts "Ip detection error: #{e}, skipping..."
66
- end
67
- end
68
-
69
- def offline(h)
70
- begin
71
- @hosts << [h.to_s, getip(h), true]
72
- rescue Exception => e
73
- STDERR.puts "Ip detection error: #{e}, skipping..."
74
- end
75
- end
76
-
77
- def prefetch
78
- if !(@user and @pass)
79
- raise "username or password ungiven"
80
- end
81
- end
82
-
83
- def alias_host(h, ip, offline = false)
84
- return "Nothing to update." if ip == @ip
85
-
86
- Net::HTTP.start(update_host) {|http|
87
- req = Net::HTTP::Get.new('/nic/update?hostname=%s&myip=%s&offline=%s' % [
88
- URI.escape(h), @ip, offline?(offline)])
89
- req.basic_auth @user, @pass
90
- x = http.request(req).body.gsub(/#{Regexp.escape(@ip)}/, '').strip
91
- self::MSGTABLE(x)
92
36
  }
93
- end
94
-
95
- private
96
- def update_host
97
- 'members.dyndns.org'
98
- end
99
-
100
- def offline?(offline)
101
- offline ? 'YES' : 'NOCHG'
102
- end
103
-
104
- def getip(h = nil)
105
- if h
106
- hosts = ""
107
- Resolv.new.each_address(h){|ho| hosts = ho }
108
- return hosts
109
- end
110
- str = Net::HTTP.get(URI.parse('http://checkip.dyndns.org/')).
111
- match(/<body>(.+?)<\/body>/)[1] rescue ""
112
- if str =~ /^Current IP Address: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
113
- return str.gsub(/^Current IP Address: /, '')
114
- else
115
- raise "Couldn't retrieve ip."
116
- end
117
- end
37
+ set :OFFLINE, 'YES', 'NOCHG'
38
+ set :UPDATE_HOST, 'members.dyndns.org'
118
39
  end
119
40
 
120
41
  end
@@ -0,0 +1,132 @@
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
+ require 'net/http'
21
+ require 'resolv'
22
+
23
+ module DynDynDong
24
+
25
+ class Generic < Service
26
+ def initialize(*args)
27
+ @user = nil
28
+ @pass = nil
29
+ @ip = getip
30
+ super(*args)
31
+ end
32
+
33
+ def username(u)
34
+ @user = u.to_s
35
+ end
36
+
37
+ def password(p)
38
+ @pass = p.to_s
39
+ end
40
+
41
+ alias username= username
42
+ alias password= password
43
+
44
+ def host(h)
45
+ @hosts << [h.to_s]
46
+ end
47
+
48
+ def offline(h)
49
+ @hosts << [h.to_s, true]
50
+ end
51
+
52
+ def prefetch
53
+ raise "username or password ungiven" if !(@user and @pass)
54
+ @ip = getip
55
+ end
56
+
57
+ def alias_host(h, offline = false)
58
+ Net::HTTP.start(update_host) {|http|
59
+ req = Net::HTTP::Get.new('/nic/update?hostname=%s&myip=%s&offline=%s' % [
60
+ URI.escape(h), getip(h), offline?(offline)])
61
+ req.basic_auth @user, @pass
62
+ x = http.request(req).body.gsub(/#{Regexp.escape(@ip)}/, '').strip
63
+ MSGTABLE(x)
64
+ }
65
+ end
66
+
67
+ def self.set(*args)
68
+ sym = args.shift.to_s.downcase
69
+ case sym
70
+ when 'msgtable'
71
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 1)" if args.size != 1
72
+ raise ArgumentError, "wrong type" if !args.first.is_a?(Hash)
73
+ self.class_eval %Q{
74
+ def MSGTABLE(x)
75
+ #{args.first.inspect}[x]
76
+ end
77
+ }
78
+ when 'update_host'
79
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 1)" if args.size != 1
80
+ raise ArgumentError, "wrong type" if !args.first.is_a?(String)
81
+ self.class_eval %Q{
82
+ def update_host
83
+ #{args.first.inspect}
84
+ end
85
+ }
86
+ when 'offline'
87
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 2)" if args.size != 2
88
+ raise ArgumentError, "wrong type" if !args[0].is_a?(String) or !args[1].is_a?(String)
89
+ self.class_eval %Q{
90
+ def offlines(what)
91
+ {
92
+ 'YES' => #{args[0].inspect},
93
+ 'NO' => #{args[1].inspect}
94
+ }[what]
95
+ end
96
+ }
97
+ end
98
+ end
99
+
100
+ private
101
+
102
+ def offlines(what)
103
+ {
104
+ 'YES' => 'YES',
105
+ 'NO' => 'NO'
106
+ }[what]
107
+ end
108
+
109
+ def offline?(offline)
110
+ offline ? offlines('YES') : offlines('NO')
111
+ end
112
+
113
+ def getip(h = nil)
114
+ if h
115
+ hosts = ""
116
+ Resolv.new.each_address(h) {|ho|
117
+ hosts = ho
118
+ }
119
+ return hosts
120
+ end
121
+
122
+ str = Net::HTTP.get(URI.parse('http://checkip.dyndns.org/')).
123
+ match(/<body>(.+?)<\/body>/)[1] rescue ""
124
+ if str =~ /^Current IP Address: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
125
+ return str.gsub(/^Current IP Address: /, '')
126
+ else
127
+ raise "Couldn't retrieve ip."
128
+ end
129
+ end
130
+ end
131
+
132
+ end
@@ -20,8 +20,7 @@
20
20
  module DynDynDong
21
21
 
22
22
  class NoIp < DynDNS
23
- def MSGTABLE(x)
24
- {
23
+ set :MSGTABLE, {
25
24
  'good' => 'DNS hostname update successful.',
26
25
  'nochg' => 'IP address is current, no update performed.',
27
26
  'nohost' => 'Hostname supplied does not exist under specified account.',
@@ -31,17 +30,7 @@ class NoIp < DynDNS
31
30
  'abuse' => 'Username is blocked due to abuse.',
32
31
  '911' => 'A fatal error on our side such as a database outage.'
33
32
  }
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
33
+ set :UPDATE_HOST, 'dynupdate.no-ip.com'
45
34
  end
46
35
 
47
36
  end
@@ -19,6 +19,6 @@
19
19
 
20
20
  module DynDynDong
21
21
 
22
- VERSION = '0.0.2'
22
+ VERSION = '0.0.3'
23
23
 
24
24
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - shura
@@ -44,6 +44,7 @@ files:
44
44
  - lib/dyndyndong/services.rb
45
45
  - lib/dyndyndong/services/zoneedit.rb
46
46
  - lib/dyndyndong/services/dyndns.rb
47
+ - lib/dyndyndong/services/generic.rb
47
48
  - lib/dyndyndong/services/afraid.rb
48
49
  - lib/dyndyndong/services/no-ip.rb
49
50
  - lib/dyndyndong/daemon.rb