コード例 #1
0
ファイル: record.inc.php プロジェクト: cengjing/poweradmin
/** 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 update_soa_serial($domain_id)
{
    $soa_rec = get_soa_record($domain_id);
    if ($soa_rec == NULL) {
        return false;
    }
    $curr_serial = get_soa_serial($soa_rec);
    $new_serial = get_next_serial($curr_serial);
    if ($curr_serial != $new_serial) {
        $soa_rec = set_soa_serial($soa_rec, $new_serial);
        return update_soa_record($domain_id, $soa_rec);
    }
    return true;
}