rpms/kexec-tools/devel firstboot_kdump.py, 1.1, 1.2 kexec-tools.spec, 1.139, 1.140

Neil Horman nhorman at fedoraproject.org
Tue Jun 23 18:36:58 UTC 2009


Author: nhorman

Update of /cvs/extras/rpms/kexec-tools/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv11550

Modified Files:
	firstboot_kdump.py kexec-tools.spec 
Log Message:
Fixing firstboot module


Index: firstboot_kdump.py
===================================================================
RCS file: /cvs/extras/rpms/kexec-tools/devel/firstboot_kdump.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -p -r1.1 -r1.2
--- firstboot_kdump.py	15 Dec 2006 21:05:01 -0000	1.1
+++ firstboot_kdump.py	23 Jun 2009 18:36:27 -0000	1.2
@@ -3,8 +3,8 @@
 # Copyright 2006 Red Hat, Inc.
 # Author: Jarod Wilson <jwilson at redhat.com>
 # Contributors:
-#     Neil Horman <nhorman at redhat.com>
-#     Dave Lehman <dlehman at redhat.com>
+#	 Neil Horman <nhorman at redhat.com>
+#	 Dave Lehman <dlehman at redhat.com>
 #
 #
 # This program is free software; you can redistribute it and/or modify
@@ -31,337 +31,346 @@ import os.path
 import time
 import gtk
 import gobject
-import functions
 import commands
 import rhpl.executil as executil
-from firstboot import start_process
+from firstboot.config import *
+from firstboot.constants import *
+from firstboot.functions import *
+from firstboot.module import *
 
 from rhpl.translate import _, N_
 from rhpl import translate
 translate.textdomain("firstboot")
 
