various cleanups and cosmetic improvements in utils and InstallWriteConfig
[bootmanager.git] / source / steps / InstallWriteConfig.py
index 60a53c3..95f5069 100644 (file)
@@ -1,5 +1,4 @@
-#!/usr/bin/python2
-
+#
 # Copyright (c) 2003 Intel Corporation
 # All rights reserved.
 #
@@ -7,15 +6,16 @@
 # All rights reserved.
 # expected /proc/partitions format
 
-import os, string
+# pylint: disable=c0111, c0103
+
+import os
+import os.path
 
 from Exceptions import *
 import utils
-import systeminfo
-import BootAPI
-import ModelOptions
 
-def Run( vars, log ):
+
+def Run(vars, log):
 
     """
     Writes out the following configuration files for the node:
@@ -24,7 +24,7 @@ def Run( vars, log ):
     /etc/ssh/ssh_host_key
     /etc/ssh/ssh_host_rsa_key
     /etc/ssh/ssh_host_dsa_key
-    
+
     Expect the following variables from the store:
     VERSION                 the version of the install
     SYSIMG_PATH             the path where the system image will be mounted
@@ -32,131 +32,131 @@ def Run( vars, log ):
     PARTITIONS              dictionary of generic part. types (root/swap)
                             and their associated devices.
     PLCONF_DIR              The directory to store the configuration file in
-    NETWORK_SETTINGS  A dictionary of the values from the network
+    INTERFACE_SETTINGS  A dictionary of the values from the network
                                 configuration file
-    BOOT_CD_VERSION          A tuple of the current bootcd version
-    
     Sets the following variables:
     None
-    
+
     """
 
-    log.write( "\n\nStep: Install: Writing configuration files.\n" )
-    
+    log.write("\n\nStep: Install: Writing configuration files.\n")
+
     # make sure we have the variables we need
     try:
-        VERSION= vars["VERSION"]
+        VERSION = vars["VERSION"]
         if VERSION == "":
-            raise ValueError, "VERSION"
+            raise ValueError("VERSION")
 
-        SYSIMG_PATH= vars["SYSIMG_PATH"]
+        SYSIMG_PATH = vars["SYSIMG_PATH"]
         if SYSIMG_PATH == "":
-            raise ValueError, "SYSIMG_PATH"
+            raise ValueError("SYSIMG_PATH")
 
-        PARTITIONS= vars["PARTITIONS"]
-        if PARTITIONS == None:
-            raise ValueError, "PARTITIONS"
+        PARTITIONS = vars["PARTITIONS"]
+        if PARTITIONS is None:
+            raise ValueError("PARTITIONS")
 
-        PLCONF_DIR= vars["PLCONF_DIR"]
+        PLCONF_DIR = vars["PLCONF_DIR"]
         if PLCONF_DIR == "":
-            raise ValueError, "PLCONF_DIR"
-
-        NETWORK_SETTINGS= vars["NETWORK_SETTINGS"]
-        if NETWORK_SETTINGS == "":
-            raise ValueError, "NETWORK_SETTINGS"
+            raise ValueError("PLCONF_DIR")
 
-        BOOT_CD_VERSION= vars["BOOT_CD_VERSION"]
-        if BOOT_CD_VERSION == "":
-            raise ValueError, "BOOT_CD_VERSION"
+        INTERFACE_SETTINGS = vars["INTERFACE_SETTINGS"]
+        if INTERFACE_SETTINGS == "":
+            raise ValueError("INTERFACE_SETTINGS")
 
-    except KeyError, var:
-        raise BootManagerException, "Missing variable in vars: %s\n" % var
-    except ValueError, var:
-        raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var
+    except KeyError as var:
+        raise BootManagerException("Missing variable in vars: {}\n".format(var))
+    except ValueError as var:
+        raise BootManagerException("Variable in vars, shouldn't be: {}\n".format(var))
 
-    log.write( "Setting local time to UTC\n" )
-    utils.sysexec( "chroot %s ln -sf /usr/share/zoneinfo/UTC /etc/localtime" % \
-                   SYSIMG_PATH, log )
+    log.write("Setting local time to UTC\n")
+    utils.sysexec_chroot(
+        SYSIMG_PATH,
+        "ln -sf /usr/share/zoneinfo/UTC /etc/localtime", log)
 
