コード例 #1
0
ファイル: network.py プロジェクト: 274914765/python
    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)
コード例 #2
0
ファイル: network.py プロジェクト: 274914765/python
    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
コード例 #3
0
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
コード例 #4
0
    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
コード例 #5
0
ファイル: network.py プロジェクト: icomfort/anaconda
    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
コード例 #6
0
ファイル: network.py プロジェクト: icomfort/anaconda
    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)
コード例 #7
0
ファイル: network.py プロジェクト: liu-weifeng/myAnaconda
    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)
コード例 #8
0
    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
コード例 #9
0
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