]> git.itanic.dy.fi Git - emerge-timer/blob - emerge-timer.py
minor fixing
[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         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(user_package):
136
137     log = open_log()
138
139     packages.insert(0, package(user_package))
140
141     for line in log:
142         if ((">>>" in line) and ("emerge" in line)):
143             if user_package in line:
144                 version = line.partition(user_package)[2].partition(' ')[0]
145                 digit = version.strip('-')[0].isdigit()
146
147                 if digit:
148                     time_string = line.partition(">>>")
149                     start_time = float(time_string[0].strip().strip(':'))
150
151         elif ((":::" in line) and ("completed emerge" in line)):
152             if user_package in line:
153                 if digit:
154                     time_string = line.partition(":::")
155                     stop_time = float(time_string[0].strip().strip(':'))
156
157                     emerge_time = stop_time - start_time
158
159                     packages[0].add_version(version, emerge_time, start_time)
160
161
162 def get_package(name):
163     """Take the user-input package name and search for it
164     in PORTDIR. """
165
166     dirlist = os.listdir(PORTDIR)
167     possible_package = []
168
169
170     # If the given name is in the format xxx/zzz
171     # assume that xxx is the package group
172     if '/' in name:
173         group = name.partition('/')[0]
174         pkg = name.partition('/')[2]
175         directory = PORTDIR + group
176
177         if group in dirlist:
178             dirs = os.listdir(directory)
179             if pkg in dirs:
180                 possible_package.append(name)
181
182
183     # Go through the directory listing searching for anything
184     # that matches the given name
185     for i in dirlist:
186         directory = PORTDIR + i
187         if os.path.isdir(directory):
188             dirs = os.listdir(directory)
189             if name in dirs:
190                 possible_package.append(i + '/' + name)
191
192
193     if len(possible_package) > 1:
194         print("Multiple packages found for '" + name + "'.")
195         print("Possible packages: ")
196         for value in possible_package:
197             print("\t" + value)
198
199
200     elif len(possible_package) == 1:
201         package = possible_package[0]
202         return package
203
204
205     else:
206         print("No package '" + name + "' found")
207
208
209     sys.exit(1)
210
211
212
213 def main(status, user_package=None):
214
215     if status == "package":
216         user_package = get_package(user_package)
217
218         search_log_for_package(user_package)
219         packages[0].print_versions()
220         packages[0].print_min_max_ave()
221
222
223     elif status == "current":
224         pass
225
226
227     elif status == "pretended":
228         pass
229
230
231
232
233 if __name__ == "__main__":
234
235     if len(sys.argv) == 1:
236         main("current")
237         sys.exit(1)
238
239     elif sys.argv[1] == "-p":
240         main("pretended")
241         sys.exit(1)
242
243     elif len(sys.argv) > 1:
244         main("package", sys.argv[1])
245