3 # Copyright (c) 2003 Intel Corporation
6 # Copyright (c) 2004-2006 The Trustees of Princeton University
9 from __future__ import print_function
13 from Exceptions import *
19 ---------------------------------------------------------
20 This machine has entered a temporary debug state, so
21 Planetlab Support can login and fix any problems that
24 Please do not reboot this machine at this point, unless
25 specifically asked to.
28 ---------------------------------------------------------
32 # either at the end of the bm logic, because something failed (last_resort = True)
33 # and/or it can be invoked as a fallback very early in the bootmanager logic,
34 # so we can reach the node regardless of what happens (e.g. bm sometimes hangs)
36 def Run(vars, log, last_resort = True):
39 Bring up sshd inside the boot cd environment for debug purposes.
41 Once its running, touch the file /tmp/SSHD_RUNNING so future
42 calls to this function don't do anything.
44 Expect the following variables in vars to be set:
45 BM_SOURCE_DIR The source dir for the boot manager sources that
46 we are currently running from
50 message = "Starting debug mode"
52 message = "Starting fallback sshd"
55 log.write("\n\nStep: %s.\n"%message)
57 # make sure we have the variables we need
59 BM_SOURCE_DIR = vars["BM_SOURCE_DIR"]
60 if BM_SOURCE_DIR == "":
61 raise ValueError, "BM_SOURCE_DIR"
64 raise BootManagerException, "Missing variable in vars: %s\n" % var
65 except ValueError, var:
66 raise BootManagerException, "Variable in vars, shouldn't be: %s\n" % var
69 ssh_source_files = "%s/debug_files/" % BM_SOURCE_DIR
71 key_gen_prog = "ssh-keygen"
72 ssh_home = "/root/.ssh"
73 cancel_boot_flag = "/tmp/CANCEL_BOOT"
74 sshd_started_flag = "/tmp/SSHD_RUNNING"
77 pre_sshd_script = os.path.join(ssh_source_files, "pre-sshd")
78 if os.path.exists(pre_sshd_script):
79 utils.sysexec_noerr(pre_sshd_script, log)
81 # create host keys if needed
82 if not os.path.isdir (ssh_dir):
83 utils.makedirs (ssh_dir)
85 # original code used to specify -b 1024 for the rsa1 key
87 ("/etc/ssh/ssh_host_key", 'rsa1', "SSH1 RSA"),
88 ("/etc/ssh/ssh_host_rsa_key", 'rsa', "SSH2 RSA"),
89 ("/etc/ssh/ssh_host_dsa_key", 'dsa', "SSH2 DSA"),
92 for key_file, key_type, label in key_specs:
93 if not os.path.exists(key_file):
94 log.write("Creating {} host key {}\n".format(label, key_file))
95 utils.sysexec("{} -q -t {} -f {} -C '' -N ''"\
96 .format(key_gen_prog, key_type, key_file), log)
97 utils.sysexec("chmod 600 {}".format(key_file), log)
98 utils.sysexec("chmod 644 {}.pub".format(key_file), log)
100 # (over)write sshd config
101 utils.sysexec("cp -f {}/sshd_config {}/sshd_config".format(ssh_source_files, ssh_dir), log)
103 ### xxx ### xxx ### xxx ### xxx ### xxx
105 # always update the key, may have changed in this instance of the bootmanager
106 log.write("Installing debug ssh key for root user\n")
107 if not os.path.isdir (ssh_home):
108 utils.makedirs(ssh_home)
109 utils.sysexec("cp -f {}/debug_root_ssh_key {}/authorized_keys".format(ssh_source_files, ssh_home), log)
110 utils.sysexec("chmod 700 {}".format(ssh_home), log)
111 utils.sysexec("chmod 600 {}/authorized_keys".format(ssh_home), log)
114 if not os.path.isfile(sshd_started_flag):
115 log.write("Starting sshd\n")
116 utils.sysexec("service sshd start", log)
117 # flag that ssh is running
118 utils.sysexec("touch {}".format(sshd_started_flag), log)
120 # it is expected that sshd is already running when last_resort==True
122 log.write("sshd is already running\n")
125 # this will make the initial script stop requesting scripts from PLC
126 utils.sysexec("touch {}".format(cancel_boot_flag), log)
129 print(warning_message)