summaryrefslogtreecommitdiffstats
path: root/iw/ipwidget.py
diff options
context:
space:
mode:
authorMike Fulbright <msf@redhat.com>2002-05-09 19:59:36 +0000
committerMike Fulbright <msf@redhat.com>2002-05-09 19:59:36 +0000
commitb0fac0f3f25a0957e49b326fec08a95192196d54 (patch)
treef3b1d6d98745b0b875c2254264d6f1840662fcea /iw/ipwidget.py
parent1be5362961a35bd64422f0513dfe9b99f4f74683 (diff)
downloadanaconda-b0fac0f3f25a0957e49b326fec08a95192196d54.tar.gz
anaconda-b0fac0f3f25a0957e49b326fec08a95192196d54.tar.xz
anaconda-b0fac0f3f25a0957e49b326fec08a95192196d54.zip
widget to smartly handle IPs
Diffstat (limited to 'iw/ipwidget.py')
-rw-r--r--iw/ipwidget.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/iw/ipwidget.py b/iw/ipwidget.py
new file mode 100644
index 000000000..1af538368
--- /dev/null
+++ b/iw/ipwidget.py
@@ -0,0 +1,139 @@
+#
+# 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 gettext
+import gtk
+import gobject
+import gui
+from translate import _, N_
+
+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])$')
+_=gettext.gettext
+
+# Includes an error message, and the widget with problems
+class IPError(Exception):
+ pass
+
+class IPEditor:
+ def __init__ (self):
+ self.entry1 = gtk.Entry(3)
+ self.entry2 = gtk.Entry(3)
+ self.entry3 = gtk.Entry(3)
+ self.entry4 = gtk.Entry(3)
+ self.entry1.set_max_length(3)
+ self.entry1.connect('insert_text', self.entry_insert_text_cb, self.entry2)
+ self.entry2.set_max_length(3)
+ self.entry2.connect('insert_text', self.entry_insert_text_cb, self.entry3)
+ self.entry3.set_max_length(3)
+ self.entry3.connect('insert_text', self.entry_insert_text_cb, self.entry4)
+ self.entry4.set_max_length(3)
+ self.entry4.connect('insert_text', self.entry_insert_text_cb, None)
+
+ hbox = gtk.HBox()
+ hbox.pack_start(self.entry1, gtk.FALSE, gtk.FALSE)
+ hbox.pack_start(gtk.Label('.'), gtk.FALSE, gtk.FALSE)
+ hbox.pack_start(self.entry2, gtk.FALSE, gtk.FALSE)
+ hbox.pack_start(gtk.Label('.'), gtk.FALSE, gtk.FALSE)
+ hbox.pack_start(self.entry3, gtk.FALSE, gtk.FALSE)
+ hbox.pack_start(gtk.Label('.'), gtk.FALSE, gtk.FALSE)
+ hbox.pack_start(self.entry4, gtk.FALSE, gtk.FALSE)
+
+ self.widget = hbox
+
+ def getWidget(self):
+ return self.widget
+
+ def clear_entries (self):
+ self.entry1.set_text('')
+ self.entry2.set_text('')
+ self.entry3.set_text('')
+ self.entry4.set_text('')
+
+ def hydrate (self, ip_string):
+ self.clear_entries()
+
+ #Sanity check the string
+ m = ip_re.match (ip_string)
+ try:
+ if not m:
+ return
+ octets = m.groups()
+ if len(octets) != 4:
+ return
+ for octet in octets:
+ if (int(octet) < 0) or (int(octet) > 255):
+ return
+ except TypeError:
+ return
+ self.entry1.set_text(octets[0])
+ self.entry2.set_text(octets[1])
+ self.entry3.set_text(octets[2])
+ self.entry4.set_text(octets[3])
+
+ def dehydrate (self):
+ widget = None
+ try:
+ widget = self.entry1
+ if int(widget.get_text()) > 255:
+ raise IPError, (_("IP Addresses must contain numbers between 1 and 255"), widget)
+ widget = self.entry2
+ if int(widget.get_text()) > 255:
+ raise IPError, (_("IP Addresses must contain numbers between 1 and 255"), widget)
+ widget = self.entry3
+ if int(widget.get_text()) > 255:
+ raise IPError, (_("IP Addresses must contain numbers between 1 and 255"), widget)
+ widget = self.entry4
+ if int(widget.get_text()) > 255:
+ raise IPError, (_("IP Addresses must contain numbers between 1 and 255"), widget)
+ except ValueError, msg:
+ raise IPError, (_("IP Addresses must contain numbers between 1 and 255"), widget)
+
+ return self.entry1.get_text() + "." + self.entry2.get_text() + "." +self.entry3.get_text() + "." +self.entry4.get_text()
+
+ 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, gtk.FALSE, gtk.FALSE)
+ win.add(vbox)
+ win.show_all()
+ gtk.mainloop()
+