Handle hostnames with upper-case letters
[webmin.git] / bind8 / mass_update.cgi
1 #!/usr/local/bin/perl
2 # Change all instances of some IP 
3
4 require './bind8-lib.pl';
5 &ReadParse();
6 $conf = &get_config();
7 &error_setup($text{'umass_err'});
8
9 # Get the zones
10 foreach $d (split(/\0/, $in{'d'})) {
11         ($idx, $viewidx) = split(/\s+/, $d);
12         $zone = &get_zone_name($idx, $viewidx);
13         $zone || &error($text{'umass_egone'});
14         &can_edit_zone($zone) ||
15                 &error($text{'master_edelete'});
16         push(@zones, $zone);
17         }
18 $access{'ro'} && &error($text{'master_ero'});
19
20 # Validate inputs
21 $in{'old'} =~ s/\s+/ /g;
22 $in{'old_def'} || $in{'old'} || &error($text{'umass_eold'});
23 $in{'new'} || &error($text{'umass_enew'});
24 if ($in{'type'} eq 'A') {
25         &check_ipaddress($in{'new'}) ||
26                 &error(&text('edit_eip', $in{'new'}));
27         }
28 elsif ($in{'type'} eq 'AAAA') {
29         &check_ip6address($in{'new'}) ||
30                 &error(&text('edit_eip6', $in{'new'}));
31         }
32 elsif ($in{'type'} eq 'NS') {
33         &valname($in{'new'}) ||
34                 &error(&text('edit_ens', $in{'new'}));
35         }
36 elsif ($in{'type'} eq 'CNAME') {
37         &valname($in{'new'}) || $in{'new'} eq '@' ||
38                 &error(&text('edit_ecname', $in{'new'}));
39         }
40 elsif ($in{'type'} eq 'MX') {
41         $in{'new'} =~ /^(\d+)\s+(\S+)$/ && &valname("$2") ||
42                 &error(&text('emass_emx', $in{'new'}));
43         }
44 elsif ($in{'type'} eq 'TXT' || $in{'type'} eq 'SPF') {
45         $in{'new'} = "\"$in{'new'}\"";
46         }
47 elsif ($in{'type'} eq 'PTR') {
48         &valname($in{'new'}) ||
49                 &error(&text('edit_eptr', $in{'new'}));
50         }
51 elsif ($in{'type'} eq 'ttl') {
52         $in{'new'} =~ /^\d+$/ || 
53                 &error(&text('master_edefttl', $in{'new'}));
54         }
55
56 # Do each one
57 &ui_print_unbuffered_header(undef, $text{'umass_title'}, "");
58
59 foreach $zi (@zones) {
60         print &text('umass_doing', "<tt>$zi->{'name'}</tt>"),"<br>\n";
61         if ($zi->{'type'} ne 'master') {
62                 # Skip - not a master zone
63                 print $text{'umass_notmaster'},"<p>\n";
64                 next;
65                 }
66         $rcount = 0;
67         @recs = &read_zone_file($zi->{'file'}, $zi->{'name'});
68         $realfile = &make_chroot(&absolute_path($zi->{'file'}));
69         foreach $r (@recs) {
70                 $v = join(" ", @{$r->{'values'}});
71                 if ($r->{'type'} eq $in{'type'} &&
72                     ($v eq $in{'old'} || $in{'old_def'})) {
73                         # Found a regular record to fix
74                         &lock_file($realfile);
75                         &modify_record($zi->{'file'}, $r, $r->{'name'},
76                                        $r->{'ttl'}, $r->{'class'}, $r->{'type'},
77                                        $in{'new'}, $r->{'cmt'});
78                         $rcount++;
79                         }
80                 elsif ($in{'type'} eq 'ttl' && $r->{'defttl'}) {
81                         # Found default TTL to fix
82                         &lock_file($realfile);
83                         &modify_defttl($zi->{'file'}, $r, $in{'new'});
84                         $rcount++;
85                         }
86                 }
87         if ($rcount) {
88                 &bump_soa_record($zi->{'file'}, \@recs);
89                 &sign_dnssec_zone_if_key($zi, \@recs);
90                 print &text('umass_done', $rcount, scalar(@recs)),"<p>\n";
91                 }
92         else {
93                 print &text('umass_none', scalar(@recs)),"<p>\n";
94                 }
95         }
96
97 &unlock_all_files();
98 &webmin_log("update", "zones", scalar(@zones));
99
100 &ui_print_footer("", $text{'index_return'});
101
102 # valname(name)
103 sub valname
104 {
105 return valdnsname($_[0], 0, $in{'origin'});
106 }
107