📄 save_record.cgi
字号:
#!/usr/local/bin/perl# save_record.cgi# Adds or updates a record of some typerequire './bind8-lib.pl';&ReadParse();%access = &get_module_acl();&can_edit_zone(\%access, $in{'origin'}) || &error($text{'recs_ecannot'});$access{'ro'} && &error($text{'master_ero'});@recs = &read_zone_file($in{'file'}, $in{'origin'});&error_setup($text{'edit_err'});# get the old record if needed$r = $recs[$in{'num'}] if (defined($in{'num'}));# check for deletionif ($in{'delete'}) { &delete_record($r->{'file'}, $r); &bump_soa_record($in{'file'}, \@recs); ($orevconf, $orevfile, $orevrec) = &find_reverse($in{'oldvalue0'}); if ($in{'rev'} && $orevrec && &can_edit_reverse($orevconf) && $in{'oldname'} eq $orevrec->{'values'}->[0] && $in{'oldvalue0'} eq &arpa_to_ip($orevrec->{'name'})) { &delete_record($orevrec->{'file'} , $orevrec); @orrecs = &read_zone_file($orevfile, $orevconf->{'value'}); &bump_soa_record($orevfile, \@orrecs); } &redirect("edit_recs.cgi?index=$in{'index'}&type=$in{'type'}"); exit; }# parse inputsif (!$in{'ttl_def'}) { $in{'ttl'} =~ /^\d+[MHDW]?$/ || &error(&text('edit_ettl', $in{'ttl'})); $ttl = $in{'ttl'}; }$vals = $in{'value0'};for($i=1; defined($in{"value$i"}); $i++) { $vals .= " ".$in{"value$i"}; }if ($in{'type'} eq "PTR") { # a reverse address &check_ipaddress($in{'name'}) || &error(&text('edit_eip', $in{'name'})); $name = &ip_to_arpa($in{'name'}); &valname($in{'value0'}) || &error(&text('edit_ehost', $vals[0])); if ($in{'value0'} !~ /\.$/) { $vals .= "."; } }else { # some other kind of record $in{'name'} eq "" || &valname($in{'name'}) || &error(&text('edit_ename', $in{'name'})); if ($in{'type'} eq "A") { &check_ipaddress($vals) || &error(&text('edit_eip', $vals)); if (!$access{'multiple'}) { # Is this address already in use? Search all domains # to find out.. $conf = &get_config(); @zl = &find("zone", $conf); foreach $z (@zl) { $typed = &find("type", $z->{'members'}) || next; next if ($typed->{'value'} ne "master"); next if ($z->{'value'} =~ /in-addr.arpa/i); $file = &find("file", $z->{'members'})->{'value'}; @frecs = &read_zone_file($file, $z->{'value'}); foreach $fr (@frecs) { if ($fr->{'type'} eq "A" && $fr->{'values'}->[0] eq $vals && $fr->{'name'} ne $r->{'name'}) { &error(&text('edit_edupip', $vals)); } } } } } elsif ($in{'type'} eq "NS") { &valname($vals) || &error(&text('edit_ens', $vals)); } elsif ($in{'type'} eq "CNAME") { &valname($vals) || &error(&text('edit_ecname', $vals)); } elsif ($in{'type'} eq "MX") { $in{'value1'} =~ /^[A-z0-9\-\.\*]+$/ || &error(&text('edit_emx', $in{'value1'})); $in{'value0'} =~ /^\d+$/ || &error(&text('edit_epri', $in{'value0'})); } elsif ($in{'type'} eq "HINFO") { $in{'value0'} =~ /^\S+$/ || &error($text{'edit_ehard'}); $in{'value1'} =~ /^\S+$/ || &error($text{'edit_eos'}); } elsif ($in{'type'} eq "TXT") { $vals = "\"$in{'value0'}\""; } elsif ($in{'type'} eq "WKS") { &check_ipaddress($in{'value0'}) || &error(&text('edit_eip', $in{'value0'})); if (!$in{'value2'}) { &error($text{'edit_eserv'}); } @ws = split(/[\r\n]+/, $in{'value2'}); $vals = "$in{'value0'} $in{'value1'} ("; foreach $ws (@ws) { $vals .= "\n\t\t\t\t\t$ws"; } $vals .= " )"; } elsif ($in{'type'} eq "RP") { $in{'value0'} =~ /^(\S+)\@(\S+)$/ || &error(&text('edit_eemail', $in{'value0'})); &valname($in{'value1'}) || &error(&text('edit_etxt', $in{'value1'})); $in{'value0'} =~ s/\@/\./g; $vals = "$in{'value0'} $in{'value1'}"; } $name = $in{'name'} eq "" ? "$in{'origin'}." : $in{'name'} !~ /\.$/ ? "$in{'name'}.$in{'origin'}." : $in{'name'}; }if ($in{'new'}) { # just adding a new record &create_record($in{'file'}, $name, $ttl, "IN", $in{'type'}, $vals); ($revconf, $revfile, $revrec) = &find_reverse($in{'value0'}); if ($in{'rev'} && $revconf && !$revrec && &can_edit_reverse($revconf)) { # Add a reverse record if we are the master for the reverse # domain, and if there is not already a reverse record # for the address. &create_record($revfile, &ip_to_arpa($in{'value0'}), $ttl, "IN", "PTR", $name); @rrecs = &read_zone_file($revfile, $revconf->{'value'}); &bump_soa_record($revfile, \@rrecs); } }else { # updating an existing record ($orevconf, $orevfile, $orevrec) = &find_reverse($in{'oldvalue0'}); ($revconf, $revfile, $revrec) = &find_reverse($in{'value0'}); &modify_record($r->{'file'}, $r, $name, $ttl, "IN", $in{'type'},$vals); if ($in{'rev'} && $orevrec && &can_edit_reverse($orevconf) && $in{'oldname'} eq $orevrec->{'values'}->[0] && $in{'oldvalue0'} eq &arpa_to_ip($orevrec->{'name'})) { # Updating the reverse record. Either the name, address # or both may have changed. Furthermore, the reverse record # may now be in a different file! @orrecs = &read_zone_file($orevfile, $orevconf->{'value'}); @rrecs = &read_zone_file($revfile, $revconf->{'value'}); if ($revconf eq $orevconf && &can_edit_reverse($revconf)) { # old and new in the same file &modify_record($orevrec->{'file'} , $orevrec, &ip_to_arpa($in{'value0'}), $orevrec->{'ttl'}, "IN", "PTR", $name); &bump_soa_record($orevfile, \@orrecs); } elsif ($revconf && &can_edit_reverse($revconf)) { # old and new in different files &delete_record($orevrec->{'file'} , $orevrec); &create_record($revfile, &ip_to_arpa($in{'value0'}), $orevrec->{'ttl'}, "IN", "PTR", $name); &bump_soa_record($orevfile, \@orrecs); &bump_soa_record($revfile, \@rrecs); } else { # we don't handle the new reverse domain.. lose the # reverse record &delete_record($orevrec->{'file'}, $orevrec); &bump_soa_record($orevfile, \@orrecs); } } }&bump_soa_record($in{'file'}, \@recs);&redirect("edit_recs.cgi?index=$in{'index'}&type=$in{'type'}");sub valname{return $_[0] =~ /[A-z0-9\-\.]+$/;}# can_edit_reverse(&zone)sub can_edit_reverse{return $access{'reverse'} || &can_edit_zone(\%access, $_[0]->{'value'});}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -