X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Fsteps%2FInstallBootstrapRPM.py;h=c732119d5e36574879e0c9de2dbfd3867562f364;hb=80a8fdde181b28da43faa152732e0086ffbf2656;hp=0a7750d3d3dccc0167be38195178799c5d327bb8;hpb=d7d45eb9ef727324735774fd42e432730f8845db;p=bootmanager.git diff --git a/source/steps/InstallBootstrapRPM.py b/source/steps/InstallBootstrapRPM.py index 0a7750d..c732119 100644 --- a/source/steps/InstallBootstrapRPM.py +++ b/source/steps/InstallBootstrapRPM.py @@ -1,52 +1,20 @@ +#!/usr/bin/python2 + # Copyright (c) 2003 Intel Corporation # All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: - -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. - -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. - -# * Neither the name of the Intel Corporation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF -# YOUR JURISDICTION. It is licensee's responsibility to comply with any -# export regulations applicable in licensee's jurisdiction. Under -# CURRENT (May 2000) U.S. export regulations this software is eligible -# for export from the U.S. and can be downloaded by or otherwise -# exported or reexported worldwide EXCEPT to U.S. embargoed destinations -# which include Cuba, Iraq, Libya, North Korea, Iran, Syria, Sudan, -# Afghanistan and any other country to which the U.S. has embargoed -# goods and services. - - +# +# Copyright (c) 2004-2006 The Trustees of Princeton University +# All rights reserved. +# expected /proc/partitions format import os, sys, string import popen2 +import shutil from Exceptions import * import utils import BootServerRequest +import BootAPI def Run( vars, log ): @@ -65,6 +33,8 @@ def Run( vars, log ): Sets the following variables: TEMP_BOOTCD_PATH where the boot cd is remounted in the temp path + ROOT_MOUNTED set to 1 when the the base logical volumes + are mounted. """ log.write( "\n\nStep: Install: Bootstrapping RPM.\n" ) @@ -118,19 +88,39 @@ def Run( vars, log ): utils.sysexec( "mount -t ext3 %s %s/vservers" % (PARTITIONS["vservers"], SYSIMG_PATH), log ) + vars['ROOT_MOUNTED']= 1 + + # check which nodegroups we are part of (>=4.0) + tarballs = [] + try: + nodes = BootAPI.call_api_function(vars, "GetNodes", ([NODE_ID], ['nodegroup_ids'])) + node = nodes[0] + nodegroups = BootAPI.call_api_function(vars, "GetNodeGroups", (node['nodegroup_ids'], ['name'])) + for nodegroup in nodegroups: + tarballs.append("PlanetLab-Bootstrap-%s.tar.bz2" % nodegroup['name'].lower()) + except: + pass + tarballs += ["PlanetLab-Bootstrap.tar.bz2", "alpina-BootstrapRPM.tar.bz2"] + # download and extract support tarball for # this step, which has everything # we need to successfully run - step_support_file= "alpina-BootstrapRPM.tar.bz2" - source_file= "%s/%s" % (SUPPORT_FILE_DIR,step_support_file) - dest_file= "%s/%s" % (SYSIMG_PATH, step_support_file) - - # 30 is the connect timeout, 7200 is the max transfer time - # in seconds (2 hours) - log.write( "downloading %s\n" % step_support_file ) - result= bs_request.DownloadFile( source_file, None, None, - 1, 1, dest_file, - 30, 7200) + for step_support_file in tarballs: + source_file= "%s/%s" % (SUPPORT_FILE_DIR,step_support_file) + dest_file= "%s/%s" % (SYSIMG_PATH, step_support_file) + + # 30 is the connect timeout, 7200 is the max transfer time + # in seconds (2 hours) + log.write( "downloading %s\n" % step_support_file ) + result= bs_request.DownloadFile( source_file, None, None, + 1, 1, dest_file, + 30, 7200) + if result: + # New bootstrap tarball contains everything necessary to + # boot, no need to bootstrap further. + vars['SKIP_INSTALL_BASE']= (step_support_file == "PlanetLab-Bootstrap.tar.bz2") + break + if not result: raise BootManagerException, "Unable to download %s from server." % \ source_file @@ -139,68 +129,37 @@ def Run( vars, log ): result= utils.sysexec( "tar -C %s -xpjf %s" % (SYSIMG_PATH,dest_file), log ) utils.removefile( dest_file ) - # get the yum configuration file for this node (yum.conf). - # this needs to come from the configuration file service, - # so, if its a beta node, it'll install the beta rpms from - # the beginning. The configuration file service will return - # the url for the file we need to request to get the actual - # conf file, so two requests need to be made. - - # the only changes we will need to make to it are to change - # the cache and log directories, so when we run yum from - # the chrooted tempfs mount, it'll cache the rpms on the - # sysimg partition - - log.write( "Fetching URL for yum.conf from configuration file service\n" ) - - postVars= {"node_id" : NODE_ID, - "file" : "/etc/yum.conf"} - - yum_conf_url_file= "/tmp/yumconf.url" - - result= bs_request.DownloadFile( - "/db/plnodeconf/getsinglefile.php", - None, postVars, 1, 1, yum_conf_url_file) - - if result == 0: - log.write( "Unable to make request to get url for yum.conf\n" ) - return 0 - - try: - yum_conf_url= file(yum_conf_url_file,"r").read() - yum_conf_url= string.strip(yum_conf_url) - if yum_conf_url == "": - raise BootManagerException, \ - "Downloaded yum configuration file URL is empty." - except IOError: - raise BootManagerException, \ - "Unable to open downloaded yum configuration file URL." - - # now, get the actual contents of yum.conf for this node - log.write( "Fetching yum.conf contents from configuration file service\n" ) - - postVars= {} - download_file_loc= "%s/etc/yum.conf" % SYSIMG_PATH - - result= bs_request.DownloadFile( yum_conf_url, - None, postVars, 1, 1, - download_file_loc) - - if result == 0: - log.write( "Unable to make request to get yum.conf\n" ) - return 0 - # copy resolv.conf from the base system into our temp dir # so DNS lookups work correctly while we are chrooted log.write( "Copying resolv.conf to temp dir\n" ) utils.sysexec( "cp /etc/resolv.conf %s/etc/" % SYSIMG_PATH, log ) - # mount the boot cd in the temp path, under /mnt/cdrom. this way, - # we can use the certs when programs are running - # chrooted in the temp path - cdrom_mount_point= "%s/mnt/cdrom" % SYSIMG_PATH - utils.makedirs( cdrom_mount_point ) - log.write( "Copying contents of /usr/bootme to /mnt/cdrom\n" ) - utils.sysexec( "cp -r /usr/bootme %s/mnt/cdrom/" % SYSIMG_PATH, log ) + # Copy the boot server certificate(s) and GPG public key to + # /usr/boot in the temp dir. + log.write( "Copying boot server certificates and public key\n" ) + + if os.path.exists("/usr/boot"): + utils.makedirs(SYSIMG_PATH + "/usr") + shutil.copytree("/usr/boot", SYSIMG_PATH + "/usr/boot") + elif os.path.exists("/usr/bootme"): + utils.makedirs(SYSIMG_PATH + "/usr/boot") + boot_server = file("/usr/bootme/BOOTSERVER").readline().strip() + shutil.copy("/usr/bootme/cacert/" + boot_server + "/cacert.pem", + SYSIMG_PATH + "/usr/boot/cacert.pem") + file(SYSIMG_PATH + "/usr/boot/boot_server", "w").write(boot_server) + shutil.copy("/usr/bootme/pubring.gpg", SYSIMG_PATH + "/usr/boot/pubring.gpg") + + # For backward compatibility + if os.path.exists("/usr/bootme"): + utils.makedirs(SYSIMG_PATH + "/mnt/cdrom") + shutil.copytree("/usr/bootme", SYSIMG_PATH + "/mnt/cdrom/bootme") + + # Import the GPG key into the RPM database so that RPMS can be verified + utils.makedirs(SYSIMG_PATH + "/etc/pki/rpm-gpg") + utils.sysexec("gpg --homedir=/root --export --armor" \ + " --no-default-keyring --keyring %s/usr/boot/pubring.gpg" \ + " >%s/etc/pki/rpm-gpg/RPM-GPG-KEY-planetlab" % (SYSIMG_PATH, SYSIMG_PATH)) + utils.sysexec("chroot %s rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-planetlab" % \ + SYSIMG_PATH) return 1