# File which contains the ca-certificates.
my $ca_certs_file = "/etc/ssl/certs/ca-bundle.crt";
+# Server which is used, to determine if the whole DNS system works properly.
+my $dns_test_server = "ping.ipfire.org";
+
+my $check_servers;
+
my %color = ();
my %mainsettings = ();
&General::readhash("${General::swroot}/main/settings", \%mainsettings);
# Read-in generic settings.
&General::readhash("$settings_file", \%settings);
+ # Check if an IP-address has been given.
+ if ($cgiparams{"NAMESERVER"} eq "") {
+ $errormessage = "$Lang::tr{'dns no address given'}";
+ }
+
# Check if the given DNS server is valid.
- if(!&General::validip($cgiparams{"NAMESERVER"})) {
+ elsif(!&General::validip($cgiparams{"NAMESERVER"})) {
$errormessage = "$Lang::tr{'invalid ip'}: $cgiparams{'NAMESERVER'}";
}
}
}
- # Check the nameserver.
- my $status = &check_nameserver("$cgiparams{'NAMESERVER'}", "ping.ipfire.org", "$settings{'PROTO'}", "$cgiparams{'TLS_HOSTNAME'}");
-
- # Assign errormessage, if the nameserver does not support dnssec or any other kind of error happened.
- if ($status eq "0") {
- $errormessage = "$Lang::tr{'dns could not add server'} $Lang::tr{'dnssec not supported'}";
- } elsif (($status ne "1") && ($status ne "2")) {
- $errormessage = "$Lang::tr{'dns could not add server'} $status";
- }
-
# Go further if there was no error.
if ( ! $errormessage) {
# Check if a remark has been entered.
# Write the changed hash to the config file.
&General::writehasharray($servers_file, \%dns_servers);
+
+## Handle request to check the servers.
+#
+} elsif ($cgiparams{'SERVERS'} eq $Lang::tr{'dns check servers'}) {
+ $check_servers = 1;
}
# Hash to store the generic DNS settings.
# Section to display the configured and used DNS servers.
#
sub show_nameservers () {
- &Header::openbox('100%', 'center', "DNS-Servers");
+ &Header::openbox('100%', 'center', "$Lang::tr{'dns title'}");
+
+ my $dns_status_string;
+ my $dns_status_col;
+
+ # Test if the DNS system is working.
+ #
+ # Simple send a request to unbound and check if it can resolve the
+ # DNS test server.
+ my $dns_status_ret = &check_nameserver("127.0.0.1", "$dns_test_server", "UDP");
+
+ if ($dns_status_ret eq "2") {
+ $dns_status_string = "$Lang::tr{'working'}";
+ $dns_status_col = "${Header::colourgreen}";
+ } else {
+ $dns_status_string = "$Lang::tr{'broken'} status: $dns_status_ret";
+ $dns_status_col = "${Header::colourred}";
+ }
print <<END;
+ <table width='100%'>
+ <tr>
+ <td>
+ <strong>$Lang::tr{'status'}: </strong>
+ <strong><font color='$dns_status_col'>$dns_status_string</font></strong>
+ </td>
+ </tr>
+ </table>
+
+ <br>
+
<table class="tbl" width='100%'>
<tr>
<td align="center">
<td align="center">
<strong>$Lang::tr{'remark'}</strong>
</td>
-
+END
+ # Check if the status should be displayed.
+ if ($check_servers) {
+print <<END
<td align="center">
<strong>$Lang::tr{'status'}</strong>
</td>
+END
+;
+ }
+
+print <<END
<td align="center" colspan="3">
<strong>$Lang::tr{'action'}</strong>
</td>
</tr>
END
+;
# Check the usage of ISP assigned nameservers is enabled.
my $id = 1;
my $status_colour;
# Only grab the status if the nameserver is enabled.
- if ($enabled eq "enabled") {
+ if (($check_servers) && ($enabled eq "enabled")) {
$status = &check_nameserver("$nameserver", "ping.ipfire.org", "$settings{'PROTO'}", "$tls_hostname");
}
<td align="center" $col>
$remark
</td>
-
- <td align="center" $col>
- <strong><font color="$status_colour"><abbr title="$status_message">$status_short</abbr></font></strong>
- </td>
END
;
+ # Display server status if requested.
+ if ($check_servers) {
+print <<END
+ <td align="center" $col>
+ <strong><font color="$status_colour"><abbr title="$status_message">$status_short</abbr></font></strong>
+ </td>
+END
+;
+ }
+
# Check if the id is greater than "2".
#
# Nameservers with an ID's of one or two are ISP assigned,
print <<END;
<tr>
<form method="post" action="$ENV{'SCRIPT_NAME'}">
- <td colspan="9" align="right"><input type="submit" name="SERVERS" value="$Lang::tr{'add'}"></td>
+ <td colspan="9" align="right">
+ <input type="submit" name="SERVERS" value="$Lang::tr{'add'}">
+ <input type="submit" name="SERVERS" value="$Lang::tr{'dns check servers'}">
+ </td>
</form>
</tr>
</table>
sub check_nameserver($$$$) {
my ($nameserver, $record, $proto, $tls_hostname) = @_;
+ # Check if the system is online.
+ unless (&red_is_active()) {
+ return "$Lang::tr{'system is offline'}";
+ }
+
# Default values.
my @command = ("kdig", "+timeout=2", "+retry=0", "+dnssec",
"+bufsize=1232");