X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2Futils.py;h=736dd22caddc7d5c2259b9e9714682271df165f3;hb=a8863ce0224e67b368d735fe273ee86e3a110201;hp=5da5fcdf657adab7c593a36eb7b48a75609656e7;hpb=874e2525a59815be6a39e12f580337f9c44ff6cb;p=bootmanager.git diff --git a/source/utils.py b/source/utils.py index 5da5fcd..736dd22 100644 --- a/source/utils.py +++ b/source/utils.py @@ -1,44 +1,11 @@ +#!/usr/bin/python + # Copyright (c) 2003 Intel Corporation # All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: - -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. - -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. - -# * Neither the name of the Intel Corporation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF -# YOUR JURISDICTION. It is licensee's responsibility to comply with any -# export regulations applicable in licensee's jurisdiction. Under -# CURRENT (May 2000) U.S. export regulations this software is eligible -# for export from the U.S. and can be downloaded by or otherwise -# exported or reexported worldwide EXCEPT to U.S. embargoed destinations -# which include Cuba, Iraq, Libya, North Korea, Iran, Syria, Sudan, -# Afghanistan and any other country to which the U.S. has embargoed -# goods and services. - +# +# Copyright (c) 2004-2006 The Trustees of Princeton University +# All rights reserved. +# expected /proc/partitions format import os, sys, shutil import popen2 @@ -50,6 +17,62 @@ import exceptions from Exceptions import * +### 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 + +# 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=True +# in seconds : if no input, proceed +PROMPT_TIMEOUT=5 + +def prompt_for_breakpoint_mode (): + + global BREAKPOINT_MODE + if PROMPT_MODE: + default_answer=BREAKPOINT_MODE + answer='' + if BREAKPOINT_MODE: + display="[y]/n" + else: + display="y/[n]" + sys.stdout.write ("Want to run in breakpoint mode ? %s "%display) + sys.stdout.flush() + r,w,e = select.select ([sys.stdin],[],[],PROMPT_TIMEOUT) + if r: + answer = string.strip(sys.stdin.readline()) + else: + sys.stdout.write("\nTimed-out (%d s)"%PROMPT_TIMEOUT) + if answer: + BREAKPOINT_MODE = ( answer == "y" or answer == "Y") + else: + BREAKPOINT_MODE = default_answer + label="Off" + if BREAKPOINT_MODE: + label="On" + sys.stdout.write("\nCurrent BREAKPOINT_MODE is %s\n"%label) + +def breakpoint (message, cmd = None): + + if BREAKPOINT_MODE: + + if cmd is None: + cmd="/bin/sh" + message=message+" -- Entering bash - type ^D to proceed" + + print message + os.system(cmd) + + +######################################## def makedirs( path ): """ from python docs for os.makedirs: @@ -103,10 +126,12 @@ def sysexec( cmd, log= None ): 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) prog= popen2.Popen4( cmd, 0 ) if prog is None: raise BootManagerException, \ - "Unable to create instance of popen2.Popen3 " \ + "Unable to create instance of popen2.Popen4 " \ "for command: %s" % cmd if log is not None: @@ -117,6 +142,19 @@ def sysexec( cmd, log= None ): raise BootManagerException, "Interrupted by user" returncode= prog.wait() + # revert http://git.planet-lab.org/?p=bootmanager.git;a=commitdiff;h=cca3a2cd2096c0235dddb5982b1f05c8d4c7f916 + # as 256 returned by Python + # + ## cat test.py + #import popen2 + # + #cmd = "false" + #prog = popen2.Popen4( cmd, 0 ) + #returncode = prog.wait() + #print returncode + # + ## python test.py + # 256 if returncode != 0: raise BootManagerException, "Running %s failed (rc=%d)" % (cmd,returncode) @@ -124,6 +162,34 @@ def sysexec( cmd, log= None ): return 1 +def sysexec_chroot( path, cmd, log= None ): + """ + same as sysexec, but inside a chroot + """ + preload = "" + release = os.uname()[2] + # 2.6.12 kernels need this + if release[:5] == "2.6.1": + library = "%s/lib/libc-opendir-hack.so" % path + 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) + + +def sysexec_chroot_noerr( path, cmd, log= None ): + """ + same as sysexec_chroot, but capture boot manager exceptions + """ + try: + rc= 0 + rc= syexec_chroot( cmd, log ) + except BootManagerException, e: + pass + + return rc + + def sysexec_noerr( cmd, log= None ): """ same as sysexec, but capture boot manager exceptions