diff --git a/library/NGNPro/Records/DnsZones.php b/library/NGNPro/Records/DnsZones.php index 255d7e2..c372e53 100644 --- a/library/NGNPro/Records/DnsZones.php +++ b/library/NGNPro/Records/DnsZones.php @@ -1,863 +1,903 @@ array( 'type'=>'integer', 'help' => 'Zone owner' ) ); var $Fields = array( 'customer' => array( 'type' => 'integer', 'help' => 'Zone owner' ), 'serial' => array( 'type' => 'integer', 'help' => 'Serial number', 'readonly' => 1 ), 'email' => array( 'type' => 'string', 'help' => 'Administrator address' ), 'ttl' => array( 'type' => 'integer', 'help' => 'Time to live of SOA record' ), 'minimum' => array( 'type' => 'integer', 'help' => 'Default time to live period' ), 'retry' => array( 'type' => 'integer', 'help' => 'Retry transfer period' ), 'expire' => array( 'type' => 'integer', 'help' => 'Expire period' ), 'info' => array( 'type' => 'string', 'help' => 'Zone description' ) ); public function __construct($SoapEngine) { dprint("init DnsZones"); $this->filters = array( 'name' => trim($_REQUEST['name_filter']), 'info' => trim($_REQUEST['info_filter']) ); parent::__construct($SoapEngine); $this->sortElements = array( 'changeDate' => 'Change date', 'name' => 'Name' ); $this->Fields['nameservers'] = array( 'type'=>'text', 'name'=>'Name servers', 'help'=>'Authoritative name servers' ); } function showAfterEngineSelection() { if ($this->SoapEngine->name_servers) { //printf(" Available name servers: %s", $this->SoapEngine->name_servers); } } function listRecords() { $this->showSeachForm(); // Filter $filter = array( 'name' => $this->filters['name'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range = array( 'start' => intval($this->next), 'count' => intval($this->maxrowsperpage) ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array('attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query = array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ($this->checkLogSoapError($result, true)) { return false; } else { $this->rows = $result->total; if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') { $this->showActionsForm(); } print <<< END
$this->rows records found

END; if (!$this->next) $this->next=0; if ($this->rows > $this->maxrowsperpage) { $maxrows = $this->maxrowsperpage + $this->next; if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage; } else { $maxrows = $this->rows; } $i=0; if ($this->rows) { while ($i < $maxrows) { if (!$result->zones[$i]) break; $zone = $result->zones[$i]; - $index = $this->next+$i+1; + $base_url_data = array( + 'service' => $this->SoapEngine->service, + 'name_filter' => $zone->name + ); + + $delete_url_data = array_merge( + $base_url_data, + array( + 'action' => 'Delete' + ) + ); + $zone_url_data = $base_url_data; + $records_url_data = array( + 'service' => sprintf('dns_records@%s', $this->SoapEngine->service), + 'zone_filter' => $zone->name + ); - $_url = $this->url.sprintf("&service=%s&action=Delete&name_filter=%s", - urlencode($this->SoapEngine->service), - urlencode($zone->name) + $customer_url_data = array( + 'service' => sprintf('dns_records@%s', $this->SoapEngine->service), + 'customer_filter' => $zone->customer ); - if ($this->adminonly) $_url.= sprintf("&reseller_filter=%s", $zone->reseller); + $index = $this->next + $i + 1; + + if ($this->adminonly) { + $delete_url_data['reseller_filter'] = $zone->reseller; + $zone_url_data['reseller_filter'] = $zone->reseller; + $records_url_data['reseller_filter'] = $zone->reseller; + } if ($_REQUEST['action'] == 'Delete' && $_REQUEST['name_filter'] == $zone->name) { - $_url .= "&confirm=1"; + $delete_url_data['confirm'] = 1; $actionText = "Confirm"; } else { $actionText = "Delete"; } - $zone_url = sprintf('%s&service=%s&name_filter=%s', - $this->url, - $this->SoapEngine->service, - $zone->name + + $_url = sprintf( + "%s&%s", + $this->url, + http_build_query($delete_url_data) ); - $records_url = $this->url.sprintf("&service=dns_records@%s&zone_filter=%s", - urlencode($this->SoapEngine->soapEngine), - urlencode($zone->name) + $zone_url = sprintf( + "%s&%s", + $this->url, + http_build_query($zone_url_data) ); - if ($this->adminonly) $zone_url .= sprintf("&reseller_filter=%s", $zone->reseller); - if ($this->adminonly) $records_url .= sprintf("&reseller_filter=%s", $zone->reseller); + $records_url = sprintf( + "%s&%s", + $this->url, + http_build_query($records_url_data) + ); - $customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s", - urlencode($this->SoapEngine->customer_engine), - urlencode($zone->customer) + $customer_url = sprintf( + "%s&%s", + $this->url, + http_build_query($customer_url_data) ); + sort($zone->nameservers); - $ns_text=''; + $ns_text = ''; foreach ($zone->nameservers as $ns) { $ns_text.= $ns." "; } printf( " ", $index, $customer_url, $zone->customer, $zone->reseller, $zone_url, $zone->name, $zone->email, $zone->info, $records_url, $zone->serial, $zone->ttl, $zone->changeDate, $_url, $actionText ); print ""; $i++; } } print "
Id Owner Zone Administrator Info Serial Default TTL Change date Actions
%s %s.%s %s %s %s Records %s %s %s %s
"; if ($this->rows == 1) { $this->showRecord($zone); } else { $this->showPagination($maxrows); } return true; } } function deleteRecord($dictionary = array()) { if (!$dictionary['confirm'] && !$_REQUEST['confirm']) { print "

Please press on Confirm to confirm the delete. "; return true; } if (!strlen($this->filters['name'])) { print "

Error: missing Dns zone name "; return false; } $name = $this->filters['name']; $function = array( 'commit' => array( 'name' => 'deleteZone', 'parameters' => array($name), 'logs' => array( 'success' => sprintf('Dns zone %s has been deleted', $this->filters['name']) ) ) ); unset($this->filters); $result = $this->SoapEngine->execute($function, $this->html); if ($this->checkLogSoapError($result, true)) { return false; } else { return true; } } function showAddForm() { if ($this->selectionActive) return; printf( "

", $_SERVER['PHP_SELF'] ); print "
"; print ""; $this->showCustomerTextBox(); printf( "
DNS zone
", $_REQUEST['name'] ); $this->printHiddenFormElements(); print <<< END Import DNS zones from file:
Select file Change Remove
END; print "
"; } function addRecord($dictionary = array()) { $name = trim($_REQUEST['name']); $info = trim($_REQUEST['info']); $name_servers = trim($_REQUEST['name_servers']); if ($_FILES['import_file']['tmp_name']) { $content = fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']); //print_r($content); if (!$imported_data = json_decode($content, true)) { printf("

Error: reading imported data. "); return false; } //print_r($imported_data); if (!in_array('dns_zones', array_keys($imported_data))) { printf("

Error: Missing zones in imported data. "); return false; } if (!in_array('dns_records', array_keys($imported_data))) { return false; printf("

Error: Missing records in imported data. "); } foreach ($imported_data['customers'] as $customer) { // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth); $customer['credit'] = floatval($customer['credit']); $customer['balance'] = floatval($customer['balance']); // Call function $this->log_action('addAccount'); $result = $this->SoapEngine->soapclientCustomers->addAccount($customer); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 5001) { $result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer); if (!$this->checkLogSoapError($result, true, true)) { printf('

Customer %s has been updated', $customer['id']); } } else { - $log = sprintf("SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring); + $log = sprintf( + "SOAP request error from %s: %s (%s): %s", + $this->SoapEngine->SOAPurl, + $error_msg, + $error_fault->detail->exception->errorcode, + $error_fault->detail->exception->errorstring + ); syslog(LOG_NOTICE, $log); printf("

Error: $log"); } } else { printf('

Customer %s has been added', $customer['id']); } } $name_servers = array(); foreach ($imported_data['dns_zones'] as $zone) { flush(); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addZone'); $result = $this->SoapEngine->soapclient->addZone($zone); $name_servers[$zone['name']] = $zone['nameservers']; if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 7001) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateZone'); $result = $this->SoapEngine->soapclient->updateZone($zone); if (!$this->checkLogSoapError($result, true, true)) { printf('

Zone %s has been updated', $zone['name']); } } else { - $log = sprintf("SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring); + $log = sprintf( + "SOAP request error from %s: %s (%s): %s", + $this->SoapEngine->SOAPurl, + $error_msg, + $error_fault->detail->exception->errorcode, + $error_fault->detail->exception->errorstring + ); syslog(LOG_NOTICE, $log); printf("

Error: $log"); } } else { printf('

Zone %s has been added', $zone['name']); } } $added = 0; $updated = 0; foreach ($imported_data['dns_records'] as $record) { flush(); if (in_array($record['name'], $name_servers[$record['zone']]) && $record['type'] == "A") { continue; } $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('addRecord'); $result = $this->SoapEngine->soapclient->addRecord($record); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); if ($error_fault->detail->exception->errorcode == 7003) { $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('updateRecord'); $result = $this->SoapEngine->soapclient->updateRecord($record); if (!$this->checkLogSoapError($result, true, true)) { $added += 1; } } else { $log = sprintf( "SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); syslog(LOG_NOTICE, $log); printf("

Error: $log"); } } else { $added += 1; } } printf('

%d DNS records added and %d updated', $added, $updated); return true; } else { if (isset($this->SoapEngine->allow_none_local_dns_zones)) { $allow_none_local_dns_zones = $this->SoapEngine->allow_none_local_dns_zones; } else { $allow_none_local_dns_zones = false; } if (!strlen($name)) { printf("

Error: Missing zone name.

"); return false; } $lookup1 = dns_get_record($name); //dprint_r($lookup1); $ns_array1=explode(" ", trim($this->SoapEngine->name_servers)); if (empty($lookup1) || $allow_none_local_dns_zones) { $valid = 1; } else { $valid = 0; foreach ($lookup1 as $lrecord) { if ($lrecord['type'] == 'NS') { if (in_array($lrecord['target'], $ns_array1)) { $valid = 1 ; } } } } if ($valid==0) { printf("

Error: DNS zone already exists on other server. Please contact our support if you plan to transfer this DNS zone to this system.

"); return false; } if (is_numeric($prefix)) { printf("

Error: Numeric zone names are not allowed. Use ENUM port instead. "); return false; } list($customer, $reseller)=$this->customerFromLogin($dictionary); if (!trim($_REQUEST['ttl'])) { $ttl=3600; } else { $ttl = intval(trim($_REQUEST['ttl'])); } if ($name_servers) { $ns_array = explode(" ", trim($name_servers)); } elseif ($this->login_credentials['login_type'] != 'admin' && $this->SoapEngine->name_servers) { $ns_array = explode(" ", trim($this->SoapEngine->name_servers)); } else { $ns_array = array(); } $zone = array( 'name' => $name, 'ttl' => $ttl, 'info' => $info, 'customer' => intval($customer), 'reseller' => intval($reseller), 'nameservers' => $ns_array ); $function = array('commit' => array('name' => 'addZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('DNS zone %s has been added', $name))) ); $result = $this->SoapEngine->execute($function, $this->html); dprint_r($result); if ($this->checkLogSoapError($result, true)) { return false; } else { return true; } } } function showSeachFormCustom() { printf( "

DNS zone
", $this->filters['name'] ); printf( "
Info
", $this->filters['info'] ); } function showRecord($zone) { print <<< END
END; printf("", $_SERVER['PHP_SELF']); print <<< END "; END; printf("", $zone->name); if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { if ($item == 'nameservers') { foreach ($zone->$item as $_item) { $nameservers.=$_item."\n"; } $item_value = $nameservers; } else { $item_value = $zone->$item; } if ($this->FieldsAdminOnly[$item]['name']) { $item_name = $this->FieldsAdminOnly[$item]['name']; } else { $item_name = ucfirst($item); } if ($this->FieldsAdminOnly[$item]['type'] == 'text') { printf( " ", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } else { printf( " ", $item_name, $item, $item_value, $this->FieldsAdminOnly[$item]['help'] ); } } } foreach (array_keys($this->Fields) as $item) { if ($this->Fields[$item]['name']) { $item_name = $this->Fields[$item]['name']; } else { $item_name = ucfirst($item); } if ($item == 'nameservers') { foreach ($zone->$item as $_item) { $nameservers.=$_item."\n"; } $item_value = $nameservers; } else { $item_value = $zone->$item; } if ($this->Fields[$item]['type'] == 'text') { printf( " ", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } elseif ($this->Fields[$item]['readonly']) { printf( " ", $item_name, $item_value, $this->Fields[$item]['help'] ); } else { printf( " ", $item_name, $item, $item_value, $this->Fields[$item]['help'] ); } } printf("", $zone->id->tld); printf("", $zone->id->prefix); $this->printFiltersToForm(); $this->printHiddenFormElements(); print ""; print "
DNS zone%s
%s %s
%s %s
%s %s
%s %s %s
%s %s
"; } function updateRecord() { if (!$_REQUEST['name_filter']) return; //dprintf("

Updating zone %s...", $_REQUEST['name_filter']); $filter = array('name' => $_REQUEST['name_filter']); if (!$zone = $this->getRecord($filter)) { return false; } $zone_old = $zone; foreach (array_keys($this->Fields) as $item) { $var_name = $item.'_form'; //printf("
%s=%s", $var_name, $_REQUEST[$var_name]); if ($this->Fields[$item]['type'] == 'integer') { $zone->$item = intval($_REQUEST[$var_name]); } elseif ($item == 'nameservers') { $_txt = trim($_REQUEST[$var_name]); if (!strlen($_txt)) { unset($zone->$item); } else { $_nameservers = array(); $_lines = explode("\n", $_txt); foreach ($_lines as $_line) { $_ns = trim($_line); $_nameservers[] = $_ns; } $zone->$item = $_nameservers; } } else { $zone->$item = trim($_REQUEST[$var_name]); } } if ($this->adminonly) { foreach (array_keys($this->FieldsAdminOnly) as $item) { $var_name = $item.'_form'; if ($this->FieldsAdminOnly[$item]['type'] == 'integer') { $zone->$item = intval($_REQUEST[$var_name]); } else { $zone->$item = trim($_REQUEST[$var_name]); } } } $function = array('commit' => array('name' => 'updateZone', 'parameters' => array($zone), 'logs' => array('success' => sprintf('DNS zone %s has been updated', $filter['name']))) ); $result = $this->SoapEngine->execute($function, $this->html); dprint_r($result); if ($this->checkLogSoapError($result, true)) { return false; } else { return true; } } function getRecord($zone) { // Filter if (!$zone['name']) { print "Error in getRecord(): Missing zone name"; return false; } $filter = array('name' => $zone['name']); // Range $range = array('start' => 0, 'count' => 1 ); // Order $orderBy = array('attribute' => 'changeDate', 'direction' => 'DESC' ); // Compose query $Query = array('filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); $result = $this->SoapEngine->soapclient->getZones($Query); if ($this->checkLogSoapError($result, true)) { return false; } else { if ($result->zones[0]) { return $result->zones[0]; } else { return false; } } } function getRecordKeys() { // Filter $filter = array( 'name' => $this->filters['name'], 'info' => $this->filters['info'], 'customer' => intval($this->filters['customer']), 'reseller' => intval($this->filters['reseller']) ); // Range $range = array( 'start' => 0, 'count' => 200 ); // Order if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate'; if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC'; $orderBy = array( 'attribute' => $this->sorting['sortBy'], 'direction' => $this->sorting['sortOrder'] ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getZones'); // Call function $result = $this->SoapEngine->soapclient->getZones($Query); if ($this->checkLogSoapError($result, true)) { return false; } else { foreach ($result->zones as $zone) { $this->selectionKeys[] = array('name' => $zone->name); } return true; } } function hide_html() { if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') { return true; } else { return false; } } }