-    log.write( "Enabling ntp at boot\n" )
-    utils.sysexec( "chroot %s chkconfig ntpd on" % SYSIMG_PATH, log )
-
-    log.write( "Creating system directory %s\n" % PLCONF_DIR )
-    if not utils.makedirs( "%s/%s" % (SYSIMG_PATH,PLCONF_DIR) ):
-        log.write( "Unable to create directory\n" )
+    log.write("Creating system directory {}\n".format(PLCONF_DIR))
+    if not utils.makedirs("{}/{}".format(SYSIMG_PATH, PLCONF_DIR)):
+        log.write("Unable to create directory\n")
         return 0
 
-    log.write( "Writing system /etc/fstab\n" )
-    fstab= file( "%s/etc/fstab" % SYSIMG_PATH, "w" )
-    fstab.write( "%s           none        swap      sw        0 0\n" % \
-                 PARTITIONS["mapper-swap"] )
-    fstab.write( "%s           /           ext3      defaults  0 0\n" % \
-                 PARTITIONS["mapper-root"] )
-    fstab.write( "%s           /vservers   ext3      tagxid,defaults  0 0\n" % \
-                 PARTITIONS["mapper-vservers"] )
-    fstab.write( "none         /proc       proc      defaults  0 0\n" )
-    fstab.write( "none         /dev/shm    tmpfs     defaults  0 0\n" )
-    fstab.write( "none         /dev/pts    devpts    defaults  0 0\n" )
-    # no longer needed
-    # fstab.write( "none         /rcfs       rcfs      defaults  0 0\n" )
-    fstab.close()
-
-    log.write( "Writing system /etc/issue\n" )
-    issue= file( "%s/etc/issue" % SYSIMG_PATH, "w" )
-    issue.write( "PlanetLab Node: \\n\n" )
-    issue.write( "Kernel \\r on an \\m\n" )
-    issue.write( "http://www.planet-lab.org\n\n" )
-    issue.close()
-
-    log.write( "Setting up authentication (non-ssh)\n" )
-    utils.sysexec( "chroot %s authconfig --nostart --kickstart --enablemd5 " \
-                   "--enableshadow" % SYSIMG_PATH, log )
-    utils.sysexec( "sed -e 's/^root\:\:/root\:*\:/g' " \
-                   "%s/etc/shadow > %s/etc/shadow.new" % \
-                   (SYSIMG_PATH,SYSIMG_PATH), log )
-    utils.sysexec( "chroot %s mv " \
-                   "/etc/shadow.new /etc/shadow" % SYSIMG_PATH, log )
-    utils.sysexec( "chroot %s chmod 400 /etc/shadow" % SYSIMG_PATH, log )
+    log.write("Writing system /etc/fstab\n")
+    with open("{}/etc/fstab".format(SYSIMG_PATH), "w") as fstab:
+        fstab.write("{}           none        swap      sw        0 0\n"\
+                    .format(PARTITIONS["swap"]))
+        fstab.write("{}           /           ext3      defaults  1 1\n"\
+                    .format(PARTITIONS["root"]))
+        if (vars['ONE_PARTITION'] != '1'):
+            if vars['virt'] == 'vs':
+                fstab.write("{}           /vservers   ext3      tagxid,defaults  1 2\n"\
+                            .format(PARTITIONS["vservers"]))
+            else:
+                fstab.write("{}           /vservers   btrfs     defaults  1 2\n"\
+                            .format(PARTITIONS["vservers"]))
+        fstab.write("none         /proc       proc      defaults  0 0\n")
+        fstab.write("none         /dev/shm    tmpfs     defaults  0 0\n")
+        fstab.write("none         /dev/pts    devpts    defaults  0 0\n")
+
+    log.write("Writing system /etc/issue\n")
+    with open("{}/etc/issue".format(SYSIMG_PATH), "w") as issue:
+        issue.write("PlanetLab Node: \\n\n")
+        issue.write("Kernel \\r on an \\m\n")
+        issue.write("http://www.planet-lab.org\n\n")
+
+    if (vars['ONE_PARTITION'] != '1'):
+        log.write("Setting up authentication (non-ssh)\n")
+        utils.sysexec_chroot(SYSIMG_PATH, "authconfig --nostart --kickstart --enablemd5 " \
+                       "--enableshadow", log)
+        utils.sysexec("sed -e 's/^root\:\:/root\:*\:/g' " \
+                       "{}/etc/shadow > {}/etc/shadow.new".format(SYSIMG_PATH, SYSIMG_PATH), log)
+        utils.sysexec_chroot(SYSIMG_PATH, "mv " \
+                       "/etc/shadow.new /etc/shadow", log)
+        utils.sysexec_chroot(SYSIMG_PATH, "chmod 400 /etc/shadow", log)
 
     # if we are setup with dhcp, copy the current /etc/resolv.conf into
     # the system image so we can run programs inside that need network access
