###############################################################################
use strict;
+use experimental 'smartmatch';
# enable only the following on debugging purpose
#use warnings;
# 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 = '';
# 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.";
# Close file after writing.
close(FILE);
- # Unset given CGI parmas.
- undef %settings;
-
# Update ddns config file.
&GenerateDDNSConfigFile();
}
# 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.";
# 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++;
}
+ 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'});
# 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'};
# 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.";
# 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.";
# 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 {
# 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();
# 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.";
# 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) {
# 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'});
# 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();
}
#
#
# 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, '');
$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) {
# 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 <<END
-
<form method='post' action='$ENV{'SCRIPT_NAME'}'>
<input type='hidden' name='ID' value='$settings{'ID'}' />
<table width='100%'>
# 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';
<tr>
<td class='base'>$Lang::tr{'enabled'}</td>
- <td><input type='checkbox' name='ENABLED' value='on' $checked{'ENABLED'}{'on'} /></td>
+ <td><input type='checkbox' name='ENABLED' $checked{'ENABLED'}{'on'} /></td>
<td class='base'>$Lang::tr{'username'}</td>
<td><input type='text' name='LOGIN' value='$settings{'LOGIN'}' /></td>
</tr>
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 = "<font color='blue'>";
+ 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]) ? "<font color='green'>": "<font color='red'>") ;
+
+ # Check if the given hostname is a FQDN before doing a nslookup.
+ if (&General::validfqdn($hostname)) {
+ $sync = (&General::DyndnsServiceSync ($ip,$temp[1], $temp[2]) ? "<font color='green'>": "<font color='red'>") ;
+ }
+
$toggle_enabled = 'off';
} else {
+ $sync = "<font color='blue'>";
$gif = 'off.gif';
$gdesc = $Lang::tr{'click to enable'};
$toggle_enabled = 'on';
$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 <<END;
<tr>
<td align='center' $col><a href='http://$temp[0]'>$temp[0]</a></td>
- <td align='center' $col>$sync$temp[1].$sync$temp[2]</td>
+ <td align='center' $col>$sync$hostname</td>
<td align='center' $col><form method='post' action='$ENV{'SCRIPT_NAME'}'>
<input type='hidden' name='ID' value='$id'>
while (<SETTINGS>) {
my $line = $_;
+ chomp($line);
# Generate array based on the line content (seperator is a single or multiple space's)
my @settings = split(/,/, $line);
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") {
+ # Check if token based auth is configured.
+ if ($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.
+ if ($provider ~~ ["freedns.afraid.org", "regfish.com"] && $password eq "") {
$use_token = 1;
$password = $username;
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";
}