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