From 2f64c6a65f946b007ee0080a2e0e4a53799a9b87 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: Wed, 17 Jun 2020 18:13:23 +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=D0=B0=20=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5=20=D0=B1?= =?UTF-8?q?=D1=83=D0=B4=D0=B5=D1=82=20=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=D1=81=D1=8F=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0?= =?UTF-8?q?=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=20--force?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pym/install/variables/autopartition.py | 30 ++++++++++++++++++-------- pym/install/variables/disk.py | 30 +++++++++++++++++--------- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/pym/install/variables/autopartition.py b/pym/install/variables/autopartition.py index 2133281..6956cf0 100644 --- a/pym/install/variables/autopartition.py +++ b/pym/install/variables/autopartition.py @@ -23,7 +23,7 @@ import calculate.lib.utils.device as device from calculate.lib.utils.device import humanreadableSize from calculate.lib.utils import partition from calculate.lib.utils.files import (readLinesFile) -from calculate.lib.utils.mount import isMount +from calculate.lib.utils.mount import isMount, try_umount from calculate.install.fs_manager import FileSystemManager from calculate.lib.utils.tools import Sizes, traverse from itertools import * @@ -295,6 +295,24 @@ class VariableClAutopartitionDevice(AutopartitionHelper, Variable): if typecheck.search(fulltype): raise VariableError(_("RAID %s is wrong") % dev) + def is_force_param(self): + return "--force" in self.Get("cl_console_args") + + def get_mounted_devices(self): + mountedData = [(x,y) for x,y in self.ZipVars( + "os_disk_parent", "os_disk_dev") if isMount(y)] + mountedDevices = {} + for devices, disk in mountedData: + if not isMount(disk): + continue + if self.is_force_param() and try_umount(disk): + continue + for _device in traverse(devices.split(',')): + if _device not in mountedDevices: + mountedDevices[_device] = set() + mountedDevices[_device].add(disk) + return mountedDevices + def check(self, valuelist): if self.Get('cl_autopartition_set') == "on": if not valuelist: @@ -303,14 +321,8 @@ class VariableClAutopartitionDevice(AutopartitionHelper, Variable): useDisks = set(traverse(x.split(',') for x in self.Select( 'os_disk_parent', where='os_disk_mount', ne=''))) - mountedData = [(x,y) for x,y in self.ZipVars( - "os_disk_parent", "os_disk_dev") if isMount(y)] - mountedDevices = {} - for devices, disk in mountedData: - for _device in traverse(devices.split(',')): - if _device not in mountedDevices: - mountedDevices[_device] = set() - mountedDevices[_device].add(disk) + + mountedDevices = self.get_mounted_devices() for value in chain(valuelist): for disk in set(chain(self.select( diff --git a/pym/install/variables/disk.py b/pym/install/variables/disk.py index 04f4a68..18fcb06 100644 --- a/pym/install/variables/disk.py +++ b/pym/install/variables/disk.py @@ -35,7 +35,7 @@ from calculate.lib.utils.device import (getPartitionSize, from calculate.install.variables.autopartition import Sizes from calculate.lib.utils.files import getProgPath from calculate.lib.utils.mount import isMount, FStab, DiskSpace, Btrfs, \ - BtrfsError + BtrfsError, try_umount from calculate.install.fs_manager import FileSystemManager from calculate.lib.cl_lang import setLocalTranslate, _ @@ -1418,6 +1418,9 @@ class VariableOsLocationPerformFormat(LocationHelper, Variable): fixNtfs = lambda self, x: {'ntfs-3g': 'ntfs'}.get(x, x) + def is_force_param(self): + return "--force" in self.Get("cl_console_args") + def check(self, value): """Check perform format @@ -1453,9 +1456,10 @@ class VariableOsLocationPerformFormat(LocationHelper, Variable): "mounted to {mountpoint} on the current system").format( device=dev, mountpoint=diskMount.get(dev, ''))) if isMount(dev): - raise VariableError( - _("Please unmount {device}, as it will be used for " - "installation").format(device=dev)) + if not self.is_force_param() or not try_umount(dev): + raise VariableError( + _("Please unmount {device}, as it will be used for " + "installation").format(device=dev)) # but user select non-format if not self.isTrue(isformat): raise VariableError( @@ -1479,9 +1483,10 @@ class VariableOsLocationPerformFormat(LocationHelper, Variable): ).format( device=dev, mountpoint=diskMount.get(dev, ''))) elif isMount(dev): - raise VariableError( - _("Please unmount disk {device} to " - "use it for install").format(device=dev)) + if not self.is_force_param() or not try_umount(dev): + raise VariableError( + _("Please unmount disk {device} to " + "use it for install").format(device=dev)) def defaultPerformFormat(self): diskFormat = dict(zip(self.Get('os_disk_dev'), @@ -2036,6 +2041,9 @@ class VariableOsInstallUefi(LocationHelper, Variable): def install_to_flash(self): return self.Get('os_install_root_type') == 'flash' + def is_force_param(self): + return "--force" in self.Get("cl_console_args") + def get(self): # если используется авторазметка список разделов находится в ней if self.GetBool('cl_autopartition_set'): @@ -2117,9 +2125,11 @@ class VariableOsInstallUefi(LocationHelper, Variable): os_disk_format__ne="vfat") for efipart in value: if efipart in not_fat_efi and isMount(efipart): - raise VariableError( - _("Please unmount {device}, as it will be used for " - "installation").format(device=efipart)) + + if not self.is_force_param() or not try_umount(efipart): + raise VariableError( + _("Please unmount {device}, as it will be used for " + "installation").format(device=efipart)) for efipart in value: if efipart in self.select('os_location_source',