root/trunk/tool/renetcolGUI.py

Revision 151, 54.9 KB (checked in by andreu, 12 years ago)

Warning at beginning fixed

  • Property svn:eol-style set to native
Line 
1
2##  File: renetcolGUI.py
3 
4##  Authors: ANDREU Francois-Xavier
5 
6##  Copyright (C) 2005-2006-2007-2008 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 operator
37import threading
38import string
39import re
40import socket
41import sys
42import gtk
43import traceback
44import pango
45import commands
46from optparse import OptionParser
47
48global localAddr, localPort, os_type
49
50########### DEFAULT VALUES, YOU MUST CHANGE IT ###############################
51IPversion = 4
52localAddr = ''
53localAddr6 = '0::'
54localPort = 2222
55collectorAddr = "127.0.0.1"
56collectorAddr6 = "0::"
57collectorPort = 52571  # if you change this port number, apply the
58                       # modification on the renetcolSender.h file
59                       # and you'll need a new compilation of the colllector
60##############################################################################
61
62myInputControlThread = None
63printValue =      [ 0,1,1,0,1,0,0,1,1,0, # 0 to 9
64                    0,1,1,0,0,0,0,0,0,0, # 10...
65                    1,0,0,0,0,0,0,1,1,0, #
66                    0,0,0,0,0,0,0,0,0,0, #
67                    0,0,0,0,0,0,1,1,0,0, #
68                    0,0,0,0,0,0,0,0,0,0, #
69                    0,0,0,0,0,0,0,0,0,0, #
70                    1,1,1,1,1,1,1,1,1,1, #
71                    0,0,0,0,0,0,0,0,0,0,  # 80 to 89
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 # 130 to 139
77                    ]
78firstParseValue = [ 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                    0,0,0,0,0,0,0,0,0,0, #
88                    0,0,0,0,0,0,0,0,0,0, #
89                    0,0,0,0,0,0,0,0,0,0, #
90                    0,0,0,0,0,0,0,0,0,0, #
91                    0,0,0,0,0,0,0,0,0,0 # 130 to 139
92                    ]
93checkUpValues =   [ 0,0,0,0,0,0,0,0,0,0,
94                    0,0,0,0,0,0,0,0,0,0,
95                    0,0,0,0,0,0,0,0,0,0,
96                    0,0,0,0,0,0,0,0,0,0,
97                    0,0,0,0,0,0,0,0,0,0,
98                    0,0,0,0,0,0,0,0,0,0,
99                    0,0,0,0,0,0,0,0,0,0,
100                    0,0,0,0,0,0,0,0,0,0,
101                    0,0,0,0,0,0,0,0,0,0,
102                    0,0,0,0,0,0,0,0,0,0, #
103                    0,0,0,0,0,0,0,0,0,0, #
104                    0,0,0,0,0,0,0,0,0,0, #
105                    0,0,0,0,0,0,0,0,0,0, #
106                    0,0,0,0,0,0,0,0,0,0 # 130 to 139
107                    ]
108fieldsName =  [ "","IN_BYT","IN_PKTS","","PROT","TOS","TCP_FL","S_PORT","IPv4@S","S_MASK",
109                "InSNMP","D_PORT","IPv4@D","D_MASK","OutSNMP","NextHop","S_AS","D_AS","","",
110                "","Time","","","","","","IPv6@S","IPv6@D","IPv6_S_MASK",
111                "IPv6_D_MASK","","","","","","","","","",
112                "","","","","","","M_T_L_T","M_T_L_@","","",
113                "","","","","","","","","","",
114                "","","","","","","","","","ROUTER",
115                "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",
116                "","","","","","","","","","", # 80 to 89
117                "","","","","","","","","","",
118                "","","","","","","","","","",
119                "","","","","","","","","","",
120                "","","","","","","","","","",
121                "","","","","","","","","","" # 130 to 139
122                ]
123flowCpt = 0
124mask = [ 0,0,0 ]
125spaceSep = " "
126tabSep = "\t"
127freeze = 0
128record = 0
129record_file_name = ""
130record_file = None
131is_already_see = 0
132collectorRule=""
133coll_window = gtk.Window()
134router=0
135tpl_def = {}
136os_type = 0
137oldTpl = 0
138fromRouter = ""
139myTimer = None
140myCPT = 1
141
142class InputControl(threading.Thread):
143    def kill(self, timeout):
144        self.imRunning = 0
145        time.sleep(1)
146        print "\n.\n..\n..."
147        time.sleep(1)
148        print "....\n.....\n......"       
149        time.sleep(1)
150        if self.myFlowInput:
151            self.myFlowInput.socket_close()
152        self.join(timeout)
153       
154    def __init__(self, address, port):
155        self.imRunning = 1
156        self.currentflow = None
157        threading.Thread.__init__(self)
158        self.myFlowInput = FlowInput(address, port)
159
160    def run(self):
161        global freeze, record
162        while self.imRunning:
163            if self.myFlowInput:
164                tmp = self.myFlowInput.get_flow()
165                if (tmp[0]!=None):
166                    self.currentflow = Flow(tmp)
167                    if (freeze==0) & self.currentflow.enable():
168                        self.currentflow.print_flow2()
169                    if (record==1) & self.currentflow.enable():
170                        self.currentflow.write_flow2()
171##                else:
172##                    self.myFlowInput = None
173   
174class Flow:
175    def __init__(self, data):
176        self.flow = [ data[0], data[1] ]
177
178# flow selection
179    def enable(self):
180        global firstParseValue, checkUpValues, tpl_def, fromRouter
181        res = 1
182        resS = 1
183        resD = 1
184        for i in range (0, len(tpl_def[self.flow[0]])):
185            f = tpl_def[self.flow[0]][i][0]
186            # or f==15 or f==18 or f==47
187            if ( f==8 ) and ( checkUpValues[f]==1 ):
188                resS = resS & ( ((struct.unpack('>L',(socket.inet_aton(self.flow[1][i])))[0] & mask[1-1]) == firstParseValue[f]) )
189            elif ( f==12 ) and ( checkUpValues[f]==1 ):
190                resD = resD & ( ((struct.unpack('>L',(socket.inet_aton(self.flow[1][i])))[0] & mask[1-1]) == firstParseValue[f]) )
191            elif ( i==27 or i==28 ):
192                pass
193            elif ( (f==1) and (checkUpValues[f]==1) ):
194                res = res & ( (self.flow[1][i] <= ((firstParseValue[f])+((firstParseValue[f])*5/100))) and ((self.flow[1][i] >= ((firstParseValue[f])-((firstParseValue[f])*5/100)))) )
195            elif (checkUpValues[f]==1):
196                res = res & (self.flow[1][i] == firstParseValue[f])
197        if ( checkUpValues[69]==1 ):
198            res = res & ( (fromRouter == firstParseValue[69]) )
199        res = res & (resS or resD)
200        return res
201
202# flow print
203    def print_flow2(self):
204        global printValue, tpl_def, flowCpt, fieldsName, oldTpl, os_type, fromRouter
205        myliste = []
206        myTpl = []
207        strFlow = ""
208        strField = ""
209        underscore_line = ""
210        flowCpt+=1
211        if (flowCpt%60 == 0 or oldTpl != self.flow[0]):
212##        if (flowCpt%100 == 0):
213            flowCpt = 0
214            for i in range (0, len(tpl_def[self.flow[0]])):
215                f = tpl_def[self.flow[0]][i][0]
216                if printValue[f]:
217                    if ( f==27 or f==28 or f==62 or f==63 ):
218                        strField += str(fieldsName[f])
219                        l = len(str(fieldsName[f]))
220                        if ((40-l)%8 == 0):
221                            tabNb = int((40-l)/8)
222                        else:
223                            tabNb = int((40-l)/8) + 1
224                        for j in range (0, tabNb):
225                            strField += "\t"
226                        for k in range (0, 40):
227                            underscore_line += "-"
228                    elif ( f==8 or f==15 or f==12 or f==18 or f==47 ):
229                        strField += str(fieldsName[f])
230                        l = len(str(fieldsName[f]))
231                        if ((16-l)%8 == 0):
232                            tabNb = int((16-l)/8)
233                        else:
234                            tabNb = int((16-l)/8) + 1
235                        for j in range (0, tabNb):
236                            strField += "\t"
237                        for k in range (0, 16):
238                            underscore_line += "-"
239                    else:
240                        strField += str(fieldsName[f])
241                        strField += "\t"
242                        for k in range (0, 8):
243                            underscore_line += "-"
244            if (oldTpl != self.flow[0]):
245                print " "
246            if (os_type == 0):
247                esc = '\x1b['
248                sep = ';'
249                end = 'm'
250                if (printValue[69]):
251                    rt = str(fieldsName[69])
252                    toprint = esc+"37"+sep+"44"+end+strField+rt+esc+"0"+end
253                else:
254                    toprint = esc+"37"+sep+"44"+end+strField+esc+"0"+end
255                print toprint
256            else:
257                if (printValue[69]):
258                    strField += str(fieldsName[69])
259                print strField
260                print underscore_line
261        for i in range (0, len(tpl_def[self.flow[0]])):
262            f = tpl_def[self.flow[0]][i][0]
263            if printValue[f]:
264                if ( f==27 or f==28 or f==62 or f==63 ):
265                    strFlow += str(self.flow[1][i])
266                    l = len(str(self.flow[1][i]))
267                    if ((40-l)%8 == 0):
268                        tabNb = int((40-l)/8)
269                    else:
270                        tabNb = int((40-l)/8) + 1
271                    for j in range (0, tabNb):
272                        strFlow += "\t"
273                elif ( f==8 or f==12 or f==15 or f==18 or f==47 ):
274                    strFlow += str(self.flow[1][i])
275                    l = len(str(self.flow[1][i]))
276                    if ((16-l)%8 == 0):
277                        tabNb = int((16-l)/8)
278                    else:
279                        tabNb = int((16-l)/8) + 1
280                    for j in range (0, tabNb):
281                        strFlow += "\t"
282                elif (f==21):
283                    myliste += [str(self.flow[1][i]-self.flow[1][i+1])]
284                    strFlow += str(self.flow[1][i]-self.flow[1][i+1])
285                    strFlow += "\t"
286                elif (f==22):
287                    pass
288                else:
289                    myliste += [str(self.flow[1][i])]
290                    strFlow += str(self.flow[1][i])
291                    for k in range (len(str(self.flow[1][i])), 7):
292                        strFlow += " "
293                    strFlow += "\t"
294        if (printValue[69]):
295            strFlow += fromRouter
296        print strFlow
297        oldTpl = self.flow[0]
298
299# flow record
300    def write_flow2(self):
301        global printValue, record_file, tpl_def
302        myliste = []
303        for i in range (0, len(tpl_def[self.flow[0]])):
304            f = tpl_def[self.flow[0]][i][0]
305            if printValue[f]:
306                if (f==21):
307                    myliste += [str(self.flow[1][i]-self.flow[1][i+1])]
308                elif (f==22):
309                    pass
310                else:
311                    myliste += [str(self.flow[1][i])]
312        theflow = string.join(myliste, "\t")+"\t"+fromRouter+"\n"
313        if (record_file!=None):
314            record_file.write(theflow)
315       
316class FlowInput:
317    def __init__(self, h, p):
318        self.HOST = h
319        self.PORT = p
320        if (IPversion == 4):
321            self.socketnumber = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
322        elif (IPversion == 6):
323            self.socketnumber = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
324        else:
325            print "IP protocol ", IPversion ," not supported"
326            exit(0)
327        self.socketnumber.bind((self.HOST, self.PORT))
328   
329    def get_flow(self):
330        global collectorRule, tpl_def, os_type, fromRouter
331        if (self.socketnumber!=None):
332            data = self.socketnumber.recvfrom(1024)
333            flow = data[0]
334            code = struct.unpack('<H', flow[0:2])
335            if (code[0] == 1): ## a def packet
336                routerSrc = struct.unpack('<L', flow[2:6])
337                sourceId = struct.unpack('<L', flow[6:10])
338                tplId = struct.unpack('<H', flow[10:12])
339                mykeylst = []
340                mykeylst += [str(routerSrc[0])]
341                mykeylst += [str(sourceId[0])]
342                mykeylst += [str(tplId[0])]
343                mykeystr = string.join(mykeylst,"");
344                fields = []
345                fieldNb = struct.unpack('<H', flow[12:14])
346                for i in range(0, fieldNb[0]):
347                    fd = struct.unpack('<H',flow[14+(i*4):16+(i*4)])
348                    tp = struct.unpack('<H',flow[14+(2+i*4):16+(2+i*4)])
349                    fields.insert(i,(fd[0],tp[0]))
350                tpl_def[mykeystr] = fields
351                return ( None, None)
352            if (code[0]==11): ## a data packet
353                routerSrc = struct.unpack('<L', flow[4:8])
354                tmp =  struct.unpack('<L', flow[4:8])
355                fromRouter = socket.inet_ntoa(struct.pack('>L', tmp[0]))
356                sourceId = struct.unpack('<L', flow[8:12])
357                tplId = struct.unpack('<H', flow[12:14])
358                mykeylst = []
359                mykeylst += [str(routerSrc[0])]
360                mykeylst += [str(sourceId[0])]
361                mykeylst += [str(tplId[0])]
362                mykeystr = string.join(mykeylst,"")
363                if (tpl_def.has_key(mykeystr)== True):
364                    field_list = []
365                    index = 0
366                    for i in range (0, len(tpl_def[mykeystr])):
367                        if (tpl_def[mykeystr][i][1]==1):
368                            value = struct.unpack('<B',flow[14+index:15+index])
369                            field_list.insert(i,value[0])
370                        if (tpl_def[mykeystr][i][1]==2):
371                            value = struct.unpack('>H',flow[14+index:16+index])
372                            field_list.insert(i,value[0])
373                        if (tpl_def[mykeystr][i][1]==3):
374                            value = struct.unpack('<BBB',flow[14+index:17+index])
375                            valueTmp = struct.pack('<BBBB',value[2],value[1],value[0],0)
376                            valueFinal = struct.unpack('<L', valueTmp)
377                            valueFinal2 = (valueFinal[0])>>4
378                            field_list.insert(i,valueFinal2)
379                        if (tpl_def[mykeystr][i][1]==4):
380                            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):
381                                value = socket.inet_ntoa(flow[14+index:18+index])
382                                field_list.insert(i,value)
383                            else:
384                                value = struct.unpack('<L', flow[14+index:18+index])
385                                value = struct.unpack('>L', flow[14+index:18+index])
386                                field_list.insert(i,value[0])
387                        if (tpl_def[mykeystr][i][1]==16):
388                            if (os_type==1):
389                                field_list.insert(i,nt_inet_ntop(flow[14+index:30+index]))
390                            else:
391                                tmp = socket.inet_ntop(socket.AF_INET6,flow[14+index:30+index])
392                                field_list.insert(i,tmp)
393                        index += tpl_def[mykeystr][i][1]
394                    return mykeystr, field_list
395##                else:
396##                  print "I'm waiting the tpl def for the key", mykeystr
397##                return (routerSrc[0], field_list)
398            return ( None, None)
399        return ( None, None)
400
401    def socket_close(self):
402        if self.socketnumber:
403           try :
404               self.socketnumber.shutdown(2)
405               self.socketnumber = None
406           except socket.error:
407              pass
408
409class FileSel:
410    def file_ok_sel(self, w):
411        global record, record_file, record_file_name
412        record = 1
413        record_file_name = self.fileSel.get_filename()
414        record_file = file(record_file_name, 'w')
415        print "%s" % self.fileSel.get_filename()
416        self.fileSel.destroy()
417
418    def destroy(self, widget):
419        self.fileSel.destroy()
420
421    def __init__(self):
422        self.fileSel = gtk.FileSelection("File Selection")
423        self.fileSel.connect("destroy", self.destroy)
424        self.fileSel.ok_button.connect("clicked", self.file_ok_sel)
425        self.fileSel.cancel_button.connect("clicked",
426                                           lambda w: self.fileSel.destroy())
427        self.fileSel.set_filename("flow_record.txt")
428        self.fileSel.show()
429
430def print_hello(widget, event):
431    print "Hello, World!"
432
433def nt_inet_ntop(packed_ip):
434    cpt = 0
435    double = 0
436    string_ip = ""
437    tmp = binascii.hexlify(packed_ip[0:2])
438    if ( int(tmp,16)!=0 ):
439        string_ip += tmp
440        tmp = binascii.hexlify(packed_ip[2:4])
441        if ( int(tmp,16)==0 ):
442            cpt+=1
443            double = 1
444            if (cpt==1):
445                string_ip += ":"
446        else:
447            cpt=0
448            string_ip += ":"+tmp
449        tmp = binascii.hexlify(packed_ip[4:6])
450        if ( int(tmp,16)==0 ):
451            cpt+=1
452            double = 1
453            if (cpt==1):
454                string_ip += ":"
455        else:
456            cpt=0
457            string_ip += ":"+tmp
458        tmp = binascii.hexlify(packed_ip[6:8])
459        if ( int(tmp,16)==0 ):
460            if (double==1 and cpt==0):
461                string_ip += ":0"
462            else:
463                cpt+=1
464                double = 1
465                if (cpt==1):
466                    string_ip += ":"
467        else:
468            cpt=0
469            string_ip += ":"+tmp
470        tmp = binascii.hexlify(packed_ip[8:10])
471        if ( int(tmp,16)==0 ):
472            if (double==1 and cpt==0):
473                string_ip += ":0"
474            else:
475                cpt+=1
476                double = 1
477                if (cpt==1):
478                    string_ip += ":"
479        else:
480            cpt=0
481            string_ip += ":"+tmp
482        tmp = binascii.hexlify(packed_ip[10:12])
483        if ( int(tmp,16)==0 ):
484            if (double==1 and cpt==0):
485                string_ip += ":0"
486            else:
487                cpt+=1
488                double = 1
489                if (cpt==1):
490                    string_ip += ":"
491        else:
492            cpt=0
493            string_ip += ":"+tmp
494        tmp = binascii.hexlify(packed_ip[12:14])
495        if ( int(tmp,16)==0 ):
496            if (double==1 and cpt==0):
497                string_ip += ":0"
498            else:
499                cpt+=1
500                double = 1
501                if (cpt==1):
502                    string_ip += ":"
503        else:
504            cpt=0
505            string_ip += ":"+tmp
506        tmp = binascii.hexlify(packed_ip[14:16])
507        if ( int(tmp,16) != 0 ):
508            string_ip += ":"+tmp
509        else:
510            string_ip += ":"
511    else:
512        string_ip = "::"
513    return string_ip
514
515def get_main_menu(self, window):
516    accel_group = gtk.AccelGroup()
517    item_factory = gtk.ItemFactory(gtk.MenuBar, "<main>", accel_group)
518    item_factory.create_items(menu_items)
519    window.add_accel_group(accel_group)
520    item_factory = item_factory
521    return item_factory.get_widget("<main>")
522
523def reception(widget, event):
524    global myInputControlThread
525    global localAddr, localPort
526    myInputControlThread = InputControl(localAddr, localPort)
527    myInputControlThread.start()
528
529def close_recept(widget, event):
530    global myInputControlThread
531    if myInputControlThread != None:
532        myInputControlThread.kill(1)
533        myInputControlThread = None
534        print "\n\n\n\n\n Input Stream closed. \n\n\n\n\n"
535
536def about_dialog(widget, event):
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 = "Author : FX Andreu\nemail andreu@renater.fr\nCopyright (C) 2005-2008 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 ")
543    dialog.set_title('About')
544    dialog.connect('response', lambda dialog, response: dialog.destroy())
545    dialog.show()
546
547def check_dialog(widget, event, text):
548    dialog = gtk.MessageDialog(
549        parent         = None,
550        flags          = gtk.DIALOG_MODAL,
551        type           = gtk.MESSAGE_INFO,
552        buttons        = gtk.BUTTONS_OK,
553        message_format = text)
554    dialog.set_title('Value check ')
555    dialog.connect('response', lambda dialog, response: dialog.destroy())
556    dialog.show()
557
558def info_dialog(widget, event, text):
559    dialog = gtk.MessageDialog(
560        parent         = None,
561        flags          = gtk.DIALOG_MODAL,
562        type           = gtk.MESSAGE_INFO,
563        buttons        = gtk.BUTTONS_OK,
564        message_format = text)
565    dialog.set_title('Information ')
566    dialog.connect('response', lambda dialog, response: dialog.destroy())
567    dialog.show()
568
569def callback_freeze(widget, data=None):
570    global freeze
571    if widget.get_active() == 1:
572        freeze = 1
573        print "FREEZE ACTIF"
574    if widget.get_active() == 0:
575        freeze = 0
576        print "FREEZE NOT ACTIF"
577
578def wind_destroy(widget, data=None):
579    widget.destroy()
580   
581def callback_record(widget, data=None):
582    global record, record_file, record_file_name
583    if widget.get_active() == 1:
584        FileSel()
585    if widget.get_active() == 0:
586        record = 0
587        time.sleep(2)
588        record_file.close()
589
590def strsend(target, message):
591   global collectorAddr, collectorPort
592   s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
593   s.connect((collectorAddr, collectorPort))
594   s.send(message)
595   s.close()
596
597def callback_refresh(widget, parent):
598    global collectorAddr
599    strsend(collectorAddr, 'REFRESH')
600    parent.destroy()
601   
602def callback_delete_rule(widget, parent):
603    global collectorAddr, collectorPort
604    if widget.get_active() == 1:
605        sent_rule(widget, "DELETE")
606        widget.set_active(0)
607        parent.destroy()
608
609def callback_check_rule(widget, data=None):
610    global router
611    if widget.get_active()==1:
612        router=1
613
614def timer_action():
615    global record_file, record_file_name, myTimer, myCPT
616    myCPT+=1
617    myTimer.cancel()
618    my_new_file_name = "%s_%s_%d" % (record_file_name,time.strftime("%Y%m%d", time.gmtime()),myCPT)
619    ##my_new_file_name = "%s_%d" % (record_file_name,myCPT)
620    print my_new_file_name
621    new_record_file = file(my_new_file_name, 'w')
622    old_record_file = record_file
623    record_file = new_record_file
624    old_record_file.close()
625    now2 = time.time()
626    reste = 300-(operator.mod(now2,300))
627    myTimer = threading.Timer(300.0,timer_action)
628    myTimer.start()
629
630def callback_RotRec(widget, data=None):
631    global record, myTimer
632    if ((record == 0) and (widget.get_active() == 1)):
633        info_dialog(widget, None, "You must before activated the record ! ")
634        widget.set_active(0)
635    else:
636        if widget.get_active() == 1:
637            print "STARTING RECORD ROTATION"
638            now2 = time.time()
639            reste = 300-(operator.mod(now2,300))
640            myTimer = threading.Timer(300,timer_action)
641            myTimer.start()
642        if widget.get_active() == 0:
643            myTimer.cancel()
644            print "STOPPING RECORD ROTATION"
645
646def callback_collector(widget, controlWindow):
647    global is_already_see, collectorRule, myInputControlThread, coll_window, collectorAddr
648    if ((myInputControlThread == None) and (widget.get_active() == 1)):
649        info_dialog(widget, None, "You must before activated the stream reception ! (File menu)")
650        widget.set_active(0)
651    else:
652        if widget.get_active() == 1:
653            widget.set_active(0)
654            coll_window.connect("destroy", wind_destroy)
655            coll_window.set_title("Collector control ")
656            coll_window.set_size_request(500, 250)
657            coll_vbox = gtk.VBox(False, 1)
658            coll_vbox.set_border_width(1)
659            coll_window.add(coll_vbox)
660            coll_frame = gtk.Frame("Enter your filter (format described in tip), validate by enter")
661            coll_vbox.pack_start(coll_frame, False, False, 5)
662            coll_hbox = gtk.VBox(False, 0)
663            coll_hbox.set_border_width(5)
664            coll_frame.add(coll_hbox)
665##            button = gtk.CheckButton(" router ")
666##            button.connect("toggled", callback_check_rule, None)
667##            coll_hbox.pack_start(button, False, False, 0)
668##            mainTT.set_tip(button, "Check it to capture all flows from one router and enter the IPv4 address of this router. IN TEST")
669##            button.show()
670            coll_pbbox = gtk.HButtonBox()
671            coll_hbox.pack_start(coll_pbbox, False, True, 5)
672            prefix_entry(249, "Required Format : \n<field> = <value>[ & <field> = <value>]\
673            \nlike \
674            \n8 = 10.0.0.4 \
675            \n\t(all flows from IP Source 10.0.0.4)\
676            \nor 8 = 10.0.1.0/24 \
677            \n\t(all flows with IP Source in subnet 10.0.1.0/24)\
678            \nor 27 = 2001::1 (IPv6 address only on Linux system)\
679            \n\t(all flows from IP Source 2001::1)\
680            \nor 27 = 2001::/64 \
681            \n\t(all flows with IP Source in subnet 2001::/64)\
682            \nor 0 = 10.0.0.1 & 4 = 1\
683            \n\t(all ICMP flows from router 10.0.0.1)\
684            \nonly equal operator in this release\
685            \nmaximum 4 logical '&' for one filter (limit 249 chars)\
686            \n----------------------------------\
687            \n---- NetFlow Fields list ------\
688            \nROUTER_SRC_ADDR:\t 0\
689            \nIN_BYTES:\t\t\t 1\
690            \nL4_PROT:\t\t\t 4\
691            \nL4_SRC_PORT:\t\t 7\
692            \nIPV4_SRC_ADDR:\t\t 8\
693            \nINPUT_SNMP:\t\t\t10\
694            \nL4_DST_PORT:\t\t11\
695            \nIPV4_DST_ADDR:\t\t12\
696            \nOUTPUT_SNMP:\t\t14\
697            \nIPV4_NEXT_HOP:\t\t15\
698            \nSRC_AS:\t\t\t\t16\
699            \nDST_AS:\t\t\t\t17\
700            \nBGP_IPV4_NEXT_HOP:\t18\
701            \nIPV6_SRC_ADDR:\t\t27\
702            \nIPV6_DST_ADDR:\t\t28\
703            \nIPV6_NEXT_HOP:\t\t62\
704            \nBPG_IPV6_NEXT_HOP:\t63\
705            \nIP_PROT_VERSION:\t60\
706            \n---------------------------", coll_pbbox, "", 0)
707            coll_frame2 = gtk.Frame("Disable rules")
708            coll_vbox.pack_start(coll_frame2, False, False, 5)
709            coll_hbox2 = gtk.VBox(False, 0)
710            coll_hbox2.set_border_width(5)
711            coll_frame2.add(coll_hbox2)
712            coll_pbbox2 = gtk.HButtonBox()
713            coll_hbox2.pack_start(coll_pbbox2, False, True, 5)
714            buttondelete = gtk.ToggleButton("Delete")
715            buttondelete.connect("toggled", callback_delete_rule, coll_window)
716            mainTT.set_tip(buttondelete, "Delete all your rules of the collector configuration.")
717            coll_hbox2.pack_start(buttondelete, False, False, 2)
718            buttondelete.show()
719            coll_vbox.show()
720            coll_window.show_all()
721            if (is_already_see==0):
722                info_dialog(widget, None, "You should register only one rule for each GUI parser ! Think of using the DELETE button !")
723                is_already_see=1
724
725def callback_fields_printed( widget, data=None):
726    global printValue
727    printValue[data] = widget.get_active()
728    if (data==16):
729        printValue[29] = widget.get_active()
730    if (data==17):
731        printValue[30] = widget.get_active()
732
733def callback_check_ip( widget, data=None):
734    global src_Or_Dst_IP
735    if widget.get_active()==1:
736        if checkUpValues[1]:
737            src_Or_Dst_IP = 1
738        else:
739            widget.set_active(0)
740            check_dialog(widget, None, "First, enter a source address.")
741    else:
742            src_Or_Dst_IP = 0
743
744def callback_comboR(widget, data=None):
745    global comboRouter, routerHash
746    nop = 0
747    print struct.unpack('>L',socket.inet_aton(routerHash[comboRouter.entry.get_text()]))
748   
749def callback_src_mask(widget, data=None):
750    nop = 0
751
752def callback_dst_mask(widget, data=None):
753    nop = 0
754
755def callback_tos(widget, data=None):
756    nop = 0
757
758def callback_prot(widget, data=None):
759    nop = 0
760
761def create_button(title, state, callback_function, ptr_var, parent, tooltip_Text):
762    global mainTT
763    button = gtk.ToggleButton(title)
764    if state==1:
765        button.set_active(True)
766    else:
767        button.set_active(False)
768    button.connect("toggled", callback_function, ptr_var)
769    if tooltip_Text!=None:
770        mainTT.set_tip(button, tooltip_Text)
771    parent.pack_start(button, False, True, 2)
772    button.show()
773
774def create_entry(maxLen, tooltip_Text, parent, lab, id):
775    global mainTT
776    vbox = gtk.VBox(False, 0)
777    parent.pack_start(vbox, False, True, 0)
778    label = gtk.Label(lab)
779    label.set_alignment(0, 0.5)
780    vbox.pack_start(label, False, True, 0)
781    entry = gtk.Entry(max=maxLen)
782    entry.set_max_length(maxLen)
783    entry.connect("activate", enter_callback, entry, id)
784    entry.set_text("")
785    entry.select_region(0, len(entry.get_text()))
786    if tooltip_Text!=None:
787        mainTT.set_tip(entry, tooltip_Text)
788    vbox.pack_start(entry, False, True, 0)
789    entry.show()
790
791def sent_rule(widget, msg):
792    global collectorAddr, collectorPort, collectorAddr6, IPversion
793    s = None
794    if (IPversion==4):
795        tmpaf =  socket.AF_INET
796        addr = collectorAddr
797        port = collectorPort
798    elif (IPversion == 6):
799        tmpaf =  socket.AF_INET6
800        addr = collectorAddr6
801        port = collectorPort
802    else:
803        print "Wrong IP version : ", IPversion
804        exit(0)
805    for res in socket.getaddrinfo(addr, port, tmpaf, socket.SOCK_STREAM):
806        af, socktype, proto, canonname, sa = res
807        try:
808            s = socket.socket(af, socktype, proto)
809        except socket.error, msg:
810            s = None
811            continue
812        try:
813            s.connect(sa)
814        except socket.error, msg:
815            s.close()
816            s = None
817            continue
818        break
819    if s is None:
820        check_dialog( widget, None, "could not open socket")
821    else:
822        s.send(msg)
823        check_dialog( widget, None, "Action was sent")
824        s.close()
825
826def sent_rule_from_cli(msg):
827    global collectorAddr, collectorPort, collectorAddr6, IPversion
828    s = None
829    if (IPversion==4):
830        tmpaf =  socket.AF_INET
831        addr = collectorAddr
832        port = collectorPort
833    elif (IPversion == 6):
834        tmpaf =  socket.AF_INET6
835        addr = collectorAddr6
836        port = collectorPort
837    else:
838        print "Wrong IP version : ", IPversion
839        exit(0)
840    for res in socket.getaddrinfo(addr, port, tmpaf, socket.SOCK_STREAM):
841        af, socktype, proto, canonname, sa = res
842        try:
843            s = socket.socket(af, socktype, proto)
844        except socket.error, msg:
845            s = None
846            continue
847        try:
848            s.connect(sa)
849        except socket.error, msg:
850            s.close()
851            s = None
852            continue
853        break
854    if s is None:
855        check_dialog( None, None, "could not open socket")
856    else:
857        s.send(msg)
858        check_dialog( None, None, "Action was sent")
859        s.close()
860
861# dialog box to collector control
862def prefix_callback( widget, entry, id):
863    global collPrefix, coll_window, router, localPort
864    entry_text = entry.get_text()
865    is_good = 0
866    mymsg = []
867    if (id == 0):
868        if ( entry_text==""):
869            collPrefix = 0
870        else:
871            ## here we parse the filter, possibility of many filter concatened with '&' operator
872            filters = entry_text.split('&')
873            if len(filters)>5:
874                check_dialog( widget, None, "No more 4 '&' !")
875                is_ok = 0
876            else:
877                is_ok = 1
878                for f in filters:
879                    rule = f.split(' ')
880                    if len(mymsg)==0:
881                        field = rule[0]
882                        operator = rule[1]
883                        value = rule[2]
884                        mymsg = "C" + "_" + field + "_" + operator + "_" + value
885                    else:
886                        field = rule[1]
887                        operator = rule[2]
888                        value = rule[3]                       
889                        mymsg += "_C" + "_" + field + "_" + operator + "_" + value
890                    print f
891                    print mymsg
892                    if (field=='0' or field=='8' or field=='12' or field=='15' or field=='18' or field=='47'):
893                        if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',value)):
894                            splitter = value.split('/')
895                            adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
896                            if len(splitter)>1:
897                                bits = int(splitter[1])
898                                if bits <= 32 and bits > 0:
899                                    mask[1] = 0xffffffffL << (32 - bits)
900                                    is_good = 1
901                                else:
902                                    check_dialog( widget, None, "Wrong value in mask!")
903                                    is_good = 0
904                            else:
905                                value = value+"/32"
906                                mask[1] = 0xffffffffL
907                                is_good = 1
908                        else:
909                            check_dialog( widget, None, "Wrong value !")
910                    if (field=='27' or field=='28' or field=='62'):
911                        ipv6ad_mask = value.split('/')
912                        if len(ipv6ad_mask)==1:
913                            try:
914                                socket.gethostbyaddr(value)
915                                is_good = 1
916                            except socket.gaierror:
917                                check_dialog( widget, None, "Wrong value !")
918                            except socket.herror: ## can't resolv
919                                check_dialog( widget, None, "I can't resolv !")
920                            except socket.error:
921                                check_dialog( widget, None, "Error in gethostbyaddr()!")
922                        else:
923                            is_good = 1
924                    ##here, check the prefix value?
925                    if (field=='60' or field=='46'):
926                        if (int(value) < 256):
927                            is_good = 1
928                        else:
929                            check_dialog( widget, None, "Wrong value, must be < 256 !")
930                            is_good = 0
931                    if (field=='1'):
932                        if (int(value) < 4294967295):
933                            is_good = 1
934                        else:
935                            check_dialog( widget, None, "Wrong value, must be < 4294967295 !")
936                            is_good = 0
937                    if (field=='7' or field=='11' or field=='4'):
938                        if (int(value) < 65536):
939                            is_good = 1
940                        else:
941                            check_dialog( widget, None, "Wrong value, must be < 65536 !")
942                            is_good = 0
943                    if (field=='10' or field=='14' or field=='16' or field=='17'):
944                        if (int(value) < 65536):
945                            is_good = 1
946                        else:
947                            check_dialog( widget, None, "Wrong value, must be < 65536 !")
948                            is_good = 0
949            if (is_good==1 and is_ok==1):
950                ##collPrefix = adip & mask[1]
951                ## Here tcp exchange between collector & client
952                ##msg = str(localPort) +" "+ field +" "+ operator+" "+ value
953                msg = str(localPort) + " " + mymsg
954                print msg
955                sent_rule(widget, msg)
956                widget.set_editable(False)
957                coll_window.destroy()
958    else:
959        check_dialog( widget, None, "Internal program error ;) !")
960
961# collector control button
962def prefix_entry(maxLen, tooltip_Text, parent, lab, id):
963    global mainTT
964    vbox = gtk.VBox(False, 0)
965    parent.pack_start(vbox, False, True, 0)
966    label = gtk.Label(lab)
967    label.set_alignment(0, 0.5)
968    vbox.pack_start(label, False, True, 0)
969    entry = gtk.Entry(max=maxLen)
970    entry.set_max_length(maxLen)
971    entry.connect("activate", prefix_callback, entry, id)
972    entry.set_text("")
973    entry.select_region(0, len(entry.get_text()))
974    if tooltip_Text!=None:
975        mainTT.set_tip(entry, tooltip_Text)
976    vbox.pack_start(entry, False, True, 0)
977    entry.show()
978
979def user_quit(widget, data=None):
980    global myInputControlThread, localPort, record_file, myTimer
981    if myInputControlThread != None:
982        myInputControlThread.kill(1)
983        myInputControlThread = None
984        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
985        s.connect(('localhost', localPort))
986        s.send("FIN")
987        s.close()
988        if (record_file!=None):
989            record_file.close()
990        sent_rule_from_cli("DELETE")
991        print "\n\n\n\n\n Input Stream closed. \n\n\n\n\n Bye :-) \n\n\n\n"
992    if (myTimer != None):
993        myTimer.cancel()
994    gtk.main_quit()
995
996# Flow Selection
997def enter_callback( widget, entry, id):
998    global firstParseValue
999    entry_text = entry.get_text()
1000    if id == 0:
1001        if (entry_text==""):
1002            checkUpValues[0] = 0
1003        else:
1004            if (re.search('\D',entry_text)) or (int(entry_text) >= 99) or (int(entry_text) <= 0):
1005                check_dialog( widget, None, "Wrong value !")
1006            else:
1007                firstParseValue[0] = int(entry_text)
1008                checkUpValues[0] = 1
1009    if id == 1:
1010        if ( entry_text==""):
1011            checkUpValues[8] = 0
1012            checkUpValues[12] = 0
1013            checkUpValues[27] = 0 ## ticket #6
1014            checkUpValues[28] = 0 ## ticket #6
1015        else:
1016            if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',entry_text)):
1017                splitter = entry_text.split('/')
1018                adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
1019                if len(splitter)>1:
1020                    bits = int(splitter[1])
1021                    if bits <= 32 and bits > 0:
1022                        mask[0] = 0xffffffffL << (32 - bits)
1023                    else:
1024                        check_dialog( widget, None, "Wrong value in mask!")
1025                else:
1026                    mask[0] = 0xffffffffL
1027                firstParseValue[8] = adip & mask[0]
1028                checkUpValues[8] = 1
1029                firstParseValue[12] = adip & mask[0]
1030                checkUpValues[12] = 1
1031                firstParseValue[27] = 0x00000000L ## ticket #6
1032                firstParseValue[28] = 0x00000000L ## ticket #6
1033                checkUpValues[27] = 1 ## ticket #6
1034                checkUpValues[28] = 1 ## ticket #6
1035            else:
1036                check_dialog( widget, None, "Wrong value !")
1037    if id == 2:
1038        if ( entry_text==""):
1039            checkUpValues[2] = 0
1040        else:
1041            check_dialog( widget, None, "NOT YET IMPLEMEMTED")
1042            ## pb with IPv6 and getaddrinfo() ??
1043##            splitter = entry_text.split('/')
1044##            try:
1045##                socket.gethostbyaddr(splitter[0])
1046##            except socket.gaierror:
1047##                check_dialog( widget, None, "Wrong value !")
1048##            except socket.herror: ## can't resolv
1049##                pass
1050##            except socket.error:
1051##                pass
1052    if id == 3:
1053        if ( entry_text==""):
1054            checkUpValues[15] = 0
1055        else:
1056            if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',entry_text)):
1057                splitter = entry_text.split('/')
1058                adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
1059                if len(splitter)>1:
1060                    bits = int(splitter[1])
1061                    if bits <= 32 and bits > 0:
1062                        mask[2] = 0xffffffffL << (32 - bits)
1063                    else:
1064                        check_dialog( widget, None, "Wrong value in mask!")
1065                else:
1066                    mask[2] = 0xffffffffL
1067                firstParseValue[15] = adip & mask[2]
1068                checkUpValues[15] = 1
1069            else:
1070                check_dialog( widget, None, "Wrong value !")
1071    if id == 4: ## In|Out
1072        if ( entry_text==""):
1073            checkUpValues[10] = 0
1074            checkUpValues[14] = 0
1075        else:
1076            if (re.search('\D',entry_text)) or (int(entry_text) > 65535) or (int(entry_text) < 0):
1077                check_dialog( widget, None, "Wrong value !")
1078            else:
1079                firstParseValue[10] = int(entry_text)
1080                checkUpValues[10] = 1
1081                firstParseValue[14] = int(entry_text)
1082                checkUpValues[14] = 1
1083    if id == 6: ## bytes
1084        if ( entry_text==""):
1085            checkUpValues[1] = 0
1086        else:
1087            if (re.search('\D',entry_text)) or (int(entry_text) > 999999999) or (int(entry_text) <= 0):
1088                check_dialog( widget, None, "Wrong value !")
1089            else:
1090                firstParseValue[1] = int(entry_text)
1091                if ( int(entry_text) == 0 ):
1092                    firstParseValue[1] = 1000000000
1093                else:
1094                    firstParseValue[1] = int(entry_text)
1095                checkUpValues[1] = 1
1096    if id == 7: ## pkts
1097        if ( entry_text==""):
1098            checkUpValues[2] = 0
1099        else:
1100            if (re.search('\D',entry_text)) or (int(entry_text) > 9999) or (int(entry_text) <= 0):
1101                check_dialog( widget, None, "Wrong value !")
1102            else:
1103                firstParseValue[2] = int(entry_text)
1104                checkUpValues[2] = 1
1105    if id == 8: ## time no concordance with nfv9 field number
1106        if ( entry_text==""):
1107            checkUpValues[0] = 0
1108        else:
1109            if (re.search('\D',entry_text)) or (int(entry_text) > 99) or (int(entry_text) < 0):
1110                check_dialog( widget, None, "Wrong value !")
1111            else:
1112                firstParseValue[0] = int(entry_text)
1113                checkUpValues[0] = 1
1114    if id == 9: ## port range
1115        if ( entry_text==""):
1116            checkUpValues[7] = 0
1117        else:
1118            port_list = string.split(entry_text)
1119            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)):
1120                check_dialog( widget, None, "Wrong value !")
1121            else:
1122                firstParseValue[7] = int(port_list[0])
1123                firstParseValue[11] = int(port_list[1])
1124                checkUpValues[7] = 1
1125    if id == 11: ## tcp flags
1126        if ( entry_text==""):
1127            checkUpValues[6] = 0
1128        else:
1129            if (re.search('\D',entry_text)) or (int(entry_text) > 255) or (int(entry_text) <= 0):
1130                check_dialog( widget, None, "Wrong value !")
1131            else:
1132                firstParseValue[6] = int(entry_text)
1133                checkUpValues[6] = 1
1134    if id == 12: ## prot
1135        if ( entry_text==""):
1136            checkUpValues[4] = 0
1137        else:
1138            if (re.search('\D',entry_text)) or (int(entry_text) > 255) or (int(entry_text) <= 0):
1139                check_dialog( widget, None, "Wrong value !")
1140            else:
1141                firstParseValue[4] = int(entry_text)
1142                checkUpValues[4] = 1
1143    if id == 13: ## tos
1144        if ( entry_text==""):
1145            checkUpValues[5] = 0
1146        else:
1147            if (re.search('\D',entry_text)) or (int(entry_text) > 255) or (int(entry_text) < 0):
1148                check_dialog( widget, None, "Wrong value !")
1149            else:
1150                firstParseValue[5] = int(entry_text)
1151                checkUpValues[5] = 1
1152    if id == 14: ## src AS
1153        if ( entry_text==""):
1154            checkUpValues[16] = 0
1155        else:
1156            if (re.search('\D',entry_text)) or (int(entry_text) > 65535) or (int(entry_text) < 0):
1157                check_dialog( widget, None, "Wrong value !")
1158            else:
1159                firstParseValue[16] = int(entry_text)
1160                checkUpValues[16] = 1
1161    if id == 15: ## dst AS
1162        if ( entry_text==""):
1163            checkUpValues[17] = 0
1164        else:
1165            if (re.search('\D',entry_text)) or (int(entry_text) > 65535) or (int(entry_text) < 0):
1166                check_dialog( widget, None, "Wrong value !")
1167            else:
1168                firstParseValue[17] = int(entry_text)
1169                checkUpValues[17] = 1
1170    if id == 18: ## from router
1171        if ( entry_text==""):
1172            checkUpValues[69] = 0
1173        else:
1174            if (re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2})?$',entry_text)):
1175                splitter = entry_text.split('/')
1176                adip = struct.unpack('>L',socket.inet_aton(splitter[0]))[0]
1177                if len(splitter)>1:
1178                    bits = int(splitter[1])
1179                    if bits <= 32 and bits > 0:
1180                        mask[0] = 0xffffffffL << (32 - bits)
1181                    else:
1182                        check_dialog( widget, None, "Wrong value in mask!")
1183                else:
1184                    mask[0] = 0xffffffffL
1185                firstParseValue[69] = splitter[0]
1186                checkUpValues[69] = 1
1187            else:
1188                check_dialog( widget, None, "Wrong value !")
1189   
1190if __name__ == "__main__":
1191    global window, mainTT, comboRouter, printShit
1192   
1193    gtk.gdk.threads_init()
1194   
1195    if (os.name =="nt"):
1196        os_type = 1
1197    elif (os.name =="posix"):
1198        os_type = 0
1199    else:
1200        os_type = 3
1201
1202    parser = OptionParser()
1203    parser.add_option("-r", "--router", dest="rtr", help ="router address used for NetFlow data export")
1204    parser.add_option("-i", "--index", dest="ind", help ="Interface index get with snmpwalk")
1205    (options, args) = parser.parse_args()
1206    rtr = options.rtr
1207    ind = options.ind
1208
1209    if len(sys.argv)==5:
1210        myInputControlThread = InputControl(localAddr, localPort)
1211        myInputControlThread.start()
1212        msg = str(localPort) + " C_0_=_" + rtr + "/32_C_10_=_" + ind
1213        print msg
1214        sent_rule_from_cli(msg)
1215       
1216    print "---------------------------------------------------------------"
1217    print "In this version, you can only apply rules on the collector based on the following fields:"
1218    print "IN_BYTES: 1,"
1219    print "L4_PROT: 4,"
1220    print "L4_SRC_PORT: 7,"
1221    print "IPV4_SRC_ADDR: 8,"
1222    print "INPUT_SNMP: 10,"
1223    print "L4_DST_PORT: 11,"
1224    print "IPV4_DST_ADDR: 12,"
1225    print "OUTPUT_SNMP: 14,"
1226    print "IPV4_NEXT_HOP: 15,"
1227    print "SRC_AS: 16,"
1228    print "DST_AS: 17,"
1229    print "BGP_IPV4_NEXT_HOP: 18,"
1230    print "IPV6_SRC_ADDR: 27,"
1231    print "IPV6_DST_ADDR: 28,"
1232    print "MPLS_TOP_LABEL_TYPE: 46,"
1233    print "IPV6_NEXT_HOP: 62,"
1234    print "BPG_IPV6_NEXT_HOP: 63,"
1235    print "IP_PROTOCOL_VERSION: 60, please note that the IPv4 templates don't have this field"
1236    print "ROUTER_SRC_ADDR: 0, !!! it's not a real number for a field, but it's a great function"
1237    print "----------------------------------------------------------------"
1238   
1239    mainTT = gtk.Tooltips()
1240    window = gtk.Window(gtk.WINDOW_TOPLEVEL)   
1241    window.connect("destroy", gtk.main_quit, "WM destroy")
1242    window.set_title("RenetcolGUI")
1243    window.set_size_request(850, 550)
1244   
1245    main_vbox = gtk.VBox(False, 1)
1246    main_vbox.set_border_width(1)
1247    window.add(main_vbox)
1248
1249##  menu
1250    file_menu = gtk.Menu()
1251    receive_item = gtk.MenuItem("Receive Stream")
1252    stop_item = gtk.MenuItem("Stop Stream")
1253    quit_item  = gtk.MenuItem("Quit")
1254    file_menu.append(receive_item)
1255    file_menu.append(stop_item)
1256    file_menu.append(quit_item)
1257    receive_item.connect("activate", reception, None)
1258    stop_item.connect("activate", close_recept, None)
1259    quit_item.connect("activate", user_quit, None)
1260    receive_item.show()
1261    stop_item.show()
1262    quit_item.show()
1263
1264    help_menu = gtk.Menu()
1265    about_item = gtk.MenuItem("About")
1266    help_menu.append(about_item)
1267    about_item.connect("activate", about_dialog, None)
1268    about_item.show()
1269
1270    menu_bar = gtk.MenuBar()
1271    main_vbox.pack_start(menu_bar, False, False, 0)
1272    menu_bar.show()
1273    file_item = gtk.MenuItem("File")
1274    file_item.show()
1275    help_item = gtk.MenuItem("Help")
1276    help_item.show()
1277
1278    file_item.set_submenu(file_menu)
1279    menu_bar.append(file_item)
1280    menu_bar.append(file_menu)
1281    file_item.set_right_justified(0)
1282
1283    help_item.set_submenu(help_menu)
1284    menu_bar.append(help_item)
1285    menu_bar.append(help_menu)
1286    help_item.set_right_justified(1)
1287
1288##  first frame
1289    frame = gtk.Frame("Input Stream Control")
1290    main_vbox.pack_start(frame, False, True, 0)
1291    hbox = gtk.HBox(False, 0)
1292    hbox.set_border_width(5)
1293    frame.add(hbox)
1294
1295    ## freeze button
1296    buttonfreeze = gtk.ToggleButton("Freeze")
1297    buttonfreeze.connect("toggled", callback_freeze, None)
1298    mainTT.set_tip(buttonfreeze, "Stop/Start the output in the window.")
1299    hbox.pack_start(buttonfreeze, False, False, 2)
1300    buttonfreeze.show()
1301    ## record button
1302    buttonrecord = gtk.ToggleButton("Record")
1303    buttonrecord.connect("toggled", callback_record, None)
1304    mainTT.set_tip(buttonrecord, "Stop/Start the record in a text file.")
1305    hbox.pack_start(buttonrecord, False, False, 2)
1306    buttonrecord.show()
1307    ## incremental record
1308    buttonRotRec = gtk.ToggleButton("Rot. Record")
1309    buttonRotRec.connect("toggled", callback_RotRec, None)
1310    mainTT.set_tip(buttonRotRec, "Stop/Start the record in a different file for each day.")
1311    hbox.pack_start(buttonRotRec, False, False, 2)
1312    buttonRotRec.show()
1313    ## control collector button
1314    buttoncollector = gtk.ToggleButton("Collector Control")
1315    buttoncollector.connect("toggled", callback_collector, None)
1316    mainTT.set_tip(buttoncollector, "Change the rule which is applied on the collector. You must have activated the input stream before.")
1317    hbox.pack_start(buttoncollector, False, False, 2)
1318    buttoncollector.show()
1319
1320    ipv4_vbox = gtk.VBox(False, 1)
1321    ipv4_vbox.set_border_width(1)
1322    main_vbox.add(ipv4_vbox)
1323##  second frame
1324    frame = gtk.Frame("Select printed fields")
1325    ipv4_vbox.pack_start(frame, False, False, 0)
1326   
1327    vbox = gtk.VBox(False, 0)
1328    vbox.set_border_width(5)
1329    frame.add(vbox)
1330    bbox = gtk.HButtonBox()
1331    vbox.pack_start(bbox, False, True, 5)
1332   
1333    create_button("Src \n IP", 1, callback_fields_printed, 8, bbox, "Source IP")
1334    create_button("Dst\n IP", 1, callback_fields_printed, 12, bbox, "Destination IP")
1335    create_button("Flw\n IP", 0, callback_fields_printed, 15, bbox, "Following IP")
1336    create_button("Index\n In", 0, callback_fields_printed, 10, bbox, "SNMP Index Input")
1337    create_button("Index\n Out", 0, callback_fields_printed, 14, bbox, "SNMP Index Output")
1338    create_button("Size (P)", 1, callback_fields_printed, 2, bbox, "Packets number")
1339    create_button("Size (B)", 1, callback_fields_printed, 1, bbox, "Size in Bytes")
1340    create_button("Time", 0, callback_fields_printed, 0, bbox, "Age of flow")
1341
1342    b2box = gtk.HButtonBox()
1343    vbox.pack_start(b2box, False, True, 5)
1344    create_button("Src\n Port", 1, callback_fields_printed, 7, b2box, "TCP/UDP source port")
1345    create_button("Dst\n Port", 1, callback_fields_printed, 11, b2box, "TCP/UDP destination port")
1346    create_button("TCP\n Flags", 0, callback_fields_printed, 6, b2box, "TCP Flags")
1347    create_button("Prot", 1, callback_fields_printed, 4, b2box, "Protocol")
1348    create_button("Tos", 0, callback_fields_printed, 5, b2box, "Type of service")
1349    create_button("Src\nAs", 0, callback_fields_printed, 16, b2box, "Source AS")
1350    create_button("Dst\nAs", 0, callback_fields_printed, 17, b2box, "Destination AS")
1351    create_button("Src\nMask", 0, callback_fields_printed, 9, b2box, "Source Mask")
1352    create_button("Dst\nMask", 0, callback_fields_printed, 13, b2box, "Destination Mask")
1353
1354    b3box = gtk.HButtonBox()
1355    vbox.pack_start(b3box, False, True, 5)
1356    create_button("Router", 0, callback_fields_printed, 69, b3box, "Router address")
1357
1358##  third frame
1359    frame = gtk.Frame("Parsing values")
1360    ipv4_vbox.pack_start(frame, False, False, 5)
1361    hbox = gtk.VBox(False, 0)
1362    hbox.set_border_width(5)
1363    frame.add(hbox)
1364    pbbox = gtk.HButtonBox()
1365    hbox.pack_start(pbbox, False, True, 5)
1366##  here entry button
1367    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)
1368    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)
1369    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)
1370    dbbox = gtk.HButtonBox()
1371    hbox.pack_start(dbbox, False, True, 5)
1372    create_entry(5, "Required Format : a number less than 65535", dbbox, "SNMP Index In|Out :", 4)
1373    create_entry(4, "Required Format : a number less than 9999", dbbox, "Packet NB :", 7)
1374    create_entry(17, "Required Format : a number less than 999999999, each flow who the size equal this number +/- 5%", dbbox, "Bytes :", 6)
1375    tbbox = gtk.HButtonBox()
1376    hbox.pack_start(tbbox, False, True, 5)
1377    create_entry(2, "Required Format : a number less than 99", tbbox, "Time :", 8)
1378    create_entry(11, "Required Format : a range, each number less than 65535 and space as separator: \"6881 6889\"", tbbox, "Port :", 9)
1379    #create_entry(5, "Required Format : a number less than 65535", tbbox, "Dst port :", 10)
1380    create_entry(3, "Required Format : a number less than 255", tbbox, "TCP Flag :", 11)
1381    fbbox = gtk.HButtonBox()
1382    hbox.pack_start(fbbox, False, True, 5)
1383    create_entry(5, "Required Format : a number less than 65535", fbbox, "Protocol :", 12)
1384    create_entry(3, "Required Format : a number less than 255", fbbox, "ToS :", 13)
1385    create_entry(5, "Required Format : a number less than 65535", fbbox, "Src AS :", 14)
1386    create_entry(5, "Required Format : a number less than 65535", fbbox, "Dst AS :", 15)
1387    kbbox = gtk.HButtonBox()
1388    hbox.pack_start(kbbox, False, True, 5)
1389    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)
1390
1391##  Show
1392    vbox.show()
1393    main_vbox.show()
1394    window.show_all()
1395    mainTT.enable()
1396
1397##  gtk main loop
1398    gtk.gdk.threads_enter()
1399    gtk.main()
1400    gtk.gdk.threads_leave()
Note: See TracBrowser for help on using the browser.