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 +
87 self.name + color_stop + " emerged " +
88 str(len(self.versions)) + " times.")
91 def print_pretended_times(self):
92 print("\t" + green_start + self.name + '-' + self.version + color_stop),
94 if len(self.versions) > 1:
95 print("\n\taverage time: " + self.time(self.average_time()))
97 print("\n\t no previous emerges")
100 def print_min_max_ave(self):
101 maxi = self.max_time()
102 mini = self.min_time()
103 average = self.average_time()
104 total = self.total_time()
106 print("Max time: \t" + self.time(maxi) +
107 "\nMin time: \t" + self.time(mini) +
108 "\nAverage time: \t" + self.time(average) +
109 "\nIn total spent " + self.time(total) +
110 " emerging " + green_start + self.name + color_stop)
112 def time(self, time):
114 days = time/(3600*24)
115 hours = (days - int(days))*24
116 minutes = (hours - int(hours))*60
117 seconds = (minutes - int(minutes))*60
121 minutes = int(minutes)
122 seconds = int(round(seconds))
130 pdays = (green_start + str(days) +
131 color_stop + " day ")
133 pdays = (green_start + str(days) +
134 color_stop + " days ")
137 phours = (green_start + str(hours) +
138 color_stop + " hour ")
140 phours = (green_start + str(hours) +
141 color_stop + " hours ")
144 pminutes = (green_start + str(minutes) +
145 color_stop + " minute ")
147 pminutes = (green_start + str(minutes) +
148 color_stop + " minutes ")
150 pseconds = (green_start + str(seconds) +
151 color_stop + " second ")
153 pseconds = (green_start + str(seconds) +
154 color_stop + " seconds ")
156 return (pdays + phours + pminutes + pseconds)
159 def date(self, emerge_date):
160 date = datetime.datetime.fromtimestamp(emerge_date)
162 year = str(date.year)
163 month = str(date.month)
165 hour = str(date.hour)
166 minute = str(date.minute)
167 second = str(date.second)
169 date = "{:%d.%m.%Y %H:%M:%S}".format(date)
176 """Attempt to open the LOGFILE."""
179 f = open(LOGFILE, 'r')
180 except IOError as detail:
188 def search_log_for_package(package_class):
193 if ((">>>" in line) and ("emerge" in line)):
194 if package_class.name in line:
195 version = line.partition(package_class.name)[2].partition(' ')[0]
196 digit = version.strip('-')[0].isdigit()
199 time_string = line.partition(">>>")
200 start_time = float(time_string[0].strip().strip(':'))
202 elif ((":::" in line) and ("completed emerge" in line)):
203 if package_class.name in line:
205 time_string = line.partition(":::")
206 stop_time = float(time_string[0].strip().strip(':'))
208 emerge_time = stop_time - start_time
210 package_class.add_version(version, emerge_time, start_time)
213 def get_package(name):
214 """Take the user-input package name and search for it
217 dirlist = os.listdir(PORTDIR)
218 possible_package = []
221 # If the given name is in the format xxx/zzz
222 # assume that xxx is the package group
224 group = name.partition('/')[0]
225 pkg = name.partition('/')[2]
226 directory = PORTDIR + group
229 dirs = os.listdir(directory)
231 possible_package.append(name)
234 # Go through the directory listing searching for anything
235 # that matches the given name
237 directory = PORTDIR + i
238 if os.path.isdir(directory):
239 dirs = os.listdir(directory)
241 possible_package.append(i + '/' + name)
244 if len(possible_package) > 1:
245 print("Multiple packages found for '" + name + "'.")
246 print("Possible packages: ")
247 for value in possible_package:
251 elif len(possible_package) == 1:
252 package = possible_package[0]
257 print("No package '" + name + "' found")
263 def list_pretended():
266 for line in sys.stdin:
267 if "[ebuild" in line:
268 full_name = line.partition("] ")[2].partition(' ')[0]
270 version = full_name.partition('/')[2].partition('-')[2]
271 while not version[0].isdigit():
272 version = version.partition('-')[2]
273 package_name = full_name[:-len(version)-1]
275 packages.append(package(package_name, version))
278 def list_emerge_processes():
279 """Look for the ebuild process with ps. If the process is found parse
280 the command for the package. With this package search the LOGFILE for
281 the emerge startup time."""
285 now = datetime.datetime.today()
287 for i in os.popen("ps ax"):
288 if (("ebuild.sh" in i) and ("/bin/bash" not in i)):
289 pack = i.partition('[')[2].partition(']')[0]
291 version = pack.partition('/')[2].partition('-')[2]
293 while not version[0].isdigit():
294 version = version.partition('-')[2]
296 package_name = pack[:-len(version)-1]
298 packages.append(package(package_name, version))
301 if len(packages) == 0:
302 print "No current emerge process found."
307 if ((">>>" in line) and ("emerge" in line)):
309 if (p.name + '-' + p.version in line):
311 time = float(line.partition(' ')[0].strip(":"))
313 timestamp = datetime.datetime.fromtimestamp(time)
314 difference = (now - timestamp).total_seconds()
316 if difference < p.emerge_time:
317 p.emerge_time = difference
323 def main(status, user_package=None):
325 if status == "package":
326 user_package = get_package(user_package)
328 pack = package(user_package)
330 search_log_for_package(pack)
331 pack.print_versions()
332 pack.print_min_max_ave()
335 elif status == "current":
336 list_emerge_processes()
338 print "Currently emerging:"
341 search_log_for_package(p)
342 p.print_current_emerge()
345 elif status == "pretended":
348 print "This is how long these packages would take to emerge"
351 search_log_for_package(p)
352 p.print_pretended_times()
356 if __name__ == "__main__":
358 if len(sys.argv) == 1:
362 elif sys.argv[1] == "-p":
366 elif len(sys.argv) > 1:
367 main("package", sys.argv[1])