root/trunk/tool/renetcolGUI.py @ 77

Revision 77, 54.4 KB (checked in by andreu, 14 years ago)

some updates to prepare release 0.0.12

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