Merge branch 'master' into mwhudson/curtin-logging
This commit is contained in:
commit
d27367465f
|
@ -89,6 +89,8 @@ The {keytype} host key fingerprints is:
|
||||||
|
|
||||||
def host_key_info():
|
def host_key_info():
|
||||||
fingerprints = host_key_fingerprints()
|
fingerprints = host_key_fingerprints()
|
||||||
|
if len(fingerprints) == 0:
|
||||||
|
return []
|
||||||
if len(fingerprints) == 1:
|
if len(fingerprints) == 1:
|
||||||
[(keytype, fingerprint)] = fingerprints
|
[(keytype, fingerprint)] = fingerprints
|
||||||
return single_host_key_tmpl.format(keytype=keytype, fingerprint=fingerprint)
|
return single_host_key_tmpl.format(keytype=keytype, fingerprint=fingerprint)
|
||||||
|
|
|
@ -100,7 +100,7 @@ class IdentityView(BaseView):
|
||||||
]
|
]
|
||||||
return Pile(buttons)
|
return Pile(buttons)
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.cancel()
|
self.controller.cancel()
|
||||||
|
|
||||||
def done(self, button):
|
def done(self, button):
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
name: subiquity
|
||||||
|
version: "0.0.35"
|
||||||
|
summary: Ubuntu installer
|
||||||
|
description: The Ubuntu server installer
|
||||||
|
confinement: classic
|
||||||
|
|
||||||
|
apps:
|
||||||
|
subiquity:
|
||||||
|
command: usr/bin/subiquity
|
||||||
|
console-conf:
|
||||||
|
command: usr/bin/console-conf
|
||||||
|
probert:
|
||||||
|
command: bin/probert
|
||||||
|
|
||||||
|
parts:
|
||||||
|
subiquity:
|
||||||
|
plugin: python
|
||||||
|
build-packages: [python-setuptools]
|
||||||
|
stage-packages: [curtin]
|
||||||
|
python-packages:
|
||||||
|
- urwid
|
||||||
|
- pyyaml
|
||||||
|
- pyudev
|
||||||
|
- attrs
|
||||||
|
source: https://github.com/CanonicalLtd/subiquity.git
|
||||||
|
source-branch: cyphermox/snap
|
||||||
|
source-type: git
|
||||||
|
wrappers:
|
||||||
|
plugin: dump
|
||||||
|
source: https://github.com/CanonicalLtd/subiquity.git
|
||||||
|
source-type: git
|
||||||
|
organize:
|
||||||
|
'bin/console-conf-tui': usr/bin/console-conf
|
||||||
|
'bin/subiquity-tui': usr/bin/subiquity
|
||||||
|
snap:
|
||||||
|
- usr/bin
|
||||||
|
probert:
|
||||||
|
plugin: python
|
||||||
|
build-packages: [python-setuptools, libnl-3-dev, libnl-genl-3-dev, libnl-route-3-dev]
|
||||||
|
source: https://github.com/CanonicalLtd/probert.git
|
||||||
|
source-type: git
|
|
@ -16,7 +16,7 @@
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from subiquitycore.controller import BaseController, view
|
from subiquitycore.controller import BaseController
|
||||||
from subiquitycore.ui.dummy import DummyView
|
from subiquitycore.ui.dummy import DummyView
|
||||||
from subiquitycore.ui.error import ErrorView
|
from subiquitycore.ui.error import ErrorView
|
||||||
|
|
||||||
|
@ -48,7 +48,6 @@ class FilesystemController(BaseController):
|
||||||
self.raid_model = RaidModel()
|
self.raid_model = RaidModel()
|
||||||
self.model.probe() # probe before we complete
|
self.model.probe() # probe before we complete
|
||||||
|
|
||||||
@view
|
|
||||||
def default(self, reset=False):
|
def default(self, reset=False):
|
||||||
# FIXME: Is this the best way to zero out this list for a reset?
|
# FIXME: Is this the best way to zero out this list for a reset?
|
||||||
if reset:
|
if reset:
|
||||||
|
@ -64,7 +63,6 @@ class FilesystemController(BaseController):
|
||||||
def reset(self):
|
def reset(self):
|
||||||
log.info("Resetting Filesystem model")
|
log.info("Resetting Filesystem model")
|
||||||
self.model.reset()
|
self.model.reset()
|
||||||
self.view_stack = []
|
|
||||||
self.default()
|
self.default()
|
||||||
|
|
||||||
def cancel(self):
|
def cancel(self):
|
||||||
|
@ -113,7 +111,6 @@ class FilesystemController(BaseController):
|
||||||
self.signal.emit_signal('next-screen')
|
self.signal.emit_signal('next-screen')
|
||||||
|
|
||||||
# Filesystem/Disk partition -----------------------------------------------
|
# Filesystem/Disk partition -----------------------------------------------
|
||||||
@view
|
|
||||||
def partition_disk(self, disk):
|
def partition_disk(self, disk):
|
||||||
log.debug("In disk partition view, using {} as the disk.".format(disk.path))
|
log.debug("In disk partition view, using {} as the disk.".format(disk.path))
|
||||||
title = ("Partition, format, and mount {}".format(disk.path))
|
title = ("Partition, format, and mount {}".format(disk.path))
|
||||||
|
@ -125,7 +122,6 @@ class FilesystemController(BaseController):
|
||||||
|
|
||||||
self.ui.set_body(dp_view)
|
self.ui.set_body(dp_view)
|
||||||
|
|
||||||
@view
|
|
||||||
def add_disk_partition(self, disk):
|
def add_disk_partition(self, disk):
|
||||||
log.debug("Adding partition to {}".format(disk))
|
log.debug("Adding partition to {}".format(disk))
|
||||||
footer = ("Select whole disk, or partition, to format and mount.")
|
footer = ("Select whole disk, or partition, to format and mount.")
|
||||||
|
@ -166,9 +162,9 @@ class FilesystemController(BaseController):
|
||||||
self.model.add_mount(fs, spec['mountpoint'])
|
self.model.add_mount(fs, spec['mountpoint'])
|
||||||
|
|
||||||
log.info("Successfully added partition")
|
log.info("Successfully added partition")
|
||||||
self.prev_view()
|
self.partition_disk(disk)
|
||||||
|
|
||||||
def add_format_handler(self, volume, spec):
|
def add_format_handler(self, volume, spec, back):
|
||||||
log.debug('add_format_handler')
|
log.debug('add_format_handler')
|
||||||
if spec['fstype'] is not None:
|
if spec['fstype'] is not None:
|
||||||
fs = self.model.add_filesystem(volume, spec['fstype'])
|
fs = self.model.add_filesystem(volume, spec['fstype'])
|
||||||
|
@ -178,7 +174,7 @@ class FilesystemController(BaseController):
|
||||||
if fs is None:
|
if fs is None:
|
||||||
raise Exception("{} is not formatted".format(volume.path))
|
raise Exception("{} is not formatted".format(volume.path))
|
||||||
self.model.add_mount(fs, spec['mountpoint'])
|
self.model.add_mount(fs, spec['mountpoint'])
|
||||||
self.prev_view()
|
back()
|
||||||
|
|
||||||
def connect_iscsi_disk(self, *args, **kwargs):
|
def connect_iscsi_disk(self, *args, **kwargs):
|
||||||
# title = ("Disk and filesystem setup")
|
# title = ("Disk and filesystem setup")
|
||||||
|
@ -199,7 +195,6 @@ class FilesystemController(BaseController):
|
||||||
# self.signal))
|
# self.signal))
|
||||||
self.ui.set_body(DummyView(self.signal))
|
self.ui.set_body(DummyView(self.signal))
|
||||||
|
|
||||||
@view
|
|
||||||
def create_volume_group(self, *args, **kwargs):
|
def create_volume_group(self, *args, **kwargs):
|
||||||
title = ("Create Logical Volume Group (\"LVM2\") disk")
|
title = ("Create Logical Volume Group (\"LVM2\") disk")
|
||||||
footer = ("ENTER on a disk will show detailed "
|
footer = ("ENTER on a disk will show detailed "
|
||||||
|
@ -210,7 +205,6 @@ class FilesystemController(BaseController):
|
||||||
self.ui.set_footer(footer)
|
self.ui.set_footer(footer)
|
||||||
self.ui.set_body(LVMVolumeGroupView(self.model, self.signal))
|
self.ui.set_body(LVMVolumeGroupView(self.model, self.signal))
|
||||||
|
|
||||||
@view
|
|
||||||
def create_raid(self, *args, **kwargs):
|
def create_raid(self, *args, **kwargs):
|
||||||
title = ("Create software RAID (\"MD\") disk")
|
title = ("Create software RAID (\"MD\") disk")
|
||||||
footer = ("ENTER on a disk will show detailed "
|
footer = ("ENTER on a disk will show detailed "
|
||||||
|
@ -224,7 +218,6 @@ class FilesystemController(BaseController):
|
||||||
self.ui.set_body(RaidView(self.model,
|
self.ui.set_body(RaidView(self.model,
|
||||||
self.signal))
|
self.signal))
|
||||||
|
|
||||||
@view
|
|
||||||
def create_bcache(self, *args, **kwargs):
|
def create_bcache(self, *args, **kwargs):
|
||||||
title = ("Create hierarchical storage (\"bcache\") disk")
|
title = ("Create hierarchical storage (\"bcache\") disk")
|
||||||
footer = ("ENTER on a disk will show detailed "
|
footer = ("ENTER on a disk will show detailed "
|
||||||
|
@ -242,17 +235,15 @@ class FilesystemController(BaseController):
|
||||||
self.model.add_raid_device(result)
|
self.model.add_raid_device(result)
|
||||||
self.signal.prev_signal()
|
self.signal.prev_signal()
|
||||||
|
|
||||||
@view
|
|
||||||
def format_entire(self, disk):
|
def format_entire(self, disk):
|
||||||
log.debug("format_entire {}".format(disk))
|
log.debug("format_entire {}".format(disk))
|
||||||
header = ("Format and/or mount {}".format(disk.path))
|
header = ("Format and/or mount {}".format(disk.path))
|
||||||
footer = ("Format or mount whole disk.")
|
footer = ("Format or mount whole disk.")
|
||||||
self.ui.set_header(header)
|
self.ui.set_header(header)
|
||||||
self.ui.set_footer(footer)
|
self.ui.set_footer(footer)
|
||||||
afv_view = AddFormatView(self.model, self, disk)
|
afv_view = AddFormatView(self.model, self, disk, lambda : self.partition_disk(disk))
|
||||||
self.ui.set_body(afv_view)
|
self.ui.set_body(afv_view)
|
||||||
|
|
||||||
@view
|
|
||||||
def format_mount_partition(self, partition):
|
def format_mount_partition(self, partition):
|
||||||
log.debug("format_entire {}".format(partition))
|
log.debug("format_entire {}".format(partition))
|
||||||
if partition.fs() is not None:
|
if partition.fs() is not None:
|
||||||
|
@ -263,7 +254,7 @@ class FilesystemController(BaseController):
|
||||||
footer = ("Format and mount partition.")
|
footer = ("Format and mount partition.")
|
||||||
self.ui.set_header(header)
|
self.ui.set_header(header)
|
||||||
self.ui.set_footer(footer)
|
self.ui.set_footer(footer)
|
||||||
afv_view = AddFormatView(self.model, self, partition)
|
afv_view = AddFormatView(self.model, self, partition, self.default)
|
||||||
self.ui.set_body(afv_view)
|
self.ui.set_body(afv_view)
|
||||||
|
|
||||||
def show_disk_information_next(self, disk):
|
def show_disk_information_next(self, disk):
|
||||||
|
|
|
@ -24,7 +24,7 @@ log = logging.getLogger("subiquity.curtin")
|
||||||
|
|
||||||
TMPDIR = '/tmp'
|
TMPDIR = '/tmp'
|
||||||
CURTIN_SEARCH_PATH = ['/usr/local/curtin/bin', '/usr/bin']
|
CURTIN_SEARCH_PATH = ['/usr/local/curtin/bin', '/usr/bin']
|
||||||
CURTIN_INSTALL_PATH = ['/media/root-ro', '/']
|
CURTIN_INSTALL_PATH = ['/media/root-ro', '/rofs', '/']
|
||||||
CURTIN_INSTALL_LOG = '/tmp/subiquity-curtin-install.log'
|
CURTIN_INSTALL_LOG = '/tmp/subiquity-curtin-install.log'
|
||||||
CURTIN_POSTINSTALL_LOG = '/tmp/subiquity-curtin-postinstall.log'
|
CURTIN_POSTINSTALL_LOG = '/tmp/subiquity-curtin-postinstall.log'
|
||||||
CONF_PREFIX = os.path.join(TMPDIR, 'subiquity-config-')
|
CONF_PREFIX = os.path.join(TMPDIR, 'subiquity-config-')
|
||||||
|
@ -59,12 +59,16 @@ POST_INSTALL_CONFIG = {
|
||||||
'write_files': {
|
'write_files': {
|
||||||
'postinst_metadata': {
|
'postinst_metadata': {
|
||||||
'path': 'var/lib/cloud/seed/nocloud-net/meta-data',
|
'path': 'var/lib/cloud/seed/nocloud-net/meta-data',
|
||||||
'content': 'instance-id: inst-3011',
|
'content': 'instance-id: inst-3011\n',
|
||||||
},
|
},
|
||||||
'postinst_userdata': {
|
'postinst_userdata': {
|
||||||
'path': 'var/lib/cloud/seed/nocloud-net/user-data',
|
'path': 'var/lib/cloud/seed/nocloud-net/user-data',
|
||||||
# 'content' gets filled in later
|
# 'content' gets filled in later
|
||||||
},
|
},
|
||||||
|
'postinst_enable_cloudinit': {
|
||||||
|
'path': 'etc/cloud/ds-identify.cfg',
|
||||||
|
'content': 'policy: enabled\n',
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,10 +46,11 @@ class AddFormatForm(Form):
|
||||||
|
|
||||||
|
|
||||||
class AddFormatView(BaseView):
|
class AddFormatView(BaseView):
|
||||||
def __init__(self, model, controller, volume):
|
def __init__(self, model, controller, volume, back):
|
||||||
self.model = model
|
self.model = model
|
||||||
self.controller = controller
|
self.controller = controller
|
||||||
self.volume = volume
|
self.volume = volume
|
||||||
|
self.back = back
|
||||||
|
|
||||||
self.form = AddFormatForm(model)
|
self.form = AddFormatForm(model)
|
||||||
if self.volume.fs() is not None:
|
if self.volume.fs() is not None:
|
||||||
|
@ -71,8 +72,8 @@ class AddFormatView(BaseView):
|
||||||
format_box = Padding.center_50(ListBox(body))
|
format_box = Padding.center_50(ListBox(body))
|
||||||
super().__init__(format_box)
|
super().__init__(format_box)
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.prev_view()
|
self.back()
|
||||||
|
|
||||||
def done(self, result):
|
def done(self, result):
|
||||||
""" format spec
|
""" format spec
|
||||||
|
@ -97,4 +98,4 @@ class AddFormatView(BaseView):
|
||||||
result['fstype'] = None
|
result['fstype'] = None
|
||||||
|
|
||||||
log.debug("Add Format Result: {}".format(result))
|
log.debug("Add Format Result: {}".format(result))
|
||||||
self.controller.add_format_handler(self.volume, result)
|
self.controller.add_format_handler(self.volume, result, self.back)
|
||||||
|
|
|
@ -20,11 +20,9 @@ configuration.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
import os
|
|
||||||
import re
|
|
||||||
from urwid import connect_signal, Text
|
from urwid import connect_signal, Text
|
||||||
|
|
||||||
from subiquitycore.ui.container import Columns, ListBox
|
from subiquitycore.ui.container import ListBox
|
||||||
from subiquitycore.ui.form import (
|
from subiquitycore.ui.form import (
|
||||||
Form,
|
Form,
|
||||||
FormField,
|
FormField,
|
||||||
|
@ -114,8 +112,8 @@ class AddPartitionView(BaseView):
|
||||||
partition_box = Padding.center_50(ListBox(body))
|
partition_box = Padding.center_50(ListBox(body))
|
||||||
super().__init__(partition_box)
|
super().__init__(partition_box)
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.prev_view()
|
self.controller.partition_disk(self.disk)
|
||||||
|
|
||||||
def done(self, result):
|
def done(self, result):
|
||||||
|
|
||||||
|
|
|
@ -63,5 +63,5 @@ class DiskInfoView(BaseView):
|
||||||
''' Return to FilesystemView '''
|
''' Return to FilesystemView '''
|
||||||
self.controller.partition_disk(self.disk)
|
self.controller.partition_disk(self.disk)
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.partition_disk(self.disk)
|
self.controller.partition_disk(self.disk)
|
||||||
|
|
|
@ -150,7 +150,7 @@ class DiskPartitionView(BaseView):
|
||||||
|
|
||||||
def done(self, result):
|
def done(self, result):
|
||||||
''' Return to FilesystemView '''
|
''' Return to FilesystemView '''
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
|
@ -203,7 +203,7 @@ class FilesystemView(BaseView):
|
||||||
user_data=sig)))
|
user_data=sig)))
|
||||||
return Pile(opts)
|
return Pile(opts)
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.cancel()
|
self.controller.cancel()
|
||||||
|
|
||||||
def reset(self, button):
|
def reset(self, button):
|
||||||
|
|
|
@ -102,14 +102,13 @@ class IdentityView(BaseView):
|
||||||
|
|
||||||
self.form = IdentityForm()
|
self.form = IdentityForm()
|
||||||
connect_signal(self.form, 'submit', self.done)
|
connect_signal(self.form, 'submit', self.done)
|
||||||
connect_signal(self.form, 'cancel', self.cancel)
|
|
||||||
|
|
||||||
self.ssh_import_confirmed = True
|
self.ssh_import_confirmed = True
|
||||||
|
|
||||||
body = [
|
body = [
|
||||||
Padding.center_90(self.form.as_rows(self)),
|
Padding.center_90(self.form.as_rows(self)),
|
||||||
Padding.line_break(""),
|
Padding.line_break(""),
|
||||||
Padding.fixed_10(self.form.buttons),
|
Padding.fixed_10(self.form.buttons[0]),
|
||||||
]
|
]
|
||||||
super().__init__(ListBox(body))
|
super().__init__(ListBox(body))
|
||||||
|
|
||||||
|
@ -136,6 +135,3 @@ class IdentityView(BaseView):
|
||||||
|
|
||||||
log.debug("User input: {}".format(result))
|
log.debug("User input: {}".format(result))
|
||||||
self.controller.create_user(result)
|
self.controller.create_user(result)
|
||||||
|
|
||||||
def cancel(self, button):
|
|
||||||
self.controller.cancel()
|
|
||||||
|
|
|
@ -63,5 +63,5 @@ class InstallpathView(BaseView):
|
||||||
def confirm(self, result, sig):
|
def confirm(self, result, sig):
|
||||||
self.signal.emit_signal(sig)
|
self.signal.emit_signal(sig)
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.signal.emit_signal('prev-screen')
|
self.signal.emit_signal('prev-screen')
|
||||||
|
|
|
@ -20,14 +20,6 @@ import os
|
||||||
|
|
||||||
log = logging.getLogger("subiquitycore.controller")
|
log = logging.getLogger("subiquitycore.controller")
|
||||||
|
|
||||||
def view(func):
|
|
||||||
n = func.__name__
|
|
||||||
def f(self, *args, **kw):
|
|
||||||
m = getattr(self, n)
|
|
||||||
self.view_stack.append((m, args, kw))
|
|
||||||
return func(self, *args, **kw)
|
|
||||||
return f
|
|
||||||
|
|
||||||
|
|
||||||
class BaseController(ABC):
|
class BaseController(ABC):
|
||||||
"""Base class for controllers."""
|
"""Base class for controllers."""
|
||||||
|
@ -42,7 +34,6 @@ class BaseController(ABC):
|
||||||
self.prober = common['prober']
|
self.prober = common['prober']
|
||||||
self.controllers = common['controllers']
|
self.controllers = common['controllers']
|
||||||
self.pool = common['pool']
|
self.pool = common['pool']
|
||||||
self.view_stack = []
|
|
||||||
|
|
||||||
def register_signals(self):
|
def register_signals(self):
|
||||||
"""Defines signals associated with controller from model."""
|
"""Defines signals associated with controller from model."""
|
||||||
|
@ -51,11 +42,6 @@ class BaseController(ABC):
|
||||||
signals.append((sig, getattr(self, cb)))
|
signals.append((sig, getattr(self, cb)))
|
||||||
self.signal.connect_signals(signals)
|
self.signal.connect_signals(signals)
|
||||||
|
|
||||||
def prev_view(self):
|
|
||||||
self.view_stack.pop()
|
|
||||||
meth, args, kw = self.view_stack.pop()
|
|
||||||
meth(*args, **kw)
|
|
||||||
|
|
||||||
def run_in_bg(self, func, callback):
|
def run_in_bg(self, func, callback):
|
||||||
"""Run func() in a thread and call callback on UI thread.
|
"""Run func() in a thread and call callback on UI thread.
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ from subiquitycore.ui.views import (NetworkView,
|
||||||
NetworkConfigureWLANView)
|
NetworkConfigureWLANView)
|
||||||
from subiquitycore.ui.views.network import ApplyingConfigWidget
|
from subiquitycore.ui.views.network import ApplyingConfigWidget
|
||||||
from subiquitycore.ui.dummy import DummyView
|
from subiquitycore.ui.dummy import DummyView
|
||||||
from subiquitycore.controller import BaseController, view
|
from subiquitycore.controller import BaseController
|
||||||
from subiquitycore.utils import run_command_start, run_command_summarize
|
from subiquitycore.utils import run_command_start, run_command_summarize
|
||||||
|
|
||||||
log = logging.getLogger("subiquitycore.controller.network")
|
log = logging.getLogger("subiquitycore.controller.network")
|
||||||
|
@ -341,17 +341,9 @@ class NetworkController(BaseController):
|
||||||
self.observer.wlan_listener.trigger_scan(dev.ifindex)
|
self.observer.wlan_listener.trigger_scan(dev.ifindex)
|
||||||
|
|
||||||
def cancel(self):
|
def cancel(self):
|
||||||
if len(self.view_stack) <= 1:
|
self.signal.emit_signal('prev-screen')
|
||||||
self.signal.emit_signal('prev-screen')
|
|
||||||
else:
|
|
||||||
self.prev_view()
|
|
||||||
|
|
||||||
def default(self):
|
def default(self):
|
||||||
self.view_stack = []
|
|
||||||
self.start()
|
|
||||||
|
|
||||||
@view
|
|
||||||
def start(self):
|
|
||||||
title = "Network connections"
|
title = "Network connections"
|
||||||
excerpt = ("Configure at least one interface this server can use to talk to "
|
excerpt = ("Configure at least one interface this server can use to talk to "
|
||||||
"other machines, and which preferably provides sufficient access for "
|
"other machines, and which preferably provides sufficient access for "
|
||||||
|
@ -428,45 +420,37 @@ class NetworkController(BaseController):
|
||||||
self.signal.emit_signal('network-config-written', self.netplan_path)
|
self.signal.emit_signal('network-config-written', self.netplan_path)
|
||||||
self.signal.emit_signal('next-screen')
|
self.signal.emit_signal('next-screen')
|
||||||
|
|
||||||
@view
|
|
||||||
def set_default_v4_route(self):
|
def set_default_v4_route(self):
|
||||||
self.ui.set_header("Default route")
|
self.ui.set_header("Default route")
|
||||||
self.ui.set_body(NetworkSetDefaultRouteView(self.model, socket.AF_INET, self))
|
self.ui.set_body(NetworkSetDefaultRouteView(self.model, socket.AF_INET, self))
|
||||||
|
|
||||||
@view
|
|
||||||
def set_default_v6_route(self):
|
def set_default_v6_route(self):
|
||||||
self.ui.set_header("Default route")
|
self.ui.set_header("Default route")
|
||||||
self.ui.set_body(NetworkSetDefaultRouteView(self.model, socket.AF_INET6, self))
|
self.ui.set_body(NetworkSetDefaultRouteView(self.model, socket.AF_INET6, self))
|
||||||
|
|
||||||
@view
|
|
||||||
def bond_interfaces(self):
|
def bond_interfaces(self):
|
||||||
self.ui.set_header("Bond interfaces")
|
self.ui.set_header("Bond interfaces")
|
||||||
self.ui.set_body(NetworkBondInterfacesView(self.model, self))
|
self.ui.set_body(NetworkBondInterfacesView(self.model, self))
|
||||||
|
|
||||||
@view
|
|
||||||
def network_configure_interface(self, iface):
|
def network_configure_interface(self, iface):
|
||||||
self.ui.set_header("Network interface {}".format(iface))
|
self.ui.set_header("Network interface {}".format(iface))
|
||||||
self.ui.set_body(NetworkConfigureInterfaceView(self.model, self, iface))
|
self.ui.set_body(NetworkConfigureInterfaceView(self.model, self, iface))
|
||||||
|
|
||||||
@view
|
|
||||||
def network_configure_ipv4_interface(self, iface):
|
def network_configure_ipv4_interface(self, iface):
|
||||||
self.ui.set_header("Network interface {} manual IPv4 "
|
self.ui.set_header("Network interface {} manual IPv4 "
|
||||||
"configuration".format(iface))
|
"configuration".format(iface))
|
||||||
self.ui.set_body(NetworkConfigureIPv4InterfaceView(self.model, self, iface))
|
self.ui.set_body(NetworkConfigureIPv4InterfaceView(self.model, self, iface))
|
||||||
|
|
||||||
@view
|
|
||||||
def network_configure_wlan_interface(self, iface):
|
def network_configure_wlan_interface(self, iface):
|
||||||
self.ui.set_header("Network interface {} WIFI "
|
self.ui.set_header("Network interface {} WIFI "
|
||||||
"configuration".format(iface))
|
"configuration".format(iface))
|
||||||
self.ui.set_body(NetworkConfigureWLANView(self.model, self, iface))
|
self.ui.set_body(NetworkConfigureWLANView(self.model, self, iface))
|
||||||
|
|
||||||
@view
|
|
||||||
def network_configure_ipv6_interface(self, iface):
|
def network_configure_ipv6_interface(self, iface):
|
||||||
self.ui.set_header("Network interface {} manual IPv6 "
|
self.ui.set_header("Network interface {} manual IPv6 "
|
||||||
"configuration".format(iface))
|
"configuration".format(iface))
|
||||||
self.ui.set_body(NetworkConfigureIPv6InterfaceView(self.model, self, iface))
|
self.ui.set_body(NetworkConfigureIPv6InterfaceView(self.model, self, iface))
|
||||||
|
|
||||||
@view
|
|
||||||
def install_network_driver(self):
|
def install_network_driver(self):
|
||||||
self.ui.set_body(DummyView(self))
|
self.ui.set_body(DummyView(self))
|
||||||
|
|
||||||
|
|
|
@ -243,11 +243,6 @@ class _HelpDisplay(WidgetWrap):
|
||||||
self._closer = closer
|
self._closer = closer
|
||||||
button = Color.button(PlainButton(label="Close", on_press=lambda btn:self._closer()))
|
button = Color.button(PlainButton(label="Close", on_press=lambda btn:self._closer()))
|
||||||
super().__init__(LineBox(Pile([Text(help_text), Padding.fixed_10(button)]), title="Help"))
|
super().__init__(LineBox(Pile([Text(help_text), Padding.fixed_10(button)]), title="Help"))
|
||||||
def keypress(self, size, key):
|
|
||||||
if key == 'esc':
|
|
||||||
self._closer()
|
|
||||||
else:
|
|
||||||
return super().keypress(size, key)
|
|
||||||
|
|
||||||
|
|
||||||
class Help(WidgetWrap):
|
class Help(WidgetWrap):
|
||||||
|
|
|
@ -260,5 +260,5 @@ class NetworkView(BaseView):
|
||||||
def done(self, result):
|
def done(self, result):
|
||||||
self.controller.network_finish(self.model.render())
|
self.controller.network_finish(self.model.render())
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.cancel()
|
self.controller.cancel()
|
||||||
|
|
|
@ -127,8 +127,8 @@ class NetworkBondInterfacesView(BaseView):
|
||||||
return
|
return
|
||||||
|
|
||||||
log.debug('bond: successful bond creation')
|
log.debug('bond: successful bond creation')
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button):
|
||||||
log.debug('bond: button_cancel')
|
log.debug('bond: button_cancel')
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
|
@ -115,7 +115,7 @@ class NetworkConfigureInterfaceView(BaseView):
|
||||||
self.dev = self.model.get_netdev_by_name(self.dev.name)
|
self.dev = self.model.get_netdev_by_name(self.dev.name)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# The interface is gone
|
# The interface is gone
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
return
|
return
|
||||||
if self.dev.type == 'wlan':
|
if self.dev.type == 'wlan':
|
||||||
self.wifi_info.contents = [ (obj, ('pack', None)) for obj in _build_wifi_info(self.dev) ]
|
self.wifi_info.contents = [ (obj, ('pack', None)) for obj in _build_wifi_info(self.dev) ]
|
||||||
|
@ -155,5 +155,8 @@ class NetworkConfigureInterfaceView(BaseView):
|
||||||
def show_ipv6_configuration(self, btn):
|
def show_ipv6_configuration(self, btn):
|
||||||
self.controller.network_configure_ipv6_interface(self.dev.name)
|
self.controller.network_configure_ipv6_interface(self.dev.name)
|
||||||
|
|
||||||
|
def cancel(self):
|
||||||
|
self.controller.default()
|
||||||
|
|
||||||
def done(self, result):
|
def done(self, result):
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
|
@ -146,8 +146,7 @@ class BaseNetworkConfigureManualView(BaseView):
|
||||||
self.dev = self.model.get_netdev_by_name(self.dev.name)
|
self.dev = self.model.get_netdev_by_name(self.dev.name)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# The interface is gone
|
# The interface is gone
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
self.controller.prev_view()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def _build_set_as_default_gw_button(self):
|
def _build_set_as_default_gw_button(self):
|
||||||
|
@ -193,11 +192,11 @@ class BaseNetworkConfigureManualView(BaseView):
|
||||||
self.dev.add_network(self.ip_version, result)
|
self.dev.add_network(self.ip_version, result)
|
||||||
|
|
||||||
# return
|
# return
|
||||||
self.controller.prev_view()
|
self.controller.network_configure_interface(self.dev.name)
|
||||||
|
|
||||||
def cancel(self, sender):
|
def cancel(self, sender=None):
|
||||||
self.model.default_gateway = None
|
self.model.default_gateway = None
|
||||||
self.controller.prev_view()
|
self.controller.network_configure_interface(self.dev.name)
|
||||||
|
|
||||||
class NetworkConfigureIPv4InterfaceView(BaseNetworkConfigureManualView):
|
class NetworkConfigureIPv4InterfaceView(BaseNetworkConfigureManualView):
|
||||||
ip_version = 4
|
ip_version = 4
|
||||||
|
|
|
@ -82,13 +82,6 @@ class NetworkConfigureWLANView(BaseView):
|
||||||
self.orig_w = None
|
self.orig_w = None
|
||||||
super().__init__(ListBox(self.body))
|
super().__init__(ListBox(self.body))
|
||||||
|
|
||||||
def keypress(self, size, key):
|
|
||||||
if key == 'esc':
|
|
||||||
if self.orig_w is not None:
|
|
||||||
self.remove_overlay()
|
|
||||||
return
|
|
||||||
return super().keypress(size, key)
|
|
||||||
|
|
||||||
def show_ssid_list(self, sender):
|
def show_ssid_list(self, sender):
|
||||||
self.show_overlay(NetworkList(self, self.dev.actual_ssids))
|
self.show_overlay(NetworkList(self, self.dev.actual_ssids))
|
||||||
|
|
||||||
|
@ -138,8 +131,7 @@ class NetworkConfigureWLANView(BaseView):
|
||||||
self.dev = self.model.get_netdev_by_name(self.dev.name)
|
self.dev = self.model.get_netdev_by_name(self.dev.name)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# The interface is gone
|
# The interface is gone
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
self.controller.prev_view()
|
|
||||||
return
|
return
|
||||||
self.inputs.contents = [ (obj, ('pack', None)) for obj in self._build_iface_inputs() ]
|
self.inputs.contents = [ (obj, ('pack', None)) for obj in self._build_iface_inputs() ]
|
||||||
|
|
||||||
|
@ -156,7 +148,7 @@ class NetworkConfigureWLANView(BaseView):
|
||||||
else:
|
else:
|
||||||
psk = None
|
psk = None
|
||||||
self.dev.set_ssid_psk(ssid, psk)
|
self.dev.set_ssid_psk(ssid, psk)
|
||||||
self.controller.prev_view()
|
self.controller.network_configure_interface(self.dev.name)
|
||||||
|
|
||||||
def cancel(self, sender):
|
def cancel(self, sender=None):
|
||||||
self.controller.prev_view()
|
self.controller.network_configure_interface(self.dev.name)
|
||||||
|
|
|
@ -139,7 +139,7 @@ class NetworkSetDefaultRouteView(BaseView):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
# FIXME: raise UX error message
|
# FIXME: raise UX error message
|
||||||
pass
|
pass
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
||||||
def cancel(self, button):
|
def cancel(self, button=None):
|
||||||
self.controller.prev_view()
|
self.controller.default()
|
||||||
|
|
|
@ -68,10 +68,18 @@ def environment_check(check):
|
||||||
for ftype, items in checks[check_type].items():
|
for ftype, items in checks[check_type].items():
|
||||||
for i in items:
|
for i in items:
|
||||||
if not os.path.exists(i):
|
if not os.path.exists(i):
|
||||||
log.error('FAIL: {} is not found on the'
|
if 'SNAP' in os.environ:
|
||||||
' filesystem'.format(i))
|
log.warn("Adjusting path for snaps: {}".format(os.environ.get('SNAP')))
|
||||||
env_ok = False
|
i = os.environ.get('SNAP') + i
|
||||||
continue
|
if not os.path.exists(i):
|
||||||
|
env_ok = False
|
||||||
|
else:
|
||||||
|
env_ok = False
|
||||||
|
|
||||||
|
if not env_ok:
|
||||||
|
log.error('FAIL: {} is not found on the'
|
||||||
|
' filesystem'.format(i))
|
||||||
|
continue
|
||||||
if check_map[ftype](i) is False:
|
if check_map[ftype](i) is False:
|
||||||
log.error('FAIL: {} is NOT of type: {}'.format(i, ftype))
|
log.error('FAIL: {} is NOT of type: {}'.format(i, ftype))
|
||||||
env_ok = False
|
env_ok = False
|
||||||
|
|
|
@ -22,6 +22,11 @@ from urwid import Overlay, WidgetWrap
|
||||||
|
|
||||||
|
|
||||||
class BaseView(WidgetWrap):
|
class BaseView(WidgetWrap):
|
||||||
|
|
||||||
|
def __init__(self, w):
|
||||||
|
self.orig_w = None
|
||||||
|
super().__init__(w)
|
||||||
|
|
||||||
def show_overlay(self, overlay_widget, **kw):
|
def show_overlay(self, overlay_widget, **kw):
|
||||||
self.orig_w = self._w
|
self.orig_w = self._w
|
||||||
args = dict(
|
args = dict(
|
||||||
|
@ -38,12 +43,19 @@ class BaseView(WidgetWrap):
|
||||||
self._w = self.orig_w
|
self._w = self.orig_w
|
||||||
self.orig_w = None
|
self.orig_w = None
|
||||||
|
|
||||||
|
def cancel(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def keypress(self, size, key):
|
def keypress(self, size, key):
|
||||||
if key in ['ctrl x']:
|
if key in ['ctrl x']:
|
||||||
self.controller.signal.emit_signal('control-x-quit')
|
self.controller.signal.emit_signal('control-x-quit')
|
||||||
return None
|
return None
|
||||||
key = super().keypress(size, key)
|
key = super().keypress(size, key)
|
||||||
if key == 'esc':
|
if key == 'esc':
|
||||||
self.controller.cancel()
|
if self.orig_w is not None:
|
||||||
return None
|
self.remove_overlay()
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
self.cancel()
|
||||||
|
return None
|
||||||
return key
|
return key
|
||||||
|
|
Loading…
Reference in New Issue