From 37a93603272c00a8b2389bbec0c1860382eb8569 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Wed, 26 Mar 2008 13:14:41 +0000 Subject: [PATCH] cross module change taking /var/www/html/{boot,PLCAPI} out of PLCWWW and into nodeconfig files formerly right under nodeconfig/trunk move one step down into PlanetLabConf/ removed corresponding obsolete files in PLCWWW/branches/onelab --- .../RPM-GPG-KEY-fedora | 0 .../RootResources}/pl_conf.py | 0 .../RootResources}/pl_netflow.py | 0 .../RootResources}/plc_slice_pool.php | 0 blacklist.php => PlanetLabConf/blacklist.php | 0 bwlimit.php => PlanetLabConf/bwlimit.php | 0 .../delete-rpm-list-production | 0 .../get_gpg_key.php | 0 .../get_plc_config.php | 0 .../getupdatesxml.php | 0 ipod.conf.php => PlanetLabConf/ipod.conf.php | 0 iptables => PlanetLabConf/iptables | 0 issue.php => PlanetLabConf/issue.php | 0 keys.php => PlanetLabConf/keys.php | 0 .../logrotate.conf | 0 ntp.conf.php => PlanetLabConf/ntp.conf.php | 0 .../ntp}/host/ntp.conf.grouse.hpl.hp.com | 0 .../ntp}/host/ntp.conf.planet2.ecse.rpi.edu | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.au | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.bbk.ac.uk | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.br | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.ch | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.cn | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.de | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.default | 0 .../ntp}/ntp.conf.di.unito.it | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.dk | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.edu | 0 .../ntp}/ntp.conf.eurecom.fr | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.fr | 0 .../ntp}/ntp.conf.ics.forth.gr | 0 .../ntp}/ntp.conf.ipv6.lip6.fr | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.it | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.it.uu.se | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.polito.it | 0 .../ntp}/ntp.conf.prob.default | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.se | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.sics.se | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.uk | 0 {ntp => PlanetLabConf/ntp}/ntp.conf.ukc.ac.uk | 0 {ntp => PlanetLabConf/ntp}/step-tickers.php | 0 .../ntptickers.php | 0 propd.conf => PlanetLabConf/propd.conf | 0 proxies.php => PlanetLabConf/proxies.php | 0 sendmail.cf => PlanetLabConf/sendmail.cf | 0 sendmail.mc => PlanetLabConf/sendmail.mc | 0 slocate.cron => PlanetLabConf/slocate.cron | 0 sshd_config => PlanetLabConf/sshd_config | 0 sudoers => PlanetLabConf/sudoers | 0 sysctl.php => PlanetLabConf/sysctl.php | 0 yum.conf.php => PlanetLabConf/yum.conf.php | 0 boot/getnodeid.php | 29 +++++++ boot/index.php | 80 ++++++++++++++++++ boot/uudecode.gz | Bin 0 -> 4317 bytes nodeconfig.spec | 8 +- 55 files changed, 115 insertions(+), 2 deletions(-) rename RPM-GPG-KEY-fedora => PlanetLabConf/RPM-GPG-KEY-fedora (100%) rename {RootResources => PlanetLabConf/RootResources}/pl_conf.py (100%) rename {RootResources => PlanetLabConf/RootResources}/pl_netflow.py (100%) rename {RootResources => PlanetLabConf/RootResources}/plc_slice_pool.php (100%) rename blacklist.php => PlanetLabConf/blacklist.php (100%) rename bwlimit.php => PlanetLabConf/bwlimit.php (100%) rename delete-rpm-list-production => PlanetLabConf/delete-rpm-list-production (100%) rename get_gpg_key.php => PlanetLabConf/get_gpg_key.php (100%) rename get_plc_config.php => PlanetLabConf/get_plc_config.php (100%) rename getupdatesxml.php => PlanetLabConf/getupdatesxml.php (100%) rename ipod.conf.php => PlanetLabConf/ipod.conf.php (100%) rename iptables => PlanetLabConf/iptables (100%) rename issue.php => PlanetLabConf/issue.php (100%) rename keys.php => PlanetLabConf/keys.php (100%) rename logrotate.conf => PlanetLabConf/logrotate.conf (100%) rename ntp.conf.php => PlanetLabConf/ntp.conf.php (100%) rename {ntp => PlanetLabConf/ntp}/host/ntp.conf.grouse.hpl.hp.com (100%) rename {ntp => PlanetLabConf/ntp}/host/ntp.conf.planet2.ecse.rpi.edu (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.au (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.bbk.ac.uk (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.br (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.ch (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.cn (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.de (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.default (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.di.unito.it (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.dk (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.edu (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.eurecom.fr (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.fr (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.ics.forth.gr (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.ipv6.lip6.fr (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.it (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.it.uu.se (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.polito.it (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.prob.default (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.se (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.sics.se (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.uk (100%) rename {ntp => PlanetLabConf/ntp}/ntp.conf.ukc.ac.uk (100%) rename {ntp => PlanetLabConf/ntp}/step-tickers.php (100%) rename ntptickers.php => PlanetLabConf/ntptickers.php (100%) rename propd.conf => PlanetLabConf/propd.conf (100%) rename proxies.php => PlanetLabConf/proxies.php (100%) rename sendmail.cf => PlanetLabConf/sendmail.cf (100%) rename sendmail.mc => PlanetLabConf/sendmail.mc (100%) rename slocate.cron => PlanetLabConf/slocate.cron (100%) rename sshd_config => PlanetLabConf/sshd_config (100%) rename sudoers => PlanetLabConf/sudoers (100%) rename sysctl.php => PlanetLabConf/sysctl.php (100%) rename yum.conf.php => PlanetLabConf/yum.conf.php (100%) create mode 100755 boot/getnodeid.php create mode 100755 boot/index.php create mode 100755 boot/uudecode.gz diff --git a/RPM-GPG-KEY-fedora b/PlanetLabConf/RPM-GPG-KEY-fedora similarity index 100% rename from RPM-GPG-KEY-fedora rename to PlanetLabConf/RPM-GPG-KEY-fedora diff --git a/RootResources/pl_conf.py b/PlanetLabConf/RootResources/pl_conf.py similarity index 100% rename from RootResources/pl_conf.py rename to PlanetLabConf/RootResources/pl_conf.py diff --git a/RootResources/pl_netflow.py b/PlanetLabConf/RootResources/pl_netflow.py similarity index 100% rename from RootResources/pl_netflow.py rename to PlanetLabConf/RootResources/pl_netflow.py diff --git a/RootResources/plc_slice_pool.php b/PlanetLabConf/RootResources/plc_slice_pool.php similarity index 100% rename from RootResources/plc_slice_pool.php rename to PlanetLabConf/RootResources/plc_slice_pool.php diff --git a/blacklist.php b/PlanetLabConf/blacklist.php similarity index 100% rename from blacklist.php rename to PlanetLabConf/blacklist.php diff --git a/bwlimit.php b/PlanetLabConf/bwlimit.php similarity index 100% rename from bwlimit.php rename to PlanetLabConf/bwlimit.php diff --git a/delete-rpm-list-production b/PlanetLabConf/delete-rpm-list-production similarity index 100% rename from delete-rpm-list-production rename to PlanetLabConf/delete-rpm-list-production diff --git a/get_gpg_key.php b/PlanetLabConf/get_gpg_key.php similarity index 100% rename from get_gpg_key.php rename to PlanetLabConf/get_gpg_key.php diff --git a/get_plc_config.php b/PlanetLabConf/get_plc_config.php similarity index 100% rename from get_plc_config.php rename to PlanetLabConf/get_plc_config.php diff --git a/getupdatesxml.php b/PlanetLabConf/getupdatesxml.php similarity index 100% rename from getupdatesxml.php rename to PlanetLabConf/getupdatesxml.php diff --git a/ipod.conf.php b/PlanetLabConf/ipod.conf.php similarity index 100% rename from ipod.conf.php rename to PlanetLabConf/ipod.conf.php diff --git a/iptables b/PlanetLabConf/iptables similarity index 100% rename from iptables rename to PlanetLabConf/iptables diff --git a/issue.php b/PlanetLabConf/issue.php similarity index 100% rename from issue.php rename to PlanetLabConf/issue.php diff --git a/keys.php b/PlanetLabConf/keys.php similarity index 100% rename from keys.php rename to PlanetLabConf/keys.php diff --git a/logrotate.conf b/PlanetLabConf/logrotate.conf similarity index 100% rename from logrotate.conf rename to PlanetLabConf/logrotate.conf diff --git a/ntp.conf.php b/PlanetLabConf/ntp.conf.php similarity index 100% rename from ntp.conf.php rename to PlanetLabConf/ntp.conf.php diff --git a/ntp/host/ntp.conf.grouse.hpl.hp.com b/PlanetLabConf/ntp/host/ntp.conf.grouse.hpl.hp.com similarity index 100% rename from ntp/host/ntp.conf.grouse.hpl.hp.com rename to PlanetLabConf/ntp/host/ntp.conf.grouse.hpl.hp.com diff --git a/ntp/host/ntp.conf.planet2.ecse.rpi.edu b/PlanetLabConf/ntp/host/ntp.conf.planet2.ecse.rpi.edu similarity index 100% rename from ntp/host/ntp.conf.planet2.ecse.rpi.edu rename to PlanetLabConf/ntp/host/ntp.conf.planet2.ecse.rpi.edu diff --git a/ntp/ntp.conf.au b/PlanetLabConf/ntp/ntp.conf.au similarity index 100% rename from ntp/ntp.conf.au rename to PlanetLabConf/ntp/ntp.conf.au diff --git a/ntp/ntp.conf.bbk.ac.uk b/PlanetLabConf/ntp/ntp.conf.bbk.ac.uk similarity index 100% rename from ntp/ntp.conf.bbk.ac.uk rename to PlanetLabConf/ntp/ntp.conf.bbk.ac.uk diff --git a/ntp/ntp.conf.br b/PlanetLabConf/ntp/ntp.conf.br similarity index 100% rename from ntp/ntp.conf.br rename to PlanetLabConf/ntp/ntp.conf.br diff --git a/ntp/ntp.conf.ch b/PlanetLabConf/ntp/ntp.conf.ch similarity index 100% rename from ntp/ntp.conf.ch rename to PlanetLabConf/ntp/ntp.conf.ch diff --git a/ntp/ntp.conf.cn b/PlanetLabConf/ntp/ntp.conf.cn similarity index 100% rename from ntp/ntp.conf.cn rename to PlanetLabConf/ntp/ntp.conf.cn diff --git a/ntp/ntp.conf.de b/PlanetLabConf/ntp/ntp.conf.de similarity index 100% rename from ntp/ntp.conf.de rename to PlanetLabConf/ntp/ntp.conf.de diff --git a/ntp/ntp.conf.default b/PlanetLabConf/ntp/ntp.conf.default similarity index 100% rename from ntp/ntp.conf.default rename to PlanetLabConf/ntp/ntp.conf.default diff --git a/ntp/ntp.conf.di.unito.it b/PlanetLabConf/ntp/ntp.conf.di.unito.it similarity index 100% rename from ntp/ntp.conf.di.unito.it rename to PlanetLabConf/ntp/ntp.conf.di.unito.it diff --git a/ntp/ntp.conf.dk b/PlanetLabConf/ntp/ntp.conf.dk similarity index 100% rename from ntp/ntp.conf.dk rename to PlanetLabConf/ntp/ntp.conf.dk diff --git a/ntp/ntp.conf.edu b/PlanetLabConf/ntp/ntp.conf.edu similarity index 100% rename from ntp/ntp.conf.edu rename to PlanetLabConf/ntp/ntp.conf.edu diff --git a/ntp/ntp.conf.eurecom.fr b/PlanetLabConf/ntp/ntp.conf.eurecom.fr similarity index 100% rename from ntp/ntp.conf.eurecom.fr rename to PlanetLabConf/ntp/ntp.conf.eurecom.fr diff --git a/ntp/ntp.conf.fr b/PlanetLabConf/ntp/ntp.conf.fr similarity index 100% rename from ntp/ntp.conf.fr rename to PlanetLabConf/ntp/ntp.conf.fr diff --git a/ntp/ntp.conf.ics.forth.gr b/PlanetLabConf/ntp/ntp.conf.ics.forth.gr similarity index 100% rename from ntp/ntp.conf.ics.forth.gr rename to PlanetLabConf/ntp/ntp.conf.ics.forth.gr diff --git a/ntp/ntp.conf.ipv6.lip6.fr b/PlanetLabConf/ntp/ntp.conf.ipv6.lip6.fr similarity index 100% rename from ntp/ntp.conf.ipv6.lip6.fr rename to PlanetLabConf/ntp/ntp.conf.ipv6.lip6.fr diff --git a/ntp/ntp.conf.it b/PlanetLabConf/ntp/ntp.conf.it similarity index 100% rename from ntp/ntp.conf.it rename to PlanetLabConf/ntp/ntp.conf.it diff --git a/ntp/ntp.conf.it.uu.se b/PlanetLabConf/ntp/ntp.conf.it.uu.se similarity index 100% rename from ntp/ntp.conf.it.uu.se rename to PlanetLabConf/ntp/ntp.conf.it.uu.se diff --git a/ntp/ntp.conf.polito.it b/PlanetLabConf/ntp/ntp.conf.polito.it similarity index 100% rename from ntp/ntp.conf.polito.it rename to PlanetLabConf/ntp/ntp.conf.polito.it diff --git a/ntp/ntp.conf.prob.default b/PlanetLabConf/ntp/ntp.conf.prob.default similarity index 100% rename from ntp/ntp.conf.prob.default rename to PlanetLabConf/ntp/ntp.conf.prob.default diff --git a/ntp/ntp.conf.se b/PlanetLabConf/ntp/ntp.conf.se similarity index 100% rename from ntp/ntp.conf.se rename to PlanetLabConf/ntp/ntp.conf.se diff --git a/ntp/ntp.conf.sics.se b/PlanetLabConf/ntp/ntp.conf.sics.se similarity index 100% rename from ntp/ntp.conf.sics.se rename to PlanetLabConf/ntp/ntp.conf.sics.se diff --git a/ntp/ntp.conf.uk b/PlanetLabConf/ntp/ntp.conf.uk similarity index 100% rename from ntp/ntp.conf.uk rename to PlanetLabConf/ntp/ntp.conf.uk diff --git a/ntp/ntp.conf.ukc.ac.uk b/PlanetLabConf/ntp/ntp.conf.ukc.ac.uk similarity index 100% rename from ntp/ntp.conf.ukc.ac.uk rename to PlanetLabConf/ntp/ntp.conf.ukc.ac.uk diff --git a/ntp/step-tickers.php b/PlanetLabConf/ntp/step-tickers.php similarity index 100% rename from ntp/step-tickers.php rename to PlanetLabConf/ntp/step-tickers.php diff --git a/ntptickers.php b/PlanetLabConf/ntptickers.php similarity index 100% rename from ntptickers.php rename to PlanetLabConf/ntptickers.php diff --git a/propd.conf b/PlanetLabConf/propd.conf similarity index 100% rename from propd.conf rename to PlanetLabConf/propd.conf diff --git a/proxies.php b/PlanetLabConf/proxies.php similarity index 100% rename from proxies.php rename to PlanetLabConf/proxies.php diff --git a/sendmail.cf b/PlanetLabConf/sendmail.cf similarity index 100% rename from sendmail.cf rename to PlanetLabConf/sendmail.cf diff --git a/sendmail.mc b/PlanetLabConf/sendmail.mc similarity index 100% rename from sendmail.mc rename to PlanetLabConf/sendmail.mc diff --git a/slocate.cron b/PlanetLabConf/slocate.cron similarity index 100% rename from slocate.cron rename to PlanetLabConf/slocate.cron diff --git a/sshd_config b/PlanetLabConf/sshd_config similarity index 100% rename from sshd_config rename to PlanetLabConf/sshd_config diff --git a/sudoers b/PlanetLabConf/sudoers similarity index 100% rename from sudoers rename to PlanetLabConf/sudoers diff --git a/sysctl.php b/PlanetLabConf/sysctl.php similarity index 100% rename from sysctl.php rename to PlanetLabConf/sysctl.php diff --git a/yum.conf.php b/PlanetLabConf/yum.conf.php similarity index 100% rename from yum.conf.php rename to PlanetLabConf/yum.conf.php diff --git a/boot/getnodeid.php b/boot/getnodeid.php new file mode 100755 index 0000000..004ce23 --- /dev/null +++ b/boot/getnodeid.php @@ -0,0 +1,29 @@ + +// Copyright (C) 2006 The Trustees of Princeton University +// +// $Id$ $ +// + +// Get admin API handle +require_once 'plc_api.php'; +global $adm; + +if (!empty($_REQUEST['mac_addr'])) { + $mac_lower = strtolower(trim($_REQUEST['mac_addr'])); + $mac_upper = strtoupper(trim($_REQUEST['mac_addr'])); + $nodenetworks = $adm->GetNodeNetworks(array('mac' => array($mac_lower, $mac_upper))); +} else { + $nodenetworks = $adm->GetNodeNetworks(array('ip' => $_SERVER['REMOTE_ADDR'])); +} + +if (!empty($nodenetworks)) { + print $nodenetworks[0]['node_id']; +} else { + print "-1"; +} + +?> diff --git a/boot/index.php b/boot/index.php new file mode 100755 index 0000000..ba7dc7b --- /dev/null +++ b/boot/index.php @@ -0,0 +1,80 @@ + +// Copyright (C) 2006 The Trustees of Princeton University +// +// $Id$ $ +// + +// Get admin API handle +require_once 'plc_api.php'; +global $adm; + +// Default bootmanager +$bootmanager = "bootmanager.sh.sgn"; + +// Look up the node +$nodenetworks = $adm->GetNodeNetworks(array('ip' => $_SERVER['REMOTE_ADDR'])); +if (!empty($nodenetworks)) { + $nodes = $adm->GetNodes(array($nodenetworks[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 node group, e.g. + // alpha_bootmanager.sh.sgn + if (!empty($node['nodegroup_ids'])) { + $nodegroups = $adm->GetNodeGroups($node['nodegroup_ids']); + foreach ($nodegroups as $nodegroup) { + $bootmanagers[] = strtolower($nodegroup['name']) . "_" . $bootmanager; + } + } +} + +// Default bootmanager +$bootmanagers[] = $bootmanager; + +foreach ($bootmanagers as $bootmanager) { + if (file_exists($bootmanager)) { + readfile($bootmanager); + exit(); + } +} + +?> diff --git a/boot/uudecode.gz b/boot/uudecode.gz new file mode 100755 index 0000000000000000000000000000000000000000..040c34faa8ffdc3823e1864161b26750f9ae4688 GIT binary patch literal 4317 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