Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 155632 Details for
Bug 213110
stage 2 netconfig needs to be orthogonal for IP stacks
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
anaconda-RHEL-5-orthogonal-stage2-netconfig.patch
anaconda-RHEL-5-orthogonal-stage2-netconfig.patch (text/plain), 114.15 KB, created by
David Cantrell
on 2007-05-29 21:07:52 UTC
(
hide
)
Description:
anaconda-RHEL-5-orthogonal-stage2-netconfig.patch
Filename:
MIME Type:
Creator:
David Cantrell
Created:
2007-05-29 21:07:52 UTC
Size:
114.15 KB
patch
obsolete
>? loader2/initrd.img >? loader2/loader.c.NEW >Index: network.py >=================================================================== >RCS file: /usr/local/CVS/anaconda/network.py,v >retrieving revision 1.88.4.7 >diff -u -p -r1.88.4.7 network.py >--- network.py 15 May 2007 20:14:19 -0000 1.88.4.7 >+++ network.py 29 May 2007 21:01:02 -0000 >@@ -124,33 +124,35 @@ class NetworkDevice(SimpleConfigFile): > keys = self.info.keys() > keys.sort() > keys.remove("DEVICE") >- if "DESC" in keys: >- keys.remove("DESC") >+ if "DESC" in keys: >+ keys.remove("DESC") > if "KEY" in keys: > keys.remove("KEY") > >- # Don't let onboot be turned on unless we have config information >- # to go along with it >- if self.get('bootproto').lower() != 'dhcp' and not self.get('ipaddr'): >- forceOffOnBoot = 1 >- else: >- forceOffOnBoot = 0 >+ # Don't let onboot be turned on unless we have config information >+ # to go along with it >+ if self.get('bootproto').lower() != 'dhcp' and not self.get('ipaddr'): >+ forceOffOnBoot = 1 >+ else: >+ forceOffOnBoot = 0 > >- onBootWritten = 0 >+ onBootWritten = 0 > for key in keys: >- if key == 'ONBOOT' and forceOffOnBoot: >- s = s + key + "=" + 'no' + "\n" >+ if key in ("USEIPV4", "USEIPV6"): # XXX: these are per-device, but not written out >+ continue >+ if key == 'ONBOOT' and forceOffOnBoot: >+ s = s + key + "=" + 'no' + "\n" > # make sure we include autoneg in the ethtool line > elif key == 'ETHTOOL_OPTS' and self.info[key].find("autoneg")== -1: > s = s + key + """="autoneg off %s"\n""" % (self.info[key]) >- elif self.info[key] is not None: >- s = s + key + "=" + self.info[key] + "\n" >+ elif self.info[key] is not None: >+ s = s + key + "=" + self.info[key] + "\n" > >- if key == 'ONBOOT': >- onBootWritten = 1 >+ if key == 'ONBOOT': >+ onBootWritten = 1 > >- if not onBootWritten: >- s = s + 'ONBOOT=no\n' >+ if not onBootWritten: >+ s = s + 'ONBOOT=no\n' > > return s > >@@ -172,8 +174,6 @@ class Network: > self.domains = [] > self.isConfigured = 0 > self.hostname = "localhost.localdomain" >- self.useIPv4 = flags.useIPv4 >- self.useIPv6 = flags.useIPv6 > > # if we specify a hostname and are using dhcp, do an override > # originally used by the gui but overloaded now >@@ -207,6 +207,10 @@ class Network: > "OPTIONS", "ARP"): > if info.has_key(key): > self.netdevices [info["DEVICE"]].set((key, info[key])) >+ >+ self.netdevices [info["DEVICE"]].set(('useIPv4', flags.useIPv4)) >+ self.netdevices [info["DEVICE"]].set(('useIPv6', flags.useIPv6)) >+ > if info.has_key("GATEWAY"): > self.gateway = info["GATEWAY"] > if info.has_key("DOMAIN"): >@@ -215,9 +219,9 @@ class Network: > self.hostname = info["HOSTNAME"] > if not info.has_key("BOOTPROTO"): > if not info.has_key("IPADDR"): >- self.useIPv4 = False >- if not info.has_key("IPV6ADDR"): >- self.useIPv6 = False >+ self.netdevices [info["DEVICE"]].set(('useIPv4', False)) >+ if not (info.has_key("IPV6ADDR") and info.has_key("IPV6_AUTOCONF")): >+ self.netdevices [info["DEVICE"]].set(('useIPv6', False)) > > try: > f = open("/etc/resolv.conf", "r") >@@ -436,6 +440,7 @@ class Network: > iutil.mkdirChain("%s/etc/sysconfig/network-scripts" %(instPath,)) > > # /etc/sysconfig/network-scripts/ifcfg-* >+ useIPv6 = False > for dev in self.netdevices.values(): > device = dev.get("device") > fn = "%s/etc/sysconfig/network-scripts/ifcfg-%s" % (instPath, >@@ -467,12 +472,15 @@ class Network: > f.write("KEY=%s\n" % dev.get('key')) > f.close() > >+ if dev.get("useIPv6"): >+ useIPv6 = True >+ > # /etc/sysconfig/network > > f = open(instPath + "/etc/sysconfig/network", "w") > f.write("NETWORKING=yes\n") > f.write("NETWORKING_IPV6=") >- f.write("%s\n" % self.useIPv6 and "yes" or "no") >+ f.write("%s\n" % useIPv6 and "yes" or "no") > f.write("HOSTNAME=") > > # use instclass hostname if set(kickstart) to override >Index: iw/network_gui.py >=================================================================== >RCS file: /usr/local/CVS/anaconda/iw/network_gui.py,v >retrieving revision 1.103.4.1 >diff -u -p -r1.103.4.1 network_gui.py >--- iw/network_gui.py 28 Nov 2006 21:25:49 -0000 1.103.4.1 >+++ iw/network_gui.py 29 May 2007 21:01:02 -0000 >@@ -27,17 +27,6 @@ import checklist > global_options = [_("Gateway"), _("Primary DNS"), _("Secondary DNS")] > global_option_labels = [_("_Gateway"), _("_Primary DNS"), _("_Secondary DNS")] > >-descr = { 'ipaddr': 'IPv4 address', >- 'netmask': 'IPv4 network mask', >- 'remip': 'point-to-point IP address', >- 'ipv6addr': 'IPv6 address' >- } >- >-# order to check input values >-checkorder = ['ipaddr', 'netmask', 'ipv6addr', 'ipv6prefix', >- 'remip', 'essid', 'key' >- ] >- > class NetworkWindow(InstallWindow): > windowTitle = N_("Network Configuration") > >@@ -45,7 +34,6 @@ class NetworkWindow(InstallWindow): > InstallWindow.__init__(self, ics) > > def getNext(self): >- > if self.getNumberActiveDevices() == 0: > rc = self.handleNoActiveDevices() > if not rc: >@@ -127,13 +115,6 @@ class NetworkWindow(InstallWindow): > > return None > >- def onBootToggled(self, widget, dev): >- if widget.get_active(): >- onboot = "yes" >- else: >- onboot = "no" >- dev.set(("ONBOOT", onboot)) >- > def setHostOptionsSensitivity(self): > # figure out if they have overridden using dhcp for hostname > if self.anyUsingDHCP(): >@@ -170,21 +151,11 @@ class NetworkWindow(InstallWindow): > _("The hostname \"%s\" is not valid for the following reason:\n\n%s") % (hostname, error)) > > def handleIPMissing(self, field): >- try: >- newfield = descr[field] >- except: >- newfield = field >- > self.intf.messageWindow(_("Error With Data"), >- _("A value is required for the field %s.") % (newfield,)) >+ _("A value is required for the field %s.") % (field,)) > > def handleIPError(self, field, msg): >- try: >- newfield = descr[field] >- except: >- newfield = field >- >- self.intf.messageWindow(_("Error With %s Data") % (newfield,), >+ self.intf.messageWindow(_("Error With %s Data") % (field,), > _("%s") % msg.__str__()) > > def handleBroadCastError(self): >@@ -196,421 +167,154 @@ class NetworkWindow(InstallWindow): > return self.intf.messageWindow(_("Error With Data"), _("You have no active network devices. Your system will not be able to communicate over a network by default without at least one device active."), type="custom", custom_buttons=["gtk-cancel", _("C_ontinue")]) > > def editDevice(self, data): >- v4list = [] >- v6list = [] >- ptplist = [] >- wifilist = [] >- >- def DHCPtoggled(widget): >- active = widget.get_active() >- >- if wifilist: >- for widget in wifilist: >- widget.set_sensitive(True) >- >- if active: >- bootproto = "dhcp" >- >- for widget in v4list: >- widget.set_sensitive(False) >- >- for widget in v6list: >- widget.set_sensitive(False) >- >- if ptplist: >- for widget in ptplist: >- widget.set_sensitive(False) >- else: >- bootproto = "static" >- >- if IPV4cb.get_active(): >- for widget in v4list: >- widget.set_sensitive(True) >- >- if IPV6cb.get_active(): >- for widget in v6list: >- widget.set_sensitive(True) >- >- if ptplist: >- for widget in ptplist: >- widget.set_sensitive(True) >- >- def IPV4toggled(widget): >- active = widget.get_active() >- self.network.useIPv4 = active >- if not DHCPcb.get_active(): >- if active: >- for widget in v4list: >- widget.set_sensitive(True) >- else: >- for widget in v4list: >- widget.set_sensitive(False) >- >- def IPV6toggled(widget): >- active = widget.get_active() >- self.network.useIPv6 = active >- if not DHCPcb.get_active(): >- if active: >- for widget in v6list: >- widget.set_sensitive(True) >- else: >- for widget in v6list: >- widget.set_sensitive(False) >- >- >- if self.ignoreEvents: >- return >- >- selection = self.ethdevices.get_selection() >+ selection = self.ethdevices.get_selection() > (model, iter) = selection.get_selected() > if not iter: > return None > > dev = model.get_value(iter, 1) >- bootproto = model.get_value(iter, 2) >- onboot = model.get_value(iter, 0) >- >- # create dialog box >- editWin = gtk.Dialog(_("Edit Interface %s") % (dev,), >- flags=gtk.DIALOG_MODAL) >- gui.addFrame(editWin) >- editWin.set_modal(True) >- editWin.set_position (gtk.WIN_POS_CENTER) >- >- # create contents >- devbox = gtk.VBox() >+ bootproto = model.get_value(iter, 2) >+ onboot = model.get_value(iter, 0) > >- hwaddr = self.devices[dev].get("hwaddr") >- if hwaddr is not None and len(hwaddr) > 0: >- align = gtk.Alignment() >- label = gtk.Label(_("Hardware address: %s") % (hwaddr,)) >- align.add(label) >- devbox.pack_start(align, False, padding=3) >- >- align = gtk.Alignment() >- DHCPcb = gtk.CheckButton(_("Use dynamic IP configuration (_DHCP)")) >- align.add(DHCPcb) >- devbox.pack_start(align, False, padding=3) >- >- align = gtk.Alignment() >- IPV4cb = gtk.CheckButton(_("Enable IPv4 support")) >- align.add(IPV4cb) >- devbox.pack_start(align, False, padding=3) >- >- align = gtk.Alignment() >- IPV6cb = gtk.CheckButton(_("Enable IPv6 support")) >- align.add(IPV6cb) >- devbox.pack_start(align, False, padding=3) >- >- # FIXME: radio group to pick static or RFC2462 autoconfig >- >- align = gtk.Alignment() >- bootcb = gtk.CheckButton(_("_Activate on boot")) >- >- bootcb.connect("toggled", self.onBootToggled, self.devices[dev]) >- bootcb.set_active(onboot) >- align.add(bootcb) >- devbox.pack_start(align, False, padding=3) >- >- ipTableLength = 3 >- >- if (network.isPtpDev(dev)): >- ipTableLength += 1 >- >- if (isys.isWireless(dev)): >- ipTableLength += 2 >- >- ipTable = gtk.Table(ipTableLength, 4) >- >- DHCPcb.connect("toggled", DHCPtoggled) >- IPV4cb.connect("toggled", IPV4toggled) >- IPV6cb.connect("toggled", IPV6toggled) >- >- entrys = {} >- >- # build the IP options table: >- >- # put some column labels on the table >- cl = gtk.Label(_("Address")) >- cl.set_alignment(0.5, 0.5) >- ipTable.attach(cl, 1, 2, 0, 1, xpadding=0, ypadding=0) >- cl = gtk.Label(_("Prefix (Netmask)")) >- cl.set_alignment(0.5, 0.5) >- ipTable.attach(cl, 3, 4, 0, 1, xpadding=0, ypadding=0) >- >- # IPv4 address and mask >- v4list.append(gtk.Label(_("IPv_4:"))) >- v4list[0].set_alignment(0.0, 0.5) >- v4list[0].set_property("use_underline", True) >- ipTable.attach(v4list[0], 0, 1, 1, 2, xpadding=0, ypadding=0) >- >- v4list.append(gtk.Entry()) >- v4list[1].set_width_chars(16) >- v4list[1].set_text(self.devices[dev].get('ipaddr')) >- entrys['ipaddr'] = v4list[1] >- ipTable.attach(v4list[1], 1, 2, 1, 2, xpadding=0, ypadding=0) >- >- v4list.append(gtk.Label("/")) >- v4list[2].set_alignment(0.5, 0.5) >- ipTable.attach(v4list[2], 2, 3, 1, 2, xpadding=4, ypadding=0) >- >- v4list.append(gtk.Entry()) >- v4list[3].set_width_chars(16) >- v4list[3].set_text(self.devices[dev].get('netmask')) >- entrys['netmask'] = v4list[3] >- ipTable.attach(v4list[3], 3, 4, 1, 2, xpadding=0, ypadding=0) >- >- # IPv6 address and prefix >- v6list.append(gtk.Label(_("IPv_6:"))) >- v6list[0].set_alignment(0.0, 0.5) >- v6list[0].set_property("use_underline", True) >- ipTable.attach(v6list[0], 0, 1, 2, 3, xpadding=0, ypadding=0) >- >- v6list.append(gtk.Entry()) >- v6list[1].set_width_chars(41) >+ # create dialog box for editing this interface >+ editwin = NetworkDeviceEditWindow(self) >+ editwin.setTitle(dev) >+ editwin.setDescription(self.devices[dev].get('desc')) >+ editwin.setHardwareAddress(self.devices[dev].get('hwaddr')) >+ >+ ipaddr = self.devices[dev].get('ipaddr') >+ netmask = self.devices[dev].get('netmask') >+ editwin.setIPv4Manual(ipaddr, netmask) > >+ ipv6_autoconf = self.devices[dev].get('ipv6_autoconf') > ipv6addr = self.devices[dev].get('ipv6addr') >+ ipv6prefix = self.devices[dev].get('ipv6prefix') > brk = ipv6addr.find('/') > if brk != -1: > ipv6addr = ipv6addr[0:brk] > brk += 1 > ipv6prefix = ipv6addr[brk:] >+ editwin.setIPv6Manual(ipv6addr, ipv6prefix) > >- v6list[1].set_text(ipv6addr) >- entrys['ipv6addr'] = v6list[1] >- ipTable.attach(v6list[1], 1, 2, 2, 3, xpadding=0, ypadding=0) >- >- v6list.append(gtk.Label("/")) >- v6list[2].set_alignment(0.5, 0.5) >- ipTable.attach(v6list[2], 2, 3, 2, 3, xpadding=4, ypadding=0) >- >- v6list.append(gtk.Entry()) >- v6list[3].set_width_chars(4) >- v6list[3].set_text(self.devices[dev].get('ipv6prefix')) >- entrys['ipv6prefix'] = v6list[3] >- ipTable.attach(v6list[3], 3, 4, 2, 3, xpadding=0, ypadding=0) >- >- # Point to Point address >- if (network.isPtpDev(dev)): >- ptplist.append(gtk.Label(_("_Point to Point (IP):"))) >- ptplist[0].set_alignment(0.0, 0.5) >- ptplist[0].set_property("use_underline", True) >- ipTable.attach(ptplist[0], 0, 1, 3, 4, xpadding=0, ypadding=0) >- >- ptplist.append(gtk.Entry()) >- ptplist[1].set_width_chars(41) >- ptplist[1].set_text(self.devices[dev].get('remip')) >- entrys['remip'] = ptplist[1] >- ipTable.attach(ptplist[1], 1, 2, 3, 4, xpadding=0, ypadding=0) >- >- # Wireless settings >- if (isys.isWireless(dev)): >- wifilist.append(gtk.Label(_("_ESSID:"))) >- wifilist[0].set_alignment(0.0, 0.5) >- wifilist[0].set_property("use_underline", True) >- ipTable.attach(wifilist[0], 0, 1, 4, 5, xpadding=0, ypadding=0) >- >- wifilist.append(gtk.Entry()) >- wifilist[1].set_text(self.devices[dev].get('essid')) >- entrys['essid'] = wifilist[1] >- ipTable.attach(wifilist[1], 1, 2, 4, 5, xpadding=0, ypadding=0) >- >- wifilist.append(gtk.Label(_("Encryption _Key:"))) >- wifilist[2].set_alignment(0.0, 0.5) >- wifilist[2].set_property("use_underline", True) >- ipTable.attach(wifilist[2], 0, 1, 5, 6, xpadding=0, ypadding=0) >- >- wifilist.append(gtk.Entry()) >- wifilist[3].set_text(self.devices[dev].get('key')) >- entrys['key'] = wifilist[3] >- ipTable.attach(wifilist[3], 1, 2, 5, 6, xpadding=0, ypadding=0) >- >- devbox.pack_start(ipTable, False, False, 6) >- devbox.set_border_width(6) >- >- # go ahead and set up DHCP on the first device >- DHCPcb.set_active(self.devices[dev].get('bootproto').lower() == 'dhcp') >- >- # set the IPv4 and IPv6 check boxes >- IPV4cb.set_active(self.network.useIPv4) >- IPV6cb.set_active(self.network.useIPv6) >- >- # set widget sensitivity >- DHCPtoggled(DHCPcb) >- IPV4toggled(IPV4cb) >- IPV6toggled(IPV6cb) >- >- framelab = _("Configure %s") % (dev,) >- descr = self.devices[dev].get("desc") >- if descr is not None and len(descr) > 0: >- framelab += " - " + descr[:70] >- >- l = gtk.Label() >- l.set_markup("<b>%s</b>" %(framelab,)) >- >- frame = gtk.Frame() >- frame.set_label_widget(l) >- frame.set_border_width(12) >- frame.add(devbox) >- frame.set_shadow_type(gtk.SHADOW_NONE) >- editWin.vbox.pack_start(frame, padding=6) >- editWin.set_position(gtk.WIN_POS_CENTER) >- editWin.show_all() >- editWin.add_button('gtk-cancel', 2) >- editWin.add_button('gtk-ok', 1) >- >- while 1: >- rc = editWin.run() >- >- if rc == 2: >- editWin.destroy() >+ if isys.isWireless(dev): >+ editwin.showWirelessTable() >+ editwin.setESSID(self.devices[dev].get('essid')) >+ editwin.setEncKey(self.devices[dev].get('key')) >+ else: >+ editwin.hideWirelessTable() >+ >+ if network.isPtpDev(dev): >+ editwin.showPtPTable() >+ editwin.setPtP(self.devices[dev].get('remip')) >+ else: >+ editwin.hidePtPTable() >+ >+ editwin.setEnableIPv4(self.devices[dev].get('useIPv4')) >+ editwin.selectIPv4Method(ipaddr) >+ >+ editwin.setEnableIPv6(self.devices[dev].get('useIPv6')) >+ editwin.selectIPv6Method(ipv6_autoconf, ipv6addr) >+ >+ rc = 1 >+ while rc == 1: >+ editwin.run() >+ rc = editwin.getInputValidationResults() >+ if rc == 3: > return > >- if DHCPcb.get_active(): >- bootproto = 'dhcp' >- else: >- bootproto = 'static' >- >- if IPV4cb.get_active() is False and IPV6cb.get_active() is False: >- self.intf.messageWindow(_("Missing Protocol"), >- _("You must select at least IPv4 " >- "or IPv6 support.")) >- continue >- >- if bootcb.get_active(): >- onboot = 'yes' >- else: >- onboot = 'no' >- >- if bootproto.lower() != 'dhcp': >- valsgood = 1 >- tmpvals = {} >- >- for t in checkorder: >- if not entrys.has_key(t): >- continue >- >- val = entrys[t].get_text() >- >- if ((t == 'ipaddr' or t == 'netmask') and \ >- IPV4cb.get_active() is True) or \ >- (t == 'ipv6addr' and IPV6cb.get_active() is True) or \ >- (t == 'remip'): >- if t == 'netmask' and val.find('.') == -1: >- try: >- if int(val) > 32 or int(val) < 0: >- self.intf.messageWindow(_("Invalid Prefix"), >- _("IPv4 prefix " >- "must be between " >- "0 and 32.")) >- valsgood = 0 >- break >- else: >- val = isys.prefix2netmask(int(val)) >- except: >- self.handleIPMissing(t) >- valsgood = 0 >- break >- >- try: >- network.sanityCheckIPString(val) >- tmpvals[t] = val >- except network.IPMissing, msg: >- self.handleIPMissing(t) >- valsgood = 0 >- break >- except network.IPError, msg: >- self.handleIPError(t, msg) >- valsgood = 0 >- break >- >- elif t == 'ipv6prefix' and IPV6cb.get_active() is True: >- try: >- if int(val) > 128 or int(val) < 0: >- self.intf.messageWindow(_("Invalid Prefix"), >- _("IPv6 prefix must be " >- "between 0 and 128.")) >- valsgood = 0 >- break >- except: >- self.intf.messageWindow(_("Invalid Prefix"), >- _("Invalid or missing " >- "IPv6 prefix (must be " >- "between 0 and 128).")) >- valsgood = 0 >- break >- >- if valsgood == 0: >- continue >- >- if IPV4cb.get_active() is True: >- try: >- (net, bc) = isys.inet_calcNetBroad (tmpvals['ipaddr'], >- tmpvals['netmask']) >- except Exception, e: >- print e >- self.handleBroadCastError() >- valsgood = 0 >- >- if not valsgood: >- continue >- >- for t in entrys.keys(): >- if tmpvals.has_key(t): >- if t == 'ipv6addr': >- if entrys['ipv6prefix'] is not None: >- a = tmpvals[t] >- if a.find('/') != -1: >- a = a[0:a.find('/')] >- p = entrys['ipv6prefix'].get_text() >- q = "%s/%s" % (a, p,) >- else: >- q = "%s" % (tmpvals[t],) >- >- self.devices[dev].set((t, q)) >- else: >- self.devices[dev].set((t, tmpvals[t])) >- else: >- self.devices[dev].set((t, entrys[t].get_text())) >+ # collect results >+ useipv4 = editwin.isIPv4Enabled() >+ useipv6 = editwin.isIPv6Enabled() >+ >+ self.devices[dev].set(('useIPv4', useipv4)) >+ self.devices[dev].set(('useIPv6', useipv6)) >+ >+ if useipv4: >+ bootproto = editwin.getIPv4Method() >+ >+ if bootproto == 'dhcp': >+ self.devices[dev].set(('ipaddr', bootproto)) >+ elif bootproto == 'static': >+ try: >+ (net, bc) = isys.inet_calcNetBroad(editwin.getIPv4Address(), >+ editwin.getIPv4Prefix()) >+ self.devices[dev].set(('network', net), ('broadcast', bc)) >+ except Exception, e: >+ self.handleBroadCastError() >+ return >+ >+ self.devices[dev].set(('ipaddr', editwin.getIPv4Address())) >+ self.devices[dev].set(('netmask', editwin.getIPv4Prefix())) >+ >+ if useipv6: >+ method = editwin.getIPv6Method() >+ >+ if method == 'auto': >+ self.devices[dev].set(('ipv6_autoconf', 'yes')) >+ self.devices[dev].set(('ipv6addr', '')) >+ self.devices[dev].set(('ipv6prefix', '')) >+ elif method == 'dhcp': >+ self.devices[dev].set(('ipv6_autoconf', 'no')) >+ self.devices[dev].set(('ipv6addr', 'dhcp')) >+ self.devices[dev].set(('ipv6prefix', '')) >+ elif method == 'static': >+ self.devices[dev].set(('ipv6_autoconf', 'no')) >+ self.devices[dev].set(('ipv6addr', editwin.getIPv6Address())) >+ self.devices[dev].set(('ipv6prefix', editwin.getIPv6Prefix())) >+ >+ if editwin.isWirelessEnabled(): >+ self.devices[dev].set(('essid', editwin.getESSID())) >+ self.devices[dev].set(('key', editwin.getEncKey())) >+ >+ if editwin.isPtPEnabled(): >+ self.devices[dev].set(('remip', editwin.getPtP())) >+ >+ self.devices[dev].set(('bootproto', bootproto)) >+ >+ if onboot: >+ self.devices[dev].set(('onboot', 'yes')) >+ else: >+ self.devices[dev].set(('onboot', 'no')) >+ >+ model.set_value(iter, 0, onboot) >+ model.set_value(iter, 2, self.createIPV4Repr(self.devices[dev])) >+ model.set_value(iter, 3, self.createIPV6Repr(self.devices[dev])) > >- if IPV4cb.get_active() is True: >- self.devices[dev].set(('network', net), ('broadcast', bc)) >+ editwin.close() > >- self.devices[dev].set(('bootproto', bootproto)) >- self.devices[dev].set(('ONBOOT', onboot)) >- model.set_value(iter, 0, onboot == 'yes') >- model.set_value(iter, 2, self.createIPV4Repr(self.devices[dev])) >- model.set_value(iter, 3, self.createIPV6Repr(self.devices[dev])) >- >- editWin.destroy() >- >- self.setIPTableSensitivity() >- self.setHostOptionsSensitivity() >+ self.setIPTableSensitivity() >+ self.setHostOptionsSensitivity() > >- return >+ return > > def createIPV4Repr(self, device): >- bootproto = device.get("bootproto") >- if self.network.useIPv4 is False: >+ if device.get('useIPv4') is False: > return _("Disabled") > >- if bootproto.lower() == "dhcp" and self.network.useIPv4 is True: >- ip = "DHCP" >+ if device.get('ipaddr').lower() == 'dhcp': >+ ip = 'DHCP' >+ elif device.get('bootproto').lower() == 'dhcp': >+ ip = 'DHCP' > else: >- prefix = str(isys.netmask2prefix(device.get("netmask"))) >- ip = "%s/%s" % (device.get("ipaddr"), prefix,) >+ prefix = str(isys.netmask2prefix(device.get('netmask'))) >+ ip = "%s/%s" % (device.get('ipaddr'), prefix,) > > return ip > > def createIPV6Repr(self, device): >- bootproto = device.get("bootproto") >- if self.network.useIPv6 is False: >+ if device.get('useIPv6') is False: > return _("Disabled") > >- if bootproto.lower() == "dhcp" and self.network.useIPv6 is True: >- ip = "DHCP" >+ auto = device.get('ipv6_autoconf').lower() >+ addr = device.get('ipv6addr').lower() >+ pfx = device.get('ipv6prefix').lower() >+ >+ if auto == 'yes' or addr == '': >+ ip = 'Auto' >+ elif addr == 'dhcp': >+ ip = 'DHCPv6' > else: >- ip = "%s" % (device.get("ipv6addr"),) >+ ip = "%s/%s" % (addr, pfx,) > > return ip > >@@ -774,7 +478,7 @@ class NetworkWindow(InstallWindow): > self.hostnameManual = gtk.RadioButton(group=self.hostnameUseDHCP, label=_("_manually")) > tmphbox.pack_start(self.hostnameManual, False, False) > self.hostnameEntry = gtk.Entry() >- self.hostnameEntry.set_width_chars(41) >+ self.hostnameEntry.set_width_chars(32) > tmphbox.pack_start(self.hostnameEntry, False, False) > tmphbox.pack_start(gtk.Label(_('(e.g., host.domain.com)')), False, False) > self.hostnameManual.connect("toggled", self.hostnameManualCB, None) >@@ -840,6 +544,370 @@ class NetworkWindow(InstallWindow): > self.hostnameUseDHCP.set_sensitive(self.anyUsingDHCP()) > > return box >+ >+ >+class NetworkDeviceEditWindow: >+ def __init__(self, netwin): >+ self.netwin = netwin >+ self.xml = gtk.glade.XML(gui.findGladeFile('netpostconfig.glade')) >+ >+ # Pull in a ton of widgets. >+ self.toplevel = self.xml.get_widget("net_post_config_win") >+ gui.addFrame(self.toplevel) >+ self.button_ok = self.xml.get_widget("button_ok") >+ self.button_cancel = self.xml.get_widget("button_cancel") >+ >+ self.configure_dev = self.xml.get_widget("configure_dev") >+ self.hardware_address = self.xml.get_widget("hardware_address") >+ >+ self.enable_ipv4 = self.xml.get_widget("enable_ipv4") >+ self.dhcp_ipv4 = self.xml.get_widget("dhcp_ipv4") >+ self.manual_ipv4 = self.xml.get_widget("manual_ipv4") >+ self.ipv4_address_label = self.xml.get_widget("ipv4_address_label") >+ self.ipv4_prefix_label = self.xml.get_widget("ipv4_prefix_label") >+ self.ipv4_address = self.xml.get_widget("ipv4_address") >+ self.ipv4_slash = self.xml.get_widget("ipv4_slash_label") >+ self.ipv4_prefix = self.xml.get_widget("ipv4_prefix") >+ >+ self.enable_ipv6 = self.xml.get_widget("enable_ipv6") >+ self.auto_ipv6 = self.xml.get_widget("auto_ipv6") >+ self.dhcp_ipv6 = self.xml.get_widget("dhcp_ipv6") >+ self.manual_ipv6 = self.xml.get_widget("manual_ipv6") >+ self.ipv6_address_label = self.xml.get_widget("ipv6_address_label") >+ self.ipv6_prefix_label = self.xml.get_widget("ipv6_prefix_label") >+ self.ipv6_address = self.xml.get_widget("ipv6_address") >+ self.ipv6_slash = self.xml.get_widget("ipv6_slash_label") >+ self.ipv6_prefix = self.xml.get_widget("ipv6_prefix") >+ >+ self.toplevel.connect("destroy", self.destroy) >+ self.button_ok.connect("clicked", self.okClicked) >+ self.button_cancel.connect("clicked", self.cancelClicked) >+ >+ self.enable_ipv4.connect("toggled", self.ipv4_toggled) >+ self.dhcp_ipv4.connect("toggled", self.ipv4_changed) >+ self.manual_ipv4.connect("toggled", self.ipv4_changed) >+ self.enable_ipv6.connect("toggled", self.ipv6_toggled) >+ self.auto_ipv6.connect("toggled", self.ipv6_changed) >+ self.dhcp_ipv6.connect("toggled", self.ipv6_changed) >+ self.manual_ipv6.connect("toggled", self.ipv6_changed) >+ >+ self.enable_wireless = False >+ self.wireless_table = self.xml.get_widget("wireless_table") >+ self.essid = self.xml.get_widget("essid") >+ self.enc_key = self.xml.get_widget("enc_key") >+ >+ self.enable_ptp = 1 >+ self.ptp_table = self.xml.get_widget("ptp_table") >+ self.ptp_address = self.xml.get_widget("ptp_ip") >+ >+ self.valid_input = 1 >+ >+ def getInputValidationResults(self): >+ # 1=invalid input >+ # 2=valid input >+ # 3=cancel pressed >+ return self.valid_input >+ >+ def show(self): >+ self.toplevel.show_all() >+ >+ def run(self): >+ self.toplevel.run() >+ >+ def close(self): >+ self.toplevel.destroy() >+ >+ def setTitle(self, title): >+ self.toplevel.set_title(_('Edit Device ') + title) >+ >+ def setDescription(self, desc): >+ if desc is None: >+ desc = _('Unknown Ethernet Device') >+ >+ self.configure_dev.set_markup("<b>" + desc[:70] + "</b>") >+ >+ def setHardwareAddress(self, mac): >+ if mac is None: >+ mac = _('unknown') >+ >+ self.hardware_address.set_markup("<b>" + _("Hardware address: ") + mac + "</b>") >+ >+ def isWirelessEnabled(self): >+ return self.enable_wireless >+ >+ def isPtPEnabled(self): >+ return self.enable_ptp >+ >+ def showWirelessTable(self): >+ self.enable_wireless = True >+ self.wireless_table.show() >+ self.toplevel.resize(1, 1) >+ >+ def hideWirelessTable(self): >+ self.enable_wireless = False >+ self.wireless_table.hide() >+ self.toplevel.resize(1, 1) >+ >+ def showPtPTable(self): >+ self.enable_ptp = True >+ self.ptp_table.show() >+ self.toplevel.resize(1, 1) >+ >+ def hidePtPTable(self): >+ self.enable_ptp = False >+ self.ptp_table.hide() >+ self.toplevel.resize(1, 1) >+ >+ def setIPv4Manual(self, ipaddr, netmask): >+ if ipaddr.lower() == 'dhcp': >+ return >+ >+ if ipaddr is not None: >+ self.ipv4_address.set_text(ipaddr) >+ >+ if netmask is not None: >+ self.ipv4_prefix.set_text(netmask) >+ >+ def getIPv4Address(self): >+ return self.ipv4_address.get_text() >+ >+ def getIPv4Prefix(self): >+ return self.ipv4_prefix.get_text() >+ >+ def setIPv6Manual(self, ipv6addr, ipv6prefix): >+ if ipv6addr.lower() == 'dhcp': >+ return >+ >+ if ipv6addr is not None: >+ self.ipv6_address.set_text(ipv6addr) >+ >+ if ipv6prefix is not None: >+ self.ipv6_prefix.set_text(ipv6prefix) >+ >+ def getIPv6Address(self): >+ return self.ipv6_address.get_text() >+ >+ def getIPv6Prefix(self): >+ return self.ipv6_prefix.get_text() >+ >+ def setESSID(self, essid): >+ if essid is not None: >+ self.essid.set_text(essid) >+ >+ def getESSID(self): >+ return self.essid.get_text() >+ >+ def setEncKey(self, key): >+ if key is not None: >+ self.enc_key.set_text(key) >+ >+ def getEncKey(self): >+ return self.enc_key.get_text() >+ >+ def setPtP(self, remip): >+ if remip is not None: >+ self.ptp_address.set_text(remip) >+ >+ def getPtP(self): >+ return self.ptp_address.get_text() >+ >+ def setEnableIPv4(self, enable_ipv4): >+ if enable_ipv4 is True: >+ self.enable_ipv4.set_active(1) >+ elif enable_ipv4 is False: >+ self.enable_ipv4.set_active(0) >+ >+ def setEnableIPv6(self, enable_ipv6): >+ if enable_ipv6 is True: >+ self.enable_ipv6.set_active(1) >+ elif enable_ipv6 is False: >+ self.enable_ipv6.set_active(0) >+ >+ def selectIPv4Method(self, ipaddr): >+ if ipaddr.lower() == 'dhcp': >+ self.dhcp_ipv4.set_active(1) >+ elif ipaddr != "": >+ self.manual_ipv4.set_active(1) >+ >+ def selectIPv6Method(self, ipv6_autoconf, ipv6addr): >+ if ipv6_autoconf.lower() == 'yes': >+ self.auto_ipv6.set_active(1) >+ elif ipv6addr.lower() == 'dhcp': >+ self.dhcp_ipv6.set_active(1) >+ elif ipv6addr != "": >+ self.manual_ipv6.set_active(1) >+ >+ def isIPv4Enabled(self): >+ return self.enable_ipv4.get_active() >+ >+ def getIPv4Method(self): >+ if self.isIPv4Enabled(): >+ if self.dhcp_ipv4.get_active(): >+ return 'dhcp' >+ elif self.manual_ipv4.get_active(): >+ return 'static' >+ >+ def isIPv6Enabled(self): >+ return self.enable_ipv6.get_active() >+ >+ def getIPv6Method(self): >+ if self.isIPv6Enabled(): >+ if self.auto_ipv6.get_active(): >+ return 'auto' >+ elif self.dhcp_ipv6.get_active(): >+ return 'dhcp' >+ elif self.manual_ipv6.get_active(): >+ return 'static' >+ >+ # Basic callbacks. >+ def destroy(self, args): >+ self.toplevel.destroy() >+ >+ def okClicked(self, args): >+ # input validation >+ if not self.isIPv4Enabled() and not self.isIPv6Enabled(): >+ self.netwin.intf.messageWindow(_("Missing Protocol"), >+ _("You must select at least IPv4 " >+ "or IPv6 support.")) >+ self.valid_input = 1 >+ return >+ >+ if self.isIPv4Enabled(): >+ if self.manual_ipv4.get_active(): >+ try: >+ network.sanityCheckIPString(self.ipv4_address.get_text()) >+ except network.IPMissing, msg: >+ self.netwin.handleIPMissing('IPv4 address') >+ self.valid_input = 1 >+ return >+ except network.IPError, msg: >+ self.netwin.handleIPError('IPv4 address', msg) >+ self.valid_input = 1 >+ return >+ >+ val = self.ipv4_prefix.get_text() >+ if val.find('.') == -1: >+ # user provided a CIDR prefix >+ try: >+ if int(val) > 32 or int(val) < 0: >+ self.netwin.intf.messageWindow(_("Invalid Prefix"), >+ _("IPv4 prefix " >+ "must be between " >+ "0 and 32.")) >+ self.valid_input = 1 >+ return >+ else: >+ self.ipv4_prefix.set_text(isys.prefix2netmask(int(val))) >+ except: >+ self.netwin.handleIPMissing('IPv4 network mask') >+ self.valid_input = 1 >+ return >+ else: >+ # user provided a dotted-quad netmask >+ try: >+ network.sanityCheckIPString(self.ipv4_prefix.get_text()) >+ except network.IPMissing, msg: >+ self.netwin.handleIPMissing('IPv4 network mask') >+ self.valid_input = 1 >+ return >+ except network.IPError, msg: >+ self.netwin.handleIPError('IPv4 network mask', msg) >+ self.valid_input = 1 >+ return >+ >+ if self.isIPv6Enabled(): >+ if self.manual_ipv6.get_active(): >+ try: >+ network.sanityCheckIPString(self.ipv6_address.get_text()) >+ except network.IPMissing, msg: >+ self.netwin.handleIPMissing('IPv6 address') >+ self.valid_input = 1 >+ return >+ except network.IPError, msg: >+ self.netwin.handleIPError('IPv6 address', msg) >+ self.valid_input = 1 >+ return >+ >+ val = self.ipv6_prefix.get_text() >+ try: >+ if int(val) > 128 or int(val) < 0: >+ self.netwin.intf.messageWindow(_("Invalid Prefix"), >+ _("IPv6 prefix must be " >+ "between 0 and 128.")) >+ self.valid_input = 1 >+ return >+ except: >+ self.netwin.intf.messageWindow(_("Invalid Prefix"), >+ _("IPv6 prefix must be " >+ "between 0 and 128.")) >+ self.valid_input = 1 >+ return >+ >+ if self.isPtPEnabled(): >+ try: >+ network.sanityCheckIPString(self.ptp_address.get_text()) >+ except network.IPMissing, msg: >+ self.netwin.handleIPMissing('point-to-point IP address') >+ self.valid_input = 1 >+ return >+ except network.IPError, msg: >+ self.netwin.handleIPError('point-to-point IP address', msg) >+ self.valid_input = 1 >+ return >+ >+ # if we made it this far, all input is good >+ self.valid_input = 2 >+ >+ def cancelClicked(self, args): >+ self.valid_input = 3 >+ self.toplevel.destroy() >+ >+ def _setManualIPv4Sensitivity(self, sensitive): >+ self.ipv4_address_label.set_sensitive(sensitive) >+ self.ipv4_prefix_label.set_sensitive(sensitive) >+ self.ipv4_address.set_sensitive(sensitive) >+ self.ipv4_slash.set_sensitive(sensitive) >+ self.ipv4_prefix.set_sensitive(sensitive) >+ >+ def _setManualIPv6Sensitivity(self, sensitive): >+ self.ipv6_address_label.set_sensitive(sensitive) >+ self.ipv6_prefix_label.set_sensitive(sensitive) >+ self.ipv6_address.set_sensitive(sensitive) >+ self.ipv6_slash.set_sensitive(sensitive) >+ self.ipv6_prefix.set_sensitive(sensitive) >+ >+ def _setIPv4Sensitivity(self, sensitive): >+ self.dhcp_ipv4.set_sensitive(sensitive) >+ self.manual_ipv4.set_sensitive(sensitive) >+ >+ # But be careful to only set these sensitive if their corresponding >+ # radiobutton is selected. >+ if self.manual_ipv4.get_active(): >+ self._setManualIPv4Sensitivity(sensitive) >+ >+ def _setIPv6Sensitivity(self, sensitive): >+ self.auto_ipv6.set_sensitive(sensitive) >+ self.dhcp_ipv6.set_sensitive(sensitive) >+ self.manual_ipv6.set_sensitive(sensitive) >+ >+ # But be careful to only set these sensitive if their corresponding >+ # radiobutton is selected. >+ if self.manual_ipv6.get_active(): >+ self._setManualIPv6Sensitivity(sensitive) >+ >+ # Called when the IPv4 and IPv6 CheckButtons are modified. >+ def ipv4_toggled(self, args): >+ self._setIPv4Sensitivity(self.enable_ipv4.get_active()) >+ >+ def ipv6_toggled(self, args): >+ self._setIPv6Sensitivity(self.enable_ipv6.get_active()) >+ >+ # Called when the dhcp/auto/manual config RadioButtons are modified. >+ def ipv4_changed(self, args): >+ self._setManualIPv4Sensitivity(self.manual_ipv4.get_active()) >+ >+ def ipv6_changed(self, args): >+ self._setManualIPv6Sensitivity(self.manual_ipv6.get_active()) > > > class NetworkDeviceCheckList(checklist.CheckList): >Index: textw/network_text.py >=================================================================== >RCS file: /usr/local/CVS/anaconda/textw/network_text.py,v >retrieving revision 1.57.4.3 >diff -u -p -r1.57.4.3 network_text.py >--- textw/network_text.py 28 Nov 2006 21:25:49 -0000 1.57.4.3 >+++ textw/network_text.py 29 May 2007 21:01:02 -0000 >@@ -20,21 +20,14 @@ import os > import isys > import string > import network >+import socket > from snack import * > from constants_text import * > from constants import * > from rhpl.translate import _ > >-descr = { 'ipaddr': 'IPv4 address', >- 'netmask': 'IPv4 network mask', >- 'remip': 'point-to-point IP address', >- 'ipv6addr': 'IPv6 address' >- } >- >-# order to check input values >-checkorder = ['ipaddr', 'netmask', 'ipv6addr', 'ipv6prefix', >- 'remip', 'essid', 'key' >- ] >+import logging >+log = logging.getLogger("anaconda") > > def handleIPError(screen, field, msg): > try: >@@ -65,70 +58,59 @@ def handleBroadCastError(screen): > ButtonChoiceWindow(screen, _("Error With Data"), > _("The IPv4 information you have entered is invalid.")) > >+def handleInvalidPrefix(screen, family): >+ if family == socket.AF_INET: >+ ver = 4 >+ upper = 32 >+ elif family == socket.AF_INET6: >+ ver = 6 >+ upper = 128 >+ >+ ButtonChoiceWindow(screen, _("Invalid Prefix"), >+ _("IPv%d prefix must be between 0 and %d." % (ver, upper,)), >+ buttons = [_("OK")]) >+ >+def handleValueErrorPrefix(screen, field): >+ ButtonChoiceWindow(screen, _("Integer Required for Prefix"), >+ _("You must enter a valid integer for the %s. For IPv4, the " >+ "value can be between 0 and 32. For IPv6 it can be between " >+ "0 and 128." % (field,)), buttons = [_("OK")]) >+ > class NetworkDeviceWindow: >- def runScreen(self, screen, net, dev, showonboot=1): >- bootproto = dev.get('bootproto').lower() >- onboot = dev.get('onboot') >- v4list = [] >- v6list = [] >- ptplist = [] >- wifilist = [] >- >- def DHCPtoggled(): >- active = self.dhcpCb.selected() >- >- if wifilist: >- for widget in wifilist: >- widget.setFlags(FLAG_DISABLED, FLAGS_RESET) >- >- if active: >- bootproto = 'dhcp' >- >- for widget in v4list: >- widget.setFlags(FLAG_DISABLED, FLAGS_SET) >- >- for widget in v6list: >- widget.setFlags(FLAG_DISABLED, FLAGS_SET) >- >- if ptplist: >- for widget in ptplist: >- widget.setFlags(FLAG_DISABLED, FLAGS_SET) >- else: >- bootproto = 'static' >+ def createManualEntryGrid(self, ipEntry, prefixEntry, family): >+ if family == socket.AF_INET: >+ prefixLabel = Label(_("Prefix (Netmask)")) >+ elif family == socket.AF_INET6: >+ prefixLabel = Label(_("Prefix")) >+ >+ manualgrid = Grid(3, 2) >+ >+ manualgrid.setField(Label(_("IP Address")), 0, 0, anchorLeft = 1, >+ padding = (4, 0, 0, 0)) >+ manualgrid.setField(ipEntry, 0, 1, anchorLeft = 1, >+ padding = (4, 0, 0, 0)) >+ manualgrid.setField(Label("/"), 1, 1, anchorLeft = 1, >+ padding = (1, 0, 1, 0)) >+ manualgrid.setField(prefixLabel, 2, 0, anchorLeft = 1) >+ manualgrid.setField(prefixEntry, 2, 1, anchorLeft = 1) >+ manualgrid.setField(Label(" "), 1, 0, anchorLeft = 1, >+ padding = (1, 0, 1, 0)) >+ >+ return manualgrid >+ >+ def ipMethodCb(self, obj): >+ (radio, ipEntry, prefixEntry) = obj >+ if radio.getSelection() == "static": >+ sense = FLAGS_RESET >+ else: >+ sense = FLAGS_SET >+ ipEntry.setFlags(FLAG_DISABLED, sense) >+ prefixEntry.setFlags(FLAG_DISABLED, sense) > >- if self.ipv4Cb.selected() != 0: >- for widget in v4list: >- widget.setFlags(FLAG_DISABLED, FLAGS_RESET) >- >- if self.ipv6Cb.selected() != 0: >- for widget in v6list: >- widget.setFlags(FLAG_DISABLED, FLAGS_RESET) >- >- if ptplist: >- for widget in ptplist: >- widget.setFlags(FLAG_DISABLED, FLAGS_RESET) >- >- def IPV4toggled(): >- active = self.ipv4Cb.selected() >- net.useIPv4 = active >- if not self.dhcpCb.selected(): >- if active: >- for widget in v4list: >- widget.setFlags(FLAG_DISABLED, FLAGS_RESET) >- else: >- for widget in v4list: >- widget.setFlags(FLAG_DISABLED, FLAGS_SET) >- >- def IPV6toggled(): >- active = self.ipv6Cb.selected() >- net.useIPv6 = active >- if not self.dhcpCb.selected(): >- if active: >- for widget in v6list: >- widget.setFlags(FLAG_DISABLED, FLAGS_RESET) >- else: >- for widget in v6list: >- widget.setFlags(FLAG_DISABLED, FLAGS_SET) >+ def runMainScreen(self, screen, dev, showonboot=1): >+ onboot = dev.get('onboot') >+ isPtp = network.isPtpDev(dev.info["DEVICE"]) >+ isWifi = isys.isWireless(dev.info["DEVICE"]) > > devnames = self.devices.keys() > devnames.sort(cmp=isys.compareNetDevices) >@@ -136,178 +118,98 @@ class NetworkDeviceWindow: > onbootIsOn = 1 > else: > onbootIsOn = (onboot == 'yes') >- if not bootproto: >- bootproto = 'dhcp' >- >- descr = dev.get('desc') >- hwaddr = dev.get('hwaddr') >- if descr is None or len(descr) == 0: >- descr = None >- if hwaddr is None or len(hwaddr) == 0: >- hwaddr = None >- >- topgrid = Grid(1, 2) >- >- if descr is not None: >- topgrid.setField(Label (_("Description: %s") % (descr[:70],)), >- 0, 0, padding = (0, 0, 0, 0), anchorLeft = 1, >- growx = 1) >- if hwaddr is not None: >- topgrid.setField(Label (_("Hardware Address: %s") %(hwaddr,)), >- 0, 1, padding = (0, 0, 0, 0), anchorLeft = 1, >- growx = 1) > > # Create options grid >- maingrid = Grid(1, 5) >- mainrow = 0 >+ ipmiscrows = 0 >+ if isPtp: >+ ipmiscrows += 1 >+ if isWifi: >+ ipmiscrows += 2 >+ >+ maingridrows = 5 >+ if ipmiscrows > 0: >+ maingridrows += 1 > >- if not showonboot: >- ypad = 1 >- else: >- ypad = 0 >+ maingrid = Grid(1, maingridrows) >+ mainrow = 0 > >- # DHCP option >- self.dhcpCb = Checkbox(_("Use dynamic IP configuration (DHCP)"), >- isOn = (bootproto == "dhcp")) >- maingrid.setField(self.dhcpCb, 0, mainrow, anchorLeft = 1, growx = 1, >- padding = (0, 0, 0, ypad)) >- mainrow += 1 >+ # Activate on boot option >+ onbootCb = Checkbox(_("Activate on boot"), isOn = onbootIsOn) >+ if showonboot: >+ maingrid.setField(onbootCb, 0, mainrow, anchorLeft = 1, >+ growx = 1, padding = (0, 0, 0, 0)) >+ mainrow += 1 > > # Use IPv4 option >- self.ipv4Cb = Checkbox(_("Enable IPv4 support"), net.useIPv4) >- maingrid.setField(self.ipv4Cb, 0, mainrow, anchorLeft = 1, growx = 1, >- padding = (0, 0, 0, ypad)) >+ ipv4Cb = Checkbox(_("Enable IPv4 support"), >+ int(bool(dev.get('useIPv4')))) >+ maingrid.setField(ipv4Cb, 0, mainrow, anchorLeft = 1, growx = 1, >+ padding = (0, 0, 0, 0)) > mainrow += 1 > > # Use IPv6 option >- self.ipv6Cb = Checkbox(_("Enable IPv6 support"), net.useIPv6) >- maingrid.setField(self.ipv6Cb, 0, mainrow, anchorLeft = 1, growx = 1, >- padding = (0, 0, 0, ypad)) >+ ipv6Cb = Checkbox(_("Enable IPv6 support"), >+ int(bool(dev.get('useIPv6')))) >+ maingrid.setField(ipv6Cb, 0, mainrow, anchorLeft = 1, growx = 1, >+ padding = (0, 0, 0, 0)) > mainrow += 1 > >- # Activate on boot option >- self.onbootCb = Checkbox(_("Activate on boot"), isOn = onbootIsOn) >- if showonboot: >- maingrid.setField(self.onbootCb, 0, mainrow, anchorLeft = 1, >- growx = 1, padding = (0, 0, 0, 1)) >- mainrow += 1 >- >- # IP address subtable >- ipTableLength = 3 >- >- if (network.isPtpDev(dev.info['DEVICE'])): >- ipTableLength += 1 >- >- if (isys.isWireless(dev.info['DEVICE'])): >- ipTableLength += 2 >- >- ipgrid = Grid(4, ipTableLength) >- >- self.dhcpCb.setCallback(DHCPtoggled) >- self.ipv4Cb.setCallback(IPV4toggled) >- self.ipv6Cb.setCallback(IPV6toggled) >- >- entrys = {} >- >- # IP subtable labels >- ipgrid.setField(Label(" "), 0, 0) >- ipgrid.setField(Label(_("Address")), 1, 0) >- ipgrid.setField(Label(" "), 2, 0) >- ipgrid.setField(Label(_("Prefix (Netmask)")), 3, 0) >- ipgrid.setField(Label(_("IPv4:")), 0, 1, anchorLeft = 1, >- padding = (0, 0, 1, 0)) >- ipgrid.setField(Label("/"), 2, 1, padding = (1, 0, 1, 0)) >- ipgrid.setField(Label(_("IPv6:")), 0, 2, anchorLeft = 1, >- padding = (0, 0, 1, 0)) >- ipgrid.setField(Label("/"), 2, 2, padding = (1, 0, 1, 0)) >- >- # IPv4 entries >- v4list.append(Entry(41)) >- v4list[0].set(dev.get('ipaddr')) >- entrys['ipaddr'] = v4list[0] >- ipgrid.setField(v4list[0], 1, 1, anchorLeft = 1) >- >- v4list.append(Entry(16)) >- v4list[1].set(dev.get('netmask')) >- entrys['netmask'] = v4list[1] >- ipgrid.setField(v4list[1], 3, 1, anchorLeft = 1) >- >- # IPv6 entries >- v6list.append(Entry(41)) >- >- ipv6addr = dev.get('ipv6addr') >- brk = ipv6addr.find('/') >- if brk != -1: >- ipv6addr = ipv6addr[0:brk] >- brk += 1 >- ipv6prefix = ipv6addr[brk:] >- >- v6list[0].set(ipv6addr) >- entrys['ipv6addr'] = v6list[0] >- ipgrid.setField(v6list[0], 1, 2, anchorLeft = 1) >- >- v6list.append(Entry(16)) >- v6list[1].set(dev.get('ipv6prefix')) >- entrys['ipv6prefix'] = v6list[1] >- ipgrid.setField(v6list[1], 3, 2, anchorLeft = 1) >- >- iprow = 3 >+ if ipmiscrows > 0: >+ ipmiscgrid = Grid(2, ipmiscrows) >+ ipmiscrow = 0 > > # Point to Point address >- if (network.isPtpDev(dev.info["DEVICE"])): >- ipgrid.setField(Label(_("P-to-P:")), 0, iprow, anchorLeft = 1, >- padding = (0, 0, 1, 0)) >- >- ptplist.append(Entry(41)) >- ptplist[0].set(dev.get('remip')) >- entrys['remip'] = ptplist[0] >- ipgrid.setField(ptplist[0], 1, iprow, anchorLeft = 1) >+ ptpaddr = None >+ if isPtp: >+ ipmiscgrid.setField(Label(_("P-to-P:")), 0, ipmiscrow, >+ anchorLeft = 1, padding = (0, 1, 1, 0)) >+ ptplist = Entry(41) >+ ptplist.set(dev.get('remip')) >+ ipmiscgrid.setField(ptplist, 1, ipmiscrow, anchorLeft = 1, >+ padding = (0, 1, 0, 0)) > >- iprow += 1 >+ ipmiscrow += 1 > > # Wireless settings >- if (isys.isWireless(dev.info["DEVICE"])): >- ipgrid.setField(Label(_("ESSID:")), 0, iprow, anchorLeft = 1, >- padding = (0, 0, 1, 0)) >- wifilist.append(Entry(41)) >- wifilist[0].set(dev.get('essid')) >- entrys['essid'] = wifilist[0] >- ipgrid.setField(wifilist[0], 1, iprow, anchorLeft = 1) >- >- iprow += 1 >- >- ipgrid.setField(Label(_("WEP Key:")), 0, iprow, anchorLeft = 1, >- padding = (0, 0, 1, 0)) >- wifilist.append(Entry(41)) >- wifilist[1].set(dev.get('key')) >- entrys['key'] = wifilist[1] >- ipgrid.setField(wifilist[1], 1, iprow, anchorLeft = 1) >- >- # Add the IP subtable >- maingrid.setField(ipgrid, 0, mainrow, anchorLeft = 1, >- growx = 1, padding = (0, 0, 0, 1)) >+ essid = None >+ wepkey = None >+ if isWifi: >+ if isPtp: >+ padtop = 0 >+ else: >+ padtop = 1 >+ >+ ipmiscgrid.setField(Label(_("ESSID:")), 0, ipmiscrow, >+ anchorLeft = 1, padding = (0, padtop, 1, 0)) >+ essid = Entry(41) >+ essid.set(dev.get('essid')) >+ ipmiscgrid.setField(essid, 1, ipmiscrow, anchorLeft = 1, >+ padding = (0, padtop, 0, 0)) >+ >+ ipmiscrow += 1 >+ >+ ipmiscgrid.setField(Label(_("WEP Key:")), 0, ipmiscrow, >+ anchorLeft = 1, padding = (0, 0, 1, 0)) >+ wepkey = Entry(41) >+ wepkey.set(dev.get('key')) >+ ipmiscgrid.setField(wepkey, 1, ipmiscrow, anchorLeft = 1) >+ >+ # Add the IP misc subtable >+ if ipmiscrows > 0: >+ maingrid.setField(ipmiscgrid, 0, mainrow, anchorLeft = 1, >+ growx = 1, padding = (0, 0, 0, 0)) > > bb = ButtonBar(screen, (TEXT_OK_BUTTON, TEXT_BACK_BUTTON)) > > toplevel = GridFormHelp(screen, _("Network Configuration for %s") % >- (dev.info['DEVICE']), "networkdev", 1, 3) >+ (dev.info['DEVICE']), "networkdev", 1, 5) > >- if ipTableLength == 6: >- pbottom = 0 >- else: >- pbottom = 1 >+ toplevel.add(self.topgrid, 0, 0, (0, 0, 0, 0), anchorLeft = 1) >+ toplevel.add(maingrid, 0, 1, (0, 0, 0, 0), anchorLeft = 1) >+ toplevel.add(bb, 0, 2, (0, 1, 0, 0), growx = 1, growy = 0) > >- toplevel.add(topgrid, 0, 0, (0, 0, 0, pbottom), anchorLeft = 1) >- toplevel.add(maingrid, 0, 1, (0, 0, 0, 0), anchorLeft = 1) >- toplevel.add(bb, 0, 2, (0, 0, 0, 0), growx = 1, growy = 0) >- >- self.dhcpCb.isOn = (bootproto == 'dhcp') >- self.ipv4Cb.isOn = net.useIPv4 >- self.ipv6Cb.isOn = net.useIPv6 >- >- DHCPtoggled() >- IPV4toggled() >- IPV6toggled() >+ ipv4Cb.isOn = int(bool(dev.get('useIPv4'))) >+ ipv6Cb.isOn = int(bool(dev.get('useIPv6'))) > > while 1: > result = toplevel.run() >@@ -317,145 +219,431 @@ class NetworkDeviceWindow: > screen.popWindow() > return INSTALL_BACK > >- if not self.ipv4Cb.selected() and not self.ipv6Cb.selected(): >+ if not ipv4Cb.selected() and not ipv6Cb.selected(): > ButtonChoiceWindow(screen, _("Missing Protocol"), > _("You must select at least IPv4 or IPv6 support."), > buttons = [_("OK")]) > continue > >- if self.onbootCb.selected(): >+ dev.set(('useIPv4', bool(ipv4Cb.selected()))) >+ dev.set(('useIPv6', bool(ipv6Cb.selected()))) >+ >+ if onbootCb.selected(): > dev.set(('onboot', 'yes')) > else: > dev.unset('onboot') > >- if self.dhcpCb.selected(): >- dev.set(('bootproto', 'dhcp')) >- dev.unset('ipaddr', 'netmask', 'network', 'broadcast', 'remip') >- else: >- dev.unset('bootproto') >- valsgood = 1 >- tmpvals = {} >+ if isPtp: >+ try: >+ network.sanityCheckIPString(ptpaddr.value()) >+ dev.set(('remip', ptpaddr.value())) >+ except network.IPMissing, msg: >+ handleIPMissing(screen, _("point-to-point IP address")) >+ continue >+ except network.IPError, msg: >+ handleIPError(screen, _("point-to-point IP address"), msg) >+ continue >+ >+ if isWifi: >+ if essid is not None: >+ if not essid.value() == '': >+ dev.set(('essid', essid.value())) >+ >+ if wepkey is not None: >+ if not wepkey.value() == '': >+ dev.set(('key', wepkey.value())) > >- for t in checkorder: >- if not entrys.has_key(t): >+ break >+ >+ screen.popWindow() >+ return INSTALL_OK >+ >+ def runIPv4Screen(self, screen, dev): >+ bootproto = dev.get('bootproto').lower() >+ >+ radio = RadioGroup() >+ >+ maingrid = Grid(1, 3) >+ dhcpCb = radio.add(_("Dynamic IP configuration (DHCP)"), >+ "dhcp", (bootproto == "dhcp")) >+ maingrid.setField(dhcpCb, 0, 0, growx = 1, anchorLeft = 1) >+ manualCb = radio.add(_("Manual address configuration"), >+ "static", (bootproto == "static")) >+ maingrid.setField(manualCb, 0, 1, growx = 1, anchorLeft = 1) >+ >+ ipEntry = Entry(16) >+ ipEntry.set(dev.get('ipaddr')) >+ prefixEntry = Entry(16) >+ prefixEntry.set(dev.get('netmask')) >+ >+ manualgrid = self.createManualEntryGrid(ipEntry, prefixEntry, >+ socket.AF_INET) >+ maingrid.setField(manualgrid, 0, 2, anchorLeft = 1, growx = 1, >+ padding = (0, 1, 0, 0)) >+ dhcpCb.setCallback(self.ipMethodCb, (radio, ipEntry, prefixEntry)) >+ manualCb.setCallback(self.ipMethodCb, (radio, ipEntry, prefixEntry)) >+ >+ self.ipMethodCb((radio, ipEntry, prefixEntry)) >+ >+ bb = ButtonBar(screen, (TEXT_OK_BUTTON, TEXT_BACK_BUTTON)) >+ >+ title = _("IPv4 Configuration for %s") % (dev.info['DEVICE']) >+ toplevel = GridFormHelp(screen, title, "networkipv4", 1, 5) >+ >+ toplevel.add(self.topgrid, 0, 0, (0, 0, 0, 0), anchorLeft = 1) >+ toplevel.add(maingrid, 0, 1, (0, 0, 0, 0), anchorLeft = 1) >+ toplevel.add(bb, 0, 2, (0, 1, 0, 0), growx = 1, growy = 0) >+ >+ while 1: >+ result = toplevel.run() >+ rc = bb.buttonPressed(result) >+ >+ if rc == TEXT_BACK_CHECK: >+ screen.popWindow() >+ return INSTALL_BACK >+ >+ bootproto = radio.getSelection() >+ dev.set(('bootproto', bootproto)) >+ >+ if bootproto == 'dhcp': >+ dev.unset('ipaddr') >+ dev.unset('netmask') >+ dev.unset('network') >+ dev.unset('broadcast') >+ break >+ >+ ip = ipEntry.value() >+ nm = prefixEntry.value() >+ >+ # check for missing values >+ if ip == '' or ip is None: >+ handleIPMissing(screen, _('IPv4 address')) >+ continue >+ >+ if nm == '' or nm is None: >+ handleIPMissing(screen, _('IPv4 network mask')) >+ continue >+ >+ # validate IP address >+ try: >+ network.sanityCheckIPString(ip) >+ dev.set(('ipaddr', ip)) >+ except network.IPMissing, msg: >+ handleIPMissing(screen, _('IPv4 address')) >+ continue >+ except network.IPError, msg: >+ handleIPError(screen, _('IPv4 address'), msg) >+ continue >+ >+ # validate prefix (netmask) >+ try: >+ if nm.find('.') == -1: >+ if int(nm) > 32 or int(nm) < 0: >+ handleInvalidPrefix(screen, socket.AF_INET) > continue >+ else: >+ nm = isys.prefix2netmask(int(nm)) > >- val = entrys[t].value() >+ network.sanityCheckIPString(nm) >+ dev.set(('netmask', nm)) >+ except network.IPMissing, msg: >+ handleIPMissing(screen, _('IPv4 prefix (network mask)')) >+ continue >+ except network.IPError, msg: >+ handleIPError(screen, _('IPv4 prefix (network mask)'), msg) >+ continue >+ except ValueError: >+ handleValueErrorPrefix(screen, _('IPv4 prefix (network mask)')) >+ continue > >- if ((t == 'ipaddr' or t == 'netmask') and \ >- self.ipv4Cb.selected()) or \ >- (t == 'ipv6addr' and self.ipv6Cb.selected()) or \ >- (t == 'remip'): >- if t == 'netmask' and val.find('.') == -1: >- try: >- if int(val) > 32 or int(val) < 0: >- ButtonChoiceWindow(screen, >- _("Invalid Prefix"), >- _("IPv4 prefix must be between " >- "0 and 32."), buttons = [_("OK")]) >- valsgood = 0 >- break >- else: >- val = isys.prefix2netmask(int(val)) >- except: >- handleIPMissing(screen, t) >- valsgood = 0 >- break >- >- try: >- network.sanityCheckIPString(val) >- tmpvals[t] = val >- except network.IPMissing, msg: >- handleIPMissing(screen, t) >- valsgood = 0 >- break >- except network.IPError, msg: >- handleIPError(screen, t, msg) >- valsgood = 0 >- break >- >- elif t == 'ipv6prefix' and self.ipv6Cb.selected(): >- try: >- if int(val) > 128 or int(val) < 0: >- ButtonChoiceWindow(screen, _("Invalid Prefix"), >- _("IPv6 prefix must be between 0 and 128."), >- buttons = [_("OK")]) >- valsgood = 0 >- break >- except: >- ButtonChoiceWindow(screen, _("Invalid Prefix"), >- _("Invalid or missing IPv6 prefix (must be " >- "between 0 and 128)."), buttons = [_("OK")]) >- valsgood = 0 >- break >+ # calculate network and broadcast addresses (IPv4-only) >+ try: >+ (net, bc) = isys.inet_calcNetBroad(dev.get('ipaddr'), >+ dev.get('netmask')) >+ dev.set(('network', net), ('broadcast', bc)) >+ except Exception, e: >+ handleBroadCastError(screen) >+ continue > >- if valsgood == 0: >- continue >+ break >+ >+ screen.popWindow() >+ return INSTALL_OK >+ >+ def runIPv6Screen(self, screen, dev): >+ ipv6autoconf = dev.get('ipv6_autoconf').lower() >+ ipv6addr = dev.get('ipv6addr') >+ ipv6prefix = None >+ brk = ipv6addr.find('/') >+ if brk != -1: >+ ipv6addr = ipv6addr[0:brk] >+ brk += 1 >+ ipv6prefix = ipv6addr[brk:] >+ >+ # default to automatic neighbor discovery if no ipv6 values exist >+ if ipv6autoconf == '' or ipv6autoconf is None or \ >+ ipv6addr == '' or ipv6addr is None: >+ ipv6autoconf = 'yes' >+ ipv6addr = None >+ ipv6prefix = None >+ dev.unset('ipv6_autoconf') >+ dev.unset('ipv6addr') >+ >+ radio = RadioGroup() >+ >+ maingrid = Grid(1, 4) >+ autoCb = radio.add(_('Automatic neighbor discovery'), 'auto', >+ (ipv6autoconf == 'yes')) >+ maingrid.setField(autoCb, 0, 0, growx = 1, anchorLeft = 1) >+ dhcpCb = radio.add(_('Dynamic IP configuration (DHCPv6)'), 'dhcp', >+ (ipv6addr is not None and ipv6addr == 'dhcp')) >+ maingrid.setField(dhcpCb, 0, 1, growx = 1, anchorLeft = 1) >+ manualCb = radio.add(_('Manual address configuration'), 'static', >+ (ipv6addr is not None and ipv6addr != 'dhcp')) >+ maingrid.setField(manualCb, 0, 2, growx = 1, anchorLeft = 1) >+ >+ manualgrid = Grid(3, 2) >+ ipEntry = Entry(41) >+ prefixEntry = Entry(6) >+ if radio.getSelection() == 'static': >+ ipEntry.set(ipv6addr) >+ if ipv6prefix is not None: >+ prefixEntry.set(ipv6prefix) >+ >+ manualgrid = self.createManualEntryGrid(ipEntry, prefixEntry, >+ socket.AF_INET6) >+ maingrid.setField(manualgrid, 0, 3, anchorLeft = 1, growx = 1, >+ padding = (0, 1, 0, 0)) >+ autoCb.setCallback(self.ipMethodCb, (radio, ipEntry, prefixEntry)) >+ dhcpCb.setCallback(self.ipMethodCb, (radio, ipEntry, prefixEntry)) >+ manualCb.setCallback(self.ipMethodCb, (radio, ipEntry, prefixEntry)) >+ >+ self.ipMethodCb((radio, ipEntry, prefixEntry)) >+ >+ bb = ButtonBar(screen, (TEXT_OK_BUTTON, TEXT_BACK_BUTTON)) > >- if self.ipv4Cb.selected(): >- try: >- (net, bc) = isys.inet_calcNetBroad (tmpvals['ipaddr'], >- tmpvals['netmask']) >- except Exception, e: >- print e >- handleBroadCastError() >- valsgood = 0 >+ title = _("IPv6 Configuration for %s") % (dev.info['DEVICE']) >+ toplevel = GridFormHelp(screen, title, "networkipv6", 1, 6) > >- if not valsgood: >+ toplevel.add(self.topgrid, 0, 0, (0, 0, 0, 0), anchorLeft = 1) >+ toplevel.add(maingrid, 0, 1, (0, 0, 0, 0), anchorLeft = 1) >+ toplevel.add(bb, 0, 2, (0, 1, 0, 0), growx = 1, growy = 0) >+ >+ while 1: >+ result = toplevel.run() >+ rc = bb.buttonPressed(result) >+ >+ if rc == TEXT_BACK_CHECK: >+ screen.popWindow() >+ return INSTALL_BACK >+ >+ dev.unset('ipv6_autoconf') >+ dev.unset('ipv6addr') >+ >+ if radio.getSelection() == 'auto': >+ dev.set(('ipv6_autoconf', 'yes')) >+ break >+ elif radio.getSelection() == 'dhcp': >+ dev.set(('ipv6addr', 'dhcp')) >+ break >+ >+ ip = ipEntry.value() >+ prefix = prefixEntry.value() >+ >+ # check for missing values >+ if ip == '' or ip is None: >+ handleIPMissing(screen, _('IPv6 address')) >+ continue >+ >+ if prefix == '' or prefix is None: >+ handleIPMissing(screen, _('IPv6 prefix')) >+ continue >+ >+ # validate the IP address >+ try: >+ network.sanityCheckIPString(ip) >+ except network.IPMissing, msg: >+ handleIPMissing(screen, _('IPv6 address')) >+ continue >+ except network.IPError, msg: >+ handleIPError(screen, _('IPv6 address'), msg) >+ continue >+ >+ # validate the prefix >+ try: >+ if int(prefix) > 128 or int(prefix) < 0: >+ handleInvalidPrefix(screen, socket.AF_INET6) > continue >+ except: >+ handleValueErrorPrefix(screen, _('IPv6 prefix')) >+ continue > >- for t in entrys.keys(): >- if tmpvals.has_key(t): >- if t == 'ipv6addr': >- if entrys['ipv6prefix'] is not None: >- a = tmpvals[t] >- if a.find('/') != -1: >- a = a[0:a.find('/')] >- p = entrys['ipv6prefix'].value() >- q = "%s/%s" % (a, p,) >- else: >- q = "%s" % (tmpvals[t],) >- >- dev.set((t, q)) >- else: >- dev.set((t, tmpvals[t])) >- else: >- dev.set((t, entrys[t].value())) >+ # set the manual IPv6 address/prefix >+ if ipv6prefix is not None: >+ addr = "%s/%s" % (ipv6addr, ipv6prefix,) >+ else: >+ addr = "%s" % (ipv6addr,) > >- if self.ipv4Cb.selected(): >- dev.set(('network', net), ('broadcast', bc)) >+ dev.set(('ipv6addr', addr)) > > break > > screen.popWindow() > return INSTALL_OK > >+ def chooseNetworkDevice(self, screen): >+ devs = self.devices.keys() >+ devs.sort(cmp=isys.compareNetDevices) >+ >+ # return if there are no NICs >+ if len(devs) == 0: >+ return INSTALL_OK >+ >+ # only ask Yes/No if this system has just one NIC (most end users) >+ if len(devs) == 1: >+ rc = self.intf.messageWindow(_("Configure Network Interface"), >+ _("Would you like to configure the %s network " >+ "interface in your system?") % (devs[0],), >+ type = "yesno") >+ >+ if rc == 1: >+ return self.devices[devs[0]] >+ else: >+ return INSTALL_OK >+ >+ # create list box of network devices >+ devList = Listbox(height=5, scroll=1) >+ for item in devs: >+ try: >+ if self.devListDescs[item] is None: >+ self.devListDescs[item] = _("UNCONFIGURED") >+ except KeyError, e: >+ self.devListDescs[item] = _("UNCONFIGURED") >+ >+ desc = "%s: %s" % (item, self.devListDescs[item],) >+ devList.append(desc, item) >+ >+ # create some sort of dialog box >+ toplevel = GridFormHelp(screen, _("Network Configuration"), >+ "netconfig", 1, 5) >+ text = TextboxReflowed(65, >+ _("The current configuration settings for each " >+ "interface are listed next to the device " >+ "name. Unconfigured interfaces are shown as " >+ "UNCONFIGURED. To configure an interface, " >+ "highlight it and choose Edit. When you are " >+ "finished, press OK to continue.")) >+ toplevel.add(text, 0, 0, (0, 0, 0, 1)) >+ >+ bb = ButtonBar(screen, (TEXT_EDIT_BUTTON, >+ TEXT_OK_BUTTON, TEXT_BACK_BUTTON)) >+ >+ toplevel.add(devList, 0, 1, padding = (0, 0, 0, 0)) >+ toplevel.add(bb, 0, 2, (0, 1, 0, 0), growx = 1, growy = 0) >+ >+ while 1: >+ result = toplevel.run() >+ rc = bb.buttonPressed (result) >+ >+ devname = devList.current() >+ >+ if rc == TEXT_BACK_CHECK: >+ return INSTALL_BACK >+ elif rc == TEXT_OK_CHECK: >+ return INSTALL_OK >+ elif rc == TEXT_EDIT_CHECK: >+ return self.devices[devname] >+ > def __call__(self, screen, anaconda, showonboot=1): >+ self.intf = anaconda.intf >+ self.devListDescs = {} > self.devices = anaconda.id.network.available() >+ > if not self.devices: > return INSTALL_NOOP > >- list = self.devices.keys() >- list.sort(cmp=isys.compareNetDevices) >- devLen = len(list) >- if anaconda.dir == DISPATCH_FORWARD: >- currentDev = 0 >- else: >- currentDev = devLen - 1 >+ # collect configuration data for each interface selected by the user >+ doConf = True >+ while doConf is True: >+ if len(self.devices) == 1 and doConf is False: >+ return INSTALL_OK >+ >+ dev = self.chooseNetworkDevice(screen) >+ >+ if dev == INSTALL_OK or dev == INSTALL_BACK: >+ doConf = False >+ return dev >+ >+ descr = dev.get('desc') >+ hwaddr = dev.get('hwaddr') >+ if descr is None or len(descr) == 0: >+ descr = None >+ if hwaddr is None or len(hwaddr) == 0: >+ hwaddr = None >+ >+ self.topgrid = Grid(1, 2) >+ >+ if descr is not None: >+ self.topgrid.setField(Label (_("%s") % (descr[:70],)), >+ 0, 0, padding = (0, 0, 0, 0), >+ anchorLeft = 1, growx = 1) >+ if hwaddr is not None: >+ self.topgrid.setField(Label (_("%s") %(hwaddr,)), >+ 0, 1, padding = (0, 0, 0, 1), >+ anchorLeft = 1, growx = 1) > >- while currentDev < devLen and currentDev >= 0: >- rc = self.runScreen(screen, anaconda.id.network, >- self.devices[list[currentDev]], >- showonboot) >+ # 1st netconfig dialog: protocol and active on boot >+ rc = self.runMainScreen(screen, dev, showonboot) > if rc == INSTALL_BACK: >- currentDev = currentDev - 1 >+ continue > else: >- currentDev = currentDev + 1 >+ doIPv4 = bool(dev.get('useIPv4')) >+ doIPv6 = bool(dev.get('useIPv6')) >+ >+ # 2nd netconfig dialog: IPv4 settings >+ if doIPv4: >+ rc = self.runIPv4Screen(screen, dev) >+ if rc == INSTALL_BACK: >+ continue >+ >+ # 3rd netconfig dialog: IPv6 settings >+ if doIPv6: >+ rc = self.runIPv6Screen(screen, dev) >+ if rc == INSTALL_BACK: >+ continue >+ >+ # set the listbox description text >+ if bool(dev.get('onboot')): >+ onboot = _("Active on boot") >+ else: >+ onboot = _("Inactive on boot") >+ >+ if dev.get('bootproto').lower() == 'dhcp': >+ ipv4 = _("DHCP") >+ else: >+ ipv4 = dev.get('ipaddr') >+ >+ if bool(dev.get('ipv6_autoconf')): >+ ipv6 = _("Auto IPv6") >+ elif dev.get('ipv6addr').lower() == 'dhcp': >+ ipv6 = _("DHCPv6") >+ else: >+ ipv6 = dev.get('ipv6addr') >+ >+ devname = dev.get('device').lower() >+ if ipv4 is not None and ipv6 is not None: >+ desc = _("%s, %s, %s") % (onboot, ipv4, ipv6,) >+ elif ipv4 is not None and ipv6 is None: >+ desc = _("%s, %s") % (onboot, ipv4,) >+ elif ipv4 is None and ipv6 is not None: >+ desc = _("%s, %s") % (onboot, ipv6,) >+ self.devListDescs[devname] = desc >+ >+ if len(self.devices) == 1 and doConf is True: >+ doConf = False >+ >+ return INSTALL_OK > >- if currentDev < 0: >- return INSTALL_BACK >- else: >- return INSTALL_OK > > class NetworkGlobalWindow: > def __call__(self, screen, anaconda, showonboot = 1): >@@ -508,20 +696,20 @@ class NetworkGlobalWindow: > network.sanityCheckIPString(gwEntry.value()) > anaconda.id.network.gateway = gwEntry.value() > except network.IPMissing, msg: >- handleMissingOptionalIP(screen, 'gateway') >+ handleMissingOptionalIP(screen, _("gateway")) > pass > except network.IPError, msg: >- handleIPError(screen, 'gateway', msg) >+ handleIPError(screen, _("gateway"), msg) > continue > > try: > network.sanityCheckIPString(ns1Entry.value()) > anaconda.id.network.primaryNS = ns1Entry.value() > except network.IPMissing, msg: >- handleMissingOptionalIP(screen, 'primary DNS') >+ handleMissingOptionalIP(screen, _("primary DNS")) > pass > except network.IPError, msg: >- handleIPError(screen, 'primary DNS', msg) >+ handleIPError(screen, _("primary DNS"), msg) > continue > > try: >@@ -530,7 +718,7 @@ class NetworkGlobalWindow: > except network.IPMissing, msg: > pass > except network.IPError, msg: >- handleIPError(screen, 'secondary DNS', msg) >+ handleIPError(screen, _("secondary DNS"), msg) > continue > > break >@@ -592,7 +780,7 @@ class HostnameWindow: > _("If your system is part of a larger network " > "where hostnames are assigned by DHCP, " > "select automatically via DHCP. Otherwise, " >- "select manually and enter in a hostname for " >+ "select manually and enter a hostname for " > "your system. If you do not, your system " > "will be known as 'localhost.'")) > toplevel.add(text, 0, 0, (0, 0, 0, 1)) >Index: ui/netpostconfig.glade >=================================================================== >RCS file: ui/netpostconfig.glade >diff -N ui/netpostconfig.glade >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ui/netpostconfig.glade 29 May 2007 21:01:02 -0000 >@@ -0,0 +1,943 @@ >+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> >+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> >+ >+<glade-interface> >+ >+<widget class="GtkDialog" id="net_post_config_win"> >+ <property name="border_width">5</property> >+ <property name="width_request">550</property> >+ <property name="visible">True</property> >+ <property name="title" translatable="yes">Edit Interface</property> >+ <property name="type">GTK_WINDOW_TOPLEVEL</property> >+ <property name="window_position">GTK_WIN_POS_CENTER</property> >+ <property name="modal">False</property> >+ <property name="resizable">True</property> >+ <property name="destroy_with_parent">False</property> >+ <property name="decorated">True</property> >+ <property name="skip_taskbar_hint">False</property> >+ <property name="skip_pager_hint">False</property> >+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> >+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> >+ <property name="focus_on_map">True</property> >+ <property name="urgency_hint">False</property> >+ <property name="has_separator">True</property> >+ >+ <child internal-child="vbox"> >+ <widget class="GtkVBox" id="dialog-vbox1"> >+ <property name="visible">True</property> >+ <property name="homogeneous">False</property> >+ <property name="spacing">0</property> >+ >+ <child internal-child="action_area"> >+ <widget class="GtkHButtonBox" id="dialog-action_area1"> >+ <property name="visible">True</property> >+ <property name="layout_style">GTK_BUTTONBOX_END</property> >+ >+ <child> >+ <widget class="GtkButton" id="button_cancel"> >+ <property name="visible">True</property> >+ <property name="can_default">True</property> >+ <property name="can_focus">True</property> >+ <property name="label">gtk-cancel</property> >+ <property name="use_stock">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="response_id">-6</property> >+ </widget> >+ </child> >+ >+ <child> >+ <widget class="GtkButton" id="button_ok"> >+ <property name="visible">True</property> >+ <property name="can_default">True</property> >+ <property name="can_focus">True</property> >+ <property name="label">gtk-ok</property> >+ <property name="use_stock">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="response_id">-5</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">True</property> >+ <property name="pack_type">GTK_PACK_END</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkVBox" id="vbox2"> >+ <property name="visible">True</property> >+ <property name="homogeneous">False</property> >+ <property name="spacing">0</property> >+ >+ <child> >+ <widget class="GtkLabel" id="configure_dev"> >+ <property name="visible">True</property> >+ <property name="label" translatable="yes"><b>Description Goes Here</b></property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">True</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.540000021458</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">4</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="hardware_address"> >+ <property name="visible">True</property> >+ <property name="label" translatable="yes"><b>Hardware address: DE:AD:00:BE:EF:00</b></property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">True</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment8"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">5</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">0</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkCheckButton" id="enable_ipv4"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Enable IPv4 support</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">True</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment1"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">20</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkRadioButton" id="dhcp_ipv4"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Dynamic IP configuration (DHCP)</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">True</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment2"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">20</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkRadioButton" id="manual_ipv4"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Manual configuration</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">False</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ <property name="group">dhcp_ipv4</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment3"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">5</property> >+ <property name="left_padding">40</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkTable" id="table1"> >+ <property name="visible">True</property> >+ <property name="n_rows">2</property> >+ <property name="n_columns">3</property> >+ <property name="homogeneous">False</property> >+ <property name="row_spacing">0</property> >+ <property name="column_spacing">0</property> >+ >+ <child> >+ <widget class="GtkEntry" id="ipv4_address"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">16</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkEntry" id="ipv4_prefix"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">16</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ <packing> >+ <property name="left_attach">2</property> >+ <property name="right_attach">3</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="ipv4_slash_label"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="label" translatable="yes">/</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_CENTER</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">5</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">1</property> >+ <property name="right_attach">2</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="ipv4_address_label"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="label" translatable="yes">IP Address</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="ipv4_prefix_label"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="label" translatable="yes">Prefix (Netmask)</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">2</property> >+ <property name="right_attach">3</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment9"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">5</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">0</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkCheckButton" id="enable_ipv6"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Enable IPv6 support</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">True</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment4"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">20</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkRadioButton" id="auto_ipv6"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Automatic neighbor discovery</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">True</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment5"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">20</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkRadioButton" id="dhcp_ipv6"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Dynamic IP configuration (DHCPv6)</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">False</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ <property name="group">auto_ipv6</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment6"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">20</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkRadioButton" id="manual_ipv6"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="label" translatable="yes">Manual configuration</property> >+ <property name="use_underline">True</property> >+ <property name="relief">GTK_RELIEF_NORMAL</property> >+ <property name="focus_on_click">True</property> >+ <property name="active">False</property> >+ <property name="inconsistent">False</property> >+ <property name="draw_indicator">True</property> >+ <property name="group">auto_ipv6</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment7"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">10</property> >+ <property name="left_padding">40</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkTable" id="table2"> >+ <property name="visible">True</property> >+ <property name="n_rows">2</property> >+ <property name="n_columns">3</property> >+ <property name="homogeneous">False</property> >+ <property name="row_spacing">0</property> >+ <property name="column_spacing">0</property> >+ >+ <child> >+ <widget class="GtkEntry" id="ipv6_address"> >+ <property name="width_request">323</property> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">40</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkEntry" id="ipv6_prefix"> >+ <property name="width_request">30</property> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">3</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ <packing> >+ <property name="left_attach">2</property> >+ <property name="right_attach">3</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="ipv6_address_label"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="label" translatable="yes">IP Address</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="ipv6_slash_label"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="label" translatable="yes">/</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_CENTER</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">5</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">1</property> >+ <property name="right_attach">2</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="ipv6_prefix_label"> >+ <property name="visible">True</property> >+ <property name="sensitive">False</property> >+ <property name="label" translatable="yes">Prefix</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">2</property> >+ <property name="right_attach">3</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">True</property> >+ <property name="fill">True</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment14"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">10</property> >+ <property name="left_padding">0</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkTable" id="wireless_table"> >+ <property name="visible">True</property> >+ <property name="n_rows">2</property> >+ <property name="n_columns">2</property> >+ <property name="homogeneous">False</property> >+ <property name="row_spacing">10</property> >+ <property name="column_spacing">0</property> >+ >+ <child> >+ <widget class="GtkLabel" id="label1"> >+ <property name="visible">True</property> >+ <property name="label" translatable="yes">ESSID:</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkLabel" id="label2"> >+ <property name="visible">True</property> >+ <property name="label" translatable="yes">Encryption Key:</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment19"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">5</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkEntry" id="enc_key"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">0</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="left_attach">1</property> >+ <property name="right_attach">2</property> >+ <property name="top_attach">1</property> >+ <property name="bottom_attach">2</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment20"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">5</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkEntry" id="essid"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">0</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="left_attach">1</property> >+ <property name="right_attach">2</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">True</property> >+ <property name="fill">True</property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment15"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">10</property> >+ <property name="left_padding">0</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkTable" id="ptp_table"> >+ <property name="visible">True</property> >+ <property name="n_rows">1</property> >+ <property name="n_columns">2</property> >+ <property name="homogeneous">False</property> >+ <property name="row_spacing">0</property> >+ <property name="column_spacing">0</property> >+ >+ <child> >+ <widget class="GtkLabel" id="label3"> >+ <property name="visible">True</property> >+ <property name="label" translatable="yes">Point to Point (IP):</property> >+ <property name="use_underline">False</property> >+ <property name="use_markup">False</property> >+ <property name="justify">GTK_JUSTIFY_LEFT</property> >+ <property name="wrap">False</property> >+ <property name="selectable">False</property> >+ <property name="xalign">0</property> >+ <property name="yalign">0.5</property> >+ <property name="xpad">0</property> >+ <property name="ypad">0</property> >+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> >+ <property name="width_chars">-1</property> >+ <property name="single_line_mode">False</property> >+ <property name="angle">0</property> >+ </widget> >+ <packing> >+ <property name="left_attach">0</property> >+ <property name="right_attach">1</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="x_options">fill</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ >+ <child> >+ <widget class="GtkAlignment" id="alignment18"> >+ <property name="visible">True</property> >+ <property name="xalign">0.5</property> >+ <property name="yalign">0.5</property> >+ <property name="xscale">1</property> >+ <property name="yscale">1</property> >+ <property name="top_padding">0</property> >+ <property name="bottom_padding">0</property> >+ <property name="left_padding">5</property> >+ <property name="right_padding">0</property> >+ >+ <child> >+ <widget class="GtkEntry" id="ptp_ip"> >+ <property name="visible">True</property> >+ <property name="can_focus">True</property> >+ <property name="editable">True</property> >+ <property name="visibility">True</property> >+ <property name="max_length">0</property> >+ <property name="text" translatable="yes"></property> >+ <property name="has_frame">True</property> >+ <property name="invisible_char">â¢</property> >+ <property name="activates_default">False</property> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="left_attach">1</property> >+ <property name="right_attach">2</property> >+ <property name="top_attach">0</property> >+ <property name="bottom_attach">1</property> >+ <property name="y_options"></property> >+ </packing> >+ </child> >+ </widget> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">True</property> >+ <property name="fill">True</property> >+ </packing> >+ </child> >+ </widget> >+ <packing> >+ <property name="padding">0</property> >+ <property name="expand">False</property> >+ <property name="fill">False</property> >+ </packing> >+ </child> >+ </widget> >+ </child> >+</widget> >+ >+</glade-interface>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 213110
: 155632