diff --git a/config/cron/crontab b/config/cron/crontab index 92c3a78ba..d78d08f59 100644 --- a/config/cron/crontab +++ b/config/cron/crontab @@ -24,12 +24,10 @@ HOME=/ */5 * * * * /usr/local/bin/makegraphs >/dev/null 17 5 * * * /etc/init.d/tmpfs backup >/dev/null -# Force update the dynamic dns registration once a week -# Force update even if IP has not changed once a month if 'minimize update' selected in GUI -# to avoid account declared as dead -*/5 * * * * [ -f "/var/ipfire/red/active" ] && /usr/local/bin/setddns.pl -9 2 * * 0 [ -f "/var/ipfire/red/active" ] && /usr/local/bin/setddns.pl -f -3 2 1 * * [ -f "/var/ipfire/red/active" ] && /usr/local/bin/setddns.pl -f -m +# Update dynamic DNS records every five minutes. +# Force an update once a month +*/5 * * * * [ -f "/var/ipfire/red/active" ] && /usr/bin/ddns update-all +3 2 1 * * [ -f "/var/ipfire/red/active" ] && /usr/bin/ddns update-all --force # Logwatch 01 0 * * * /usr/local/bin/logwatch > /var/log/logwatch/`date -I -d yesterday`; \ diff --git a/config/rootfiles/common/ddns b/config/rootfiles/common/ddns new file mode 100644 index 000000000..2f0bdf741 --- /dev/null +++ b/config/rootfiles/common/ddns @@ -0,0 +1,63 @@ +usr/bin/ddns +usr/lib/python2.7/site-packages/ddns +usr/lib/python2.7/site-packages/ddns/__init__.py +usr/lib/python2.7/site-packages/ddns/__init__.pyc +usr/lib/python2.7/site-packages/ddns/__init__.pyo +usr/lib/python2.7/site-packages/ddns/__version__.py +usr/lib/python2.7/site-packages/ddns/__version__.pyc +usr/lib/python2.7/site-packages/ddns/__version__.pyo +usr/lib/python2.7/site-packages/ddns/errors.py +usr/lib/python2.7/site-packages/ddns/errors.pyc +usr/lib/python2.7/site-packages/ddns/errors.pyo +usr/lib/python2.7/site-packages/ddns/i18n.py +usr/lib/python2.7/site-packages/ddns/i18n.pyc +usr/lib/python2.7/site-packages/ddns/i18n.pyo +usr/lib/python2.7/site-packages/ddns/providers.py +usr/lib/python2.7/site-packages/ddns/providers.pyc +usr/lib/python2.7/site-packages/ddns/providers.pyo +usr/lib/python2.7/site-packages/ddns/system.py +usr/lib/python2.7/site-packages/ddns/system.pyc +usr/lib/python2.7/site-packages/ddns/system.pyo +#usr/share/doc/ddns +#usr/share/doc/ddns/COPYING +#usr/share/locale/ar/LC_MESSAGES/ddns.mo +#usr/share/locale/ca/LC_MESSAGES/ddns.mo +#usr/share/locale/cs_CZ +#usr/share/locale/cs_CZ/LC_MESSAGES +#usr/share/locale/cs_CZ/LC_MESSAGES/ddns.mo +#usr/share/locale/da/LC_MESSAGES/ddns.mo +#usr/share/locale/de/LC_MESSAGES/ddns.mo +#usr/share/locale/el_GR +#usr/share/locale/el_GR/LC_MESSAGES +#usr/share/locale/el_GR/LC_MESSAGES/ddns.mo +#usr/share/locale/es/LC_MESSAGES/ddns.mo +#usr/share/locale/fa/LC_MESSAGES/ddns.mo +#usr/share/locale/fr/LC_MESSAGES/ddns.mo +#usr/share/locale/hu/LC_MESSAGES/ddns.mo +#usr/share/locale/id/LC_MESSAGES/ddns.mo +#usr/share/locale/it/LC_MESSAGES/ddns.mo +#usr/share/locale/ja/LC_MESSAGES/ddns.mo +#usr/share/locale/km_KH +#usr/share/locale/km_KH/LC_MESSAGES +#usr/share/locale/km_KH/LC_MESSAGES/ddns.mo +#usr/share/locale/nl/LC_MESSAGES/ddns.mo +#usr/share/locale/pl/LC_MESSAGES/ddns.mo +#usr/share/locale/pt_BR/LC_MESSAGES/ddns.mo +#usr/share/locale/pt_PT/LC_MESSAGES/ddns.mo +#usr/share/locale/ro_RO +#usr/share/locale/ro_RO/LC_MESSAGES +#usr/share/locale/ro_RO/LC_MESSAGES/ddns.mo +#usr/share/locale/ru/LC_MESSAGES/ddns.mo +#usr/share/locale/sq/LC_MESSAGES/ddns.mo +#usr/share/locale/sv/LC_MESSAGES/ddns.mo +#usr/share/locale/th/LC_MESSAGES/ddns.mo +#usr/share/locale/tk +#usr/share/locale/tk/LC_MESSAGES +#usr/share/locale/tk/LC_MESSAGES/ddns.mo +#usr/share/locale/tr/LC_MESSAGES/ddns.mo +#usr/share/locale/uk/LC_MESSAGES/ddns.mo +#usr/share/locale/uz@Latn +#usr/share/locale/uz@Latn/LC_MESSAGES +#usr/share/locale/uz@Latn/LC_MESSAGES/ddns.mo +#usr/share/locale/vi/LC_MESSAGES/ddns.mo +#var/ipfire/ddns/ddns.conf.sample diff --git a/config/rootfiles/common/stage2 b/config/rootfiles/common/stage2 index 87649e972..085092d7a 100644 --- a/config/rootfiles/common/stage2 +++ b/config/rootfiles/common/stage2 @@ -90,7 +90,6 @@ usr/local/bin/rebuild-initrd usr/local/bin/run-parts #usr/local/bin/sanedloop usr/local/bin/scanhd -usr/local/bin/setddns.pl usr/local/bin/settime usr/local/bin/timecheck usr/local/bin/timezone-transition diff --git a/config/rootfiles/core/80/filelists/files b/config/rootfiles/core/80/filelists/files index 2c38e1ea7..528137824 100644 --- a/config/rootfiles/core/80/filelists/files +++ b/config/rootfiles/core/80/filelists/files @@ -4,7 +4,6 @@ etc/rc.d/init.d/dhcrelay etc/rc.d/init.d/dnsmasq srv/web/ipfire/cgi-bin/ovpnmain.cgi srv/web/ipfire/cgi-bin/routing.cgi -usr/local/bin/setddns.pl usr/sbin/dhcrelay var/ipfire/general-functions.pl var/ipfire/langs diff --git a/config/rootfiles/core/80/update.sh b/config/rootfiles/core/80/update.sh index 8032dccf1..26e004496 100644 --- a/config/rootfiles/core/80/update.sh +++ b/config/rootfiles/core/80/update.sh @@ -47,6 +47,25 @@ rm -f \ /opt/pakfire/db/installed/meta-libgpg-error \ /opt/pakfire/db/rootfiles/libgpg-error +# Generate ddns configuration file +/srv/web/ipfire/cgi-bin/ddns.cgi + +touch /var/ipfire/ddns/ddns.conf +chown nobody.nobody /var/ipfire/ddns/ddns.conf + +# Update crontab +sed -i /var/spool/cron/root.orig -e "/setddns.pl/d" + +grep -q /usr/bin/ddns /var/spool/cron/root.orig || cat <> /var/spool/cron/root.orig + +# Update dynamic DNS records every five minutes. +# Force an update once a month +*/5 * * * * [ -f "/var/ipfire/red/active" ] && /usr/bin/ddns update-all +3 2 1 * * [ -f "/var/ipfire/red/active" ] && /usr/bin/ddns update-all --force +EOF + +fcrontab -z &>/dev/null + sync # This update need a reboot... diff --git a/html/cgi-bin/ddns.cgi b/html/cgi-bin/ddns.cgi index 4b4bc63d7..51deb0313 100644 --- a/html/cgi-bin/ddns.cgi +++ b/html/cgi-bin/ddns.cgi @@ -2,7 +2,7 @@ ############################################################################### # # # IPFire.org - A linux based firewall # -# Copyright (C) 2007-2011 IPFire Team # +# Copyright (C) 2007-2014 IPFire Team # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # @@ -29,370 +29,455 @@ require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; +# Hook to regenerate the configuration files, if cgi got called from command line. +if ($ENV{"REMOTE_ADDR"} eq "") { + &GenerateDDNSConfigFile(); + exit(0); +} + #workaround to suppress a warning when a variable is used only once my @dummy = ( ${Header::table2colour}, ${Header::colouryellow} ); undef (@dummy); -my $ddnsprefix = $Lang::tr{'ddns noip prefix'}; -$ddnsprefix =~ s/%/$General::noipprefix/; - my %color = (); my %mainsettings = (); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); -# Files used -my $setting = "${General::swroot}/ddns/settings"; -our $datafile = "${General::swroot}/ddns/config"; +# Config file for basic configuration. +my $settingsfile = "${General::swroot}/ddns/settings"; + +# Config file to store the configured ddns providers. +my $datafile = "${General::swroot}/ddns/config"; + +# Dynamic ddns programm call. +my @ddnsprog = ("/usr/bin/ddns", "--config", + "/var/ipfire/ddns/ddns.conf", + "update-all", "--force" ); my %settings=(); -#Settings1 -$settings{'BEHINDROUTER'} = 'RED_IP'; -$settings{'MINIMIZEUPDATES'} = ''; +my $errormessage = ''; -#Settings2 for editing the multi-line list -#Must not be saved ! +# DDNS General settings. +$settings{'BEHINDROUTER'} = 'RED_IP'; + +# Account settings. $settings{'HOSTNAME'} = ''; $settings{'DOMAIN'} = ''; $settings{'LOGIN'} = ''; $settings{'PASSWORD'} = ''; -$settings{'PASSWORD2'} = ''; $settings{'ENABLED'} = ''; $settings{'PROXY'} = ''; -$settings{'WILDCARDS'} = ''; $settings{'SERVICE'} = ''; -my @nosaved=('HOSTNAME','DOMAIN','LOGIN','PASSWORD','PASSWORD2', - 'ENABLED','PROXY','WILDCARDS','SERVICE'); # List here ALL setting2 fields. Mandatory - -$settings{'ACTION'} = ''; # add/edit/remove -$settings{'KEY1'} = ''; # point record for ACTION -$settings{'KEY2'} = ''; # point record for ACTION - -my $errormessage = ''; -my $warnmessage = ''; +$settings{'ACTION'} = ''; &Header::showhttpheaders(); #Get GUI values &Header::getcgihash(\%settings); -# Load multiline data -our @current = (); -if (open(FILE, "$datafile")) { - @current = ; - close (FILE); -} +# Read configuration file. +open(FILE, "$datafile") or die "Unable to open $datafile."; +my @current = ; +close (FILE); + +# Get supported ddns providers. +my @providers = &GetProviders(); # -# Check Settings1 first because they are needed before working on @current +# Save General Settings. # if ($settings{'ACTION'} eq $Lang::tr{'save'}) { - # No user input to check. ! - #unless ($errormessage) { # Everything is ok, save settings - $settings{'BEHINDROUTERWAITLOOP'} = '-1'; # init & will update on next setddns.pl call - map (delete ($settings{$_}) ,(@nosaved,'ACTION','KEY1','KEY2'));# Must never be saved - &General::writehash($setting, \%settings); # Save good settings - $settings{'ACTION'} = $Lang::tr{'save'}; # Recreate 'ACTION' - map ($settings{$_}= '',(@nosaved,'KEY1','KEY2')); # and reinit var to empty - #} -} else { - &General::readhash($setting, \%settings); # Get saved settings and reset to good if needed + + # Open /var/ipfire/ddns/settings for writing. + open(FILE, ">$settingsfile") or die "Unable to open $settingsfile."; + + # Lock file for writing. + flock FILE, 2; + + # Check if BEHINDROUTER has been configured. + if ($settings{'BEHINDROUTER'} ne '') { + print FILE "BEHINDROUTER=$settings{'BEHINDROUTER'}\n"; + } + + # Close file after writing. + close(FILE); + + # Unset given CGI parmas. + undef %settings; + + # Update ddns config file. + &GenerateDDNSConfigFile(); } -# -# Now manipulate the multi-line list with Settings2 # # Toggle enable/disable field. Field is in second position +# if ($settings{'ACTION'} eq $Lang::tr{'toggle enable disable'}) { - #move out new line - chomp(@current[$settings{'KEY1'}]); - my @temp = split(/\,/,@current[$settings{'KEY1'}]); - my $K2=$settings{'KEY2'}; - $temp[ $K2 ] = ( $temp[ $K2 ] eq 'on') ? '' : 'on'; # Toggle the field - @current[$settings{'KEY1'}] = join (',',@temp)."\n"; - $settings{'KEY1'} = ''; # End edit mode - &General::log($Lang::tr{'ddns hostname modified'}); - # Write changes to config file. - &WriteDataFile; # sort newly added/modified entry + # Open /var/ipfire/ddns/config for writing. + open(FILE, ">$datafile") or die "Unable to open $datafile."; + + # Lock file for writing. + flock FILE, 2; + + my @temp; + my $id = 0; + + # Read file line by line. + foreach my $line (@current) { + + # Remove newlines. + chomp($line); + + if ($settings{'ID'} eq $id) { + + # Splitt lines (splitting element is a single ",") and save values into temp array. + @temp = split(/\,/,$line); + + # Check if we want to toggle ENABLED or WILDCARDS. + if ($settings{'ENABLED'} ne '') { + + # Update ENABLED. + print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6],$settings{'ENABLED'}\n"; + } + } else { + + # Print unmodified line. + print FILE "$line\n"; + } + + # Increase $id. + $id++; + } + + # Close file after writing. + close(FILE); + + # Unset given CGI params. + undef %settings; + + # Write out logging notice. + &General::log($Lang::tr{'ddns hostname modified'}); + + # Update ddns config file. + &GenerateDDNSConfigFile(); } -if ($settings{'ACTION'} eq $Lang::tr{'add'}) { - # Validate inputs +# +# Add new accounts, or edit existing ones. +# +if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang::tr{'update'})) { - unless ($settings{'LOGIN'} ne '') { - $errormessage = $Lang::tr{'username not set'}; - } + # Check if a hostname has been given. + if ($settings{'HOSTNAME'} eq '') { + $errormessage = $Lang::tr{'hostname not set'}; + } - # list box returns 'service optional synonyms' - # keep only first name - $settings{'SERVICE'} =~ s/ .*$//; - - # for freedns.afraid.org, only 'connect string' is mandatory - if ($settings{'SERVICE'} ne 'freedns.afraid.org') { - unless ($settings{'SERVICE'} eq 'regfish.com' || $settings{'PASSWORD'} ne '') { - $errormessage = $Lang::tr{'password not set'}; + # Check if a valid domainname has been provided. + if (!&General::validdomainname($settings{'HOSTNAME'})) { + $errormessage = $Lang::tr{'invalid domain name'}; } - unless ($settings{'PASSWORD'} eq $settings{'PASSWORD2'}) { - $errormessage = $Lang::tr{'passwords do not match'}; - } - - # Permit an empty HOSTNAME for the nsupdate, regfish, dyndns, enom, ovh, zoneedit, no-ip, easydns - #and namecheap - unless ($settings{'SERVICE'} eq 'zoneedit.com' || $settings{'SERVICE'} eq 'nsupdate' || - $settings{'SERVICE'} eq 'dyndns-custom'|| $settings{'SERVICE'} eq 'regfish.com' || - $settings{'SERVICE'} eq 'enom.com' || $settings{'SERVICE'} eq 'dnspark.com' || - $settings{'SERVICE'} eq 'ovh.com' || $settings{'HOSTNAME'} ne '' || - $settings{'SERVICE'} eq 'no-ip.com' || $settings{'SERVICE'} eq 'easydns.com' || - $settings{'SERVICE'} eq 'namecheap.com' ) { - $errormessage = $Lang::tr{'hostname not set'}; - } - unless ($settings{'HOSTNAME'} eq '' || $settings{'HOSTNAME'} =~ /^[a-zA-Z_0-9-]+$/) { - $errormessage = $Lang::tr{'invalid hostname'}; - } - unless ($settings{'DOMAIN'} ne '') { - $errormessage = $Lang::tr{'domain not set'}; - } - unless ($settings{'DOMAIN'} =~ /^[a-zA-Z_0-9.-]+$/) { - $errormessage = $Lang::tr{'invalid domain name'}; - } - unless ($settings{'DOMAIN'} =~ /[.]/) { - $errormessage = $Lang::tr{'invalid domain name'}; - } - } - # recheck service wich don't need too much fields - if ($settings{'SERVICE'} eq 'cjb.net') { - $errormessage = ''; # clear previous error - unless ($settings{'LOGIN'} ne '') { - $errormessage = $Lang::tr{'username not set'}; + # Check if a username has been sent. + if ($settings{'LOGIN'} eq '') { + $errormessage = $Lang::tr{'username not set'}; } - unless ($settings{'PASSWORD'} ne '') { - $errormessage = $Lang::tr{'password not set'}; - } - unless ($settings{'PASSWORD'} eq $settings{'PASSWORD2'}) { - $errormessage = $Lang::tr{'passwords do not match'}; - } - } - unless ($errormessage) { - if ($settings{'KEY1'} eq '') { #add or edit ? - unshift (@current, "$settings{'SERVICE'},$settings{'HOSTNAME'},$settings{'DOMAIN'},$settings{'PROXY'},$settings{'WILDCARDS'},$settings{'LOGIN'},$settings{'PASSWORD'},$settings{'ENABLED'}\n"); - &General::log($Lang::tr{'ddns hostname added'}); - } else { - @current[$settings{'KEY1'}] = "$settings{'SERVICE'},$settings{'HOSTNAME'},$settings{'DOMAIN'},$settings{'PROXY'},$settings{'WILDCARDS'},$settings{'LOGIN'},$settings{'PASSWORD'},$settings{'ENABLED'}\n"; - $settings{'KEY1'} = ''; # End edit mode - &General::log($Lang::tr{'ddns hostname modified'}); + # Check if a password has been typed in. + # freedns.afraid.org does not require this field. + if (($settings{'PASSWORD'} eq '') && ($settings{'SERVICE'} ne 'freedns.afraid.org')) { + $errormessage = $Lang::tr{'password not set'}; + } + + # Go furter if there was no error. + if ( ! $errormessage) { + + # Splitt hostname field into 2 parts for storrage. + my($hostname, $domain) = split(/\./, $settings{'HOSTNAME'}, 2); + + # Handle adding new accounts. + if ($settings{'ACTION'} eq $Lang::tr{'add'}) { + + # Open /var/ipfire/ddns/config for writing. + open(FILE, ">>$datafile") or die "Unable to open $datafile."; + + # Lock file for writing. + flock FILE, 2; + + # Add account data to the file. + print FILE "$settings{'SERVICE'},$hostname,$domain,$settings{'PROXY'},$settings{'WILDCARDS'},$settings{'LOGIN'},$settings{'PASSWORD'},$settings{'ENABLED'}\n"; + + # Close file after writing. + close(FILE); + + # Write out notice to logfile. + &General::log($Lang::tr{'ddns hostname added'}); + + # Update ddns config file. + + # Handle account edditing. + } elsif ($settings{'ACTION'} eq $Lang::tr{'update'}) { + + # Open /var/ipfire/ddns/config for writing. + open(FILE, ">$datafile") or die "Unable to open $datafile."; + + # Lock file for writing. + flock FILE, 2; + + my $id = 0; + + # Read file line by line. + foreach my $line (@current) { + + if ($settings{'ID'} eq $id) { + print FILE "$settings{'SERVICE'},$hostname,$domain,$settings{'PROXY'},$settings{'WILDCARDS'},$settings{'LOGIN'},$settings{'PASSWORD'},$settings{'ENABLED'}\n"; + } else { + print FILE "$line"; + } + + # Increase $id. + $id++; + } + + # Close file after writing. + close(FILE); + + # Write out notice to logfile. + &General::log($Lang::tr{'ddns hostname modified'}); + } + + # Unset given CGI params. + undef %settings; + + # Update ddns config file. + &GenerateDDNSConfigFile(); } - map ($settings{$_}='' ,@nosaved); # Clear fields - # Write changes to config file. - &WriteDataFile; # sort newly added/modified entry - } -} - -if ($settings{'ACTION'} eq $Lang::tr{'edit'}) { - #move out new line - my $line = @current[$settings{'KEY1'}]; # KEY1 is the index in current - chomp($line); - my @temp = split(/\,/, $line); - $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'} = $settings{'PASSWORD2'} = $temp[6]; - $settings{'ENABLED'} = $temp[7]; } +# +# Remove existing accounts. +# if ($settings{'ACTION'} eq $Lang::tr{'remove'}) { - splice (@current,$settings{'KEY1'},1); # Delete line - open(FILE, ">$datafile") or die 'ddns datafile error'; - print FILE @current; - close(FILE); - $settings{'KEY1'} = ''; # End remove mode - &General::log($Lang::tr{'ddns hostname removed'}); - # Write changes to config file. - &WriteDataFile; + + # Open /var/ipfire/ddns/config for writing. + open(FILE, ">$datafile") or die "Unable to open $datafile."; + + # Lock file for writing. + flock FILE, 2; + + my $id = 0; + + # Read file line by line. + foreach my $line (@current) { + + # Write back every line, except the one we want to drop + # (identified by the ID) + unless ($settings{'ID'} eq $id) { + print FILE "$line"; + } + + # Increase id. + $id++; + } + + # Close file after writing. + close(FILE); + + # Unset given CGI params. + undef %settings; + + # Write out notice to logfile. + &General::log($Lang::tr{'ddns hostname removed'}); + + # Update ddns config file. + &GenerateDDNSConfigFile(); } +# +# Read items for editing. +# +if ($settings{'ACTION'} eq $Lang::tr{'edit'}) { + + my $id = 0; + my @temp; + + # Read file line by line. + foreach my $line (@current) { + + if ($settings{'ID'} eq $id) { + + # Remove newlines. + chomp($line); + + # Splitt lines (splitting element is a single ",") and save values into temp array. + @temp = split(/\,/,$line); + + $settings{'SERVICE'} = $temp[0]; + $settings{'HOSTNAME'} = "$temp[1].$temp[2]"; + $settings{'PROXY'} = $temp[3]; + $settings{'WILDCARDS'} = $temp[4]; + $settings{'LOGIN'} = $temp[5]; + $settings{'PASSWORD'} = $temp[6]; + $settings{'ENABLED'} = $temp[7]; + } + # Increase $id. + $id++; + + } +} + +# +# Handle forced updates. +# if ($settings{'ACTION'} eq $Lang::tr{'instant update'}) { - system('/usr/local/bin/setddns.pl', '-f'); + system(@ddnsprog) == 0 or die "@ddnsprog failed: $?\n"; } - -if ($settings{'ACTION'} eq '') -{ - $settings{'SERVICE'} = 'dyndns.org'; - $settings{'ENABLED'} = 'on'; +# +# Set default values. +# +if (! $settings{'ACTION'}) { + $settings{'SERVICE'} = 'dyndns.org'; + $settings{'ENABLED'} = 'on'; } &Header::openpage($Lang::tr{'dynamic dns'}, 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); -my %checked =(); # Checkbox manipulations -$checked{'SERVICE'}{'all-inkl.com'} = ''; -$checked{'SERVICE'}{'cjb.net'} = ''; -$checked{'SERVICE'}{'dhs.org'} = ''; -$checked{'SERVICE'}{'dnspark.com'} = ''; -$checked{'SERVICE'}{'dns.lightningwirelabs.com'} = ''; -$checked{'SERVICE'}{'dtdns.com'} = ''; -$checked{'SERVICE'}{'dyndns.org'} = ''; -$checked{'SERVICE'}{'dyndns-custom'} = ''; -$checked{'SERVICE'}{'dyndns-static'} = ''; -$checked{'SERVICE'}{'dyns.cx'} = ''; -$checked{'SERVICE'}{'dynu.ca'} = ''; -$checked{'SERVICE'}{'easydns.com'} = ''; -$checked{'SERVICE'}{'enom.com'} = ''; -$checked{'SERVICE'}{'freedns.afraid.org'} = ''; -$checked{'SERVICE'}{'hn.org'} = ''; -$checked{'SERVICE'}{'namecheap.com'} = ''; -$checked{'SERVICE'}{'no-ip.com'} = ''; -$checked{'SERVICE'}{'nsupdate'} = ''; -$checked{'SERVICE'}{'ovh.com'} = ''; -$checked{'SERVICE'}{'regfish.com'} = ''; -$checked{'SERVICE'}{'selfhost.de'} = ''; -$checked{'SERVICE'}{'spdns.org'} = ''; -$checked{'SERVICE'}{'strato.com'} = ''; -$checked{'SERVICE'}{'twodns.de'} = ''; -$checked{'SERVICE'}{'tzo.com'} = ''; -$checked{'SERVICE'}{'variomedia.de'} = ''; -$checked{'SERVICE'}{'zoneedit.com'} = ''; -$checked{'SERVICE'}{$settings{'SERVICE'}} = "selected='selected'"; +# Read file for general ddns settings. +&General::readhash($settingsfile, \%settings); +my %checked =(); $checked{'BEHINDROUTER'}{'RED_IP'} = ''; $checked{'BEHINDROUTER'}{'FETCH_IP'} = ''; $checked{'BEHINDROUTER'}{$settings{'BEHINDROUTER'}} = "checked='checked'"; -$checked{'MINIMIZEUPDATES'} = ($settings{'MINIMIZEUPDATES'} eq '' ) ? '' : "checked='checked'"; -$checked{'PROXY'}{'on'} = ($settings{'PROXY'} eq '') ? '' : "checked='checked'"; -$checked{'WILDCARDS'}{'on'} = ($settings{'WILDCARDS'} eq '') ? '' : "checked='checked'"; $checked{'ENABLED'}{'on'} = ($settings{'ENABLED'} eq '' ) ? '' : "checked='checked'"; +# Show box for errormessages.. if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage "; &Header::closebox(); } -if ($warnmessage) { - $warnmessage = "$Lang::tr{'capswarning'}: $warnmessage"; -} &Header::openbox('100%', 'left', $Lang::tr{'settings'}); -print "
"; -print < - - $Lang::tr{'dyn dns source choice'} - - - $Lang::tr{'use ipfire red ip'} - - - $Lang::tr{'fetch ip from'} * - - - - $Lang::tr{'ddns minimize updates'} - - -

