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: " + self.time(self.average_time())),
63 finish_time = self.average_time() - self.emerge_time
65 print("\n\t " + '-'*45 +
66 "\n\t time to finish: " + self.time(finish_time))
69 def print_versions(self):
70 for p in self.versions:
72 green_start + self.name + p[0] + color_stop + " >>> " +
73 self.time(p[1]) + " >>> " +
75 print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop +
76 " emerged " + str(len(self.versions)) + " times.")
79 def print_pretended_times(self):
80 print("\t" + green_start + self.name + '-' + self.version +
81 color_stop + "\n\taverage time: " + self.time(self.average_time()))
84 def print_min_max_ave(self):
85 maxi = self.max_time()
86 mini = self.min_time()
87 average = self.average_time()
88 total = self.total_time()
90 print("Max time: \t" + self.time(maxi) +
91 "\nMin time: \t" + self.time(mini) +
92 "\nAverage time: \t" + self.time(average) +
93 "\nIn total spent " + self.time(total) +
94 " emerging " + green_start + self.name + color_stop)
99 hours = (days - int(days))*24
100 minutes = (hours - int(hours))*60
101 seconds = (minutes - int(minutes))*60
105 minutes = int(minutes)
106 seconds = int(round(seconds))
114 pdays = (green_start + str(days) + color_stop + " day ")
116 pdays = (green_start + str(days) + color_stop + " days ")
119 phours = (green_start + str(hours) + color_stop + " hour ")
121 phours = (green_start + str(hours) + color_stop + " hours ")
124 pminutes = (green_start + str(minutes) + color_stop + " minute ")
126 pminutes = (green_start + str(minutes) + color_stop + " minutes ")
128 pseconds = (green_start + str(seconds) + color_stop + " second ")
130 pseconds = (green_start + str(seconds) + color_stop + " seconds ")
132 return (pdays + phours + pminutes + pseconds)
135 def date(self, emerge_date):
136 date = datetime.datetime.fromtimestamp(emerge_date)
138 year = str(date.year)
139 month = str(date.month)
141 hour = str(date.hour)
142 minute = str(date.minute)
143 second = str(date.second)
145 date = "{:%d.%m.%Y %H:%M:%S}".format(date)
152 """Attempt to open the LOGFILE."""
155 f = open(LOGFILE, 'r')
156 except IOError as detail:
164 def search_log_for_package(package_class):
169 if ((">>>" in line) and ("emerge" in line)):
170 if package_class.name in line:
171 version = line.partition(package_class.name)[2].partition(' ')[0]
172 digit = version.strip('-')[0].isdigit()
175 time_string = line.partition(">>>")
176 start_time = float(time_string[0].strip().strip(':'))
178 elif ((":::" in line) and ("completed emerge" in line)):
179 if package_class.name in line:
181 time_string = line.partition(":::")
182 stop_time = float(time_string[0].strip().strip(':'))
184 emerge_time = stop_time - start_time
186 package_class.add_version(version, emerge_time, start_time)
189 def get_package(name):
190 """Take the user-input package name and search for it
193 dirlist = os.listdir(PORTDIR)
194 possible_package = []
197 # If the given name is in the format xxx/zzz
198 # assume that xxx is the package group
200 group = name.partition('/')[0]
201 pkg = name.partition('/')[2]
202 directory = PORTDIR + group
205 dirs = os.listdir(directory)
207 possible_package.append(name)
210 # Go through the directory listing searching for anything
211 # that matches the given name
213 directory = PORTDIR + i
214 if os.path.isdir(directory):
215 dirs = os.listdir(directory)
217 possible_package.append(i + '/' + name)
220 if len(possible_package) > 1:
221 print("Multiple packages found for '" + name + "'.")
222 print("Possible packages: ")
223 for value in possible_package:
227 elif len(possible_package) == 1:
228 package = possible_package[0]
233 print("No package '" + name + "' found")
239 def list_pretended():
242 for line in sys.stdin:
243 if "[ebuild" in line:
244 full_name = line.partition("] ")[2].partition(' ')[0]
246 version = full_name.partition('/')[2].partition('-')[2]
247 while not version[0].isdigit():
248 version = version.partition('-')[2]
249 package_name = full_name[:-len(version)-1]
251 packages.append(package(package_name, version))
254 def list_emerge_processes():
255 """Look for the ebuild process with ps. If the process is found parse
256 the command for the package. With this package search the LOGFILE for
257 the emerge startup time."""
261 now = datetime.datetime.today()
263 for i in os.popen("ps ax"):
264 if (("ebuild.sh" in i) and ("/bin/bash" not in i)):
265 pack = i.partition('[')[2].partition(']')[0]
267 version = pack.partition('/')[2].partition('-')[2]
269 while not version[0].isdigit():
270 version = version.partition('-')[2]
272 package_name = pack[:-len(version)-1]
274 packages.append(package(package_name, version))
277 if len(packages) == 0:
278 print "No current emerge process found."
283 if ((">>>" in line) and ("emerge" in line)):
285 if (p.name + '-' + p.version in line):
287 time = float(line.partition(' ')[0].strip(":"))
289 timestamp = datetime.datetime.fromtimestamp(time)
290 difference = (now - timestamp).total_seconds()
292 if difference < p.emerge_time:
293 p.emerge_time = difference
299 def main(status, user_package=None):
301 if status == "package":
302 user_package = get_package(user_package)
304 pack = package(user_package)
306 search_log_for_package(pack)
307 pack.print_versions()
308 pack.print_min_max_ave()
311 elif status == "current":
312 list_emerge_processes()
314 print "Currently emerging:"
317 search_log_for_package(p)
318 p.print_current_emerge()
321 elif status == "pretended":
324 print "This is how long these packages would take to emerge"
327 search_log_for_package(p)
328 p.print_pretended_times()
332 if __name__ == "__main__":
334 if len(sys.argv) == 1:
338 elif sys.argv[1] == "-p":
342 elif len(sys.argv) > 1:
343 main("package", sys.argv[1])