root/trunk/tool/renetcolGUI_0_0_7.py @ 50

Revision 50, 46.0 KB (checked in by andreu, 15 years ago)

remove rrdwrap.h link in renetcolAgg.h, add field 1 redirection in dataFlowSet.c

  • Property svn:eol-style set to native
RevLine 
[27]1
[36]2##  File: renetcolGUI_0_0_7.py
[27]3 
4##  Authors: ANDREU Francois-Xavier
5 
6##  Copyright (C) 2005 GIP RENATER
7 
8
9##   This file is part of renetcol.
10 
11##   renetcol is free software; you can redistribute it and/or modify
12##   it under the terms of the GNU General Public License as published by
13##   the Free Software Foundation; either version 2 of the License, or
14##   (at your option) any later version.
15 
16##   renetcol is distributed in the hope that it will be useful,
17##   but WITHOUT ANY WARRANTY; without even the implied warranty of
18##   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19##   GNU General Public License for more details.
20 
21##   You should have received a copy of the GNU General Public License
22##   along with renetcol; if not, write to the Free Software
23##   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24 
25
26# Make Windows actually find the stuff installed
27# You must check up if it's the good path to GTK
28gtkdir = 'C:/Program Files/Fichiers communs/GTK/'
29
30import os
31import binascii
32import struct
33import time
34os.environ['PATH'] += ";%s/lib;%s/bin" % (gtkdir, gtkdir)
35
36import threading
37import string
38import re
39import socket
40import sys
41import gtk
42import traceback
43import pango
44import commands
45
46########### DEFAULT VALUES, YOU MUST CHANGE IT ###############################
47IPversion = 4
48localAddr = ''
49localAddr6 = '2001:660:3001:4012:30ec:9207:2a75:1583'
50localPort = 2222
51collectorAddr = "193.51.183.225"
52collectorAddr6 = "2001:660:3000:1011:10::"
53collectorPort = 52571  # if you change it, apply the modification on
54                       # the renetcolSender.h file and recompil the collector
55##############################################################################
56
57myInputControlThread = None
58printValue =      [ 0,1,1,0,1,0,0,1,1,0,
59                    0,1,1,0,0,0,0,0,0,0,
60                    1,0,0,0,0,0,0,1,1,0,
61                    0,0,0,0,0,0,0,0,0,0,
62                    0,0,0,0,0,0,1,1,0,0,
63                    0,0,0,0,0,0,0,0,0,0,
64                    0,0,0,0,0,0,0,0,0,0,
65                    1,1,1,1,1,1,1,1,1,1,
66                    0,0,0,0,0,0,0,0,0,0
67                    ]
68firstParseValue = [ 0,0,0,0,0,0,0,0,0,0,
69                    0,0,0,0,0,0,0,0,0,0,
70                    0,0,0,0,0,0,0,0,0,0,
71                    0,0,0,0,0,0,0,0,0,0,
72                    0,0,0,0,0,0,0,0,0,0,
73                    0,0,0,0,0,0,0,0,0,0,
74                    0,0,0,0,0,0,0,0,0,0,
75                    0,0,0,0,0,0,0,0,0,0,
76                    0,0,0,0,0,0,0,0,0,0
77                    ]
78checkUpValues =   [ 0,0,0,0,0,0,0,0,0,0,
79                    0,0,0,0,0,0,0,0,0,0,
80                    0,0,0,0,0,0,0,0,0,0,
81                    0,0,0,0,0,0,0,0,0,0,
82                    0,0,0,0,0,0,0,0,0,0,
83                    0,0,0,0,0,0,0,0,0,0,
84                    0,0,0,0,0,0,0,0,0,0,
85                    0,0,0,0,0,0,0,0,0,0,
86                    0,0,0,0,0,0,0,0,0,0
87                    ]
88fieldsName =  [ "","IN_BYT","IN_PKTS","","PROT","TOS","TCP_FL","S_PORT","IPv4@S","S_MASK",
89                "InSNMP","D_PORT","IPv4@D","D_MASK","OutSNMP","NextHop","S_AS","D_AS","","",
90                "","Time","","","","","","IPv6@S","IPv6@D","",
91                "","","","","","","","","","",
92                "","","","","","","M_T_L_T","M_T_L_@","","",
93                "","","","","","","","","","",
94                "","","","","","","","","","ROUTER",
95                "M_L_1","M_L_2","M_L_3","M_L_4","M_L_5","M_L_6","M_L_7","M_L_8","M_L_9","M_L_10",
96                "","","","","","","","","",""
97                ]
98flowCpt = 0
99mask = [ 0,0,0 ]
100spaceSep = " "
101tabSep = "\t"
102freeze = 0
103record = 0
104record_file_name = ""
105record_file = None
106is_already_see = 0
107collectorRule=""
108coll_window = gtk.Window()
109router=0
110tpl_def = {}
111os_type = 0
112oldTpl = 0
113fromRouter = ""
114
115class InputControl(threading.Thread):
116    def kill(self, timeout):
117        self.imRunning = 0
118        time.sleep(1)
119        print "\n.\n..\n..."
120        time.sleep(1)
121        print "....\n.....\n......"       
122        time.sleep(1)
123        if self.myFlowInput:
124            self.myFlowInput.socket_close()
125        self.join(timeout)
126       
127    def __init__(self, address, port):
128        self.imRunning = 1
129        self.currentflow = None
130        threading.Thread.__init__(self)
131        self.myFlowInput = FlowInput(address, port)
132
133    def run(self):
134        global freeze, record
135        while self.imRunning:
136            if self.myFlowInput:
137                tmp = self.myFlowInput.get_flow()
138                if (tmp[0]!=None):
139                    self.currentflow = Flow(tmp)
140                    if (freeze==0) & self.currentflow.enable():
141                        self.currentflow.print_flow2()
142                    if (record==1) & self.currentflow.enable():
143                        self.currentflow.write_flow2()
144##                else:
145##                    self.myFlowInput = None
146   
147class Flow:
148    def __init__(self, data):
149        self.flow = [ data[0], data[1] ]
150
151    def enable(self):
152        global firstParseValue, checkUpValues, tpl_def
153        res = 1
154        for i in range (0, len(tpl_def[self.flow[0]])):
155            f = tpl_def[self.flow[0]][i][0]
156            if ( f==8 or f==12 or f==15 or f==18 or f==47) and ( checkUpValues[f]==1 ):
157                res = res & ( ((struct.unpack('>L',(socket.inet_aton(self.flow[1][i])))[0] & mask[1-1]) == firstParseValue[f])| ((struct.unpack('>L',(socket.inet_aton(self.flow[1][i])))[0] & mask[1-1]) == firstParseValue[f]) )
158            elif ( i==27 or i==28 ):
159                pass
160            elif (checkUpValues[f]==1):
161                res = res & (self.flow[1][i] == firstParseValue[f])
162        return res
163               
164    def print_flow2(self):
165        global printValue, tpl_def, flowCpt, fieldsName, oldTpl, os_type, fromRouter
166        myliste = []
167        myTpl = []
168        strFlow = ""
169        strField = ""
170        underscore_line = ""
171        flowCpt+=1
[47]172##        if (flowCpt%20 == 0 or oldTpl != self.flow[0]):
173        if (flowCpt%100 == 0):
[27]174            flowCpt = 0
175            for i in range (0, len(tpl_def[self.flow[0]])):
176                f = tpl_def[self.flow[0]][i][0]
177                if printValue[f]:
178                    if ( f==27 or f==28 or f==62 or f==63 ):
179                        strField += str(fieldsName[f])
180                        l = len(str(fieldsName[f]))
181                        if ((40-l)%8 == 0):
182                            tabNb = int((40-l)/8)
183                        else:
184                            tabNb = int((40-l)/8) + 1
185                        for j in range (0, tabNb):
186                            strField += "\t"
187                        for k in range (0, 40):
188                            underscore_line += "-"
189                    elif ( f==8 or f==15 or f==12 or f==18 or f==47 ):
190                        strField += str(fieldsName[f])
191                        l = len(str(fieldsName[f]))
192                        if ((16-l)%8 == 0):
193                            tabNb = int((16-l)/8)
194                        else:
195                            tabNb = int((16-l)/8) + 1
196                        for j in range (0, tabNb):
197                            strField += "\t"
198                        for k in range (0, 16):
199                            underscore_line += "-"
200                    else:
201                        strField += str(fieldsName[f])
202                        strField += "\t"
203                        for k in range (0, 8):
204                            underscore_line += "-"
205            if (oldTpl != self.flow[0]):
206                print " "
207            if (os_type == 0):
208                esc = '\x1b['
209                sep = ';'
210                end = 'm'
211                if (printValue[69]):
212                    rt = str(fieldsName[69])
213                    toprint = esc+"37"+sep+"44"+end+strField+rt+esc+"0"+end
214                else:
215                    toprint = esc+"37"+sep+"44"+end+strField+esc+"0"+end
216                print toprint
217            else:
218                if (printValue[69]):
219                    strField += str(fieldsName[69])
220                print strField
221                print underscore_line
222        for i in range (0, len(tpl_def[self.flow[0]])):
223            f = tpl_def[self.flow[0]][i][0]
224            if printValue[f]:
225                if ( f==27 or f==28 or f==62 or f==63 ):
226                    strFlow += str(self.flow[1][i])
227                    l = len(str(self.flow[1][i]))
228                    if ((40-l)%8 == 0):
229                        tabNb = int((40-l)/8)
230                    else:
231                        tabNb = int((40-l)/8) + 1
232                    for j in range (0, tabNb):
233                        strFlow += "\t"
234                elif ( f==8 or f==12 or f==15 or f==18 or f==47 ):
235                    strFlow += str(self.flow[1][i])
236                    l = len(str(self.flow[1][i]))
237                    if ((16-l)%8 == 0):
238                        tabNb = int((16-l)/8)
239                    else:
240                        tabNb = int((16-l)/8) + 1
241                    for j in range (0, tabNb):
242                        strFlow += "\t"
243                elif (f==21):
244                    myliste += [str(self.flow[1][i]-self.flow[1][i+1])]
245                    strFlow += str(self.flow[1][i]-self.flow[1][i+1])
246                    strFlow += "\t"
247                elif (f==22):
248                    pass
249                else:
250                    myliste += [str(self.flow[1][i])]
251                    strFlow += str(self.flow[1][i])
252                    for k in range (len(str(self.flow[1][i])), 7):
253                        strFlow += " "
254                    strFlow += "\t"
255        if (printValue[69]):
256            strFlow += fromRouter
257        print strFlow
258        oldTpl = self.flow[0]
259
260    def write_flow2(self):
261        global printValue, record_file, tpl_def
262        myliste = []
263        for i in range (0, len(tpl_def[self.flow[0]])):
264            f = tpl_def[self.flow[0]][i][0]
265            if printValue[f]:
266                if (f==21):
267                    myliste += [str(self.flow[1][i]-self.flow[1][i+1])]
268                elif (f==22):
269                    pass
270                else:
271                    myliste += [str(self.flow[1][i])]
272        theflow = string.join(myliste, "\t")+"\n" 
273        record_file.write(theflow)
274       
275class FlowInput:
276    def __init__(self, h, p):
277        self.HOST = h
278        self.PORT = p
279        if (IPversion == 4):
280            self.socketnumber = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
281        elif (IPversion == 6):
282            self.socketnumber = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
283        else:
284            print "IP protocol ", IPversion ," not supported"
285            exit(0)
286        self.socketnumber.bind((self.HOST, self.PORT))
287   
288    def get_flow(self):
289        global collectorRule, tpl_def, os_type, fromRouter
290        if (self.socketnumber!=None):
291            data = self.socketnumber.recvfrom(1024)
292            flow = data[0]
293            code = struct.unpack('<H', flow[0:2])
294            if (code[0] == 1): ## a def packet
295                routerSrc = struct.unpack('<L', flow[2:6])
296                sourceId = struct.unpack('<L', flow[6:10])
297                tplId = struct.unpack('<H', flow[10:12])
298                mykeylst = []
299                mykeylst += [str(routerSrc[0])]
300                mykeylst += [str(sourceId[0])]
301                mykeylst += [str(tplId[0])]
302                mykeystr = string.join(mykeylst,"");
303                fields = []
304                fieldNb = struct.unpack('<H', flow[12:14])
305                for i in range(0, fieldNb[0]):
306                    fd = struct.unpack('<H',flow[14+(i*4):16+(i*4)])
307                    tp = struct.unpack('<H',flow[14+(2+i*4):16+(2+i*4)])
308                    fields.insert(i,(fd[0],tp[0]))
309                tpl_def[mykeystr] = fields
310                return ( None, None)
311            if (code[0]==11): ## a data packet
312                routerSrc = struct.unpack('<L', flow[4:8])
313                tmp =  struct.unpack('<L', flow[4:8])
314                fromRouter = socket.inet_ntoa(struct.pack('>L', tmp[0]))
315                sourceId = struct.unpack('<L', flow[8:12])
316                tplId = struct.unpack('<H', flow[12:14])
317                mykeylst = []
318                mykeylst += [str(routerSrc[0])]
319                mykeylst += [str(sourceId[0])]
320                mykeylst += [str(tplId[0])]
321                mykeystr = string.join(mykeylst,"")
322                if (tpl_def.has_key(mykeystr)== True):
323                    field_list = []
324                    index = 0
325                    for i in range (0, len(tpl_def[mykeystr])):
326                        if (tpl_def[mykeystr][i][1]==1):
327                            value = struct.unpack('<B',flow[14+index:15+index])
328                            field_list.insert(i,value[0])
329                        if (tpl_def[mykeystr][i][1]==2):
330                            value = struct.unpack('>H',flow[14+index:16+index])
331                            field_list.insert(i,value[0])
332                        if (tpl_def[mykeystr][i][1]==3):
333                            value = struct.unpack('<BBB',flow[14+index:17+index])
334                            valueTmp = struct.pack('<BBBB',value[2],value[1],value[0],0)
335                            valueFinal = struct.unpack('<L', valueTmp)
336                            valueFinal2 = (valueFinal[0])>>4
337                            field_list.insert(i,valueFinal2)
338                        if (tpl_def[mykeystr][i][1]==4):
339                            if (tpl_def[mykeystr][i][0]==8 or tpl_def[mykeystr][i][0]==12 or tpl_def[mykeystr][i][0]==15 or tpl_def[mykeystr][i][0]==18 or tpl_def[mykeystr][i][0]==47):
340                                value = socket.inet_ntoa(flow[14+index:18+index])
341                                field_list.insert(i,value)
342                            else:
343                                value = struct.unpack('<L', flow[14+index:18+index])
344                                value = struct.unpack('>L', flow[14+index:18+index])
345                                field_list.insert(i,value[0])
346                        if (tpl_def[mykeystr][i][1]==16):
347                            if (os_type==1):
348                                field_list.insert(i,nt_inet_ntop(flow[14+index:30+index]))
349                            else:
350                                tmp = socket.inet_ntop(socket.AF_INET6,flow[14+index:30+index])
351                                field_list.insert(i,tmp)
352                        index += tpl_def[mykeystr][i][1]
353                    return mykeystr, field_list
354##                else:
355##                  print "I'm waiting the tpl def for the key", mykeystr
356##                return (routerSrc[0], field_list)
357            return ( None, None)
358        return ( None, None)
359
360    def socket_close(self):
361        if self.socketnumber:
362           try :
363               self.socketnumber.shutdown(2)
364               self.socketnumber = None
365           except socket.error:
366              pass
367
368class FileSel:
369    def file_ok_sel(self, w):
370        global record, record_file, record_file_name
371        record = 1
372        record_file_name = self.fileSel.get_filename()
373        record_file = file(record_file_name, 'w')
374        print "%s" % self.fileSel.get_filename()
375        self.fileSel.destroy()
376
377    def destroy(self, widget):
378        self.fileSel.destroy()
379
380    def __init__(self):
381        self.fileSel = gtk.FileSelection("File Selection")
382        self.fileSel.connect("destroy", self.destroy)
383        self.fileSel.ok_button.connect("clicked", self.file_ok_sel)
384        self.fileSel.cancel_button.connect("clicked",
385                                           lambda w: self.fileSel.destroy())
386        self.fileSel.set_filename("flow_record.txt")
387        self.fileSel.show()
388
389def print_hello(widget, event):
390    print "Hello, World!"
391
392def nt_inet_ntop(packed_ip):
393    cpt = 0
394    double = 0
395    string_ip = ""
396    tmp = binascii.hexlify(packed_ip[0:2])
397    if ( int(tmp,16)!=0 ):
398        string_ip += tmp
399        tmp = binascii.hexlify(packed_ip[2:4])
400        if ( int(tmp,16)==0 ):
401            cpt+=1
402            double = 1
403            if (cpt==1):
404                string_ip += ":"
405        else:
406            cpt=0
407            string_ip += ":"+tmp
408        tmp = binascii.hexlify(packed_ip[4:6])
409        if ( int(tmp,16)==0 ):
410            cpt+=1
411            double = 1
412            if (cpt==1):
413                string_ip += ":"
414        else:
415            cpt=0
416            string_ip += ":"+tmp
417        tmp = binascii.hexlify(packed_ip[6:8])
418        if ( int(tmp,16)==0 ):
419            if (double==1 and cpt==0):
420                string_ip += ":0"
421            else:
422                cpt+=1
423                double = 1
424                if (cpt==1):
425                    string_ip += ":"
426        else:
427            cpt=0
428            string_ip += ":"+tmp
429        tmp = binascii.hexlify(packed_ip[8:10])
430        if ( int(tmp,16)==0 ):
431            if (double==1 and cpt==0):
432                string_ip += ":0"
433            else:
434                cpt+=1
435                double = 1
436                if (cpt==1):
437                    string_ip += ":"
438        else:
439            cpt=0
440            string_ip += ":"+tmp
441        tmp = binascii.hexlify(packed_ip[10:12])
442        if ( int(tmp,16)==0 ):
443            if (double==1 and cpt==0):
444                string_ip += ":0"
445            else:
446                cpt+=1
447                double = 1
448                if (cpt==1):
449                    string_ip += ":"
450        else:
451            cpt=0
452            string_ip += ":"+tmp
453        tmp = binascii.hexlify(packed_ip[12:14])
454        if ( int(tmp,16)==0 ):
455            if (double==1 and cpt==0):
456                string_ip += ":0"
457            else:
458                cpt+=1
459                double = 1
460                if (cpt==1):
461                    string_ip += ":"
462        else:
463            cpt=0
464            string_ip += ":"+tmp
465        tmp = binascii.hexlify(packed_ip[14:16])
466        if ( int(tmp,16) != 0 ):
467            string_ip += ":"+tmp
468        else:
469            string_ip += ":"
470    else:
471        string_ip = "::"
472    return string_ip
473
474def get_main_menu(self, window):
475    accel_group = gtk.AccelGroup()
476    item_factory = gtk.ItemFactory(gtk.MenuBar, "<main>", accel_group)
477    item_factory.create_items(menu_items)
478    window.add_accel_group(accel_group)
479    item_factory = item_factory
480    return item_factory.get_widget("<main>")
481
482def reception(widget, event):
483    global myInputControlThread
484    global localAddr, localPort
485    myInputControlThread = InputControl(localAddr, localPort)
486    myInputControlThread.start()
487
488def close_recept(widget, event):
489    global myInputControlThread
490    if myInputControlThread != None:
491        myInputControlThread.kill(1)
492        myInputControlThread = None
493        print "\n\n\n\n\n Input Stream closed. \n\n\n\n\n"
494
495def about_dialog(widget, event):
496    dialog = gtk.MessageDialog(
497        parent         = None,
498        flags          = gtk.DIALOG_MODAL,
499        type           = gtk.MESSAGE_INFO,
500        buttons        = gtk.BUTTONS_OK,
501        message_format = "Author : FX Andreu\nemail andreu@renater.fr\nCopyright (C) 2005 GIP RENATER\n\nThis file is part of renetcol.\n\nrenetcol is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nrenetcol is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with renetcol; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA ")
502    dialog.set_title('About')
503    dialog.connect('response', lambda dialog, response: dialog.destroy())
504    dialog.show()
505
506def check_dialog(widget, event, text):
507    dialog = gtk.MessageDialog(
508        parent         = None,
509        flags          = gtk.DIALOG_MODAL,
510        type           = gtk.MESSAGE_INFO,
511        buttons        = gtk.BUTTONS_OK,
512        message_format = text)
513    dialog.set_title('Value check ')
514    dialog.connect('response', lambda dialog, response: dialog.destroy())
515    dialog.show()
516
517def info_dialog(widget, event, text):
518    dialog = gtk.MessageDialog(
519        parent         = None,
520        flags          = gtk.DIALOG_MODAL,
521        type           = gtk.MESSAGE_INFO,
522        buttons        = gtk.BUTTONS_OK,
523        message_format = text)
524    dialog.set_title('Information ')
525    dialog.connect('response', lambda dialog, response: dialog.destroy())
526    dialog.show()
527
528def callback_freeze(widget, data=None):
529    global freeze
530    if widget.get_active() == 1:
531        freeze = 1
532        print "FREEZE ACTIF"
533    if widget.get_active() == 0:
534        freeze = 0
535        print "FREEZE NOT ACTIF"
536
537def wind_destroy(widget, data=None):
538    widget.destroy()
539   
540def callback_record(widget, data=None):
541    global record, record_file, record_file_name
542    if widget.get_active() == 1:
543        FileSel()
544    if widget.get_active() == 0:
545        record = 0
546        time.sleep(2)
547        record_file.close()
548
549def strsend(target, message):
550   global collectorAddr, collectorPort
551   s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
552   s.connect((collectorAddr, collectorPort))
553   s.send(message)
554   s.close()
555
556def callback_refresh(widget, parent):
557    global collectorAddr
558    strsend(collectorAddr, 'REFRESH')
559    parent.destroy()
560   
561def callback_delete_rule(widget, parent):
562    global collectorAddr, collectorPort
563    if widget.get_active() == 1:
564        sent_rule(widget, "DELETE")
565        widget.set_active(0)
566        parent.destroy()
567
568def callback_check_rule(widget, data=None):
569    global router
570    if widget.get_active()==1:
571        router=1
572
573def callback_collector(widget, controlWindow):
574    global is_already_see, collectorRule, myInputControlThread, coll_window, collectorAddr
575    if ((myInputControlThread == None) and (widget.get_active() == 1)):
576        info_dialog(widget, None, "You must before activated the stream reception ! (File menu)")
577        widget.set_active(0)
578    else:
579        if widget.get_active() == 1:
580            widget.set_active(0)
581            coll_window.connect("destroy", wind_destroy)
582            coll_window.set_title("Collector control ")
583            coll_window.set_size_request(500, 250)
584            coll_vbox = gtk.VBox(False, 1)
585            coll_vbox.set_border_width(1)
586            coll_window.add(coll_vbox)
587            coll_frame = gtk.Frame("The prefix/IP address/router, validate by enter")
588            coll_vbox.pack_start(coll_frame, False, False, 5)
589            coll_hbox = gtk.VBox(False, 0)
590            coll_hbox.set_border_width(5)
591            coll_frame.add(coll_hbox)
592            button = gtk.CheckButton(" router ")
593            button.connect("toggled", callback_check_rule, None)
594            coll_hbox.pack_start(button, False, False, 0)
595            mainTT.set_tip(button, "Check it to capture all flows from one router and enter the IPv4 address of this router. IN TEST")
596            button.show()
597            coll_pbbox = gtk.HButtonBox()
598            coll_hbox.pack_start(coll_pbbox, False, True, 5)
599            prefix_entry(45, "Required Format : \n <field> <operation> <address>\nlike 8 = 10.0.0.1 \nor 8 = 10.0.1.0/24 \nor 27 = 2001::1 \nor 27 = 2001::/64 (IPv6 address only on Linux system)\nonly '=' operator for the moment\n------------------------------\nIn this version 0.0.7, you can compare the following fields:\nROUTER_SRC_ADDR: 0\nIPV4_SRC_ADDR: 8\nIPV4_DST_ADDR: 12\nIPV4_NEXT_HOP: 15\nBGP_IPV4_NEXT_HOP: 18\nIPV6_SRC_ADDR: 27\nIPV6_DST_ADDR: 28\nIPV6_NEXT_HOP: 62\nBPG_IPV6_NEXT_HOP: 63\nIP_PROTOCOL_VERSION: 60\n---------------------------", coll_pbbox, "", 0)
600            coll_frame2 = gtk.Frame("Disable rules")
601            coll_vbox.pack_start(coll_frame2, False, False, 5)
602            coll_hbox2 = gtk.VBox(False, 0)
603            coll_hbox2.set_border_width(5)
604            coll_frame2.add(coll_hbox2)
605            coll_pbbox2 = gtk.HButtonBox()
606            coll_hbox2.pack_start(coll_pbbox2, False, True, 5)
607            buttondelete = gtk.ToggleButton("Delete")
608            buttondelete.connect("toggled", callback_delete_rule, coll_window)
609            mainTT.set_tip(buttondelete, "Delete all your rules of the collector configuration.")
610            coll_hbox2.pack_start(buttondelete, False, False, 2)
611            buttondelete.show()
612            coll_vbox.show()
613            coll_window.show_all()
614            if (is_already_see==0):
615                info_dialog(widget, None, "You should registered only one rule for each GUI parser ! Think of using the DELETE button !")
616                is_already_see=1
617
618def callback_fields_printed( widget, data=None):
619    global printValue
620    printValue[data] = widget.get_active()
621
622def callback_check_ip( widget, data=None):
623    global src_Or_Dst_IP
624    if widget.get_active()==1:
625        if checkUpValues[1]:
626            src_Or_Dst_IP = 1
627        else:
628            widget.set_active(0)
629            check_dialog(widget, None, "First, enter a source address.")
630    else:
631            src_Or_Dst_IP = 0
632
633def callback_comboR(widget, data=None):
634    global comboRouter, routerHash
635    nop = 0
636    print struct.unpack('>L',socket.inet_aton(routerHash[comboRouter.entry.get_text()]))
637   
638def callback_src_mask(widget, data=None):
639    nop = 0
640
641def callback_dst_mask(widget, data=None):
642    nop = 0
643
644def callback_tos(widget, data=None):
645    nop = 0
646
647def callback_prot(widget, data=None):
648    nop = 0
649
650def create_button(title, state, callback_function, ptr_var, parent, tooltip_Text):
651    global mainTT
652    button = gtk.ToggleButton(title)
653    if state==1:
654        button.set_active(True)
655    else:
656        button.set_active(False)
657    button.connect("toggled", callback_function, ptr_var)
658    if tooltip_Text!=None:
659        mainTT.set_tip(button, tooltip_Text)
660    parent.pack_start(button, False, True, 2)
661    button.show()
662
663def create_entry(maxLen, tooltip_Text, parent, lab, id):
664    global mainTT
665    vbox = gtk.VBox(False, 0)
666    parent.pack_start(vbox, False, True, 0)
667    label = gtk.Label(lab)
668    label.set_alignment(0, 0.5)
669    vbox.pack_start(label, False, True, 0)
670    entry = gtk.Entry(max=maxLen)
671    entry.set_max_length(maxLen)
672    entry.connect("activate", enter_callback, entry, id)
673    entry.set_text("")
674    entry.select_region(0, len(entry.get_text()))
675    if tooltip_Text!=None:
676        mainTT.set_tip(entry, tooltip_Text)
677    vbox.pack_start(entry, False, True, 0)
678    entry.show()
679
680def sent_rule(widget, msg):
681    global collectorAddr, collectorPort, collectorAddr6, IPversion
682    s = None
683    if (IPversion==4):
684        tmpaf =  socket.AF_INET
685        addr = collectorAddr
686        port = collectorPort
687    elif (IPversion == 6):
688        tmpaf =  socket.AF_INET6
689        addr = collectorAddr6
690        port = collectorPort
691    else:
692        print "Wrong IP version : ", IPversion
693        exit(0)
694    for res in socket.getaddrinfo(addr, port, tmpaf, socket.SOCK_STREAM):
695        af, socktype, proto, canonname, sa = res
696        try:
697            s = socket.socket(af, socktype, proto)
698        except socket.error, msg:
699            s = None
700            continue
701        try:
702            s.connect(sa)
703        except socket.error, msg:
704            s.close()
705            s = None
706            continue
707        break
708    if s is None:
709        check_dialog( widget, None, "could not open socket")
710    else:
711        s.send(msg)
712        check_dialog( widget, None, "Action was sent")
713        s.close()
714
715def prefix_callback( widget, entry, id):
716    global collPrefix, coll_window, router, localPort
717    entry_text = entry.get_text()
718    is_good = 0
719    if (id == 0):
720        if ( entry_text==""):
721            collPrefix = 0
722        else:
723            rule = entry_text.split(' ')
724            field = rule[0]
725            operator = rule[1]
726            value = rule[2]
727            if (field=='0' or field=='8' or field=='12' or field=='15' or field=='18' or field=='47'):
728                if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',value)):
729                    splitter = value.split('/')
730                    adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
731                    if len(splitter)>1:
732                        bits = int(splitter[1])
733                        if bits <= 32 and bits > 0:
734                            mask[1] = 0xffffffffL << (32 - bits)
735                            is_good = 1
736                        else:
737                            check_dialog( widget, None, "Wrong value in mask!")
738                            is_good = 0
739                    else:
740                        mask[1] = 0xffffffffL
741                        is_good = 1
742                else:
743                    check_dialog( widget, None, "Wrong value !")
744            if (field=='27' or field=='28' or field=='62'):
745                ipv6ad_mask = value.split('/')
746                if len(ipv6ad_mask)==1:
747                    try:
748                        socket.gethostbyaddr(value)
749                        is_good = 1
750                    except socket.gaierror:
751                        check_dialog( widget, None, "Wrong value !")
752                    except socket.herror: ## can't resolv
753                        check_dialog( widget, None, "I can't resolv !")
754                    except socket.error:
755                        check_dialog( widget, None, "Error in gethostbyaddr()!")
756                else:
757                    is_good = 1
758                ##here, check the prefix value?
759            if (field=='60' or field=='46'):
760                if (int(value) < 256):
761                    is_good = 1
[50]762            if (field=='1'):
763                if (int(value) < 4294967295):
764                    is_good = 1
[27]765            if (is_good==1):
766                ##collPrefix = adip & mask[1]
767                ## Here tcp exchange between collector & client
768                msg = str(localPort) +" "+ field +" "+ operator+" "+ value
769                sent_rule(widget, msg)
770                widget.set_editable(False)
771                coll_window.destroy()
772    else:
773        check_dialog( widget, None, "Internal program error ;) !")
774
775def prefix_entry(maxLen, tooltip_Text, parent, lab, id):
776    global mainTT
777    vbox = gtk.VBox(False, 0)
778    parent.pack_start(vbox, False, True, 0)
779    label = gtk.Label(lab)
780    label.set_alignment(0, 0.5)
781    vbox.pack_start(label, False, True, 0)
782    entry = gtk.Entry(max=maxLen)
783    entry.set_max_length(maxLen)
784    entry.connect("activate", prefix_callback, entry, id)
785    entry.set_text("")
786    entry.select_region(0, len(entry.get_text()))
787    if tooltip_Text!=None:
788        mainTT.set_tip(entry, tooltip_Text)
789    vbox.pack_start(entry, False, True, 0)
790    entry.show()
791
792def user_quit(widget, data=None):
793    global myInputControlThread, localPort, record_file
794    if myInputControlThread != None:
795        myInputControlThread.kill(1)
796        myInputControlThread = None
797        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
798        s.connect(('localhost', localPort))
799        s.send("FIN")
800        s.close()
801        if (record_file!=None):
802            record_file.close()
803        print "\n\n\n\n\n Input Stream closed. \n\n\n\n\n By :-) \n\n\n\n"
804    gtk.main_quit()
805
806def enter_callback( widget, entry, id):
807    global firstParseValue
808    entry_text = entry.get_text()
809    if id == 0:
810        if (entry_text==""):
811            checkUpValues[0] = 0
812        else:
813            if (re.search('\D',entry_text)) or (int(entry_text) >= 99) or (int(entry_text) <= 0):
814                check_dialog( widget, None, "Wrong value !")
815            else:
816                firstParseValue[0] = int(entry_text)
817                checkUpValues[0] = 1
818    if id == 1:
819        if ( entry_text==""):
820            checkUpValues[8] = 0
821            checkUpValues[12] = 0
822        else:
823            if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',entry_text)):
824                splitter = entry_text.split('/')
825                adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
826                if len(splitter)>1:
827                    bits = int(splitter[1])
828                    if bits <= 32 and bits > 0:
829                        mask[0] = 0xffffffffL << (32 - bits)
830                    else:
831                        check_dialog( widget, None, "Wrong value in mask!")
832                else:
833                    mask[0] = 0xffffffffL
834                firstParseValue[8] = adip & mask[0]
835                checkUpValues[8] = 1
836                firstParseValue[12] = adip & mask[0]
837                checkUpValues[12] = 1
838            else:
839                check_dialog( widget, None, "Wrong value !")
840    if id == 2:
841        if ( entry_text==""):
842            checkUpValues[2] = 0
843        else:
844            check_dialog( widget, None, "NOT YET IMPLEMEMTED")
845            ## pb with IPv6 and getaddrinfo() ??
846##            splitter = entry_text.split('/')
847##            try:
848##                socket.gethostbyaddr(splitter[0])
849##            except socket.gaierror:
850##                check_dialog( widget, None, "Wrong value !")
851##            except socket.herror: ## can't resolv
852##                pass
853##            except socket.error:
854##                pass
855    if id == 3:
856        if ( entry_text==""):
857            checkUpValues[15] = 0
858        else:
859            if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',entry_text)):
860                splitter = entry_text.split('/')
861                adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
862                if len(splitter)>1:
863                    bits = int(splitter[1])
864                    if bits <= 32 and bits > 0:
865                        mask[2] = 0xffffffffL << (32 - bits)
866                    else:
867                        check_dialog( widget, None, "Wrong value in mask!")
868                else:
869                    mask[2] = 0xffffffffL
870                firstParseValue[15] = adip & mask[2]
871                checkUpValues[15] = 1
872            else:
873                check_dialog( widget, None, "Wrong value !")
874    if id == 4: ## In|Out
875        if ( entry_text==""):
876            checkUpValues[10] = 0
877            checkUpValues[14] = 0
878        else:
879            if (re.search('\D',entry_text)) or (int(entry_text) > 65535) or (int(entry_text) < 0):
880                check_dialog( widget, None, "Wrong value !")
881            else:
882                firstParseValue[10] = int(entry_text)
883                checkUpValues[10] = 1
884                firstParseValue[14] = int(entry_text)
885                checkUpValues[14] = 1
886    if id == 6: ## bytes
887        if ( entry_text==""):
888            checkUpValues[1] = 0
889        else:
890            size_list = string.split(entry_text)
891            if (len(size_list)!=2)or((re.search('\D',size_list[0]))or(int(size_list[0])>999999999)or(int(size_list[0])<=0) or (re.search('\D',size_list[1]))or(int(size_list[1])>999999999)or(int(size_list[1])<=0)):
892                check_dialog( widget, None, "Wrong value !")
893            else:
894                firstParseValue[1] = int(size_list[0])
895                if ( int(size_list[1]) == 999999999 ):
896                    firstParseValue[1] = 100000000000
897                else:
898                    firstParseValue[1] = int(size_list[1])
899                checkUpValues[1] = 1
900    if id == 7: ## pkts
901        if ( entry_text==""):
902            checkUpValues[2] = 0
903        else:
904            if (re.search('\D',entry_text)) or (int(entry_text) > 9999) or (int(entry_text) <= 0):
905                check_dialog( widget, None, "Wrong value !")
906            else:
907                firstParseValue[2] = int(entry_text)
908                checkUpValues[2] = 1
909    if id == 8: ## time no concordance with nfv9 field number
910        if ( entry_text==""):
911            checkUpValues[0] = 0
912        else:
913            if (re.search('\D',entry_text)) or (int(entry_text) > 99) or (int(entry_text) < 0):
914                check_dialog( widget, None, "Wrong value !")
915            else:
916                firstParseValue[0] = int(entry_text)
917                checkUpValues[0] = 1
918    if id == 9: ## port range
919        if ( entry_text==""):
920            checkUpValues[7] = 0
921        else:
922            port_list = string.split(entry_text)
923            if (len(port_list)!=2)or((re.search('\D',port_list[0])) or (int(port_list[0]) > 65535) or (int(port_list[0]) <= 0) or (re.search('\D',port_list[1])) or (int(port_list[1]) > 65535) or (int(port_list[1]) <= 0)):
924                check_dialog( widget, None, "Wrong value !")
925            else:
926                firstParseValue[7] = int(port_list[0])
927                firstParseValue[11] = int(port_list[1])
928                checkUpValues[7] = 1
929    if id == 11: ## tcp flags
930        if ( entry_text==""):
931            checkUpValues[6] = 0
932        else:
933            if (re.search('\D',entry_text)) or (int(entry_text) > 255) or (int(entry_text) <= 0):
934                check_dialog( widget, None, "Wrong value !")
935            else:
936                firstParseValue[6] = int(entry_text)
937                checkUpValues[6] = 1
938    if id == 12: ## prot
939        if ( entry_text==""):
940            checkUpValues[4] = 0
941        else:
942            if (re.search('\D',entry_text)) or (int(entry_text) > 255) or (int(entry_text) <= 0):
943                check_dialog( widget, None, "Wrong value !")
944            else:
945                firstParseValue[4] = int(entry_text)
946                checkUpValues[4] = 1
947    if id == 13: ## tos
948        if ( entry_text==""):
949            checkUpValues[5] = 0
950        else:
951            if (re.search('\D',entry_text)) or (int(entry_text) > 255) or (int(entry_text) < 0):
952                check_dialog( widget, None, "Wrong value !")
953            else:
954                firstParseValue[5] = int(entry_text)
955                checkUpValues[5] = 1
956    if id == 14: ## src AS
957        if ( entry_text==""):
958            checkUpValues[16] = 0
959        else:
960            if (re.search('\D',entry_text)) or (int(entry_text) > 65535) or (int(entry_text) < 0):
961                check_dialog( widget, None, "Wrong value !")
962            else:
963                firstParseValue[16] = int(entry_text)
964                checkUpValues[16] = 1
965    if id == 15: ## dst AS
966        if ( entry_text==""):
967            checkUpValues[17] = 0
968        else:
969            if (re.search('\D',entry_text)) or (int(entry_text) > 65535) or (int(entry_text) < 0):
970                check_dialog( widget, None, "Wrong value !")
971            else:
972                firstParseValue[17] = int(entry_text)
973                checkUpValues[17] = 1
974    if id == 18: ## from router
975        if ( entry_text==""):
976            checkUpValues[69] = 0
977        else:
978            if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}?$',entry_text)):
979                adip = struct.unpack('>L',socket.inet_aton(entry_text))[0]
980                firstParseValue[69] = adip
981                checkUpValues[69] = 1
982            else:
983                check_dialog( widget, None, "Wrong value !")
984   
985if __name__ == "__main__":
986    global window, mainTT, comboRouter, os_type, printShit
987   
988    gtk.threads_init()
989   
990    if (os.name =="nt"):
991        os_type = 1
992    elif (os.name =="posix"):
993        os_type = 0
994    else:
995        os_type = 3
996
997    print "---------------------------------------------------------------"
998    print "In this version 0.0.7, you can apply rules on the collector based on the following fields:"
999    print "IPV4_SRC_ADDR: 8,"
1000    print "IPV4_DST_ADDR: 12,"
1001    print "IPV4_NEXT_HOP: 15,"
1002    print "BGP_IPV4_NEXT_HOP: 18,"
1003    print "IPV6_SRC_ADDR: 27,"
1004    print "IPV6_DST_ADDR: 28,"
1005    print "MPLS_TOP_LABEL_TYPE: 46,"
1006    print "IPV6_NEXT_HOP: 62,"
1007    print "BPG_IPV6_NEXT_HOP: 63,"
1008    print "IP_PROTOCOL_VERSION: 60, please note that the IPv4 template don't have this field"
[36]1009    print "ROUTER_SRC_ADDR: 0, !!! it's not a real number for a field, but it's a great function"
[27]1010    print "----------------------------------------------------------------"
1011   
1012    mainTT = gtk.Tooltips()
1013    window = gtk.Window(gtk.WINDOW_TOPLEVEL)   
1014    window.connect("destroy", gtk.main_quit, "WM destroy")
1015    window.set_title("RenetcolGUI")
1016    window.set_size_request(850, 550)
1017   
1018    main_vbox = gtk.VBox(False, 1)
1019    main_vbox.set_border_width(1)
1020    window.add(main_vbox)
1021
1022##  menu
1023    file_menu = gtk.Menu()
1024    receive_item = gtk.MenuItem("Receive Stream")
1025    stop_item = gtk.MenuItem("Stop Stream")
1026    quit_item  = gtk.MenuItem("Quit")
1027    file_menu.append(receive_item)
1028    file_menu.append(stop_item)
1029    file_menu.append(quit_item)
1030    receive_item.connect("activate", reception, None)
1031    stop_item.connect("activate", close_recept, None)
1032    quit_item.connect("activate", user_quit, None)
1033    receive_item.show()
1034    stop_item.show()
1035    quit_item.show()
1036
1037    help_menu = gtk.Menu()
1038    about_item = gtk.MenuItem("About")
1039    help_menu.append(about_item)
1040    about_item.connect("activate", about_dialog, None)
1041    about_item.show()
1042
1043    menu_bar = gtk.MenuBar()
1044    main_vbox.pack_start(menu_bar, False, False, 0)
1045    menu_bar.show()
1046    file_item = gtk.MenuItem("File")
1047    file_item.show()
1048    help_item = gtk.MenuItem("Help")
1049    help_item.show()
1050
1051    file_item.set_submenu(file_menu)
1052    menu_bar.append(file_item)
1053    menu_bar.append(file_menu)
1054    file_item.set_right_justified(0)
1055
1056    help_item.set_submenu(help_menu)
1057    menu_bar.append(help_item)
1058    menu_bar.append(help_menu)
1059    help_item.set_right_justified(1)
1060
1061##  first frame
1062    frame = gtk.Frame("Input Stream Control")
1063    main_vbox.pack_start(frame, False, True, 0)
1064    hbox = gtk.HBox(False, 0)
1065    hbox.set_border_width(5)
1066    frame.add(hbox)
1067
1068    ## freeze button
1069    buttonfreeze = gtk.ToggleButton("Freeze")
1070    buttonfreeze.connect("toggled", callback_freeze, None)
1071    mainTT.set_tip(buttonfreeze, "Stop/Start the output in the window.")
1072    hbox.pack_start(buttonfreeze, False, False, 2)
1073    buttonfreeze.show()
1074    ## record button
1075    buttonrecord = gtk.ToggleButton("Record")
1076    buttonrecord.connect("toggled", callback_record, None)
1077    mainTT.set_tip(buttonrecord, "Stop/Start the record in a text file.")
1078    hbox.pack_start(buttonrecord, False, False, 2)
1079    buttonrecord.show()
1080    ## control collector button
1081    buttoncollector = gtk.ToggleButton("Collector Control")
1082    buttoncollector.connect("toggled", callback_collector, None)
1083    mainTT.set_tip(buttoncollector, "Change the rule which is applied on the collector. You must have activated the input stream before.")
1084    hbox.pack_start(buttoncollector, False, False, 2)
1085    buttoncollector.show()
1086
1087    ipv4_vbox = gtk.VBox(False, 1)
1088    ipv4_vbox.set_border_width(1)
1089    main_vbox.add(ipv4_vbox)
1090##  second frame
1091    frame = gtk.Frame("Select printed fields")
1092    ipv4_vbox.pack_start(frame, False, False, 0)
1093   
1094    vbox = gtk.VBox(False, 0)
1095    vbox.set_border_width(5)
1096    frame.add(vbox)
1097    bbox = gtk.HButtonBox()
1098    vbox.pack_start(bbox, False, True, 5)
1099   
1100    create_button("Src \n IP", 1, callback_fields_printed, 8, bbox, "Source IP")
1101    create_button("Dst\n IP", 1, callback_fields_printed, 12, bbox, "Destination IP")
1102    create_button("Flw\n IP", 0, callback_fields_printed, 15, bbox, "Following IP")
1103    create_button("Index\n In", 0, callback_fields_printed, 10, bbox, "SNMP Index Input")
1104    create_button("Index\n Out", 0, callback_fields_printed, 14, bbox, "SNMP Index Output")
1105    create_button("Size (P)", 1, callback_fields_printed, 2, bbox, "Packets number")
1106    create_button("Size (B)", 1, callback_fields_printed, 1, bbox, "Size in Bytes")
1107    create_button("Time", 0, callback_fields_printed, 0, bbox, "Age of flow")
1108
1109    b2box = gtk.HButtonBox()
1110    vbox.pack_start(b2box, False, True, 5)
1111    create_button("Src\n Port", 1, callback_fields_printed, 7, b2box, "TCP/UDP source port")
1112    create_button("Dst\n Port", 1, callback_fields_printed, 11, b2box, "TCP/UDP destination port")
1113    create_button("TCP\n Flags", 0, callback_fields_printed, 6, b2box, "TCP Flags")
1114    create_button("Prot", 1, callback_fields_printed, 4, b2box, "Protocol")
1115    create_button("Tos", 0, callback_fields_printed, 5, b2box, "Type of service")
1116    create_button("Src\nAs", 0, callback_fields_printed, 16, b2box, "Source AS")
1117    create_button("Dst\nAs", 0, callback_fields_printed, 17, b2box, "Destination AS")
1118    create_button("Src\nMask", 0, callback_fields_printed, 9, b2box, "Source Mask")
1119    create_button("Dst\nMask", 0, callback_fields_printed, 13, b2box, "Destination Mask")
1120
1121    b3box = gtk.HButtonBox()
1122    vbox.pack_start(b3box, False, True, 5)
1123    create_button("Router", 0, callback_fields_printed, 69, b3box, "Router address")
1124
1125##  third frame
1126    frame = gtk.Frame("Parsing values")
1127    ipv4_vbox.pack_start(frame, False, False, 5)
1128    hbox = gtk.VBox(False, 0)
1129    hbox.set_border_width(5)
1130    frame.add(hbox)
1131    pbbox = gtk.HButtonBox()
1132    hbox.pack_start(pbbox, False, True, 5)
1133##  here entry button
1134    create_entry(18, "Required Format : \n an IPv4 address like x.x.x.x \n or a network address like x.x.x.x/x", pbbox, "IPv4 address :", 1)
1135    create_entry(39, "Required Format : \n an IPv6 address like x:x:x:x:x::x \n or a network address like x:x:x/x NOT YET SUPPORTED", pbbox, "(IPv6 address :)", 2)
1136    create_entry(18, "Required Format : \n an IP address like x.x.x.x \n or a network address like x.x.x.x/x", pbbox, "Flw IP ad. :", 3)
1137    dbbox = gtk.HButtonBox()
1138    hbox.pack_start(dbbox, False, True, 5)
1139    create_entry(5, "Required Format : a number less than 65535", dbbox, "SNMP Index In|Out :", 4)
1140    create_entry(4, "Required Format : a number less than 9999", dbbox, "Packet NB :", 7)
1141    create_entry(17, "Required Format : a range, each number less than 999999999 and space as separator: \"48 54\"", dbbox, "Bytes :", 6)
1142    tbbox = gtk.HButtonBox()
1143    hbox.pack_start(tbbox, False, True, 5)
1144    create_entry(2, "Required Format : a number less than 99", tbbox, "Time :", 8)
1145    create_entry(11, "Required Format : a range, each number less than 65535 and space as separator: \"6881 6889\"", tbbox, "Port :", 9)
1146    #create_entry(5, "Required Format : a number less than 65535", tbbox, "Dst port :", 10)
1147    create_entry(3, "Required Format : a number less than 255", tbbox, "TCP Flag :", 11)
1148    fbbox = gtk.HButtonBox()
1149    hbox.pack_start(fbbox, False, True, 5)
1150    create_entry(5, "Required Format : a number less than 65535", fbbox, "Protocol :", 12)
1151    create_entry(3, "Required Format : a number less than 255", fbbox, "ToS :", 13)
1152    create_entry(5, "Required Format : a number less than 65535", fbbox, "Src AS :", 14)
1153    create_entry(5, "Required Format : a number less than 65535", fbbox, "Dst AS :", 15)
1154    kbbox = gtk.HButtonBox()
1155    hbox.pack_start(kbbox, False, True, 5)
1156    create_entry(18, "Required Format : \n an IP address like x.x.x.x", kbbox, "The flows from this Router :", 18)
1157
1158##  Show
1159    vbox.show()
1160    main_vbox.show()
1161    window.show_all()
1162    mainTT.enable()
1163
1164##  gtk main loop
1165    gtk.threads_enter()
1166    gtk.main()
1167    gtk.threads_leave()
Note: See TracBrowser for help on using the browser.