root/tags/REL-0.0.11beta/trunk/tool/renetcolGUI_0_0_7.py @ 41

Revision 41, 46.8 KB (checked in by andreu, 15 years ago)

ticket #3

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