#!/bin/python import re ### Logfile ### logfiles = [ 'Artex_logfile.txt' ] # List of logfiles to read ### Counters ### nTrans = 0 # Transfered calls counter (`transb) nSent = 0 # Sent calls counter (`sendb) nClaimed = 0 # Claimed calls counter ### Lists ### claimed = {} # People we claimed senders = {} # People to send us calls ### Patterns ### prefix = '[*] ' match_sent = re.compile( '^(.*) needs help of .+ [Cc]hannel with: (.*) \(Sent by (.*)\)' ) match_trans = re.compile( '^(.*) requests help: "(.*)",' ) match_claimed = re.compile( '^You are now the .+ for (.*)\. ' ) ### Script Begins ######################################## print "---++ Data Collection Process ++---\n" for logfile in logfiles: print "[+] Opening `%s` for reading..." % logfile fd = open( logfile, 'r' ) prefixlen = len(prefix) fd.seek(0,2) filesize = fd.tell() fd.seek(0) print "[+] Parsing the log file..." while True: buffer = fd.readline() # EOF Check # if buffer == '': break # Is it a channel issue? # buffer = buffer[0] + '*' + buffer[2:] # Making sure the prefix byte is universal if buffer[:prefixlen] == prefix and buffer[prefixlen:prefixlen+2] != '> ': # CLAIM check # data = re.findall( match_claimed, buffer[prefixlen:] ) if data != []: nClaimed += 1 user = data[0] user = user.replace( ' ','|' ) if claimed.has_key(user) == False: claimed[user] = 0 claimed[user] += 1 # Displaying position remminder # if (nClaimed % 100.) == 0: print " > %3d calls read so far [%05.1f%% of file] - %dth caller: %s" % (nClaimed, fd.tell() / 1. / filesize * 100, nClaimed, user) else: # SENT check # data = re.findall( match_sent, buffer[4:] ) if data != []: nSent += 1 sender = data[0][2] sender = sender.replace( ' ','|' ) if senders.has_key(sender) == False: senders[sender] = 0 senders[sender] += 1 else: # TRANS check # data = re.findall( match_trans, buffer[4:] ) if data != []: nTrans += 1 print "[+] Done reading file!" fd.close() ### Statistics ########################################### print "\n---++ Help Channel Statistics ++---\n" print "[#] Claimed calls (unique/total): %d/%d" % (len(claimed), nClaimed) values = claimed.values() values.sort() values.reverse() mirror = claimed for v in values[:5]: keys = mirror.keys() for idx in range(len(keys)): if v == mirror[keys[idx]]: print " > [%3d] %s" % (mirror[keys[idx]], keys[idx]) del(mirror[keys[idx]]) break print "[#] Detected total sent calls: %d" % nSent values = senders.values() values.sort() values.reverse() mirror = senders for v in values[:5]: keys = mirror.keys() for idx in range(len(keys)): if v == mirror[keys[idx]]: print " > [%3d] %s" % (mirror[keys[idx]], keys[idx]) del(mirror[keys[idx]]) break print "[#] Detected total transfered calls: %d" % nTrans ### End of Script ########################################