]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/commitdiff
Updated setddns.pl to support regfish.de and some new ddns services.
authorMarcus Scholz <commander1024@ipfire.org>
Sat, 19 Sep 2009 15:52:53 +0000 (17:52 +0200)
committerMarcus Scholz <commander1024@ipfire.org>
Sat, 19 Sep 2009 15:52:53 +0000 (17:52 +0200)
src/scripts/setddns.pl

index 73d91904571e5da32fd19252bba1cdc14c2f5888..2fa4fadf666b645dfbb6c935284e9259cee2c285 100644 (file)
-#!/usr/bin/perl
-#
-# SmoothWall CGIs
-#
-# This code is distributed under the terms of the GPL
-#
-# (c) The SmoothWall Team
-#
-# $Id: setddns.pl,v 1.4.2.32 2006/02/07 01:29:47 franck78 Exp $
-#
-
-#close(STDIN);
-#close(STDOUT);
-#close(STDERR);
-
-use strict;
-use IO::Socket;
-use Net::SSLeay;
-
-require '/var/ipfire/general-functions.pl';
-
-#Prototypes functions
-sub encode_base64 ($;$);
-
-my %settings;
-my $filename = "${General::swroot}/ddns/config";
-my $cachefile = "${General::swroot}/ddns/ipcache";
-my $ipcache = 0;
-my @current = ();
-
-if (open(FILE, "$filename")) {
-    @current = <FILE>;
-    close(FILE);
-    unless(@current) { 
-       exit 0; 
-    }
-} else {
-    &General::log('Dynamic DNS failure : unable to open config file.');
-    exit 0;
-}
-
-&General::readhash("${General::swroot}/ddns/settings", \%settings);
-
-# ignore monthly update if not in minimize update mode
-exit 0 if (($settings{'MINIMIZEUPDATES'} ne 'on') && ($ARGV[1] eq '-m'));
-
-my $ip;
-if (open(IP, "${General::swroot}/red/local-ipaddress")) {
-    $ip = <IP>;
-    close(IP);
-    chomp $ip;
-} else {
-    &General::log('Dynamic DNS failure : unable to open local-ipaddress file.');
-    exit 0;
-}
-
-#If IP is reserved network, we are behind a router. May we ask for our real public IP ?
-if ( &General::IpInSubnet ($ip,'10.0.0.0','255.0.0.0') ||
-     &General::IpInSubnet ($ip,'172.16.0.0','255.240.0.0') ||
-     &General::IpInSubnet ($ip,'192.168.0.0','255.255.0.0')) {
-    # We can, but are we authorized by GUI ?
-    if ($settings{'BEHINDROUTER'} eq 'FETCH_IP') {
-       if ($ARGV[0] eq '-f'){
-           $settings{'BEHINDROUTERWAITLOOP'} = -1; # When forced option, fectch PublicIP now
-       }
-
-       # Increment counter modulo 4. When it is zero, fetch ip else exit
-       # This divides by 4 the requests to the dyndns server.
-       $settings{'BEHINDROUTERWAITLOOP'} = ($settings{'BEHINDROUTERWAITLOOP'}+1) %4;
-       &General::writehash("${General::swroot}/ddns/settings", \%settings);
-       exit 0 if ( $settings{'BEHINDROUTERWAITLOOP'} ne 0 );
-       my $RealIP = &General::FetchPublicIp;
-       $ip = (&General::validip ($RealIP) ?  $RealIP : 'unavailable');
-       &General::log ("Dynamic DNS public router IP is:$ip");
-    }
-}
-
-if ($ARGV[0] eq '-f') {
-       unlink ($cachefile);    # next regular calls will try again if this force update fails.
-} else {
-       open(IPCACHE, "$cachefile");
-       $ipcache = <IPCACHE>;
-       close(IPCACHE);
-       chomp $ipcache;
-}
-
-if ($ip ne $ipcache) {
-       my $id = 0;
-       my $success = 0;
-       my $line;
-       my $lines = @current;
-
-       foreach $line (@current) {
-               $id++;
-               chomp($line);
-               my @temp = split(/\,/,$line);
-               unless ($temp[7] ne "on") {
-                       $settings{'SERVICE'} = $temp[0];
-                       $settings{'HOSTNAME'} = $temp[1];
-                       $settings{'DOMAIN'} = $temp[2];
-                       $settings{'PROXY'} = $temp[3];
-                       $settings{'WILDCARDS'} = $temp[4];
-                       $settings{'LOGIN'} = $temp[5];
-                       $settings{'PASSWORD'} = $temp[6];
-                       $settings{'ENABLED'} = $temp[7];
-
-                       #Some connection are very stable (more than 40 days). Finally force
-                       #one update / month to avoid account lost
-                       #cron call once/week with -f & once/month with -f -m options
-                       #minimize update ?
-                       if ( ($settings{'MINIMIZEUPDATES'} eq 'on') && ($ARGV[1] ne '-m') ) {
-                           if (General::DyndnsServiceSync($ip, $settings{'HOSTNAME'},$settings{'DOMAIN'})) {
-                               &General::log ("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} is uptodate [$ip]");
-                               $success++;
-                               next;           # do not update, go to test next service
-                           }
-                       }
-                       my @service = split(/\./, "$settings{'SERVICE'}");
-                       $settings{'SERVICE'} = "$service[0]";
-                       if ($settings{'SERVICE'} eq 'no-ip') {
-                               open(F, ">${General::swroot}/ddns/noipsettings");
-                               flock F, 2;
-                               print F "PROXY=" . ($settings{'PROXY'} eq 'on' ? "Y\n" : "N\n");
-                               print F "PASSWORD=$settings{'PASSWORD'}\n";
-                               print F "NAT=N\n";
-                               print F "LOGIN=$settings{'LOGIN'}\n";
-                               print F "INTERVAL=1\n";
-                               if ($settings{'HOSTNAME'} !~ s/$General::noipprefix//) {
-                                   print F "HOSTNAME=$settings{'HOSTNAME'}\n";
-                                   print F "GROUP=\n";
-                               } else {
-                                   print F "HOSTNAME=\n";
-                                   print F "GROUP=$settings{'HOSTNAME'}\n";
-                               }
-                               print F "DOMAIN=$settings{'DOMAIN'}\n";
-                               print F "DEVICE=\n";
-                               print F "DAEMON=N\n";
-                               close(F);
-
-                               my @ddnscommand = ('/usr/bin/noip','-c',"${General::swroot}/ddns/noipsettings",'-i',"$ip");
-
-                               my $result = system(@ddnscommand);
-                               if ( $result != 0) { 
-                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure");
-                               } else {
-                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");
-                                       $success++;
-                               }
-                       }
-
-                       elsif ($settings{'SERVICE'} eq 'cjb') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_http(  'www.cjb.net',
-                                                                           80,
-                                                                           "/cgi-bin/dynip.cgi?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&ip=$ip",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/has been updated to point to/ ) {
-                                   &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (bad password or login)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (could not connect to server)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'mydyn') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_http(  'www.mydyn.de',
-                                                                           80,
-                                                                           "/cgi-bin/update.pl?$settings{'LOGIN'}-$settings{'PASSWORD'}",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                       );
-
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/The IP address of the subdomain/ ) {
-                                   &General::log("Dynamic DNS ip-update for mydyn.de ($settings{'LOGIN'}) : failure (bad password or login)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for mydyn.de ($settings{'LOGIN'}) : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for mydyn.de ($settings{'LOGIN'}) : failure (could not connect to server)");
-                           }
-
-                       }
-                       elsif ($settings{'SERVICE'} eq 'selfhost') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_https(  'carol.selfhost.de',
-                                                                           443,
-                                                                           "/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&textmodi=1",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/status=(200|204)/ ) {
-                                   $out =~ s/\n/ /g;
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'dnspark') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           if ($settings{'HOSTNAME'} eq '') {
-                               $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
-                           } else {
-                               $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_https(  "www.dnspark.net",
-                                                                           443,
-                                                                           "/api/dynamic/update.php?hostname=$settings{'HOSTDOMAIN'}&ip=$ip",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire',
-                                                                                                     'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")
-                                                                            )
-                                                                        );
-                           # Valid response are 'ok'   'nochange'
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/^(ok|nochange)/ ) {
-                                   $out =~ s/\n/ /g;
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'enom') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-                           if ($settings{'HOSTNAME'} eq '') {
-                               $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
-                           } else {
-                               $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_http(  'dynamic.name-services.com',
-                                                                           80,
-                                                                           "/interface.asp?Command=SetDNSHost&Zone=$settings{'DOMAIN'}&DomainPassword=$settings{'PASSWORD'}&Address=$ip",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               #Valid responses from update => ErrCount=0
-                               if ( $out !~ m/ErrCount=0/ ) {
-                                    $out =~ s/(\n|\x0D)/ /g;
-                                   $out =~ /Err1=([\w ]+)  /;
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($1)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'nsupdate') {
-                               # Fetch UI configurable values and assemble the host name.
-
-                               my $hostName="$settings{'DOMAIN'}";
-                               if ($settings{'HOSTNAME'} ne "") {
-                                       $hostName="$settings{'HOSTNAME'}.$hostName";
-                               }
-                               my $keyName=$settings{'LOGIN'};
-                               my $keySecret=$settings{'PASSWORD'};
-
-                               # Use a relatively long TTL value to reduce load on DNS.
-                               # Some public Dynamic DNS servers use values around 4 hours,
-                               # some use values as low as 60 seconds.
-                               # XXX Maybe we could fetch the master value from the server
-                               # (not the timed-down version supplied by DNS cache)
-
-                               my $timeToLive="3600";
-
-                               # Internal setting that can be used to override the DNS server
-                               # where the update is applied. It can be of use when testing
-                               # against a private DNS server.
-                               my $masterServer="";
-
-                               # Prepare the nsupdate command script to remove and re-add the
-                               # updated A record for the domain.
-
-                               my $cmdFile="/tmp/nsupdate-$hostName-commands";
-                               my $logFile="/tmp/nsupdate-$hostName-result";
-                               open(TF, ">$cmdFile");
-                               if ($masterServer ne "") {
-                                       print TF "server $masterServer\n";
-                               }
-                               if ($keyName ne "" && $keySecret ne "") {
-                                       print TF "key $keyName $keySecret\n";
-                               }
-                               print TF "update delete $hostName A\n";
-                               print TF "update add $hostName $timeToLive A $ip\n";
-                               print TF "send\n";
-                               close(TF);
-
-                               # Run nsupdate with -v to use TCP instead of UDP because we're
-                               # issuing multiple cmds and potentially long keys, and -d to
-                               # get diagnostic result output.
-
-                               my $result = system("/usr/bin/nsupdate -v -d $cmdFile 2>$logFile");
-                               if ($result != 0) {
-                                       &General::log("Dynamic DNS ip-update for $hostName : failure");
-                                       open(NSLOG, "$logFile");
-                                       my @nsLog = <NSLOG>;
-                                       close(NSLOG);
-                                       my $logLine;
-                                       foreach $logLine (@nsLog) {
-                                               chomp($logLine);
-                                               if ($logLine ne "") {
-                                                       &General::log("... $logLine");
-                                               }
-                                       }
-                               } else {
-                                       &General::log("Dynamic DNS ip-update for $hostName : success");
-                                       $success++;
-                               }
-                               unlink $cmdFile, $logFile;
-                       }
-                       elsif ($settings{'SERVICE'} eq 'freedns') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_https(  'freedns.afraid.org',
-                                                                           443,
-                                                                           "/dynamic/update.php?$settings{'LOGIN'}",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-                           #Valid responses from service are:
-                            #Updated n host(s) <domain>
-                            #ERROR: <ip> has not changed.
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               #Valid responses from update => ErrCount=0
-                               if ( $out !~ m/(^Updated|Address .* has not changed)/ig ) {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'regfish') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-
-                           my ($out, $response) = Net::SSLeay::get_https(  'www.regfish.com',
-                                                                           443,
-                                                                           "/dyndns/2/?fqdn=$settings{'DOMAIN'}&ipv4=$ip&forcehost=1&authtype=secure&token=$settings{'LOGIN'}",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-                           #Valid responses from service are:
-                           #success|100|update succeeded!
-                           #success|101|no update needed at this time..
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/(success\|(100|101)\|)/ig ) {
-                                   &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure (could not connect to server)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'ovh') {
-                               my %proxysettings;
-                               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-
-                               my $peer = 'www.ovh.com';
-                               my $peerport = 80;
-
-                               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                                       ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               }
-
-                               my $sock;
-                               unless($sock = new IO::Socket::INET (PeerAddr => $peer, PeerPort => $peerport, Proto => 'tcp', Timeout => 5)) {
-                                       &General::log("Dynamic DNS failure : could not connect to $peer:$peerport: $@");
-                                       next;
-                               }
-
-                               if ($settings{'HOSTNAME'} eq '') {
-                                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
-                               } else {
-                                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
-                               }
-
-                               my ($GET_CMD, $code64);
-                               $GET_CMD  = "GET http://www.ovh.com/nic/update?system=dyndns&hostname=$settings{'HOSTDOMAIN'}&myip=$ip HTTP/1.1\r\n";
-                               $GET_CMD .= "Host: www.ovh.com\r\n";
-                               chomp($code64 = encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}"));
-                               $GET_CMD .= "Authorization: Basic $code64\r\n";
-                               $GET_CMD .= "User-Agent: ipfire\r\n";
-                              #$GET_CMD .= "Content-Type: application/x-www-form-urlencoded\r\n";
-                               $GET_CMD .= "\r\n";
-                               print $sock "$GET_CMD";
-                                                                                                                                                                                                                               
-                               my $out = '';
-                               while(<$sock>) {
-                                       $out .= $_;
-                               }
-                               close($sock);
-
-                                #HTTP response => error (in  Title tag) else text response
-                               #Valid responses from service:good,nochg  (ez-ipupdate like)
-                               #Should use ez-ipdate but "system=dyndns" is not present
-                               if ( $out =~ m/<Title>(.*)<\/Title>/ig ) {
-                                       &General::log("Dynamic DNS ovh.com : failure ($1)");
-                               }
-                               elsif ($out !~ m/good |nochg /ig) {
-                                       $out =~ s/.+?\015?\012\015?\012//s;    # header HTTP
-                                       my @out = split("\r", $out);
-                                       &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out[1])");
-                               } else {
-                                       &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");
-                                       $success++;
-                               }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'dtdns') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           if ($settings{'HOSTNAME'} eq '') {
-                               $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
-                           } else {
-                               $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_http(  'www.dtdns.com',
-                                                                           80,
-                                                                           "/api/autodns.cfm?id=$settings{'HOSTDOMAIN'}&pw=$settings{'PASSWORD'}",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-                           #Valid responses from service are:
-                           #   now points to
-                           #
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/Host .* now points to/ig ) {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");
-                           }
-                       }
-                       elsif ($settings{'SERVICE'} eq 'dynu') {
-                           # use proxy ?
-                           my %proxysettings;
-                           &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-                           if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                               my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );
-                           }
-
-                           if ($settings{'HOSTNAME'} eq '') {
-                               $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
-                           } else {
-                               $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
-                           }
-
-                           my ($out, $response) = Net::SSLeay::get_http(  'dynserv.ca',
-                                                                           80,
-                                                                           "/dyn/dynengine.cgi?func=set&name=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip&domain=$settings{'DOMAIN'}",
-                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
-                                                                        );
-                           #Valid responses from service are:
-                           # 02 == Domain already exists, refreshing data for ... => xxx.xxx.xxx.xxx
-                           #
-                           if ($response =~ m%HTTP/1\.. 200 OK%) {
-                               if ( $out !~ m/Domain already exists, refreshing data for/ig ) {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");
-                               } else {
-                                   &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");
-                                   $success++;
-                               }
-                           } else {
-                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");
-                           }
-                       } else {
-                               if ($settings{'WILDCARDS'} eq 'on') {
-                                   $settings{'WILDCARDS'} = '-w';
-                               } else {
-                                   $settings{'WILDCARDS'} = '';
-                               }
-
-                               if (($settings{'SERVICE'} eq 'dyndns-custom' ||
-                                   $settings{'SERVICE'} eq 'easydns' ||  
-                                   $settings{'SERVICE'} eq 'zoneedit') && $settings{'HOSTNAME'} eq '') {
-                                   $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};
-                               } else {
-                                   $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";
-                               }
-
-                               my @ddnscommand = ('/usr/bin/ez-ipupdate', '-a', "$ip", '-S', "$settings{'SERVICE'}", '-u', "$settings{'LOGIN'}:$settings{'PASSWORD'}", '-h', "$settings{'HOSTDOMAIN'}", "$settings{'WILDCARDS'}", '-q');
-
-                               my $result = system(@ddnscommand);
-                               if ( $result != 0) { 
-                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: failure");
-                               } else {
-                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: success");
-                                       $success++;
-                               }
-                       }
-               } else {
-                       # If a line is disabled, then we should discount it
-                       $lines--;
-               }
-       }
-
-       if ($lines == $success) {
-               open(IPCACHE, ">$cachefile");
-               flock IPCACHE, 2;
-               print IPCACHE $ip;
-               close(IPCACHE);
-               exit 1;
-       }
-       
-}
-exit 0;
-
-# Extracted from Base64.pm
-sub encode_base64 ($;$) {
-    my $res = "";
-    my $eol = $_[1];
-    $eol = "\n" unless defined $eol;
-    pos($_[0]) = 0;                          # ensure start at the beginning
-    while ($_[0] =~ /(.{1,45})/gs) {
-        $res .= substr(pack('u', $1), 1);
-        chop($res);
-    }
-    $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs
-    # fix padding at the end
-    my $padding = (3 - length($_[0]) % 3) % 3;
-    $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
-    # break encoded string into lines of no more than 76 characters each
-    if (length $eol) {
-        $res =~ s/(.{1,76})/$1$eol/g;
-    }
-    $res;
-}
-
-
-
-__END__
-old code for selfhost.de
-
-                               my %proxysettings;
-                               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);
-
-                               my $peer = 'carol.selfhost.de';
-                               my $peerport = 80;
-
-                               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {
-                                   ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);
-                               }
-
-                               my $sock;
-                               unless($sock = new IO::Socket::INET (PeerAddr => $peer, PeerPort => $peerport, Proto => 'tcp', Timeout => 5)) {
-                                   die "Could not connect to $peer:$peerport: $@";
-                                   return 1;
-                               }
-
-                               my $GET_CMD;
-                               $GET_CMD  = "GET https://carol.selfhost.de/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&myip=$ip&textmodi=1 HTTP/1.1\r\n";
-                               $GET_CMD .= "Host: carol.selfhost.de\r\n";
-                               $GET_CMD .= "User-Agent: ipfire\r\n";
-                               $GET_CMD .= "Connection: close\r\n\r\n";
-                               print $sock "$GET_CMD";
-
-                               my $out = '';
-                               while(<$sock>) {
-                                       $out .= $_;
-                               }
-                               close($sock);
-
-                               if ( $out !~ m/status=(200|204)/ ) {
-                                       #cleanup http response...
-                                       $out =~ s/.+?\015?\012\015?\012//s;    # header HTTP
-                                       my @out = split("\r", $out);
-                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out[1])");
-                               } else {
-                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");
-                                       $success++;
-                               }
-
-
-                       
+#!/usr/bin/perl\r
+#\r
+# SmoothWall CGIs\r
+#\r
+# This code is distributed under the terms of the GPL\r
+#\r
+# (c) The SmoothWall Team\r
+#\r
+# $Id: setddns.pl,v 1.4.2.55 2009/05/29 21:49:37 owes Exp $\r
+#\r
+\r
+#close(STDIN);\r
+#close(STDOUT);\r
+#close(STDERR);\r
+\r
+use strict;\r
+use IO::Socket;\r
+use Net::SSLeay;\r
+\r
+require '/var/ipfire/general-functions.pl';\r
+\r
+#Prototypes functions\r
+sub encode_base64 ($;$);\r
+\r
+my %settings;\r
+my $filename = "${General::swroot}/ddns/config";\r
+my $logDirName = "/var/log/dyndns";\r
+my @current = ();\r
+\r
+if (open(FILE, "$filename")) {\r
+       @current = <FILE>;\r
+       close(FILE);\r
+       unless(@current) {\r
+               exit 0;\r
+       }\r
+} else {\r
+       &General::log('Dynamic DNS failure : unable to open config file.');\r
+       exit 0;\r
+}\r
+\r
+&General::readhash("${General::swroot}/ddns/settings", \%settings);\r
+\r
+# ignore monthly update if not in minimize update mode\r
+exit 0 if (($settings{'MINIMIZEUPDATES'} ne 'on') && ($ARGV[1] eq '-m'));\r
+\r
+my $ip;\r
+if (open(IP, "${General::swroot}/red/local-ipaddress")) {\r
+       $ip = <IP>;\r
+       close(IP);\r
+       chomp $ip;\r
+} else {\r
+       &General::log('Dynamic DNS failure : unable to open local-ipaddress file.');\r
+       exit 0;\r
+}\r
+\r
+# Do delete the the logdir before fetching IP (and write fetch IP state into logdir)\r
+# On delete the fetch IP state is deleted too, but it gets rewritten on -force anyway\r
+if ($ARGV[0] eq '-f') {\r
+       # delete all cache files.\r
+       # next regular calls will try again if this force update fails.\r
+       system("/bin/rm -f $logDirName/*");\r
+}\r
+\r
+#If IP is reserved network, we are behind a router. May we ask for our real public IP ?\r
+if ( &General::IpInSubnet ($ip,'10.0.0.0','255.0.0.0') ||\r
+       &General::IpInSubnet ($ip,'172.16.0.0','255.240.0.0') ||\r
+       &General::IpInSubnet ($ip,'192.168.0.0','255.255.0.0')) {\r
+       # We can, but are we authorized by GUI ?\r
+       if ($settings{'BEHINDROUTER'} eq 'FETCH_IP') {\r
+\r
+               my %fetchIpState = ();\r
+               $fetchIpState{'FETCHED_IP'} = "";\r
+               $fetchIpState{'BEHINDROUTERWAITLOOP'} = -1;\r
+               &General::readhash("$logDirName/fetchIpState", \%fetchIpState) if(-e "$logDirName/fetchIpState");\r
+\r
+               if ($ARGV[0] eq '-f'){\r
+                       $fetchIpState{'BEHINDROUTERWAITLOOP'} = -1; # When forced option, fectch PublicIP now\r
+               }\r
+\r
+               # Increment counter modulo 4. When it is zero, fetch ip else exit\r
+               # This divides by 4 the requests to the dyndns server.\r
+               $fetchIpState{'BEHINDROUTERWAITLOOP'} = ($fetchIpState{'BEHINDROUTERWAITLOOP'}+1) %4;\r
+               &General::writehash("$logDirName/fetchIpState", \%fetchIpState);\r
+\r
+               exit 0 if ( $fetchIpState{'BEHINDROUTERWAITLOOP'} ne 0 );\r
+               my $RealIP = &General::FetchPublicIp;\r
+               $ip = (&General::validip ($RealIP) ?  $RealIP : 'unavailable');\r
+               $fetchIpState{'FETCHED_IP'} = $ip;\r
+               &General::writehash("$logDirName/fetchIpState", \%fetchIpState);\r
+               &General::log ("Dynamic DNS public router IP is: $ip");\r
+       }\r
+}\r
+\r
+\r
+foreach my $line (@current) {\r
+       chomp($line);\r
+       my @temp = split(/\,/,$line);\r
+       next if ($temp[7] ne "on");\r
+\r
+       $settings{'SERVICE'} = $temp[0];\r
+       $settings{'HOSTNAME'} = $temp[1];\r
+       $settings{'DOMAIN'} = $temp[2];\r
+       $settings{'PROXY'} = $temp[3];\r
+       $settings{'WILDCARDS'} = $temp[4];\r
+       $settings{'LOGIN'} = $temp[5];\r
+       $settings{'PASSWORD'} = $temp[6];\r
+       $settings{'ENABLED'} = $temp[7];\r
+\r
+       my $ipcache = 0;\r
+       my $success = 0;\r
+       my $ipCacheFile = "$logDirName/$settings{'SERVICE'}.$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+       if(-e $ipCacheFile) {\r
+               open(IPCACHE, $ipCacheFile);\r
+               $ipcache = <IPCACHE>;\r
+               close(IPCACHE);\r
+               chomp $ipcache;\r
+       }\r
+\r
+       next if ($ip eq $ipcache);\r
+\r
+       #Some connection are very stable (more than 40 days). Finally force\r
+       #one update / month to avoid account lost\r
+       #cron call once/week with -f & once/month with -f -m options\r
+       #minimize update ?\r
+       if ( ($settings{'MINIMIZEUPDATES'} eq 'on') && ($ARGV[1] ne '-m')) {\r
+               if (General::DyndnsServiceSync($ip, $settings{'HOSTNAME'},$settings{'DOMAIN'})) {\r
+                       &General::log ("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} is uptodate [$ip]");\r
+\r
+                       # write cachefile (in case of -force the file is missing) otherwise the log\r
+                       # is filled up with "... is uptodate ..." messages every 5 minutes.\r
+                       open(IPCACHE, ">$ipCacheFile");\r
+                       flock IPCACHE, 2;\r
+                       print IPCACHE $ip;\r
+                       close(IPCACHE);\r
+\r
+                       next;           # do not update, go to test next service\r
+               }\r
+       }\r
+       my @service = split(/\./, "$settings{'SERVICE'}");\r
+       $settings{'SERVICE'} = "$service[0]";\r
+       if ($settings{'SERVICE'} eq 'cjb') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'www.cjb.net',\r
+                                                               80,\r
+                                                               "/cgi-bin/dynip.cgi?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&ip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # has been updated to point to\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/has been updated to point to/ ) {\r
+                               &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (bad password or login)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for cjb.net ($settings{'LOGIN'}) : failure (could not connect to server)");\r
+               }\r
+       }\r
+       # dhs.org=>ez-ipupdate\r
+       elsif ($settings{'SERVICE'} eq 'dnsmadeeasy') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               # replace the ';' with ',' because comma is the separator in the config file.\r
+               $settings{'HOSTNAME'} =~ tr /;/,/;\r
+               my ($out, $response) = Net::SSLeay::get_https(  'www.dnsmadeeasy.com',\r
+                                                               443,\r
+                                                               "/servlet/updateip?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&id=$settings{'HOSTNAME'}&ip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # success\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/success/ ) {\r
+                               $out =~ s/\cM//g;\r
+                               &General::log("Dynamic DNS ip-update for dnsmadeeasy ID $settings{'HOSTNAME'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for dnsmadeeasy ID $settings{'HOSTNAME'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for dnsmadeeasy ID $settings{'HOSTNAME'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'dnspark') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  "www.dnspark.net",\r
+                                                               443,\r
+                                                               "/api/dynamic/update.php?hostname=$settings{'HOSTDOMAIN'}&ip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r
+                                                                                       'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")\r
+                                                               )\r
+                                                               );\r
+               # Valid response are\r
+               # 'ok'   'nochange'\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/^(ok|nochange)/ ) {\r
+                               $out =~ s/\n/ /g;\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'dtdns') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'www.dtdns.com',\r
+                                                               80,\r
+                                                               "/api/autodns.cfm?id=$settings{'HOSTDOMAIN'}&pw=$settings{'PASSWORD'}",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               #   now points to\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/Host .* now points to/ig ) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       # dyndns-custom,dyndns-static,dyndns.org,dyns.cx => ez-ipupdate\r
+       elsif ($settings{'SERVICE'} eq 'dynu') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'dynserv.ca',\r
+                                                               80,\r
+                                                               "/dyn/dynengine.cgi?func=set&name=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip&domain=$settings{'HOSTDOMAIN'}",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # 02 == Domain already exists, refreshing data for ... => xxx.xxx.xxx.xxx\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/Domain already exists, refreshing data for/ig ) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       # easydns => see 'ez-ipupdate'\r
+       elsif ($settings{'SERVICE'} eq 'editdns') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'dyndns.editdns.net',\r
+                                                               80,\r
+                                                               "/api/dynLinux.php?r=$settings{'HOSTDOMAIN'}&p=$settings{'PASSWORD'}",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # Record has been updated\r
+               # Record already exists with the same IP\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/Record (has been updated|already exists with the same IP)/ ) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'enom') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'dynamic.name-services.com',\r
+                                                               80,\r
+                                                               "/interface.asp?Command=SetDNSHost&Zone=$settings{'HOSTDOMAIN'}&DomainPassword=$settings{'PASSWORD'}&Address=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # ErrCount=0\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/ErrCount=0/ ) {\r
+                               $out =~ s/(\n|\x0D)/ /g;\r
+                               $out =~ /Err1=([\w ]+)  /;\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($1)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'everydns') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+               my $code64 = encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}");\r
+               my $version = "0.1"; # developped for this version of dyn server.\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'dyn.everydns.net',\r
+                                                               80,\r
+                                                               "/index.php?ver=$version&ip=$ip&domain=$settings{'HOSTDOMAIN'}",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r
+                                                                                       'Authorization' => "Basic $code64")\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # "... Exit code: 0"    0:ok else error\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/Exit code: 0/ig ) {\r
+                               &General::log("Dynamic DNS everydns for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS everydns for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS everydns for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'freedns') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  'freedns.afraid.org',\r
+                                                               443,\r
+                                                               "/dynamic/update.php?$settings{'LOGIN'}",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # Updated n host(s) <domain>\r
+               # ERROR: <ip> has not changed.\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/(^Updated|Address .* has not changed)/ig ) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'namecheap') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  'dynamicdns.park-your-domain.com',\r
+                                                               443,\r
+                                                               "/update?host=$settings{'HOSTNAME'}&domain=$settings{'DOMAIN'}&password=$settings{'PASSWORD'}&ip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # wait confirmation!!\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/<ErrCount>0<\/ErrCount>/ ) {\r
+                               $out =~ m/<Err1>(.*)<\/Err1>/;\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($1)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'no-ip') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+               my $request = "username=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip";\r
+               my $display;\r
+               if ($settings{'HOSTNAME'} !~ s/$General::noipprefix//) {\r
+                       if ($settings{'HOSTNAME'} eq "") {\r
+                               $request .= "&h[]=$settings{'DOMAIN'}";\r
+                               $display = "$settings{'DOMAIN'}";\r
+                       } else {\r
+                               $request .= "&h[]=$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+                               $display = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+                       }\r
+               } else {\r
+                       $request .= "&groupname=$settings{'HOSTNAME'}";\r
+                       $display = "group:$settings{'HOSTNAME'}";\r
+               }\r
+               $request = encode_base64($request,"");\r
+\r
+               my ($out, $response) = Net::SSLeay::get_http(  'dynupdate.no-ip.com',\r
+                                                               80,\r
+                                                               "/ducupdate.php?requestL=$request",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'IPCop/'.${General::version} )\r
+                                                               );\r
+\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       # expected response format: [host].[domain]:[return_code]\r
+                       # example: myhost.example.com:0\r
+                       if ($out =~ m/:(.*)/) {\r
+                   if (($1 == 0) || ($1 == 11) || ($1 == 12)) {\r
+                                       # 0 is success, 11 is success group, 12 is already set group\r
+                                       &General::log("Dynamic DNS ip-update for $display : success");\r
+                                       $success++;\r
+                   } else {\r
+                                       &General::log("Dynamic DNS ip-update for $display : failure ($1)");\r
+                               }\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $display : failure ($out)");\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $display : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'nsupdate') {\r
+               # Fetch UI configurable values and assemble the host name.\r
+\r
+               my $hostName="$settings{'DOMAIN'}";\r
+               if ($settings{'HOSTNAME'} ne "") {\r
+                       $hostName="$settings{'HOSTNAME'}.$hostName";\r
+               }\r
+               my $keyName=$settings{'LOGIN'};\r
+               my $keySecret=$settings{'PASSWORD'};\r
+\r
+               # Use a relatively long TTL value to reduce load on DNS.\r
+               # Some public Dynamic DNS servers use values around 4 hours,\r
+               # some use values as low as 60 seconds.\r
+               # XXX Maybe we could fetch the master value from the server\r
+               # (not the timed-down version supplied by DNS cache)\r
+\r
+               my $timeToLive="3600";\r
+\r
+               # Internal setting that can be used to override the DNS server\r
+               # where the update is applied. It can be of use when testing\r
+               # against a private DNS server.\r
+\r
+               my $masterServer="";\r
+\r
+               # Prepare the nsupdate command script to remove and re-add the\r
+               # updated A record for the domain.\r
+\r
+               my $cmdFile="/tmp/nsupdate-$hostName-commands";\r
+               my $logFile="/tmp/nsupdate-$hostName-result";\r
+               open(TF, ">$cmdFile");\r
+               if ($masterServer ne "") {\r
+                       print TF "server $masterServer\n";\r
+               }\r
+               if ($keyName ne "" && $keySecret ne "") {\r
+                       print TF "key $keyName $keySecret\n";\r
+               }\r
+               print TF "update delete $hostName A\n";\r
+               print TF "update add $hostName $timeToLive A $ip\n";\r
+               print TF "send\n";\r
+               close(TF);\r
+\r
+               # Run nsupdate with -v to use TCP instead of UDP because we're\r
+               # issuing multiple cmds and potentially long keys, and -d to\r
+               # get diagnostic result output.\r
+\r
+               my $result = system("/usr/bin/nsupdate -v -d $cmdFile 2>$logFile");\r
+               if ($result != 0) {\r
+                       &General::log("Dynamic DNS ip-update for $hostName : failure");\r
+                       open(NSLOG, "$logFile");\r
+                       my @nsLog = <NSLOG>;\r
+                       close(NSLOG);\r
+                       my $logLine;\r
+                       foreach $logLine (@nsLog) {\r
+                               chomp($logLine);\r
+                               if ($logLine ne "") {\r
+                                       &General::log("... $logLine");\r
+                               }\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $hostName : success");\r
+                       $success++;\r
+               }\r
+               unlink $cmdFile, $logFile;\r
+       }\r
+       # ods => ez-ipupdate\r
+       elsif ($settings{'SERVICE'} eq 'opendns') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  "updates.opendns.com",\r
+                                                               443,\r
+                                                               "/account/ddns.php?hostname=$settings{'HOSTDOMAIN'}&myip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r
+                                                                                       'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")\r
+                                                               )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # 'good ip-address' , 'nochg ip-address'  (ez-ipupdate like)\r
+               if ($response =~ m%HTTP/1\.. 200 OK%)  {\r
+                       if ($out =~ m/good |nochg /ig) {\r
+                               &General::log("Dynamic DNS ip-update for opendns $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for opendns $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       }\r
+               } elsif ( $out =~ m/<title>(.*)<\/title>/ig ) {\r
+                       &General::log("Dynamic DNS ip-update for opendns $settings{'HOSTDOMAIN'} : failure ($1)");\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for opendns $settings{'HOSTDOMAIN'} : failure ($response)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'ovh') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+               if ($settings{'DOMAIN'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'HOSTNAME'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my $code64 = encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}");\r
+               chomp($code64);\r
+               my ($out, $response) = Net::SSLeay::get_https( 'www.ovh.com',\r
+                                                               443,\r
+                                                               "/nic/update?system=dyndns&hostname=$settings{'HOSTDOMAIN'}&myip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r
+                                                                                       'Authorization' => "Basic $code64" )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # 'good ip-address' , 'nochg ip-address'  (ez-ipupdate like)\r
+               if ($response =~ m%HTTP/1\.. 200 OK%)  {\r
+                       if ($out =~ m/good |nochg /ig) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       } else {\r
+                               &General::log("Dynamic DNS ovh.com for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       }\r
+               } elsif ( $out =~ m/<title>(.*)<\/title>/ig ) {\r
+                       &General::log("Dynamic DNS ovh.com for $settings{'HOSTDOMAIN'} : failure ($1)");\r
+               } else {\r
+                       &General::log("Dynamic DNS ovh.com for $settings{'HOSTDOMAIN'} : failure ($response)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'regfish') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+               my ($out, $response) = Net::SSLeay::get_https(  'dyndns.regfish.de',\r
+                                                               443,\r
+                                                               "/?fqdn=$settings{'DOMAIN'}&ipv4=$ip&forcehost=1&authtype=secure&token=$settings{'LOGIN'}",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipfire' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # success|100|update succeeded!\r
+               # success|101|no update needed at this time..\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/(success\|(100|101)\|)/ig ) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'DOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'registerfly') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  'dynamic.registerfly.com',\r
+                                                               443,\r
+                                                               "?domain=$settings{'DOMAIN'}&password=$settings{'PASSWORD'}&host=$settings{'HOSTNAME'}&ipaddress=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # <strong><b>Your Dynamic DNS change was accepted by our system</b></strong>\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/DNS change was accepted/ig ) {\r
+                               $out =~ /<strong>(.*)<\/strong>/;\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($1)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'sitelutions') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  'www.sitelutions.com',\r
+                                                               443,\r
+                                                               "/dnsup?ttl=60&id=$settings{'HOSTNAME'}&user=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # success\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/(success)/ ) {\r
+                               $out =~ s/\n/ /g;\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       elsif ($settings{'SERVICE'} eq 'selfhost') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+               if ($settings{'DOMAIN'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = "selfhost.de ($settings{'LOGIN'})";\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  'carol.selfhost.de',\r
+                                                               443,\r
+                                                               "/update?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&textmodi=1",\r
+                                                               Net::SSLeay::make_headers('User-Agent' => 'Ipcop' )\r
+                                                               );\r
+               #Valid responses from service are:\r
+               # status=200  status=204\r
+               if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+                       if ( $out !~ m/status=(200|204)/ ) {\r
+                               $out =~ s/\n/ /g;\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       }\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)");\r
+               }\r
+       }\r
+       # strato\r
+       elsif ($settings{'SERVICE'} eq 'strato') {\r
+               # use proxy ?\r
+               my %proxysettings;\r
+               &General::readhash("${General::swroot}/proxy/settings", \%proxysettings);\r
+               if ($_=$proxysettings{'UPSTREAM_PROXY'}) {\r
+                       my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/);\r
+                       Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} );\r
+               }\r
+\r
+               if ($settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+\r
+               my ($out, $response) = Net::SSLeay::get_https(  "dyndns.strato.com",\r
+                                                               443,\r
+                                                               "/nic/update?hostname=$settings{'HOSTDOMAIN'}&myip=$ip",\r
+                                                                                       Net::SSLeay::make_headers('User-Agent' => 'Ipcop',\r
+                                                                                               'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")\r
+                                                                                       )\r
+                                                       );\r
+               # Valid response are 'ok'   'nochange'\r
+               if ($response =~ m%HTTP/1\.. 200 OK%)  {\r
+                       if ($out =~ m/good |nochg /ig) {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success");\r
+                               $success++;\r
+                       } else {\r
+                               &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)");\r
+                       }\r
+               } elsif ( $out =~ m/<title>(.*)<\/title>/ig ) {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($1)");\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($response)");\r
+               }\r
+       }\r
+   elsif ($settings{'SERVICE'} eq 'tiggerswelt') {\r
+      $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+\r
+      my ($out, $response) = Net::SSLeay::get_https(   "ssl.tiggerswelt.net",\r
+                        443,\r
+                        "/nic/update?hostname=$settings{'HOSTDOMAIN'}&myip=$ip",\r
+                                 Net::SSLeay::make_headers('User-Agent' => 'IPCop',\r
+                                    'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")\r
+                                 )\r
+                     );\r
+\r
+      if ($response =~ m%HTTP/1\.. 200 OK%) {\r
+         if ($out =~ m/good |nochg /ig) {\r
+            &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: success");\r
+            $success++;\r
+         } else {\r
+            &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: failure ($out)");\r
+         }\r
+      } else {\r
+         &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: failure ($response)");\r
+      }\r
+   }\r
+       # zonedit => see 'ez-ipupdate'\r
+       else {\r
+               if ($settings{'WILDCARDS'} eq 'on') {\r
+                       $settings{'WILDCARDS'} = '-w';\r
+               } else {\r
+                       $settings{'WILDCARDS'} = '';\r
+               }\r
+               if (($settings{'SERVICE'} eq 'dyndns-custom' ||\r
+                       $settings{'SERVICE'} eq 'easydns' ||\r
+                       $settings{'SERVICE'} eq 'zoneedit') && $settings{'HOSTNAME'} eq '') {\r
+                       $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'};\r
+               } else {\r
+                       $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}";\r
+               }\r
+               my @ddnscommand = ('/usr/bin/ez-ipupdate', '-a', "$ip", '-S', "$settings{'SERVICE'}", '-u', "$settings{'LOGIN'}:$settings{'PASSWORD'}", '-h', "$settings{'HOSTDOMAIN'}", "$settings{'WILDCARDS'}", '-q');\r
+               my $result = system(@ddnscommand);\r
+               if ( $result != 0) {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: failure");\r
+               } else {\r
+                       &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'}: success");\r
+                       $success++;\r
+               }\r
+       }\r
+       # DEBUG:\r
+       #print "Success: $success, file: $ipCacheFile\n";\r
+       # write current IP to specific cache file\r
+       if ($success == 1) {\r
+               open(IPCACHE, ">$ipCacheFile");\r
+               flock IPCACHE, 2;\r
+               print IPCACHE $ip;\r
+               close(IPCACHE);\r
+       }\r
+}\r
+exit 0;\r
+\r
+# Extracted from Base64.pm\r
+sub encode_base64 ($;$) {\r
+       my $res = "";\r
+       my $eol = $_[1];\r
+       $eol = "\n" unless defined $eol;\r
+       pos($_[0]) = 0;                          # ensure start at the beginning\r
+       while ($_[0] =~ /(.{1,45})/gs) {\r
+               $res .= substr(pack('u', $1), 1);\r
+               chop($res);\r
+       }\r
+       $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs\r
+       # fix padding at the end\r
+       my $padding = (3 - length($_[0]) % 3) % 3;\r
+       $res =~ s/.{$padding}$/'=' x $padding/e if $padding;\r
+       # break encoded string into lines of no more than 76 characters each\r
+       if (length $eol) {\r
+               $res =~ s/(.{1,76})/$1$eol/g;\r
+       }\r
+       $res;\r
+}\r