root/trunk/tool/renetcolGUI.py @ 56

Revision 56, 47.9 KB (checked in by andreu, 15 years ago)

renetcolGUI.py removed, bugs correction

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