''' Script for processing the log generated by the TPSmart app. Given a directory and userID will determine the latest log file, decrypt it and compute the time that was spent on each app. ''' import datetime import base64 import os import glob import functools import sys from Crypto.Cipher import AES monthDict = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep':9, 'Oct':10, 'Nov': 11, 'Dec' : 12} def readAndProcess(fileName): f = open(fileName, 'r') return processAppTimes(f.read().split('\n')) def processAppTimes(fileContent): # fileContent = fileContent.split('\n') fileContent = [line.split(' ') for line in fileContent if len(line.strip()) > 0] # dictionary to accumulate the seconds for each application appDict = {} # for each line in the text file, extract the tokens, compute the time diff # and accumulate in dictionary maxTokenIdx = max(tokenApp, tokenMonth, tokenDay, tokenYear, tokenTime) isFirst = True for event in fileContent: # print("evenToken:", tokenTime) # print (event[tokenTime]) if len(event) > maxTokenIdx: (hour, minutes, seconds) = event[tokenTime].split(':') (year, month, day) = (int(event[tokenYear]), monthDict[event[tokenMonth]],int(event[tokenDay])) currDateTime = datetime.datetime(year, month, day, int(hour), int(minutes), int(seconds)) # print(event, currDateTime, event[tokenApp]) if (not isFirst): timeDelta = currDateTime - prevDateTime # print(timeDelta, prevApp) if prevApp in appDict: appDict[prevApp] = appDict[prevApp] + timeDelta.seconds else: appDict[prevApp] = 0 + timeDelta.seconds else: isFirst = False prevDateTime = currDateTime prevApp = event[tokenApp] return appDict def decryptFileAndProcess(encryptedFName): key = "This is a secret" f = open(encryptedFName, 'rb') print("Decrypting the file: %s ..." % encryptedFName) cipher = AES.new(key) decrypted = cipher.decrypt(f.read()) fileContent = decrypted.decode("utf-8").split("\n") # positions of tokens in each line # print("Is this a time? ", fileContent[0][tokenTime]) # print("Is this a year month day? ", fileContent[0][tokenYear], fileContent[0][tokenMonth], fileContent[0][tokenDay]) # print("If not, modify the token values....") # print(fileContent) # print([line for line in fileContent if len(line) > 10]) return processAppTimes([line for line in fileContent if len(line) > 10]) def latestUserFile(searchDir, userID): # search_dir = "/tmp/images/" print("Searching dir %s for latest file of userID: %s ...." % (searchDir, userID)) files = [f for f in glob.glob(searchDir + "/" + userID + "-*EncrypFile*") if os.path.isfile(f)] return max(files, key = lambda x: os.path.getmtime(x)) ''' The main program.... ''' if len(sys.argv) != 3: print("Usage: " + sys.argv[0] + " (directory) (UserID)") print("Example: " + sys.argv[0] + " /tmp/images 1000") sys.exit(1) searchDir = sys.argv[1] userID = sys.argv[2] (tokenApp,tokenMonth, tokenDay, tokenYear, tokenTime) = (0,3,4,7,5) results = decryptFileAndProcess( latestUserFile(searchDir,userID)) print("Results for user", userID) print(results)