Added support for multi-value options, thanks to a patch from Luke Suchocki.
Also added support for multi-value options within a bracketed expression.
Hostname, IP address and MAC address clashes are now only checked for in the same shared network.
+---- Changes since 1.530 ----
+Multiple leases can now be deleted at once, thanks to a suggestion from Berni Elbourn.
+++ /dev/null
-#!/usr/local/bin/perl
-# delete_lease.cgi
-# Delete one lease from the leases file
-
-require './dhcpd-lib.pl';
-&ReadParse();
-
-%access = &get_module_acl();
-&error_setup($text{'eacl_aviol'});
-if( !($access{'w_leases'} && $access{'r_leases'}) ) {
- &error("$text{'eacl_np'} $text{'eacl_pdl'}");
- }
-
-&tokenize_file($config{'lease_file'}, \@tok);
-$i = $j = 0;
-while($i < @tok) {
- $lease = &parse_struct(\@tok, \$i, $j++, $config{'lease_file'});
- if ($lease->{'index'} == $in{'idx'}) {
- # found the one to delete!
- &lock_file($config{'lease_file'});
- $lref = &read_file_lines($config{'lease_file'});
- splice(@$lref, $lease->{'line'},
- $lease->{'eline'} - $lease->{'line'} + 1);
- &flush_file_lines();
- &unlock_file($config{'lease_file'});
- &restart_dhcpd();
- &webmin_log("delete", "lease", $lease->{'values'}->[0]);
- last;
- }
- }
-&redirect("list_leases.cgi?all=$in{'all'}&network=$in{'network'}&netmask=$in{'netmask'}");
-
--- /dev/null
+#!/usr/local/bin/perl
+# Delete multiple leases
+
+require './dhcpd-lib.pl';
+&ReadParse();
+
+%access = &get_module_acl();
+&error_setup($text{'listl_err'});
+if( !($access{'w_leases'} && $access{'r_leases'}) ) {
+ &error("$text{'eacl_np'} $text{'eacl_pdl'}");
+ }
+@d = split(/\0/, $in{'d'});
+@d || &error($text{'listl_enone'});
+
+# Find the leases to remove
+&tokenize_file($config{'lease_file'}, \@tok);
+$i = $j = 0;
+while($i < @tok) {
+ $lease = &parse_struct(\@tok, \$i, $j++, $config{'lease_file'});
+ if (&indexof($lease->{'index'}, @d) >= 0) {
+ push(@todelete, $lease);
+ }
+ }
+
+# Delete them, in reverse order so that line numbers aren't messed up
+&lock_file($config{'lease_file'});
+$lref = &read_file_lines($config{'lease_file'});
+foreach $lease (reverse(@todelete)) {
+ splice(@$lref, $lease->{'line'},
+ $lease->{'eline'} - $lease->{'line'} + 1);
+ }
+&flush_file_lines($config{'lease_file'});
+&unlock_file($config{'lease_file'});
+
+&restart_dhcpd();
+&webmin_log("delete", "lease", $lease->{'values'}->[0]);
+&redirect("list_leases.cgi?all=$in{'all'}&network=$in{'network'}&netmask=$in{'netmask'}");
+
listl_end=End Date
listl_return=network and host list
listl_all=List all active and expired leases
-listl_delete2=Click on a lease IP address from the list below to delete it.
+listl_delete=Delete Selected Leases
listl_unknown=Unknown
listl_allocs=$1 IP addresses available, $2 allocated ($3 %)
listl_mode=Display mode :
listl_size=Total IPs
listl_used=Allocated
listl_pc=Percentage
+listl_err=Failed to deleted leases
+listl_enone=None selected
restart_errmsg1=Failed to restart dhcpd
restart_errmsg2=Failed to signal process
}
# Table header, with sorting
- print "<b>$text{'listl_delete2'}</b><br>\n";
+ @tds = ( "width=5" );
+ print &ui_form_start("delete_leases.cgi", "post");
+ print &ui_hidden("all", $in{'all'});
+ print &ui_hidden("network", $in{'network'});
+ print &ui_hidden("netmask", $in{'netmask'});
+ @links = ( &select_all_link("d"), &select_invert_link("d") );
+ print &ui_links_row(\@links);
print &ui_columns_start([
+ "",
&sort_link("ipaddr"),
&sort_link("ether"),
&sort_link("host"),
&sort_link("start"),
&sort_link("end"),
- ]);
+ ], 100, 0, \@tds);
foreach $lease (@leases) {
local @cols;
local $starts = &find('starts', $mems);
local $ends = &find('ends', $mems);
local $ht = $lease->{'expired'} ? "i" : "tt";
- push(@cols, "<$ht><a href='delete_lease.cgi?".
- "idx=$lease->{'index'}&all=$in{all}&".
- "network=$in{'network'}&netmask=$in{'netmask'}'>".
- "$lease->{'values'}->[0]</a></$ht>");
+ push(@cols, "<$ht>$lease->{'values'}->[0]</$ht>");
local $hard = &find('hardware', $mems);
push(@cols,$hard->{'values'}->[1] ?
"<tt>$hard->{'values'}->[1]</tt>" :
$client->{'values'}->[0])."</tt>"
: undef);
if ($config{'lease_tz'}) {
- local @st = localtime($lease->{'stime'});
- local @et = localtime($lease->{'etime'});
- $s = sprintf "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d", $st[5]+1900, $st[4]+1, $st[3], $st[2], $st[1], $st[0];
- $e = sprintf "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d", $et[5]+1900, $et[4]+1, $et[3], $et[2], $et[1], $et[0];
+ $s = &make_date($lease->{'stime'});
+ $e = &make_date($lease->{'etime'});
}
else {
$s = $starts->{'values'}->[1]." ".
push(@cols, "<tt>$s</tt>");
push(@cols, "<tt>$e</tt>");
- print &ui_columns_row(\@cols);
+ print &ui_checked_columns_row(\@cols, \@tds, "d",
+ $lease->{'index'});
}
print &ui_columns_end();
+ print &ui_form_end([ [ undef, $text{'listl_delete'} ] ]);
}
else {
print "<b>",&text($in{'all'} ? 'listl_lfnotcont' :