from installclass import BaseInstallClass import os import iutil from constants import * from flags import flags from autopart import autoCreatePartitionRequests import types import logging log = logging.getLogger("anaconda") class Script: def __init__(self, body, interp, inChroot, logfile = None): self.script = body self.interp = interp self.inChroot = inChroot self.logfile = logfile def run(self, chroot, serial, intf = None): import tempfile import os.path if self.inChroot: scriptRoot = chroot else: scriptRoot = "/" (fd, path) = tempfile.mkstemp("", "wg-script-", scriptRoot + "/tmp") os.write(fd, self.script) os.close(fd) os.chmod(path, 0700) if self.logfile is not None: messages = self.logfile elif serial: messages = "%s.log" % path else: messages = "/dev/tty3" rc = iutil.execWithRedirect(self.interp, ["/tmp/%s" % os.path.basename(path)], stdin = messages, stdout = messages, stderr = messages, root = scriptRoot) # Always log an error. Only fail if we have a handle on the # windowing system and the kickstart file included --erroronfail. if rc != 0: log.error("Error code %s encountered running a kickstart %%pre/%%post script", rc) if self.errorOnFail: if intf != None: intf.messageWindow(("Scriptlet Failure"), ("There was an error running the " "scriptlet. You may examine the " "output in %s. This is a fatal error " "and your install will be aborted.\n\n" "Press the OK button to reboot your " "system.") % (messages,)) sys.exit(0) os.unlink(path) if serial or self.logfile is not None: os.chmod("%s" % messages, 0600) class FermiInstallClass(BaseInstallClass): pixmap = "workstation.png" script = {} def setGroupSelection(self, anaconda): grps = anaconda.backend.getDefaultGroups(anaconda) log.info("grps is %s" %(grps,)) map(lambda x: anaconda.backend.selectGroup(x), grps) def getPackagePaths(self, uri): rc = {} for (name, path) in self.repopaths.items(): log.info("package is %s path is %s" %(name,path,)) if not type(uri) == types.ListType: uri = [uri,] if not type(path) == types.ListType: path = [path,] lst = [] for i in uri: for p in path: lst.append("%s/%s" % (i, p)) rc[name] = lst log.info("package paths is %s" %(rc,)) return rc def setFirewall(self, id, enable = 1, trusts = [], ports = []): id.firewall.enabled = enable id.firewall.trustdevs = trusts log.debug("portlist is %s" %(id.firewall.portlist,)) id.firewall.portlist = [] log.debug("portlist is %s" %(id.firewall.portlist,)) for port in ports: id.firewall.portlist.append (port) def getFermiTextFile(self, filename): file = "" fullfilename = "/mnt/source/" + filename if (os.access('/mnt/source/sites/Fermi/RHupdates/fermi',os.R_OK)): fullfilename = "/mnt/source/sites/Fermi/RHupdates/fermi/" + filename else: if (os.access('/tmp/updates/fermi',os.R_OK)): fullfilename = "/tmp/updates/fermi/" + filename else: fullfilename = "/usr/lib/anaconda/fermi/" + filename log.debug("Set fullfilename to: %s", fullfilename) for n in open(fullfilename).readlines(): file = file + n log.debug("Just read %s into file", fullfilename) return file def postAction(self, anaconda, serial): if len(self.postScripts) == 0: return # Remove environment variables that cause problems for %post scripts. for var in ["LIBUSER_CONF"]: if os.environ.has_key(var): del(os.environ[var]) log.info("Running workgroup %%post script(s)") if anaconda.intf is not None: w = anaconda.intf.waitWindow(("Running..."), ("Running post-install scripts")) map (lambda s: s.run(anaconda.rootPath, serial, anaconda.intf), self.postScripts) log.info("The workgroup %%post script(s) has been run") if anaconda.intf is not None: w.pop() def setInstallData(self, anaconda): anaconda.id.reset() anaconda.id.instClass = self anaconda.id.partitions.useAutopartitioning = 0 anaconda.id.partitions.autoClearPartType = -1 autorequests = [ ("/", None, 5000, None, 0, 1) ] (minswap, maxswap) = iutil.swapSuggestion() self.setTimezoneInfo( anaconda.id ,"America/Chicago",1) self.setFirewall( anaconda.id, enable = 1, trusts = [], ports = "") self.setAuthentication( anaconda.id , "--useshadow --enablemd5 --enablekrb5 " ) def __init__(self, expert): BaseInstallClass.__init__(self, expert) self.repopaths = { "base": "%s/RPMS" %(productPath,) } self.repopaths["fermi"] = "%s/SITERPMS" %(productPath,) self.repopaths["fermiupdates"] = "%s/updates/security" %(productPath,) self.postScripts = [] self.script["interp"] = "/bin/sh" self.script["chroot"] = False self.script["log"] = "workgroup.post.log" ferminame = "post.sh" self.script["body"] = self.getFermiTextFile(ferminame) log.info("Just called Script ") s = Script(self.script["body"], self.script["interp"], self.script["chroot"], self.script["log"]) self.postScripts.append(s)