4 import sys, subprocess, datetime, os, re
7 PORTDIR = "/usr/portage/"
8 LOGFILE = "/var/log/emerge.log"
10 green_start = "\033[32m"
17 def __init__(self, name, version=0):
19 self.version = version
21 self.emerge_time = 12*3600
23 def add_version(self, version, emerge_time, emerge_date):
25 self.versions.append((version, emerge_time, emerge_date))
28 def average_time(self):
30 for i in self.versions:
33 average_time = total_time/len(self.versions)
39 for i in self.versions:
48 return self.versions[len(self.versions)-1][1]
54 return self.versions[0][1]
57 def print_current_emerge(self):
59 print("\t" + green_start + self.name + '-' + self.version +
60 color_stop + "\n\t current time: " + self.time(self.emerge_time) +
61 "\n\t average time: "),
63 if len(self.versions) > 1:
64 print(self.time(self.average_time())),
68 print("\n\t " + '-'*45),
70 finish_time = self.average_time() - self.emerge_time
72 print("\n\t time to finish: "),
75 print(self.time(finish_time))
80 def print_versions(self):
81 for p in self.versions:
83 green_start + self.name + p[0] + color_stop + " >>> " +
84 self.time(p[1]) + " >>> " +
86 print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop +
87 " emerged " + str(len(self.versions)) + " times.")
90 def print_pretended_times(self):
91 print("\t" + green_start + self.name + '-' + self.version + color_stop),
93 if len(self.versions) > 1:
94 print("\n\taverage time: " + self.time(self.average_time()))
96 print("\n\t no previous emerges")
99 def print_min_max_ave(self):
100 maxi = self.max_time()
101 mini = self.min_time()
102 average = self.average_time()
103 total = self.total_time()
105 print("Max time: \t" + self.time(maxi) +
106 "\nMin time: \t" + self.time(mini) +
107 "\nAverage time: \t" + self.time(average) +
108 "\nIn total spent " + self.time(total) +
109 " emerging " + green_start + self.name + color_stop)
111 def time(self, time):
113 days = time/(3600*24)
114 hours = (days - int(days))*24
115 minutes = (hours - int(hours))*60
116 seconds = (minutes - int(minutes))*60
120 minutes = int(minutes)
121 seconds = int(round(seconds))
129 pdays = (green_start + str(days) + color_stop + " day ")
131 pdays = (green_start + str(days) + color_stop + " days ")
134 phours = (green_start + str(hours) + color_stop + " hour ")
136 phours = (green_start + str(hours) + color_stop + " hours ")
139 pminutes = (green_start + str(minutes) + color_stop + " minute ")
141 pminutes = (green_start + str(minutes) + color_stop + " minutes ")
143 pseconds = (green_start + str(seconds) + color_stop + " second ")
145 pseconds = (green_start + str(seconds) + color_stop + " seconds ")
147 return (pdays + phours + pminutes + pseconds)
150 def date(self, emerge_date):
151 date = datetime.datetime.fromtimestamp(emerge_date)
153 year = str(date.year)
154 month = str(date.month)
156 hour = str(date.hour)
157 minute = str(date.minute)
158 second = str(date.second)
160 date = "{:%d.%m.%Y %H:%M:%S}".format(date)
167 """Attempt to open the LOGFILE."""
170 f = open(LOGFILE, 'r')
171 except IOError as detail:
179 def search_log_for_package(package_class):
184 if ((">>>" in line) and ("emerge" in line)):
185 if package_class.name in line:
186 version = line.partition(package_class.name)[2].partition(' ')[0]
187 digit = version.strip('-')[0].isdigit()
190 time_string = line.partition(">>>")
191 start_time = float(time_string[0].strip().strip(':'))
193 elif ((":::" in line) and ("completed emerge" in line)):
194 if package_class.name in line:
196 time_string = line.partition(":::")
197 stop_time = float(time_string[0].strip().strip(':'))
199 emerge_time = stop_time - start_time
201 package_class.add_version(version, emerge_time, start_time)
204 def get_package(name):
205 """Take the user-input package name and search for it
208 dirlist = os.listdir(PORTDIR)
209 possible_package = []
212 # If the given name is in the format xxx/zzz
213 # assume that xxx is the package group
215 group = name.partition('/')[0]
216 pkg = name.partition('/')[2]
217 directory = PORTDIR + group
220 dirs = os.listdir(directory)
222 possible_package.append(name)
225 # Go through the directory listing searching for anything
226 # that matches the given name
228 directory = PORTDIR + i
229 if os.path.isdir(directory):
230 dirs = os.listdir(directory)
232 possible_package.append(i + '/' + name)
235 if len(possible_package) > 1:
236 print("Multiple packages found for '" + name + "'.")
237 print("Possible packages: ")
238 for value in possible_package:
242 elif len(possible_package) == 1:
243 package = possible_package[0]
248 print("No package '" + name + "' found")
254 def list_pretended():
257 for line in sys.stdin:
258 if "[ebuild" in line:
259 full_name = line.partition("] ")[2].partition(' ')[0]
261 version = full_name.partition('/')[2].partition('-')[2]
262 while not version[0].isdigit():
263 version = version.partition('-')[2]
264 package_name = full_name[:-len(version)-1]
266 packages.append(package(package_name, version))
269 def list_emerge_processes():
270 """Look for the ebuild process with ps. If the process is found parse
271 the command for the package. With this package search the LOGFILE for
272 the emerge startup time."""
276 now = datetime.datetime.today()
278 for i in os.popen("ps ax"):
279 if (("ebuild.sh" in i) and ("/bin/bash" not in i)):
280 pack = i.partition('[')[2].partition(']')[0]
282 version = pack.partition('/')[2].partition('-')[2]
284 while not version[0].isdigit():
285 version = version.partition('-')[2]
287 package_name = pack[:-len(version)-1]
289 packages.append(package(package_name, version))
292 if len(packages) == 0:
293 print "No current emerge process found."
298 if ((">>>" in line) and ("emerge" in line)):
300 if (p.name + '-' + p.version in line):
302 time = float(line.partition(' ')[0].strip(":"))
304 timestamp = datetime.datetime.fromtimestamp(time)
305 difference = (now - timestamp).total_seconds()
307 if difference < p.emerge_time:
308 p.emerge_time = difference
314 def main(status, user_package=None):
316 if status == "package":
317 user_package = get_package(user_package)
319 pack = package(user_package)
321 search_log_for_package(pack)
322 pack.print_versions()
323 pack.print_min_max_ave()
326 elif status == "current":
327 list_emerge_processes()
329 print "Currently emerging:"
332 search_log_for_package(p)
333 p.print_current_emerge()
336 elif status == "pretended":
339 print "This is how long these packages would take to emerge"
342 search_log_for_package(p)
343 p.print_pretended_times()
347 if __name__ == "__main__":
349 if len(sys.argv) == 1:
353 elif sys.argv[1] == "-p":
357 elif len(sys.argv) > 1:
358 main("package", sys.argv[1])