require '../inc/migrations.inc.php'; $db = dbConnect(); $file_name = file_get_name_without_extension(__FILE__); if (migration_exists($db, $file_name)) { migration_message('The migration had already been applied!'); exit; } $zones = get_zones_with_templates($db); foreach ($zones as $zone) { $domain = get_zone_name_from_id($zone['id']); $templ_records = get_zone_templ_records($zone['zone_templ_id']); $generated_templ_records = array(); foreach ($templ_records as $templ_record) { $name = parse_template_value($templ_record['name'], $domain); $type = $templ_record['type']; $content = parse_template_value($templ_record['content'], $domain); $generated_templ_records[] = array('name' => $name, 'type' => $type, 'content' => $content); } $records = get_records_by_domain_id($db, $zone['domain_id']); foreach ($records as $record) { foreach ($generated_templ_records as $generated_templ_record) { if ($record['name'] == $generated_templ_record['name'] && $record['type'] == $generated_templ_record['type'] && $record['content'] == $generated_templ_record['content']) { if (!record_relation_to_templ_exists($db, $zone['domain_id'], $record['id'], $zone['zone_templ_id'])) { add_record_relation_to_templ($db, $zone['domain_id'], $record['id'], $zone['zone_templ_id']); } break; } } } } migration_message('Relations between records and zone templates added successfully');
function update_zone_records($zone_id, $zone_template) { global $db; global $dns_ns1; global $dns_hostmaster; global $dns_ttl; if (verify_permission('zone_content_edit_others')) { $perm_edit = "all"; } elseif (verify_permission('zone_content_edit_own')) { $perm_edit = "own"; } else { $perm_edit = "none"; } $user_is_zone_owner = verify_user_is_owner_zoneid($zone_id); if (verify_permission('zone_master_add')) { $zone_master_add = "1"; } if (verify_permission('zone_slave_add')) { $zone_slave_add = "1"; } $response = $db->beginTransaction(); if (0 != $zone_template) { if ($perm_edit == "all" || $perm_edit == "own" && $user_is_zone_owner == "1") { if (is_numeric($zone_id)) { $db->exec("DELETE FROM records WHERE domain_id=" . $db->quote($zone_id, 'integer')); } else { error(sprintf(ERR_INV_ARGC, "delete_domain", "id must be a number")); } } else { error(ERR_PERM_DEL_ZONE); } if ($zone_master_add == "1" || $zone_slave_add == "1") { $domain = get_zone_name_from_id($zone_id); $now = time(); $templ_records = get_zone_templ_records($zone_template); if ($templ_records == -1) { return; } foreach ($templ_records as $r) { if (preg_match('/in-addr.arpa/i', $zone_id) && ($r["type"] == "NS" || $r["type"] == "SOA") || !preg_match('/in-addr.arpa/i', $zone_id)) { $name = parse_template_value($r["name"], $domain); $type = $r["type"]; $content = parse_template_value($r["content"], $domain); $ttl = $r["ttl"]; $prio = intval($r["prio"]); if (!$ttl) { $ttl = $dns_ttl; } $query = "INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (" . $db->quote($zone_id, 'integer') . "," . $db->quote($name, 'text') . "," . $db->quote($type, 'text') . "," . $db->quote($content, 'text') . "," . $db->quote($ttl, 'integer') . "," . $db->quote($prio, 'integer') . "," . $db->quote($now, 'integer') . ")"; $response = $db->exec($query); } } } } $query = "UPDATE zones\n SET zone_templ_id = " . $db->quote($zone_template, 'integer') . "\n WHERE domain_id = " . $db->quote($zone_id, 'integer'); $response = $db->exec($query); if (PEAR::isError($response)) { $response = $db->rollback(); } else { $response = $db->commit(); } }
/** Update All Zone Records for Zone ID with Zone Template * * @param int $zone_id Zone ID to update * @param int $zone_template_id Zone Template ID to use for update * * @return null */ function update_zone_records($zone_id, $zone_template_id) { global $db; global $dns_ttl; global $db_type; if (do_hook('verify_permission', 'zone_content_edit_others')) { $perm_edit = "all"; } elseif (do_hook('verify_permission', 'zone_content_edit_own')) { $perm_edit = "own"; } else { $perm_edit = "none"; } $user_is_zone_owner = do_hook('verify_user_is_owner_zoneid', $zone_id); if (do_hook('verify_permission', 'zone_master_add')) { $zone_master_add = "1"; } if (do_hook('verify_permission', 'zone_slave_add')) { $zone_slave_add = "1"; } $soa_rec = get_soa_record($zone_id); $response = $db->beginTransaction(); if (0 != $zone_template_id) { if ($perm_edit == "all" || $perm_edit == "own" && $user_is_zone_owner == "1") { if (is_numeric($zone_id)) { $db->exec("DELETE FROM records WHERE id IN (SELECT record_id FROM records_zone_templ WHERE " . "domain_id = " . $db->quote($zone_id, 'integer') . " AND " . "zone_templ_id = " . $db->quote($zone_template_id, 'integer') . ")"); $db->exec("DELETE FROM records_zone_templ WHERE domain_id = " . $db->quote($zone_id, 'integer')); } else { error(sprintf(ERR_INV_ARGC, "delete_domain", "id must be a number")); } } else { error(ERR_PERM_DEL_ZONE); } if ($zone_master_add == "1" || $zone_slave_add == "1") { $domain = get_zone_name_from_id($zone_id); $now = time(); $templ_records = get_zone_templ_records($zone_template_id); if ($templ_records == -1) { return; } foreach ($templ_records as $r) { //fixme: appears to be a bug and regex match should occur against $domain if (preg_match('/in-addr.arpa/i', $zone_id) && ($r["type"] == "NS" || $r["type"] == "SOA") || !preg_match('/in-addr.arpa/i', $zone_id)) { $name = parse_template_value($r["name"], $domain); $type = $r["type"]; if ($type == "SOA") { $content = get_updated_soa_record($soa_rec); } else { $content = parse_template_value($r["content"], $domain); } $ttl = $r["ttl"]; $prio = intval($r["prio"]); if (!$ttl) { $ttl = $dns_ttl; } $query = "INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (" . $db->quote($zone_id, 'integer') . "," . $db->quote($name, 'text') . "," . $db->quote($type, 'text') . "," . $db->quote($content, 'text') . "," . $db->quote($ttl, 'integer') . "," . $db->quote($prio, 'integer') . "," . $db->quote($now, 'integer') . ")"; $response = $db->exec($query); if ($db_type == 'pgsql') { $record_id = $db->lastInsertId('records_id_seq'); } else { $record_id = $db->lastInsertId(); } $query = "INSERT INTO records_zone_templ (domain_id, record_id, zone_templ_id) VALUES (" . $db->quote($zone_id, 'integer') . "," . $db->quote($record_id, 'integer') . "," . $db->quote($zone_template_id, 'integer') . ")"; $response = $db->query($query); } } } } $query = "UPDATE zones\n SET zone_templ_id = " . $db->quote($zone_template_id, 'integer') . "\n WHERE domain_id = " . $db->quote($zone_id, 'integer'); $response = $db->exec($query); if (PEAR::isError($response)) { $response = $db->rollback(); } else { $response = $db->commit(); } }
function add_domain($domain, $owner, $webip, $mailip, $empty, $type, $slave_master) { if (verify_permission('zone_master_add')) { $zone_master_add = "1"; } if (verify_permission('zone_slave_add')) { $zone_slave_add = "1"; } // TODO: make sure only one is possible if only one is enabled if ($zone_master_add == "1" || $zone_slave_add == "1") { global $db; global $dns_ns1; global $dns_hostmaster; global $dns_ttl; if ($domain && $owner && $webip && $mailip || $empty && $owner && $domain || eregi('in-addr.arpa', $domain) && $owner || $type == "SLAVE" && $domain && $owner && $slave_master) { $response = $db->query("INSERT INTO domains (name, type) VALUES (" . $db->quote($domain, 'text') . ", " . $db->quote($type, 'text') . ")"); if (PEAR::isError($response)) { error($response->getMessage()); return false; } $domain_id = $db->lastInsertId('domains', 'id'); if (PEAR::isError($domain_id)) { error($id->getMessage()); return false; } $response = $db->query("INSERT INTO zones (domain_id, owner) VALUES (" . $db->quote($domain_id, 'integer') . ", " . $db->quote($owner, 'integer') . ")"); if (PEAR::isError($response)) { error($response->getMessage()); return false; } if ($type == "SLAVE") { $response = $db->query("UPDATE domains SET master = " . $db->quote($slave_master, 'text') . " WHERE id = " . $db->quote($domain_id, 'integer')); if (PEAR::isError($response)) { error($response->getMessage()); return false; } return true; } else { $now = time(); if ($empty && $domain_id) { $ns1 = $dns_ns1; $hm = $dns_hostmaster; $ttl = $dns_ttl; $query = "INSERT INTO records (domain_id, name, content, type, ttl, prio, change_date) VALUES (" . $db->quote($domain_id, 'integer') . "," . $db->quote($domain, 'text') . "," . $db->quote($ns1 . ' ' . $hm . ' 1', 'text') . "," . $db->quote('SOA', 'text') . "," . $db->quote($ttl, 'integer') . "," . $db->quote(0, 'integer') . "," . $db->quote($now, 'integer') . ")"; $response = $db->query($query); if (PEAR::isError($response)) { error($response->getMessage()); return false; } } elseif ($domain_id) { global $template; global $dns_ttl; foreach ($template as $r) { if (eregi('in-addr.arpa', $domain) && ($r["type"] == "NS" || $r["type"] == "SOA") || !eregi('in-addr.arpa', $domain)) { $name = parse_template_value($r["name"], $domain, $webip, $mailip); $type = $r["type"]; $content = parse_template_value($r["content"], $domain, $webip, $mailip); $ttl = $r["ttl"]; $prio = intval($r["prio"]); if (!$ttl) { $ttl = $dns_ttl; } $query = "INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (" . $db->quote($domain_id, 'integer') . "," . $db->quote($name, 'text') . "," . $db->quote($type, 'text') . "," . $db->quote($content, 'text') . "," . $db->quote($ttl, 'integer') . "," . $db->quote($prio, 'integer') . "," . $db->quote($now, 'integer') . ")"; $response = $db->query($query); if (PEAR::isError($response)) { error($response->getMessage()); return false; } } } return true; } else { error(sprintf(ERR_INV_ARGC, "add_domain", "could not create zone")); } } } else { error(sprintf(ERR_INV_ARG, "add_domain")); } } else { error(ERR_PERM_ADD_ZONE_MASTER); return false; } }