Handle hostnames with upper-case letters
[webmin.git] / bind8 / save_gen.cgi
1 #!/usr/local/bin/perl
2 # save_gen.cgi
3 # Save $generate records
4
5 require './bind8-lib.pl';
6 &ReadParse();
7 $access{'gen'} || &error($text{'gen_ecannot'});
8 $zone = &get_zone_name($in{'index'}, $in{'view'});
9 $dom = $zone->{'name'};
10 &can_edit_zone($zone) ||
11         &error($text{'recs_ecannot'});
12 $file = $zone->{'file'};
13 @recs = &read_zone_file($file, $dom);
14 @gens = grep { $_->{'generate'} } @recs;
15
16 if ($in{'show'}) {
17         # Just show what would be generated
18         $desc = &text('recs_header', &ip6int_to_net(&arpa_to_ip($dom)));
19         &ui_print_header($desc, $text{'gen_title2'}, "",
20                          undef, undef, undef, undef, &restart_links($zone));
21
22         print &ui_columns_start([ $text{'recs_name'}, $text{'recs_type'},
23                                   $text{'recs_ttl'}, $text{'recs_vals'},
24                                   $text{'gen_raw'} ], 100);
25         foreach $g (@gens) {
26                 @gv = @{$g->{'generate'}};
27                 if ($gv[0] =~ /^(\d+)-(\d+)\/(\d+)$/) {
28                         $start = $1; $end = $2; $skip = $3;
29                         }
30                 elsif ($gv[0] =~ /^(\d+)-(\d+)$/) {
31                         $start = $1; $end = $2; $skip = 1;
32                         }
33                 else { next; }
34                 for($i=$start; $i<=$end; $i+=$skip) {
35                         $lhs = $gv[1];
36                         $lhs =~ s/\$\$/\0/g;
37                         $lhs =~ s/\$/$i/g;
38                         $lhs =~ s/\0/\$/g;
39                         $lhsfull = $lhs =~ /\.$/ ? $lhs :
40                                     $dom eq "." ? "$lhs." : "$lhs.$dom";
41
42                         $rhs = $gv[3];
43                         $rhs =~ s/\$\$/\0/g;
44                         $rhs =~ s/\$/$i/g;
45                         $rhs =~ s/\0/\$/g;
46                         $rhsfull = $rhs =~ /\.$/ ? $rhs :
47                                     $dom eq "." ? "$rhs." : "$rhs.$dom";
48
49                         print &ui_columns_row([
50                                 &arpa_to_ip($lhsfull), $gv[2],
51                                 $text{'default'}, &arpa_to_ip($rhsfull),
52                                 "<tt>$lhs IN $gv[2] $rhs</tt>" ]);
53                         }
54                 }
55         print &ui_columns_end();
56
57         &ui_print_footer("edit_master.cgi?index=$in{'index'}&view=$in{'view'}",
58                 $text{'master_return'});
59         exit;
60         }
61
62 # Parse and validate inputs
63 &error_setup($text{'gen_err'});
64 for($i=0; defined($in{"type_$i"}); $i++) {
65         if ($in{"type_$i"}) {
66                 local @gv;
67                 $in{"start_$i"} =~ /^\d+$/ ||
68                         &error(&text('gen_estart', $i+1));
69                 $in{"stop_$i"} =~ /^\d+$/ ||
70                         &error(&text('gen_estop', $i+1));
71                 $in{"start_$i"} <= $in{"stop_$i"} ||
72                         &error(&text('gen_erange', $i+1));
73                 $in{"skip_$i"} =~ /^\d*$/ ||
74                         &error(&text('gen_eskip', $i+1));
75                 push(@gv, $in{"start_$i"}."-".$in{"stop_$i"});
76                 if ($in{"skip_$i"}) {
77                         $gv[$#gv] .= "/".$in{"skip_$i"};
78                         }
79                 $in{"name_$i"} =~ /^[A-Za-z0-9\.\-$uscore$star\$]+$/ ||
80                         &error(&text('gen_ename', $i+1));
81                 push(@gv, $in{"name_$i"});
82                 push(@gv, $in{"type_$i"});
83                 $in{"value_$i"} =~ /^[A-Za-z0-9\.\-$uscore$star\$]+$/ ||
84                         &error(&text('gen_evalue', $i+1));
85                 push(@gv, $in{"value_$i"});
86                 push(@gv, $in{"cmt_$i"}) if ($in{"cmt_$i"});
87                 if ($i < @gens) {
88                         &modify_generator($gens[$i]->{'file'}, $gens[$i], @gv);
89                         }
90                 else {
91                         &create_generator($file, @gv);
92                         }
93                 }
94         else {
95                 if ($i < @gens) {
96                         &delete_generator($gens[$i]->{'file'}, $gens[$i]);
97                         foreach $g (@gens) {
98                                 if ($g->{'line'} > $gens[$i]->{'line'}) {
99                                         $g->{'line'}--;
100                                         }
101                                 }
102                         }
103                 }
104         }
105 &bump_soa_record($file, \@recs);
106 &sign_dnssec_zone_if_key($zone, \@recs);
107 &redirect("edit_master.cgi?index=$in{'index'}&view=$in{'view'}");
108