-END -; +## +# Section for general ddns setup. print < - - - - - + + + + + + + + + +
*$Lang::tr{'avoid dod'}
$Lang::tr{'dyn dns source choice'}
+ $Lang::tr{'use ipfire red ip'}
+ $Lang::tr{'fetch ip from'}
+
+
+ + + + +
END ; -&Header::closebox(); # end of Settings1 +&Header::closebox(); +## +# Section to add or edit an existing entry. + +# Default is add. my $buttontext = $Lang::tr{'add'}; -if ($settings{'KEY1'} ne '') { - $buttontext = $Lang::tr{'update'}; - &Header::openbox('100%', 'left', $Lang::tr{'edit an existing host'}); + +# Change buttontext and headline if we edit an account. +if ($settings{'ACTION'} eq $Lang::tr{'edit'}) { + + # Rename button and print headline for updating. + $buttontext = $Lang::tr{'update'}; + &Header::openbox('100%', 'left', $Lang::tr{'edit an existing host'}); } else { - &Header::openbox('100%', 'left', $Lang::tr{'add a host'}); + + # Otherwise use default button text and show headline for adding a new account. + &Header::openbox('100%', 'left', $Lang::tr{'add a host'}); } -#Edited line number (KEY1) passed until cleared by 'save' or 'remove' print < - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + \n"; +print <$Lang::tr{'hostname'}: + + + + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'service'}:$Lang::tr{'hostname'}: *
$Lang::tr{'behind a proxy'}$Lang::tr{'domain'}:
$Lang::tr{'enable wildcards'}$Lang::tr{'username'}
$Lang::tr{'password'}
$Lang::tr{'enabled'}$Lang::tr{'again'}
$Lang::tr{'service'}: +END +; + # Generate dropdown menu for service selection. + print"
$Lang::tr{'username'}:
$Lang::tr{'password'}
$Lang::tr{'enabled'}

