#
# netconfig_text.py: Configure a network interface now.
#
# Copyright (C) 2008 Red Hat, Inc.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty 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, see .
#
# Author(s): Chris Lumens
# David Cantrell
#
import isys
import network
from snack import *
from constants_text import *
import gettext
_ = lambda x: gettext.ldgettext("anaconda", x)
class NetworkConfiguratorText:
def _handleIPError(self, field, errmsg):
self.anaconda.intf.messageWindow(_("Error With Data"),
_("An error occurred converting the "
"value entered for \"%s\":\n%s") % (field, errmsg))
def _handleIPMissing(self, field):
self.anaconda.intf.messageWindow(_("Error With Data"),
_("A value is required for the field %s") % field)
def _dhcpToggled(self, *args):
if self.dhcpCheckbox.selected():
self.ipv4Address.setFlags(FLAG_DISABLED, FLAGS_SET)
self.ipv4Netmask.setFlags(FLAG_DISABLED, FLAGS_SET)
self.ipv6Address.setFlags(FLAG_DISABLED, FLAGS_SET)
self.ipv6Netmask.setFlags(FLAG_DISABLED, FLAGS_SET)
self.gatewayEntry.setFlags(FLAG_DISABLED, FLAGS_SET)
self.nameserverEntry.setFlags(FLAG_DISABLED, FLAGS_SET)
else:
self.ipv4Address.setFlags(FLAG_DISABLED, int(self.ipv4Checkbox.selected()))
self.ipv4Netmask.setFlags(FLAG_DISABLED, int(self.ipv4Checkbox.selected()))
self.ipv6Address.setFlags(FLAG_DISABLED, int(self.ipv6Checkbox.selected()))
self.ipv6Netmask.setFlags(FLAG_DISABLED, int(self.ipv6Checkbox.selected()))
self.gatewayEntry.setFlags(FLAG_DISABLED, FLAGS_RESET)
self.nameserverEntry.setFlags(FLAG_DISABLED, FLAGS_RESET)
def _ipv4Toggled(self, *args):
if self.dhcpCheckbox.selected():
return
flag = FLAGS_RESET
if not self.ipv4Checkbox.selected():
flag = FLAGS_SET
self.ipv4Address.setFlags(FLAG_DISABLED, flag)
self.ipv4Netmask.setFlags(FLAG_DISABLED, flag)
def _ipv6Toggled(self, *args):
if self.dhcpCheckbox.selected():
return
flag = FLAGS_RESET
if not self.ipv6Checkbox.selected():
flag = FLAGS_SET
self.ipv6Address.setFlags(FLAG_DISABLED, flag)
self.ipv6Netmask.setFlags(FLAG_DISABLED, flag)
def __init__(self, screen, anaconda):
self.screen = screen
self.anaconda = anaconda
def run(self):
grid = GridFormHelp(self.screen, _("Enable network interface"), "netconfig",
1, 9)
tb = TextboxReflowed(60, _("This requires that you have an active "
"network connection during the installation "
"process. Please configure a network "
"interface."))
grid.add(tb, 0, 0, anchorLeft = 1, padding = (0, 0, 0, 1))
self.interfaceList = CheckboxTree(height=3, scroll=1)
netdevs = self.anaconda.id.network.available()
devs = netdevs.keys()
devs.sort()
for dev in devs:
desc = netdevs[dev].get("desc")
if desc:
desc = "%s - %s" % (dev, desc)
else:
desc = dev
self.interfaceList.append(desc)
grid.add(self.interfaceList, 0, 1, padding = (0, 0, 0, 1))
self.dhcpCheckbox = Checkbox(_("Use dynamic IP configuration (DHCP)"), 1)
grid.add(self.dhcpCheckbox, 0, 2, anchorLeft = 1)
self.ipv4Checkbox = Checkbox(_("Enable IPv4 support"), 1)
grid.add(self.ipv4Checkbox, 0, 3, anchorLeft = 1)
self.ipv6Checkbox = Checkbox(_("Enable IPv6 support"), 0)
grid.add(self.ipv6Checkbox, 0, 4, anchorLeft = 1, padding = (0, 0, 0, 1))
ipv4Grid = Grid(4, 1)
ipv4Grid.setField(Label(_("IPv4 Address:")), 0, 0, padding = (0, 0, 1, 0))
self.ipv4Address = Entry(20, scroll=1)
ipv4Grid.setField(self.ipv4Address, 1, 0)
ipv4Grid.setField(Label("/"), 2, 0)
self.ipv4Netmask = Entry(20, scroll=0)
ipv4Grid.setField(self.ipv4Netmask, 3, 0)
grid.add(ipv4Grid, 0, 5, anchorLeft = 1)
ipv6Grid = Grid(4, 1)
ipv6Grid.setField(Label(_("IPv6 Address:")), 0, 0, padding = (0, 0, 1, 0))
self.ipv6Address = Entry(20, scroll=1)
ipv6Grid.setField(self.ipv6Address, 1, 0)
ipv6Grid.setField(Label("/"), 2, 0)
self.ipv6Netmask = Entry(20, scroll=0)
ipv6Grid.setField(self.ipv6Netmask, 3, 0)
grid.add(ipv6Grid, 0, 6, anchorLeft = 1)
extraGrid = Grid(4, 1)
extraGrid.setField(Label(_("Gateway:")), 0, 0, padding = (0, 0, 1, 0))
self.gatewayEntry = Entry(20, scroll=1)
extraGrid.setField(self.gatewayEntry, 1, 0, padding = (0, 0, 2, 0))
extraGrid.setField(Label(_("Nameserver:")), 2, 0, padding = (0, 0, 1, 0))
self.nameserverEntry = Entry(20, scroll=1)
extraGrid.setField(self.nameserverEntry, 3, 0)
grid.add(extraGrid, 0, 7, anchorLeft = 1)
buttons = ButtonBar(self.screen, [TEXT_OK_BUTTON, TEXT_BACK_BUTTON] )
grid.add(buttons, 0, 8, anchorLeft = 1, growx = 1)
self.dhcpCheckbox.setCallback(self._dhcpToggled)
self.ipv4Checkbox.setCallback(self._ipv4Toggled)
self.ipv6Checkbox.setCallback(self._ipv6Toggled)
# Call these functions to set initial UI state.
self._ipv4Toggled()
self._ipv6Toggled()
while True:
result = grid.run()
if result == TEXT_BACK_BUTTON:
break
cur = self.interfaceList.getCurrent()
if cur:
cur = cur.split()[0]
else:
self.anaconda.intf.messageWindow(_("Missing Device"),
_("You must select a network device"))
continue
netdev = self.anaconda.id.network.available()[cur]
netdev.set(("useipv4", True))
if self.dhcpCheckbox.selected():
netdev.set(("bootproto", "dhcp"))
w = self.anaconda.intf.waitWindow(_("Dynamic IP"),
_("Sending request for IP information "
"for %s...") % netdev.get("device"))
ns = isys.dhcpNetDevice(netdev)
w.pop()
if ns is None:
break
else:
f = open("/etc/resolv.conf", "w")
f.write("nameserver %s\n" % ns)
f.close()
isys.resetResolv()
else:
ipv4addr = self.ipv4Address.value()
ipv4nm = self.ipv4Netmask.value()
gateway = self.gatewayEntry.value()
ns = self.nameserverEntry.value()
try:
network.sanityCheckIPString(ipv4addr)
netdev.set(("ipaddr", ipv4addr))
except network.IPMissing, msg:
self._handleIPMissing(_("IP Address"))
continue
except network.IPError, msg:
self._handleIPError(_("IP Address"), msg)
continue
if ipv4nm.find('.') == -1:
# user provided a CIDR prefix
try:
if int(ipv4nm) > 32 or int(ipv4nm) < 0:
msg = _("IPv4 CIDR prefix must be between 0 and 32.")
self._handleIPError(_("IPv4 Network Mask"), msg)
continue
else:
ipv4nm = isys.prefix2netmask(int(ipv4nm))
netdev.set(("netmask", ipv4nm))
except:
self._handleIPMissing(_("IPv4 Network Mask"))
continue
else:
# user provided a dotted-quad netmask
try:
network.sanityCheckIPString(ipv4nm)
netdev.set(("netmask", ipv4nm))
except network.IPMissing, msg:
self._handleIPMissing(_("IPv4 Network Mask"))
continue
except network.IPError, msg:
self._handleIPError(_("IPv4 Network Mask "), msg)
continue
try:
if gateway:
network.sanityCheckIPString(gateway)
except network.IPMissing, msg:
self._handleIPMissing(_("Gateway"))
continue
except network.IPError, msg:
self._handleIPError(_("Gateway"), msg)
continue
try:
if ns:
network.sanityCheckIPString(ns)
except network.IPError, msg:
self._handleIPError(_("Nameserver"), msg)
continue
try:
isys.configNetDevice(netdev, gateway)
except Exception, e:
import logging
log = logging.getLogger("anaconda")
log.error("Error configuring network device: %s" % e)
self._handleIPError(_("Error configuring network device: "), e)
self.screen.popWindow()
return INSTALL_BACK
if ns:
f = open("/etc/resolv.conf", "w")
f.write("nameserver %s\n" % ns)
f.close()
isys.resetResolv()
isys.setResolvRetry(1)
break
break
self.screen.popWindow()
return INSTALL_OK