bugfix for ssh key generation (were all typed rsa1)
[bootmanager.git] / source / steps / InstallWriteConfig.py
1 #!/usr/bin/python
2 #
3 # Copyright (c) 2003 Intel Corporation
4 # All rights reserved.
5 #
6 # Copyright (c) 2004-2006 The Trustees of Princeton University
7 # All rights reserved.
8 # expected /proc/partitions format
9
10 import os
11 import os.path
12
13 from Exceptions import *
14 import utils
15 import BootAPI
16 import ModelOptions
17
18 def Run(vars, log):
19
20     """
21     Writes out the following configuration files for the node:
22     /etc/fstab
23     /etc/resolv.conf (if applicable)
24     /etc/ssh/ssh_host_key
25     /etc/ssh/ssh_host_rsa_key
26     /etc/ssh/ssh_host_dsa_key
27     
28     Expect the following variables from the store:
29     VERSION                 the version of the install
30     SYSIMG_PATH             the path where the system image will be mounted
31                             (always starts with TEMP_PATH)
32     PARTITIONS              dictionary of generic part. types (root/swap)
33                             and their associated devices.
34     PLCONF_DIR              The directory to store the configuration file in
35     INTERFACE_SETTINGS  A dictionary of the values from the network
36                                 configuration file
37     Sets the following variables:
38     None
39     
40     """
41
42     log.write( "\n\nStep: Install: Writing configuration files.\n")
43     
44     # make sure we have the variables we need
45     try:
46         VERSION = vars["VERSION"]
47         if VERSION == "":
48             raise ValueError("VERSION")
49
50         SYSIMG_PATH = vars["SYSIMG_PATH"]
51         if SYSIMG_PATH == "":
52             raise ValueError("SYSIMG_PATH")
53
54         PARTITIONS = vars["PARTITIONS"]
55         if PARTITIONS == None:
56             raise ValueError("PARTITIONS")
57
58         PLCONF_DIR = vars["PLCONF_DIR"]
59         if PLCONF_DIR == "":
60             raise ValueError("PLCONF_DIR")
61
62         INTERFACE_SETTINGS = vars["INTERFACE_SETTINGS"]
63         if INTERFACE_SETTINGS == "":
64             raise ValueError("INTERFACE_SETTINGS")
65
66     except KeyError, var:
67         raise BootManagerException("Missing variable in vars: {}\n".format(var))
68     except ValueError, var:
69         raise BootManagerException("Variable in vars, shouldn't be: {}\n".format(var))
70
71     log.write("Setting local time to UTC\n")
72     utils.sysexec_chroot(SYSIMG_PATH,
73         "ln -sf /usr/share/zoneinfo/UTC /etc/localtime", log)
74
75     log.write("Creating system directory {}\n".format(PLCONF_DIR))
76     if not utils.makedirs("{}/{}".format(SYSIMG_PATH, PLCONF_DIR)):
77         log.write("Unable to create directory\n")
78         return 0
79
80     log.write("Writing system /etc/fstab\n")
81     fstab = file("{}/etc/fstab".format(SYSIMG_PATH), "w")
82     fstab.write("{}           none        swap      sw        0 0\n"\
83                 .format(PARTITIONS["mapper-swap"]))
84     fstab.write("{}           /           ext3      defaults  1 1\n"\
85                 .format(PARTITIONS["mapper-root"]))
86     if (vars['ONE_PARTITION'] != '1'):
87         if vars['virt'] == 'vs':
88             fstab.write("{}           /vservers   ext3      tagxid,defaults  1 2\n"\
89                         .format(PARTITIONS["mapper-vservers"]))
90         else:
91             fstab.write("{}           /vservers   btrfs     defaults  1 2\n"\
92                         .format(PARTITIONS["mapper-vservers"]))
93     fstab.write("none         /proc       proc      defaults  0 0\n")
94     fstab.write("none         /dev/shm    tmpfs     defaults  0 0\n")
95     fstab.write("none         /dev/pts    devpts    defaults  0 0\n")
96     fstab.close()
97
98     log.write("Writing system /etc/issue\n")
99     issue= file("{}/etc/issue".format(SYSIMG_PATH), "w")
100     issue.write("PlanetLab Node: \\n\n")
101     issue.write("Kernel \\r on an \\m\n")
102     issue.write("http://www.planet-lab.org\n\n")
103     issue.close()
104
105     if (vars['ONE_PARTITION'] != '1'):
106         log.write("Setting up authentication (non-ssh)\n")
107         utils.sysexec_chroot(SYSIMG_PATH, "authconfig --nostart --kickstart --enablemd5 " \
108                        "--enableshadow", log)
109         utils.sysexec("sed -e 's/^root\:\:/root\:*\:/g' " \
110                        "{}/etc/shadow > {}/etc/shadow.new".format(SYSIMG_PATH, SYSIMG_PATH), log)
111         utils.sysexec_chroot(SYSIMG_PATH, "mv " \
112                        "/etc/shadow.new /etc/shadow", log)
113         utils.sysexec_chroot(SYSIMG_PATH, "chmod 400 /etc/shadow", log)
114
115     # if we are setup with dhcp, copy the current /etc/resolv.conf into
116     # the system image so we can run programs inside that need network access
117     method = ""
118     try:
119         method = vars['INTERFACE_SETTINGS']['method']
120     except:
121         pass
122     
123     if method == "dhcp":
124         utils.sysexec("cp /etc/resolv.conf {}/etc/".format(SYSIMG_PATH), log)
125
126     log.write("Writing node install version\n")
127     utils.makedirs("{}/etc/planetlab".format(SYSIMG_PATH))
128     ver = file("{}/etc/planetlab/install_version".format(SYSIMG_PATH), "w")
129     ver.write("{}\n".format(VERSION))
130     ver.close()
131
132     # for upgrades : do not overwrite already existing keys 
133     log.write("Creating ssh host keys\n")
134     key_gen_prog = "/usr/bin/ssh-keygen"
135
136     key_specs = [
137         ("/etc/ssh/ssh_host_key",     'rsa1', "SSH1 RSA"),
138         ("/etc/ssh/ssh_host_rsa_key", 'rsa',  "SSH2 RSA"),
139         ("/etc/ssh/ssh_host_dsa_key", 'dsa',  "SSH2 DSA"),
140     ]
141
142     for key_file, key_type, label in key_specs:
143         abs_file = "{}/{}".format(SYSIMG_PATH, key_file)
144         if not os.path.exists(abs_file):
145             log.write("Generating {} host key {}\n".format(label, key_file))
146             utils.sysexec_chroot(SYSIMG_PATH, "{} -q -t {} -f {} -C '' -N ''"\
147                                  .format(key_gen_prog, key_type, key_file), log)
148             utils.sysexec("chmod 600 {}/{}".format(SYSIMG_PATH, key_file), log)
149             utils.sysexec("chmod 644 {}/{}.pub".format(SYSIMG_PATH, key_file), log)
150
151     return 1