#
# network_gui.py: Network configuration dialog
#
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, Red Hat, Inc.
# 2007, 2008, 2009
#
# 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): Michael Fulbright
# David Cantrell
#
import string
from iw_gui import *
import gui
import network
import iutil
import gobject
import subprocess
import gtk
import isys
import urlgrabber.grabber
from constants import *
import gettext
_ = lambda x: gettext.ldgettext("anaconda", x)
class NetworkWindow(InstallWindow):
def getScreen(self, anaconda):
self.intf = anaconda.intf
self.anaconda = anaconda
self.hostname = network.getDefaultHostname(anaconda)
# load the UI
(self.xml, self.align) = gui.getGladeWidget("network.glade",
"network_align")
self.icon = self.xml.get_widget("icon")
self.hostnameEntry = self.xml.get_widget("hostnameEntry")
self.hostnameEntry.set_text(self.hostname)
self.netconfButton = self.xml.get_widget("netconfButton")
self.netconfButton.connect("clicked", self._netconfButton_clicked)
if len(self.anaconda.id.network.netdevices) == 0:
self.netconfButton.set_sensitive(False)
# pressing Enter in confirm == clicking Next
self.hostnameEntry.connect("activate",
lambda w: self.ics.setGrabNext(1))
# load the icon
gui.readImageFromFile("network.png", image=self.icon)
return self.align
def _netconfButton_clicked(self, *args):
setupNetwork(self.intf)
def focus(self):
self.hostnameEntry.grab_focus()
def hostnameError(self):
self.hostnameEntry.grab_focus()
raise gui.StayOnScreen
def getNext(self):
hostname = string.strip(self.hostnameEntry.get_text())
herrors = network.sanityCheckHostname(hostname)
if not hostname:
self.intf.messageWindow(_("Error with Hostname"),
_("You must enter a valid hostname for this "
"computer."), custom_icon="error")
self.hostnameError()
if herrors is not None:
self.intf.messageWindow(_("Error with Hostname"),
_("The hostname \"%(hostname)s\" is not "
"valid for the following reason:\n\n"
"%(herrors)s")
% {'hostname': hostname,
'herrors': herrors},
custom_icon="error")
self.hostnameError()
self.anaconda.id.network.setHostname(hostname)
return None
def setupNetwork(intf):
intf.enableNetwork(just_setup=True)
if network.hasActiveNetDev():
urlgrabber.grabber.reset_curl_obj()
def NMCEExited(pid, condition, anaconda):
if anaconda:
anaconda.intf.icw.window.set_sensitive(True)
# TODORV: get rid of setting sensitive completely?
def runNMCE(anaconda=None, blocking=True):
if not blocking and anaconda:
anaconda.intf.icw.window.set_sensitive(False)
cmd = ["/usr/bin/nm-connection-editor"]
out = open("/dev/tty5", "w")
try:
proc = subprocess.Popen(cmd, stdout=out, stderr=out)
except Exception as e:
if not blocking and anaconda:
anaconda.intf.icw.window.set_sensitive(True)
import logging
log = logging.getLogger("anaconda")
log.error("Could not start nm-connection-editor: %s" % e)
return None
else:
if blocking:
proc.wait()
else:
gobject.child_watch_add(proc.pid, NMCEExited, data=anaconda, priority=gobject.PRIORITY_DEFAULT)
def selectInstallNetDeviceDialog(network, devices = None):
devs = devices or network.netdevices.keys()
if not devs:
return None
devs.sort()
dialog = gtk.Dialog(_("Select network interface"))
dialog.add_button('gtk-cancel', gtk.RESPONSE_CANCEL)
dialog.add_button('gtk-ok', 1)
dialog.set_position(gtk.WIN_POS_CENTER)
gui.addFrame(dialog)
dialog.vbox.pack_start(gui.WrappingLabel(
_("This requires that you have an active "
"network connection during the installation "
"process. Please configure a network interface.")))
combo = gtk.ComboBox()
cell = gtk.CellRendererText()
combo.pack_start(cell, True)
combo.set_attributes(cell, text = 0)
cell.set_property("wrap-width", 525)
combo.set_size_request(480, -1)
store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
combo.set_model(store)
ksdevice = network.getKSDevice()
if ksdevice:
ksdevice = ksdevice.get('DEVICE')
preselected = None
for dev in devices:
i = store.append(None)
if not preselected:
preselected = i
desc = network.netdevices[dev].description
if desc:
desc = "%s - %s" %(dev, desc)
else:
desc = "%s" %(dev,)
hwaddr = network.netdevices[dev].get("HWADDR")
if hwaddr:
desc = "%s - %s" %(desc, hwaddr,)
if ksdevice and ksdevice == dev:
preselected = i
store[i] = (desc, dev)
combo.set_active_iter(preselected)
dialog.vbox.pack_start(combo)
dialog.show_all()
rc = dialog.run()
if rc in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
install_device = None
else:
active = combo.get_active_iter()
install_device = combo.get_model().get_value(active, 1)
dialog.destroy()
return install_device