X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=nodeconfig%2Fboot%2Findex.php;fp=nodeconfig%2Fboot%2Findex.php;h=81ec4902b424c66a5deb38badc951150b130557f;hb=bb4b0af7f5c3b030d74f22021e5c3cc20ad17fe1;hp=0000000000000000000000000000000000000000;hpb=80bdfcc459cc296a434306ce2cfd5a52ea3cd14a;p=bootmanager.git diff --git a/nodeconfig/boot/index.php b/nodeconfig/boot/index.php new file mode 100755 index 0000000..81ec490 --- /dev/null +++ b/nodeconfig/boot/index.php @@ -0,0 +1,84 @@ + +// Copyright (C) 2006 The Trustees of Princeton University +// +// $Id$ $ +// + +// Get admin API handle +require_once 'plc_api.php'; +global $adm; + +// location for signed scripts +$bmdir="/var/www/html/bootmanager"; + +// Default bootmanager +$bootmanager = "bootmanager.sh.sgn"; + +// Look up the node +$interfaces = $adm->GetInterfaces(array('ip' => $_SERVER['REMOTE_ADDR'])); +if (!empty($interfaces)) { + $nodes = $adm->GetNodes(array($interfaces[0]['node_id'])); + if (!empty($nodes)) { + $node = $nodes[0]; + } +} + +if (isset($node)) { + // Allow very old nodes that do not have a node key in their + // configuration files to use their "boot nonce" instead. The boot + // nonce is a random value generated by the node itself and POSTed + // by the Boot CD when it requests the Boot Manager. This is + // obviously not very secure, so we only allow it to be used if the + // requestor IP is the same as the IP address we have on record for + // the node. + + // 3.x CDs post 'version', 2.x CDs post 'id'. + if (!empty($_REQUEST['version'])) { + $version = trim($_REQUEST['version']); + } elseif (!empty($_REQUEST['id'])) { + $version = trim($_REQUEST['id']); + } else { + $version = "2.0"; + } + + if (empty($node['key']) && !empty($_REQUEST['nonce'])) { + // 3.x CDs post the boot nonce in ASCII hex. 2.x CDs post it in binary. + if (strstr($version, "2.0") === FALSE) { + // 3.x CDs post a trailing newline...sigh + $nonce = trim($_REQUEST['nonce']); + } else { + $nonce = bin2hex($_REQUEST['nonce']); + } + $adm->UpdateNode($node['node_id'], array('boot_nonce' => $nonce)); + } + + // Custom bootmanager for the node, e.g. + // planetlab-1.cs.princeton.edu_bootmanager.sh.sgn + $bootmanagers = array(strtolower($node['hostname']) . "_" . $bootmanager); + + // Custom bootmanager for the deployment tag, e.g. + + if (!empty($node['nodegroup_ids'])) { + $nodegroups = $adm->GetNodeDeployment($node['nodegroup_ids']); + foreach ($nodegroups as $nodegroup) { + $bootmanagers[] = strtolower($nodegroup['groupname']) . "_" . $bootmanager; + } + } +} + +// Default bootmanager +$bootmanagers[] = "regular_" . $bootmanager; + +foreach ($bootmanagers as $bootmanager) { + $candidate=$bmdir . "/" . $bootmanager; + if (file_exists($candidate)) { + readfile($candidate); + exit(); + } +} + +?>