/** * Take params send by "printmodifyform", do integrity * checks,checkDig & call $this->updateDb * *@access public *@param array $params array of params: primary, xfer & xferIP *@return string HTML output */ function PrintModified($params) { global $db, $config, $html, $l; list($primary, $xfer, $xferip) = $params; $content = ""; $localerror = 0; if (empty($primary)) { $localerror = 1; $content .= sprintf($html->string_error, $l['str_secondary_you_must_provide_a_primary']) . '<br >'; } // if primary modified ==> try to dig if ($primary != $this->masters) { // check primary integrity if (!checkPrimary($primary)) { $localerror = 1; $content .= sprintf($html->string_error, $l['str_secondary_your_primary_should_be_an_ip'] . "<br >" . $l['str_secondary_if_you_want_two_primary']) . '<br >'; } else { // remove last ';' if present if (substr($primary, -1) == ';') { $primary = substr($primary, 0, -1); } // split $primary into IPs $server = split(';', $primary); reset($server); while ($ipserver = array_pop($server)) { $dig = checkDig($ipserver, $this->zonename); if ($dig != 'NOERROR') { switch ($dig) { case "NOERROR": $msg = $l['str_dig_result_NOERROR']; break; case "FORMERR": $msg = $l['str_dig_result_FORMERR']; break; case "SERVFAIL": $msg = $l['str_dig_result_SERVFAIL']; break; case "NXDOMAIN": $msg = $l['str_dig_result_NXDOMAIN']; break; case "NOTIMP": $msg = $l['str_dig_result_NOTIMP']; break; case "REFUSED": $msg = $l['str_dig_result_REFUSED']; break; case "YXDOMAIN": $msg = $l['str_dig_result_YXDOMAIN']; break; case "YXRRSET": $msg = $l['str_dig_result_YXRRSET']; break; case "NXRRSET": $msg = $l['str_dig_result_NXRRSET']; break; case "NOTAUTH": $msg = $l['str_dig_result_NOTAUTH']; break; case "NOTZONE": $msg = $l['str_dig_result_NOTZONE']; break; case "BADSIG": $msg = $l['str_dig_result_BADSIG']; break; case "BADKEY": $msg = $l['str_dig_result_BADKEY']; break; case "BADTIME": $msg = $l['str_dig_result_BADTIME']; break; } if (!empty($msg)) { $dig = '"' . $dig . '" (' . $msg . ')'; } $content .= sprintf($html->string_warning, sprintf($l['str_trying_to_dig_from_x_returned_status_x'], $ipserver, $dig)); $content .= " " . sprintf($l['str_secondary_non_blocking_warning_x_will_not_serve'], $config->sitename) . '<br >'; } } } } // check xferip if (!empty($xferip)) { if (!checkPrimary($xferip)) { $localerror = 1; $content .= sprintf($html->string_error, $l['str_secondary_invalid_list_of_allowtransfer']) . '<br >'; } $xfer = 'others'; } else { if ($xfer == 'others') { $xfer = 'master'; } } switch ($xfer) { case "all": $xferip = 'any'; break; case "master": $xferip = $primary; break; case "others": // remove last ';' if present if (substr($xferip, -1) == ';') { $xferip = substr($xferip, 0, -1); } // suppress duplicate entry of $primary if already in $xferip $xferarray = split(';', $xferip); $xferiparray = array(); reset($xferarray); while ($xferitem = array_pop($xferarray)) { if ($xferitem != $primary) { array_push($xferiparray, $xferitem); } } $xferip = implode(";", $xferiparray); $xferip = $primary . ';' . $xferip; break; default: $xferip = "any"; } if (!$localerror) { // updatedb if (!$this->updateDb($primary, $xferip)) { $content .= $this->error; } else { // flag status='M' to be generated & reloaded $ret = $this->flagModified($this->zoneid); if (!empty($ret)) { $result .= $ret; } else { // retrieve list of ns names $nsxnames = GetListOfServerNames(); // retrieve list of ns addresses $nsxips = GetListOfServerIPs(); // retrieve list of ns transfer IPs $nsxferips = GetListOfServerTransferIPs(); $nsxferips = array_merge($nsxferips, $nsxips); $nsxferips = array_unique($nsxferips); $content .= ' <h3 class=boxheader>' . sprintf($l['str_secondary_zone_successfully_modified_on_x'], $config->sitename) . '</h3> ' . $l['str_secondary_after_modif_be_sure_to'] . ':<ul> <li>' . $l['str_secondary_after_modif_add_lines_to_zonefile'] . ':<br> <pre> '; while (list($notwanted, $nsxname) = each($nsxnames)) { $content .= $this->zonename . '. IN NS ' . $nsxname . '. '; } $content .= ' </pre> <li>' . $l['str_secondary_after_modif_add_to_configfile'] . ': <p > <pre> // // ' . $l['str_secondary_after_modif_comment_in_sample_1'] . ' // ' . $l['str_secondary_after_modif_comment_in_sample_2'] . ' // zone "' . $this->zonename . '" { type master; file "' . $this->zonename . '"; allow-transfer { '; while (list($notwanted, $nsxferip) = each($nsxferips)) { $content .= $nsxferip . '; '; } $content .= ' }; }; </pre> <li>' . $l['str_secondary_after_modif_set_firewall'] . ' <li>' . sprintf($l['str_secondary_after_modif_delegate_x_to'], $this->zonename) . ': '; reset($nsxnames); $serverlist = ''; while (list($notwanted, $nsxname) = each($nsxnames)) { $serverlist .= ' <b>' . $nsxname . '</b>; '; } $serverlist = substr($serverlist, 0, -1); $content .= $serverlist . ' </ul> <p>' . $l['str_secondary_reload_info'] . '<p> '; } // else no error } // else updatedb } else { // $error // nothing has been modified, go back and solve troubles // or print form again } return $content; }
/** * Update SOA of current zone * *@access private *@param string $xferip IP(s) allowed to do zone transfers *@param int $defaultttl default TTL to be used *@param int $soarefresh refresh interval *@param int $soaretry retry interval *@param int $soaexpire expire interval *@param int $soaminimum negative TTL *@return string 1 if success, 0 if DB error, string of error else */ function updateSOA($xferip, $defaultttl, $soarefresh, $soaretry, $soaexpire, $soaminimum) { global $db, $l; $result = ""; $this->VerifySOA($defaultttl, 86400, "TTL"); $this->VerifySOA($soarefresh, 86400); $this->VerifySOA($soaretry, 10800); $this->VerifySOA($soaexpire, 3600000); $this->VerifySOA($soaminimum, 10800); if (!empty($xferip)) { if (!checkPrimary($xferip)) { $this->error .= $l['str_primary_soa_invalid_xfer']; } } else { $xferip = 'any'; } if (!empty($this->error)) { return 0; } // dns_confprimary // upgrade serial $this->serial = getSerial($this->serial); if ($this->creation == 0) { $query = "UPDATE dns_confprimary SET serial='" . $this->serial . "',\n xfer='" . $xferip . "', refresh='" . $soarefresh . "',\n retry='" . $soaretry . "', expiry='" . $soaexpire . "',\n minimum='" . $soaminimum . "', defaultttl='" . $defaultttl . "'\n WHERE zoneid='" . $this->zoneid . "'"; } else { $query = "SELECT count(*) FROM dns_confprimary WHERE zoneid='" . $this->zoneid . "'"; $res = $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; return 0; } $line = $db->fetch_row($res); if ($line[0] != 0) { $this->error = $l['str_zone_already_exists']; return 0; } $query = "INSERT INTO dns_confprimary (zoneid,serial,xfer,refresh,\n retry,expiry,minimum,defaultttl)\n VALUES ('" . $this->zoneid . "','" . $this->serial . "','" . $xferip . "'\n ,'" . $soarefresh . "','" . $soaretry . "','" . $soaexpire . "','" . $soaminimum . "','" . $defaultttl . "')"; } $res = $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; return 0; } $this->refresh = $soarefresh; $this->retry = $soaretry; $this->expire = $soaexpire; $this->minimum = $soaminimum; $this->defaultttl = $defaultttl; return 1; }