]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/scripts/setddns.pl
DDNS: Support for all-inkl.com.
[people/teissler/ipfire-2.x.git] / src / scripts / setddns.pl
index 2fa4fadf666b645dfbb6c935284e9259cee2c285..0833b49c0d4989399e798d68cea0335a1e36dfc5 100644 (file)
-#!/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
+#!/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
+                           }
+                       }
+                       if ($settings{'SERVICE'} ne "dns.lightningwirelabs.com") {
+                               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 'all-inkl') {
+                           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("dyndns.kasserver.com", 80, "/", 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%) {
+                               &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, check your credentials)");
+                           }
+                       }
+
+                       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 '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 'dns.lightningwirelabs.com') {
+                           # 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 $authstring;
+                           if ($settings{'LOGIN'} eq "token") {
+                               $authstring = "token=$settings{'PASSWORD'}";
+                           } else {
+                               $authstring = "username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}";
+                           }
+
+                           my $user_agent = &General::MakeUserAgent();
+                           my ($out, $response) = Net::SSLeay::get_https("dns.lightningwirelabs.com", 443,
+                               "/update?hostname=$settings{'HOSTDOMAIN'}&address4=$ip&$authstring",
+                               Net::SSLeay::make_headers('User-Agent' => $user_agent)
+                           );
+
+                           # Valid response are 'ok'   'nochange'
+                           if ($response =~ m%HTTP/1\.. 200 OK%) {
+                               &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 'strato') {
+                               # 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(  'dyndns.strato.com',
+                                                                           443,
+                                                                           "/nic/update?hostname=$settings{'HOSTDOMAIN'}&myip=$ip",
+                                                                           Net::SSLeay::make_headers('User-Agent' => 'IPFire',
+                                                                            'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}") )
+                                                                        );
+
+                               if ($response =~ m%HTTP/1\.. 200 OK%) {
+                                       #Valid responses from update => ErrCount=0
+                                       if ( $out =~ m/good |nochg /ig) {
+                                               &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'} : failure1 ($out)");
+                                               $success++;
+                                       }
+                               } elsif ( $out =~ m/<title>(.*)<\/title>/ig ) {
+                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure2 ($1)");
+                               } else {
+                                       &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure3 ($response)");
+                               }
+                       }
+                       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(  'dyndns.regfish.de',
+                                                                               443,
+                                                                               "/?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)");
+                           }
+                       }
+                       #namecheap test
+                       elsif ($settings{'SERVICE'} eq 'namecheap') {
+                               # 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(  'dynamicdns.park-your-domain.com',
+                                                               443,
+                                                               "/update?host=$settings{'HOSTNAME'}&domain=$settings{'DOMAIN'}&password=$settings{'PASSWORD'}&ip=$ip",
+                                                               Net::SSLeay::make_headers('User-Agent' => 'IPFire' )
+                                                               );
+                                       #Valid responses from service are:
+                                       # wait confirmation!!
+                                       if ($response =~ m%HTTP/1\.. 200 OK%) {
+                                               if ( $out !~ m/<ErrCount>0<\/ErrCount>/ ) {
+                                                       $out =~ m/<Err1>(.*)<\/Err1>/;
+                                                       &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)");
+                               }
+                       }
+                       #end namecheap test
+                       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++;
+                               }
+
+
+