diff options
author | Chris Lumens <clumens@redhat.com> | 2006-06-07 17:51:06 +0000 |
---|---|---|
committer | Chris Lumens <clumens@redhat.com> | 2006-06-07 17:51:06 +0000 |
commit | 6bc5cb7cc41dca020f92af46a2920a04963f0379 (patch) | |
tree | ad279099d2769f18a067683aa811b4dd22fae789 | |
parent | 3fdc96e374e869699a5f3946c673c893a2657c93 (diff) | |
download | anaconda-6bc5cb7cc41dca020f92af46a2920a04963f0379.tar.gz anaconda-6bc5cb7cc41dca020f92af46a2920a04963f0379.tar.xz anaconda-6bc5cb7cc41dca020f92af46a2920a04963f0379.zip |
Move from IPEditors to gtk.Entrys. This will help when people can enter
IPv6 addresses so we don't have a thousand little boxes on the screen.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | iw/ipwidget.py | 150 | ||||
-rw-r--r-- | iw/iscsi_gui.py | 20 | ||||
-rw-r--r-- | iw/network_gui.py | 47 | ||||
-rw-r--r-- | network.py | 28 |
5 files changed, 55 insertions, 199 deletions
@@ -1,3 +1,12 @@ +2006-06-07 Chris Lumens <clumens@redhat.com> + + * network.py (IPError, IPMissing): Moved here from iw/ipwidget.py. + (sanityCheckIPString): Simplified to just check the string, so we can + complicate it up later for IPv6. + * iw/ipwidget.py: Removed. + * iw/iscsi_gui.py: Use a gtk.Entry instead of an IPEditor. + * iw/network_gui.py: Likewise. + 2006-06-07 David Cantrell <dcantrell@redhat.com> * anaconda.spec: Require libdhcp-devel, libdhcp4client-devel, and diff --git a/iw/ipwidget.py b/iw/ipwidget.py deleted file mode 100644 index eab91da77..000000000 --- a/iw/ipwidget.py +++ /dev/null @@ -1,150 +0,0 @@ -# -# class to create an IP address entry widget and to sanity check entered values -# -# Jonathan Blandford <jrb@redhat.com> -# Michael Fulbright <msf@redhat.com> -# -# Copyright 2002 Red Hat, Inc. -# -# This software may be freely redistributed under the terms of the GNU -# library public license. -# -# You should have received a copy of the GNU Library Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# - -import re -import string -import gettext -import gtk -import gobject -import gui -import network -from rhpl.translate import _, N_ - -ip_fields = ['entry1', 'entry2', 'entry3', 'entry4'] - -# Includes an error message, and the widget with problems -class IPError(Exception): - pass - -class IPMissing(Exception): - pass - -class IPEditor: - def __init__ (self): - self.entrys = {} - for name in ip_fields: - self.entrys[name] = gtk.Entry(3) - self.entrys[name].set_size_request(50,-1) - self.entrys[name].set_max_length(3) - - for i in range(0, len(ip_fields)): - name = ip_fields[i] - if name != 'entry4': - nname = self.entrys[ip_fields[i+1]] - else: - nname = None - - self.entrys[name].connect('insert_text', self.entry_insert_text_cb, nname) - - hbox = gtk.HBox() - for name in ip_fields: - hbox.pack_start(self.entrys[name], False, False) - if name != 'entry4': - hbox.pack_start(gtk.Label('.'), False, False) - - self.widget = hbox - - def getWidget(self): - return self.widget - - def getFocusableWidget(self): - return self.entrys['entry1'] - - def clear_entries (self): - for name in ip_fields: - self.entrys[name].set_text('') - - def hydrate (self, ip_string): - self.clear_entries() - - octets = network.sanityCheckIPString(ip_string) - if octets is None: - return - - i = 0 - for name in ip_fields: - self.entrys[name].set_text(octets[i]) - i = i + 1 - - def dehydrate (self): - widget = None - # test if empty - empty = 1 - for e in ['entry1', 'entry2', 'entry3', 'entry4']: - if len(string.strip(self.entrys[e].get_text())) > 0: - empty = 0 - break - - if empty: - raise IPMissing, (_("IP Address is missing"), widget) - - try: - widget = self.entrys['entry1'] - if int(widget.get_text()) > 255 or int(widget.get_text()) <= 0: - raise IPError, (_("IP Addresses must contain numbers between 1 and 255"), widget) - - for ent in ['entry2', 'entry3', 'entry4']: - widget = self.entrys[ent] - if int(widget.get_text()) > 255: - raise IPError, (_("IP Addresses must contain numbers between 0 and 255"), widget) - except ValueError, msg: - raise IPError, (_("IP Addresses must contain numbers between 0 and 255"), widget) - - ents = [] - for ent in (self.entrys['entry1'].get_text(), - self.entrys['entry2'].get_text(), - self.entrys['entry3'].get_text(), - self.entrys['entry4'].get_text()): - if ent != "0": - ents.append(ent.lstrip("0")) - else: - ents.append(ent) - - return "%s.%s.%s.%s" %(ents[0], ents[1], ents[2], ents[3]) - - def entry_insert_text_cb(self, entry, text, length, pos, next): - if text == '.': - entry.emit_stop_by_name ("insert_text") - if next: - next.grab_focus() - return - reg = re.compile ("[^0-9]+") - if reg.match (text): - entry.emit_stop_by_name ("insert_text") - - - -if __name__ == "__main__": - def output(xxx, data): - try: - print data.dehydrate() - except: - print "oops errors" - gtk.mainquit() - - win = gtk.Window() - win.connect('destroy', gtk.mainquit) - vbox = gtk.VBox() - ip = IPEditor() - vbox = gtk.VBox() - vbox.pack_start(ip.getWidget()) - button = gtk.Button("Quit") - button.connect("pressed", output, ip) - vbox.pack_start(button, False, False) - win.add(vbox) - win.show_all() - - gtk.main() diff --git a/iw/iscsi_gui.py b/iw/iscsi_gui.py index ee2e54e4e..f58ab874b 100644 --- a/iw/iscsi_gui.py +++ b/iw/iscsi_gui.py @@ -11,14 +11,13 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # - import gtk import gobject import gui import iutil +import network from rhpl.translate import _, N_ from iw_gui import * -import ipwidget class iscsiWindow(InstallWindow): def __init__(self, ics): @@ -28,12 +27,13 @@ class iscsiWindow(InstallWindow): def getNext(self): try: - self.iscsi.ipaddr = self.ip_widget.dehydrate() - except ipwidget.IPMissing, msg: + network.sanityCheckIPString(self.ip_widget.get_text()) + self.iscsi.ipaddr = self.ip_widget.get_text() + except network.IPMissing, msg: self.intf.messageWindow(_("Error with Data"), _("No IP address entered, skipping iSCSI setup")) - except ipwidget.IPError, msg: - self.intf.messageWindow(_("Error with Data"), _("%s") % (msg[0],)) + except network.IPError, msg: + self.intf.messageWindow(_("Error with Data"), _("%s") % (msg,)) raise gui.StayOnScreen self.iscsi.port = self.port.get_text() @@ -49,8 +49,8 @@ class iscsiWindow(InstallWindow): (self.xml, widget) = gui.getGladeWidget("iscsi-config.glade", "iscsiRows") self.ip_table = self.xml.get_widget("iscsiTable") - self.ip_widget = ipwidget.IPEditor() - self.ip_widget.hydrate(self.iscsi.ipaddr) + self.ip_widget = gtk.Entry() + self.ip_widget.set_text(self.iscsi.ipaddr) self.port = self.xml.get_widget("iscsiPort") if self.iscsi.port: @@ -65,8 +65,8 @@ class iscsiWindow(InstallWindow): # XXX there is too much space around the IP address. Using this # variant had no affect: - # self.ip_table.attach(self.ip_widget.getWidget(), 1, 2, 0, 1, gtk.FILL|gtk.EXPAND) - self.ip_table.attach(self.ip_widget.getWidget(), 1, 2, 0, 1) + # self.ip_table.attach(self.ip_widget, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND) + self.ip_table.attach(self.ip_widget, 1, 2, 0, 1) return widget # vim:tw=78:ts=4:et:sw=4 diff --git a/iw/network_gui.py b/iw/network_gui.py index 25b731197..f91bd2e4b 100644 --- a/iw/network_gui.py +++ b/iw/network_gui.py @@ -22,7 +22,6 @@ import gui from rhpl.translate import _, N_ import network import checklist -import ipwidget global_options = [_("Gateway"), _("Primary DNS"), _("Secondary DNS"), _("Tertiary DNS")] @@ -71,8 +70,9 @@ class NetworkWindow(InstallWindow): tmpvals = {} for t in range(len(global_options)): try: - tmpvals[t] = self.globals[global_options[t]].dehydrate() - except ipwidget.IPMissing, msg: + network.sanityCheckIPString(self.globals[global_options[t]].get_text()) + tmpvals[t] = self.globals[global_options[t]].get_text() + except network.IPMissing, msg: if t < 2 and self.getNumberActiveDevices() > 0: if self.handleMissingOptionalIP(global_options[t]): raise gui.StayOnScreen @@ -81,8 +81,8 @@ class NetworkWindow(InstallWindow): else: tmpvals[t] = None - except ipwidget.IPError, msg: - self.handleIPError(global_options[t], msg[0]) + except network.IPError, msg: + self.handleIPError(global_options[t], msg) raise gui.StayOnScreen self.network.gateway = tmpvals[0] @@ -190,9 +190,6 @@ class NetworkWindow(InstallWindow): def handleNoActiveDevices(self): 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.\n\nNOTE: If you have a PCMCIA-based network adapter you should leave it inactive at this point. When you reboot your system the adapter will be activated automatically."), type="custom", custom_buttons=["gtk-cancel", _("C_ontinue")]) - def setHostnameRadioState(self): - pass - def editDevice(self, data): if self.ignoreEvents: return @@ -266,11 +263,10 @@ class NetworkWindow(InstallWindow): label.set_property("use-underline", True) ipTable.attach(label, 0, 1, t+1, t+2, gtk.FILL, 0, 10) - entry = ipwidget.IPEditor() - entry.hydrate(self.devices[dev].get(options[t][1])) + entry = gtk.Entry() entrys[t] = entry - label.set_mnemonic_widget(entry.getFocusableWidget()) - ipTable.attach(entry.getWidget(), 1, 2, t+1, t+2, 0, gtk.FILL|gtk.EXPAND) + label.set_mnemonic_widget(entry) + ipTable.attach(entry, 1, 2, t+1, t+2, 0, gtk.FILL|gtk.EXPAND) devbox.pack_start(ipTable, False, False, 6) devbox.set_border_width(6) @@ -336,13 +332,14 @@ class NetworkWindow(InstallWindow): tmpvals = {} for t in range(len(options)): try: - tmpvals[t] = entrys[t].dehydrate() - except ipwidget.IPMissing, msg: + network.sanityCheckIPString(entrys[t].get_text()) + tmpvals[t] = entrys[t].get_text() + except network.IPMissing, msg: self.handleIPMissing(options[t][0]) valsgood = 0 break - except ipwidget.IPError, msg: - self.handleIPError(options[t][0], msg[0]) + except network.IPError, msg: + self.handleIPError(options[t][0], msg) valsgood = 0 break @@ -588,9 +585,9 @@ class NetworkWindow(InstallWindow): label.set_alignment(0.0, 0.0) self.ipTable.attach(label, 0, 1, i, i+1, gtk.FILL, 0) align = gtk.Alignment(0, 0.5) - options[i] = ipwidget.IPEditor() - align.add(options[i].getWidget()) - label.set_mnemonic_widget(options[i].getFocusableWidget()) + options[i] = gtk.Entry() + align.add(options[i]) + label.set_mnemonic_widget(options[i]) self.ipTable.attach(align, 1, 2, i, i+1, gtk.FILL, 0) @@ -604,13 +601,17 @@ class NetworkWindow(InstallWindow): if not self.anyUsingDHCP(): if self.network.gateway: - self.globals[_("Gateway")].hydrate(self.network.gateway) + self.globals[_("Gateway")] = self.network.gateway + options[0].set_text(self.network.gateway) if self.network.primaryNS: - self.globals[_("Primary DNS")].hydrate(self.network.primaryNS) + self.globals[_("Primary DNS")] = self.network.primaryNS + options[1].set_text(self.network.primaryNS) if self.network.secondaryNS: - self.globals[_("Secondary DNS")].hydrate(self.network.secondaryNS) + self.globals[_("Secondary DNS")] = self.network.secondaryNS + options[2].set_text(self.network.secondaryNS) if self.network.ternaryNS: - self.globals[_("Tertiary DNS")].hydrate(self.network.ternaryNS) + self.globals[_("Tertiary DNS")] = self.network.ternaryNS + options[3].set_text(self.network.ternaryNS) self.ipTable.set_border_width(6) diff --git a/network.py b/network.py index 755d0dd17..c386e6b9a 100644 --- a/network.py +++ b/network.py @@ -32,6 +32,12 @@ from rhpl.simpleconfig import SimpleConfigFile import logging log = logging.getLogger("anaconda") +class IPError(Exception): + pass + +class IPMissing(Exception): + pass + def inStrRange(v, s): if string.find(s, v) == -1: return 0 @@ -78,25 +84,15 @@ def anyUsingDHCP(devices): return 1 return 0 -# sanity check an IP string. if valid, returns octets, if invalid, return None +# sanity check an IP string. def sanityCheckIPString(ip_string): ip_re = re.compile('^([0-2]?[0-9]?[0-9])\\.([0-2]?[0-9]?[0-9])\\.([0-2]?[0-9]?[0-9])\\.([0-2]?[0-9]?[0-9])$') - - #Sanity check the string - m = ip_re.match (ip_string) - try: - if not m: - return None - octets = m.groups() - if len(octets) != 4: - return None - for octet in octets: - if (int(octet) < 0) or (int(octet) > 255): - return None - except TypeError: - return None - return octets + if ip_string.strip() == "": + raise IPMissing, _("IP Address is missing.") + + if not ip_re.match(ip_string): + raise IPError, _("IP Addresses must contain four numbers between 0 and 255, separated by periods.") def hasActiveNetDev(): # try to load /tmp/netinfo and see if we can sniff out network info |