Allow muliple lease deletion
authorJamie Cameron <jcameron@webmin.com>
Mon, 21 Feb 2011 21:00:06 +0000 (13:00 -0800)
committerJamie Cameron <jcameron@webmin.com>
Mon, 21 Feb 2011 21:00:06 +0000 (13:00 -0800)
dhcpd/CHANGELOG
dhcpd/delete_lease.cgi [deleted file]
dhcpd/delete_leases.cgi [new file with mode: 0755]
dhcpd/lang/en
dhcpd/list_leases.cgi

index 7975fcc..128953f 100644 (file)
@@ -39,3 +39,5 @@ When applying the configuration fails with an error mentioning a line in the con
 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.
diff --git a/dhcpd/delete_lease.cgi b/dhcpd/delete_lease.cgi
deleted file mode 100755 (executable)
index d873446..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/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'}");
-
diff --git a/dhcpd/delete_leases.cgi b/dhcpd/delete_leases.cgi
new file mode 100755 (executable)
index 0000000..e692161
--- /dev/null
@@ -0,0 +1,38 @@
+#!/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'}");
+
index 34d5a26..e5cdce6 100644 (file)
@@ -152,7 +152,7 @@ listl_start=Start Date
 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 :
@@ -161,6 +161,8 @@ listl_mode_1=Subnets and usage
 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
index 6c6029f..f9caf86 100755 (executable)
@@ -163,14 +163,21 @@ else {
                        }
 
                # 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;
@@ -178,10 +185,7 @@ else {
                        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>" :
@@ -191,10 +195,8 @@ else {
                                              $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]." ".
@@ -205,9 +207,11 @@ else {
 
                        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' :