Mass record deletion button
authorJamie Cameron <jcameron@webmin.com>
Tue, 9 Nov 2010 08:44:27 +0000 (00:44 -0800)
committerJamie Cameron <jcameron@webmin.com>
Tue, 9 Nov 2010 08:44:27 +0000 (00:44 -0800)
bind8/CHANGELOG
bind8/index.cgi
bind8/lang/en
bind8/mass_delete.cgi
bind8/mass_rdelete.cgi [new file with mode: 0755]
bind8/mass_rdelete_form.cgi [new file with mode: 0755]

index 2fdd6c7..b45fa6a 100644 (file)
@@ -119,3 +119,5 @@ Added new NSEC3 algorithms for DNSSEC.
 Changed the default DNSSEC algorithm from DSA to the stronger RSASHA1.
 ---- Changes since 1.510 ----
 On Linux systems, /dev/urandom is used for generating entropy for DNSSEC.
+---- Changes since 1.520 ----
+Added the Delete Records In Selected button to the main page, for removing the same record in multiple domains at once.
index 7a2441e..3124377 100755 (executable)
@@ -237,7 +237,8 @@ elsif (@zones && (!@views || !$config{'by_view'})) {
        print &ui_form_end([ $access{'delete'} ?
                              ( [ "delete", $text{'index_massdelete'} ] ) : ( ),
                             [ "update", $text{'index_massupdate'} ],
-                            [ "create", $text{'index_masscreate'} ] ]);
+                            [ "create", $text{'index_masscreate'} ],
+                            [ "rdelete", $text{'index_massrdelete'} ] ]);
        }
 elsif (@zones) {
        # Show zones under views
@@ -304,7 +305,8 @@ elsif (@zones) {
                        $access{'delete'} ?
                          ( [ "delete", $text{'index_massdelete'} ] ) : ( ),
                        [ "update", $text{'index_massupdate'} ],
-                       [ "create", $text{'index_masscreate'} ] ]);
+                       [ "create", $text{'index_masscreate'} ],
+                       [ "rdelete", $text{'index_massrdelete'} ], ]);
                }
        }
 else {
index bc494d0..e253752 100644 (file)
@@ -57,6 +57,7 @@ index_all=All zones
 index_massdelete=Delete Selected
 index_massupdate=Update Records in Selected
 index_masscreate=Add Record to Selected
+index_massrdelete=Delete Records in Selected
 index_bind=BIND
 
 master_title=Edit Master Zone
@@ -760,6 +761,7 @@ log_rndc=Setup RNDC
 log_delete_recs=Deleted $1 records
 log_delete_zones=Deleted $1 zones
 log_update_zones=Updated records in $1 zones
+log_rdelete_zones=Deleted records in $1 zones
 log_freeze=Froze zone $1
 log_thaw=Un-froze zone $1
 log_zonekeyon=Enabled DNSSEC for zone $1
@@ -981,6 +983,23 @@ umass_none=.. no matching records out of $1 to update found.
 umass_egone=Zone does not exist
 emass_emx='$1' is not a mail server priority number followed by a valid hostname
 
+rdmass_err=Failed to delete records in zones
+rdmass_enone=None selected
+rdmass_title=Delete Records in Zones
+rdmass_header=Mass record delete details
+rdmass_type=Record type to delete
+rdmass_name=Name of record to delete
+rdmass_all=All records of this type
+rdmass_value=Value of records to delete
+rdmass_vall=All matching name and type
+rdmass_vsel=Records with value
+rdmass_doing=Deleting records in zone $1 ..
+rdmass_ename=No record name to delete entered
+rdmass_done=.. deleted $1 matching records out of $2.
+rdmass_none=.. no matching records out of $1 to delete found.
+rdmass_ok=Delete Records
+rdmass_sel=Records named
+
 rmass_err=Failed to add records
 rmass_enone=None selected
 rmass_title=Add Record to Zones
index b9f248a..1e7871d 100755 (executable)
@@ -5,16 +5,20 @@ require './bind8-lib.pl';
 &ReadParse();
 $conf = &get_config();
 
+$dparams = join("&", map { "d=".&urlize($_) } split(/\0/, $in{'d'}));
 if ($in{'update'}) {
        # Redirect to mass update form
-       &redirect("mass_update_form.cgi?".
-                 join("&", map { "d=".&urlize($_) } split(/\0/, $in{'d'})));
+       &redirect("mass_update_form.cgi?".$dparams);
        exit;
        }
 elsif ($in{'create'}) {
        # Redirect to mass create form
-       &redirect("mass_rcreate_form.cgi?".
-                 join("&", map { "d=".&urlize($_) } split(/\0/, $in{'d'})));
+       &redirect("mass_rcreate_form.cgi?".$dparams);
+       exit;
+       }
+elsif ($in{'rdelete'}) {
+       # Redirect to mass record delete form
+       &redirect("mass_rdelete_form.cgi?".$dparams);
        exit;
        }
 
diff --git a/bind8/mass_rdelete.cgi b/bind8/mass_rdelete.cgi
new file mode 100755 (executable)
index 0000000..3c89ad1
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/local/bin/perl
+# Delete all records of some type with some name
+
+require './bind8-lib.pl';
+&ReadParse();
+$conf = &get_config();
+&error_setup($text{'umass_err'});
+
+# Get the zones
+foreach $d (split(/\0/, $in{'d'})) {
+       ($idx, $viewidx) = split(/\s+/, $d);
+       $zone = &get_zone_name($idx, $viewidx);
+       $zone || &error($text{'umass_egone'});
+       &can_edit_zone($zone) ||
+               &error($text{'master_edelete'});
+       push(@zones, $zone);
+       }
+$access{'ro'} && &error($text{'master_ero'});
+$in{'name_def'} || $in{'name'} || &error($text{'rdmass_ename'});
+
+# Do each one
+&ui_print_unbuffered_header(undef, $text{'rdmass_title'}, "");
+
+foreach $zi (@zones) {
+       print &text('rdmass_doing', "<tt>$zi->{'name'}</tt>"),"<br>\n";
+       if ($zi->{'type'} ne 'master') {
+               # Skip - not a master zone
+               print $text{'umass_notmaster'},"<p>\n";
+               next;
+               }
+       $rcount = 0;
+       @recs = &read_zone_file($zi->{'file'}, $zi->{'name'});
+       $realfile = &make_chroot(&absolute_path($zi->{'file'}));
+       foreach $r (reverse(@recs)) {
+               $shortname = $r->{'name'};
+               $shortname =~ s/\.$zi->{'name'}\.$//;
+               $v = join(" ", @{$r->{'values'}});
+               if ($r->{'type'} eq $in{'type'} &&
+                   ($shortname eq $in{'name'} || $in{'name_def'}) &&
+                   ($v eq $in{'value'} || $in{'value_def'})) {
+                       # Found a record to delete
+                       &lock_file($realfile);
+                       &delete_record($zi->{'file'}, $r);
+                       $rcount++;
+                       }
+               }
+       if ($rcount) {
+               &bump_soa_record($zi->{'file'}, \@recs);
+               &sign_dnssec_zone_if_key($zi, \@recs);
+               print &text('rdmass_done', $rcount, scalar(@recs)),"<p>\n";
+               }
+       else {
+               print &text('rdmass_none', scalar(@recs)),"<p>\n";
+               }
+       }
+
+&unlock_all_files();
+&webmin_log("rdelete", "zones", scalar(@zones));
+
+&ui_print_footer("", $text{'index_return'});
+
diff --git a/bind8/mass_rdelete_form.cgi b/bind8/mass_rdelete_form.cgi
new file mode 100755 (executable)
index 0000000..7e1a345
--- /dev/null
@@ -0,0 +1,42 @@
+#!/usr/local/bin/perl
+# Show a form for deleting a record in multiple zones
+
+require './bind8-lib.pl';
+&ReadParse();
+&error_setup($text{'rdmass_err'});
+@d = split(/\0/, $in{'d'});
+@d || &error($text{'rdmass_enone'});
+
+&ui_print_header(undef, $text{'rdmass_title'}, "");
+
+print &ui_form_start("mass_rdelete.cgi", "post");
+foreach $d (@d) {
+       print &ui_hidden("d", $d),"\n";
+       $dc++;
+       }
+print &ui_table_start($text{'rdmass_header'}, undef, 2);
+
+# Number of domains selected
+print &ui_table_row($text{'umass_sel'}, $dc);
+
+# Type to delete
+@rtypes = ( 'A', 'CNAME', 'NS', 'MX', 'PTR', 'TXT', 'SPF',
+           $config{'support_aaaa'} ? ( "AAAA" ) : ( ) );
+print &ui_table_row($text{'rdmass_type'},
+       &ui_select("type", "A",
+                  [ map { [ $_, $text{'recs_'.$_} ] } @rtypes ]));
+
+# Name to delete
+print &ui_table_row($text{'rdmass_name'},
+           &ui_opt_textbox("name", undef, 30, $text{'rdmass_all'}."<br>",
+                           $text{'rdmass_sel'}));
+
+# Value to delete
+print &ui_table_row($text{'rdmass_value'},
+           &ui_opt_textbox("value", undef, 30, $text{'rdmass_vall'}."<br>",
+                           $text{'rdmass_vsel'}));
+
+print &ui_table_end();
+print &ui_form_end([ [ "rdelete", $text{'rdmass_ok'} ] ]);
+
+&ui_print_footer("", $text{'index_return'});