#!/usr/bin/python import sys, subprocess, datetime, os, re PORTDIR = "/usr/portage/" LOGFILE = "/var/log/emerge.log" green_start = "\033[32m" color_stop = "\033[m" packages = [] class package: def __init__(self, name): self.name = name self.versions = [] def add_version(self, version, emerge_time, emerge_date): self.versions.append((version, emerge_time, emerge_date)) def average_total_time(self): total_time = 0 for i in self.versions: total_time += i[1] average_time = total_time/len(self.versions) return (average_time, total_time) def max_min_time(self): self.versions.sort() min_time = self.versions[0][1] max_time = self.versions[len(self.versions)-1][1] return (max_time, min_time) def print_versions(self): for p in self.versions: print('-'*90 + "\n" + green_start + self.name + p[0] + color_stop + " >>> " + self.time(p[1]) + " >>> " + self.date(p[2])) print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop + " emerged " + str(len(self.versions)) + " times.") print def print_min_max_ave(self): max_min = self.max_min_time() ave_total = self.average_total_time() print("Max time: \t" + self.time(max_min[0]) + "\nMin time: \t" + self.time(max_min[1]) + "\nAverage time: \t" + self.time(ave_total[0]) + "\nIn total spent " + self.time(ave_total[1]) + " emerging " + green_start + self.name + color_stop) def time(self, time): days = time/(3600*24) hours = (days - int(days))*24 minutes = (hours - int(hours))*60 seconds = (minutes - int(minutes))*60 days = int(days) hours = int(hours) minutes = int(minutes) seconds = int(round(seconds)) pdays = str() phours = str() pminutes = str() pseconds = str() if days > 0: pdays = (green_start + str(days) + color_stop + " day ") if days != 1: pdays = (green_start + str(days) + color_stop + " days ") if hours > 0: phours = (green_start + str(hours) + color_stop + " hour ") if hours != 1: phours = (green_start + str(hours) + color_stop + " hours ") if minutes > 0: pminutes = (green_start + str(minutes) + color_stop + " minute ") if minutes != 1: pminutes = (green_start + str(minutes) + color_stop + " minutes ") pseconds = (green_start + str(seconds) + color_stop + " second ") if seconds != 1: pseconds = (green_start + str(seconds) + color_stop + " seconds ") return (pdays + phours + pminutes + pseconds) def date(self, emerge_date): date = datetime.datetime.fromtimestamp(emerge_date) year = str(date.year) month = str(date.month) day = str(date.day) hour = str(date.hour) minute = str(date.minute) second = str(date.second) date = "{:%d.%m.%Y %H:%M:%S}".format(date) return date def open_log(): """Attempt to open the LOGFILE.""" try: f = open(LOGFILE, 'r') except IOError as detail: print detail sys.exit(1) finally: return f def search_log_for_package(user_package): log = open_log() packages.insert(0, package(user_package)) for line in log: if ((">>>" in line) and ("emerge" in line)): if user_package in line: version = line.partition(user_package)[2].partition(' ')[0] digit = version.strip('-')[0].isdigit() if digit: time_string = line.partition(">>>") start_time = float(time_string[0].strip().strip(':')) elif ((":::" in line) and ("completed emerge" in line)): if user_package in line: if digit: time_string = line.partition(":::") stop_time = float(time_string[0].strip().strip(':')) emerge_time = stop_time - start_time packages[0].add_version(version, emerge_time, start_time) def get_package(name): """Take the user-input package name and search for it in PORTDIR. """ dirlist = os.listdir(PORTDIR) possible_package = [] # If the given name is in the format xxx/zzz # assume that xxx is the package group if '/' in name: group = name.partition('/')[0] pkg = name.partition('/')[2] directory = PORTDIR + group if group in dirlist: dirs = os.listdir(directory) if pkg in dirs: possible_package.append(name) # Go through the directory listing searching for anything # that matches the given name for i in dirlist: directory = PORTDIR + i if os.path.isdir(directory): dirs = os.listdir(directory) if name in dirs: possible_package.append(i + '/' + name) if len(possible_package) > 1: print("Multiple packages found for '" + name + "'.") print("Possible packages: ") for value in possible_package: print("\t" + value) elif len(possible_package) == 1: package = possible_package[0] return package else: print("No package '" + name + "' found") sys.exit(1) def main(status, user_package=None): if status == "package": user_package = get_package(user_package) search_log_for_package(user_package) packages[0].print_versions() packages[0].print_min_max_ave() elif status == "current": pass elif status == "pretended": pass if __name__ == "__main__": if len(sys.argv) == 1: main("current") sys.exit(1) elif sys.argv[1] == "-p": main("pretended") sys.exit(1) elif len(sys.argv) > 1: main("package", sys.argv[1])