]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/scripts/setddns.pl
HinzugefĆ¼gt:
[people/pmueller/ipfire-2.x.git] / src / scripts / setddns.pl
CommitLineData
cd1a2927
MT
1#!/usr/bin/perl\r
2#\r
3# SmoothWall CGIs\r
4#\r
5# This code is distributed under the terms of the GPL\r
6#\r
7# (c) The SmoothWall Team\r
8#\r
9# $Id: setddns.pl,v 1.4.2.32 2006/02/07 01:29:47 franck78 Exp $\r
10#\r
11\r
12#close(STDIN);\r
13#close(STDOUT);\r
14#close(STDERR);\r
15\r
16use strict;\r
17use IO::Socket;\r
18use Net::SSLeay;\r
19\r
20require '/var/ipcop/general-functions.pl';\r
21\r
22#Prototypes functions\r
23sub encode_base64 ($;$);\r
24\r
25my %settings;\r
26my $filename = "${General::swroot}/ddns/config";\r
27my $cachefile = "${General::swroot}/ddns/ipcache";\r
28my $ipcache = 0;\r
29my @current = ();\r
30\r
31if (open(FILE, "$filename")) {\r
32 @current = <FILE>;\r
33 close(FILE);\r
34 unless(@current) { \r
35 exit 0; \r
36 }\r
37} else {\r
38 &General::log('Dynamic DNS failure : unable to open config file.');\r
39 exit 0;\r
40}\r
41\r
42&General::readhash("${General::swroot}/ddns/settings", \%settings);\r
43\r
44# ignore monthly update if not in minimize update mode\r
45exit 0 if (($settings{'MINIMIZEUPDATES'} ne 'on') && ($ARGV[1] eq '-m'));\r
46\r
47my $ip;\r
48if (open(IP, "${General::swroot}/red/local-ipaddress")) {\r
49 $ip = <IP>;\r
50 close(IP);\r
51 chomp $ip;\r
52} else {\r
53 &General::log('Dynamic DNS failure : unable to open local-ipaddress file.');\r
54 exit 0;\r
55}\r
56\r
57#If IP is reserved network, we are behind a router. May we ask for our real public IP ?\r
58if ( &General::IpInSubnet ($ip,'10.0.0.0','255.0.0.0') ||\r
59 &General::IpInSubnet ($ip,'172.16.0.0','255.240.0.0') ||\r
60 &General::IpInSubnet ($ip,'192.168.0.0','255.255.0.0')) {\r
61 # We can, but are we authorized by GUI ?\r
62 if ($settings{'BEHINDROUTER'} eq 'FETCH_IP') {\r
63 if ($ARGV[0] eq '-f'){\r
64 $settings{'BEHINDROUTERWAITLOOP'} = -1; # When forced option, fectch PublicIP now\r
65 }\r
66\r
67 # Increment counter modulo 4. When it is zero, fetch ip else exit\r
68 # This divides by 4 the requests to the dyndns server.\r
69 $settings{'BEHINDROUTERWAITLOOP'} = ($settings{'BEHINDROUTERWAITLOOP'}+1) %4;\r
70 &General::writehash("${General::swroot}/ddns/settings", \%settings);\r
71 exit 0 if ( $settings{'BEHINDROUTERWAITLOOP'} ne 0 );\r
72 my $RealIP = &General::FetchPublicIp;\r
73 $ip = (&General::validip ($RealIP) ? $RealIP : 'unavailable');\r
74 &General::log ("Dynamic DNS public router IP is:$ip");\r
75 }\r
76}\r
77\r
78\r
79if ($ARGV[0] eq '-f') {\r
80 unlink ($cachefile); # next regular calls will try again if this force update fails.\r
81} else {\r
82 open(IPCACHE, "$cachefile");\r
83 $ipcache = <IPCACHE>;\r
84 close(IPCACHE);\r
85 chomp $ipcache;\r
86}\r
87\r
88if ($ip ne $ipcache) {\r
89 my $id = 0;\r
90 my $success = 0;\r
91 my $line;\r
92 my $lines = @current;\r
93\r
94 foreach $line (@current) {\r
95 $id++;\r
96 chomp($line);\r
97 my @temp = split(/\,/,$line);\r
98 unless ($temp[7] ne "on") {\r
99 $settings{'SERVICE'} = $temp[0];\r
100 $settings{'HOSTNAME'} = $temp[1];\r
101 $settings{'DOMAIN'} = $temp[2];\r
102 $settings{'PROXY'} = $temp[3];\r
103 $settings{'WILDCARDS'} = $temp[4];\r
104 $settings{'LOGIN'} = $temp[5];\r
105 $settings{'PASSWORD'} = $temp[6];\r
106 $settings{'ENABLED'} = $temp[7];\r
107\r
108 #Some connection are very stable (more than 40 days). Finally force\r
109 #one update / month to avoid account lost\r
110 #cron call once/week with -f & once/month with -f -m options\r
111 #minimize update ?\r
112 if ( ($settings{'MINIMIZEUPDATES'} eq 'on') && ($ARGV[1] ne '-m') ) {\r
113 if (General::DyndnsServiceSync($ip, $settings{'HOSTNAME'},$settings{'DOMAIN'})) {\r
114 &General::log ("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} is uptodate [$ip]");\r
115 $success++;\r
116 next; # do not update, go to test next service\r
117 }\r
118 }\r
119 my @service = split(/\./, "$settings{'SERVICE'}");\r
120 $settings{'SERVICE'} = "$service[0]";\r
121 if ($settings{'SERVICE'} eq 'no-ip') {\r
122 open(F, ">${General::swroot}/ddns/noipsettings");\r
123 flock F, 2;\r
124 print F "PROXY=" . ($settings{'PROXY'} eq 'on' ? "Y\n" : "N\n");\r
125 print F "PASSWORD=$settings{'PASSWORD'}\n";\r
126 print F "NAT=N\n";\r
127 print F "LOGIN=$settings{'LOGIN'}\n";\r
128 print F "INTERVAL=1\n";\r
129 if ($settings{'HOSTNAME'} !~ s/$General::noipprefix//) {\r
130 print F "HOSTNAME=$settings{'HOSTNAME'}\n";\r
131 print F "GROUP=\n";\r
132 } else {\r
133 print F "HOSTNAME=\n";\r
134 print F "GROUP=$settings{'HOSTNAME'}\n";\r
135 }\r
136 print F "DOMAIN=$settings{'DOMAIN'}\n";\r
137 print F "DEVICE=\n";\r
138 print F "DAEMON=N\n";\r
139 close(F);\r
140\r
141 my @ddnscommand = ('/usr/bin/noip','-c',"${General::swroot}/ddns/noipsettings",'-i',"$ip");\r
142\r
143 my $result = system(@ddnscommand);\r
144 if ( $result != 0) { \r
145 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure");\r
146 } else {\r
147 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
148 $success++;\r
149 }\r
150 }\r
151\r
152 elsif ($settings{'SERVICE'} eq 'cjb') {\r
153 # use proxy ?\r
154 my %proxysettings;\r
155 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
156 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
157 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
158 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
159 }\r
160\r
161 my ($out, $response) = Net::SSLeay::get_http( 'www.cjb.net',\r
162 80,\r
163 "/cgi-bin/dynip.cgi?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&ip=$ip",\r
164 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
165 );\r
166\r
167 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
168 if ( $out !~ m/has been updated to point to/ ) {\r
169 &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (bad password or login)");\r
170 } else {\r
171 &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : success");\r
172 $success++;\r
173 }\r
174 } else {\r
175 &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (could not connect to server)");\r
176 }\r
177 }\r
178 elsif ($settings{'SERVICE'} eq 'selfhost') {\r
179 # use proxy ?\r
180 my %proxysettings;\r
181 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
182 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
183 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
184 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
185 }\r
186\r
187 my ($out, $response) = Net::SSLeay::get_https( 'carol.selfhost.de',\r
188 443,\r
189 "/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&textmodi=1",\r
190 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
191 );\r
192\r
193 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
194 if ( $out !~ m/status=(200|204)/ ) {\r
195 $out =~ s/\n/ /g;\r
196 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");\r
197 } else {\r
198 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
199 $success++;\r
200 }\r
201 } else {\r
202 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r
203 }\r
204 }\r
205 elsif ($settings{'SERVICE'} eq 'dnspark') {\r
206 # use proxy ?\r
207 my %proxysettings;\r
208 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
209 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
210 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
211 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
212 }\r
213\r
214 if ($settings{'HOSTNAME'} eq '') {\r
215 $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
216 } else {\r
217 $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
218 }\r
219\r
220 my ($out, $response) = Net::SSLeay::get_https( "www.dnspark.net",\r
221 443,\r
222 "/api/dynamic/update.php?hostname=$settings{'HOSTDOMAIN'}&ip=$ip",\r
223 Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r
224 'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")\r
225 )\r
226 );\r
227 # Valid response are 'ok' 'nochange'\r
228 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
229 if ( $out !~ m/^(ok|nochange)/ ) {\r
230 $out =~ s/\n/ /g;\r
231 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
232 } else {\r
233 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
234 $success++;\r
235 }\r
236 } else {\r
237 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials)");\r
238 }\r
239 }\r
240 elsif ($settings{'SERVICE'} eq 'enom') {\r
241 # use proxy ?\r
242 my %proxysettings;\r
243 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
244 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
245 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
246 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
247 }\r
248 if ($settings{'HOSTNAME'} eq '') {\r
249 $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
250 } else {\r
251 $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
252 }\r
253\r
254 my ($out, $response) = Net::SSLeay::get_http( 'dynamic.name-services.com',\r
255 80,\r
256 "/interface.asp?Command=SetDNSHost&Zone=$settings{'DOMAIN'}&DomainPassword=$settings{'PASSWORD'}&Address=$ip",\r
257 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
258 );\r
259\r
260 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
261 #Valid responses from update => ErrCount=0\r
262 if ( $out !~ m/ErrCount=0/ ) {\r
263 $out =~ s/(\n|\x0D)/ /g;\r
264 $out =~ /Err1=([\w ]+) /;\r
265 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($1)");\r
266 } else {\r
267 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
268 $success++;\r
269 }\r
270 } else {\r
271 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r
272 }\r
273 }\r
274 elsif ($settings{'SERVICE'} eq 'nsupdate') {\r
275 # Fetch UI configurable values and assemble the host name.\r
276\r
277 my $hostName="$settings{'DOMAIN'}";\r
278 if ($settings{'HOSTNAME'} ne "") {\r
279 $hostName="$settings{'HOSTNAME'}.$hostName";\r
280 }\r
281 my $keyName=$settings{'LOGIN'};\r
282 my $keySecret=$settings{'PASSWORD'};\r
283\r
284 # Use a relatively long TTL value to reduce load on DNS.\r
285 # Some public Dynamic DNS servers use values around 4 hours,\r
286 # some use values as low as 60 seconds.\r
287 # XXX Maybe we could fetch the master value from the server\r
288 # (not the timed-down version supplied by DNS cache)\r
289\r
290 my $timeToLive="3600";\r
291\r
292 # Internal setting that can be used to override the DNS server\r
293 # where the update is applied. It can be of use when testing\r
294 # against a private DNS server.\r
295 \r
296 my $masterServer="";\r
297\r
298 # Prepare the nsupdate command script to remove and re-add the\r
299 # updated A record for the domain.\r
300\r
301 my $cmdFile="/tmp/nsupdate-$hostName-commands";\r
302 my $logFile="/tmp/nsupdate-$hostName-result";\r
303 open(TF, ">$cmdFile");\r
304 if ($masterServer ne "") {\r
305 print TF "server $masterServer\n";\r
306 }\r
307 if ($keyName ne "" && $keySecret ne "") {\r
308 print TF "key $keyName $keySecret\n";\r
309 }\r
310 print TF "update delete $hostName A\n";\r
311 print TF "update add $hostName $timeToLive A $ip\n";\r
312 print TF "send\n";\r
313 close(TF);\r
314\r
315 # Run nsupdate with -v to use TCP instead of UDP because we're\r
316 # issuing multiple cmds and potentially long keys, and -d to\r
317 # get diagnostic result output.\r
318\r
319 my $result = system("/usr/bin/nsupdate -v -d $cmdFile 2>$logFile");\r
320 if ($result != 0) {\r
321 &General::log("Dynamic DNS ip-update for $hostName : failure");\r
322 open(NSLOG, "$logFile");\r
323 my @nsLog = <NSLOG>;\r
324 close(NSLOG);\r
325 my $logLine;\r
326 foreach $logLine (@nsLog) {\r
327 chomp($logLine);\r
328 if ($logLine ne "") {\r
329 &General::log("... $logLine");\r
330 }\r
331 }\r
332 } else {\r
333 &General::log("Dynamic DNS ip-update for $hostName : success");\r
334 $success++;\r
335 }\r
336 unlink $cmdFile, $logFile;\r
337 }\r
338 elsif ($settings{'SERVICE'} eq 'freedns') {\r
339 # use proxy ?\r
340 my %proxysettings;\r
341 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
342 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
343 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
344 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
345 }\r
346\r
347 my ($out, $response) = Net::SSLeay::get_https( 'freedns.afraid.org',\r
348 443,\r
349 "/dynamic/update.php?$settings{'LOGIN'}",\r
350 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
351 );\r
352 #Valid responses from service are:\r
353 #Updated n host(s) <domain>\r
354 #ERROR: <ip> has not changed.\r
355 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
356 #Valid responses from update => ErrCount=0\r
357 if ( $out !~ m/(^Updated|Address .* has not changed)/ig ) {\r
358 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");\r
359 } else {\r
360 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
361 $success++;\r
362 }\r
363 } else {\r
364 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r
365 }\r
366 }\r
367 elsif ($settings{'SERVICE'} eq 'regfish') {\r
368 # use proxy ?\r
369 my %proxysettings;\r
370 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
371 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
372 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
373 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
374 }\r
375\r
376\r
377 my ($out, $response) = Net::SSLeay::get_https( 'www.regfish.com',\r
378 443,\r
379 "/dyndns/2/?fqdn=$settings{'DOMAIN'}&ipv4=$ip&forcehost=1&authtype=secure&token=$settings{'LOGIN'}",\r
380 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
381 );\r
382 #Valid responses from service are:\r
383 #success|100|update succeeded!\r
384 #success|101|no update needed at this time..\r
385 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
386 if ( $out !~ m/(success\|(100|101)\|)/ig ) {\r
387 &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out)");\r
388 } else {\r
389 &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");\r
390 $success++;\r
391 }\r
392 } else {\r
393 &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure (could not connect to server)");\r
394 }\r
395 }\r
396 elsif ($settings{'SERVICE'} eq 'ovh') {\r
397 my %proxysettings;\r
398 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
399\r
400 my $peer = 'www.ovh.com';\r
401 my $peerport = 80;\r
402\r
403 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
404 ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
405 }\r
406\r
407 my $sock;\r
408 unless($sock = new IO::Socket::INET (PeerAddr => $peer, PeerPort => $peerport, Proto => 'tcp', Timeout => 5)) {\r
409 &General::log("Dynamic DNS failure : could not connect to $peer:$peerport: $@");\r
410 next;\r
411 }\r
412\r
413 if ($settings{'HOSTNAME'} eq '') {\r
414 $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
415 } else {\r
416 $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
417 }\r
418\r
419 my ($GET_CMD, $code64);\r
420 $GET_CMD = "GET http://www.ovh.com/nic/update?system=dyndns&hostname=$settings{'HOSTDOMAIN'}&myip=$ip HTTP/1.1\r\n";\r
421 $GET_CMD .= "Host: www.ovh.com\r\n";\r
422 chomp($code64 = encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}"));\r
423 $GET_CMD .= "Authorization: Basic $code64\r\n";\r
424 $GET_CMD .= "User-Agent: ipcop\r\n";\r
425 #$GET_CMD .= "Content-Type: application/x-www-form-urlencoded\r\n";\r
426 $GET_CMD .= "\r\n";\r
427 print $sock "$GET_CMD";\r
428 \r
429 my $out = '';\r
430 while(<$sock>) {\r
431 $out .= $_;\r
432 }\r
433 close($sock);\r
434\r
435 #HTTP response => error (in Title tag) else text response\r
436 #Valid responses from service:good,nochg (ez-ipupdate like)\r
437 #Should use ez-ipdate but "system=dyndns" is not present\r
438 if ( $out =~ m/<Title>(.*)<\/Title>/ig ) {\r
439 &General::log("Dynamic DNS ovh.com : failure ($1)");\r
440 }\r
441 elsif ($out !~ m/good |nochg /ig) {\r
442 $out =~ s/.+?\015?\012\015?\012//s; # header HTTP\r
443 my @out = split("\r", $out);\r
444 &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out[1])");\r
445 } else {\r
446 &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");\r
447 $success++;\r
448 }\r
449 }\r
450 elsif ($settings{'SERVICE'} eq 'dtdns') {\r
451 # use proxy ?\r
452 my %proxysettings;\r
453 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
454 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
455 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
456 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
457 }\r
458\r
459 if ($settings{'HOSTNAME'} eq '') {\r
460 $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
461 } else {\r
462 $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
463 }\r
464\r
465 my ($out, $response) = Net::SSLeay::get_http( 'www.dtdns.com',\r
466 80,\r
467 "/api/autodns.cfm?id=$settings{'HOSTDOMAIN'}&pw=$settings{'PASSWORD'}",\r
468 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
469 );\r
470 #Valid responses from service are:\r
471 # now points to\r
472 #\r
473 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
474 if ( $out !~ m/Host .* now points to/ig ) {\r
475 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
476 } else {\r
477 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
478 $success++;\r
479 }\r
480 } else {\r
481 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
482 }\r
483 }\r
484 elsif ($settings{'SERVICE'} eq 'dynu') {\r
485 # use proxy ?\r
486 my %proxysettings;\r
487 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
488 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
489 my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
490 Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
491 }\r
492\r
493 if ($settings{'HOSTNAME'} eq '') {\r
494 $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
495 } else {\r
496 $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
497 }\r
498\r
499 my ($out, $response) = Net::SSLeay::get_http( 'dynserv.ca',\r
500 80,\r
501 "/dyn/dynengine.cgi?func=set&name=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip&domain=$settings{'DOMAIN'}",\r
502 Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
503 );\r
504 #Valid responses from service are:\r
505 # 02 == Domain already exists, refreshing data for ... => xxx.xxx.xxx.xxx\r
506 #\r
507 if ($response =~ m%HTTP/1\.. 200 OK%) {\r
508 if ( $out !~ m/Domain already exists, refreshing data for/ig ) {\r
509 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
510 } else {\r
511 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
512 $success++;\r
513 }\r
514 } else {\r
515 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
516 }\r
517 } else {\r
518 if ($settings{'WILDCARDS'} eq 'on') {\r
519 $settings{'WILDCARDS'} = '-w';\r
520 } else {\r
521 $settings{'WILDCARDS'} = '';\r
522 }\r
523\r
524 if (($settings{'SERVICE'} eq 'dyndns-custom' ||\r
525 $settings{'SERVICE'} eq 'easydns' || \r
526 $settings{'SERVICE'} eq 'zoneedit') && $settings{'HOSTNAME'} eq '') {\r
527 $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
528 } else {\r
529 $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
530 }\r
531\r
532 my @ddnscommand = ('/usr/bin/ez-ipupdate', '-a', "$ip", '-S', "$settings{'SERVICE'}", '-u', "$settings{'LOGIN'}:$settings{'PASSWORD'}", '-h', "$settings{'HOSTDOMAIN'}", "$settings{'WILDCARDS'}", '-q');\r
533\r
534 my $result = system(@ddnscommand);\r
535 if ( $result != 0) { \r
536 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: failure");\r
537 } else {\r
538 &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: success");\r
539 $success++;\r
540 }\r
541 }\r
542 } else {\r
543 # If a line is disabled, then we should discount it\r
544 $lines--;\r
545 }\r
546 }\r
547\r
548 if ($lines == $success) {\r
549 open(IPCACHE, ">$cachefile");\r
550 flock IPCACHE, 2;\r
551 print IPCACHE $ip;\r
552 close(IPCACHE);\r
553 exit 1;\r
554 }\r
555 \r
556}\r
557exit 0;\r
558\r
559# Extracted from Base64.pm\r
560sub encode_base64 ($;$) {\r
561 my $res = "";\r
562 my $eol = $_[1];\r
563 $eol = "\n" unless defined $eol;\r
564 pos($_[0]) = 0; # ensure start at the beginning\r
565 while ($_[0] =~ /(.{1,45})/gs) {\r
566 $res .= substr(pack('u', $1), 1);\r
567 chop($res);\r
568 }\r
569 $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs\r
570 # fix padding at the end\r
571 my $padding = (3 - length($_[0]) % 3) % 3;\r
572 $res =~ s/.{$padding}$/'=' x $padding/e if $padding;\r
573 # break encoded string into lines of no more than 76 characters each\r
574 if (length $eol) {\r
575 $res =~ s/(.{1,76})/$1$eol/g;\r
576 }\r
577 $res;\r
578}\r
579\r
580\r
581\r
582__END__\r
583old code for selfhost.de\r
584\r
585 my %proxysettings;\r
586 &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
587\r
588 my $peer = 'carol.selfhost.de';\r
589 my $peerport = 80;\r
590\r
591 if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
592 ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
593 }\r
594\r
595 my $sock;\r
596 unless($sock = new IO::Socket::INET (PeerAddr => $peer, PeerPort => $peerport, Proto => 'tcp', Timeout => 5)) {\r
597 die "Could not connect to $peer:$peerport: $@";\r
598 return 1;\r
599 }\r
600\r
601 my $GET_CMD;\r
602 $GET_CMD = "GET https://carol.selfhost.de/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&myip=$ip&textmodi=1 HTTP/1.1\r\n";\r
603 $GET_CMD .= "Host: carol.selfhost.de\r\n";\r
604 $GET_CMD .= "User-Agent: ipcop\r\n";\r
605 $GET_CMD .= "Connection: close\r\n\r\n";\r
606 print $sock "$GET_CMD";\r
607\r
608 my $out = '';\r
609 while(<$sock>) {\r
610 $out .= $_;\r
611 }\r
612 close($sock);\r
613\r
614 if ( $out !~ m/status=(200|204)/ ) {\r
615 #cleanup http response...\r
616 $out =~ s/.+?\015?\012\015?\012//s; # header HTTP\r
617 my @out = split("\r", $out);\r
618 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out[1])");\r
619 } else {\r
620 &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
621 $success++;\r
622 }\r
623\r
624\r
625 \r