-
+
+ - - - + +
*$ddnsprefix - -
@@ -400,158 +485,117 @@ END ; &Header::closebox(); -# -# Third box shows the list, in columns -# +## +# Third section, display all created ddns hosts. + &Header::openbox('100%', 'left', $Lang::tr{'current hosts'}); print < - - $Lang::tr{'service'} - $Lang::tr{'hostname'} - $Lang::tr{'domain'} - $Lang::tr{'proxy'} - $Lang::tr{'wildcards'} - $Lang::tr{'action'} - + + $Lang::tr{'service'} + $Lang::tr{'hostname'} + $Lang::tr{'action'} + END ; + +# Re-open file to get changes. +open(FILE, $datafile) or die "Unable to open $datafile."; +@current = ; +close(FILE); + +# Get IP address of the red interface. my $ip = &General::GetDyndnsRedIP; -my $key = 0; +my $id = 0; +my $toggle_enabled; + foreach my $line (@current) { - chomp($line); # remove newline - my @temp = split(/\,/,$line); - if ($temp[0] eq 'no-ip.com') { - $temp[1] =~ s!$General::noipprefix(.*)!group:$1 !; - } + # Remove newlines. + chomp(@current); + my @temp = split(/\,/,$line); - #Choose icon for checkbox + # Generate value for enable/disable checkbox. + my $sync = ""; + my $gif = ''; + my $gdesc = ''; - my $gifproxy=''; - my $descproxy=''; - if ($temp[3] eq "on") { - $gifproxy = 'on.gif'; - $descproxy = $Lang::tr{'click to disable'}; - } else { - $gifproxy = 'off.gif'; - $descproxy = $Lang::tr{'click to enable'}; - } - - my $gifwildcard=''; - my $descwildcard=''; - if ($temp[4] eq "on") { - $gifwildcard = 'on.gif'; - $descwildcard = $Lang::tr{'click to disable'}; - } else { - $gifwildcard = 'off.gif'; - $descwildcard = $Lang::tr{'click to enable'}; - } - - my $sync = ""; - my $gif = ''; - my $gdesc = ''; - if ($temp[7] eq "on") { - $gif = 'on.gif'; - $gdesc = $Lang::tr{'click to disable'}; - $sync = (&General::DyndnsServiceSync ($ip,$temp[1], $temp[2]) ? "": "") ; - } else { - $gif = 'off.gif'; - $gdesc = $Lang::tr{'click to enable'}; - } + if ($temp[7] eq "on") { + $gif = 'on.gif'; + $gdesc = $Lang::tr{'click to disable'}; + $sync = (&General::DyndnsServiceSync ($ip,$temp[1], $temp[2]) ? "": "") ; + $toggle_enabled = 'off'; + } else { + $gif = 'off.gif'; + $gdesc = $Lang::tr{'click to enable'}; + $toggle_enabled = 'on'; + } + # Background color. my $col=""; - #Colorize each line - if ($settings{'KEY1'} eq $key) { - print ""; - $col="bgcolor='${Header::colouryellow}'"; - } elsif ($key % 2) { - print ""; - $col="bgcolor='$color{'color20'}'"; - } else { - print ""; - $col="bgcolor='$color{'color22'}'"; - } - #if a field is empty, replace it with a '---' to see colorized info! - $temp[1] = '---' if (!$temp[1]); - $temp[2] = '---' if (!$temp[2]); + if ($settings{'ID'} eq $id) { + $col="bgcolor='${Header::colouryellow}'"; + } elsif (!&General::is_part_of("$temp[0]", @providers)) { + $col="bgcolor='#FF4D4D'"; + } elsif ($id % 2) { + $col="bgcolor='$color{'color20'}'"; + } else { + $col="bgcolor='$color{'color22'}'"; + } - print <$temp[0] -$sync$temp[1] -$sync$temp[2] +# The following HTML Code still is part of the loop. +print < + $temp[0] + $sync$temp[1].$sync$temp[2] - -
- - - - -
- +
+ + + + +
- -
- - - - -
- +
+ + + +
- -
- - - - -
- - - -
- - - -
- - - -
- - - -
- +
+ + + +
END ; - $key++; + $id++; } print ""; # If table contains entries, print 'Key to action icons' -if ($key) { +if ($id) { print < - -  $Lang::tr{'legend'}:  - $Lang::tr{ - $Lang::tr{'click to disable'} -    - $Lang::tr{ - $Lang::tr{'click to enable'} -    - $Lang::tr{ - $Lang::tr{'edit'} -    - $Lang::tr{ - $Lang::tr{'remove'} -
- -
- + +  $Lang::tr{'legend'}:  + $Lang::tr{ + $Lang::tr{'click to disable'} +    + $Lang::tr{ + $Lang::tr{'click to enable'} +    + $Lang::tr{ + $Lang::tr{'edit'} +    + $Lang::tr{ + $Lang::tr{'remove'} +
+ +
+ END ; @@ -561,13 +605,116 @@ END &Header::closebigbox(); &Header::closepage(); -## Ouf it's the end ! +# Function to generate the required configuration file for the DDNS tool. +sub GenerateDDNSConfigFile { + # Open datafile file + open(SETTINGS, "<$datafile") or die "Could not open $datafile."; + open(FILE, ">${General::swroot}/ddns/ddns.conf"); -# write the "current" array -sub WriteDataFile { - #Save current - open(FILE, ">$datafile") or die 'ddns datafile error'; - print FILE @current; - close (FILE); + # Global configuration options. + print FILE "[config]\n"; + + # Check if we guess our IP address by an extranal server. + if ($settings{'BEHINDROUTER'} eq "FETCH_IP") { + print FILE "guess_external_ip = true\n"; + } else { + print FILE "guess_external_ip = false\n"; + } + + # Use an upstream proxy and generate proxy url. + my %proxysettings; + &General::readhash("${General::swroot}/proxy/settings", \%proxysettings); + if ($proxysettings{'UPSTREAM_PROXY'}) { + my $proxy_string = "http://"; + + if ($proxysettings{'UPSTREAM_USER'} && $proxysettings{'UPSTREAM_PASSWORD'}) { + $proxy_string .= "$proxysettings{'UPSTREAM_USER'}:$proxysettings{'UPSTREAM_PASSWORD'}@"; + } + + $proxy_string .= $proxysettings{'UPSTREAM_PROXY'}; + + print FILE "proxy = $proxy_string\n"; + } + + print FILE "\n"; + + while () { + my $line = $_; + + # Generate array based on the line content (seperator is a single or multiple space's) + my @settings = split(/,/, $line); + my ($provider, $hostname, $domain, $proxy, $wildcards, $username, $password, $enabled) = @settings; + + # Skip entries if they are not (longer) supported. + next if (!&General::is_part_of("$provider", @providers)); + + # Skip disabled entries. + next if ($enabled eq "off"); + + print FILE "[$hostname.$domain]\n"; + print FILE "provider = $provider\n"; + + my $use_token = 0; + + # Handle token based auth for various providers. + if ($provider ~~ ["dns.lightningwirelabs.com", "regfish.com"] && $username eq "token") { + $use_token = 1; + + # Handle token auth for freedns.afraid.org. + } elsif ($provider eq "freedns.afraid.org" && $password eq "") { + $use_token = 1; + $password = $username; + + # Handle keys for nsupdate + } elsif (($provider eq "nsupdate") && $username && $password) { + print FILE "key = $username\n"; + print FILE "secret = $password\n"; + + $username = ""; + $password = ""; + } + + # Write auth details. + if ($use_token) { + print FILE "token = $password\n"; + } elsif ($username && $password) { + print FILE "username = $username\n"; + print FILE "password = $password\n"; + } + + # These providers need to be set to only use IPv4. + if ($provider ~~ ["freedns.afraid.org", "variomedia.de", "zoneedit.com"]) { + print FILE "proto = ipv4\n"; + } + + print FILE "\n"; + } + + close(SETTINGS); + close(FILE); +} + +# Function which generates an array (@providers) which contains the supported providers. +sub GetProviders { + # Get supported providers. + open(PROVIDERS, "/usr/bin/ddns list-providers |"); + + # Create new array to store the providers. + my @providers = (); + + while () { + my $provider = $_; + + # Remove following newlines. + chomp($provider); + + # Add provider to the array. + push(@providers, $provider); + } + + close(PROVIDERS); + + # Return our array. + return @providers; } diff --git a/lfs/ddns b/lfs/ddns new file mode 100644 index 000000000..64e33ded5 --- /dev/null +++ b/lfs/ddns @@ -0,0 +1,80 @@ +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2010 IPFire Team # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +############################################################################### +# Definitions +############################################################################### + +include Config + +VER = 001 + +THISAPP = ddns-$(VER) +DL_FILE = $(THISAPP).tar.xz +DL_FROM = http://source.ipfire.org/releases/ddns/ +DIR_APP = $(DIR_SRC)/$(THISAPP) +TARGET = $(DIR_INFO)/$(THISAPP) + +############################################################################### +# Top-level Rules +############################################################################### + +objects = $(DL_FILE) + +$(DL_FILE) = $(DL_FROM)/$(DL_FILE) + +$(DL_FILE)_MD5 = 49137d9f796d90f50df5a33981cafae1 + +install : $(TARGET) + +check : $(patsubst %,$(DIR_CHK)/%,$(objects)) + +download :$(patsubst %,$(DIR_DL)/%,$(objects)) + +md5 : $(subst %,%_MD5,$(objects)) + +############################################################################### +# Downloading, checking, md5sum +############################################################################### + +$(patsubst %,$(DIR_CHK)/%,$(objects)) : + @$(CHECK) + +$(patsubst %,$(DIR_DL)/%,$(objects)) : + @$(LOAD) + +$(subst %,%_MD5,$(objects)) : + @$(MD5) + +############################################################################### +# Installation Details +############################################################################### + +$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) + @$(PREBUILD) + @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE) + + cd $(DIR_APP) && [ -x "configure" ] || sh ./autogen.sh + cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/var/ipfire + cd $(DIR_APP) && make $(MAKETUNING) + cd $(DIR_APP) && make install + + @rm -rf $(DIR_APP) + @$(POSTBUILD) diff --git a/make.sh b/make.sh index 51ee693ac..174ef258c 100755 --- a/make.sh +++ b/make.sh @@ -475,6 +475,7 @@ buildipfire() { ipfiremake sqlite ipfiremake python ipfiremake fireinfo + ipfiremake ddns ipfiremake libnet ipfiremake libnl ipfiremake libidn diff --git a/src/initscripts/init.d/networking/red.up/30-ddns b/src/initscripts/init.d/networking/red.up/30-ddns index 66d6fdb60..6eba04b06 100644 --- a/src/initscripts/init.d/networking/red.up/30-ddns +++ b/src/initscripts/init.d/networking/red.up/30-ddns @@ -1,5 +1,3 @@ #!/bin/bash -/usr/local/bin/setddns.pl -f - -exit 0 +exec /usr/bin/ddns update-all --force diff --git a/src/scripts/setddns.pl b/src/scripts/setddns.pl deleted file mode 100644 index 5a195650c..000000000 --- a/src/scripts/setddns.pl +++ /dev/null @@ -1,862 +0,0 @@ -#!/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 = ; - 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 = &General::GetDyndnsRedIP(); - -if ($ip eq "unavailable") { - &General::log("Dynamic DNS error: RED/Public IP is unavailable"); - exit(0); -} - -#&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 - } - } - 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_https("dyndns.kasserver.com", 443, "/", 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 = ; - 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) - #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 'spdns.de') { - # 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( 'update.spdns.de', 443, - "/nic/update?&hostname=$settings{'HOSTDOMAIN'}&myip=$ip", - Net::SSLeay::make_headers('User-Agent' => 'IPFire' , - 'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")) - ); - - #Valid responses from service are: - # good xxx.xxx.xxx.xxx - # nochg xxx.xxx.xxx.xxx - if ($response =~ m%HTTP/1\.. 200 OK%) { - if ($out !~ m/good |nochg /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 '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>/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_https( 'api.dynu.com', - 443, - "/nic/update?hostname=$settings{'HOSTDOMAIN'}&myip=$ip&username=$settings{'LOGIN'}&password=$settings{'PASSWORD'}", - Net::SSLeay::make_headers('User-Agent' => 'IPFire' ) - ); - # Valid responses are 'good xxx.xxx.xxx.xxx', 'nochg' - # see http://www.dynu.com/Default.aspx?page=dnsapi for further details - if ($response =~ m%HTTP/1\.. 200 OK%) { - if ( $out !~ m/^(good|nochg)/ ) { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure ($out)"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : success ($out)"); - $success++; - } - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server---$out-$response)"); - } - } - elsif ($settings{'SERVICE'} eq 'udmedia') { - # 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.udmedia.de', - 443, - "/nic/update?myip=$ip&username=$settings{'HOSTDOMAIN'}&password=$settings{'PASSWORD'}", - 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|nochg)/ ) { - $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---$out-$response--)"); - } - } - elsif ($settings{'SERVICE'} eq 'twodns') { - # 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( 'update.twodns.de', - 443, - "/update?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/^(good|nochg)/ ) { - $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---$out-$response--)"); - } - } - elsif ($settings{'SERVICE'} eq 'variomedia') { - # 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.variomedia.de', - 443, - "/nic/update?hostname=$settings{'HOSTDOMAIN'}&myip=$ip", - Net::SSLeay::make_headers('User-Agent' => 'IPFire', - 'Authorization' => 'Basic ' . encode_base64("$settings{'LOGIN'}:$settings{'PASSWORD'}")) ); - - # Valid response is 'good $ip' - if ($response =~ m%HTTP/1\.. 200 OK%) { - if ( $out !~ m/^good $ip/ ) { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} ($ip) : failure ($out)"); - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} ($ip) : success"); - $success++; - } - } else { - &General::log("Dynamic DNS ip-update for $settings{'HOSTDOMAIN'} : failure (could not connect to server, check your credentials---$out-$response--)"); - } - } - 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++; - } - - -