From c03e5290de07d112f8a386ffd072ed29176a4fef Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Wed, 18 Aug 1999 18:25:14 +0000 Subject: upgrade framework --- anaconda | 1 + rpmmodule/rpmmodule.c | 4 +- text.py | 124 +++++++++++++++++++++++++++++++++----------------- todo.py | 46 +++++++++++++++---- 4 files changed, 120 insertions(+), 55 deletions(-) diff --git a/anaconda b/anaconda index bf5975836..54595a31a 100755 --- a/anaconda +++ b/anaconda @@ -57,6 +57,7 @@ if (os.path.exists('rpmmodule')): sys.path.append('rpmmodule') sys.path.append('isys') sys.path.append('libfdisk') + sys.path.append('balkan') #elif (mode == None): # try: # f = open('/dev/fb0', 'r') diff --git a/rpmmodule/rpmmodule.c b/rpmmodule/rpmmodule.c index 11c9b2ad9..c47e85d18 100644 --- a/rpmmodule/rpmmodule.c +++ b/rpmmodule/rpmmodule.c @@ -887,8 +887,8 @@ static PyObject * rpmtransAdd(rpmtransObject * s, PyObject * args) { return NULL; } - if (how && strcmp(how, "a") && strcmp(how, "u")) { - PyErr_SetString(PyExc_TypeError, "how argument must be \"u\" or \"a\""); + if (how && strcmp(how, "a") && strcmp(how, "u") && strcmp(how, "i")) { + PyErr_SetString(PyExc_TypeError, "how argument must be \"u\", \"a\", or \"i\""); return NULL; } else if (how && !strcmp(how, "u")) isUpgrade = 1; diff --git a/text.py b/text.py index bdf2486c2..cc3bf654e 100644 --- a/text.py +++ b/text.py @@ -15,7 +15,7 @@ cat = gettext.Catalog ("anaconda-text", "/usr/share/locale") _ = cat.gettext class LanguageWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): languages = todo.language.available () descriptions = languages.keys () locales = languages.values () @@ -36,7 +36,7 @@ class LanguageWindow: return INSTALL_OK class KeyboardWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): keyboards = todo.keyboard.available () keyboards.sort () default = keyboards.index (todo.keyboard.get ()) @@ -51,10 +51,46 @@ class KeyboardWindow: return INSTALL_BACK todo.keyboard.set (keyboards[choice]) return INSTALL_OK + +class InstallPathWindow: + def __call__ (self, screen, todo, intf): + rc = ButtonChoiceWindow(screen, _("Installation Path"), + _("Would you like to install a new system " + "or upgrade a system which already contains " + "Red Hat Linux 2.0 or later?"), + buttons = [_("Install"), _("Upgrade"), _("Back")], width = 35) + + if rc == string.lower(_("Back")): + return INSTALL_BACK + if rc == string.lower(_("Upgrade")): + intf.steps = intf.commonSteps + intf.upgradeSteps + todo.upgrade = 1 + else: + intf.steps = intf.commonSteps + intf.installSteps + todo.upgrade = 0 + return INSTALL_OK + +class UpgradeExamineWindow: + def __call__ (self, screen, todo): + parts = todo.findInstalledSystem () + + (button, choice) = \ + ListboxChoiceWindow(screen, _("System to Upgrade"), + _("Which partition do you wish to upgrade?"), parts, + buttons = [_("OK"), _("Back")], width = 30, scroll = 1, height = 8) +class CustomizeUpgradeWindow: + def __call__ (self, screen, todo): + parts = todo.findInstalledSystem () + (button, choice) = \ + ListboxChoiceWindow(screen, _("System to Upgrade"), + _("Which partition do you wish to upgrade?"), parts, + buttons = [_("OK"), _("Back")], width = 30, scroll = 1, height = 8, + default = default) + class RootPasswordWindow: - def run(self, screen, todo): + def __call__ (self, screen, todo): toplevel = GridForm (screen, _("Root Password"), 1, 3) toplevel.add (TextboxReflowed(37, _("Pick a root password. You must " @@ -101,7 +137,7 @@ class RootPasswordWindow: return INSTALL_OK class WelcomeWindow: - def run(self, screen): + def __call__(self, screen): rc = ButtonChoiceWindow(screen, _("Red Hat Linux"), _("Welcome to Red Hat Linux!\n\n" "This installation process is outlined in detail in the " @@ -119,7 +155,7 @@ class WelcomeWindow: return INSTALL_OK class AuthConfigWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): def setsensitive (self): server = FLAGS_RESET flag = FLAGS_RESET @@ -185,7 +221,7 @@ class AuthConfigWindow: return INSTALL_OK class NetworkWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): def setsensitive (self): if self.cb.selected (): sense = FLAGS_SET @@ -302,7 +338,7 @@ class NetworkWindow: return INSTALL_OK class PartitionWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): if (not todo.setupFilesystems): return INSTALL_NOOP from newtpyfsedit import fsedit @@ -321,7 +357,7 @@ class PartitionWindow: class FormatWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): if (not todo.setupFilesystems): return INSTALL_NOOP tb = TextboxReflowed (55, @@ -372,7 +408,7 @@ class FormatWindow: return INSTALL_OK class PackageGroupWindow: - def run(self, screen, todo, individual): + def __call__(self, screen, todo, individual): # be sure that the headers and comps files have been read. todo.getHeaderList() todo.getCompsList() @@ -409,7 +445,7 @@ class PackageGroupWindow: return INSTALL_OK class IndividualPackageWindow: - def run(self, screen, todo, individual): + def __call__(self, screen, todo, individual): if not individual.get(): return todo.getHeaderList() @@ -472,7 +508,7 @@ class IndividualPackageWindow: return INSTALL_OK class PackageDepWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): deps = todo.verifyDeps () if not deps: return INSTALL_NOOP @@ -513,7 +549,7 @@ class PackageDepWindow: return INSTALL_OK class MouseWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): mice = todo.mouse.available ().keys () mice.sort () default = mice.index (todo.mouse.get ()) @@ -530,7 +566,7 @@ class MouseWindow: return INSTALL_OK class BootDiskWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): rc = ButtonChoiceWindow(screen, _("Bootdisk"), _("A custom bootdisk provides a way of booting into your " "Linux system without depending on the normal bootloader. " @@ -555,7 +591,7 @@ class BootDiskWindow: return INSTALL_OK class LiloWindow: - def run(self, screen, todo): + def __call__(self, screen, todo): if '/' not in todo.mounts.keys (): return INSTALL_NOOP if todo.mounts.has_key ('/boot'): @@ -588,7 +624,7 @@ class LiloWindow: return INSTALL_OK class BeginInstallWindow: - def run(self, screen, todo): + def __call__ (self, screen, todo): rc = ButtonChoiceWindow (screen, _("Installation to begin"), _("A complete log of your installation will be in " "/tmp/install.log after rebooting your system. You " @@ -599,12 +635,12 @@ class BeginInstallWindow: return INSTALL_OK class InstallWindow: - def run(self, screen, todo): + def __call__ (self, screen, todo): todo.doInstall () return INSTALL_OK class FinishedWindow: - def run(self, screen, todo): + def __call__ (self, screen): rc = ButtonChoiceWindow (screen, _("Complete"), _("Congratulations, installation is complete.\n\n" "Remove the boot media and " @@ -664,16 +700,8 @@ class InstallProgressWindow: self.g.draw() self.screen.refresh() - def __del__(self): - self.screen.drawRootText(0 - len(_("Package Installation")), 0, - (self.screen.width - len(_("Package Installation"))) * " ") - self.screen.popWindow() - self.screen.refresh() - def __init__(self, screen, total, totalSize): self.screen = screen - self.screen.drawRootText(0 - len(_("Package Installation")), 0, _("Package Installation")) - toplevel = GridForm(self.screen, _("Package Installation"), 1, 5) name = _("Name : ") size = _("Size : ") @@ -802,21 +830,27 @@ class InstallInterface: self.screen.drawRootText (0, 0, self.welcomeText) self.screen.pushHelpLine (_(" / between elements | selects | next screen")) self.screen.suspendCallback(killSelf, self.screen) + self.individual = Flag(0) + self.step = 0 + self.dir = 1 def __del__(self): self.screen.finish() def run(self, todo): - individual = Flag(0) - steps = [ + self.commonSteps = [ [_("Language Selection"), LanguageWindow, (self.screen, todo)], [_("Keyboard Selection"), KeyboardWindow, (self.screen, todo)], [_("Welcome"), WelcomeWindow, (self.screen,)], + [_("Installation Path"), InstallPathWindow, (self.screen, todo, self)], + ] + + self.installSteps = [ [_("Network Setup"), NetworkWindow, (self.screen, todo)], [_("Partition"), PartitionWindow, (self.screen, todo)], [_("Filesystem Formatting"), FormatWindow, (self.screen, todo)], - [_("Package Groups"), PackageGroupWindow, (self.screen, todo, individual)], - [_("Individual Packages"), IndividualPackageWindow, (self.screen, todo, individual)], + [_("Package Groups"), PackageGroupWindow, (self.screen, todo, self.individual)], + [_("Individual Packages"), IndividualPackageWindow, (self.screen, todo, self.individual)], [_("Package Dependencies"), PackageDepWindow, (self.screen, todo)], [_("Mouse Configuration"), MouseWindow, (self.screen, todo)], [_("Authentication"), AuthConfigWindow, (self.screen, todo)], @@ -825,28 +859,32 @@ class InstallInterface: [_("LILO Configuration"), LiloWindow, (self.screen, todo)], [_("Installation Begins"), BeginInstallWindow, (self.screen, todo)], [_("Install System"), InstallWindow, (self.screen, todo)], - [_("Installation Complete"), FinishedWindow, (self.screen, todo)] - ] - - step = 0 - dir = 1 + [_("Installation Complete"), FinishedWindow, (self.screen,)] + ] + + self.upgradeSteps = [ + [_("Examine System"), UpgradeExamineWindow, (self.screen, todo)], + [_("Customize Upgrade"), CustomizeUpgradeWindow, (self.screen, todo, self.individual)], + [_("Individual Packages"), IndividualPackageWindow, (self.screen, todo, self.individual)], + ] - while step >= 0 and step < len(steps) and steps[step]: + self.steps = self.commonSteps + + while self.step >= 0 and self.step < len(self.steps) and self.steps[self.step]: # clear out the old root text by writing spaces in the blank # area on the right side of the screen - self.screen.drawRootText(len(self.welcomeText), 0, + self.screen.drawRootText (len(self.welcomeText), 0, (self.screen.width - len(self.welcomeText)) * " ") - self.screen.drawRootText(0 - len(steps[step][0]), 0, steps[step][0]) - rc = apply(steps[step][1]().run, steps[step][2]) + self.screen.drawRootText (0 - len(self.steps[self.step][0]), + 0, self.steps[self.step][0]) + rc = apply (self.steps[self.step][1](), self.steps[self.step][2]) if rc == -1: dir = -1 elif rc == 0: dir = 1 - step = step + dir - + self.step = self.step + dir + self.screen.finish () + def killSelf(screen): screen.finish() os._exit(0) - - - diff --git a/todo.py b/todo.py index caf943938..45f70e9ce 100644 --- a/todo.py +++ b/todo.py @@ -11,6 +11,7 @@ import string import socket import crypt import whrandom +import _balkan class LogFile: def __init__ (self): @@ -390,6 +391,7 @@ class ToDo: self.log = LogFile () self.bootdisk = 0 self.liloDevice = None + self.upgrade = 0 def umountFilesystems(self): if (not self.setupFilesystems): return @@ -685,6 +687,23 @@ class ToDo: def selectDeps (self, deps): for (who, dep) in deps: self.hdList[dep].selected = 1 + + def findInstalledSystem (self): + win = self.intf.waitWindow ("Examining System", + "Searching for previous installations") + rootparts = [] + drives = self.drives.available ().keys () + for drive in drives: + isys.makeDevInode(drive, '/tmp/' + drive) + table = _balkan.readTable ('/tmp/' + drive) + for (type, sector, size) in table: + if size and type == 0x83: + isys.mount( '/tmp/' + drive, '/mnt/sysimage') + if os.access ('/mnt/sysimage/etc/fstab', os.R_OK): + rootparts.append (drive) + os.remove ('/tmp/' + drive) + win.pop () + return rootparts def doInstall(self): # make sure we have the header list and comps file @@ -713,8 +732,14 @@ class ToDo: total = 0 totalSize = 0 + + if self.upgrade: + how = "u" + else: + how = "i" + for p in self.hdList.selected(): - ts.add(p.h, (p.h, self.method)) + ts.add(p.h, (p.h, self.method), how) total = total + 1 totalSize = totalSize + p.h[rpm.RPMTAG_SIZE] @@ -758,15 +783,16 @@ class ToDo: w = self.intf.waitWindow("Post Install", "Performing post install configuration") - - self.writeFstab () - self.writeLanguage () - self.writeMouse () - self.writeKeyboard () - self.writeNetworkConfig () - self.writeRootPassword () - self.setupAuthentication () - self.copyConfModules () + + if not self.upgrade: + self.writeFstab () + self.writeLanguage () + self.writeMouse () + self.writeKeyboard () + self.writeNetworkConfig () + self.writeRootPassword () + self.setupAuthentication () + self.copyConfModules () self.makeBootdisk () self.installLilo () -- cgit