From 8ab3cdc09cfbac3157e996664616c229214f6c8d Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Fri, 21 Oct 2011 06:03:56 -0400
Subject: [PATCH] Merged revisions 2681-2739 from 3.0.4 stable branch.
---
interface/web/dns/dns_import.php | 282 +++++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 248 insertions(+), 34 deletions(-)
diff --git a/interface/web/dns/dns_import.php b/interface/web/dns/dns_import.php
index 861c9c8..8ad3275 100644
--- a/interface/web/dns/dns_import.php
+++ b/interface/web/dns/dns_import.php
@@ -34,6 +34,8 @@
//* Check permissions for module
$app->auth->check_module_permissions('dns');
+$msg = '';
+$error = '';
// Loading the template
$app->uses('tpl,validate_dns');
@@ -120,8 +122,9 @@
// Import the zone-file
//if(1=="1")
-if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name']))
-{
+if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])){
+ $valid_zone_file = FALSE;
+
$sql = "SELECT server_name FROM `server` WHERE server_id=".intval($server_id)." OR mirror_server_id=".intval($server_id)." ORDER BY server_name ASC";
$servers = $app->db->queryAllRecords($sql);
for ($i=0;$i<count($servers);$i++)
@@ -132,24 +135,225 @@
}
}
$lines = file($_FILES['file']['tmp_name']);
+
+ // Remove empty lines, comments, whitespace, tabs, etc.
+ $new_lines = array();
+ foreach($lines as $line){
+ $line = trim($line);
+ if ($line != '' && substr($line,0,1) != ';'){
+ if(strpos($line,";") !== FALSE) $line = substr($line,0,strpos($line,";"));
+ if(strpos($line,"(") !== FALSE) $line = substr($line,0,strpos($line,"("));
+ if(strpos($line,")") !== FALSE) $line = substr($line,0,strpos($line,")"));
+ $line = trim($line);
+ if ($line != ''){
+ $sPattern = '/\s+/m';
+ $sReplace = ' ';
+ $new_lines[] = preg_replace($sPattern, $sReplace, $line);
+ }
+ }
+ }
+ unset($lines);
+ $lines = $new_lines;
+ unset($new_lines);
+
//$lines = file("apriqot.se.txt");
$name = str_replace("txt","",$_FILES['file']['name']);
$name = str_replace("zone","",$name);
- if ($domain !== NULL)
- {
+
+ if ($domain !== NULL){
$name = $domain;
- if (substr($name,strlen($name)-1) != ".")
- {
- $name .= ".";
- }
}
+
+ if (substr($name,-1) != "."){
+ $name .= ".";
+ }
+
+ $i = 0;
+ $origin_exists = FALSE;
+ $soa_array_key = -1;
+ $soa = array();
+ $soa['name'] = $name;
+ $r = 0;
+ $dns_rr = array();
+ foreach($lines as $line){
+
+ $parts = explode(' ', $line);
+
+ // make all elements lowercase
+ $new_parts = array();
+ foreach($parts as $part){
+ $new_parts[] = strtolower($part);
+ }
+ unset($parts);
+ $parts = $new_parts;
+ unset($new_parts);
+
+ // if ORIGIN exists, overwrite $soa['name']
+ if($parts[0] == '$origin'){
+ $soa['name'] = $parts[1];
+ $origin_exists = TRUE;
+ }
+ // TTL
+ if($parts[0] == '$ttl'){
+ $soa['ttl'] = intval($parts[1]);
+ }
+ // SOA
+ if(in_array("soa", $parts)){
+ $soa['mbox'] = array_pop($parts);
+ //$soa['ns'] = array_pop($parts);
+ $soa['ns'] = $servers[0]['server_name'];
+ // if domain is part of SOA, overwrite $soa['name']
+ if($parts[0] != '@' && $parts[0] != 'in' && $parts[0] != 'soa' && $origin_exists === FALSE){
+ $soa['name'] = $parts[0];
+ }
+ $soa_array_key = $i;
+ $valid_zone_file = TRUE;
+ }
+ // SERIAL
+ if($i == ($soa_array_key + 1)) $soa['serial'] = intval($parts[0]);
+ // REFRESH
+ if($i == ($soa_array_key + 2)) $soa['refresh'] = intval($parts[0]);
+ // RETRY
+ if($i == ($soa_array_key + 3)) $soa['retry'] = intval($parts[0]);
+ // EXPIRE
+ if($i == ($soa_array_key + 4)) $soa['expire'] = intval($parts[0]);
+ // MINIMUM
+ if($i == ($soa_array_key + 5)) $soa['minimum'] = intval($parts[0]);
+ // RESOURCE RECORDS
+ if($i > ($soa_array_key + 5)){
+ if(substr($parts[0],-1) == '.' || $parts[0] == '@' || ($parts[0] != 'a' && $parts[0] != 'aaaa' && $parts[0] != 'ns' && $parts[0] != 'cname' && $parts[0] != 'hinfo' && $parts[0] != 'mx' && $parts[0] != 'naptr' && $parts[0] != 'ptr' && $parts[0] != 'rp' && $parts[0] != 'srv' && $parts[0] != 'txt')){
+ if(is_numeric($parts[1])){
+ if($parts[2] == 'in'){
+ $resource_type = $parts[3];
+ $pkey = 3;
+ } else {
+ $resource_type = $parts[2];
+ $pkey = 2;
+ }
+ } else {
+ if($parts[1] == 'in'){
+ $resource_type = $parts[2];
+ $pkey = 2;
+ } else {
+ $resource_type = $parts[1];
+ $pkey = 1;
+ }
+ }
+ $dns_rr[$r]['type'] = $resource_type;
+ if($parts[0] == '@' || $parts[0] == '.'){
+ $dns_rr[$r]['name'] = $soa['name'];
+ } else {
+ $dns_rr[$r]['name'] = $parts[0];
+ }
+ if(is_numeric($parts[1])){
+ $dns_rr[$r]['ttl'] = intval($parts[1]);
+ } else {
+ $dns_rr[$r]['ttl'] = $soa['ttl'];
+ }
+ switch ($resource_type) {
+ case 'mx':
+ case 'srv':
+ $dns_rr[$r]['aux'] = intval($parts[$pkey+1]);
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+2));
+ break;
+ default:
+ $dns_rr[$r]['aux'] = 0;
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+1));
+ }
+ } else {
+ // a 3600 IN A 1.2.3.4
+ if(is_numeric($parts[1]) && $parts[2] == 'in' && ($parts[3] == 'a' || $parts[3] == 'aaaa' || $parts[3] == 'ns'|| $parts[3] == 'cname' || $parts[3] == 'hinfo' || $parts[3] == 'mx' || $parts[3] == 'naptr' || $parts[3] == 'ptr' || $parts[3] == 'rp' || $parts[3] == 'srv' || $parts[3] == 'txt')){
+ $resource_type = $parts[3];
+ $pkey = 3;
+ $dns_rr[$r]['type'] = $resource_type;
+ $dns_rr[$r]['name'] = $parts[0];
+ $dns_rr[$r]['ttl'] = intval($parts[1]);
+ switch ($resource_type) {
+ case 'mx':
+ case 'srv':
+ $dns_rr[$r]['aux'] = intval($parts[$pkey+1]);
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+2));
+ break;
+ default:
+ $dns_rr[$r]['aux'] = 0;
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+1));
+ }
+ }
+ // a IN A 1.2.3.4
+ elseif($parts[1] == 'in' && ($parts[2] == 'a' || $parts[2] == 'aaaa' || $parts[2] == 'ns'|| $parts[2] == 'cname' || $parts[2] == 'hinfo' || $parts[2] == 'mx' || $parts[2] == 'naptr' || $parts[2] == 'ptr' || $parts[2] == 'rp' || $parts[2] == 'srv' || $parts[2] == 'txt')){
+ $resource_type = $parts[2];
+ $pkey = 2;
+ $dns_rr[$r]['type'] = $resource_type;
+ $dns_rr[$r]['name'] = $parts[0];
+ $dns_rr[$r]['ttl'] = $soa['ttl'];
+ switch ($resource_type) {
+ case 'mx':
+ case 'srv':
+ $dns_rr[$r]['aux'] = intval($parts[$pkey+1]);
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+2));
+ break;
+ default:
+ $dns_rr[$r]['aux'] = 0;
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+1));
+ }
+ }
+ // a 3600 A 1.2.3.4
+ elseif(is_numeric($parts[1]) && ($parts[2] == 'a' || $parts[2] == 'aaaa' || $parts[2] == 'ns'|| $parts[2] == 'cname' || $parts[2] == 'hinfo' || $parts[2] == 'mx' || $parts[2] == 'naptr' || $parts[2] == 'ptr' || $parts[2] == 'rp' || $parts[2] == 'srv' || $parts[2] == 'txt')){
+ $resource_type = $parts[2];
+ $pkey = 2;
+ $dns_rr[$r]['type'] = $resource_type;
+ $dns_rr[$r]['name'] = $parts[0];
+ $dns_rr[$r]['ttl'] = intval($parts[1]);
+ switch ($resource_type) {
+ case 'mx':
+ case 'srv':
+ $dns_rr[$r]['aux'] = intval($parts[$pkey+1]);
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+2));
+ break;
+ default:
+ $dns_rr[$r]['aux'] = 0;
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+1));
+ }
+ }
+ // A 1.2.3.4
+ // MX 10 mail
+ // TXT "v=spf1 a mx ptr -all"
+ else {
+ $resource_type = $parts[0];
+ $pkey = 0;
+ $dns_rr[$r]['type'] = $resource_type;
+ $dns_rr[$r]['name'] = $soa['name'];
+ $dns_rr[$r]['ttl'] = $soa['ttl'];
+ switch ($resource_type) {
+ case 'mx':
+ case 'srv':
+ $dns_rr[$r]['aux'] = intval($parts[$pkey+1]);
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+2));
+ break;
+ default:
+ $dns_rr[$r]['aux'] = 0;
+ $dns_rr[$r]['data'] = implode(' ',array_slice($parts, $pkey+1));
+ }
+ }
+ }
+ $dns_rr[$r]['type'] = strtoupper($dns_rr[$r]['type']);
+ if($dns_rr[$r]['type'] == 'NS' && $dns_rr[$r]['name'] == $soa['name']){
+ unset($dns_rr[$r]);
+ }
+ $r++;
+ }
+ $i++;
+ }
+
+ /*
$i = 0;
$r = 0;
$s = 0;
$dns_rr = array();
foreach ($lines as $line)
{
- if (substr($line,0,1)!=';'&&substr($line,0,1)!='$')
+ $line = trim($line);
+ if ($line != '' && substr($line,0,1) != ';' && substr($line,0,1) != '$')
{
$line = str_replace("\n",NULL,$line);
$i++;
@@ -174,22 +378,24 @@
else if ($s == 4)
$soa['expire'] = $line;
else if ($s == 5)
- $soa['ttl'] = $line;
+ $soa['minimum'] = $line;
}
}
else
{
$line = str_replace("\t",",",$line);
+ $line = str_replace(" ",",",$line);
$recs = explode(",",$line);
foreach ($recs as $key => $rec)
{
$rec = trim($rec);
+ if($rec == '') continue;
//name type data aux ttl active
if ($key == 0)
{
- if ($rec == '@' || $rec == "")
+ if ($rec == '@')
{
$rec = $name;
}
@@ -203,7 +409,7 @@
}
else if ($key > $typekey[$r])
{
- if ($rec != ""&&$rec != "(")
+ if ($rec != "" && $rec != "(")
{
$rec = explode(" ",$rec);
@@ -261,19 +467,20 @@
}
}
+ */
- foreach ($servers as $server)
- {
- $dns_rr[$r]['name']=$name;
- $dns_rr[$r]['type']='NS';
+ foreach ($servers as $server){
+ $dns_rr[$r]['name'] = $soa['name'];
+ $dns_rr[$r]['type'] = 'NS';
$dns_rr[$r]['data'] = $server['server_name'];
$dns_rr[$r]['aux'] = 0;
-
$r++;
}
- print('<pre>');
- print_r($dns_rr);
- print('</pre>');
+ //print('<pre>');
+ //print_r($dns_rr);
+ //print('</pre>');
+
+
// Insert the soa record
$sys_userid = $_SESSION['s']['user']['userid'];
$origin = $app->db->quote($soa['name']);
@@ -282,33 +489,40 @@
$refresh = $app->db->quote($soa['refresh']);
$retry = $app->db->quote($soa['retry']);
$expire = $app->db->quote($soa['expire']);
- $minimum = $app->db->quote($soa['ttl']);
+ $minimum = $app->db->quote($soa['minimum']);
$ttl = $app->db->quote($soa['ttl']);
$xfer = $app->db->quote('');
$serial = $app->db->quote(intval($soa['serial'])+1);
+ //print_r($soa);
+ //die();
+ if($valid_zone_file){
+ $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `origin`, `ns`, `mbox`, `serial`, `refresh`, `retry`, `expire`, `minimum`, `ttl`, `active`, `xfer`) VALUES
+ ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$origin', '$ns', '$mbox', '$serial', '$refresh', '$retry', '$expire', '$minimum', '$ttl', 'Y', '$xfer')";
+ $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
- $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `origin`, `ns`, `mbox`, `serial`, `refresh`, `retry`, `expire`, `minimum`, `ttl`, `active`, `xfer`) VALUES
- ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$origin', '$ns', '$mbox', '$serial', '$refresh', '$retry', '$expire', '$minimum', '$ttl', 'Y', '$xfer')";
- $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
-
- // Insert the dns_rr records
- if(is_array($dns_rr) && $dns_soa_id > 0)
- {
- foreach($dns_rr as $rr)
+ // Insert the dns_rr records
+ if(is_array($dns_rr) && $dns_soa_id > 0)
{
- $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `zone`, `name`, `type`, `data`, `aux`, `ttl`, `active`) VALUES
- ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$dns_soa_id', '$rr[name]', '$rr[type]', '$rr[data]', '$rr[aux]', '$rr[ttl]', 'Y')";
- $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
+ foreach($dns_rr as $rr)
+ {
+ $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `zone`, `name`, `type`, `data`, `aux`, `ttl`, `active`) VALUES
+ ('$sys_userid', '$sys_groupid', 'riud', 'riud', '', '$server_id', '$dns_soa_id', '$rr[name]', '$rr[type]', '$rr[data]', '$rr[aux]', '$rr[ttl]', 'Y')";
+ $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
+ }
}
+ $msg .= $app->lng('zone_file_successfully_imported_txt');
+ } else {
+ $error .= $app->lng('error_no_valid_zone_file_txt');
}
-
- header('Location: /dns/dns_soa_edit.php?id='.$dns_soa_id);
+ //header('Location: /dns/dns_soa_edit.php?id='.$dns_soa_id);
}
+
$app->tpl->setVar('msg',$msg);
$app->tpl->setVar('error',$error);
$app->tpl->setVar("title",'Import Zone Files');
+$app->tpl->setVar("zonefile_to_import_txt",$app->lng('zonefile_to_import_txt'));
$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dns_wizard.lng';
include($lng_file);
--
Gitblit v1.9.1