X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=html%2Fcgi-bin%2Fdhcp.cgi;h=a089a61a2e9bf9222c9a41e8f03939899b532cc0;hb=87bee81c561562c61324769313414fcff5704176;hp=9157cac01f7675aa5fe13948ebfc2b94dc7d3878;hpb=943a96faed4fb515259c18d04b330ba622490b7b;p=people%2Fpmueller%2Fipfire-2.x.git
diff --git a/html/cgi-bin/dhcp.cgi b/html/cgi-bin/dhcp.cgi
index 9157cac01f..a089a61a2e 100644
--- a/html/cgi-bin/dhcp.cgi
+++ b/html/cgi-bin/dhcp.cgi
@@ -20,6 +20,7 @@
###############################################################################
use strict;
+use experimental 'smartmatch';
# enable only the following on debugging purpose
#use warnings;
@@ -70,11 +71,17 @@ foreach my $itf (@ITFs) {
$dhcpsettings{"NTP2_${itf}"} = '';
$dhcpsettings{"NEXT_${itf}"} = '';
$dhcpsettings{"FILE_${itf}"} = '';
+ $dhcpsettings{"DNS_UPDATE_KEY_NAME_${itf}"} = '';
+ $dhcpsettings{"DNS_UPDATE_KEY_SECRET_${itf}"} = '';
+ $dhcpsettings{"DNS_UPDATE_KEY_ALGO_${itf}"} = '';
}
$dhcpsettings{'SORT_FLEASELIST'} = 'FIPADDR';
$dhcpsettings{'SORT_LEASELIST'} = 'IPADDR';
+# DNS Update settings
+$dhcpsettings{'DNS_UPDATE_ENABLED'} = 'off';
+
#Settings2 for editing the multi-line list
#Must not be saved with writehash !
$dhcpsettings{'FIX_MAC'} = '';
@@ -244,7 +251,7 @@ if ($dhcpsettings{'ACTION'} eq $Lang::tr{'save'}) {
} # enabled
}#loop interface verify
- map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2'); # Must not be saved
+ map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2','q'); # Must not be saved
&General::writehash($setting, \%dhcpsettings); # Save good settings
$dhcpsettings{'ACTION'} = $Lang::tr{'save'}; # create an 'ACTION'
map ($dhcpsettings{$_} = '',@nosaved,'KEY1','KEY2'); # and reinit vars to empty
@@ -267,7 +274,7 @@ if ($ENV{'QUERY_STRING'} =~ /^FETHER|^FIPADDR/ ) {
$newsort.=$Rev;
}
$dhcpsettings{'SORT_FLEASELIST'}=$newsort;
- map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2'); # Must never be saved
+ map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2', 'q'); # Must never be saved
&General::writehash($setting, \%dhcpsettings);
&sortcurrent2;
$dhcpsettings{'ACTION'} = 'SORT'; # create an 'ACTION'
@@ -437,15 +444,23 @@ if ($dhcpsettings{'ACTION'} eq $Lang::tr{'add'}.'2') {
$dhcpsettings{'FIX_ROOTPATH'} = &Header::cleanhtml($dhcpsettings{'FIX_ROOTPATH'});
if ($dhcpsettings{'KEY2'} eq '') { #add or edit ?
unshift (@current2, "$dhcpsettings{'FIX_MAC'},$dhcpsettings{'FIX_ADDR'},$dhcpsettings{'FIX_ENABLED'},$dhcpsettings{'FIX_NEXTADDR'},$dhcpsettings{'FIX_FILENAME'},$dhcpsettings{'FIX_ROOTPATH'},$dhcpsettings{'FIX_REMARK'}\n");
+ open(FILE, ">$filename2") or die 'Unable to open fixed lease file.';
+ print FILE @current2;
+ close(FILE);
&General::log($Lang::tr{'fixed ip lease added'});
+
+ # Enter edit mode
+ $dhcpsettings{'KEY2'} = 0;
} else {
@current2[$dhcpsettings{'KEY2'}] = "$dhcpsettings{'FIX_MAC'},$dhcpsettings{'FIX_ADDR'},$dhcpsettings{'FIX_ENABLED'},$dhcpsettings{'FIX_NEXTADDR'},$dhcpsettings{'FIX_FILENAME'},$dhcpsettings{'FIX_ROOTPATH'},$dhcpsettings{'FIX_REMARK'}\n";
$dhcpsettings{'KEY2'} = ''; # End edit mode
&General::log($Lang::tr{'fixed ip lease modified'});
+
+ # sort newly added/modified entry
+ &sortcurrent2;
}
#Write changes to dhcpd.conf.
- &sortcurrent2; # sort newly added/modified entry
&buildconf; # before calling buildconf which use fixed lease file !
}
}
@@ -544,39 +559,39 @@ print <
$Lang::tr{'ip address'} $Lang::tr{'netmask'}: $netsettings{"${itf}_ADDRESS"} $netsettings{"${itf}_NETMASK"}
- $Lang::tr{'start address'}
+ $Lang::tr{'start address'}
- $Lang::tr{'end address'}
+ $Lang::tr{'end address'}
- $Lang::tr{'default lease time'}
+ $Lang::tr{'default lease time'}
- $Lang::tr{'max lease time'}
+ $Lang::tr{'max lease time'}
- $Lang::tr{'domain name suffix'}
+ $Lang::tr{'domain name suffix'}
$Lang::tr{'dhcp allow bootp'}:
- $Lang::tr{'primary dns'}
+ $Lang::tr{'primary dns'}
- $Lang::tr{'secondary dns'}
+ $Lang::tr{'secondary dns'}
- $Lang::tr{'primary ntp server'}:
+ $Lang::tr{'primary ntp server'}:
- $Lang::tr{'secondary ntp server'}:
+ $Lang::tr{'secondary ntp server'}:
- $Lang::tr{'primary wins server address'}:
+ $Lang::tr{'primary wins server address'}:
- $Lang::tr{'secondary wins server address'}:
+ $Lang::tr{'secondary wins server address'}:
- next-server:
+ next-server:
- filename:
+ filename:
@@ -588,12 +603,83 @@ END
print <
- $Lang::tr{'this field may be blank'}
+ $Lang::tr{'required field'}
$warnNTPmessage
-
-
+
+END
+;
+&Header::closebox();
+
+# DHCP DNS update support (RFC2136)
+&Header::openbox('100%', 'left', $Lang::tr{'dhcp dns update'});
+
+my %checked = ();
+$checked{'DNS_UPDATE_ENABLED'}{'on'} = ( $dhcpsettings{'DNS_UPDATE_ENABLED'} ne 'on') ? '' : "checked='checked'";
+
+print <
+
+ $Lang::tr{'dhcp dns enable update'}
+
+
+
+
+
+
+END
+;
+ my @domains = ();
+
+ # Print options for each interface.
+ foreach my $itf (@ITFs) {
+ # Check if DHCP for this interface is enabled.
+ if ($dhcpsettings{"ENABLE_${itf}"} eq 'on') {
+ # Check for same domain name.
+ next if ($dhcpsettings{"DOMAIN_NAME_${itf}"} ~~ @domains);
+ my $lc_itf = lc($itf);
+
+ # Select previously configured update algorithm.
+ my %selected = ();
+ $selected{'DNS_UPDATE_ALGO_${inf}'}{$dhcpsettings{'DNS_UPDATE_ALGO_${inf}'}} = 'selected';
+
+print <
+
+
+
+ $dhcpsettings{"DOMAIN_NAME_${itf}"}
+
+
+ $Lang::tr{'dhcp dns key name'}:
+
+ $Lang::tr{'dhcp dns update secret'}:
+
+ $Lang::tr{'dhcp dns update algo'}:
+
+
+
+ HMAC-MD5
+
+
+
+END
+;
+ }
+
+ # Store configured domain based on the interface
+ # in the temporary variable.
+ push(@domains, $dhcpsettings{"DOMAIN_NAME_${itf}"});
+}
+print <
+
+
END
;
@@ -623,13 +709,13 @@ if ($opt ne '') {
}
print <
- $Lang::tr{'dhcp advopt name'}:
+ $Lang::tr{'dhcp advopt name'}:
- $Lang::tr{'dhcp advopt value'}:
+ $Lang::tr{'dhcp advopt value'}:
$opt
$Lang::tr{'enabled'}
- $Lang::tr{'dhcp advopt scope'}:
+ $Lang::tr{'dhcp advopt scope'}:
END
;
@@ -650,8 +736,8 @@ print <
- $Lang::tr{'this field may be blank'}
-
+ $Lang::tr{'required field'}
+
@@ -862,8 +948,26 @@ END
;
#Edited line number (KEY2) passed until cleared by 'save' or 'remove' or 'new sort order'
+# Search for static leases
+my $search_query = $dhcpsettings{'q'};
+
+if (scalar @current2 >= 10) {
+ print <
+
+
+
+END
+}
+
print <
$Lang::tr{'mac address'}
@@ -919,6 +1023,14 @@ foreach my $line (@current2) {
$gdesc = $Lang::tr{'click to enable'};
}
+ # Skip all entries that do not match the search query
+ if ($search_query ne "") {
+ if (!grep(/$search_query/, @temp)) {
+ $key++;
+ next;
+ }
+ }
+
if ($dhcpsettings{'KEY2'} eq $key) {
print " ";
$col="bgcolor='${Header::colouryellow}'";
@@ -1103,9 +1215,19 @@ sub buildconf {
flock(FILE, 2);
# Global settings
- print FILE "ddns-update-style none;\n";
print FILE "deny bootp; #default\n";
print FILE "authoritative;\n";
+
+ # DNS Update settings
+ if ($dhcpsettings{'DNS_UPDATE_ENABLED'} eq 'on') {
+ print FILE "ddns-updates on;\n";
+ print FILE "ddns-update-style interim;\n";
+ print FILE "ddns-ttl 60; # 1 min\n";
+ print FILE "ignore client-updates;\n";
+ print FILE "update-static-leases on;\n";
+ } else {
+ print FILE "ddns-update-style none;\n";
+ }
# Write first new option definition
foreach my $line (@current1) {
@@ -1134,12 +1256,13 @@ sub buildconf {
}
}# on
}# foreach line
+ print FILE "\n";
#Subnet range definition
foreach my $itf (@ITFs) {
my $lc_itf=lc($itf);
if ($dhcpsettings{"ENABLE_${itf}"} eq 'on' ){
- print FILE "\nsubnet " . $netsettings{"${itf}_NETADDRESS"} . " netmask ". $netsettings{"${itf}_NETMASK"} . " #$itf\n";
+ print FILE "subnet " . $netsettings{"${itf}_NETADDRESS"} . " netmask ". $netsettings{"${itf}_NETMASK"} . " #$itf\n";
print FILE "{\n";
print FILE "\trange " . $dhcpsettings{"START_ADDR_${itf}"} . ' ' . $dhcpsettings{"END_ADDR_${itf}"}.";\n" if ($dhcpsettings{"START_ADDR_${itf}"});
print FILE "\toption subnet-mask " . $netsettings{"${itf}_NETMASK"} . ";\n";
@@ -1155,7 +1278,7 @@ sub buildconf {
print FILE ", " . $dhcpsettings{"WINS2_${itf}"} if ($dhcpsettings{"WINS2_${itf}"});
print FILE ";\n" if ($dhcpsettings{"WINS1_${itf}"});
print FILE "\tnext-server " . $dhcpsettings{"NEXT_${itf}"} . ";\n" if ($dhcpsettings{"NEXT_${itf}"});
- print FILE "\tfilename \"" . $dhcpsettings{"FILE_${itf}"} . "\";\n" if ($dhcpsettings{"FILE_${itf}"});
+ print FILE "\tfilename \"" . &EscapeFilename($dhcpsettings{"FILE_${itf}"}) . "\";\n" if ($dhcpsettings{"FILE_${itf}"});
print FILE "\tdefault-lease-time " . ($dhcpsettings{"DEFAULT_LEASE_TIME_${itf}"} * 60). ";\n";
print FILE "\tmax-lease-time " . ($dhcpsettings{"MAX_LEASE_TIME_${itf}"} * 60) . ";\n";
print FILE "\tallow bootp;\n" if ($dhcpsettings{"ENABLEBOOTP_${itf}"} eq 'on');
@@ -1176,7 +1299,18 @@ sub buildconf {
}
}# on
}# foreach line
- print FILE "} #$itf\n";
+ print FILE "} #$itf\n\n";
+
+ if (($dhcpsettings{"DNS_UPDATE_ENABLED"} eq "on") && ($dhcpsettings{"DNS_UPDATE_KEY_NAME_${itf}"} ne "")) {
+ print FILE "key " . $dhcpsettings{"DNS_UPDATE_KEY_NAME_${itf}"} . " {\n";
+ print FILE "\talgorithm " . $dhcpsettings{"DNS_UPDATE_KEY_ALGO_${itf}"} . ";\n";
+ print FILE "\tsecret \"" . $dhcpsettings{"DNS_UPDATE_KEY_SECRET_${itf}"} . "\";\n";
+ print FILE "};\n\n";
+
+ print FILE "zone " . $dhcpsettings{"DOMAIN_NAME_${itf}"} . ". {\n";
+ print FILE "\tkey " . $dhcpsettings{"DNS_UPDATE_KEY_NAME_${itf}"} . ";\n";
+ print FILE "}\n\n";
+ }
system ('/usr/bin/touch', "${General::swroot}/dhcp/enable_${lc_itf}");
&General::log("DHCP on ${itf}: " . $Lang::tr{'dhcp server enabled'})
@@ -1197,7 +1331,7 @@ sub buildconf {
print FILE "\thardware ethernet $temp[0];\n";
print FILE "\tfixed-address $temp[1];\n";
print FILE "\tnext-server $temp[3];\n" if ($temp[3]);
- print FILE "\tfilename \"$temp[4]\";\n" if ($temp[4]);
+ print FILE "\tfilename \"" . &EscapeFilename($temp[4]) . "\";\n" if ($temp[4]);
print FILE "\toption root-path \"$temp[5]\";\n" if ($temp[5]);
print FILE "}\n";
$key++;
@@ -1207,7 +1341,7 @@ sub buildconf {
close FILE;
if ( $dhcpsettings{"ENABLE_GREEN"} eq 'on' || $dhcpsettings{"ENABLE_BLUE"} eq 'on' ) {system '/usr/local/bin/dhcpctrl enable >/dev/null 2>&1';}
else {system '/usr/local/bin/dhcpctrl disable >/dev/null 2>&1';}
- system '/usr/local/bin/dhcpctrl restart >/dev/null 2>&1';
+ system '/usr/local/bin/dhcpctrl restart >/dev/null 2>&1 &';
}
#
@@ -1264,3 +1398,12 @@ sub IsUsedNewOptionDefinition {
}
return 0;
}
+
+sub EscapeFilename($) {
+ my $filename = shift;
+
+ # Replace all single / by \/
+ $filename =~ s/\//\\\//g;
+
+ return $filename;
+}