X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Futils.py;h=3c6c2251ad9066f48efed6390e2e3ebe56d2f45f;hb=fe187578330e8a1e7bef8f873880ede59318d1e9;hp=cb1bc4d59da03de5d20212dba5666782ed6e1893;hpb=69deaa38d4e796a88bb87d961fa71f76fd2be813;p=bootmanager.git diff --git a/source/utils.py b/source/utils.py index cb1bc4d..3c6c225 100644 --- a/source/utils.py +++ b/source/utils.py @@ -1,8 +1,5 @@ #!/usr/bin/python # -# $Id$ -# $URL$ -# # Copyright (c) 2003 Intel Corporation # All rights reserved. # @@ -20,20 +17,26 @@ import exceptions from Exceptions import * +#################### +# the simplest way to debug is to let the node take off, +# ssh into it as root using the debug ssh key in /etc/planetlab +# then go to /tmp/source +# edit this file locally to turn on breakpoints if needed, then run +# ./BootManager.py +#################### ### handling breakpoints in the startup process import select, sys, string -### global debug settings -# NOTE. when BREAKPOINT_MODE turns out enabled, -# you have to attend the boot phase, that would hang otherwise +### global debugging settings # enabling this will cause the node to ask for breakpoint-mode at startup # production code should read False/False PROMPT_MODE=False # default for when prompt is turned off, or it's on but the timeout triggers BREAKPOINT_MODE=False -VERBOSE_MODE=False + +# verbose mode is just fine VERBOSE_MODE=True # in seconds : if no input, proceed PROMPT_TIMEOUT=5 @@ -120,8 +123,7 @@ def removedir( path ): return 1 - -def sysexec( cmd, log= None, fsck = False ): +def sysexec( cmd, log=None, fsck=False, shell=False ): """ execute a system command, output the results to the logger if log <> None @@ -130,14 +132,23 @@ def sysexec( cmd, log= None, fsck = False ): 0 if failed. A BootManagerException is raised if the command was unable to execute or was interrupted by the user with Ctrl+C """ - if VERBOSE_MODE: - print ("sysexec >>> %s" % cmd) - try: - if cmd.__contains__(">"): + # Thierry - Jan. 6 2011 + # would probably make sense to look for | here as well + # however this is fragile and hard to test thoroughly + # let the caller set 'shell' when that is desirable + if shell or cmd.__contains__(">"): prog = subprocess.Popen(cmd, shell=True) + if log is not None: + log.write("sysexec (shell mode) >>> %s" % cmd) + if VERBOSE_MODE: + print "sysexec (shell mode) >>> %s" % cmd else: prog = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if log is not None: + log.write("sysexec >>> %s\n" % cmd) + if VERBOSE_MODE: + print "sysexec >>> %s" % cmd except OSError: raise BootManagerException, \ "Unable to create instance of subprocess.Popen " \ @@ -147,8 +158,12 @@ def sysexec( cmd, log= None, fsck = False ): except KeyboardInterrupt: raise BootManagerException, "Interrupted by user" + # log stdout & stderr if log is not None: - log.write(stdoutdata) + if stdoutdata: + log.write("==========stdout\n"+stdoutdata) + if stderrdata: + log.write("==========stderr\n"+stderrdata) returncode = prog.wait() @@ -172,7 +187,7 @@ def sysexec( cmd, log= None, fsck = False ): return 1 -def sysexec_chroot( path, cmd, log= None ): +def sysexec_chroot( path, cmd, log=None, shell=False): """ same as sysexec, but inside a chroot """ @@ -184,29 +199,29 @@ def sysexec_chroot( path, cmd, log= None ): if not os.path.exists(library): shutil.copy("./libc-opendir-hack.so", library) preload = "/bin/env LD_PRELOAD=/lib/libc-opendir-hack.so" - sysexec("chroot %s %s %s" % (path, preload, cmd), log) + sysexec("chroot %s %s %s" % (path, preload, cmd), log, shell=shell) -def sysexec_chroot_noerr( path, cmd, log= None ): +def sysexec_chroot_noerr( path, cmd, log=None, shell=False ): """ same as sysexec_chroot, but capture boot manager exceptions """ try: rc= 0 - rc= syexec_chroot( cmd, log ) + rc= sysexec_chroot( cmd, log, shell=shell ) except BootManagerException, e: pass return rc -def sysexec_noerr( cmd, log= None ): +def sysexec_noerr( cmd, log=None, shell=False ): """ same as sysexec, but capture boot manager exceptions """ try: rc= 0 - rc= sysexec( cmd, log ) + rc= sysexec( cmd, log, shell=shell ) except BootManagerException, e: pass