From 23a5389c0107003629abfd706f6ae42cf1b14885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B8=D1=80=D0=B5=D1=86=D0=BA=D0=B8=D0=B9=20=D0=9C?= =?UTF-8?q?=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Thu, 5 Oct 2017 10:25:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B8=D1=81=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * добавлена проверка попытки использованить RAID основанный на LVM * добавлена проверка попытки разметить RAID, используемый в текущей системе (например из него сделан LVM) --- pym/install/variables/autopartition.py | 65 ++++++++++++++++---------- pym/install/variables/disk.py | 19 +++++++- 2 files changed, 58 insertions(+), 26 deletions(-) diff --git a/pym/install/variables/autopartition.py b/pym/install/variables/autopartition.py index adf6542..0ff1991 100644 --- a/pym/install/variables/autopartition.py +++ b/pym/install/variables/autopartition.py @@ -266,13 +266,14 @@ class VariableClAutopartitionDevice(AutopartitionHelper, Variable): def checkNeeded(self, valuelist, usedDevices, agregationType): needDevices = list(set(usedDevices) - set(valuelist)) if needDevices: - raise VariableError(_("Disks {selecteddisk} are part of " - "{agrtype}\nYou need to use {needdisk} as well or " - "clear {agrtype} manually") - .format(selecteddisk=",".join( - list(set(usedDevices) & set(valuelist))), - needdisk=",".join(needDevices), - agrtype=agregationType)) + raise VariableError( + _("Disks {selecteddisk} are part of " + "{agrtype}\nYou need to use {needdisk} as well or " + "clear {agrtype} manually").format( + selecteddisk=",".join( + list(set(usedDevices) & set(valuelist))), + needdisk=",".join(needDevices), + agrtype=agregationType)) def checkOnLvm(self, valuelist): disks = self.Select('os_disk_dev', @@ -317,18 +318,31 @@ class VariableClAutopartitionDevice(AutopartitionHelper, Variable): device=",".join(common), selected=device)) + def checkSelectedRaid(self, valuelist): + """ + Проверить схемы RAID, чтобы исключить базирование их на lvm + """ + typecheck = re.compile("lvm.*raid") + for dev, fulltype in self.ZipVars("os_device_dev", + "os_device_fulltype"): + if dev in valuelist: + if typecheck.search(fulltype): + raise VariableError(_("RAID %s is wrong") % dev) + def check(self, valuelist): if self.Get('cl_autopartition_set') == "on": if not valuelist: raise VariableError( _("For autopartition, please select the device")) - useDisks = self.Select('os_disk_parent', - where='os_disk_mount', ne='') - for value in valuelist: + useDisks = set(traverse(x.split(',') for x in self.Select( + 'os_disk_parent', where='os_disk_mount', ne=''))) + selected_raid_devices = self.Get('cl_autopartition_raid_parent') + for value in chain(valuelist, selected_raid_devices): if value in useDisks: raise VariableError( _("Device %s is already in use by the current " "system") % value) + self.checkSelectedRaid(valuelist) self.checkOnSelectParentAndChild(valuelist) self.checkOnLvm(valuelist) self.checkOnRaid(valuelist) @@ -781,7 +795,7 @@ class VariableClAutopartitionDiskSizeFull(ReadonlyVariable): class VariableClAutopartitionRaid(ReadonlyVariable): """ - Список выбранных устройств для разметки, которые являются RAID + Список выбранных для разметки RAID устройств """ type = "list" @@ -789,9 +803,22 @@ class VariableClAutopartitionRaid(ReadonlyVariable): selected_dev = self.Get('cl_autopartition_device') return [ dev for dev, _type in self.ZipVars( - "cl_autopartition_device_dev", "cl_autopartition_device_type") + "cl_autopartition_device_dev", "cl_autopartition_device_type") if dev in selected_dev and _type == "raid"] +class VariableClAutopartitionRaidParent(ReadonlyVariable): + """ + Список физических устройств, из которых построены выбранные RAID + """ + type = "list" + + def get(self): + selected_raid = set(self.Get('cl_autopartition_raid')) + return list(set(traverse( + parents.split(',') + for parents in self.select('os_device_parent', + os_device_dev__in=selected_raid)))) + class VariableClAutopartitionMbr(ReadonlyVariable): """ Диски на которые будет установлен загрузчик @@ -802,12 +829,7 @@ class VariableClAutopartitionMbr(ReadonlyVariable): if self.GetBool('cl_autopartition_uefi_set'): return [] - selected_raid = self.Get('cl_autopartition_raid') - - selected_raid_devices = set(traverse( - parents.split(',') - for parents in self.select('os_device_parent', - os_device_dev__in=selected_raid))) + selected_raid_devices = self.Get('cl_autopartition_raid_parent') mbr = (mbr for mbr in self.select( 'os_device_mbr', os_device_dev__in=selected_raid_devices) @@ -827,12 +849,7 @@ class VariableClAutopartitionEfi(ReadonlyVariable): if not self.GetBool('cl_autopartition_uefi_set'): return [] - selected_raid = self.Get('cl_autopartition_raid') - - selected_raid_devices = set(traverse( - parents.split(',') - for parents in self.select('os_device_parent', - os_device_dev__in=selected_raid))) + selected_raid_devices = self.Get('cl_autopartition_raid_parent') efi = (efi for efi in self.select( 'os_device_efi', os_device_dev__in=selected_raid_devices) diff --git a/pym/install/variables/disk.py b/pym/install/variables/disk.py index ae0cc60..af1e486 100644 --- a/pym/install/variables/disk.py +++ b/pym/install/variables/disk.py @@ -106,9 +106,10 @@ class VariableOsDeviceData(ReadonlyTableVariable): 'os_device_map', 'os_device_syspath', 'os_device_name', - 'os_device_size' + 'os_device_size', 'os_device_mbr', - 'os_device_efi'] + 'os_device_efi', + 'os_device_fulltype'] class VariableOsDeviceInvalidator(ReadonlyVariable): @@ -132,6 +133,7 @@ class VariableOsDeviceInvalidator(ReadonlyVariable): os.close(slave) fl = fcntl.fcntl(self.master, fcntl.F_GETFL) fcntl.fcntl(self.master, fcntl.F_SETFL, fl | os.O_NONBLOCK) + return "Device invalidator" def close(self): try: @@ -155,6 +157,7 @@ class VariableOsDeviceInvalidator(ReadonlyVariable): except OSError as e: pass + class VariableOsDeviceDev(DeviceHelper, ReadonlyVariable): """ Disk devices @@ -179,6 +182,18 @@ class VariableOsDeviceDev(DeviceHelper, ReadonlyVariable): return list(sorted((x for x in devnames), key=self.separateDevice)) +class VariableOsDeviceFulltype(ReadonlyVariable): + """ + Полный тип + """ + type = "list" + + def get(self): + """Get device /dev name""" + return [ + device.udev.get_device_type(x) + for x in self.Get('os_device_syspath') + ] class VariableOsDeviceType(ReadonlyVariable):