Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make safe_device_name device type specific #878

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 21 additions & 7 deletions blivet/blivet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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'",
Expand Down Expand Up @@ -887,18 +888,31 @@ 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
the other various device types, so I'm going to pick a number so
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)
Expand Down
5 changes: 3 additions & 2 deletions blivet/devicefactory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'",
Expand Down Expand Up @@ -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'",
Expand Down
3 changes: 3 additions & 0 deletions blivet/devicelibs/btrfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions blivet/devicelibs/lvm.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions blivet/devicelibs/mdraid.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):

Expand Down