X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Fsteps%2FInstallWriteConfig.py;h=381e9b1f4db1e4d2270e853628e0fb20c87f3800;hb=715575ebf8293ca92b3950ff19e70ea565628ab3;hp=8ae3f6df909910aa39fd0b662305d76d44f5519c;hpb=135271d073a8e7ddfe044ba62c35bb4f7a4676b0;p=bootmanager.git diff --git a/source/steps/InstallWriteConfig.py b/source/steps/InstallWriteConfig.py index 8ae3f6d..381e9b1 100644 --- a/source/steps/InstallWriteConfig.py +++ b/source/steps/InstallWriteConfig.py @@ -7,14 +7,15 @@ # All rights reserved. # expected /proc/partitions format -import os, string +import os +import os.path from Exceptions import * import utils import BootAPI import ModelOptions -def Run( vars, log ): +def Run(vars, log): """ Writes out the following configuration files for the node: @@ -38,124 +39,123 @@ def Run( vars, log ): """ - 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"] + PARTITIONS = vars["PARTITIONS"] if PARTITIONS == None: - raise ValueError, "PARTITIONS" + raise ValueError("PARTITIONS") - PLCONF_DIR= vars["PLCONF_DIR"] + PLCONF_DIR = vars["PLCONF_DIR"] if PLCONF_DIR == "": - raise ValueError, "PLCONF_DIR" + raise ValueError("PLCONF_DIR") - INTERFACE_SETTINGS= vars["INTERFACE_SETTINGS"] + INTERFACE_SETTINGS = vars["INTERFACE_SETTINGS"] if INTERFACE_SETTINGS == "": - raise ValueError, "INTERFACE_SETTINGS" + raise ValueError("INTERFACE_SETTINGS") except KeyError, var: - raise BootManagerException, "Missing variable in vars: %s\n" % var + raise BootManagerException("Missing variable in vars: {}\n".format(var)) except ValueError, var: - raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var - - log.write( "Setting local time to UTC\n" ) - utils.sysexec_chroot( SYSIMG_PATH, - "ln -sf /usr/share/zoneinfo/UTC /etc/localtime", log ) - - # clearly this does not depend on vs / lxc but let's keep it simple - log.write( "Enabling ntp at boot\n" ) - if vars['virt'] == 'vs': - utils.sysexec_chroot( SYSIMG_PATH, "chkconfig ntpd on", log ) - else: - utils.sysexec_chroot( SYSIMG_PATH, "systemctl enable ntpd.service", 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" ) + raise BootManagerException("Variable in vars, shouldn't be: {}\n".format(var)) + + log.write("Setting local time to UTC\n") + utils.sysexec_chroot(SYSIMG_PATH, + "ln -sf /usr/share/zoneinfo/UTC /etc/localtime", log) + + 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 1 1\n" % \ - PARTITIONS["mapper-root"] ) - if vars['virt'] == 'vs': - fstab.write( "%s /vservers ext3 tagxid,defaults 1 2\n" % \ - PARTITIONS["mapper-vservers"] ) - else: - fstab.write( "%s /vservers btrfs defaults 1 2\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" ) + log.write("Writing system /etc/fstab\n") + fstab = file("{}/etc/fstab".format(SYSIMG_PATH), "w") + 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") 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" ) + log.write("Writing system /etc/issue\n") + issue= file("{}/etc/issue".format(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( SYSIMG_PATH, "authconfig --nostart --kickstart --enablemd5 " \ - "--enableshadow", log ) - utils.sysexec( "sed -e 's/^root\:\:/root\:*\:/g' " \ - "%s/etc/shadow > %s/etc/shadow.new" % \ - (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 (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['INTERFACE_SETTINGS']['method'] + method = vars['INTERFACE_SETTINGS']['method'] except: pass if method == "dhcp": - utils.sysexec( "cp /etc/resolv.conf %s/etc/" % SYSIMG_PATH, log ) + utils.sysexec("cp /etc/resolv.conf {}/etc/".format(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 ) + log.write("Writing node install_version\n") + utils.makedirs("{}/etc/planetlab".format(SYSIMG_PATH)) + ver = file("{}/etc/planetlab/install_version".format(SYSIMG_PATH), "w") + ver.write("{}\n".format(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( SYSIMG_PATH, "%s -q -t rsa1 -f %s -C '' -N ''" % - (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( SYSIMG_PATH, "%s -q -t rsa -f %s -C '' -N ''" % - (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( SYSIMG_PATH, "%s -q -t dsa -f %s -C '' -N ''" % - (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 ) - + # 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