<?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; ?>