- Copy the boot server certificate(s) and GPG public key to /usr/boot
[bootmanager.git] / source / steps / InstallBootstrapRPM.py
index 86d935d..e06b2c0 100644 (file)
@@ -43,6 +43,7 @@
 
 import os, sys, string
 import popen2
+import shutil
 
 from Exceptions import *
 import utils
@@ -126,16 +127,23 @@ def Run( vars, log ):
     # 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 [ "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
@@ -200,12 +208,27 @@ def Run( vars, log ):
     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