<?php
#$VERBOSE = 1;

require "cidr.php";
require "config.php";

function get_templates(&$server) {
    global $DISTRIBUTION;

    $templates = array();
    foreach (glob("{$server['templates']}/*") as $ffn) {
	$fn = basename($ffn);
	$templates[$fn] = file_get_contents($ffn);
    }

    $templates['distrib_base_config'] = $templates["base-$DISTRIBUTION"];
    $templates['distrib_package_config'] = $templates["packages-$DISTRIBUTION"];
    $templates['distrib_pre_config'] = $templates["pre-$DISTRIBUTION"];
    $templates['distrib_post_config'] = $templates["post-$DISTRIBUTION"];

    $srvid = $server['srvid'];
    $templates['node_base_config'] = $templates["base-$srvid"];
    $templates['node_package_config'] = $templates["packages-$srvid"];
    $templates['node_pre_config'] = $templates["pre-$srvid"];
    $templates['node_post_config'] = $templates["post-$srvid"];

    $templates['nd_base_config'] = $templates["base-$srvid-$DISTRIBUTION"];
    $templates['nd_package_config'] = $templates["packages-$srvid-$DISTRIBUTION"];
    $templates['nd_pre_config'] = $templates["pre-$srvid-$DISTRIBUTION"];
    $templates['nd_post_config'] = $templates["post-$srvid-$DISTRIBUTION"];

    if ((isset($server["disk2"]))&&($server["raid"] !== false)) {
	$raid = $server["raid"];
	if (preg_match("/RAID(\d+)/i", $raid, $m)) $raid = $m[1];
	$templates['storage_config'] = $templates["storage-raid{$raid}"];
    } else {
	$templates['storage_config'] = $templates['storage-hdd'];
    }

    unset($server['templates']);

    return $templates;
}

function get_server($srvid) {
    global $DISTRIBUTION;
    global $SERVER_LIST;
    global $NETMASK;

    $server = $SERVER_LIST[$srvid];
    $server['srvid'] = $srvid;

    if (!isset($server["fqdn"]))
	$server["fqdn"] = "{$srvid}.{$server['domain']}";

    if (!isset($server["ip"])) {
	if (isset($server["base_ip"])&&($server["base_net"])) {
	    if (preg_match("/(\d+)$/", $srvid, $m)) {
		$server["ip"] = $server["base_net"] . ($server["base_ip"] + $m[1]);
	    } else {
		$server["ip"] = false;
	    }
	} else {
	    $ip = gethostbyname($server["fqdn"]);
	    if ($ip == $server["fqdn"])
		$server["ip"] = false;
	    else
		$server["ip"] = $ip;
	}
    }

    $server["distribution"] = $DISTRIBUTION;
    if ($server["driverdisk"])
	$server["skip_driverdisk"] = false;
    else
	$server["skip_driverdisk"] = true;

    if ($server["ip"]) {
	$server["skip_ip"] = false;
    } else {
	$server["skip_ip"] = true;
    }

    if (!isset($server["netmask"])) {
	if (isset($server["cidr"])) {
	    $server["netmask"] = $NETMASK[$server["cidr"]];
	}
    }

    $eths = $server["eth"];
    if ((isset($eths[0]))&&(!isset($server["ethdev"])))
	$server["ethdev"] = $eths[0];
    if ((isset($eths[1]))&&(!isset($server["ethdev2"])))
	$server["ethdev2"] = $eths[1];

    $disks = explode(",", $server["sysdisks"]);
    if (!isset($server["bootdisk"]))
	$server["bootdisk"] = $disks[0];

    if (!isset($server["disk1"]))
	$server["disk1"] = $disks[0];

    if ((isset($disks[1]))&&(!isset($server["disk2"])))
	$server["disk2"] = $disks[1];

    unset($server["eths"]);
    unset($server["macs"]);
    unset($server["headers"]);

    return $server;
}

function find_mac($macs, $mac_header) {
    if (!is_array($macs)) $macs = array($macs);

    foreach ($macs as $mac) {
	if (preg_match("/$mac/i", $mac_header)) 
	    return true;
    }
    return false;
}

