From 83c22280f4db292bb6d79fd44a015610513ff4b7 Mon Sep 17 00:00:00 2001 From: Vojtech Trefny Date: Mon, 20 Jul 2020 14:19:43 +0200 Subject: [PATCH] Make safe_device_name device type specific This allows us to have a different safe device names for different device types and for example allow characters like "@" and "/" for btrfs only. --- blivet/blivet.py | 28 +++++++++++++++++++++------- blivet/devicefactory.py | 5 +++-- blivet/devicelibs/btrfs.py | 3 +++ blivet/devicelibs/lvm.py | 2 ++ blivet/devicelibs/mdraid.py | 2 ++ 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/blivet/blivet.py b/blivet/blivet.py index e7dbd37b4..82a378c11 100644 --- a/blivet/blivet.py +++ b/blivet/blivet.py @@ -46,6 +46,7 @@ from . import arch from . import devicefactory from . import __version__ +from . import devicelibs from .threads import SynchronizedMeta from .static_data import luks_data @@ -514,7 +515,7 @@ def new_mdarray(self, *args, **kwargs): name = kwargs.pop("name", None) if name: - safe_name = self.safe_device_name(name) + safe_name = self.safe_device_name(name, devicefactory.DEVICE_TYPE_MD) if safe_name != name: log.warning("using '%s' instead of specified name '%s'", safe_name, name) @@ -547,7 +548,7 @@ def new_vg(self, *args, **kwargs): name = kwargs.pop("name", None) if name: - safe_name = self.safe_device_name(name) + safe_name = self.safe_device_name(name, devicefactory.DEVICE_TYPE_LVM) if safe_name != name: log.warning("using '%s' instead of specified name '%s'", safe_name, name) @@ -610,9 +611,9 @@ def new_lv(self, *args, **kwargs): name = kwargs.pop("name", None) if name: # make sure the specified name is sensible - safe_vg_name = self.safe_device_name(vg.name) + safe_vg_name = self.safe_device_name(vg.name, devicefactory.DEVICE_TYPE_LVM) full_name = "%s-%s" % (safe_vg_name, name) - safe_name = self.safe_device_name(full_name) + safe_name = self.safe_device_name(full_name, devicefactory.DEVICE_TYPE_LVM) if safe_name != full_name: new_name = safe_name[len(safe_vg_name) + 1:] log.warning("using '%s' instead of specified name '%s'", @@ -887,7 +888,7 @@ def resize_device(self, device, new_size): for action in actions: self.devicetree.actions.add(action) - def safe_device_name(self, name): + def safe_device_name(self, name, device_type=None): """ Convert a device name to something safe and return that. LVM limits lv names to 128 characters. I don't know the limits for @@ -895,10 +896,23 @@ def safe_device_name(self, name): that we don't have to have an entire library to determine device name limits. """ + + if device_type in (devicefactory.DEVICE_TYPE_LVM, devicefactory.DEVICE_TYPE_LVM_THINP): + allowed = devicelibs.lvm.safe_name_characters + elif device_type == devicefactory.DEVICE_TYPE_MD: + allowed = devicelibs.mdraid.safe_name_characters + elif device_type == devicefactory.DEVICE_TYPE_BTRFS: + allowed = devicelibs.btrfs.safe_name_characters + else: + allowed = "0-9a-zA-Z._-" + max_len = 96 # No, you don't need longer names than this. Really. tmp = name.strip() - tmp = tmp.replace("/", "_") - tmp = re.sub("[^0-9a-zA-Z._-]", "", tmp) + + if "/" not in allowed: + tmp = tmp.replace("/", "_") + + tmp = re.sub("[^%s]" % allowed, "", tmp) # Remove any '-' or '_' prefixes tmp = re.sub("^[-_]*", "", tmp) diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py index 9214ad546..30f003e62 100644 --- a/blivet/devicefactory.py +++ b/blivet/devicefactory.py @@ -847,7 +847,8 @@ def _set_name(self): swap=(self.fstype == "swap"), mountpoint=self.mountpoint) - safe_new_name = self.storage.safe_device_name(self.device_name) + safe_new_name = self.storage.safe_device_name(self.device_name, + get_device_type(self.device)) if self.device.name != safe_new_name: if not safe_new_name: log.error("not renaming '%s' to invalid name '%s'", @@ -1468,7 +1469,7 @@ def _set_name(self): mountpoint=self.mountpoint) lvname = "%s-%s" % (self.vg.name, self.device_name) - safe_new_name = self.storage.safe_device_name(lvname) + safe_new_name = self.storage.safe_device_name(lvname, DEVICE_TYPE_LVM) if self.device.name != safe_new_name: if safe_new_name in self.storage.names: log.error("not renaming '%s' to in-use name '%s'", diff --git a/blivet/devicelibs/btrfs.py b/blivet/devicelibs/btrfs.py index b70dae286..8ef989675 100644 --- a/blivet/devicelibs/btrfs.py +++ b/blivet/devicelibs/btrfs.py @@ -40,5 +40,8 @@ EXTERNAL_DEPENDENCIES = [availability.BLOCKDEV_BTRFS_PLUGIN] +safe_name_characters = "0-9a-zA-Z._@/-" + + def is_btrfs_name_valid(name): return '\x00' not in name diff --git a/blivet/devicelibs/lvm.py b/blivet/devicelibs/lvm.py index 5cb60b859..d56a76edc 100644 --- a/blivet/devicelibs/lvm.py +++ b/blivet/devicelibs/lvm.py @@ -63,6 +63,8 @@ LVMETAD_SOCKET_PATH = "/run/lvm/lvmetad.socket" +safe_name_characters = "0-9a-zA-Z._-" + # Start config_args handling code # # Theoretically we can handle all that can be handled with the LVM --config diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py index 8b16105ba..3b60c87c4 100644 --- a/blivet/devicelibs/mdraid.py +++ b/blivet/devicelibs/mdraid.py @@ -31,6 +31,8 @@ MD_SUPERBLOCK_SIZE = Size("2 MiB") MD_CHUNK_SIZE = Size("512 KiB") +safe_name_characters = "0-9a-zA-Z._-" + class MDRaidLevels(raid.RAIDLevels):