#!/usr/bin/python -u
-
+#
+# $Id$
+# $URL$
+#
# Copyright (c) 2003 Intel Corporation
# All rights reserved.
#
# all output is written to this file
BM_NODE_LOG= "/tmp/bm.log"
-UPLOAD_LOG_SCRIPT = "/boot/upload-bmlog.php"
+VARS_FILE = "configuration"
# the new contents of PATH when the boot manager is running
BIN_PATH= ('/usr/local/bin',
'/usr/sbin',
'/bin',
'/sbin')
-
+
+def read_configuration_file(filename):
+ # read in and store all variables in VARS_FILE into each line
+ # is in the format name=val (any whitespace around the = is
+ # removed. everything after the = to the end of the line is
+ # the value
+ vars = {}
+ vars_file= file(filename,'r')
+ validConfFile = True
+ for line in vars_file:
+ # if its a comment or a whitespace line, ignore
+ if line[:1] == "#" or string.strip(line) == "":
+ continue
+
+ parts= string.split(line,"=")
+ if len(parts) != 2:
+ validConfFile = False
+ raise Exception( "Invalid line in vars file: %s" % line )
+
+ name= string.strip(parts[0])
+ value= string.strip(parts[1])
+ value= value.replace("'", "") # remove quotes
+ value= value.replace('"', "") # remove quotes
+ vars[name]= value
+
+ vars_file.close()
+ if not validConfFile:
+ raise Exception( "Unable to read configuration vars." )
+
+ # find out which directory we are running it, and set a variable
+ # for that. future steps may need to get files out of the bootmanager
+ # directory
+ current_dir= os.getcwd()
+ vars['BM_SOURCE_DIR']= current_dir
+
+ return vars
+
##############################
class log:
except:
print( "bootmanager log : Unable to open output file %r, continuing"%OutputFilePath )
self.OutputFile= None
+
+ self.VARS = None
+ try:
+ vars = read_configuration_file(VARS_FILE)
+ self.VARS = vars
+ except Exception, e:
+ self.LogEntry( str(e) )
+ return
def LogEntry( self, str, inc_newline= 1, display_screen= 1 ):
now=time.strftime(log.format, time.localtime())
if self.OutputFile is not None:
self.OutputFile.flush()
- self.LogEntry( "Uploading logs to %s" % UPLOAD_LOG_SCRIPT )
+ self.LogEntry( "Uploading logs to %s" % self.VARS['UPLOAD_LOG_SCRIPT'] )
self.OutputFile.close()
self.OutputFile= None
- bs_request = BootServerRequest.BootServerRequest()
- bs_request.MakeRequest(PartialPath = UPLOAD_LOG_SCRIPT,
- GetVars = None, PostVars = None,
- FormData = ["log=@" + self.OutputFilePath],
- DoSSL = True, DoCertCheck = True)
+ hostname= self.VARS['INTERFACE_SETTINGS']['hostname'] + "." + \
+ self.VARS['INTERFACE_SETTINGS']['domainname']
+ bs_request = BootServerRequest.BootServerRequest(self.VARS)
+ try:
+ # this was working until f10
+ bs_request.MakeRequest(PartialPath = self.VARS['UPLOAD_LOG_SCRIPT'],
+ GetVars = None, PostVars = None,
+ DoSSL = True, DoCertCheck = True,
+ FormData = ["log=@" + self.OutputFilePath,
+ "hostname=" + hostname,
+ "type=bm.log"])
+ except:
+ # new pycurl
+ import pycurl
+ bs_request.MakeRequest(PartialPath = self.VARS['UPLOAD_LOG_SCRIPT'],
+ GetVars = None, PostVars = None,
+ DoSSL = True, DoCertCheck = True,
+ FormData = [('log',(pycurl.FORM_FILE, self.OutputFilePath)),
+ ("hostname",hostname),
+ ("type","bm.log")])
+
##############################
class BootManager:
# file containing initial variables/constants
- VARS_FILE = "configuration"
# the set of valid node run states
NodeRunStates = {'reinstall':None,
# set to 1 if we can run after initialization
self.CAN_RUN = 0
-
- # read in and store all variables in VARS_FILE into each line
- # is in the format name=val (any whitespace around the = is
- # removed. everything after the = to the end of the line is
- # the value
- vars = {}
- vars_file= file(self.VARS_FILE,'r')
- validConfFile = True
- for line in vars_file:
- # if its a comment or a whitespace line, ignore
- if line[:1] == "#" or string.strip(line) == "":
- continue
-
- parts= string.split(line,"=")
- if len(parts) != 2:
- self.LOG.LogEntry( "Invalid line in vars file: %s" % line )
- validConfFile = False
- break
-
- name= string.strip(parts[0])
- value= string.strip(parts[1])
- vars[name]= value
-
- vars_file.close()
- if not validConfFile:
- self.LOG.LogEntry( "Unable to read configuration vars." )
- return
-
- # find out which directory we are running it, and set a variable
- # for that. future steps may need to get files out of the bootmanager
- # directory
- current_dir= os.getcwd()
- vars['BM_SOURCE_DIR']= current_dir
+ if log.VARS:
+ # this contains a set of information used and updated by each step
+ self.VARS= log.VARS
+ else:
+ return
+
# not sure what the current PATH is set to, replace it with what
# we know will work with all the boot cds
os.environ['PATH']= string.join(BIN_PATH,":")
-
- # this contains a set of information used and updated by each step
- self.VARS= vars
self.CAN_RUN= 1
def _nodeNotInstalled(message='MSG_NODE_NOT_INSTALLED'):
# called by the _xxxState() functions below upon failure
self.VARS['RUN_LEVEL']= 'failboot'
- notify = getattr(notify_messages, message)
+ notify = getattr(notify_messages, message)
self.VARS['STATE_CHANGE_NOTIFY']= 1
self.VARS['STATE_CHANGE_NOTIFY_MESSAGE']= notify
raise BootManagerException, notify
InstallInit.Run( self.VARS, self.LOG )
ret = ValidateNodeInstall.Run( self.VARS, self.LOG )
- if ret == 1:
+ if ret == 1:
WriteModprobeConfig.Run( self.VARS, self.LOG )
- MakeInitrd.Run( self.VARS, self.LOG )
WriteNetworkConfig.Run( self.VARS, self.LOG )
CheckForNewDisks.Run( self.VARS, self.LOG )
SendHardwareConfigToPLC.Run( self.VARS, self.LOG )
ChainBootNode.Run( self.VARS, self.LOG )
- elif ret == -1:
+ elif ret == -1:
_nodeNotInstalled('MSG_NODE_FILESYSTEM_CORRUPT')
- elif ret == -2:
+ elif ret == -2:
_nodeNotInstalled('MSG_NODE_MOUNT_FAILED')
- elif ret == -3:
+ elif ret == -3:
_nodeNotInstalled('MSG_NODE_MISSING_KERNEL')
else:
_nodeNotInstalled()
self.LOG.write( "\n\nKeyError while running: %s\n" % str(e) )
except BootManagerException, e:
self.LOG.write( "\n\nException while running: %s\n" % str(e) )
+ except BootManagerAuthenticationException, e:
+ self.LOG.write( "\n\nFailed to Authenticate Node: %s\n" % str(e) )
+ # 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)