]> git.itanic.dy.fi Git - emerge-timer/blob - emerge-timer.py
Add min, max, average time printouts
[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):
18         self.name = name
19
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
55
56     def print_min_max_ave(self):
57         max_min = self.max_min_time()
58         ave_total = self.average_total_time()
59
60         print("Max time: \t" + self.time(max_min[0]) +
61               "\nMin time: \t" + self.time(max_min[1]) +
62               "\nAverage time: \t" + self.time(ave_total[0]) +
63               "\nIn total spent " + self.time(ave_total[1]) +
64               " emerging " + self.name)
65
66     def time(self, time):
67
68         days = time/(3600*24)
69         hours = (days - int(days))*24
70         minutes = (hours - int(hours))*60
71         seconds = (minutes - int(minutes))*60
72
73         days = int(days)
74         hours = int(hours)
75         minutes = int(minutes)
76         seconds = int(round(seconds))
77
78         pdays = str()
79         phours = str()
80         pminutes = str()
81         pseconds = str()
82
83         if days > 0:
84             pdays = (green_start + str(days) + color_stop + " day ")
85             if days != 1:
86                 pdays += "s"
87
88         if hours > 0:
89             phours = (green_start + str(hours) + color_stop + " hour ")
90             if hours != 1:
91                 phours += "s"
92
93         if minutes > 0:
94             pminutes = (green_start + str(minutes) + color_stop + " minute ")
95             if minutes != 1:
96                 pminutes += "s"
97
98         pseconds = (green_start + str(seconds) + color_stop + " second ")
99         if seconds != 1:
100             pseconds += "s"
101
102         return (pdays + phours + pminutes + pdays)
103
104
105     def date(self, emerge_date):
106         date = datetime.datetime.fromtimestamp(emerge_date)
107
108         year = str(date.year)
109         month = str(date.month)
110         day = str(date.day)
111         hour = str(date.hour)
112         minute = str(date.minute)
113         second = str(date.second)
114
115         date = "{:%d.%m.%Y %H:%M:%S}".format(date)
116
117         return date
118
119
120
121 def open_log():
122     """Attempt to open the LOGFILE."""
123
124     try:
125         f = open(LOGFILE, 'r')
126     except IOError as detail:
127         print detail
128         sys.exit(1)
129     finally:
130         return f
131
132
133
134 def search_log_for_package(user_package):
135
136     log = open_log()
137
138     packages.insert(0, package(user_package))
139
140     for line in log:
141         if ((">>>" in line) and ("emerge" in line)):
142             if user_package in line:
143                 version = line.partition(user_package)[2].partition(' ')[0]
144                 digit = version.strip('-')[0].isdigit()
145
146                 if digit:
147                     time_string = line.partition(">>>")
148                     start_time = float(time_string[0].strip().strip(':'))
149
150         elif ((":::" in line) and ("completed emerge" in line)):
151             if user_package in line:
152                 if digit:
153                     time_string = line.partition(":::")
154                     stop_time = float(time_string[0].strip().strip(':'))
155
156                     emerge_time = stop_time - start_time
157
158                     packages[0].add_version(version, emerge_time, start_time)
159
160
161 def get_package(name):
162     """Take the user-input package name and search for it
163     in PORTDIR. """
164
165     dirlist = os.listdir(PORTDIR)
166     possible_package = []
167
168
169     # If the given name is in the format xxx/zzz
170     # assume that xxx is the package group
171     if '/' in name:
172         group = name.partition('/')[0]
173         pkg = name.partition('/')[2]
174         directory = PORTDIR + group
175
176         if group in dirlist:
177             dirs = os.listdir(directory)
178             if pkg in dirs:
179                 possible_package.append(name)
180
181
182     # Go through the directory listing searching for anything
183     # that matches the given name
184     for i in dirlist:
185         directory = PORTDIR + i
186         if os.path.isdir(directory):
187             dirs = os.listdir(directory)
188             if name in dirs:
189                 possible_package.append(i + '/' + name)
190
191
192     if len(possible_package) > 1:
193         print("Multiple packages found for '" + name + "'.")
194         print("Possible packages: ")
195         for value in possible_package:
196             print("\t" + value)
197
198
199     elif len(possible_package) == 1:
200         package = possible_package[0]
201         return package
202
203
204     else:
205         print("No package '" + name + "' found")
206
207
208     sys.exit(1)
209
210
211
212 def main(status, user_package=None):
213
214     if status == "package":
215         user_package = get_package(user_package)
216
217         search_log_for_package(user_package)
218         packages[0].print_versions()
219         packages[0].print_min_max_ave()
220
221
222     elif status == "current":
223         pass
224
225
226     elif status == "pretended":
227         pass
228
229
230
231
232 if __name__ == "__main__":
233
234     if len(sys.argv) == 1:
235         main("current")
236         sys.exit(1)
237
238     elif sys.argv[1] == "-p":
239         main("pretended")
240         sys.exit(1)
241
242     elif len(sys.argv) > 1:
243         main("package", sys.argv[1])
244