anaconda: remove network setup from text interface
We have network disabled.
This commit is contained in:
parent
fcb78c64cb
commit
23a54d7436
@ -1,285 +0,0 @@
|
||||
# Network configuration spoke classes
|
||||
#
|
||||
# Copyright (C) 2013 Red Hat, Inc.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing to use,
|
||||
# modify, copy, or redistribute it subject to the terms and conditions of
|
||||
# the GNU General Public License v.2, or (at your option) any later version.
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY expressed or implied, including the implied warranties of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||
# Public License for more details. You should have received a copy of the
|
||||
# GNU General Public License along with this program; if not, write to the
|
||||
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
||||
# source code or documentation are not subject to the GNU General Public
|
||||
# License and may only be used or replicated with the express permission of
|
||||
# Red Hat, Inc.
|
||||
#
|
||||
# Red Hat Author(s): Samantha N. Bueno <sbueno@redhat.com>,
|
||||
# Radek Vykydal <rvykydal@redhat.com>
|
||||
#
|
||||
|
||||
|
||||
from pyanaconda.flags import can_touch_runtime_system
|
||||
from pyanaconda.ui.tui.spokes import EditTUISpoke, OneShotEditTUIDialog
|
||||
from pyanaconda.ui.tui.spokes import EditTUISpokeEntry as Entry
|
||||
from pyanaconda.ui.tui.simpleline import TextWidget, ColumnWidget
|
||||
from pyanaconda.i18n import _
|
||||
from pyanaconda import network
|
||||
from pyanaconda import nm
|
||||
|
||||
from pyanaconda.regexes import IPV4_PATTERN_WITHOUT_ANCHORS
|
||||
from pyanaconda.constants_text import INPUT_PROCESSED
|
||||
|
||||
import re
|
||||
|
||||
__all__ = ["NetworkSpoke"]
|
||||
|
||||
|
||||
class NetworkSpoke(EditTUISpoke):
|
||||
""" Spoke used to configure network settings. """
|
||||
title = _("Network configuration")
|
||||
category = "system"
|
||||
|
||||
def __init__(self, app, data, storage, payload, instclass):
|
||||
EditTUISpoke.__init__(self, app, data, storage, payload, instclass)
|
||||
self.hostname_dialog = OneShotEditTUIDialog(app, data, storage, payload, instclass)
|
||||
self.hostname_dialog.value = self.data.network.hostname
|
||||
self.supported_devices = []
|
||||
self.errors = []
|
||||
|
||||
def initialize(self):
|
||||
for name in nm.nm_devices():
|
||||
if nm.nm_device_type_is_ethernet(name):
|
||||
# ignore slaves
|
||||
if nm.nm_device_setting_value(name, "connection", "slave-type"):
|
||||
continue
|
||||
self.supported_devices.append(name)
|
||||
|
||||
EditTUISpoke.initialize(self)
|
||||
if not self.data.network.seen:
|
||||
self._update_network_data()
|
||||
|
||||
@property
|
||||
def completed(self):
|
||||
return (not can_touch_runtime_system("require network connection")
|
||||
or nm.nm_activated_devices())
|
||||
|
||||
@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
|
||||
# Do not display link-local addresses
|
||||
if not addr_str.startswith("fe80:"):
|
||||
msg += _(" IPv6 Address: %(addr)s/%(prefix)d\n") % \
|
||||
{"addr": addr_str, "prefix": prefix}
|
||||
|
||||
dnss_str = ",".join(ipv6config[1])
|
||||
|
||||
return msg
|
||||
|
||||
def refresh(self, args=None):
|
||||
""" Refresh screen. """
|
||||
EditTUISpoke.refresh(self, args)
|
||||
|
||||
# on refresh check if we haven't got hostname from NM on activated
|
||||
# connection (dhcp or DNS)
|
||||
if self.hostname_dialog.value == network.DEFAULT_HOSTNAME:
|
||||
hostname = network.getHostname()
|
||||
network.update_hostname_data(self.data, hostname)
|
||||
self.hostname_dialog.value = self.data.network.hostname
|
||||
|
||||
summary = self._summary_text()
|
||||
self._window += [TextWidget(summary), ""]
|
||||
hostname = _("Hostname: %s\n") % self.data.network.hostname
|
||||
self._window += [TextWidget(hostname), ""]
|
||||
|
||||
# if we have any errors, display them
|
||||
while len(self.errors) > 0:
|
||||
self._window += [TextWidget(self.errors.pop()), ""]
|
||||
|
||||
def _prep(i, w):
|
||||
""" Mangle our text to make it look pretty on screen. """
|
||||
number = TextWidget("%2d)" % (i + 1))
|
||||
return ColumnWidget([(4, [number]), (None, [w])], 1)
|
||||
|
||||
_opts = [_("Set hostname")]
|
||||
for devname in self.supported_devices:
|
||||
_opts.append(_("Configure device %s") % devname)
|
||||
text = [TextWidget(o) for o in _opts]
|
||||
|
||||
# make everything presentable on screen
|
||||
choices = [_prep(i, w) for i, w in enumerate(text)]
|
||||
displayed = ColumnWidget([(78, choices)], 1)
|
||||
self._window.append(displayed)
|
||||
|
||||
return True
|
||||
|
||||
def input(self, args, key):
|
||||
""" Handle the input. """
|
||||
try:
|
||||
num = int(key)
|
||||
except ValueError:
|
||||
return key
|
||||
|
||||
if num == 1:
|
||||
# set hostname
|
||||
self.app.switch_screen_modal(self.hostname_dialog, Entry(_("Hostname"),
|
||||
"hostname", re.compile(".*$"), True))
|
||||
self.apply()
|
||||
return INPUT_PROCESSED
|
||||
elif 2 <= num <= len(self.supported_devices) + 1:
|
||||
# configure device
|
||||
devname = self.supported_devices[num-2]
|
||||
ndata = network.ksdata_from_ifcfg(devname)
|
||||
newspoke = ConfigureNetworkSpoke(self.app, self.data, self.storage,
|
||||
self.payload, self.instclass, ndata)
|
||||
self.app.switch_screen_modal(newspoke)
|
||||
|
||||
if ndata.ip == "dhcp":
|
||||
ndata.bootProto = "dhcp"
|
||||
ndata.ip = ""
|
||||
else:
|
||||
ndata.bootProto = "static"
|
||||
if not ndata.gateway or not ndata.netmask:
|
||||
self.errors.append(_("Configuration not saved: gateway or netmask missing in static configuration"))
|
||||
return INPUT_PROCESSED
|
||||
|
||||
if ndata.ipv6 == "ignore":
|
||||
ndata.noipv6 = True
|
||||
ndata.ipv6 = ""
|
||||
else:
|
||||
ndata.noipv6 = False
|
||||
|
||||
network.update_settings_with_ksdata(devname, ndata)
|
||||
|
||||
if ndata._apply:
|
||||
uuid = nm.nm_device_setting_value(devname, "connection", "uuid")
|
||||
try:
|
||||
nm.nm_activate_device_connection(devname, uuid)
|
||||
except nm.UnmanagedDeviceError:
|
||||
self.errors.append(_("Can't apply configuration, device activation failed."))
|
||||
|
||||
self.apply()
|
||||
return INPUT_PROCESSED
|
||||
else:
|
||||
return key
|
||||
|
||||
def apply(self):
|
||||
" Apply all of our settings."""
|
||||
self._update_network_data()
|
||||
|
||||
def _update_network_data(self):
|
||||
hostname = self.data.network.hostname
|
||||
|
||||
self.data.network.network = []
|
||||
for name in nm.nm_devices():
|
||||
nd = network.ksdata_from_ifcfg(name)
|
||||
if not nd:
|
||||
continue
|
||||
if name in nm.nm_activated_devices():
|
||||
nd.activate = True
|
||||
self.data.network.network.append(nd)
|
||||
|
||||
(valid, error) = network.sanityCheckHostname(self.hostname_dialog.value)
|
||||
if valid:
|
||||
hostname = self.hostname_dialog.value
|
||||
else:
|
||||
self.errors.append(_("Hostname is not valid: %s") % error)
|
||||
self.hostname_dialog.value = hostname
|
||||
network.update_hostname_data(self.data, hostname)
|
||||
|
||||
class Fake_RE_IPV6(object):
|
||||
def __init__(self, allow_prefix=False, whitelist=None):
|
||||
self.whitelist = whitelist or []
|
||||
self.allow_prefix = allow_prefix
|
||||
def match(self, value):
|
||||
if value in self.whitelist:
|
||||
return True
|
||||
addr, _slash, prefix = value.partition("/")
|
||||
if prefix:
|
||||
if not self.allow_prefix:
|
||||
return False
|
||||
try:
|
||||
if not 1 <= int(prefix) <= 128:
|
||||
return False
|
||||
except ValueError:
|
||||
return False
|
||||
return network.check_ip_address(addr, version=6)
|
||||
|
||||
class ConfigureNetworkSpoke(EditTUISpoke):
|
||||
""" Spoke to set various configuration options for net devices. """
|
||||
title = _("Device configuration")
|
||||
category = "network"
|
||||
|
||||
edit_fields = [
|
||||
Entry(_('IPv4 address or %s for DHCP') % '"dhcp"', "ip",
|
||||
re.compile("^" + IPV4_PATTERN_WITHOUT_ANCHORS + "|dhcp$"), True),
|
||||
Entry(_("IPv4 netmask"), "netmask", re.compile("^" + IPV4_PATTERN_WITHOUT_ANCHORS + "$"), True),
|
||||
Entry(_("IPv4 gateway"), "gateway", re.compile("^" + IPV4_PATTERN_WITHOUT_ANCHORS + "$"), True),
|
||||
Entry(_('IPv6 address or %(auto)s for automatic, %(dhcp)s for DHCP, %(ignore)s to turn off')
|
||||
% {"auto": '"auto"', "dhcp": '"dhcp"', "ignore": '"ignore"'}, "ipv6",
|
||||
Fake_RE_IPV6(allow_prefix=True, whitelist=["auto", "dhcp", "ignore"]), True),
|
||||
Entry(_("IPv6 default gateway"), "ipv6gateway", re.compile(".*$"), True),
|
||||
Entry(_("Nameservers (comma separated)"), "nameserver", re.compile(".*$"), True),
|
||||
Entry(_("Connect automatically after reboot"), "onboot", EditTUISpoke.CHECK, True),
|
||||
Entry(_("Apply configuration in installer"), "_apply", EditTUISpoke.CHECK, True),
|
||||
]
|
||||
|
||||
def __init__(self, app, data, storage, payload, instclass, ndata):
|
||||
EditTUISpoke.__init__(self, app, data, storage, payload, instclass)
|
||||
self.args = ndata
|
||||
if self.args.bootProto == "dhcp":
|
||||
self.args.ip = "dhcp"
|
||||
if self.args.noipv6:
|
||||
self.args.ipv6 = "ignore"
|
||||
self.args._apply = False
|
||||
|
||||
def refresh(self, args=None):
|
||||
""" Refresh window. """
|
||||
EditTUISpoke.refresh(self, args)
|
||||
message = _("Configuring device %s." % self.args.device)
|
||||
self._window += [TextWidget(message), ""]
|
||||
return True
|
||||
|
||||
@property
|
||||
def indirect(self):
|
||||
return True
|
||||
|
||||
def apply(self):
|
||||
""" Apply our changes. """
|
||||
# this is done at upper level by updating ifcfg file
|
Loading…
Reference in New Issue
Block a user