X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Futils.py;h=3c6c2251ad9066f48efed6390e2e3ebe56d2f45f;hb=819a7ca00b618108c382140e62395fb20b894607;hp=02a30cddfc093ddf647f3ce2cd99c853f5d0ec72;hpb=a0d22ecfe8b0fd6fd7b2363048919b6f0cdaa2ad;p=bootmanager.git diff --git a/source/utils.py b/source/utils.py index 02a30cd..3c6c225 100644 --- a/source/utils.py +++ b/source/utils.py @@ -17,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 @@ -117,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 @@ -127,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 " \ @@ -144,9 +158,12 @@ def sysexec( cmd, log= None, fsck = False ): except KeyboardInterrupt: raise BootManagerException, "Interrupted by user" + # log stdout & stderr if log is not None: - if stdoutdata is not None: - log.write(stdoutdata) + if stdoutdata: + log.write("==========stdout\n"+stdoutdata) + if stderrdata: + log.write("==========stderr\n"+stderrdata) returncode = prog.wait() @@ -170,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 """ @@ -182,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