From ee4fdd07e7f3be783aa803b3d50f9a3737b99f36 Mon Sep 17 00:00:00 2001 From: ms Date: Tue, 23 May 2006 20:15:26 +0000 Subject: [PATCH 1/1] =?utf8?q?Ge=C3=A4ndert:=20=20=20*=20CONFIG=5FROOT=20i?= =?utf8?q?n=20den=20Scripts=20angepasst=20auf=20/var/ipfire=20=20=20*=20Zw?= =?utf8?q?ei=20f=C3=BChrende=20"/"=20in=20den=20ROOTFILES=20entfernt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@134 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- src/ROOTFILES.i386 | 4 +- src/scripts/readhash | 2 +- src/scripts/setddns.pl | 1250 +++++++++++++++++----------------- src/scripts/setreservedports | 10 +- src/scripts/settime | 36 +- src/scripts/timecheck | 24 +- src/scripts/updatesetup | 6 +- 7 files changed, 666 insertions(+), 666 deletions(-) diff --git a/src/ROOTFILES.i386 b/src/ROOTFILES.i386 index 4dc70a6e8e..826dfa5c25 100644 --- a/src/ROOTFILES.i386 +++ b/src/ROOTFILES.i386 @@ -26421,5 +26421,5 @@ usr/sbin/visudo ## ## pakfire ## -/opt/pakfire -/etc/pakfire.conf +opt/pakfire +etc/pakfire.conf diff --git a/src/scripts/readhash b/src/scripts/readhash index b3428d41cf..b2d541d10f 100644 --- a/src/scripts/readhash +++ b/src/scripts/readhash @@ -4,7 +4,7 @@ # commands to run to set these as shell environment variables, it is # intended to be used as follows: # -# eval $(readhash /var/ipcop/main/settings) +# eval $(readhash /var/ipfire/main/settings) # # shell variables must consist of alphanumeric characters and underscores, diff --git a/src/scripts/setddns.pl b/src/scripts/setddns.pl index b8777a5899..6fec966a4a 100644 --- a/src/scripts/setddns.pl +++ b/src/scripts/setddns.pl @@ -1,625 +1,625 @@ -#!/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/ipcop/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 = ; - 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 = ; - 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 = ; - close(IPCACHE); - chomp $ipcache; -} - -if ($ip ne $ipcache) { - my $id = 0; - my $success = 0; - my $line; - my $lines = @current; - - foreach $line (@current) { - $id++; - chomp($line); - my @temp = split(/\,/,$line); - unless ($temp[7] ne "on") { - $settings{'SERVICE'} = $temp[0]; - $settings{'HOSTNAME'} = $temp[1]; - $settings{'DOMAIN'} = $temp[2]; - $settings{'PROXY'} = $temp[3]; - $settings{'WILDCARDS'} = $temp[4]; - $settings{'LOGIN'} = $temp[5]; - $settings{'PASSWORD'} = $temp[6]; - $settings{'ENABLED'} = $temp[7]; - - #Some connection are very stable (more than 40 days). Finally force - #one update / month to avoid account lost - #cron call once/week with -f & once/month with -f -m options - #minimize update ? - if ( ($settings{'MINIMIZEUPDATES'} eq 'on') && ($ARGV[1] ne '-m') ) { - if (General::DyndnsServiceSync($ip, $settings{'HOSTNAME'},$settings{'DOMAIN'})) { - &General::log ("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} is uptodate [$ip]"); - $success++; - next; # do not update, go to test next service - } - } - my @service = split(/\./, "$settings{'SERVICE'}"); - $settings{'SERVICE'} = "$service[0]"; - if ($settings{'SERVICE'} eq 'no-ip') { - open(F, ">${General::swroot}/ddns/noipsettings"); - flock F, 2; - print F "PROXY=" . ($settings{'PROXY'} eq 'on' ? "Y\n" : "N\n"); - print F "PASSWORD=$settings{'PASSWORD'}\n"; - print F "NAT=N\n"; - print F "LOGIN=$settings{'LOGIN'}\n"; - print F "INTERVAL=1\n"; - if ($settings{'HOSTNAME'} !~ s/$General::noipprefix//) { - print F "HOSTNAME=$settings{'HOSTNAME'}\n"; - print F "GROUP=\n"; - } else { - print F "HOSTNAME=\n"; - print F "GROUP=$settings{'HOSTNAME'}\n"; - } - print F "DOMAIN=$settings{'DOMAIN'}\n"; - print F "DEVICE=\n"; - print F "DAEMON=N\n"; - close(F); - - my @ddnscommand = ('/usr/bin/noip','-c',"${General::swroot}/ddns/noipsettings",'-i',"$ip"); - - my $result = system(@ddnscommand); - if ( $result != 0) { - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success"); - $success++; - } - } - - elsif ($settings{'SERVICE'} eq 'cjb') { - # use proxy ? - my %proxysettings; - &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); - if ($_=$proxysettings{'UPSTREAM_PROXY'}) { - my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); - Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); - } - - my ($out, $response) = Net::SSLeay::get_http( 'www.cjb.net', - 80, - "/cgi-bin/dynip.cgi?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&ip=$ip", - Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) - ); - - 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' => 'Ipcop' ) - ); - - 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' => 'Ipcop', - 'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}") - ) - ); - # Valid response are 'ok' 'nochange' - if ($response =~ m%HTTP/1\.. 200 OK%) { - if ( $out !~ m/^(ok|nochange)/ ) { - $out =~ s/\n/ /g; - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success"); - $success++; - } - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials)"); - } - } - elsif ($settings{'SERVICE'} eq 'enom') { - # use proxy ? - my %proxysettings; - &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); - if ($_=$proxysettings{'UPSTREAM_PROXY'}) { - my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); - Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); - } - if ($settings{'HOSTNAME'} eq '') { - $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'}; - } else { - $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}"; - } - - my ($out, $response) = Net::SSLeay::get_http( 'dynamic.name-services.com', - 80, - "/interface.asp?Command=SetDNSHost&Zone=$settings{'DOMAIN'}&DomainPassword=$settings{'PASSWORD'}&Address=$ip", - Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) - ); - - 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 = ; - 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' => 'Ipcop' ) - ); - #Valid responses from service are: - #Updated n host(s) - #ERROR: has not changed. - if ($response =~ m%HTTP/1\.. 200 OK%) { - #Valid responses from update => ErrCount=0 - if ( $out !~ m/(^Updated|Address .* has not changed)/ig ) { - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success"); - $success++; - } - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)"); - } - } - elsif ($settings{'SERVICE'} eq 'regfish') { - # use proxy ? - my %proxysettings; - &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); - if ($_=$proxysettings{'UPSTREAM_PROXY'}) { - my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); - Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); - } - - - my ($out, $response) = Net::SSLeay::get_https( 'www.regfish.com', - 443, - "/dyndns/2/?fqdn=$settings{'DOMAIN'}&ipv4=$ip&forcehost=1&authtype=secure&token=$settings{'LOGIN'}", - Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) - ); - #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: ipcop\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>/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' => 'Ipcop' ) - ); - #Valid responses from service are: - # now points to - # - if ($response =~ m%HTTP/1\.. 200 OK%) { - if ( $out !~ m/Host .* now points to/ig ) { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success"); - $success++; - } - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)"); - } - } - elsif ($settings{'SERVICE'} eq 'dynu') { - # use proxy ? - my %proxysettings; - &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); - if ($_=$proxysettings{'UPSTREAM_PROXY'}) { - my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); - Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); - } - - if ($settings{'HOSTNAME'} eq '') { - $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'}; - } else { - $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}"; - } - - my ($out, $response) = Net::SSLeay::get_http( 'dynserv.ca', - 80, - "/dyn/dynengine.cgi?func=set&name=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip&domain=$settings{'DOMAIN'}", - Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) - ); - #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: ipcop\r\n"; - $GET_CMD .= "Connection: close\r\n\r\n"; - print $sock "$GET_CMD"; - - my $out = ''; - while(<$sock>) { - $out .= $_; - } - close($sock); - - if ( $out !~ m/status=(200|204)/ ) { - #cleanup http response... - $out =~ s/.+?\015?\012\015?\012//s; # header HTTP - my @out = split("\r", $out); - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out[1])"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success"); - $success++; - } - - - +#!/usr/bin/perl +# +# SmoothWall CGIs +# +# This code is distributed under the terms of the GPL +# +# (c) The SmoothWall Team +# +# $Id: setddns.pl,v 1.4.2.32 2006/02/07 01:29:47 franck78 Exp $ +# + +#close(STDIN); +#close(STDOUT); +#close(STDERR); + +use strict; +use IO::Socket; +use Net::SSLeay; + +require '/var/ipfire/general-functions.pl'; + +#Prototypes functions +sub encode_base64 ($;$); + +my %settings; +my $filename = "${General::swroot}/ddns/config"; +my $cachefile = "${General::swroot}/ddns/ipcache"; +my $ipcache = 0; +my @current = (); + +if (open(FILE, "$filename")) { + @current = <FILE>; + close(FILE); + unless(@current) { + exit 0; + } +} else { + &General::log('Dynamic DNS failure : unable to open config file.'); + exit 0; +} + +&General::readhash("${General::swroot}/ddns/settings", \%settings); + +# ignore monthly update if not in minimize update mode +exit 0 if (($settings{'MINIMIZEUPDATES'} ne 'on') && ($ARGV[1] eq '-m')); + +my $ip; +if (open(IP, "${General::swroot}/red/local-ipaddress")) { + $ip = <IP>; + close(IP); + chomp $ip; +} else { + &General::log('Dynamic DNS failure : unable to open local-ipaddress file.'); + exit 0; +} + +#If IP is reserved network, we are behind a router. May we ask for our real public IP ? +if ( &General::IpInSubnet ($ip,'10.0.0.0','255.0.0.0') || + &General::IpInSubnet ($ip,'172.16.0.0','255.240.0.0') || + &General::IpInSubnet ($ip,'192.168.0.0','255.255.0.0')) { + # We can, but are we authorized by GUI ? + if ($settings{'BEHINDROUTER'} eq 'FETCH_IP') { + if ($ARGV[0] eq '-f'){ + $settings{'BEHINDROUTERWAITLOOP'} = -1; # When forced option, fectch PublicIP now + } + + # Increment counter modulo 4. When it is zero, fetch ip else exit + # This divides by 4 the requests to the dyndns server. + $settings{'BEHINDROUTERWAITLOOP'} = ($settings{'BEHINDROUTERWAITLOOP'}+1) %4; + &General::writehash("${General::swroot}/ddns/settings", \%settings); + exit 0 if ( $settings{'BEHINDROUTERWAITLOOP'} ne 0 ); + my $RealIP = &General::FetchPublicIp; + $ip = (&General::validip ($RealIP) ? $RealIP : 'unavailable'); + &General::log ("Dynamic DNS public router IP is:$ip"); + } +} + + +if ($ARGV[0] eq '-f') { + unlink ($cachefile); # next regular calls will try again if this force update fails. +} else { + open(IPCACHE, "$cachefile"); + $ipcache = <IPCACHE>; + close(IPCACHE); + chomp $ipcache; +} + +if ($ip ne $ipcache) { + my $id = 0; + my $success = 0; + my $line; + my $lines = @current; + + foreach $line (@current) { + $id++; + chomp($line); + my @temp = split(/\,/,$line); + unless ($temp[7] ne "on") { + $settings{'SERVICE'} = $temp[0]; + $settings{'HOSTNAME'} = $temp[1]; + $settings{'DOMAIN'} = $temp[2]; + $settings{'PROXY'} = $temp[3]; + $settings{'WILDCARDS'} = $temp[4]; + $settings{'LOGIN'} = $temp[5]; + $settings{'PASSWORD'} = $temp[6]; + $settings{'ENABLED'} = $temp[7]; + + #Some connection are very stable (more than 40 days). Finally force + #one update / month to avoid account lost + #cron call once/week with -f & once/month with -f -m options + #minimize update ? + if ( ($settings{'MINIMIZEUPDATES'} eq 'on') && ($ARGV[1] ne '-m') ) { + if (General::DyndnsServiceSync($ip, $settings{'HOSTNAME'},$settings{'DOMAIN'})) { + &General::log ("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} is uptodate [$ip]"); + $success++; + next; # do not update, go to test next service + } + } + my @service = split(/\./, "$settings{'SERVICE'}"); + $settings{'SERVICE'} = "$service[0]"; + if ($settings{'SERVICE'} eq 'no-ip') { + open(F, ">${General::swroot}/ddns/noipsettings"); + flock F, 2; + print F "PROXY=" . ($settings{'PROXY'} eq 'on' ? "Y\n" : "N\n"); + print F "PASSWORD=$settings{'PASSWORD'}\n"; + print F "NAT=N\n"; + print F "LOGIN=$settings{'LOGIN'}\n"; + print F "INTERVAL=1\n"; + if ($settings{'HOSTNAME'} !~ s/$General::noipprefix//) { + print F "HOSTNAME=$settings{'HOSTNAME'}\n"; + print F "GROUP=\n"; + } else { + print F "HOSTNAME=\n"; + print F "GROUP=$settings{'HOSTNAME'}\n"; + } + print F "DOMAIN=$settings{'DOMAIN'}\n"; + print F "DEVICE=\n"; + print F "DAEMON=N\n"; + close(F); + + my @ddnscommand = ('/usr/bin/noip','-c',"${General::swroot}/ddns/noipsettings",'-i',"$ip"); + + my $result = system(@ddnscommand); + if ( $result != 0) { + &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure"); + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success"); + $success++; + } + } + + elsif ($settings{'SERVICE'} eq 'cjb') { + # use proxy ? + my %proxysettings; + &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + if ($_=$proxysettings{'UPSTREAM_PROXY'}) { + my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); + Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); + } + + my ($out, $response) = Net::SSLeay::get_http( 'www.cjb.net', + 80, + "/cgi-bin/dynip.cgi?username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}&ip=$ip", + Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) + ); + + 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' => 'Ipcop' ) + ); + + 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' => 'Ipcop', + 'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}") + ) + ); + # Valid response are 'ok' 'nochange' + if ($response =~ m%HTTP/1\.. 200 OK%) { + if ( $out !~ m/^(ok|nochange)/ ) { + $out =~ s/\n/ /g; + &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)"); + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success"); + $success++; + } + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials)"); + } + } + elsif ($settings{'SERVICE'} eq 'enom') { + # use proxy ? + my %proxysettings; + &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + if ($_=$proxysettings{'UPSTREAM_PROXY'}) { + my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); + Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); + } + if ($settings{'HOSTNAME'} eq '') { + $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'}; + } else { + $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}"; + } + + my ($out, $response) = Net::SSLeay::get_http( 'dynamic.name-services.com', + 80, + "/interface.asp?Command=SetDNSHost&Zone=$settings{'DOMAIN'}&DomainPassword=$settings{'PASSWORD'}&Address=$ip", + Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) + ); + + 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' => 'Ipcop' ) + ); + #Valid responses from service are: + #Updated n host(s) <domain> + #ERROR: <ip> has not changed. + if ($response =~ m%HTTP/1\.. 200 OK%) { + #Valid responses from update => ErrCount=0 + if ( $out !~ m/(^Updated|Address .* has not changed)/ig ) { + &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure ($out)"); + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : success"); + $success++; + } + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTNAME'}.$settings{'DOMAIN'} : failure (could not connect to server)"); + } + } + elsif ($settings{'SERVICE'} eq 'regfish') { + # use proxy ? + my %proxysettings; + &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + if ($_=$proxysettings{'UPSTREAM_PROXY'}) { + my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); + Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); + } + + + my ($out, $response) = Net::SSLeay::get_https( 'www.regfish.com', + 443, + "/dyndns/2/?fqdn=$settings{'DOMAIN'}&ipv4=$ip&forcehost=1&authtype=secure&token=$settings{'LOGIN'}", + Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) + ); + #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: ipcop\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' => 'Ipcop' ) + ); + #Valid responses from service are: + # now points to + # + if ($response =~ m%HTTP/1\.. 200 OK%) { + if ( $out !~ m/Host .* now points to/ig ) { + &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)"); + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success"); + $success++; + } + } else { + &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server)"); + } + } + elsif ($settings{'SERVICE'} eq 'dynu') { + # use proxy ? + my %proxysettings; + &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + if ($_=$proxysettings{'UPSTREAM_PROXY'}) { + my ($peer, $peerport) = (/^(?:[a-zA-Z ]+\:\/\/)?(?:[A-Za-z0-9\_\.\-]*?(?:\:[A-Za-z0-9\_\.\-]*?)?\@)?([a-zA-Z0-9\.\_\-]*?)(?:\:([0-9]{1,5}))?(?:\/.*?)?$/); + Net::SSLeay::set_proxy($peer,$peerport,$proxysettings{'UPSTREAM_USER'},$proxysettings{'UPSTREAM_PASSWORD'} ); + } + + if ($settings{'HOSTNAME'} eq '') { + $settings{'HOSTDOMAIN'} = $settings{'DOMAIN'}; + } else { + $settings{'HOSTDOMAIN'} = "$settings{'HOSTNAME'}.$settings{'DOMAIN'}"; + } + + my ($out, $response) = Net::SSLeay::get_http( 'dynserv.ca', + 80, + "/dyn/dynengine.cgi?func=set&name=$settings{'LOGIN'}&pass=$settings{'PASSWORD'}&ip=$ip&domain=$settings{'DOMAIN'}", + Net::SSLeay::make_headers('User-Agent' => 'Ipcop' ) + ); + #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: ipcop\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++; + } + + + diff --git a/src/scripts/setreservedports b/src/scripts/setreservedports index ba8a89db97..1b53079ca6 100644 --- a/src/scripts/setreservedports +++ b/src/scripts/setreservedports @@ -25,15 +25,15 @@ else /etc/httpd/conf/httpd.conf /bin/sed -i -e "s+:[0-9]\{3,5\}/\$ENV{'PATH_INFO'}+:$HTTPS/\$ENV{'PATH_INFO'}+" \ - /var/ipcop/header.pl + /var/ipfire/header.pl /bin/sed -i -e "s+acl IPFire_https port.*$+acl IPCop_https port $HTTPS+" \ - /var/ipcop/proxy/acl - /bin/chown nobody:nobody /var/ipcop/proxy/acl + /var/ipfire/proxy/acl + /bin/chown nobody:nobody /var/ipfire/proxy/acl /bin/sed -i -e "s+acl IPFire_https port.*$+acl IPCop_https port $HTTPS+" \ - /var/ipcop/proxy/squid.conf - /bin/chown nobody:nobody /var/ipcop/proxy/squid.conf + /var/ipfire/proxy/squid.conf + /bin/chown nobody:nobody /var/ipfire/proxy/squid.conf # restart everything impacted /bin/killall httpd diff --git a/src/scripts/settime b/src/scripts/settime index e0869f248c..bd6d095fad 100644 --- a/src/scripts/settime +++ b/src/scripts/settime @@ -12,64 +12,64 @@ # /usr/local/bin/settime ongreen=1 -green=$(cat /var/ipcop/ethernet/settings | grep GREEN_NETADDRESS) +green=$(cat /var/ipfire/ethernet/settings | grep GREEN_NETADDRESS) if [ -z "$green" ]; then : # no Green subnet else green=${green##*=}; green="${green%.*}.[0-9]" - if [ -n "$(cat /var/ipcop/time/settime.conf | grep $green)" ]; then + if [ -n "$(cat /var/ipfire/time/settime.conf | grep $green)" ]; then ongreen=0 # NTP on Green fi fi onorange=1 -orange=$(cat /var/ipcop/ethernet/settings | grep ORANGE_NETADDRESS) +orange=$(cat /var/ipfire/ethernet/settings | grep ORANGE_NETADDRESS) if [ -z "$orange" ]; then : # no Orange subnet else orange=${orange##*=}; orange="${orange%.*}.[0-9]" - if [ -n "$(cat /var/ipcop/time/settime.conf | grep $orange)" ]; then + if [ -n "$(cat /var/ipfire/time/settime.conf | grep $orange)" ]; then onorange=0 # NTP on Orange fi fi # find out language -tlanguage=$(cat /var/ipcop/main/settings | grep LANGUAGE) +tlanguage=$(cat /var/ipfire/main/settings | grep LANGUAGE) tlanguage=${tlanguage##*=} if [ -n "$1" ]; then - if [ -e /var/ipcop/red/active ] || [ "$ongreen" -eq 0 ] || [ "$onorange" -eq 0 ]; then + if [ -e /var/ipfire/red/active ] || [ "$ongreen" -eq 0 ] || [ "$onorange" -eq 0 ]; then /usr/bin/ntpdate -su $1 $2 ntpdatetest=$? if [ "$ntpdatetest" -eq 0 ]; then case $tlanguage in - en ) date "+%X %Z on %d %B %Y" > /var/ipcop/time/lastset ; + en ) date "+%X %Z on %d %B %Y" > /var/ipfire/time/lastset ; logger -t ipcop "NTP synchronisation event" ;; - da ) date "+%k:%M:%S på %d/%m/%y" > /var/ipcop/time/lastset ; + da ) date "+%k:%M:%S på %d/%m/%y" > /var/ipfire/time/lastset ; logger -t ipcop "NTP synkronisering" ;; - de ) date "+%X Uhr am %d.%m.%Y" > /var/ipcop/time/lastset ; + de ) date "+%X Uhr am %d.%m.%Y" > /var/ipfire/time/lastset ; logger -t ipcop "NTP Synchronisierung" ;; - fr ) date "+%X le %e/%m/%y" > /var/ipcop/time/lastset ; + fr ) date "+%X le %e/%m/%y" > /var/ipfire/time/lastset ; logger -t ipcop "synchronisation NTP" ;; - it ) date "+%X il %d-%m-%Y" > /var/ipcop/time/lastset ; + it ) date "+%X il %d-%m-%Y" > /var/ipfire/time/lastset ; logger -t ipcop "sincronizzazione NTP" ;; - nl ) date "+%X %e-%m-%Y" > /var/ipcop/time/lastset ; + nl ) date "+%X %e-%m-%Y" > /var/ipfire/time/lastset ; logger -t ipcop "NTP synchronisatie" ;; - no ) date "+%X på %d-%m-%y" > /var/ipcop/time/lastset ; + no ) date "+%X på %d-%m-%y" > /var/ipfire/time/lastset ; logger -t ipcop "NTP synkronisering" ;; - sv ) date "+%H.%M.%S på %y-%m-%d" > /var/ipcop/time/lastset ; + sv ) date "+%H.%M.%S på %y-%m-%d" > /var/ipfire/time/lastset ; logger -t ipcop "NTP synkronisering" ;; - es ) date "+%X %e/%-m/%y" > /var/ipcop/time/lastset ; + es ) date "+%X %e/%-m/%y" > /var/ipfire/time/lastset ; logger -t ipcop "NTP sincronizado" ;; - * ) date "+%X %Z, %Y-%m-%d" > /var/ipcop/time/lastset ; + * ) date "+%X %Z, %Y-%m-%d" > /var/ipfire/time/lastset ; logger -t ipcop "NTP synchronisation" ;; esac /sbin/hwclock --systohc - rm -f /var/ipcop/time/settimenow + rm -f /var/ipfire/time/settimenow # reset counter variable - cp /var/ipcop/time/counter.conf /var/ipcop/time/counter + cp /var/ipfire/time/counter.conf /var/ipfire/time/counter else case $tlanguage in de ) logger -t ipcop "ntpdate fehlerhaft" ;; diff --git a/src/scripts/timecheck b/src/scripts/timecheck index 4778a3f765..9f75358261 100644 --- a/src/scripts/timecheck +++ b/src/scripts/timecheck @@ -10,26 +10,26 @@ # # /usr/local/bin/timecheck -if [ -e /var/ipcop/time/enable ]; then - if [ $(cat /var/ipcop/time/settings | grep period) ] && [ -e /var/ipcop/time/counter ]; then - if [ $(cat /var/ipcop/time/counter) -gt 0 ]; then - echo $(($(cat /var/ipcop/time/counter)-5)) > /var/ipcop/time/counter +if [ -e /var/ipfire/time/enable ]; then + if [ $(cat /var/ipfire/time/settings | grep period) ] && [ -e /var/ipfire/time/counter ]; then + if [ $(cat /var/ipfire/time/counter) -gt 0 ]; then + echo $(($(cat /var/ipfire/time/counter)-5)) > /var/ipfire/time/counter else - touch /var/ipcop/time/settimenow - rm -f /var/ipcop/time/counter + touch /var/ipfire/time/settimenow + rm -f /var/ipfire/time/counter fi else # EAO added 2003-08-14 for v1.3.1 # if settings are restored from a backup - # /var/ipcop/time/counter will not exist - if [ $(cat /var/ipcop/time/settings | grep periodic) ]; then - touch /var/ipcop/time/settimenow + # /var/ipfire/time/counter will not exist + if [ $(cat /var/ipfire/time/settings | grep periodic) ]; then + touch /var/ipfire/time/settimenow fi fi - if [ -e /var/ipcop/time/settimenow ]; then - if [ -e /var/ipcop/time/settime.conf ]; then - /usr/local/bin/settime $(cat /var/ipcop/time/settime.conf) + if [ -e /var/ipfire/time/settimenow ]; then + if [ -e /var/ipfire/time/settime.conf ]; then + /usr/local/bin/settime $(cat /var/ipfire/time/settime.conf) fi fi fi diff --git a/src/scripts/updatesetup b/src/scripts/updatesetup index 45054a2ce8..ef9b23a9ea 100644 --- a/src/scripts/updatesetup +++ b/src/scripts/updatesetup @@ -4,7 +4,7 @@ UPGRADEVERSION="1.4.x" # configured by ./make.sh newupdate PREVIOUSVERSION="1.4."$((`echo $UPGRADEVERSION | /usr/bin/cut -f3 -d '.'`-1)) echo "This is the $UPGRADEVERSION update patch for IPCop $PREVIOUSVERSION installing." -CURRENTVERSION=`perl -e "require '/var/ipcop/general-functions.pl';print \\$General::version;"` +CURRENTVERSION=`perl -e "require '/var/ipfire/general-functions.pl';print \\$General::version;"` if [ "$CURRENTVERSION" != "$PREVIOUSVERSION" ]; then echo "You are not running IPCop v$PREVIOUSVERSION for this patch to install." echo "Aborting installation." @@ -12,12 +12,12 @@ if [ "$CURRENTVERSION" != "$PREVIOUSVERSION" ]; then fi # general-functions might not be overwrited by patch... -/bin/sed -i -e "s+= '1.4.*$+= '$UPGRADEVERSION';+" /var/ipcop/general-functions.pl +/bin/sed -i -e "s+= '1.4.*$+= '$UPGRADEVERSION';+" /var/ipfire/general-functions.pl /bin/tar -zxpf patch.tar.gz -C / #build cachelang file after all "lang/*.pl" updates -perl -e "require '/var/ipcop/lang.pl'; &Lang::BuildCacheLang" +perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang" killall mingetty #redisplay correct version echo "end of $UPGRADEVERSION update" -- 2.39.2