consolidate mountpoint validation a bit
This commit is contained in:
parent
28be40c579
commit
66c1d94a4b
|
@ -501,47 +501,14 @@ class FilesystemModel(object):
|
|||
def get_tag(self, device):
|
||||
return self.tags.get(device, '')
|
||||
|
||||
def valid_mount(self, format_spec):
|
||||
""" format spec
|
||||
|
||||
{
|
||||
'fstype' Str(ext4|btrfs..,
|
||||
'mountpoint': Str
|
||||
}
|
||||
"""
|
||||
log.debug('valid_mount: spec: {}'.format(format_spec))
|
||||
# if user is not formatting, ignore mountpoint
|
||||
fmt = format_spec.get('fstype')
|
||||
if fmt in ['leave unformatted']:
|
||||
format_spec['mountpoint'] = None
|
||||
return True
|
||||
|
||||
mountpoint = format_spec.get('mountpoint')
|
||||
if not mountpoint:
|
||||
raise ValueError('Is None')
|
||||
|
||||
# If the value is in error state, return the
|
||||
# the same error
|
||||
err_prefix = 'error: '
|
||||
if mountpoint.lower().startswith(err_prefix):
|
||||
mountpoint = mountpoint[len(err_prefix):]
|
||||
raise ValueError(mountpoint)
|
||||
|
||||
if not mountpoint.startswith('/'):
|
||||
raise ValueError('Does not start with /')
|
||||
|
||||
# remove redundent // and ..
|
||||
mountpoint = os.path.realpath(mountpoint)
|
||||
|
||||
def validate_mount(self, mountpoint):
|
||||
# /usr/include/linux/limits.h:PATH_MAX
|
||||
if len(mountpoint) > 4095:
|
||||
raise ValueError('Path exceeds PATH_MAX')
|
||||
|
||||
all_mounts = self.get_mounts()
|
||||
if mountpoint in all_mounts:
|
||||
raise ValueError('Already mounted')
|
||||
|
||||
return True
|
||||
return 'Path exceeds PATH_MAX'
|
||||
mnts = self.get_mounts2()
|
||||
dev = mnts.get(mountpoint)
|
||||
if dev is not None:
|
||||
return "%s is already mounted at %s"%(dev, mountpoint)
|
||||
|
||||
def get_empty_disks(self):
|
||||
''' empty disk is one that does not have any
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
|
||||
import os
|
||||
import re
|
||||
|
||||
from urwid import connect_signal, Padding, Pile, WidgetWrap
|
||||
|
||||
from subiquitycore.ui.form import FormField
|
||||
from subiquitycore.ui.interactive import Selector, StringEditor
|
||||
|
||||
common_mountpoints = [
|
||||
|
@ -66,3 +68,14 @@ class MountSelector(WidgetWrap):
|
|||
return self._other.value
|
||||
else:
|
||||
return self._selector.value
|
||||
|
||||
|
||||
class MountField(FormField):
|
||||
|
||||
def _make_widget(self, form):
|
||||
return MountSelector(form.model)
|
||||
|
||||
def clean(self, value):
|
||||
if not value.startswith('/'):
|
||||
raise ValueError('Does not start with /')
|
||||
return os.path.realpath(value)
|
||||
|
|
|
@ -21,11 +21,13 @@ from subiquitycore.ui.container import ListBox
|
|||
from subiquitycore.ui.form import Form
|
||||
from subiquitycore.view import BaseView
|
||||
|
||||
from subiquity.ui.views.filesystem.add_partition import FSTypeField, MountField
|
||||
from subiquity.ui.mount import MountField
|
||||
from subiquity.ui.views.filesystem.add_partition import FSTypeField
|
||||
|
||||
|
||||
log = logging.getLogger('subiquity.ui.filesystem.add_format')
|
||||
|
||||
|
||||
class AddFormatForm(Form):
|
||||
|
||||
def __init__(self, model):
|
||||
|
@ -36,10 +38,7 @@ class AddFormatForm(Form):
|
|||
mount = MountField("Mount")
|
||||
|
||||
def validate_mount(self):
|
||||
mnts = self.model.get_mounts2()
|
||||
dev = mnts.get(self.mount.value)
|
||||
if dev is not None:
|
||||
return "%s is already mounted at %s"%(dev, self.mount.value)
|
||||
return self.model.validate_mount(self.mount.value)
|
||||
|
||||
|
||||
class AddFormatView(BaseView):
|
||||
|
|
|
@ -20,6 +20,7 @@ configuration.
|
|||
|
||||
"""
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
from urwid import connect_signal, Text
|
||||
|
||||
|
@ -40,7 +41,7 @@ from subiquity.models.filesystem import (
|
|||
_dehumanize_size,
|
||||
HUMAN_UNITS,
|
||||
)
|
||||
from subiquity.ui.mount import MountSelector
|
||||
from subiquity.ui.mount import MountField
|
||||
|
||||
|
||||
log = logging.getLogger('subiquity.ui.filesystem.add_partition')
|
||||
|
@ -51,11 +52,6 @@ class FSTypeField(FormField):
|
|||
return Selector(opts=form.model.supported_filesystems)
|
||||
|
||||
|
||||
class MountField(FormField):
|
||||
def _make_widget(self, form):
|
||||
return MountSelector(form.model)
|
||||
|
||||
|
||||
class AddPartitionForm(Form):
|
||||
|
||||
def __init__(self, model, disk_obj):
|
||||
|
@ -90,10 +86,7 @@ class AddPartitionForm(Form):
|
|||
self.size.show_extra(Color.info_minor(Text("Capped partition size at %s"%(self.size_str,), align="center")))
|
||||
|
||||
def validate_mount(self):
|
||||
mnts = self.model.get_mounts2()
|
||||
dev = mnts.get(self.mount.value)
|
||||
if dev is not None:
|
||||
return "%s is already mounted at %s"%(dev, self.mount.value)
|
||||
return self.model.validate_mount(self.mount.value)
|
||||
|
||||
|
||||
class AddPartitionView(BaseView):
|
||||
|
|
|
@ -90,6 +90,7 @@ class Application:
|
|||
if self.controller_index >= len(self.controllers):
|
||||
self.exit()
|
||||
controller_name = self.controllers[self.controller_index]
|
||||
log.debug("moving to screen %s", controller_name)
|
||||
next_controller = self.common['controllers'][controller_name]
|
||||
next_controller.default()
|
||||
|
||||
|
|
|
@ -77,6 +77,15 @@ class FormField(object):
|
|||
widget = self._make_widget(form)
|
||||
return BoundFormField(self, form, widget)
|
||||
|
||||
def clean(self, value):
|
||||
if self.cleaner is not None:
|
||||
return self.cleaner(value)
|
||||
else:
|
||||
return value
|
||||
|
||||
def validate(self, value):
|
||||
pass
|
||||
|
||||
|
||||
class BoundFormField(object):
|
||||
|
||||
|
@ -92,8 +101,7 @@ class BoundFormField(object):
|
|||
self.widget = widget
|
||||
|
||||
def clean(self, value):
|
||||
if self.field.cleaner is not None:
|
||||
value = self.field.cleaner(value)
|
||||
value = self.field.clean(value)
|
||||
cleaner = getattr(self.form, "clean_" + self.field.name, None)
|
||||
if cleaner is not None:
|
||||
value = cleaner(value)
|
||||
|
|
Loading…
Reference in New Issue