From 425c04d339e8d80b67fbf7e90ba398e9ebf17b8a Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Tue, 9 Nov 2010 00:44:27 -0800 Subject: [PATCH] Mass record deletion button --- bind8/CHANGELOG | 2 ++ bind8/index.cgi | 6 ++-- bind8/lang/en | 19 ++++++++++++ bind8/mass_delete.cgi | 12 +++++--- bind8/mass_rdelete.cgi | 61 +++++++++++++++++++++++++++++++++++++ bind8/mass_rdelete_form.cgi | 42 +++++++++++++++++++++++++ 6 files changed, 136 insertions(+), 6 deletions(-) create mode 100755 bind8/mass_rdelete.cgi create mode 100755 bind8/mass_rdelete_form.cgi diff --git a/bind8/CHANGELOG b/bind8/CHANGELOG index 2fdd6c790..b45fa6ae0 100644 --- a/bind8/CHANGELOG +++ b/bind8/CHANGELOG @@ -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. diff --git a/bind8/index.cgi b/bind8/index.cgi index 7a2441e2d..3124377cd 100755 --- a/bind8/index.cgi +++ b/bind8/index.cgi @@ -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 { diff --git a/bind8/lang/en b/bind8/lang/en index bc494d0f1..e2537520a 100644 --- a/bind8/lang/en +++ b/bind8/lang/en @@ -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 diff --git a/bind8/mass_delete.cgi b/bind8/mass_delete.cgi index b9f248a63..1e7871d03 100755 --- a/bind8/mass_delete.cgi +++ b/bind8/mass_delete.cgi @@ -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 index 000000000..3c89ad122 --- /dev/null +++ b/bind8/mass_rdelete.cgi @@ -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', "$zi->{'name'}"),"
\n"; + if ($zi->{'type'} ne 'master') { + # Skip - not a master zone + print $text{'umass_notmaster'},"

\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)),"

\n"; + } + else { + print &text('rdmass_none', scalar(@recs)),"

\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 index 000000000..7e1a34566 --- /dev/null +++ b/bind8/mass_rdelete_form.cgi @@ -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'}."
", + $text{'rdmass_sel'})); + +# Value to delete +print &ui_table_row($text{'rdmass_value'}, + &ui_opt_textbox("value", undef, 30, $text{'rdmass_vall'}."
", + $text{'rdmass_vsel'})); + +print &ui_table_end(); +print &ui_form_end([ [ "rdelete", $text{'rdmass_ok'} ] ]); + +&ui_print_footer("", $text{'index_return'});