-
-class childWindow:
-    # runPriority determines the order in which this module runs in firstboot
-    runPriority = 70
-    moduleName = _("Kdump")
-    windowName = moduleName
-    needsReboot = False
-
-    # possible bootloaders we'll need to adjust
-    #             bootloader : (config file, kdump offset)
-    bootloaders = { "grub"   : ("/boot/grub/grub.conf", 16),
-                    "yaboot" : ("/boot/etc/yaboot.conf", 32),
-                    "elilo"  : ("/boot/efi/EFI/redhat/elilo.conf", 256) }
-    bootloader = None
-    offset = 0
-
-    # list of architectures without kdump support
-    unsupportedArches = [ "ppc", "s390", "s390x", "i386", "i586" ]
-
-    # list of platforms that have a separate kernel-kdump
-    kernelKdumpArches = [ "ppc64" ]
-    kernelKdumpInstalled = False
-
-    # toggle sensitivity of kdump config bits
-    def showHide(self, status):
-        self.totalMem.set_sensitive(status)
-        self.kdumpMem.set_sensitive(status)
-        self.systemUsableMem.set_sensitive(status)
-        self.labelTotal.set_sensitive(status)
-        self.labelKdump.set_sensitive(status)
-        self.labelSys.set_sensitive(status)
-        self.kdumpEnabled = status
-
-    def on_enableKdumpCheck_toggled(self, *args):
-        showHideStatus = self.enableKdumpCheck.get_active()
-        self.showHide(showHideStatus)
-
-    def updateAvail(self, widget, spin):
-        self.remMem = self.availMem - spin.get_value_as_int()
-        self.systemUsableMem.set_text("%s" % self.remMem)
-
-    def getBootloader(self):
-        for (name, (conf, offset)) in self.bootloaders.items():
-            if os.access(conf, os.W_OK):
-                self.bootloader = name
-        return self.bootloader
-
-    def launch(self, doDebug = None):
-        self.doDebug = doDebug
-
-        if doDebug:
-            print "initializing kdump module"
-
-        # What kernel are we running?
-        self.runningKernel = os.popen("/bin/uname -r").read().strip()
-
-        # What arch are we running on?
-        self.arch = os.popen("/bin/uname -m").read().strip()
-
-        # Check for a xen kernel, kdump doesn't work w/xen just yet...
-        self.xenKernel = self.runningKernel.find("xen")
-
-        # Fedora or RHEL?
-        releaseFile = '/etc/redhat-release'
-        self.distro = 'rhel'
-        lines = open(releaseFile).readlines()
-        for line in lines:
-            if line.find("Fedora") != -1:
-                self.distro = 'fedora'
-                kernelKdumpArchesFC = [ "i686", "x86_64" ]
-                self.kernelKdumpArches.extend(kernelKdumpArchesFC)
-                break
-
-        # If we need kernel-kdump, check to see if its already installed
-        if self.arch in self.kernelKdumpArches:
-            self.kernelKdump = "/boot/vmlinux-%skdump" % self.runningKernel
-            if os.access(self.kernelKdump, os.R_OK):
-                self.kernelKdumpInstalled = True
-
-        # Ascertain how much memory is in the system
-        memInfo = open("/proc/meminfo").readlines()
-        self.availMem = 0
-        for line in memInfo:
-                if line.startswith("MemTotal:"):
-                    self.availMem = int(line.split()[1]) / 1024
-                    break
-
-        # Fix up memory calculations if kdump is already on
-        cmdLine = open("/proc/cmdline").read()
-        self.kdumpMem = 0
-        self.kdumpOffset = 0
-        self.origCrashKernel = ""
-	chkConfigStatus=commands.getoutput('/sbin/chkconfig --list kdump')
-        if chkConfigStatus.find("on") > -1:
-            self.kdumpEnabled = True
-	    self.kdumpMemInitial = 0
-	    if cmdLine.find("crashkernel") > -1:
-		    crashString = filter(lambda t: t.startswith("crashkernel="),
+class moduleClass(Module):
+	def __init__(self):
+		Module.__init__(self)
+		self.priority = 100
+		self.sidebarTitle = N_("Kdump")
+		self.title = N_("Kdump")
+
+	# runPriority determines the order in which this module runs in firstboot
+	runPriority = 70
+	moduleName = _("Kdump")
+	windowName = moduleName
+	needsReboot = False
+
+	# possible bootloaders we'll need to adjust
+	#			 bootloader : (config file, kdump offset)
+	bootloaders = { "grub"   : ("/boot/grub/grub.conf", 16),
+					"yaboot" : ("/boot/etc/yaboot.conf", 32),
+					"elilo"  : ("/boot/efi/EFI/redhat/elilo.conf", 256) }
+	bootloader = None
+	offset = 0
+
+	# list of architectures without kdump support
+	unsupportedArches = [ "ppc", "s390", "s390x", "i386", "i586" ]
+
+	# list of platforms that have a separate kernel-kdump
+	kernelKdumpArches = [ "ppc64" ]
+	kernelKdumpInstalled = False
+
+	# toggle sensitivity of kdump config bits
+	def showHide(self, status):
+		self.totalMem.set_sensitive(status)
+		self.kdumpMem.set_sensitive(status)
+		self.systemUsableMem.set_sensitive(status)
+		self.labelTotal.set_sensitive(status)
+		self.labelKdump.set_sensitive(status)
+		self.labelSys.set_sensitive(status)
+		self.kdumpEnabled = status
+
+	def on_enableKdumpCheck_toggled(self, *args):
+		showHideStatus = self.enableKdumpCheck.get_active()
+		self.showHide(showHideStatus)
+
+	def updateAvail(self, widget, spin):
+		self.remMem = self.availMem - spin.get_value_as_int()
+		self.systemUsableMem.set_text("%s" % self.remMem)
+
+	def getBootloader(self):
+		for (name, (conf, offset)) in self.bootloaders.items():
+			if os.access(conf, os.W_OK):
+				self.bootloader = name
+		return self.bootloader
+
+	def createScreen(self, doDebug = None):
+		self.doDebug = doDebug
+
+		if doDebug:
+			print "initializing kdump module"
+
+		# What kernel are we running?
+		self.runningKernel = os.popen("/bin/uname -r").read().strip()
+
+		# What arch are we running on?
+		self.arch = os.popen("/bin/uname -m").read().strip()
+
+		# Check for a xen kernel, kdump doesn't work w/xen just yet...
+		self.xenKernel = self.runningKernel.find("xen")
+
+		# Fedora or RHEL?
+		releaseFile = '/etc/redhat-release'
+		self.distro = 'rhel'
+		lines = open(releaseFile).readlines()
+		for line in lines:
+			if line.find("Fedora") != -1:
+				self.distro = 'fedora'
+				kernelKdumpArchesFC = [ "i686", "x86_64" ]
+				self.kernelKdumpArches.extend(kernelKdumpArchesFC)
+				break
+
+		# If we need kernel-kdump, check to see if its already installed
+		if self.arch in self.kernelKdumpArches:
+			self.kernelKdump = "/boot/vmlinux-%skdump" % self.runningKernel
+			if os.access(self.kernelKdump, os.R_OK):
+				self.kernelKdumpInstalled = True
+
+		# Ascertain how much memory is in the system
+		memInfo = open("/proc/meminfo").readlines()
+		self.availMem = 0
+		for line in memInfo:
+				if line.startswith("MemTotal:"):
+					self.availMem = int(line.split()[1]) / 1024
+					break
+
+		# Fix up memory calculations if kdump is already on
+		cmdLine = open("/proc/cmdline").read()
+		self.kdumpMem = 0
+		self.kdumpOffset = 0
+		self.origCrashKernel = ""
+		chkConfigStatus=commands.getoutput('/sbin/chkconfig --list kdump')
+		if chkConfigStatus.find("on") > -1:
+			self.kdumpEnabled = True
+		self.kdumpMemInitial = 0
+		if cmdLine.find("crashkernel") > -1:
+			crashString = filter(lambda t: t.startswith("crashkernel="),
 					 cmdLine.split())[0].split("=")[1]
-		    if self.doDebug:
-			print "crashString is %s" % crashString
-		    (self.kdumpMem, self.kdumpOffset) = [int(m[:-1]) for m in crashString.split("@")]
-		    self.availMem += self.kdumpMem
-		    self.origCrashKernel = "%dM@%dM" % (self.kdumpMem, self.kdumpOffset)
-		    self.kdumpMemInitial = self.kdumpMem
-        else:
-            self.kdumpEnabled = False
-            self.kdumpMemInitial = 0
-        self.initialState = self.kdumpEnabled
-
-        # Do some sanity-checking and try to present only sane options.
-        #
-        # Defaults
-        lowerBound = 128
-        minUsable = 256
-        step = 64
-        self.enoughMem = True
-        if self.arch == 'ia64':
-            # ia64 usually needs at *least* 256M, page-aligned... :(
-            lowerBound = 256
-            minUsable = 512
-            step = 256
-        elif self.arch == 'ppc64':
-            # ppc64 often fails w/128M lately, and we want at least 1G
-            # of RAM for normal use, due to 64k page size... :\
-            lowerBound = 256
-            minUsable = 1024
-
-        upperBound = (self.availMem - minUsable) - (self.availMem % step)
-
-        if upperBound < lowerBound:
-            self.enoughMem = False
-
-        # Set spinner to lowerBound unless already set on kernel command line
-        if self.kdumpMem == 0:
-            self.kdumpMem = lowerBound
-        else:
-            # round down to a multiple of step value
-            self.kdumpMem = self.kdumpMem - (self.kdumpMem % step)
-
-        # kdump enable/disable checkbox
-        self.enableKdumpCheck = gtk.CheckButton("Enable kdump?")
-        self.enableKdumpCheck.set_alignment(xalign=0, yalign=0)
-
-        # detected total amount of system memory
-        self.totalMem = gtk.Label(_("%s" % self.availMem))
-        self.labelTotal = gtk.Label(_("_Total System Memory (MB):"))
-        self.labelTotal.set_use_underline(True)
-        self.labelTotal.set_mnemonic_widget(self.totalMem)
-        self.labelTotal.set_alignment(0.0, 0.5)
-        self.labelTotal.set_width_chars(32)
-
-        # how much ram to reserve for kdump
-        self.memSpin = gtk.Adjustment(self.kdumpMem, lowerBound, upperBound, step, step, 64)
-        self.kdumpMem = gtk.SpinButton(self.memSpin, 0, 0)
-        self.kdumpMem.set_update_policy(gtk.UPDATE_IF_VALID)
-        self.kdumpMem.set_numeric(True)
-        self.memSpin.connect("value_changed", self.updateAvail, self.kdumpMem)
-        self.labelKdump = gtk.Label(_("_Kdump Memory (MB):"))
-        self.labelKdump.set_use_underline(True)
-        self.labelKdump.set_mnemonic_widget(self.kdumpMem)
-        self.labelKdump.set_alignment(0.0, 0.5)
-
-        # remaining usable system memory
-        self.resMem = eval(string.strip(self.kdumpMem.get_text()))
-        self.remMem = self.availMem - self.resMem
-        self.systemUsableMem = gtk.Label(_("%s" % self.remMem))
-        self.labelSys = gtk.Label(_("_Usable System Memory (MB):"))
-        self.labelSys.set_use_underline(True)
-        self.labelSys.set_mnemonic_widget(self.systemUsableMem)
-        self.labelSys.set_alignment(0.0, 0.5)
-        
-        self.vbox = gtk.VBox()
-        self.vbox.set_size_request(400, 200)
-
-        title_pix = functions.imageFromFile("workstation.png")
-
-        internalVBox = gtk.VBox()
-        internalVBox.set_border_width(10)
-        internalVBox.set_spacing(10)
-
-        label = gtk.Label(_("Kdump is a kernel crash dumping mechanism. In the event of a "
-                            "system crash, kdump will capture information from your system "
-                            "that can be invaluable in determining the cause of the crash. "
-                            "Note that kdump does require reserving a portion of system "
-                            "memory that will be unavailable for other uses."))
-
-        label.set_line_wrap(True)
-        label.set_alignment(0.0, 0.5)
-        label.set_size_request(500, -1)
-        internalVBox.pack_start(label, False, True)
-
-        table = gtk.Table(2, 4)
-
-        table.attach(self.enableKdumpCheck, 0, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5)
-
-        table.attach(self.labelTotal, 0, 1, 1, 2, gtk.FILL)
-        table.attach(self.totalMem, 1, 2, 1, 2, gtk.SHRINK, gtk.FILL, 5, 5)
-
-        table.attach(self.labelKdump, 0, 1, 2, 3, gtk.FILL)
-        table.attach(self.kdumpMem, 1, 2, 2, 3, gtk.SHRINK, gtk.FILL, 5, 5)
-
-        table.attach(self.labelSys, 0, 1, 3, 4, gtk.FILL)
-        table.attach(self.systemUsableMem, 1, 2, 3, 4, gtk.SHRINK, gtk.FILL, 5, 5)
-
-        # disable until user clicks check box, if not already enabled
-        if self.initialState is False:
-            self.showHide(False)
-        else:
-            self.enableKdumpCheck.set_active(True)
-
-        internalVBox.pack_start(table, True, 15)
-
-        # toggle sensitivity of Mem items
-        self.enableKdumpCheck.connect("toggled", self.on_enableKdumpCheck_toggled)
-
-        self.vbox.pack_start(internalVBox, False, 15)
-
-        return self.vbox, title_pix, self.moduleName
-
-    def grabFocus(self):
-        self.enableKdumpCheck.grab_focus()
-
-    def apply(self, *args):
-        if self.kdumpEnabled:
-            totalSysMem = self.totalMem.get_text()
-            totalSysMem = eval(string.strip(totalSysMem))
-            reservedMem = self.kdumpMem.get_value_as_int()
-            remainingMem = totalSysMem - reservedMem
-        else:
-            reservedMem = self.kdumpMemInitial
-
-        if self.doDebug:
-            print "Running kernel %s on %s architecture" % (self.runningKernel, self.arch)
-            if self.enableKdumpCheck.get_active():
-                print "System Mem: %s MB    Kdump Mem: %s MB    Avail Mem: %s MB" % (totalSysMem, reservedMem, remainingMem)
-            else:
-                print "Kdump will be disabled"
-
-        # If the user simply doesn't have enough memory for kdump to be viable/supportable, tell 'em
-        if self.enoughMem is False and self.kdumpEnabled:
-            self.showErrorMessage(_("Sorry, your system does not have enough memory for kdump to be viable!"))
-            self.enableKdumpCheck.set_active(False)
-            self.showHide(False)
-            return 0
-        # Alert user that we're not going to turn on kdump if they're running a xen kernel
-        elif self.xenKernel != -1 and self.kdumpEnabled:
-            self.showErrorMessage(_("Sorry, Xen kernels do not support kdump at this time!"))
-            self.enableKdumpCheck.set_active(False)
-            self.showHide(False)
-            return 0
-        # If there's no kdump support on this arch, let the user know and don't configure
-        elif self.arch in self.unsupportedArches:
-            self.showErrorMessage(_("Sorry, the %s architecture does not support kdump at this time!" % self.arch))
-            self.enableKdumpCheck.set_active(False)
-            self.showHide(False)
-            return 0
-
-        # If running on an arch w/a separate kernel-kdump (i.e., non-relocatable kernel), check to
-        # see that its installed, otherwise, alert the user they need to install it, and give them
-        # the chance to abort configuration.
-        if self.arch in self.kernelKdumpArches and self.kernelKdumpInstalled is False:
-            kernelKdumpNote = "\n\nNote that the %s architecture does not feature a relocatable kernel at this time, and thus requires a separate kernel-kdump package to be installed for kdump to function. This can be installed via 'yum install kernel-kdump' at your convenience.\n\n" % self.arch
-        else:
-            kernelKdumpNote = ""
-
-        # Don't alert if nothing has changed
-        if self.initialState != self.kdumpEnabled or reservedMem != self.kdumpMemInitial:
-            dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
-                                    gtk.BUTTONS_YES_NO,
-                                    _("Changing Kdump settings requires rebooting the "
-                                      "system to reallocate memory accordingly. %sWould you "
-                                      "like to continue with this change and reboot the "
-                                      "system after firstboot is complete?" % kernelKdumpNote))
-            dlg.set_position(gtk.WIN_POS_CENTER)
-            dlg.show_all()
-            rc = dlg.run()
-            dlg.destroy()
-
-            if rc == gtk.RESPONSE_NO:
-                self.needsReboot = False
-                return None
-            else:
-                self.needsReboot = True
-
-                # Find bootloader if it exists, and update accordingly
-                if self.getBootloader() == None:
-                    self.showErrorMessage(_("Error! No bootloader config file found, aborting configuration!"))
-                    self.enableKdumpCheck.set_active(False)
-                    self.showHide(False)
-                    return 0
-                else:
-                    self.offset = self.bootloaders[self.bootloader][1]
-
-                # Are we adding or removing the crashkernel param?
-                if self.kdumpEnabled:
-                    grubbyCmd = "/sbin/grubby --%s --update-kernel=/boot/vmlinuz-%s --args=crashkernel=%iM@%iM" \
-                                % (self.bootloader, self.runningKernel, reservedMem, self.offset)
-                    chkconfigStatus = "on"
-                else:
-                    grubbyCmd = "/sbin/grubby --%s --update-kernel=/boot/vmlinuz-%s --remove-args=crashkernel=%s" \
-                                % (self.bootloader, self.runningKernel, self.origCrashKernel)
-                    chkconfigStatus = "off" 
-
-                if self.doDebug:
-                    print "Using %s bootloader with %iM offset" % (self.bootloader, self.offset)
-                    print "Grubby command would be:\n    %s" % grubbyCmd
-                else:
-                    os.system(grubbyCmd)
-                    os.system("/sbin/chkconfig kdump %s" % chkconfigStatus)
-                    if self.bootloader == 'yaboot':
-                        os.system('/sbin/ybin')
-        else:
-            self.needsReboot = False
-
-
-        return 0
-
-    def showErrorMessage(self, text):
-        dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, text)
-        dlg.set_position(gtk.WIN_POS_CENTER)
-        dlg.set_modal(True)
-        rc = dlg.run()
-        dlg.destroy()
-        return None
+			if self.doDebug:
+				print "crashString is %s" % crashString
+			(self.kdumpMem, self.kdumpOffset) = [int(m[:-1]) for m in crashString.split("@")]
+			self.availMem += self.kdumpMem
+			self.origCrashKernel = "%dM@%dM" % (self.kdumpMem, self.kdumpOffset)
+			self.kdumpMemInitial = self.kdumpMem
+		else:
+			self.kdumpEnabled = False
+			self.kdumpMemInitial = 0
+		self.initialState = self.kdumpEnabled
+
+		# Do some sanity-checking and try to present only sane options.
+		#
+		# Defaults
+		lowerBound = 128
+		minUsable = 256
+		step = 64
+		self.enoughMem = True
+		if self.arch == 'ia64':
+			# ia64 usually needs at *least* 256M, page-aligned... :(
+			lowerBound = 256
+			minUsable = 512
+			step = 256
+		elif self.arch == 'ppc64':
+			# ppc64 often fails w/128M lately, and we want at least 1G
+			# of RAM for normal use, due to 64k page size... :\
+			lowerBound = 256
+			minUsable = 1024
+
+		upperBound = (self.availMem - minUsable) - (self.availMem % step)
+
+		if upperBound < lowerBound:
+			self.enoughMem = False
+
+		# Set spinner to lowerBound unless already set on kernel command line
+		if self.kdumpMem == 0:
+			self.kdumpMem = lowerBound
+		else:
+			# round down to a multiple of step value
+			self.kdumpMem = self.kdumpMem - (self.kdumpMem % step)
+
+		# kdump enable/disable checkbox
+		self.enableKdumpCheck = gtk.CheckButton("Enable kdump?")
+		self.enableKdumpCheck.set_alignment(xalign=0, yalign=0)
+
+		# detected total amount of system memory
+		self.totalMem = gtk.Label(_("%s" % self.availMem))
+		self.labelTotal = gtk.Label(_("_Total System Memory (MB):"))
+		self.labelTotal.set_use_underline(True)
+		self.labelTotal.set_mnemonic_widget(self.totalMem)
+		self.labelTotal.set_alignment(0.0, 0.5)
+		self.labelTotal.set_width_chars(32)
+
+		# how much ram to reserve for kdump
+		self.memSpin = gtk.Adjustment(self.kdumpMem, lowerBound, upperBound, step, step, 64)
+		self.kdumpMem = gtk.SpinButton(self.memSpin, 0, 0)
+		self.kdumpMem.set_update_policy(gtk.UPDATE_IF_VALID)
+		self.kdumpMem.set_numeric(True)
+		self.memSpin.connect("value_changed", self.updateAvail, self.kdumpMem)
+		self.labelKdump = gtk.Label(_("_Kdump Memory (MB):"))
+		self.labelKdump.set_use_underline(True)
+		self.labelKdump.set_mnemonic_widget(self.kdumpMem)
+		self.labelKdump.set_alignment(0.0, 0.5)
+
+		# remaining usable system memory
+		self.resMem = eval(string.strip(self.kdumpMem.get_text()))
+		self.remMem = self.availMem - self.resMem
+		self.systemUsableMem = gtk.Label(_("%s" % self.remMem))
+		self.labelSys = gtk.Label(_("_Usable System Memory (MB):"))
+		self.labelSys.set_use_underline(True)
+		self.labelSys.set_mnemonic_widget(self.systemUsableMem)
+		self.labelSys.set_alignment(0.0, 0.5)
+		
+		self.vbox = gtk.VBox()
+		self.vbox.set_size_request(400, 200)
+
+		# title_pix = loadPixbuf("workstation.png")
+
+		internalVBox = gtk.VBox()
+		internalVBox.set_border_width(10)
+		internalVBox.set_spacing(10)
+
+		label = gtk.Label(_("Kdump is a kernel crash dumping mechanism. In the event of a "
+							"system crash, kdump will capture information from your system "
+							"that can be invaluable in determining the cause of the crash. "
+							"Note that kdump does require reserving a portion of system "
+							"memory that will be unavailable for other uses."))
+
+		label.set_line_wrap(True)
+		label.set_alignment(0.0, 0.5)
+		label.set_size_request(500, -1)
+		internalVBox.pack_start(label, False, True)
+
+		table = gtk.Table(2, 4)
+
+		table.attach(self.enableKdumpCheck, 0, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5)
+
+		table.attach(self.labelTotal, 0, 1, 1, 2, gtk.FILL)
+		table.attach(self.totalMem, 1, 2, 1, 2, gtk.SHRINK, gtk.FILL, 5, 5)
+
+		table.attach(self.labelKdump, 0, 1, 2, 3, gtk.FILL)
+		table.attach(self.kdumpMem, 1, 2, 2, 3, gtk.SHRINK, gtk.FILL, 5, 5)
+
+		table.attach(self.labelSys, 0, 1, 3, 4, gtk.FILL)
+		table.attach(self.systemUsableMem, 1, 2, 3, 4, gtk.SHRINK, gtk.FILL, 5, 5)
+
+		# disable until user clicks check box, if not already enabled
+		if self.initialState is False:
+			self.showHide(False)
+		else:
+			self.enableKdumpCheck.set_active(True)
+
+		internalVBox.pack_start(table, True, 15)
+
+		# toggle sensitivity of Mem items
+		self.enableKdumpCheck.connect("toggled", self.on_enableKdumpCheck_toggled)
+
+		self.vbox.pack_start(internalVBox, False, 15)
+
+	def grabFocus(self):
+		self.enableKdumpCheck.grab_focus()
+
+	def apply(self, *args):
+		if self.kdumpEnabled:
+			totalSysMem = self.totalMem.get_text()
+			totalSysMem = eval(string.strip(totalSysMem))
+			reservedMem = self.kdumpMem.get_value_as_int()
+			remainingMem = totalSysMem - reservedMem
+		else:
+			reservedMem = self.kdumpMemInitial
+
+		if self.doDebug:
+			print "Running kernel %s on %s architecture" % (self.runningKernel, self.arch)
+			if self.enableKdumpCheck.get_active():
+				print "System Mem: %s MB	Kdump Mem: %s MB	Avail Mem: %s MB" % (totalSysMem, reservedMem, remainingMem)
+			else:
+				print "Kdump will be disabled"
+
+		# If the user simply doesn't have enough memory for kdump to be viable/supportable, tell 'em
+		if self.enoughMem is False and self.kdumpEnabled:
+			self.showErrorMessage(_("Sorry, your system does not have enough memory for kdump to be viable!"))
+			self.enableKdumpCheck.set_active(False)
+			self.showHide(False)
+			return RESULT_FAILURE 
+		# Alert user that we're not going to turn on kdump if they're running a xen kernel
+		elif self.xenKernel != -1 and self.kdumpEnabled:
+			self.showErrorMessage(_("Sorry, Xen kernels do not support kdump at this time!"))
+			self.enableKdumpCheck.set_active(False)
+			self.showHide(False)
+			return RESULT_FAILURE 
+		# If there's no kdump support on this arch, let the user know and don't configure
+		elif self.arch in self.unsupportedArches:
+			self.showErrorMessage(_("Sorry, the %s architecture does not support kdump at this time!" % self.arch))
+			self.enableKdumpCheck.set_active(False)
+			self.showHide(False)
+			return RESULT_FAILURE 
+
+		# If running on an arch w/a separate kernel-kdump (i.e., non-relocatable kernel), check to
+		# see that its installed, otherwise, alert the user they need to install it, and give them
+		# the chance to abort configuration.
+		if self.arch in self.kernelKdumpArches and self.kernelKdumpInstalled is False:
+			kernelKdumpNote = "\n\nNote that the %s architecture does not feature a relocatable kernel at this time, and thus requires a separate kernel-kdump package to be installed for kdump to function. This can be installed via 'yum install kernel-kdump' at your convenience.\n\n" % self.arch
+		else:
+			kernelKdumpNote = ""
+
+		# Don't alert if nothing has changed
+		if self.initialState != self.kdumpEnabled or reservedMem != self.kdumpMemInitial:
+			dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,
+									gtk.BUTTONS_YES_NO,
+									_("Changing Kdump settings requires rebooting the "
+									  "system to reallocate memory accordingly. %sWould you "
+									  "like to continue with this change and reboot the "
+									  "system after firstboot is complete?" % kernelKdumpNote))
+			dlg.set_position(gtk.WIN_POS_CENTER)
+			dlg.show_all()
+			rc = dlg.run()
+			dlg.destroy()
+
+			if rc == gtk.RESPONSE_NO:
+				self.needsReboot = False
+				return RESULT_SUCCESS 
+			else:
+				self.needsReboot = True
+
+				# Find bootloader if it exists, and update accordingly
+				if self.getBootloader() == None:
+					self.showErrorMessage(_("Error! No bootloader config file found, aborting configuration!"))
+					self.enableKdumpCheck.set_active(False)
+					self.showHide(False)
+					return RESULT_FAILURE 
+				else:
+					self.offset = self.bootloaders[self.bootloader][1]
+
+				# Are we adding or removing the crashkernel param?
+				if self.kdumpEnabled:
+					grubbyCmd = "/sbin/grubby --%s --update-kernel=/boot/vmlinuz-%s --args=crashkernel=%iM@%iM" \
+								% (self.bootloader, self.runningKernel, reservedMem, self.offset)
+					chkconfigStatus = "on"
+				else:
+					grubbyCmd = "/sbin/grubby --%s --update-kernel=/boot/vmlinuz-%s --remove-args=crashkernel=%s" \
+								% (self.bootloader, self.runningKernel, self.origCrashKernel)
+					chkconfigStatus = "off" 
+
+				if self.doDebug:
+					print "Using %s bootloader with %iM offset" % (self.bootloader, self.offset)
+					print "Grubby command would be:\n	%s" % grubbyCmd
+				else:
+					os.system(grubbyCmd)
+					os.system("/sbin/chkconfig kdump %s" % chkconfigStatus)
+					if self.bootloader == 'yaboot':
+						os.system('/sbin/ybin')
+		else:
+			self.needsReboot = False
+
+
+		return RESULT_SUCCESS
+
+	def showErrorMessage(self, text):
+		dlg = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, text)
+		dlg.set_position(gtk.WIN_POS_CENTER)
+		dlg.set_modal(True)
+		rc = dlg.run()
+		dlg.destroy()
+		return None
+
+	def initializeUI(self):
+		pass
+


Index: kexec-tools.spec
===================================================================
RCS file: /cvs/extras/rpms/kexec-tools/devel/kexec-tools.spec,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -p -r1.139 -r1.140
--- kexec-tools.spec	15 Jun 2009 16:58:42 -0000	1.139
+++ kexec-tools.spec	23 Jun 2009 18:36:27 -0000	1.140
@@ -1,6 +1,6 @@
 Name: kexec-tools
 Version: 2.0.0 
-Release: 15%{?dist}
+Release: 16%{?dist}
 License: GPLv2
 Group: Applications/System
 Summary: The kexec/kdump userspace component.
@@ -256,6 +256,9 @@ done
 
 
 %changelog
+* Wed Jun 23 2009 Neil Horman <nhorman at redhat.com> 2.0.0-16
+- Fix up kdump so it works with latest firstboot
+
 * Mon Jun 15 2009 Neil Horman <nhorman at redhat.com> 2.0.0-15
 - Fixed some stat drive detect bugs by E. Biederman (bz505701)
 




More information about the fedora-extras-commits mailing list