# simenv -- Provides and builds some convienient Environment stuff # # # # # import os, sys import simopts import libutil import simdb import simlib import simsubs import restartlib from libutil import dprint class SimEnvironment: def __init__(self, BASE_PATH, callingExecutable): self.BASE_PATH = BASE_PATH self.LIB_PATH = "%s%s%s" % (self.BASE_PATH, os.sep, "lib") self.ETC_PATH = "%s%s%s" % (self.BASE_PATH, os.sep, "etc") self.MDB_PATH = "%s%s%s" % (self.ETC_PATH, os.sep, "mdb") self.SYNTAX_PATH = "%s%s%s" % (self.ETC_PATH, os.sep, "syntax") self.OPTIONS_PATH = "%s%s%s" % (self.ETC_PATH, os.sep, "options") self.APP_PATH = None self.VERBOSE = True self.VERSION = "r950" self.StoredVerbose = self.VERBOSE # a couple of paths that are in the cactus root. self.CONFIGS_PATH = None self.EXE_PATH = None self.EXECUTABLE = callingExecutable self.COMMAND = None self.SETUP = False self.INTERNALDIRECTORY = "SIMFACTORY" self.VERBOSE = True try: ver = os.popen("svnversion %s" % self.BASE_PATH).read().strip() if ver.count(":") > 0: self.VERSION = "r%s" % ver.split(":").pop(0) except: pass def initApp(self, usageString, optionGroups): self.OptionsManager = simopts.OptionManager(self.OPTIONS_PATH) if optionGroups != None: for og in optionGroups: self.OptionsManager.UseGroup(og) if usageString != None: self.OptionsManager.SetUsage(usageString) self.OptionsManager.Build() self.StoredVerbose = self.VERBOSE = self.OptionsManager.GetOption('verbose') self.GetIniFiles() self.LoadConfigurationDatabase() self.DefineDatabase = simsubs.DefineDatabase(self) self.SimLib = simlib.SimLib(self) self.RestartLib = restartlib.RestartLib(self) self.APP_PATH = self.SimLib.GetAppPath() if self.APP_PATH == None: self.APP_PATH = self.BASE_PATH print "Warning: Unable to determine APP_PATH, using %s instead" % self.APP_PATH self.CONFIGS_PATH = self.SimLib.BuildPath([self.APP_PATH, "configs"]) self.EXE_PATH = self.SimLib.BuildPath([self.APP_PATH, "exe"]) # get our local machine, and our local machine entry. self.LocalMachine = self.SimLib.GetMachineName() if self.LocalMachine != None: self.LocalMachineEntry = self.ConfigurationDatabase.GetMachine(self.LocalMachine) else: self.LocalMachineEntry = None cmd = str() count = 0 for arg in sys.argv: if count == 0: cmd = arg else: cmd = "%s \"%s\"" % (cmd, arg) count = count + 1 cmd = cmd.strip() dprint("DEBUG: Simfactory command: %s" % cmd) dprint("DEBUG: Version %s" % self.VERSION) def GetIniFiles(self): ini_files = ['defs', 'defs.local'] ini_name = ['cdb', 'udb'] ini_req = ['defs'] for i in range(len(ini_files)): ini = ini_files[i] attr = ini_name[i] path = "%s%s%s.ini" % (self.ETC_PATH, os.sep, ini) if libutil.FileExists(path): setattr(self, attr, path) else: setattr(self, attr, None) if ini in ini_req: self.IniFileError("No %s.ini found in %s, and --%s was not specified" % (ini, self.ETC_PATH, ini)) def LoadConfigurationDatabase(self): self.ConfigurationDatabase = simdb.ConfigurationDatabase(self, mdbDirectory=self.MDB_PATH, udb=self.udb, cdb=self.cdb) self.ConfigurationDatabase.Load() def IniFileError(self, error): dprint("Error while discoverying ini files: %s" % error) sys.exit(1) def ForceVerbose(self): self.VERBOSE = True def ResetVerbose(self): self.VERBOSE = self.StoredVerbose def RequireMachine(self): if self.LocalMachine == None or self.LocalMachineEntry == None: dprint("Error: Could not determine local machine. Is an entry for %s setup?" % self.SimLib.GetHostNameAlias()) sys.exit(1)