#!/usr/bin/python
-
+#
# Copyright (c) 2003 Intel Corporation
# All rights reserved.
#
# All rights reserved.
# expected /proc/partitions format
-import os, string
+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:
"""
- 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
+ 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" )
+ 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 %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 )
+ 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 %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 )
-
+ # 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