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 ssh_home = "/root/.ssh"
72 cancel_boot_flag = "/tmp/CANCEL_BOOT"
73 sshd_started_flag = "/tmp/SSHD_RUNNING"
76 pre_sshd_script = os.path.join(ssh_source_files, "pre-sshd")
77 if os.path.exists(pre_sshd_script):
78 utils.sysexec_noerr(pre_sshd_script, log)
80 # create host keys if needed
81 if not os.path.isdir (ssh_dir):
82 utils.makedirs (ssh_dir)
83 key=ssh_dir+"/ssh_host_key"
84 if not os.path.isfile (key):
85 log.write("Creating host rsa1 key %s\n"%key)
86 utils.sysexec( "ssh-keygen -t rsa1 -b 1024 -f %s -N ''" % key, log )
87 key=ssh_dir+"/ssh_host_rsa_key"
88 if not os.path.isfile (key):
89 log.write("Creating host rsa key %s\n"%key)
90 utils.sysexec( "ssh-keygen -t rsa -f %s -N ''" % key, log )
91 key=ssh_dir+"/ssh_host_dsa_key"
92 if not os.path.isfile (key):
93 log.write("Creating host dsa key %s\n"%key)
94 # very old versions did 'ssh-keygen -d' instead of 'ssh-keygen -t dsa'
95 utils.sysexec( "ssh-keygen -t dsa -f %s -N ''" % key, log )
97 # (over)write sshd config
98 utils.sysexec( "cp -f %s/sshd_config %s/sshd_config" % (ssh_source_files,ssh_dir), log )
100 ### xxx ### xxx ### xxx ### xxx ### xxx
102 # always update the key, may have changed in this instance of the bootmanager
103 log.write("Installing debug ssh key for root user\n")
104 if not os.path.isdir (ssh_home):
105 utils.makedirs(ssh_home)
106 utils.sysexec("cp -f {}/debug_root_ssh_key {}/authorized_keys".format(ssh_source_files, ssh_home), log)
107 utils.sysexec("chmod 700 {}".format(ssh_home), log)
108 utils.sysexec("chmod 600 {}/authorized_keys".format(ssh_home), log)
111 if not os.path.isfile(sshd_started_flag):
112 log.write("Starting sshd\n")
113 utils.sysexec("service sshd start", log)
114 # flag that ssh is running
115 utils.sysexec("touch {}".format(sshd_started_flag), log)
117 # it is expected that sshd is already running when last_resort==True
119 log.write("sshd is already running\n")
122 # this will make the initial script stop requesting scripts from PLC
123 utils.sysexec("touch {}".format(cancel_boot_flag), log)
126 print(warning_message)