root/trunk/tool/renetcolGUI.py @ 62

Revision 62, 48.3 KB (checked in by andreu, 15 years ago)

Flow selection from AS number (source or destination)

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