root/trunk/tool/renetcolGUI_0_0_3.py @ 14

Revision 14, 45.1 KB (checked in by andreu, 17 years ago)

IPv6 prefix ok

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