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.
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
$access{'delete'} ?
( [ "delete", $text{'index_massdelete'} ] ) : ( ),
[ "update", $text{'index_massupdate'} ],
- [ "create", $text{'index_masscreate'} ] ]);
+ [ "create", $text{'index_masscreate'} ],
+ [ "rdelete", $text{'index_massrdelete'} ], ]);
}
}
else {
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
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
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
&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;
}
--- /dev/null
+#!/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'});
+
--- /dev/null
+#!/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'});