]> git.itanic.dy.fi Git - emerge-timer/blob - emerge-timer.py
Change how we pass the package into the log parser
[emerge-timer] / emerge-timer.py
1 #!/usr/bin/python
2
3
4 import sys, subprocess, datetime, os, re
5
6
7 PORTDIR = "/usr/portage/"
8 LOGFILE = "/var/log/emerge.log"
9
10 green_start = "\033[32m"
11 color_stop = "\033[m"
12
13 packages = []
14
15
16 class package:
17     def __init__(self, name, version=0):
18         self.name = name
19         self.version = version
20         self.versions = []
21
22     def add_version(self, version, emerge_time, emerge_date):
23
24         self.versions.append((version, emerge_time, emerge_date))
25
26
27     def average_total_time(self):
28         total_time = 0
29         for i in self.versions:
30             total_time += i[1]
31
32         average_time = total_time/len(self.versions)
33
34         return (average_time, total_time)
35
36
37     def max_min_time(self):
38         self.versions.sort()
39
40         min_time = self.versions[0][1]
41         max_time = self.versions[len(self.versions)-1][1]
42
43         return (max_time, min_time)
44
45
46     def print_versions(self):
47         for p in self.versions:
48             print('-'*90 + "\n" +
49                   green_start + self.name + p[0] + color_stop + "  >>>  " +
50                   self.time(p[1]) + "  >>>  " +
51                   self.date(p[2]))
52         print('-'*90 + "\n" + "Package " + green_start + self.name + color_stop +
53               " emerged " + str(len(self.versions)) + " times.")
54         print
55
56
57     def print_min_max_ave(self):
58         max_min = self.max_min_time()
59         ave_total = self.average_total_time()
60
61         print("Max time: \t" + self.time(max_min[0]) +
62               "\nMin time: \t" + self.time(max_min[1]) +
63               "\nAverage time: \t" + self.time(ave_total[0]) +
64               "\nIn total spent " + self.time(ave_total[1]) +
65               " emerging " + green_start + self.name + color_stop)
66
67     def time(self, time):
68
69         days = time/(3600*24)
70         hours = (days - int(days))*24
71         minutes = (hours - int(hours))*60
72         seconds = (minutes - int(minutes))*60
73
74         days = int(days)
75         hours = int(hours)
76         minutes = int(minutes)
77         seconds = int(round(seconds))
78
79         pdays = str()
80         phours = str()
81         pminutes = str()
82         pseconds = str()
83
84         if days > 0:
85             pdays = (green_start + str(days) + color_stop + " day ")
86             if days != 1:
87                 pdays = (green_start + str(days) + color_stop + " days ")
88
89         if hours > 0:
90             phours = (green_start + str(hours) + color_stop + " hour ")
91             if hours != 1:
92                 phours = (green_start + str(hours) + color_stop + " hours ")
93
94         if minutes > 0:
95             pminutes = (green_start + str(minutes) + color_stop + " minute ")
96             if minutes != 1:
97                 pminutes = (green_start + str(minutes) + color_stop + " minutes ")
98
99         pseconds = (green_start + str(seconds) + color_stop + " second ")
100         if seconds != 1:
101             pseconds = (green_start + str(seconds) + color_stop + " seconds ")
102
103         return (pdays + phours + pminutes + pseconds)
104
105
106     def date(self, emerge_date):
107         date = datetime.datetime.fromtimestamp(emerge_date)
108
109         year = str(date.year)
110         month = str(date.month)
111         day = str(date.day)
112         hour = str(date.hour)
113         minute = str(date.minute)
114         second = str(date.second)
115
116         date = "{:%d.%m.%Y %H:%M:%S}".format(date)
117
118         return date
119
120
121
122 def open_log():
123     """Attempt to open the LOGFILE."""
124
125     try:
126         f = open(LOGFILE, 'r')
127     except IOError as detail:
128         print detail
129         sys.exit(1)
130     finally:
131         return f
132
133
134
135 def search_log_for_package(package_class):
136
137     log = open_log()
138
139     for line in log:
140         if ((">>>" in line) and ("emerge" in line)):
141             if package_class.name in line:
142                 version = line.partition(package_class.name)[2].partition(' ')[0]
143                 digit = version.strip('-')[0].isdigit()
144
145                 if digit:
146                     time_string = line.partition(">>>")
147                     start_time = float(time_string[0].strip().strip(':'))
148
149         elif ((":::" in line) and ("completed emerge" in line)):
150             if package_class.name in line:
151                 if digit:
152                     time_string = line.partition(":::")
153                     stop_time = float(time_string[0].strip().strip(':'))
154
155                     emerge_time = stop_time - start_time
156
157                     package_class.add_version(version, emerge_time, start_time)
158
159
160 def get_package(name):
161     """Take the user-input package name and search for it
162     in PORTDIR. """
163
164     dirlist = os.listdir(PORTDIR)
165     possible_package = []
166
167
168     # If the given name is in the format xxx/zzz
169     # assume that xxx is the package group
170     if '/' in name:
171         group = name.partition('/')[0]
172         pkg = name.partition('/')[2]
173         directory = PORTDIR + group
174
175         if group in dirlist:
176             dirs = os.listdir(directory)
177             if pkg in dirs:
178                 possible_package.append(name)
179
180
181     # Go through the directory listing searching for anything
182     # that matches the given name
183     for i in dirlist:
184         directory = PORTDIR + i
185         if os.path.isdir(directory):
186             dirs = os.listdir(directory)
187             if name in dirs:
188                 possible_package.append(i + '/' + name)
189
190
191     if len(possible_package) > 1:
192         print("Multiple packages found for '" + name + "'.")
193         print("Possible packages: ")
194         for value in possible_package:
195             print("\t" + value)
196
197
198     elif len(possible_package) == 1:
199         package = possible_package[0]
200         return package
201
202
203     else:
204         print("No package '" + name + "' found")
205
206
207     sys.exit(1)
208
209
210 def list_pretended():
211     log = open_log()
212
213     for line in sys.stdin:
214         if "[ebuild" in line:
215             full_name = line.partition("] ")[2].partition(' ')[0]
216
217             version = full_name.partition('/')[2].partition('-')[2]
218             while not version[0].isdigit():
219                 version = version.partition('-')[2]
220             package_name = full_name[:-len(version)-1]
221
222             packages.insert(0, package(package_name, version))
223
224
225
226 def main(status, user_package=None):
227
228     if status == "package":
229         user_package = get_package(user_package)
230
231         pack = package(user_package)
232
233         search_log_for_package(pack)
234         pack.print_versions()
235         pack.print_min_max_ave()
236
237
238     elif status == "current":
239         pass
240
241
242     elif status == "pretended":
243         list_pretended()
244
245
246
247
248 if __name__ == "__main__":
249
250     if len(sys.argv) == 1:
251         main("current")
252         sys.exit(1)
253
254     elif sys.argv[1] == "-p":
255         main("pretended")
256         sys.exit(1)
257
258     elif len(sys.argv) > 1:
259         main("package", sys.argv[1])
260