X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=source%2FBootManager.py;h=df15c37abfcfc4062b5e31904dd1edf89257b8ba;hb=dd9ac9e9e7edc861a7176e6bed6d23c3a726d0b4;hp=29497fe02b0104c6ed3af3dfc41ba35195f77e43;hpb=23382d6d7f912ec3340761d57e7cdc1d1b4f2f1a;p=bootmanager.git diff --git a/source/BootManager.py b/source/BootManager.py index 29497fe..df15c37 100755 --- a/source/BootManager.py +++ b/source/BootManager.py @@ -1,16 +1,14 @@ #!/usr/bin/python -u # -# $Id$ -# $URL$ -# # Copyright (c) 2003 Intel Corporation # All rights reserved. # # Copyright (c) 2004-2006 The Trustees of Princeton University # All rights reserved. +import sys, os +import traceback import string -import sys, os, traceback import time import gzip @@ -73,13 +71,13 @@ class log: format="%H:%M:%S(%Z) " - def __init__( self, OutputFilePath= None ): + def __init__(self, OutputFilePath=None): try: - self.OutputFile= open( OutputFilePath, "w") - self.OutputFilePath= OutputFilePath + self.OutputFile = open( OutputFilePath, "w") + self.OutputFilePath = OutputFilePath except: print( "bootmanager log : Unable to open output file %r, continuing"%OutputFilePath ) - self.OutputFile= None + self.OutputFile = None self.VARS = None try: @@ -89,29 +87,35 @@ class log: self.LogEntry( str(e) ) return - def LogEntry( self, str, inc_newline= 1, display_screen= 1 ): - now=time.strftime(log.format, time.localtime()) + def LogEntry(self, str, inc_newline = 1, display_screen = 1 ): + now = time.strftime(log.format, time.localtime()) if self.OutputFile: - self.OutputFile.write( now+str ) + self.OutputFile.write(now + str) if display_screen: - sys.stdout.write( now+str ) + sys.stdout.write(now + str) if inc_newline: if display_screen: - sys.stdout.write( "\n" ) + sys.stdout.write("\n") if self.OutputFile: - self.OutputFile.write( "\n" ) + self.OutputFile.write("\n") if self.OutputFile: self.OutputFile.flush() - def write( self, str ): + def write(self, str): """ make log behave like a writable file object (for traceback prints) """ - self.LogEntry( str, 0, 1 ) + self.LogEntry(str, 0, 1) + def print_stack(self): + """ + dump current stack in log + """ + self.write(traceback.format_exc()) + # bm log uploading is available back again, as of nodeconfig-5.0-2 def Upload( self, extra_file=None ): """ @@ -201,7 +205,7 @@ class BootManager: If requriements not met, but tests were succesfull, return 0. for steps that run within the installer, they are expected to either - complete succesfully and return 1, or throw an execption. + complete succesfully and return 1, or throw an exception. For exact return values and expected operations, see the comments at the top of each of the invididual step functions. @@ -232,7 +236,13 @@ class BootManager: InstallInit.Run( self.VARS, self.LOG ) ret = ValidateNodeInstall.Run( self.VARS, self.LOG ) if ret == 1: - WriteModprobeConfig.Run( self.VARS, self.LOG ) +# Thierry - feb. 2013 turning off WriteModprobeConfig for now on lxc +# for one thing this won't work at all with f18, as modules.pcimap +# has disappeared (Daniel suggested modules.aliases could be used instead) +# and second, in any case it's been years now that modprobe.conf was deprecated +# so most likely this code has no actual effect + if self.VARS['virt'] == 'vs': + WriteModprobeConfig.Run( self.VARS, self.LOG ) WriteNetworkConfig.Run( self.VARS, self.LOG ) CheckForNewDisks.Run( self.VARS, self.LOG ) SendHardwareConfigToPLC.Run( self.VARS, self.LOG ) @@ -274,6 +284,7 @@ class BootManager: self.VARS['STATE_CHANGE_NOTIFY']= 1 self.VARS['STATE_CHANGE_NOTIFY_MESSAGE']= \ notify_messages.MSG_INSTALL_FINISHED + AnsibleHook.Run( self.VARS, self.LOG ) UpdateBootStateWithPLC.Run( self.VARS, self.LOG ) _bootRun() @@ -286,13 +297,13 @@ class BootManager: if not ConfirmInstallWithUser.Run( self.VARS, self.LOG ): return 0 self.VARS['BOOT_STATE']= 'reinstall' - UpdateRunLevelWithPLC.Run( self.VARS, self.LOG ) + + AnsibleHook.Run( self.VARS, self.LOG ) _reinstallRun() def _debugRun(state='failboot'): # implements debug logic, which starts the sshd and just waits around self.VARS['RUN_LEVEL']=state - UpdateRunLevelWithPLC.Run( self.VARS, self.LOG ) StartDebug.Run( self.VARS, self.LOG ) # fsck/mount fs if present, and ignore return value if it's not. ValidateNodeInstall.Run( self.VARS, self.LOG ) @@ -313,6 +324,7 @@ class BootManager: InitializeBootManager.Run( self.VARS, self.LOG ) ReadNodeConfiguration.Run( self.VARS, self.LOG ) AuthenticateWithPLC.Run( self.VARS, self.LOG ) + UpdateLastBootOnce.Run( self.VARS, self.LOG ) StartRunlevelAgent.Run( self.VARS, self.LOG ) GetAndUpdateNodeDetails.Run( self.VARS, self.LOG ) @@ -320,7 +332,6 @@ class BootManager: if self.forceState is not None: self.VARS['BOOT_STATE']= self.forceState UpdateBootStateWithPLC.Run( self.VARS, self.LOG ) - UpdateRunLevelWithPLC.Run( self.VARS, self.LOG ) stateRun = BootManager.NodeRunStates.get(self.VARS['BOOT_STATE'],_badstateRun) stateRun() @@ -328,18 +339,20 @@ class BootManager: except KeyError, e: self.LOG.write( "\n\nKeyError while running: %s\n" % str(e) ) + self.LOG.print_stack () except BootManagerException, e: self.LOG.write( "\n\nException while running: %s\n" % str(e) ) + self.LOG.print_stack () except BootManagerAuthenticationException, e: self.LOG.write( "\n\nFailed to Authenticate Node: %s\n" % str(e) ) + self.LOG.print_stack () # sets /tmp/CANCEL_BOOT flag StartDebug.Run(self.VARS, self.LOG ) # Return immediately b/c any other calls to API will fail return success except: self.LOG.write( "\n\nImplementation Error\n") - traceback.print_exc(file=self.LOG.OutputFile) - traceback.print_exc() + self.LOG.print_stack () if not success: try: @@ -359,7 +372,7 @@ def main(argv): import utils utils.prompt_for_breakpoint_mode() - utils.breakpoint ("Entering BootManager::main") +# utils.breakpoint ("Entering BootManager::main") # set to 1 if error occurred error= 0