X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=html%2Fcgi-bin%2Fddns.cgi;h=73a41d903fae41b47024f38ce18237adca36556c;hb=1e2e78e6ff3e98b9de4edefcd520cda3b4e5cea3;hp=7be9a50f073bd64560560204efb749014ef386fb;hpb=fed3de5b75bae6cfbda910d0084c2d27556efa2b;p=ipfire-2.x.git diff --git a/html/cgi-bin/ddns.cgi b/html/cgi-bin/ddns.cgi index 7be9a50f07..73a41d903f 100644 --- a/html/cgi-bin/ddns.cgi +++ b/html/cgi-bin/ddns.cgi @@ -44,10 +44,8 @@ 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"); +# Call the ddnsctrl helper binary to perform the update. +my @ddnsprog = ("/usr/local/bin/ddnsctrl", "update-all"); my %settings=(); my $errormessage = ''; @@ -89,7 +87,6 @@ close (FILE); # Save General Settings. # if ($settings{'ACTION'} eq $Lang::tr{'save'}) { - # Open /var/ipfire/ddns/settings for writing. open(FILE, ">$settingsfile") or die "Unable to open $settingsfile."; @@ -104,9 +101,6 @@ if ($settings{'ACTION'} eq $Lang::tr{'save'}) { # Close file after writing. close(FILE); - # Unset given CGI parmas. - undef %settings; - # Update ddns config file. &GenerateDDNSConfigFile(); } @@ -115,7 +109,6 @@ if ($settings{'ACTION'} eq $Lang::tr{'save'}) { # Toggle enable/disable field. Field is in second position # if ($settings{'ACTION'} eq $Lang::tr{'toggle enable disable'}) { - # Open /var/ipfire/ddns/config for writing. open(FILE, ">$datafile") or die "Unable to open $datafile."; @@ -127,23 +120,19 @@ if ($settings{'ACTION'} eq $Lang::tr{'toggle enable disable'}) { # 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"; } @@ -151,13 +140,11 @@ if ($settings{'ACTION'} eq $Lang::tr{'toggle enable disable'}) { # Increase $id. $id++; } + undef $settings{'ID'}; # Close file after writing. close(FILE); - # Unset given CGI params. - undef %settings; - # Write out logging notice. &General::log($Lang::tr{'ddns hostname modified'}); @@ -169,7 +156,6 @@ if ($settings{'ACTION'} eq $Lang::tr{'toggle enable disable'}) { # Add new accounts, or edit existing ones. # if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang::tr{'update'})) { - # Check if a hostname has been given. if ($settings{'HOSTNAME'} eq '') { $errormessage = $Lang::tr{'hostname not set'}; @@ -187,19 +173,23 @@ if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang:: # 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')) { + if (($settings{'PASSWORD'} eq '') && ($settings{'SERVICE'} ne 'freedns.afraid.org') && ($settings{'SERVICE'} ne 'regfish.com')) { $errormessage = $Lang::tr{'password not set'}; } # Go furter if there was no error. - if ( ! $errormessage) { - + if (!$errormessage) { # Splitt hostname field into 2 parts for storrage. my($hostname, $domain) = split(/\./, $settings{'HOSTNAME'}, 2); + # Handle enabled checkbox. When the checkbox is selected a "on" will be returned, + # if the checkbox is not checked nothing is returned in this case we set the value to "off". + if ($settings{'ENABLED'} ne 'on') { + $settings{'ENABLED'} = 'off'; + } + # 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."; @@ -215,11 +205,8 @@ if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang:: # 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."; @@ -230,7 +217,6 @@ if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang:: # 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 { @@ -247,9 +233,7 @@ if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang:: # Write out notice to logfile. &General::log($Lang::tr{'ddns hostname modified'}); } - - # Unset given CGI params. - undef %settings; + undef $settings{'ID'}; # Update ddns config file. &GenerateDDNSConfigFile(); @@ -260,7 +244,6 @@ if (($settings{'ACTION'} eq $Lang::tr{'add'}) || ($settings{'ACTION'} eq $Lang:: # Remove existing accounts. # if ($settings{'ACTION'} eq $Lang::tr{'remove'}) { - # Open /var/ipfire/ddns/config for writing. open(FILE, ">$datafile") or die "Unable to open $datafile."; @@ -271,7 +254,6 @@ if ($settings{'ACTION'} eq $Lang::tr{'remove'}) { # 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) { @@ -281,13 +263,11 @@ if ($settings{'ACTION'} eq $Lang::tr{'remove'}) { # Increase id. $id++; } + undef $settings{'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'}); @@ -299,33 +279,41 @@ if ($settings{'ACTION'} eq $Lang::tr{'remove'}) { # 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); + # Handle hostname details. Only connect the values with a dott if both are available. + my $hostname; + + if (($temp[1]) && ($temp[2])) { + $hostname = "$temp[1].$temp[2]"; + } else { + $hostname = "$temp[1]"; + } + $settings{'SERVICE'} = $temp[0]; - $settings{'HOSTNAME'} = "$temp[1].$temp[2]"; + $settings{'HOSTNAME'} = $hostname; $settings{'PROXY'} = $temp[3]; $settings{'WILDCARDS'} = $temp[4]; $settings{'LOGIN'} = $temp[5]; $settings{'PASSWORD'} = $temp[6]; $settings{'ENABLED'} = $temp[7]; } - # Increase $id. - $id++; + # Increase $id. + $id++; } + + &GenerateDDNSConfigFile(); } # @@ -338,9 +326,10 @@ if ($settings{'ACTION'} eq $Lang::tr{'instant update'}) { # # Set default values. # -if (! $settings{'ACTION'}) { +if (!$settings{'ACTION'}) { $settings{'SERVICE'} = 'dyndns.org'; $settings{'ENABLED'} = 'on'; + $settings{'ID'} = ''; } &Header::openpage($Lang::tr{'dynamic dns'}, 1, ''); @@ -354,7 +343,9 @@ $checked{'BEHINDROUTER'}{'RED_IP'} = ''; $checked{'BEHINDROUTER'}{'FETCH_IP'} = ''; $checked{'BEHINDROUTER'}{$settings{'BEHINDROUTER'}} = "checked='checked'"; -$checked{'ENABLED'}{'on'} = ($settings{'ENABLED'} eq '' ) ? '' : "checked='checked'"; +$checked{'ENABLED'}{'on'} = ''; +$checked{'ENABLED'}{'off'} = ''; +$checked{'ENABLED'}{$settings{'ENABLED'}} = "checked='checked'"; # Show box for errormessages.. if ($errormessage) { @@ -404,18 +395,15 @@ my $buttontext = $Lang::tr{'add'}; # 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 { - # Otherwise use default button text and show headline for adding a new account. &Header::openbox('100%', 'left', $Lang::tr{'add a host'}); } print < @@ -431,7 +419,6 @@ END # Loop to print the providerlist. foreach my $provider (@providers) { - # Check if the current provider needs to be selected. if ($provider eq $settings{'SERVICE'}) { $selected = 'selected'; @@ -451,7 +438,7 @@ print < - + @@ -507,17 +494,32 @@ END chomp(@current); my @temp = split(/\,/,$line); + # Handle hostname details. Only connect the values with a dott if both are available. + my $hostname=""; + + if (($temp[1]) && ($temp[2])) { + $hostname="$temp[1].$temp[2]"; + } else { + $hostname="$temp[1]"; + } + # Generate value for enable/disable checkbox. - my $sync = ""; + 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]) ? "": "") ; + + # Check if the given hostname is a FQDN before doing a nslookup. + if (&General::validfqdn($hostname)) { + $sync = (&General::DyndnsServiceSync ($ip,$temp[1], $temp[2]) ? "": "") ; + } + $toggle_enabled = 'off'; } else { + $sync = ""; $gif = 'off.gif'; $gdesc = $Lang::tr{'click to enable'}; $toggle_enabled = 'on'; @@ -536,11 +538,20 @@ END $col="bgcolor='$color{'color22'}'"; } + # Handle hostname details. Only connect the values with a dott if both are available. + my $hostname=""; + + if (($temp[1]) && ($temp[2])) { + $hostname="$temp[1].$temp[2]"; + } else { + $hostname="$temp[1]"; + } + # The following HTML Code still is part of the loop. print < - +
$Lang::tr{'enabled'} $Lang::tr{'username'}
$temp[0]$sync$temp[1].$sync$temp[2]$sync$hostname
@@ -630,6 +641,7 @@ sub GenerateDDNSConfigFile { while () { my $line = $_; + chomp($line); # Generate array based on the line content (seperator is a single or multiple space's) my @settings = split(/,/, $line); @@ -639,19 +651,26 @@ sub GenerateDDNSConfigFile { next unless ($provider ~~ @providers); # Skip disabled entries. - next if ($enabled eq "off"); + next unless ($enabled eq "on"); + + # Handle hostname details. Only connect the values with a dott if both are available. + if (($hostname) && ($domain)) { + print FILE "[$hostname.$domain]\n"; + } else { + print FILE "[$hostname]\n"; + } - 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", "entrydns.net", "regfish.com"] && $username eq "token") { + if ($provider ~~ ["dns.lightningwirelabs.com", "entrydns.net", "regfish.com", + "spdns.de", "zzzz.io"] && $username eq "token") { $use_token = 1; - # Handle token auth for freedns.afraid.org. - } elsif ($provider eq "freedns.afraid.org" && $password eq "") { + # Handle token auth for freedns.afraid.org and regfish.com. + } elsif ($provider ~~ ["freedns.afraid.org", "regfish.com"] && $password eq "") { $use_token = 1; $password = $username; @@ -679,11 +698,6 @@ sub GenerateDDNSConfigFile { print FILE "password = $password\n"; } - # These providers need to be set to only use IPv4. - if ($provider ~~ ["freedns.afraid.org", "nsupdate.info", "opendns.com", "variomedia.de", "zoneedit.com"]) { - print FILE "proto = ipv4\n"; - } - print FILE "\n"; }