def writeKS(self, f): devNames = self.netdevices.keys() devNames.sort() if len(devNames) == 0: return for devName in devNames: dev = self.netdevices[devName] line = "network" # split vlanid from device if dev.get("TYPE") == "Vlan": (device, sep, vlanid) = dev.get("DEVICE").rpartition('.') else: device = dev.get("DEVICE") # ipv4 and ipv6 if dev.get("ONBOOT"): line += " --onboot %s" % dev.get("ONBOOT") line += " --device %s" % device if dev.get('MTU') and dev.get('MTU') != "0": line += " --mtu=%s" % dev.get('MTU') # ipv4 if not dev.get('BOOTPROTO'): line += " --noipv4" else: if dev.get('BOOTPROTO').lower() == 'dhcp': line += " --bootproto dhcp" if dev.get('DHCPCLASS'): line += " --dhcpclass %s" % dev.get('DHCPCLASS') elif dev.get('IPADDR'): line += " --bootproto static --ip %s" % dev.get('IPADDR') netmask = dev.get('NETMASK') prefix = dev.get('PREFIX') if not netmask and prefix: netmask = isys.prefix2netmask(int(prefix)) if netmask: line += " --netmask %s" % netmask # note that --gateway is common for ipv4 and ipv6 if dev.get('GATEWAY'): line += " --gateway %s" % dev.get('GATEWAY') # ipv6 if (not dev.get('IPV6INIT') or dev.get('IPV6INIT') == "no"): line += " --noipv6" else: if dev.get('IPV6_AUTOCONF') == "yes": line += " --ipv6 auto" else: if dev.get('IPV6ADDR'): line += " --ipv6 %s" % dev.get('IPV6ADDR') if dev.get('IPV6_DEFAULTGW'): line += " --ipv6gateway %s" % dev.get('IPV6_DEFAULTGW') if dev.get('DHCPV6') == "yes": line += " --ipv6 dhcp" # ipv4 and ipv6 dnsline = '' for key in dev.info.keys(): if key.upper().startswith('DNS'): if dnsline == '': dnsline = dev.get(key) else: dnsline += "," + dev.get(key) if dnsline: line += " --nameserver %s" % dnsline if dev.get("ETHTOOL_OPTS"): line += " --ethtool %s" % dev.get("ETHTOOL_OPTS") # hostname if (self.overrideDHCPhostname or (dev.get('BOOTPROTO') and dev.get('BOOTPROTO').lower() != "dhcp")): if (self.hostname and self.hostname != "localhost.localdomain"): line += " --hostname %s" % self.hostname # vlanid if dev.get("TYPE") == "Vlan": line += " --vlanid %s" % vlanid line += "\n" f.write(line)
def dracutSetupArgs(self, networkStorageDevice): netargs=set() if networkStorageDevice.nic == "default" or ":" in networkStorageDevice.nic: nic = ifaceForHostIP(networkStorageDevice.host_address) if not nic: return "" else: nic = networkStorageDevice.nic if nic not in self.netdevices.keys(): log.error('Unknown network interface: %s' % nic) return "" dev = self.netdevices[nic] if dev.get('BOOTPROTO') == 'ibft': netargs.add("ip=ibft") elif networkStorageDevice.host_address: if self.hostname: hostname = self.hostname else: hostname = "" # if using ipv6 if ':' in networkStorageDevice.host_address: if dev.get('DHCPV6C') == "yes": # XXX combination with autoconf not yet clear, # support for dhcpv6 is not yet implemented in NM/ifcfg-rh netargs.add("ip=%s:dhcp6" % nic) elif dev.get('IPV6_AUTOCONF') == "yes": netargs.add("ip=%s:auto6" % nic) elif dev.get('IPV6ADDR'): ipaddr = "[%s]" % dev.get('IPV6ADDR') if dev.get('IPV6_DEFAULTGW'): gateway = "[%s]" % dev.get('IPV6_DEFAULTGW') else: gateway = "" netargs.add("ip=%s::%s:%s:%s:%s:none" % (ipaddr, gateway, dev.get('PREFIX'), hostname, nic)) else: if dev.get('bootproto').lower() == 'dhcp': netargs.add("ip=%s:dhcp" % nic) else: if dev.get('GATEWAY'): gateway = dev.get('GATEWAY') else: gateway = "" netmask = dev.get('netmask') prefix = dev.get('prefix') if not netmask and prefix: netmask = isys.prefix2netmask(int(prefix)) netargs.add("ip=%s::%s:%s:%s:%s:none" % (dev.get('ipaddr'), gateway, netmask, hostname, nic)) hwaddr = dev.get("HWADDR") if hwaddr: netargs.add("ifname=%s:%s" % (nic, hwaddr.lower())) nettype = dev.get("NETTYPE") subchannels = dev.get("SUBCHANNELS") if iutil.isS390() and nettype and subchannels: znet = "rd_ZNET=%s,%s" % (nettype, subchannels) options = dev.get("OPTIONS").strip("'\"") if options: options = filter(lambda x: x != '', options.split(' ')) znet += ",%s" % (','.join(options)) netargs.add(znet) return netargs
class NetworkConfigurator: def __init__(self, network): (xml, w) = gui.getGladeWidget("netconfig.glade", "NetworkConfigWindow") self.window = w self.network = network self.xml = xml self.rc = gtk.RESPONSE_CANCEL self._setSizeGroup() self._connectSignals() self._populateNetdevs() self.xml.get_widget("ipv4Checkbutton").set_active(True) self.xml.get_widget("ipv6Checkbutton").set_active(False) def _connectSignals(self): sigs = { "on_ipv4Checkbutton_toggled": self._ipv4Toggled, "on_ipv6Checkbutton_toggled": self._ipv6Toggled, "on_dhcpCheckbutton_toggled": self._dhcpToggled, "on_interfaceCombo_changed": self._netdevChanged, "on_cancelButton_clicked": self._cancel, "on_okButton_clicked": self._ok } self.xml.signal_autoconnect(sigs) def _setSizeGroup(self): # too bad we can't do this in the glade file sg = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) for w in ("nameserverLabel", "gatewayLabel", "ipv6Label", "ipv4Label", "interfaceLabel"): sg.add_widget(self.xml.get_widget(w)) def _netdevChanged(self, combo): active = combo.get_active_iter() val = combo.get_model().get_value(active, 1) netdev = self.network.available()[val] bootproto = netdev.get("BOOTPROTO") if not bootproto or bootproto == "dhcp" or bootproto == "ibft": self.xml.get_widget("dhcpCheckbutton").set_active(True) else: self.xml.get_widget("dhcpCheckbutton").set_active(False) # FIXME: need to set ipv6 here too once we have that try: if netdev.get('IPADDR'): self.xml.get_widget("ipv4Address").set_text(netdev.get('IPADDR')) except: pass try: if netdev.get('NETMASK'): self.xml.get_widget("ipv4Netmask").set_text(netdev.get('NETMASK')) except: pass try: if self.network.gateway: self.xml.get_widget("gatewayEntry").set_text(self.network.gateway) except: pass try: if self.network.primaryNS: self.xml.get_widget("nameserverEntry").set_text(self.network.primaryNS) except: pass def _ipv4Toggled(self, cb): if self.xml.get_widget("dhcpCheckbutton").get_active(): return if cb.get_active(): self.xml.get_widget("ipv4Box").set_sensitive(True) else: self.xml.get_widget("ipv4Box").set_sensitive(False) def _ipv6Toggled(self, cb): if self.xml.get_widget("dhcpCheckbutton").get_active(): return if cb.get_active(): self.xml.get_widget("ipv6Box").set_sensitive(True) else: self.xml.get_widget("ipv6Box").set_sensitive(False) def _dhcpToggled(self, cb): boxes = ("ipv4Box", "ipv6Box", "nameserverBox", "gatewayBox") if not cb.get_active(): map(lambda x: self.xml.get_widget(x).set_sensitive(True), boxes) self.xml.get_widget("ipv4Box").set_sensitive(self.xml.get_widget("ipv4Checkbutton").get_active()) self.xml.get_widget("ipv6Box").set_sensitive(self.xml.get_widget("ipv6Checkbutton").get_active()) else: map(lambda x: self.xml.get_widget(x).set_sensitive(False), boxes) def _populateNetdevs(self): combo = self.xml.get_widget("interfaceCombo") 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) netdevs = self.network.available() devs = netdevs.keys() devs.sort() ksdevice = self.network.getKSDevice() if ksdevice: ksdevice = ksdevice.get('DEVICE') selected_interface = None for dev in devs: i = store.append(None) hwaddr = netdevs[dev].get("HWADDR") if hwaddr: desc = "%s - %s" %(dev, hwaddr,) else: desc = "%s" %(dev,) if selected_interface is None: selected_interface = i if ksdevice and ksdevice == dev: selected_interface = i store[i] = (desc, dev) if selected_interface: combo.set_active_iter(selected_interface) else: combo.set_active(0) def run(self): gui.addFrame(self.window) busycursor = gui.getBusyCursorStatus() gui.setCursorToNormal() self.window.show() while True: rc = self.window.run() if rc in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]: self._cancel() break if self._ok(): break # restore busy cursor if busycursor: gui.setCursorToBusy() return self.rc def destroy(self): self.window.destroy() def _handleIPError(self, field, errmsg): d = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("An error occurred converting the value " "entered for \"%(field)s\":\n%(errmsg)s") % {'field': field, 'errmsg': errmsg}) d.set_title(_("Error With Data")) d.set_position(gtk.WIN_POS_CENTER) gui.addFrame(d) d.run() d.destroy() def _handleIPMissing(self, field): d = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("A value is required for the field %s.") % (field,)) d.set_title(_("Error With Data")) d.set_position(gtk.WIN_POS_CENTER) gui.addFrame(d) d.run() d.destroy() def _handleNetworkError(self, field): d = gtk.MessageDialog(None, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("An error occurred trying to bring up the " "%s network interface.") % (field,)) d.set_title(_("Error Configuring Network")) d.set_position(gtk.WIN_POS_CENTER) gui.addFrame(d) d.run() d.destroy() def _cancel(self, *args): self.rc = gtk.RESPONSE_CANCEL def _ok(self, *args): self.rc = gtk.RESPONSE_OK haveNet = False combo = self.xml.get_widget("interfaceCombo") active = combo.get_active_iter() val = combo.get_model().get_value(active, 1) for v, dev in self.network.available().items(): if v == val: dev.set(('ONBOOT', 'yes')) netdev = dev else: dev.set(('ONBOOT', 'no')) # FIXME: need to do input validation if self.xml.get_widget("dhcpCheckbutton").get_active(): netdev.set(('BOOTPROTO', 'dhcp')) self.window.hide() w = gui.WaitWindow(_("Dynamic IP Address"), _("Sending request for IP address information " "for %s") % (netdev.get('DEVICE'),)) haveNet = self.network.bringUp(devices=[netdev]) w.pop() else: netdev.set(('BOOTPROTO', 'static')) ipv4addr = self.xml.get_widget("ipv4Address").get_text() ipv4nm = self.xml.get_widget("ipv4Netmask").get_text() gateway = self.xml.get_widget("gatewayEntry").get_text() ns = self.xml.get_widget("nameserverEntry").get_text() try: network.sanityCheckIPString(ipv4addr) netdev.set(('IPADDR', ipv4addr)) except network.IPMissing, msg: self._handleIPMissing(_("IP Address")) return False except network.IPError, msg: self._handleIPError(_("IP Address"), msg) return False 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) return False else: ipv4nm = isys.prefix2netmask(int(ipv4nm)) netdev.set(('NETMASK', ipv4nm)) except: self._handleIPMissing(_("IPv4 Network Mask")) return False else: # user provided a dotted-quad netmask try: network.sanityCheckIPString(ipv4nm) netdev.set(('NETMASK', ipv4nm)) except network.IPMissing, msg: self._handleIPMissing(_("IPv4 Network Mask")) return False except network.IPError, msg: self._handleIPError(_("IPv4 Network Mask"), msg) return False
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.network.available() devs = netdevs.keys() devs.sort() ksdevice = self.anaconda.network.getKSDevice() if ksdevice: ksdevice = ksdevice.get('DEVICE') selected_interface = None for dev in devs: hwaddr = netdevs[dev].get("HWADDR") if hwaddr: desc = "%s - %.50s" % (dev, hwaddr) else: desc = dev if selected_interface is None: selected_interface = desc if ksdevice and ksdevice == dev: selected_interface = desc self.interfaceList.append(desc) if selected_interface: self.interfaceList.setCurrent(selected_interface) else: self.interfaceList.setCurrent(0) 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() self._dhcpToggled() netdevs = self.anaconda.network.available() while True: result = grid.run() button = buttons.buttonPressed(result) if button == TEXT_BACK_CHECK: self.screen.popWindow() return INSTALL_BACK selected = map(lambda x: x.split()[0], self.interfaceList.getSelection()) if selected is None or selected == []: self.anaconda.intf.messageWindow( _("Missing Device"), _("You must select a network device")) continue for name, dev in netdevs.items(): if name in selected: dev.set(('ONBOOT', 'yes')) else: dev.set(('ONBOOT', 'no')) selected_netdevs = [] for devname in selected: if not netdevs.has_key(devname): continue netdev = netdevs[devname] selected_netdevs.append(netdev) netdev.set(("ONBOOT", "yes")) if self.dhcpCheckbox.selected(): netdev.set(("BOOTPROTO", "dhcp")) else: netdev.set(("BOOTPROTO", "static")) 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
def dracutSetupString(self, networkStorageDevice): netargs = "" if networkStorageDevice.nic: # Storage bound to a specific nic (ie FCoE) nic = networkStorageDevice.nic else: # Storage bound through ip, find out which interface leads to host nic = ifaceForHostIP(networkStorageDevice.host_address) if not nic: return "" if nic not in self.netdevices.keys(): log.error('Unknown network interface: %s' % nic) return "" dev = self.netdevices[nic] if dev.get('BOOTPROTO') == 'ibft': netargs += "ip=ibft" elif networkStorageDevice.host_address: if self.hostname: hostname = self.hostname else: hostname = "" # if using ipv6 if ':' in networkStorageDevice.host_address: if dev.get('DHCPV6C') == "yes": # XXX combination with autoconf not yet clear, # support for dhcpv6 is not yet implemented in NM/ifcfg-rh netargs += "ip=%s:dhcp6" % nic elif dev.get('IPV6_AUTOCONF') == "yes": netargs += "ip=%s:auto6" % nic elif dev.get('IPV6ADDR'): ipaddr = "[%s]" % dev.get('IPV6ADDR') if dev.get('IPV6_DEFAULTGW'): gateway = "[%s]" % dev.get('IPV6_DEFAULTGW') else: gateway = "" netargs += "ip=%s::%s:%s:%s:%s:none" % ( ipaddr, gateway, dev.get('PREFIX'), hostname, nic) else: if dev.get('bootproto').lower() == 'dhcp': netargs += "ip=%s:dhcp" % nic else: if dev.get('GATEWAY'): gateway = dev.get('GATEWAY') else: gateway = "" netmask = dev.get('netmask') prefix = dev.get('prefix') if not netmask and prefix: netmask = isys.prefix2netmask(int(prefix)) netargs += "ip=%s::%s:%s:%s:%s:none" % ( dev.get('ipaddr'), gateway, netmask, hostname, nic) hwaddr = dev.get("HWADDR") if hwaddr: if netargs != "": netargs += " " netargs += "ifname=%s:%s" % (nic, hwaddr.lower()) nettype = dev.get("NETTYPE") subchannels = dev.get("SUBCHANNELS") if iutil.isS390() and nettype and subchannels: if netargs != "": netargs += " " netargs += "rd_ZNET=%s,%s" % (nettype, subchannels) options = dev.get("OPTIONS").strip("'\"") if options: options = filter(lambda x: x != '', options.split(' ')) netargs += ",%s" % (','.join(options)) return netargs
def writeKS(self, f): devNames = self.netdevices.keys() devNames.sort() if len(devNames) == 0: return for devName in devNames: dev = self.netdevices[devName] line = "network" # ipv4 and ipv6 if dev.get("ONBOOT"): line += " --onboot %s" % dev.get("ONBOOT") line += " --device %s" % dev.get("DEVICE") if dev.get('MTU') and dev.get('MTU') != "0": line += " --mtu=%s" % dev.get('MTU') # ipv4 if not dev.get('BOOTPROTO'): line += " --noipv4" else: if dev.get('BOOTPROTO').lower() == 'dhcp': line += " --bootproto dhcp" if dev.get('DHCPCLASS'): line += " --dhcpclass %s" % dev.get('DHCPCLASS') elif dev.get('IPADDR'): line += " --bootproto static --ip %s" % dev.get('IPADDR') netmask = dev.get('NETMASK') prefix = dev.get('PREFIX') if not netmask and prefix: netmask = isys.prefix2netmask(int(prefix)) if netmask: line += " --netmask %s" % netmask # note that --gateway is common for ipv4 and ipv6 if dev.get('GATEWAY'): line += " --gateway %s" % dev.get('GATEWAY') # ipv6 if (not dev.get('IPV6INIT') or dev.get('IPV6INIT') == "no"): line += " --noipv6" else: if dev.get('IPV6_AUTOCONF') == "yes": line += " --ipv6 auto" else: if dev.get('IPV6ADDR'): line += " --ipv6 %s" % dev.get('IPV6ADDR') if dev.get('IPV6_DEFAULTGW'): line += " --gateway %s" % dev.get('IPV6_DEFAULTGW') if dev.get('DHCPV6') == "yes": line += " --ipv6 dhcp" # ipv4 and ipv6 dnsline = '' for key in dev.info.keys(): if key.upper().startswith('DNS'): if dnsline == '': dnsline = dev.get(key) else: dnsline += "," + dev.get(key) if dnsline: line += " --nameserver %s" % dnsline if dev.get("ETHTOOL_OPTS"): line += " --ethtool %s" % dev.get("ETHTOOL_OPTS") # hostname if (self.overrideDHCPhostname or (dev.get('BOOTPROTO') and dev.get('BOOTPROTO').lower() != "dhcp")): if (self.hostname and self.hostname != "localhost.localdomain"): line += " --hostname %s" % self.hostname line += "\n" f.write(line)
def writeKS(self, f): devNames = self.netdevices.keys() devNames.sort() if len(devNames) == 0: return for devName in devNames: dev = self.netdevices[devName] line = "network" # split vlanid from device if dev.get("TYPE") == "Vlan": (device, sep, vlanid) = dev.get("DEVICE").rpartition('.') else: device = dev.get("DEVICE") # ipv4 and ipv6 if dev.get("ONBOOT"): line += " --onboot %s" % dev.get("ONBOOT") line += " --device %s" % device if dev.get('MTU') and dev.get('MTU') != "0": line += " --mtu=%s" % dev.get('MTU') # ipv4 if not dev.get('BOOTPROTO'): line += " --noipv4" else: if dev.get('BOOTPROTO').lower() == 'dhcp': line += " --bootproto dhcp" if dev.get('DHCPCLASS'): line += " --dhcpclass %s" % dev.get('DHCPCLASS') elif dev.get('IPADDR'): line += " --bootproto static --ip %s" % dev.get('IPADDR') netmask = dev.get('NETMASK') prefix = dev.get('PREFIX') if not netmask and prefix: netmask = isys.prefix2netmask(int(prefix)) if netmask: line += " --netmask %s" % netmask # note that --gateway is common for ipv4 and ipv6 if dev.get('GATEWAY'): line += " --gateway %s" % dev.get('GATEWAY') # ipv6 if (not dev.get('IPV6INIT') or dev.get('IPV6INIT') == "no"): line += " --noipv6" else: if dev.get('IPV6_AUTOCONF') == "yes": line += " --ipv6 auto" else: if dev.get('IPV6ADDR'): line += " --ipv6 %s" % dev.get('IPV6ADDR') if dev.get('IPV6_DEFAULTGW'): line += " --ipv6gateway %s" % dev.get('IPV6_DEFAULTGW') if dev.get('DHCPV6') == "yes": line += " --ipv6 dhcp" # ipv4 and ipv6 dnsline = '' for key in dev.info.keys(): if key.upper().startswith('DNS'): if dnsline == '': dnsline = dev.get(key) else: dnsline += "," + dev.get(key) if dnsline: line += " --nameserver %s" % dnsline if dev.get("ETHTOOL_OPTS"): line += " --ethtool %s" % dev.get("ETHTOOL_OPTS") # hostname if (self.overrideDHCPhostname or (dev.get('BOOTPROTO') and dev.get('BOOTPROTO').lower() != "dhcp")): if (self.hostname and self.hostname != "localhost.localdomain"): line += " --hostname %s" % self.hostname # vlanid if dev.get("TYPE") == "Vlan": line += " --vlanid %s" % vlanid # bonding if dev.get('TYPE') == "Bond": slaves = [dname for dname, d in self.netdevices.items() if d.get('MASTER') == devName] line += " --bondslaves %s" % ",".join(slaves) bondopts = dev.get('BONDING_OPTS').split() separator = "," if all(',' not in opt for opt in bondopts) else ";" line += " --bondopts %s" % separator.join(bondopts) if dev.get("DOMAIN"): line += " --domain %s" % dev.get("DOMAIN") line += "\n" f.write(line)
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.network.available() devs = netdevs.keys() devs.sort() ksdevice = self.anaconda.network.getKSDevice() if ksdevice: ksdevice = ksdevice.get('DEVICE') selected_interface = None for dev in devs: hwaddr = netdevs[dev].get("HWADDR") if hwaddr: desc = "%s - %.50s" % (dev, hwaddr) else: desc = dev if selected_interface is None: selected_interface = desc if ksdevice and ksdevice == dev: selected_interface = desc self.interfaceList.append(desc) if selected_interface: self.interfaceList.setCurrent(selected_interface) else: self.interfaceList.setCurrent(0) 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() self._dhcpToggled() netdevs = self.anaconda.network.available() while True: result = grid.run() button = buttons.buttonPressed(result) if button == TEXT_BACK_CHECK: self.screen.popWindow() return INSTALL_BACK selected = map(lambda x: x.split()[0], self.interfaceList.getSelection()) if selected is None or selected == []: self.anaconda.intf.messageWindow(_("Missing Device"), _("You must select a network device")) continue for name, dev in netdevs.items(): if name in selected: dev.set(('ONBOOT', 'yes')) else: dev.set(('ONBOOT', 'no')) selected_netdevs = [] for devname in selected: if not netdevs.has_key(devname): continue netdev = netdevs[devname] selected_netdevs.append(netdev) netdev.set(("ONBOOT", "yes")) if self.dhcpCheckbox.selected(): netdev.set(("BOOTPROTO", "dhcp")) else: netdev.set(("BOOTPROTO", "static")) 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
class NetworkConfigurator: def __init__(self, network): (xml, w) = gui.getGladeWidget("netconfig.glade", "NetworkConfigWindow") self.window = w self.network = network self.xml = xml self.rc = gtk.RESPONSE_CANCEL self._setSizeGroup() self._connectSignals() self._populateNetdevs() self.xml.get_widget("ipv4Checkbutton").set_active(True) self.xml.get_widget("ipv6Checkbutton").set_active(False) def _connectSignals(self): sigs = { "on_ipv4Checkbutton_toggled": self._ipv4Toggled, "on_ipv6Checkbutton_toggled": self._ipv6Toggled, "on_dhcpCheckbutton_toggled": self._dhcpToggled, "on_interfaceCombo_changed": self._netdevChanged, "on_cancelButton_clicked": self._cancel, "on_okButton_clicked": self._ok } self.xml.signal_autoconnect(sigs) def _setSizeGroup(self): # too bad we can't do this in the glade file sg = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) for w in ("nameserverLabel", "gatewayLabel", "ipv6Label", "ipv4Label", "interfaceLabel"): sg.add_widget(self.xml.get_widget(w)) def _netdevChanged(self, combo): active = combo.get_active_iter() val = combo.get_model().get_value(active, 1) netdev = self.network.available()[val] bootproto = netdev.get("bootproto") if not bootproto or bootproto == "dhcp" or bootproto == "ibft": self.xml.get_widget("dhcpCheckbutton").set_active(True) else: self.xml.get_widget("dhcpCheckbutton").set_active(False) # FIXME: need to set ipv6 here too once we have that if netdev.get("ipaddr"): self.xml.get_widget("ipv4Address").set_text( netdev.get("ipaddr")) if netdev.get("netmask"): self.xml.get_widget("ipv4Netmask").set_text( netdev.get("netmask")) if self.network.gateway: self.xml.get_widget("gatewayEntry").set_text( self.network.gateway) if self.network.primaryNS: self.xml.get_widget("nameserverEntry").set_text( self.network.primaryNS) def _ipv4Toggled(self, cb): if self.xml.get_widget("dhcpCheckbutton").get_active(): return if cb.get_active(): self.xml.get_widget("ipv4Box").set_sensitive(True) else: self.xml.get_widget("ipv4Box").set_sensitive(False) def _ipv6Toggled(self, cb): if self.xml.get_widget("dhcpCheckbutton").get_active(): return if cb.get_active(): self.xml.get_widget("ipv6Box").set_sensitive(True) else: self.xml.get_widget("ipv6Box").set_sensitive(False) def _dhcpToggled(self, cb): boxes = ("ipv4Box", "ipv6Box", "nameserverBox", "gatewayBox") if not cb.get_active(): map(lambda x: self.xml.get_widget(x).set_sensitive(True), boxes) self.xml.get_widget("ipv4Box").set_sensitive( self.xml.get_widget("ipv4Checkbutton").get_active()) self.xml.get_widget("ipv6Box").set_sensitive( self.xml.get_widget("ipv6Checkbutton").get_active()) else: map(lambda x: self.xml.get_widget(x).set_sensitive(False), boxes) def _populateNetdevs(self): combo = self.xml.get_widget("interfaceCombo") 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) netdevs = self.network.available() devs = netdevs.keys() devs.sort() for dev in devs: i = store.append(None) desc = netdevs[dev].get("desc") if desc: desc = "%s - %s" % (dev, desc) else: desc = "%s" % (dev, ) store[i] = (desc, dev) if dev == self.network.firstnetdevice: combo.set_active_iter(i) def run(self): gui.addFrame(self.window) self.window.show() gtk.main() return self.rc def destroy(self): self.window.destroy() def _handleIPMissing(self, field): d = gtk.MessageDialog( _("Error With Data"), 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("A value is required for the field %s.") % (field, )) d.run() d.destroy() def _handleIPError(self, field, errmsg): d = gtk.MessageDialog( _("Error With Data"), 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("An error occurred converting the value " "entered for \"%s\":\n%s") % (field, errmsg)) d.run() d.destroy() def _cancel(self, *args): gtk.main_quit() self.rc = gtk.RESPONSE_CANCEL def _ok(self, *args): combo = self.xml.get_widget("interfaceCombo") active = combo.get_active_iter() val = combo.get_model().get_value(active, 1) netdev = self.network.available()[val] # FIXME: need to do input validation if self.xml.get_widget("dhcpCheckbutton").get_active(): self.window.hide() w = gui.WaitWindow( _("Dynamic IP"), _("Sending request for IP information " "for %s...") % (netdev.get("device"))) ns = isys.dhcpNetDevice(netdev.get("device")) w.pop() if ns is not None: self.rc = gtk.RESPONSE_OK if ns: f = open("/etc/resolv.conf", "w") f.write("nameserver %s\n" % ns) f.close() isys.resetResolv() else: ipv4addr = self.xml.get_widget("ipv4Address").get_text() ipv4nm = self.xml.get_widget("ipv4Netmask").get_text() gateway = self.xml.get_widget("gatewayEntry").get_text() ns = self.xml.get_widget("nameserverEntry").get_text() try: network.sanityCheckIPString(ipv4addr) except network.IPMissing, msg: self._handleIPMissing(_("IP Address")) return except network.IPError, msg: self._handleIPError(_("IP Address"), msg) return 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) return else: ipv4nm = isys.prefix2netmask(int(ipv4nm)) netdev.set(('netmask', ipv4nm)) except: self._handleIPMissing(_("IPv4 Network Mask")) return else: # user provided a dotted-quad netmask try: network.sanityCheckIPString(ipv4nm) netdev.set(('netmask', ipv4nm)) except network.IPMissing, msg: self._handleIPMissing(_("IPv4 Network Mask")) return except network.IPError, msg: self._handleIPError(_("IPv4 Network Mask"), msg) return