function  find_server_by_mac($mac_header) {
    global $SERVER_LIST;

    foreach ($SERVER_LIST as $srvid => $server) {
	if (find_mac($server['macs'], $mac_header))
	    return get_server($srvid);
    }
    return false;
}

function  find_server_by_header($http_header, $value) {
    global $SERVER_LIST;

    foreach ($SERVER_LIST as $srvid => $server) {
	if ((array_key_exists("headers", $server))&&(is_array($server["headers"]))&&(array_key_exists($http_header, $server["headers"]))) {
	    $expected = $server["headers"][$http_header];
	    if (!is_array($expected)) $expected = array($expected);
	    foreach ($expected as $re) {
		if (preg_match("/$re/", $value))
		    return get_server($srvid);
	    }
	}
    }
    return false;
}

function find_server() {
    global $DEFAULT_SERVER;
    global $_SERVER;

    $headers =  getallheaders();
    for ($i = 0; $i < 10; $i++) {
	$if = "X-RHN-Provisioning-MAC-$i";
	if (!isset($headers[$if])) break;

	$server = find_server_by_mac($headers[$if]);
	if ($server) return $server;
    }

    foreach ($_SERVER as $header => $value) {
	$server = find_server_by_header($header, $value);
	if ($server) return $server;
    }

    if (isset($DEFAULT_SERVER)) {
	return get_server($DEFAULT_SERVER);
    }

    return false;
}




$server = find_server();

$f = fopen("../logs/kickstart.log", "a+");
if ($f) {
    if (isset($_SERVER["HTTP_ANDS_REAL_IP"])) $remote = $_SERVER["HTTP_ANDS_REAL_IP"];
    elseif (isset($_SERVER["HTTP_ANDS_FORWARDED_FOR"])) $remote = $_SERVER["HTTP_ANDS_FORWARDED_FOR"];
    elseif (isset($_SERVER["HTTP_X_REAL_IP"])) $remote = $_SERVER["HTTP_X_REAL_IP"];
    elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) $remote = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else $remote = $_SERVER["REMOTE_ADDR"];

    fprintf($f, "%s %s at %s\n", $remote, ($server?$server["fqdn"]:"-"), date(DATE_ISO8601));
    fclose($f);
}

if (!$server) {
    $f = fopen("../logs/kickstart-new.log", "a+");
    if ($f) {
	fwrite($f, "%s\n", date(DATE_ISO8601));
	fwrite($f, print_r($_SERVER, true));
	fwrite($f, print_r(getallheaders(), true));
	fclose($f);
    } 
    return;
}

$templates = get_templates($server);

$ks = file_get_contents($server["ks"]);


$patterns=array(); $values=array();
foreach ($templates as $key => $val) {
    array_push($patterns, "/@" . strtoupper($key) . "@/");
    array_push($values, $val);
}
$ks = preg_replace($patterns, $values, $ks);


$patterns=array(); $values=array();
foreach ($server as $key => $val) {
    array_push($patterns, "/@" . strtoupper($key) . "@/");
    if (is_bool($val)) {
	if (preg_match("/^skip_/", $key)) {
	    if ($val) $val = "#";
	    else $val = "";
	} elseif (preg_match("/^enable_/", $key)) {
	    if ($val) $val = "";
	    else $val = "#";
	} else {
	    if ($val) $val = 1;
	    else $val = 0;
	}
    }
    array_push($values, $val);
}

foreach ($DISTRIBUTIONS as $distrib) {
    array_push($patterns, "/@" . strtoupper($distrib) . "@/");
    array_push($values, (strcasecmp($distrib, $DISTRIBUTION)?"#":""));
}

//print_r($patterns);

$ks = preg_replace($patterns, $values, $ks);

if ($VERBOSE) {
    $f = fopen("../logs/kickstart-verbose.log", "a+");
    if ($f) {
	fwrite($f, "-----------------------------------------------------\n");
	fwrite($f, "%s\n", date(DATE_ISO8601));
	fwrite($f, print_r($server, true));
	fwrite($f, print_r($_SERVER, true));
	fwrite($f, print_r(getallheaders(), true));
	fwrite($f, "-----------------------------------------------------\n");
	fwrite($f, $ks);
	fwrite($f, "=====================================================\n");
	fclose($f);
    } 
} 

header("Content-type: text/plain");
echo $ks;

?>