X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Fsteps%2FInstallBootstrapRPM.py;h=c8baeade83abde8c0d4dd5811c54158052f0a7b3;hb=71e980d4bdb9ecf0289a1a30c76fad8b6c5deb7a;hp=6d3e22d7eccf13aaab7def1545cd2ac396a32c79;hpb=7ab7e9dd797333a9fdc8604554e16e192a32144d;p=bootmanager.git diff --git a/source/steps/InstallBootstrapRPM.py b/source/steps/InstallBootstrapRPM.py index 6d3e22d..c8baead 100644 --- a/source/steps/InstallBootstrapRPM.py +++ b/source/steps/InstallBootstrapRPM.py @@ -43,6 +43,7 @@ import os, sys, string import popen2 +import shutil from Exceptions import * import utils @@ -58,14 +59,15 @@ def Run( vars, log ): SYSIMG_PATH the path where the system image will be mounted PARTITIONS dictionary of generic part. types (root/swap) and their associated devices. - ALPINA_SERVER_DIR directory on the boot servers containing alpina + SUPPORT_FILE_DIR directory on the boot servers containing scripts and support files - INSTALL_LANGS languages for install (used by rpm) NODE_ID the id of this machine 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" ) @@ -80,13 +82,9 @@ def Run( vars, log ): if PARTITIONS == None: raise ValueError, "PARTITIONS" - ALPINA_SERVER_DIR= vars["ALPINA_SERVER_DIR"] - if ALPINA_SERVER_DIR == None: - raise ValueError, "ALPINA_SERVER_DIR" - - INSTALL_LANGS= vars["INSTALL_LANGS"] - if INSTALL_LANGS == "": - raise ValueError, "INSTALL_LANGS" + SUPPORT_FILE_DIR= vars["SUPPORT_FILE_DIR"] + if SUPPORT_FILE_DIR == None: + raise ValueError, "SUPPORT_FILE_DIR" NODE_ID= vars["NODE_ID"] if NODE_ID == "": @@ -123,19 +121,29 @@ def Run( vars, log ): utils.sysexec( "mount -t ext3 %s %s/vservers" % (PARTITIONS["vservers"], SYSIMG_PATH), log ) + vars['ROOT_MOUNTED']= 1 + + # 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" % (ALPINA_SERVER_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 [ "PlanetLab-Bootstrap.tar.bz2", + "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) + 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 @@ -144,68 +152,32 @@ 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") + + # 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