-    method= ""
+    method = ""
     try:
-        method= vars['NETWORK_SETTINGS']['method']
+        method = vars['INTERFACE_SETTINGS']['method']
     except:
         pass
-    
+
     if method == "dhcp":
-        utils.sysexec( "cp /etc/resolv.conf %s/etc/" % SYSIMG_PATH, log )
-
-    log.write( "Writing node install version\n" )
-    utils.makedirs( "%s/etc/planetlab" % SYSIMG_PATH )
-    ver= file( "%s/etc/planetlab/install_version" % SYSIMG_PATH, "w" )
-    ver.write( "%s\n" % VERSION )
-    ver.close()
-
-    log.write( "Creating ssh host keys\n" )
-    key_gen_prog= "/usr/bin/ssh-keygen"
-
-    log.write( "Generating SSH1 RSA host key:\n" )
-    key_file= "/etc/ssh/ssh_host_key"
-    utils.sysexec( "chroot %s %s -q -t rsa1 -f %s -C '' -N ''" %
-                   (SYSIMG_PATH,key_gen_prog,key_file), log )
-    utils.sysexec( "chmod 600 %s/%s" % (SYSIMG_PATH,key_file), log )
-    utils.sysexec( "chmod 644 %s/%s.pub" % (SYSIMG_PATH,key_file), log )
-    
-    log.write( "Generating SSH2 RSA host key:\n" )
-    key_file= "/etc/ssh/ssh_host_rsa_key"
-    utils.sysexec( "chroot %s %s -q -t rsa -f %s -C '' -N ''" %
-                   (SYSIMG_PATH,key_gen_prog,key_file), log )
-    utils.sysexec( "chmod 600 %s/%s" % (SYSIMG_PATH,key_file), log )
-    utils.sysexec( "chmod 644 %s/%s.pub" % (SYSIMG_PATH,key_file), log )
-    
-    log.write( "Generating SSH2 DSA host key:\n" )
-    key_file= "/etc/ssh/ssh_host_dsa_key"
-    utils.sysexec( "chroot %s %s -q -t dsa -f %s -C '' -N ''" %
-                   (SYSIMG_PATH,key_gen_prog,key_file), log )
-    utils.sysexec( "chmod 600 %s/%s" % (SYSIMG_PATH,key_file), log )
-    utils.sysexec( "chmod 644 %s/%s.pub" % (SYSIMG_PATH,key_file), log )
+        utils.sysexec("cp /etc/resolv.conf {}/etc/".format(SYSIMG_PATH), log)
+
+    log.write("Writing node install_version\n")
+    utils.makedirs("{}/etc/planetlab".format(SYSIMG_PATH))
+    with open("{}/etc/planetlab/install_version".format(SYSIMG_PATH), "w") as ver:
+        ver.write("{}\n".format(VERSION))
+
+    # for upgrades : do not overwrite already existing keys
+    log.write("Creating ssh host keys\n")
+    key_gen_prog = "/usr/bin/ssh-keygen"
+
+    # fedora23 seems to come with a release of openssh that lacks suppport
+    # for ssh1, and thus rsa1 keys; so we consider that failing to produce
+    # the rsa1 key is not a showstopper
+    key_specs = [
+        ("/etc/ssh/ssh_host_key",     'rsa1', "SSH1 RSA", False),
+        ("/etc/ssh/ssh_host_rsa_key", 'rsa',  "SSH2 RSA", True),
+        ("/etc/ssh/ssh_host_dsa_key", 'dsa',  "SSH2 DSA", True),
+    ]
+
+    for key_file, key_type, label, mandatory in key_specs:
+        abs_file = "{}/{}".format(SYSIMG_PATH, key_file)
+        if not os.path.exists(abs_file):
+            log.write("Generating {} host key {} (mandatory success={})\n"
+                      .format(label, key_file, mandatory))
+            if mandatory:
+                run = utils.sysexec
+                run_chroot = utils.sysexec_chroot
+            else:
+                run = utils.sysexec_noerr
+                run_chroot = utils.sysexec_chroot_noerr
+            run_chroot(
+                SYSIMG_PATH,
+                "{} -q -t {} -f {} -C '' -N ''"
+                .format(key_gen_prog, key_type, key_file),
+                log)
+            run("chmod 600 {}/{}".format(SYSIMG_PATH, key_file), log)
+            run("chmod 644 {}/{}.pub".format(SYSIMG_PATH, key_file), log)
 
     return 1