from installclass import BaseInstallClass
from rhpl.translate import N_, _
from rhpl.log import log
from constants import *

import os
import iutil
import string
import security

class Script:
    def __repr__(self):
	str = ("(s: '%s' i: %s c: %d)") %  \
	    (self.script, self.interp, self.inChroot)
	return string.replace(str, "\n", "|")

    def __init__(self, script, interp, inChroot, logfile = None):
	self.script = script
	self.interp = interp
	self.inChroot = inChroot
        self.logfile = logfile

    def run(self, chroot, serial):
	scriptRoot = "/"
	if self.inChroot:
	    scriptRoot = chroot

	path = scriptRoot + "/tmp/sme-script"

	f = open(path, "w")
	f.write(self.script)
	f.close()
	os.chmod(path, 0700)

        if self.logfile is not None:
            messages = self.logfile
	elif serial:
	    messages = "/tmp/sme-script.log"
	else:
	    messages = "/dev/tty3"

	rc = iutil.execWithRedirect(self.interp,
				    [self.interp,"/tmp/sme-script"],
				    stdout = messages, stderr = messages,
				    root = scriptRoot)

	if rc != 0:
	    log("WARNING - Error code %s encountered running a sme script", rc)

	os.unlink(path)

class InstallClass(BaseInstallClass):
    name = N_("Upgrade Existing System")
    pixmap = "upgrade.png"
    sortPriority = 999999

    parentClass = ( _("Upgrade"), "upgrade.png" )

    def requiredDisplayMode(self):
        return 't'

    def setSteps(self, dispatch):
	dispatch.setStepList(
		    "language",
		    "keyboard",
                    "findrootparts",
		    "findinstall",
		    "installtype",
                    "partitionobjinit",
                    "upgrademount",
                    "upgrademigfind",
                    "upgrademigratefs",
                    "upgradecontinue",
                    "bootloadersetup",
                    "readcomps",
                    "findpackages",
                    "checkdeps",
		    "dependencies",
		    "install",
                    "migratefilesystems",
                    "preinstallconfig",
                    "installpackages",
                    "postinstallconfig",
                    "instbootloader",
                    "dopostaction",
                    "methodcomplete",
                    "copylogs",
		    "complete"
		)

        if iutil.getPPCMachine() == "iSeries":
            dispatch.skipStep("bootloadersetup", skip = 0)

        if iutil.getArch() != "i386" and iutil.getArch() != "x86_64":
            dispatch.skipStep("bootloader")
            dispatch.skipStep("bootloaderadvanced")

        if iutil.getArch() != "i386" and iutil.getArch() != "x86_64":
            dispatch.skipStep("upgbootloader")            

    def postAction(self, rootPath, serial, intf):
        win = intf.waitWindow(_("Post Upgrade Script"),
           _("The post upgrade script is running..."))

        script = ( "/sbin/syslogd &\n"
                   "sleep 2\n"
                   "/sbin/e-smith/signal-event post-upgrade\n" )
        s = Script(script, interp="/bin/sh", inChroot=1)
        log("%s", s)
        s.run(rootPath, serial)
        win.pop()

    def setInstallData(self, id):
        BaseInstallClass.setInstallData(self, id)
        id.upgrade.set(1)
    
    def __init__(self, expert):
	BaseInstallClass.__init__(self, expert)
