summaryrefslogtreecommitdiffstats
path: root/index.php
diff options
context:
space:
mode:
Diffstat (limited to 'index.php')
-rw-r--r--index.php226
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;
+
+?>