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)
	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)
