⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 save_record.cgi

📁 Unix下基于Web的管理工具
💻 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 + -