diff options
-rw-r--r-- | autopart.py | 101 | ||||
-rw-r--r-- | iw/partition_gui.py | 23 | ||||
-rw-r--r-- | partitioning.py | 30 | ||||
-rw-r--r-- | textw/partition_text.py | 17 |
4 files changed, 136 insertions, 35 deletions
diff --git a/autopart.py b/autopart.py index 729502a98..2981ade0b 100644 --- a/autopart.py +++ b/autopart.py @@ -27,32 +27,28 @@ CLEARPART_TYPE_LINUX = 1 CLEARPART_TYPE_ALL = 2 CLEARPART_TYPE_NONE = 3 +BOOT_ABOVE_1024 = 1 -# XXX hack but these are common strings to TUI and GUI -PARTMETHOD_TYPE_DESCR_TEXT = N_("Automatic Partitioning sets up your " - "partitioning based on your installation type. " - "You also " - "can customize the resulting partitions " - "to meet your needs.\n\n" - "The manual disk paritioning tool Disk Druid " - "allows you " - "to set up your partitions in an interactive " - "environment. You can set the filesystem " - "types, mount points, size and more in this " - "easy to use, powerful interface.\n\n" - "fdisk is the traditional, text based " - "partitioning tool offered by Red Hat. " - "Although it is not as easy to use, there are " - "cases where fdisk is preferred.") -AUTOPART_DISK_CHOICE_DESCR_TEXT = N_("Before automatic partitioning can be " - "set up by the installation program, you " - "must choose how to use the space on " - "hard drives.") +# check that our "boot" partition meets necessary constraints unless +# the request has its ignore flag set +def bootRequestCheck(requests, diskset): + dev = requests.getBootableRequest() + if not dev or not dev.device or dev.ignoreBootConstraints: + return PARTITION_SUCCESS + part = get_partition_by_name(diskset.disks, dev.device) + if not part: + return PARTITION_SUCCESS -CLEARPART_TYPE_ALL_DESCR_TEXT = N_("Remove all partitions on this system") -CLEARPART_TYPE_LINUX_DESCR_TEXT = N_("Remove all Linux Partitions on this system") -CLEARPART_TYPE_NONE_DESCR_TEXT = N_("Keep all partitions and use existing free space") + + if iutil.getArch() == "ia64": + # XXX do ia64 boot checks here after checking with bill about specifics + pass + elif iutil.getArch() == "i386": + if end_sector_to_cyl(part.geom.disk.dev, part.geom.end) >= 1024: + return BOOT_ABOVE_1024 + + return PARTITION_SUCCESS def printNewRequestsCyl(diskset, newRequest): for req in newRequest.requests: @@ -190,7 +186,7 @@ def fitConstrained(diskset, requests, primOnly=0, newParts = None): # get the list of the "best" drives to try to use... # if currentdrive is set, use that, else use the drive list, or use # all the drives -def getDriveList(request, diskset): +def getDriveList(request, diskset, bootrequest = 0): if request.currentDrive: drives = request.currentDrive elif request.drive: @@ -201,6 +197,11 @@ def getDriveList(request, diskset): if not type(drives) == type([]): drives = [ drives ] + drives.sort() + # XXX boot drive being first drive works now, but perhaps not always =\ + if bootrequest: + drives = [ drives[0] ] + return drives @@ -208,6 +209,7 @@ def getDriveList(request, diskset): # into the freespace def fitSized(diskset, requests, primOnly = 0, newParts = None): todo = {} + bootreq = requests.getBootableRequest() for request in requests.requests: if request.type != REQUEST_NEW: @@ -216,7 +218,10 @@ def fitSized(diskset, requests, primOnly = 0, newParts = None): continue if primOnly and not request.primary: continue - drives = getDriveList(request, diskset) + if request == bootreq: + drives = getDriveList(request, diskset, 1) + else: + drives = getDriveList(request, diskset) if not todo.has_key(len(drives)): todo[len(drives)] = [ request ] else: @@ -229,9 +234,13 @@ def fitSized(diskset, requests, primOnly = 0, newParts = None): for num in number: for request in todo[num]: # print "\nInserting ->",request + if request == bootreq: + isBoot = 1 + else: + isBoot = 0 + largestPart = (0, None) - drives = getDriveList(request, diskset) - drives.sort() + drives = getDriveList(request, diskset, isBoot) # print "Trying drives to find best free space out of", free for drive in drives: # print "Trying drive", drive @@ -654,10 +663,16 @@ def doPartitioning(diskset, requests, doRefresh = 1): newParts.parts.remove(part) del part + if ret != PARTITION_SUCCESS: + raise PartitioningError, "Growing partitions failed" + + ret = bootRequestCheck(requests, diskset) + if ret == PARTITION_SUCCESS: return - raise PartitioningError, "Growing partitions failed" + # more specific message? + raise PartitioningWarning, _("Boot partition %s may not meet booting constraints for your architecture. Creation of a boot disk is highly encouraged.") %(requests.getBootableRequest().mountpoint) # given clearpart specification execute it # probably want to reset diskset and partition request lists before calling @@ -665,7 +680,7 @@ def doPartitioning(diskset, requests, doRefresh = 1): def doClearPartAction(partitions, diskset): type = partitions.autoClearPartType cleardrives = partitions.autoClearPartDrives - + if type == CLEARPART_TYPE_LINUX: linuxOnly = 1 elif type == CLEARPART_TYPE_ALL: @@ -699,6 +714,7 @@ def doClearPartAction(partitions, diskset): drive = get_partition_drive(part) delete = DeleteSpec(drive, part.geom.start, part.geom.end) partitions.addDelete(delete) + part = disk.next_partition(part) @@ -746,3 +762,30 @@ def doAutoPartition(dir, diskset, partitions, intf): partitions.setFromDisk(diskset) intf.messageWindow(_("Error Partitioning"), _("Could not allocated requested partitions: %s.") % (msg.value)) + + +# XXX hack but these are common strings to TUI and GUI +PARTMETHOD_TYPE_DESCR_TEXT = N_("Automatic Partitioning sets up your " + "partitioning based on your installation type. " + "You also " + "can customize the resulting partitions " + "to meet your needs.\n\n" + "The manual disk paritioning tool Disk Druid " + "allows you " + "to set up your partitions in an interactive " + "environment. You can set the filesystem " + "types, mount points, size and more in this " + "easy to use, powerful interface.\n\n" + "fdisk is the traditional, text based " + "partitioning tool offered by Red Hat. " + "Although it is not as easy to use, there are " + "cases where fdisk is preferred.") + +AUTOPART_DISK_CHOICE_DESCR_TEXT = N_("Before automatic partitioning can be " + "set up by the installation program, you " + "must choose how to use the space on " + "hard drives.") + +CLEARPART_TYPE_ALL_DESCR_TEXT = N_("Remove all partitions on this system") +CLEARPART_TYPE_LINUX_DESCR_TEXT = N_("Remove all Linux Partitions on this system") +CLEARPART_TYPE_NONE_DESCR_TEXT = N_("Keep all partitions and use existing free space") diff --git a/iw/partition_gui.py b/iw/partition_gui.py index ed3a22767..427351fe8 100644 --- a/iw/partition_gui.py +++ b/iw/partition_gui.py @@ -1023,6 +1023,29 @@ class PartitionWindow(InstallWindow): self.intf.messageWindow(_("Error Partitioning"), _("Could not allocated requested partitions: %s.") % (msg)) rc = -1 + except PartitioningWarning, msg: + # XXX somebody other than me should make this look better + dialog = GnomeDialog(_("Warning")) + dialog.set_parent(self.parent) + dialog.append_button(_("Modify Partition")) + dialog.append_button(_("Add anyway")) + dialog.set_position(WIN_POS_CENTER) + dialog.close_hides(TRUE) + + label = GtkLabel(_("Warning: %s.") %(msg)) + label.set_line_wrap(TRUE) + dialog.vbox.pack_start(label) + dialog.show_all() + rc = dialog.run() + dialog.close() + if rc != 1: + rc = -1 + else: + rc = 0 + req = self.partitions.getBootableRequest() + if req: + req.ignoreBootConstraints = 1 + self.populate() self.tree.thaw() self.checkNextConditions() diff --git a/partitioning.py b/partitioning.py index 6865dcfa1..6fb150769 100644 --- a/partitioning.py +++ b/partitioning.py @@ -24,6 +24,7 @@ import math import raid import fsset import os +import iutil from translate import _ from log import log from constants import * @@ -56,6 +57,13 @@ class PartitioningError: def __str__ (self): return self.value +class PartitioningWarning: + def __init__ (self, value): + self.value = value + + def __str__ (self): + return self.value + def get_flags (part): string="" if not part.is_active (): @@ -455,9 +463,9 @@ class PartitionSpec: size = None, grow = 0, maxSize = None, mountpoint = None, origfstype = None, start = None, end = None, partnum = None, - drive = None, primary = None, secondary = None, - format = None, migrate = None, options = None, - constraint = None, + drive = None, primary = None, + format = None, options = None, + constraint = None, migrate = None, raidmembers = None, raidlevel = None, raidspares = None): # @@ -484,7 +492,6 @@ class PartitionSpec: self.partnum = partnum self.drive = drive self.primary = primary - self.secondary = secondary self.format = format self.migrate = migrate self.options = options @@ -507,6 +514,9 @@ class PartitionSpec: # unique id for each request self.uniqueID = None + # ignore booting constraints for this request + self.ignoreBootConstraints = 0 + def __str__(self): if self.fstype: fsname = self.fstype.getName() @@ -680,7 +690,12 @@ class Partitions: # return name of boot mount point in current requests def getBootableRequest(self): - bootreq = self.getRequestByMountPoint("/boot") + bootreq = None + + if not bootreq and iutil.getArch() == "ia64": + bootreq = self.getRequestByMountPoint("/boot/efi") + if not bootreq: + bootreq = self.getRequestByMountPoint("/boot") if not bootreq: bootreq = self.getRequestByMountPoint("/") @@ -696,6 +711,11 @@ class Partitions: self.requests[n] = request self.requests[index] = tmp n = n + 1 + tmp = self.getBootableRequest() + if tmp: + index = self.requests.index(tmp) + self.requests[index] = self.requests[0] + self.requests[0] = tmp def copy (self): new = Partitions() diff --git a/textw/partition_text.py b/textw/partition_text.py index f8cfa6161..8018ed32e 100644 --- a/textw/partition_text.py +++ b/textw/partition_text.py @@ -141,7 +141,19 @@ class PartitionWindow: except PartitioningError, msg: self.intf.messageWindow(_("Error Partitioning"), _("Could not allocated requested partitions: %s.") % (msg)) - rc = -1 + rc = -1 + except PartitioningWarning, msg: + rc = ButtonChoiceWindow(self.screen, _("Warning"), _("Warning: %s") %(msg), + buttons = [ (_("Modify Partition"), "modify"), (_("Add anyway"), "add") ]) + + if rc == "modify": + rc = -1 + else: + rc = 0 + req = self.partitions.getBootableRequest() + if req: + req.ignoreBootConstraints = 1 + self.populate() return rc @@ -191,6 +203,9 @@ class PartitionWindow: names = types.keys() names.sort() for name in names: + if not fileSystemTypeGet(name).isSupported(): + continue + if fileSystemTypeGet(name).isFormattable(): fstype.append(name, types[name]) if request.fstype: |