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();
    }
}
Exemple #3
0
/** 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();
    }
}
Exemple #4
0
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;
    }
}