diff options
Diffstat (limited to 'index.php')
-rw-r--r-- | index.php | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/index.php b/index.php new file mode 100644 index 0000000..61f4650 --- /dev/null +++ b/index.php @@ -0,0 +1,226 @@ +<?php +#$VERBOSE = 1; + +require "cidr.php"; +require "config.php"; + +function get_templates(&$server) { + $templates = array(); + foreach (glob("{$server['templates']}/*") as $ffn) { + $fn = basename($ffn); + $templates[$fn] = file_get_contents($ffn); + } + + 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["raid{$raid}"]; + } else { + $templates['storage_config'] = $templates['hdd']; + } + + unset($server['templates']); + + return $templates; +} + +function get_server($srvid) { + global $SERVER_LIST; + global $NETMASK; + + $server = $SERVER_LIST[$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; + } + } + + 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/", $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 ((is_array($server["headers"]))&&(isset($server["headers"][$http_header]))) { + $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("/srv/www/htdocs/ands/logs/kickstart.log", "a+"); +if ($f) { + fprintf($f, "%s %s\n", $_SERVER["REMOTE_ADDR"], ($server?$server["fqdn"]:"-")); + fclose($f); +} + +if (!$server) { + $f = fopen("/srv/www/htdocs/ands/logs/kickstart-new.log", "a+"); + if ($f) { + 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("/srv/www/htdocs/ands/logs/kickstart-verbose.log", "a+"); + if ($f) { + fwrite($f, "-----------------------------------------------------\n"); + 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; + +?> |