本文整理汇总了Python中simpleline.render.containers.ListColumnContainer.add方法的典型用法代码示例。如果您正苦于以下问题:Python ListColumnContainer.add方法的具体用法?Python ListColumnContainer.add怎么用?Python ListColumnContainer.add使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类simpleline.render.containers.ListColumnContainer
的用法示例。
在下文中一共展示了ListColumnContainer.add方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: PartitionSchemeSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class PartitionSchemeSpoke(NormalTUISpoke):
""" Spoke to select what partitioning scheme to use on disk(s). """
category = SystemCategory
def __init__(self, data, storage, payload):
super().__init__(data, storage, payload)
self.title = N_("Partition Scheme Options")
self._container = None
self.part_schemes = OrderedDict()
self._auto_part_proxy = STORAGE.get_proxy(AUTO_PARTITIONING)
pre_select = self._auto_part_proxy.Type
supported_choices = get_supported_autopart_choices()
if supported_choices:
# Fallback value (eg when default is not supported)
self._selected_scheme_value = supported_choices[0][1]
for item in supported_choices:
self.part_schemes[item[0]] = item[1]
if item[1] == pre_select:
self._selected_scheme_value = item[1]
@property
def indirect(self):
return True
def refresh(self, args=None):
super().refresh(args)
self._container = ListColumnContainer(1)
for scheme, value in self.part_schemes.items():
box = CheckboxWidget(title=_(scheme), completed=(value == self._selected_scheme_value))
self._container.add(box, self._set_part_scheme_callback, value)
self.window.add_with_separator(self._container)
message = _("Select a partition scheme configuration.")
self.window.add_with_separator(TextWidget(message))
def _set_part_scheme_callback(self, data):
self._selected_scheme_value = data
def input(self, args, key):
""" Grab the choice and update things. """
if not self._container.process_user_input(key):
# TRANSLATORS: 'c' to continue
if key.lower() == C_('TUI|Spoke Navigation', 'c'):
self.apply()
return InputState.PROCESSED_AND_CLOSE
else:
return super().input(args, key)
return InputState.PROCESSED_AND_REDRAW
def apply(self):
""" Apply our selections. """
self._auto_part_proxy.SetType(self._selected_scheme_value)
示例2: NTPServersSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class NTPServersSpoke(NormalTUISpoke):
category = LocalizationCategory
def __init__(self, data, storage, payload, time_spoke):
super().__init__(data, storage, payload)
self.title = N_("NTP configuration")
self._container = None
self._time_spoke = time_spoke
@property
def indirect(self):
return True
def _summary_text(self):
"""Return summary of NTP configuration."""
msg = _("NTP servers:")
if self._time_spoke.ntp_servers:
for status in format_ntp_status_list(self._time_spoke.ntp_servers):
msg += "\n%s" % status
else:
msg += _("no NTP servers have been configured")
return msg
def refresh(self, args=None):
super().refresh(args)
summary = self._summary_text()
self.window.add_with_separator(TextWidget(summary))
self._container = ListColumnContainer(1, columns_width=78, spacing=1)
self._container.add(TextWidget(_("Add NTP server")), self._add_ntp_server)
# only add the remove option when we can remove something
if self._time_spoke.ntp_servers:
self._container.add(TextWidget(_("Remove NTP server")), self._remove_ntp_server)
self.window.add_with_separator(self._container)
def _add_ntp_server(self, data):
new_spoke = AddNTPServerSpoke(self.data, self.storage, self.payload, self._time_spoke)
ScreenHandler.push_screen_modal(new_spoke)
self.redraw()
def _remove_ntp_server(self, data):
new_spoke = RemoveNTPServerSpoke(self.data, self.storage, self.payload, self._time_spoke)
ScreenHandler.push_screen_modal(new_spoke)
self.redraw()
def input(self, args, key):
if self._container.process_user_input(key):
return InputState.PROCESSED
else:
return super().input(args, key)
def apply(self):
pass
示例3: RootSelectionSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class RootSelectionSpoke(NormalTUISpoke):
"""UI for selection of installed system root to be mounted."""
def __init__(self, roots):
super().__init__(data=None, storage=None, payload=None)
self.title = N_("Root Selection")
self._roots = roots
self._selection = roots[0]
self._container = None
@property
def selection(self):
"""The selected root fs to mount."""
return self._selection
@property
def indirect(self):
return True
def refresh(self, args=None):
super().refresh(args)
self._container = ListColumnContainer(1)
for root in self._roots:
box = CheckboxWidget(
title="{} on {}".format(root.name, root.device.path),
completed=(self._selection == root)
)
self._container.add(box, self._select_root, root)
message = _("The following installations were discovered on your system.")
self.window.add_with_separator(TextWidget(message))
self.window.add_with_separator(self._container)
def _select_root(self, root):
self._selection = root
def prompt(self, args=None):
""" Override the default TUI prompt."""
prompt = Prompt()
prompt.add_continue_option()
return prompt
def input(self, args, key):
"""Override any input so we can launch rescue mode."""
if self._container.process_user_input(key):
return InputState.PROCESSED_AND_REDRAW
elif key == Prompt.CONTINUE:
return InputState.PROCESSED_AND_CLOSE
else:
return key
def apply(self):
"""Define the abstract method."""
pass
示例4: SpecifyRepoSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class SpecifyRepoSpoke(NormalTUISpoke, SourceSwitchHandler):
""" Specify the repo URL here if closest mirror not selected. """
category = SoftwareCategory
HTTP = 1
HTTPS = 2
FTP = 3
def __init__(self, data, storage, payload, instclass, protocol):
NormalTUISpoke.__init__(self, data, storage, payload, instclass)
SourceSwitchHandler.__init__(self)
self.title = N_("Specify Repo Options")
self.protocol = protocol
self._container = None
self._url = self.data.url.url
def refresh(self, args=None):
""" Refresh window. """
NormalTUISpoke.refresh(self, args)
self._container = ListColumnContainer(1)
dialog = Dialog(_("Repo URL"))
self._container.add(EntryWidget(dialog.title, self._url), self._set_repo_url, dialog)
self.window.add_with_separator(self._container)
def _set_repo_url(self, dialog):
self._url = dialog.run()
def input(self, args, key):
if self._container.process_user_input(key):
self.apply()
return InputState.PROCESSED_AND_REDRAW
else:
return NormalTUISpoke.input(self, args, key)
@property
def indirect(self):
return True
def apply(self):
""" Apply all of our changes. """
if self.protocol == SpecifyRepoSpoke.HTTP and not self._url.startswith("http://"):
url = "http://" + self._url
elif self.protocol == SpecifyRepoSpoke.HTTPS and not self._url.startswith("https://"):
url = "https://" + self._url
elif self.protocol == SpecifyRepoSpoke.FTP and not self._url.startswith("ftp://"):
url = "ftp://" + self._url
else:
# protocol either unknown or entry already starts with a protocol
# specification
url = self._url
self.set_source_url(url)
示例5: PartitionSchemeSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class PartitionSchemeSpoke(NormalTUISpoke):
""" Spoke to select what partitioning scheme to use on disk(s). """
category = SystemCategory
def __init__(self, data, storage, payload, instclass):
NormalTUISpoke.__init__(self, data, storage, payload, instclass)
self.title = N_("Partition Scheme Options")
self._container = None
self.part_schemes = OrderedDict()
pre_select = self.data.autopart.type or DEFAULT_AUTOPART_TYPE
for item in AUTOPART_CHOICES:
self.part_schemes[item[0]] = item[1]
if item[1] == pre_select:
self._selected_scheme_value = item[1]
@property
def indirect(self):
return True
def refresh(self, args=None):
NormalTUISpoke.refresh(self, args)
self._container = ListColumnContainer(1)
for scheme, value in self.part_schemes.items():
box = CheckboxWidget(title=_(scheme), completed=(value == self._selected_scheme_value))
self._container.add(box, self._set_part_scheme_callback, value)
self.window.add_with_separator(self._container)
message = _("Select a partition scheme configuration.")
self.window.add_with_separator(TextWidget(message))
def _set_part_scheme_callback(self, data):
self._selected_scheme_value = data
def input(self, args, key):
""" Grab the choice and update things. """
if not self._container.process_user_input(key):
# TRANSLATORS: 'c' to continue
if key.lower() == C_('TUI|Spoke Navigation', 'c'):
self.apply()
self.close()
return InputState.PROCESSED
else:
return super(PartitionSchemeSpoke, self).input(args, key)
self.redraw()
return InputState.PROCESSED
def apply(self):
""" Apply our selections. """
self.data.autopart.type = self._selected_scheme_value
示例6: NetworkSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class NetworkSpoke(FirstbootSpokeMixIn, EditTUISpoke):
""" Spoke used to configure network settings.
.. inheritance-diagram:: NetworkSpoke
:parts: 3
"""
helpFile = "NetworkSpoke.txt"
category = SystemCategory
def __init__(self, data, storage, payload, instclass):
EditTUISpoke.__init__(self, data, storage, payload, instclass)
self.title = N_("Network configuration")
self._container = None
self.hostname_dialog = OneShotEditTUIDialog(data, storage, payload, instclass)
self.hostname_dialog.value = self.data.network.hostname
self.supported_devices = []
self.errors = []
self._apply = False
def initialize(self):
self.initialize_start()
self._load_new_devices()
EditTUISpoke.initialize(self)
if not self.data.network.seen:
self._update_network_data()
self.initialize_done()
def _load_new_devices(self):
devices = nm.nm_devices()
intf_dumped = network.dumpMissingDefaultIfcfgs()
if intf_dumped:
log.debug("dumped interfaces: %s", intf_dumped)
for name in devices:
if name in self.supported_devices:
continue
if network.is_ibft_configured_device(name):
continue
if network.device_type_is_supported_wired(name):
# ignore slaves
try:
if nm.nm_device_setting_value(name, "connection", "slave-type"):
continue
except nm.MultipleSettingsFoundError as e:
log.debug("%s during initialization", e)
self.supported_devices.append(name)
@property
def completed(self):
""" Check whether this spoke is complete or not. Do an additional
check if we're installing from CD/DVD, since a network connection
should not be required in this case.
"""
return (not can_touch_runtime_system("require network connection")
or nm.nm_activated_devices())
@property
def mandatory(self):
# the network spoke should be mandatory only if it is running
# during the installation and if the installation source requires network
return ANACONDA_ENVIRON in flags.environs and self.payload.needsNetwork
@property
def status(self):
""" Short msg telling what devices are active. """
return network.status_message()
def _summary_text(self):
"""Devices cofiguration shown to user."""
msg = ""
activated_devs = nm.nm_activated_devices()
for name in self.supported_devices:
if name in activated_devs:
msg += self._activated_device_msg(name)
else:
msg += _("Wired (%(interface_name)s) disconnected\n") \
% {"interface_name": name}
return msg
def _activated_device_msg(self, devname):
msg = _("Wired (%(interface_name)s) connected\n") \
% {"interface_name": devname}
ipv4config = nm.nm_device_ip_config(devname, version=4)
ipv6config = nm.nm_device_ip_config(devname, version=6)
if ipv4config and ipv4config[0]:
addr_str, prefix, gateway_str = ipv4config[0][0]
netmask_str = network.prefix2netmask(prefix)
dnss_str = ",".join(ipv4config[1])
else:
addr_str = dnss_str = gateway_str = netmask_str = ""
msg += _(" IPv4 Address: %(addr)s Netmask: %(netmask)s Gateway: %(gateway)s\n") % \
{"addr": addr_str, "netmask": netmask_str, "gateway": gateway_str}
msg += _(" DNS: %s\n") % dnss_str
if ipv6config and ipv6config[0]:
for ipv6addr in ipv6config[0]:
addr_str, prefix, gateway_str = ipv6addr
#.........这里部分代码省略.........
示例7: SourceSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class SourceSpoke(NormalTUISpoke, SourceSwitchHandler):
""" Spoke used to customize the install source repo.
.. inheritance-diagram:: SourceSpoke
:parts: 3
"""
helpFile = "SourceSpoke.txt"
category = SoftwareCategory
SET_NETWORK_INSTALL_MODE = "network_install"
def __init__(self, data, storage, payload, instclass):
NormalTUISpoke.__init__(self, data, storage, payload, instclass)
SourceSwitchHandler.__init__(self)
self.title = N_("Installation source")
self._container = None
self._ready = False
self._error = False
self._cdrom = None
self._hmc = False
def initialize(self):
NormalTUISpoke.initialize(self)
self.initialize_start()
threadMgr.add(AnacondaThread(name=THREAD_SOURCE_WATCHER,
target=self._initialize))
payloadMgr.addListener(payloadMgr.STATE_ERROR, self._payload_error)
def _initialize(self):
""" Private initialize. """
threadMgr.wait(THREAD_PAYLOAD)
# If we've previously set up to use a CD/DVD method, the media has
# already been mounted by payload.setup. We can't try to mount it
# again. So just use what we already know to create the selector.
# Otherwise, check to see if there's anything available.
if self.data.method.method == "cdrom":
self._cdrom = self.payload.install_device
elif not flags.automatedInstall:
self._cdrom = opticalInstallMedia(self.storage.devicetree)
# Enable the SE/HMC option.
if flags.hmc:
self._hmc = True
self._ready = True
# report that the source spoke has been initialized
self.initialize_done()
def _payload_error(self):
self._error = True
def _repo_status(self):
""" Return a string describing repo url or lack of one. """
method = self.data.method
if method.method == "url":
return method.url or method.mirrorlist or method.metalink
elif method.method == "nfs":
return _("NFS server %s") % method.server
elif method.method == "cdrom":
return _("Local media")
elif method.method == "hmc":
return _("Local media via SE/HMC")
elif method.method == "harddrive":
if not method.dir:
return _("Error setting up software source")
return os.path.basename(method.dir)
elif self.payload.baseRepo:
return _("Closest mirror")
else:
return _("Nothing selected")
@property
def showable(self):
return isinstance(self.payload, PackagePayload)
@property
def status(self):
if self._error:
return _("Error setting up software source")
elif not self.ready:
return _("Processing...")
else:
return self._repo_status()
@property
def completed(self):
if flags.automatedInstall and self.ready and not self.payload.baseRepo:
return False
else:
return not self._error and self.ready and (self.data.method.method or self.payload.baseRepo)
def refresh(self, args=None):
NormalTUISpoke.refresh(self, args)
threadMgr.wait(THREAD_PAYLOAD)
self._container = ListColumnContainer(1, columns_width=78, spacing=1)
#.........这里部分代码省略.........
示例8: SelectDeviceSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class SelectDeviceSpoke(NormalTUISpoke):
""" Select device containing the install source ISO file. """
category = SoftwareCategory
def __init__(self, data, storage, payload, instclass):
super().__init__(data, storage, payload, instclass)
self.title = N_("Select device containing the ISO file")
self._container = None
self._mountable_devices = self._get_mountable_devices()
self._device = None
@property
def indirect(self):
return True
def _sanitize_model(self, model):
return model.replace("_", " ")
def _get_mountable_devices(self):
disks = []
fstring = "%(model)s %(path)s (%(size)s MB) %(format)s %(label)s"
for dev in potentialHdisoSources(self.storage.devicetree):
# path model size format type uuid of format
dev_info = {"model": self._sanitize_model(dev.disk.model),
"path": dev.path,
"size": dev.size,
"format": dev.format.name or "",
"label": dev.format.label or dev.format.uuid or ""
}
disks.append([dev, fstring % dev_info])
return disks
def refresh(self, args=None):
super().refresh(args)
self._container = ListColumnContainer(1, columns_width=78, spacing=1)
# check if the storage refresh thread is running
if threadMgr.get(THREAD_STORAGE_WATCHER):
# storage refresh is running - just report it
# so that the user can refresh until it is done
# TODO: refresh once the thread is done ?
message = _(PAYLOAD_STATUS_PROBING_STORAGE)
self.window.add_with_separator(TextWidget(message))
# check if there are any mountable devices
if self._mountable_devices:
for d in self._mountable_devices:
self._container.add(TextWidget(d[1]), callback=self._select_mountable_device, data=d[0])
self.window.add_with_separator(self._container)
else:
message = _("No mountable devices found")
self.window.add_with_separator(TextWidget(message))
def _select_mountable_device(self, data):
self._device = data
new_spoke = SelectISOSpoke(self.data,
self.storage, self.payload,
self.instclass, self._device)
ScreenHandler.push_screen_modal(new_spoke)
self.close()
def input(self, args, key):
if self._container.process_user_input(key):
return InputState.PROCESSED
else:
# either the input was not a number or
# we don't have the disk for the given number
return super().input(args, key)
# Override Spoke.apply
def apply(self):
pass
示例9: ConfigureDeviceSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class ConfigureDeviceSpoke(NormalTUISpoke):
""" Spoke to set various configuration options for net devices. """
category = "network"
def __init__(self, data, storage, payload, network_module, iface, connection):
super().__init__(data, storage, payload)
self.title = N_("Device configuration")
self._network_module = network_module
self._container = None
self._connection = connection
self._iface = iface
self._connection_uuid = connection.get_uuid()
self.errors = []
self.apply_configuration = False
self._data = WiredTUIConfigurationData()
self._data.set_from_connection(self._connection)
# ONBOOT workaround - changing autoconnect connection value would
# activate the device
self._data.onboot = self._get_onboot(self._connection_uuid)
log.debug("Configure iface %s: connection %s -> %s", self._iface, self._connection_uuid,
self._data)
def _get_onboot(self, connection_uuid):
return self._network_module.proxy.GetConnectionOnbootValue(connection_uuid)
def _set_onboot(self, connection_uuid, onboot):
return self._network_module.proxy.SetConnectionOnbootValue(connection_uuid, onboot)
def refresh(self, args=None):
""" Refresh window. """
super().refresh(args)
self._container = ListColumnContainer(1)
dialog = Dialog(title=(_('IPv4 address or %s for DHCP') % '"dhcp"'),
conditions=[self._check_ipv4_or_dhcp])
self._container.add(EntryWidget(dialog.title, self._data.ip), self._set_ipv4_or_dhcp, dialog)
dialog = Dialog(title=_("IPv4 netmask"), conditions=[self._check_netmask])
self._container.add(EntryWidget(dialog.title, self._data.netmask), self._set_netmask, dialog)
dialog = Dialog(title=_("IPv4 gateway"), conditions=[self._check_ipv4])
self._container.add(EntryWidget(dialog.title, self._data.gateway), self._set_ipv4_gateway, dialog)
msg = (_('IPv6 address[/prefix] or %(auto)s for automatic, %(dhcp)s for DHCP, '
'%(ignore)s to turn off')
% {"auto": '"auto"', "dhcp": '"dhcp"', "ignore": '"ignore"'})
dialog = Dialog(title=msg, conditions=[self._check_ipv6_config])
self._container.add(EntryWidget(dialog.title, self._data.ipv6), self._set_ipv6, dialog)
dialog = Dialog(title=_("IPv6 default gateway"), conditions=[self._check_ipv6])
self._container.add(EntryWidget(dialog.title, self._data.ipv6gateway), self._set_ipv6_gateway, dialog)
dialog = Dialog(title=_("Nameservers (comma separated)"), conditions=[self._check_nameservers])
self._container.add(EntryWidget(dialog.title, self._data.nameserver), self._set_nameservers, dialog)
msg = _("Connect automatically after reboot")
w = CheckboxWidget(title=msg, completed=self._data.onboot)
self._container.add(w, self._set_onboot_handler)
msg = _("Apply configuration in installer")
w = CheckboxWidget(title=msg, completed=self.apply_configuration)
self._container.add(w, self._set_apply_handler)
self.window.add_with_separator(self._container)
message = _("Configuring device %s.") % self._iface
self.window.add_with_separator(TextWidget(message))
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv4_or_dhcp(self, user_input, report_func):
return IPV4_OR_DHCP_PATTERN_WITH_ANCHORS.match(user_input) is not None
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv4(self, user_input, report_func):
return IPV4_PATTERN_WITH_ANCHORS.match(user_input) is not None
@report_if_failed(message=NETMASK_ERROR_MSG)
def _check_netmask(self, user_input, report_func):
return IPV4_NETMASK_WITH_ANCHORS.match(user_input) is not None
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv6(self, user_input, report_func):
return network.check_ip_address(user_input, version=6)
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv6_config(self, user_input, report_func):
if user_input in ["auto", "dhcp", "ignore"]:
return True
addr, _slash, prefix = user_input.partition("/")
if prefix:
try:
if not 1 <= int(prefix) <= 128:
return False
except ValueError:
return False
return network.check_ip_address(addr, version=6)
#.........这里部分代码省略.........
示例10: MountPointAssignSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class MountPointAssignSpoke(NormalTUISpoke):
""" Assign mount points to block devices. """
category = SystemCategory
def __init__(self, data, storage, payload):
super().__init__(data, storage, payload)
self.title = N_("Assign mount points")
self._container = None
self._disk_select_proxy = STORAGE.get_proxy(DISK_SELECTION)
self._manual_part_proxy = STORAGE.get_proxy(MANUAL_PARTITIONING)
self._mount_info = self._gather_mount_info()
@property
def indirect(self):
return True
def refresh(self, args=None):
"""Refresh the window."""
super().refresh(args)
self._container = ListColumnContainer(2)
for info in self._mount_info:
widget = TextWidget(self._get_mount_info_description(info))
self._container.add(widget, self._configure_mount_info, info)
message = _(
"Choose device from above to assign mount point and set format.\n"
"Formats marked with * are new formats meaning ALL DATA on the "
"original format WILL BE LOST!"
)
self.window.add_with_separator(self._container)
self.window.add_with_separator(TextWidget(message))
def prompt(self, args=None):
prompt = super().prompt(args)
# TRANSLATORS: 's' to rescan devices
prompt.add_option(C_('TUI|Spoke Navigation|Partitioning', 's'), _("rescan devices"))
return prompt
def input(self, args, key):
""" Grab the choice and update things. """
if self._container.process_user_input(key):
return InputState.PROCESSED
# TRANSLATORS: 's' to rescan devices
if key.lower() == C_('TUI|Spoke Navigation|Partitioning', 's'):
self._rescan_devices()
return InputState.PROCESSED_AND_REDRAW
# TRANSLATORS: 'c' to continue
elif key.lower() == C_('TUI|Spoke Navigation', 'c'):
self.apply()
return super().input(args, key)
def apply(self):
""" Apply our selections. """
mount_points = []
for _device, data in self._mount_info:
if data[MOUNT_POINT_REFORMAT] or data[MOUNT_POINT_PATH]:
mount_points.append({
MOUNT_POINT_PATH: get_variant(Str, data[MOUNT_POINT_PATH] or "none"),
MOUNT_POINT_DEVICE: get_variant(Str, data[MOUNT_POINT_DEVICE]),
MOUNT_POINT_REFORMAT: get_variant(Bool, data[MOUNT_POINT_REFORMAT]),
MOUNT_POINT_FORMAT: get_variant(Str, data[MOUNT_POINT_FORMAT])
})
self._manual_part_proxy.SetMountPoints(mount_points)
def _gather_mount_info(self):
"""Gather info about mount points."""
selected_disks = self._disk_select_proxy.SelectedDisks
mount_points = self._manual_part_proxy.MountPoints
mount_info = []
for device in self.storage.devicetree.leaves:
# Is the device usable?
if device.protected or device.size == Size(0):
continue
# All device's disks have to be in selected disks.
device_disks = {d.name for d in device.disks}
if selected_disks and not set(selected_disks).issuperset(device_disks):
continue
# Append new info about this device.
data = self._get_mount_point_data(device, mount_points)
mount_info.append((device, data))
# Use the data only once.
if data in mount_points:
mount_points.remove(data)
return mount_info
#.........这里部分代码省略.........
示例11: PartTypeSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class PartTypeSpoke(NormalTUISpoke):
""" Partitioning options are presented here.
.. inheritance-diagram:: PartTypeSpoke
:parts: 3
"""
category = SystemCategory
def __init__(self, data, storage, payload):
super().__init__(data, storage, payload)
self.title = N_("Partitioning Options")
self._container = None
self._part_type_list = sorted(PARTTYPES.keys())
# remember the original values so that we can detect a change
self._disk_init_proxy = STORAGE.get_proxy(DISK_INITIALIZATION)
self._orig_init_mode = self._disk_init_proxy.InitializationMode
self._manual_part_proxy = STORAGE.get_proxy(MANUAL_PARTITIONING)
self._orig_mount_assign = self._manual_part_proxy.Enabled
# Create the auto partitioning proxy
self._auto_part_proxy = STORAGE.get_proxy(AUTO_PARTITIONING)
# default to mount point assignment if it is already (partially)
# configured
self._do_mount_assign = self._orig_mount_assign
if not self._do_mount_assign:
self._init_mode = self._disk_init_proxy.InitializationMode
else:
self._init_mode = CLEAR_PARTITIONS_NONE
@property
def indirect(self):
return True
def refresh(self, args=None):
super().refresh(args)
self._container = ListColumnContainer(1)
for part_type in self._part_type_list:
c = CheckboxWidget(title=_(part_type),
completed=(not self._do_mount_assign
and PARTTYPES[part_type] == self._init_mode)
)
self._container.add(c, self._select_partition_type_callback, part_type)
c = CheckboxWidget(title=_("Manually assign mount points"),
completed=self._do_mount_assign)
self._container.add(c, self._select_mount_assign)
self.window.add_with_separator(self._container)
message = _("Installation requires partitioning of your hard drive. "
"Select what space to use for the install target or "
"manually assign mount points.")
self.window.add_with_separator(TextWidget(message))
def _select_mount_assign(self, data=None):
self._init_mode = CLEAR_PARTITIONS_NONE
self._do_mount_assign = True
self.apply()
def _select_partition_type_callback(self, data):
self._do_mount_assign = False
self._init_mode = PARTTYPES[data]
self.apply()
def apply(self):
# kind of a hack, but if we're actually getting to this spoke, there
# is no doubt that we are doing autopartitioning, so set autopart to
# True. In the case of ks installs which may not have defined any
# partition options, autopart was never set to True, causing some
# issues. (rhbz#1001061)
if not self._do_mount_assign:
self._auto_part_proxy.SetEnabled(True)
self._manual_part_proxy.SetEnabled(False)
self._disk_init_proxy.SetInitializationMode(self._init_mode)
self._disk_init_proxy.SetInitializeLabelsEnabled(True)
else:
self._auto_part_proxy.SetEnabled(False)
self._manual_part_proxy.SetEnabled(True)
self._disk_init_proxy.SetInitializationMode(CLEAR_PARTITIONS_NONE)
self._disk_init_proxy.SetInitializeLabelsEnabled(False)
def _ensure_init_storage(self):
"""
If a different clearpart type was chosen or mount point assignment was
chosen instead, we need to reset/rescan storage to revert all changes
done by the previous run of doKickstartStorage() and get everything into
the initial state.
"""
# the only safe options are:
# 1) if nothing was set before (self._orig_clearpart_type is None) or
if self._orig_init_mode == CLEAR_PARTITIONS_DEFAULT:
return
# 2) mount point assignment was done before and user just wants to tweak it
if self._orig_mount_assign and self._do_mount_assign:
return
#.........这里部分代码省略.........
示例12: UserSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class UserSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
"""
.. inheritance-diagram:: UserSpoke
:parts: 3
"""
helpFile = "UserSpoke.txt"
category = UserSettingsCategory
@classmethod
def should_run(cls, environment, data):
if FirstbootSpokeMixIn.should_run(environment, data):
return True
# the user spoke should run always in the anaconda and in firstboot only
# when doing reconfig or if no user has been created in the installation
if environment == FIRSTBOOT_ENVIRON and data and not data.user.userList:
return True
return False
def __init__(self, data, storage, payload, instclass):
FirstbootSpokeMixIn.__init__(self)
NormalTUISpoke.__init__(self, data, storage, payload, instclass)
self.initialize_start()
self.title = N_("User creation")
self._container = None
if self.data.user.userList:
self._user_data = self.data.user.userList[0]
self._create_user = True
else:
self._user_data = self.data.UserData()
self._create_user = False
self._use_password = self._user_data.isCrypted or self._user_data.password
self._groups = ""
self._is_admin = False
self._policy = self.data.anaconda.pwpolicy.get_policy("user", fallback_to_default=True)
self.errors = []
self._users_module = USERS.get_observer()
self._users_module.connect()
self.initialize_done()
def refresh(self, args=None):
NormalTUISpoke.refresh(self, args)
self._is_admin = "wheel" in self._user_data.groups
self._groups = ", ".join(self._user_data.groups)
self._container = ListColumnContainer(1)
w = CheckboxWidget(title=_("Create user"), completed=self._create_user)
self._container.add(w, self._set_create_user)
if self._create_user:
dialog = Dialog(title=_("Full name"), conditions=[self._check_fullname])
self._container.add(EntryWidget(dialog.title, self._user_data.gecos), self._set_fullname, dialog)
dialog = Dialog(title=_("User name"), conditions=[self._check_username])
self._container.add(EntryWidget(dialog.title, self._user_data.name), self._set_username, dialog)
w = CheckboxWidget(title=_("Use password"), completed=self._use_password)
self._container.add(w, self._set_use_password)
if self._use_password:
password_dialog = PasswordDialog(title=_("Password"), policy=self._policy)
if self._user_data.password:
entry = EntryWidget(password_dialog.title, _(PASSWORD_SET))
else:
entry = EntryWidget(password_dialog.title)
self._container.add(entry, self._set_password, password_dialog)
msg = _("Administrator")
w = CheckboxWidget(title=msg, completed=self._is_admin)
self._container.add(w, self._set_administrator)
dialog = Dialog(title=_("Groups"), conditions=[self._check_groups])
self._container.add(EntryWidget(dialog.title, self._groups), self._set_groups, dialog)
self.window.add_with_separator(self._container)
@report_if_failed(message=FULLNAME_ERROR_MSG)
def _check_fullname(self, user_input, report_func):
return GECOS_VALID.match(user_input) is not None
@report_check_func()
def _check_username(self, user_input, report_func):
return check_username(user_input)
@report_check_func()
def _check_groups(self, user_input, report_func):
return check_grouplist(user_input)
def _set_create_user(self, args):
self._create_user = not self._create_user
#.........这里部分代码省略.........
示例13: ConfigureNetworkSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class ConfigureNetworkSpoke(NormalTUISpoke):
""" Spoke to set various configuration options for net devices. """
category = "network"
def __init__(self, data, storage, payload, instclass, network_data):
super().__init__(data, storage, payload, instclass)
self.title = N_("Device configuration")
self.network_data = network_data
if self.network_data.bootProto == "dhcp":
self.network_data.ip = "dhcp"
if self.network_data.noipv6:
self.network_data.ipv6 = "ignore"
self.apply_configuration = False
self._container = None
def refresh(self, args=None):
""" Refresh window. """
super().refresh(args)
self._container = ListColumnContainer(1)
dialog = Dialog(title=(_('IPv4 address or %s for DHCP') % '"dhcp"'),
conditions=[self._check_ipv4_or_dhcp])
self._container.add(EntryWidget(dialog.title, self.network_data.ip), self._set_ipv4_or_dhcp, dialog)
dialog = Dialog(title=_("IPv4 netmask"), conditions=[self._check_netmask])
self._container.add(EntryWidget(dialog.title, self.network_data.netmask), self._set_netmask, dialog)
dialog = Dialog(title=_("IPv4 gateway"), conditions=[self._check_ipv4])
self._container.add(EntryWidget(dialog.title, self.network_data.gateway), self._set_ipv4_gateway, dialog)
msg = (_('IPv6 address[/prefix] or %(auto)s for automatic, %(dhcp)s for DHCP, '
'%(ignore)s to turn off')
% {"auto": '"auto"', "dhcp": '"dhcp"', "ignore": '"ignore"'})
dialog = Dialog(title=msg, conditions=[self._check_ipv6_config])
self._container.add(EntryWidget(dialog.title, self.network_data.ipv6), self._set_ipv6, dialog)
dialog = Dialog(title=_("IPv6 default gateway"), conditions=[self._check_ipv6])
self._container.add(EntryWidget(dialog.title, self.network_data.ipv6gateway), self._set_ipv6_gateway, dialog)
dialog = Dialog(title=_("Nameservers (comma separated)"), conditions=[self._check_nameservers])
self._container.add(EntryWidget(dialog.title, self.network_data.nameserver), self._set_nameservers, dialog)
msg = _("Connect automatically after reboot")
w = CheckboxWidget(title=msg, completed=self.network_data.onboot)
self._container.add(w, self._set_onboot_handler)
msg = _("Apply configuration in installer")
w = CheckboxWidget(title=msg, completed=self.apply_configuration)
self._container.add(w, self._set_apply_handler)
self.window.add_with_separator(self._container)
message = _("Configuring device %s.") % self.network_data.device
self.window.add_with_separator(TextWidget(message))
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv4_or_dhcp(self, user_input, report_func):
return IPV4_OR_DHCP_PATTERN_WITH_ANCHORS.match(user_input) is not None
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv4(self, user_input, report_func):
return IPV4_PATTERN_WITH_ANCHORS.match(user_input) is not None
@report_if_failed(message=NETMASK_ERROR_MSG)
def _check_netmask(self, user_input, report_func):
return IPV4_NETMASK_WITH_ANCHORS.match(user_input) is not None
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv6(self, user_input, report_func):
return network.check_ip_address(user_input, version=6)
@report_if_failed(message=IP_ERROR_MSG)
def _check_ipv6_config(self, user_input, report_func):
if user_input in ["auto", "dhcp", "ignore"]:
return True
addr, _slash, prefix = user_input.partition("/")
if prefix:
try:
if not 1 <= int(prefix) <= 128:
return False
except ValueError:
return False
return network.check_ip_address(addr, version=6)
@report_if_failed(message=IP_ERROR_MSG)
def _check_nameservers(self, user_input, report_func):
if user_input.strip():
addresses = [str.strip(i) for i in user_input.split(",")]
for ip in addresses:
if not network.check_ip_address(ip):
return False
return True
def _set_ipv4_or_dhcp(self, dialog):
self.network_data.ip = dialog.run()
def _set_netmask(self, dialog):
#.........这里部分代码省略.........
示例14: StorageSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
#.........这里部分代码省略.........
elif count == 0:
summary = (_("No disks selected; please select at least one disk to install to."))
# Append storage errors to the summary
if self.errors:
summary = summary + "\n" + "\n".join(self.errors)
elif self.warnings:
summary = summary + "\n" + "\n".join(self.warnings)
return summary
def refresh(self, args=None):
NormalTUISpoke.refresh(self, args)
# Join the initialization thread to block on it
# This print is foul. Need a better message display
print(_(PAYLOAD_STATUS_PROBING_STORAGE))
threadMgr.wait(THREAD_STORAGE_WATCHER)
# synchronize our local data store with the global ksdata
# Commment out because there is no way to select a disk right
# now without putting it in ksdata. Seems wrong?
#self.selected_disks = self.data.ignoredisk.onlyuse[:]
self.autopart = self.data.autopart.autopart
self._container = ListColumnContainer(1, spacing=1)
message = self._update_summary()
# loop through the disks and present them.
for disk in self.disks:
disk_info = self._format_disk_info(disk)
c = CheckboxWidget(title=disk_info, completed=(disk.name in self.selected_disks))
self._container.add(c, self._update_disk_list_callback, disk)
# if we have more than one disk, present an option to just
# select all disks
if len(self.disks) > 1:
c = CheckboxWidget(title=_("Select all"), completed=self.select_all)
self._container.add(c, self._select_all_disks_callback)
self.window.add_with_separator(self._container)
self.window.add_with_separator(TextWidget(message))
def _select_all_disks_callback(self, data):
""" Mark all disks as selected for use in partitioning. """
self.select_all = True
for disk in self.disks:
if disk.name not in self.selected_disks:
self._update_disk_list(disk)
def _update_disk_list_callback(self, data):
disk = data
self.select_all = False
self._update_disk_list(disk)
def _format_disk_info(self, disk):
""" Some specialized disks are difficult to identify in the storage
spoke, so add and return extra identifying information about them.
Since this is going to be ugly to do within the confines of the
CheckboxWidget, pre-format the display string right here.
"""
# show this info for all disks
format_str = "%s: %s (%s)" % (disk.model, disk.size, disk.name)
示例15: AskVNCSpoke
# 需要导入模块: from simpleline.render.containers import ListColumnContainer [as 别名]
# 或者: from simpleline.render.containers.ListColumnContainer import add [as 别名]
class AskVNCSpoke(NormalTUISpoke):
"""
.. inheritance-diagram:: AskVNCSpoke
:parts: 3
"""
title = N_("VNC")
# This spoke is kinda standalone, not meant to be used with a hub
# We pass in some fake data just to make our parents happy
def __init__(self, data, storage=None, payload=None, instclass=None, message=""):
super().__init__(data, storage, payload, instclass)
self.input_required = True
self.initialize_start()
self._container = None
# The TUI hasn't been initialized with the message handlers yet. Add an
# exception message handler so that the TUI exits if anything goes wrong
# at this stage.
loop = App.get_event_loop()
loop.register_signal_handler(ExceptionSignal, exception_msg_handler_and_exit)
self._message = message
self._usevnc = False
self.initialize_done()
@property
def indirect(self):
return True
def refresh(self, args=None):
super().refresh(args)
self.window.add_with_separator(TextWidget(self._message))
self._container = ListColumnContainer(1, spacing=1)
# choices are
# USE VNC
self._container.add(TextWidget(_(USEVNC)), self._use_vnc_callback)
# USE TEXT
self._container.add(TextWidget(_(USETEXT)), self._use_text_callback)
self.window.add_with_separator(self._container)
def _use_vnc_callback(self, data):
self._usevnc = True
new_spoke = VNCPassSpoke(self.data, self.storage,
self.payload, self.instclass)
ScreenHandler.push_screen_modal(new_spoke)
def _use_text_callback(self, data):
self._usevnc = False
def input(self, args, key):
"""Override input so that we can launch the VNC password spoke"""
if self._container.process_user_input(key):
self.apply()
return InputState.PROCESSED_AND_CLOSE
else:
# TRANSLATORS: 'q' to quit
if key.lower() == C_('TUI|Spoke Navigation', 'q'):
d = YesNoDialog(_(u"Do you really want to quit?"))
ScreenHandler.push_screen_modal(d)
if d.answer:
ipmi_abort(scripts=self.data.scripts)
if conf.system.can_reboot:
execWithRedirect("systemctl", ["--no-wall", "reboot"])
else:
sys.exit(1)
else:
return super().input(args, key)
def apply(self):
self.data.vnc.enabled = self._usevnc