diff options
author | Jeremy Katz <katzj@redhat.com> | 2002-02-06 21:49:11 +0000 |
---|---|---|
committer | Jeremy Katz <katzj@redhat.com> | 2002-02-06 21:49:11 +0000 |
commit | b79bbf852add9ff1ff09138ea35488b26cc7bdb7 (patch) | |
tree | 25849821c71d0a5b9bd5f6f1f0ae517d9d8b450e /partedUtils.py | |
parent | 2d28d0e04d2e943aa21c745b5eb9c54b986e46f9 (diff) | |
download | anaconda-b79bbf852add9ff1ff09138ea35488b26cc7bdb7.tar.gz anaconda-b79bbf852add9ff1ff09138ea35488b26cc7bdb7.tar.xz anaconda-b79bbf852add9ff1ff09138ea35488b26cc7bdb7.zip |
stage 1 of the partitioning.py cleanup effort --
1) move the following functions from partitioning.py -> partedUtils.py
get_flags, start_sector_to_cyl, end_sector_to_cyl, start_cyl_to_sector,
end_cyl_to_sector, getPartSize, getPartSizeMB, getDeviceSizeMB,
get_partition_by_name, get_partition_name, get_partition_file_system_type,
set_partition_file_system_type, get_partition_drive, map_foreign_to_fsname,
filter_partitions, get_logical_partitions, get_primary_partitions,
get_raid_partitions, get_lvm_partitions,
2) move PartitioningError and PartitioningWarning classes from
partitioning.py -> partErrors.py
Change everything that depends on these functions to use the new location
Diffstat (limited to 'partedUtils.py')
-rw-r--r-- | partedUtils.py | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/partedUtils.py b/partedUtils.py new file mode 100644 index 000000000..5b4cd7631 --- /dev/null +++ b/partedUtils.py @@ -0,0 +1,272 @@ +# +# partedUtils.py: helper functions for use with parted objects +# +# Matt Wilson <msw@redhat.com> +# Jeremy Katz <katzj@redhat.com> +# Mike Fulbright <msf@redhat.com> +# +# Copyright 2002 Red Hat, Inc. +# +# This software may be freely redistributed under the terms of the GNU +# library public license. +# +# You should have received a copy of the GNU Library Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +"""Helper functions for use when dealing with parted objects.""" + +import parted +import fsset +import math + +from partErrors import * +from translate import _ + +fsTypes = {} + +fs_type = parted.file_system_type_get_next () +while fs_type: + fsTypes[fs_type.name] = fs_type + fs_type = parted.file_system_type_get_next (fs_type) + + + +def get_flags (part): + """Retrieve a list of strings representing the flags on the partition.""" + string="" + if not part.is_active (): + return string + first=1 + flag = parted.partition_flag_next (0) + while flag: + if part.get_flag (flag): + string = string + parted.partition_flag_get_name (flag) + if first: + first = 0 + else: + string = string + ", " + flag = parted.partition_flag_next (flag) + return string + +def start_sector_to_cyl(device, sector): + """Return the closest cylinder (round down) to sector on device.""" + return int(math.floor((float(sector) + / (device.heads * device.sectors)) + 1)) + +def end_sector_to_cyl(device, sector): + """Return the closest cylinder (round up) to sector on device.""" + return int(math.ceil(float((sector + 1)) + / (device.heads * device.sectors))) + +def start_cyl_to_sector(device, cyl): + "Return the sector corresponding to cylinder as a starting cylinder." + return long((cyl - 1) * (device.heads * device.sectors)) + +def end_cyl_to_sector(device, cyl): + "Return the sector corresponding to cylinder as a ending cylinder." + return long(((cyl) * (device.heads * device.sectors)) - 1) + +def getPartSize(partition): + """Return the size of partition in sectors.""" + return partition.geom.length + +def getPartSizeMB(partition): + """Return the size of partition in megabytes.""" + return (partition.geom.length * partition.geom.disk.dev.sector_size + / 1024.0 / 1024.0) + +def getDeviceSizeMB(dev): + """Return the size of dev in megabytes.""" + return (float(dev.heads * dev.cylinders * dev.sectors) / (1024 * 1024) + * dev.sector_size) + +def get_partition_by_name(disks, partname): + """Return the parted part object associated with partname. + + Arguments: + disks -- Dictionary of diskname->PedDisk objects + partname -- Name of partition to find + + Return: + PedPartition object with name partname. None if no such partition. + """ + for diskname in disks.keys(): + disk = disks[diskname] + part = disk.next_partition() + while part: + if get_partition_name(part) == partname: + return part + + part = disk.next_partition(part) + + return None + +def get_partition_name(partition): + """Return the device name for the PedPartition partition.""" + if (partition.geom.disk.dev.type == parted.DEVICE_DAC960 + or partition.geom.disk.dev.type == parted.DEVICE_CPQARRAY): + return "%sp%d" % (partition.geom.disk.dev.path[5:], + partition.num) + return "%s%d" % (partition.geom.disk.dev.path[5:], + partition.num) + + +def get_partition_file_system_type(part): + """Return the file system type of the PedPartition part. + + Arguments: + part -- PedPartition object + + Return: + Filesystem object (as defined in fsset.py) + """ + if part.fs_type == None: + return None + if part.fs_type.name == "linux-swap": + ptype = fsset.fileSystemTypeGet("swap") + elif part.fs_type.name == "FAT": + ptype = fsset.fileSystemTypeGet("vfat") + else: + try: + ptype = fsset.fileSystemTypeGet(part.fs_type.name) + except: + ptype = fsset.fileSystemTypeGet("foreign") + + return ptype + + +def set_partition_file_system_type(part, fstype): + """Set partition type of part to PedFileSystemType implied by fstype.""" + if fstype == None: + return + try: + for flag in fstype.getPartedPartitionFlags(): + if not part.is_flag_available(flag): + raise PartitioningError, ("requested FileSystemType needs " + "a flag that is not available.") + part.set_flag(flag, 1) + part.set_system(fstype.getPartedFileSystemType()) + except: + print "Failed to set partition type to ",fstype.getName() + pass + +def get_partition_drive(partition): + """Return the device name for disk that PedPartition partition is on.""" + return "%s" %(partition.geom.disk.dev.path[5:]) + +def map_foreign_to_fsname(type): + """Return the partition type associated with the numeric type.""" + if type in allPartitionTypesDict.keys(): + return allPartitionTypesDict[type] + else: + return _("Foreign") + +def filter_partitions(disk, func): + rc = [] + part = disk.next_partition () + while part: + if func(part): + rc.append(part) + part = disk.next_partition (part) + + return rc + +def get_logical_partitions(disk): + """Return a list of logical PedPartition objects on disk.""" + func = lambda part: (part.is_active() + and part.type & parted.PARTITION_LOGICAL) + return filter_partitions(disk, func) + +def get_primary_partitions(disk): + """Return a list of primary PedPartition objects on disk.""" + func = lambda part: part.type == parted.PARTITION_PRIMARY + return filter_partitions(disk, func) + +def get_raid_partitions(disk): + """Return a list of RAID-type PedPartition objects on disk.""" + func = lambda part: (part.is_active() + and part.get_flag(parted.PARTITION_RAID) == 1) + return filter_partitions(disk, func) + +def get_lvm_partitions(disk): + """Return a list of physical volume-type PedPartition objects on disk.""" + func = lambda part: (part.is_active() + and part.get_flag(parted.PARTITION_LVM) == 1) + return filter_partitions(disk, func) + + + +# XXX is this all of the possibilities? +dosPartitionTypes = [ 1, 6, 11, 12, 14, 15 ] + +# master list of partition types +allPartitionTypesDict = { + 0 : "Empty", + 1: "DOS 12-bit FAT", + 2: "XENIX root", + 3: "XENIX usr", + 4: "DOS 16-bit <32M", + 5: "Extended", + 6: "DOS 16-bit >=32M", + 7: "NTFS/HPFS", + 8: "AIX", + 9: "AIX bootable", + 10: "OS/2 Boot Manager", + 0xb: "Win95 FAT32", + 0xc: "Win95 FAT32", + 0xe: "Win95 FAT16", + 0xf: "Win95 Ext'd", + 0x10: "OPUS", + 0x11: "Hidden FAT12", + 0x12: "Compaq Setup", + 0x14: "Hidden FAT16 <32M", + 0x16: "Hidden FAT16", + 0x17: "Hidden HPFS/NTFS", + 0x18: "AST SmartSleep", + 0x1b: "Hidden Win95 FAT32", + 0x1c: "Hidden Win95 FAT32 (LBA)", + 0x1e: "Hidden Win95 FAT16 (LBA)", + 0x24: "NEC_DOS", + 0x39: "Plan 9", + 0x40: "Venix 80286", + 0x41: "PPC_PReP Boot", + 0x42: "SFS", + 0x4d: "QNX4.x", + 0x4e: "QNX4.x 2nd part", + 0x4f: "QNX4.x 2nd part", + 0x51: "Novell?", + 0x52: "Microport", + 0x63: "GNU HURD", + 0x64: "Novell Netware 286", + 0x65: "Novell Netware 386", + 0x75: "PC/IX", + 0x80: "Old MINIX", + 0x81: "Linux/MINIX", + 0x82: "Linux swap", + 0x83: "Linux native", + 0x84: "OS/2 hidden C:", + 0x85: "Linux Extended", + 0x86: "NTFS volume set", + 0x87: "NTFS volume set", + 0x8e: "Linux LVM", + 0x93: "Amoeba", + 0x94: "Amoeba BBT", + 0x9f: "BSD/OS", + 0xa0: "IBM Thinkpad hibernation", + 0xa5: "BSD/386", + 0xa6: "OpenBSD", + 0xb7: "BSDI fs", + 0xb8: "BSDI swap", + 0xc7: "Syrinx", + 0xdb: "CP/M", + 0xde: "Dell Utility", + 0xe1: "DOS access", + 0xe3: "DOS R/O", + 0xeb: "BEOS", + 0xee: "EFI GPT", + 0xef: "EFI (FAT-12/16/32)", + 0xf2: "DOS secondary", + 0xfd: "Linux RAID", + 0xff: "BBT" + } |