consolidate mountpoint validation a bit

This commit is contained in:
Michael Hudson-Doyle 2017-03-06 14:59:05 +13:00
parent 28be40c579
commit 66c1d94a4b
6 changed files with 37 additions and 56 deletions

View File

@ -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

View File

@ -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)

View File

@ -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):

View File

@ -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):

View File

@ -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()

View File

@ -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)