From ea9d7c2c79cea6f46b78a2aaa31c45bc542e2439 Mon Sep 17 00:00:00 2001 From: Leonardo Robol Date: Sun, 18 Apr 2010 23:45:02 +0200 Subject: [PATCH] =?UTF-8?q?Aggiunto=20grafico=20della=20disponibilit=C3=A0?= =?UTF-8?q?=20dei=20client.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- phcstats.py | 94 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/phcstats.py b/phcstats.py index 4f8083c..1fbe6a9 100755 --- a/phcstats.py +++ b/phcstats.py @@ -17,7 +17,7 @@ verbose = False def Verbose(string): if verbose: - print "> " + string + print "\033[32;1m>\033[0m " + string def LoadClients(): """ @@ -34,7 +34,7 @@ def LoadClients(): except IOError: raise IOError('Il gruppo dsh \'%s\' non esiste, nessun client trovato!' % group) - Verbose ("Client loaded!") + Verbose ("Client list loaded from %s" % group) for client in clients: Verbose("Client: %s" % client) return clients @@ -71,7 +71,6 @@ def LockDatabase(): f = open(lockfile, 'w') f.write(str(time.time())) f.close() - # Verbose("Database locked") def UnlockDatabase(): """ @@ -79,7 +78,6 @@ def UnlockDatabase(): """ lockfile = database_directory + ".lock" os.remove(lockfile) - # Verbose("Database unlocked") def LoadClientData(client): """ @@ -102,17 +100,12 @@ def LoadClientData(client): UnlockDatabase() return data -def DumpClientData(client, data): - """ - Salva i dati relativi ad un client, eliminando quelli troppo - vecchi - """ + +def AppendClientData(client, t, alive): LockDatabase() - data = dict (filter(lambda i: (i[0] > time.time() - max_time), - data.items())) - f = open(database_directory + client, 'w') - f.write ("\n".join( map(lambda i: ":".join(map(str, i)), data.items()))) - f.close() + f = open(database_directory + client, 'a') + f.write(str(t) + ":" + str(alive) + "\n") + f.close () UnlockDatabase() def UpdateClientsData(client, alive): @@ -120,17 +113,15 @@ def UpdateClientsData(client, alive): Aggiorna i dati relativi al client inserendo l'informazione che in questo momento è acceso. """ - data = LoadClientData(client) - data[float(time.time())] = alive n = " not" if alive: n = "" - Verbose ("Appending new data :%s is%s alive" % (client, n)) - DumpClientData(client, data) + Verbose ("Appending new data: %s is%s alive" % (client, n)) + AppendClientData(client, time.time(), alive) -def PrintStats(client): +def Availability(client): """ - Stampa le statistiche sul client prescelto + Return availability of the client """ data = LoadClientData(client) d = data.items() @@ -147,6 +138,14 @@ def PrintStats(client): ss = ss / (d[-1:][0][0] - d[0][0]) uptime = 100.0 * ss + return uptime + + +def PrintStats(client): + """ + Stampa le statistiche sul client prescelto + """ + uptime = Availability(client) if IsLastAlive(client): is_online = "yes" else: @@ -156,19 +155,17 @@ def PrintStats(client): print "Uptime: %3.2f %% " % uptime print "----------------------------------------------------" -def UptimePlot(filename): +def UptimePlot(filename, days): """ Crea un png con l'uptime dei vari client """ - # Per ora usiamo come backend gnuplot perché matplotlib - # non è installato su poisson e presumibilmente non avrò - # voglia di installarlo. + clients = LoadClients() samples = 100 - # Mi interesso solo dell'ultima settimana, e prendo un sample + # Mi interesso solo dell'ultima days giorni, e prendo un sample # ogni 10 minuti. - plot_time = np.linspace(0,-7, samples) + plot_time = np.linspace(0, (-1) * days, samples) # Mi servono i dati in secondi, ma cominciamo da un'ora fa # per evitare che il grafico vada a 0 per mancanza di dati. @@ -181,23 +178,37 @@ def UptimePlot(filename): client_data = ClientUptime(plot_time, client) plot_data += client_data - # Scriviamo i dati su un file - #f_handle = open('/tmp/phcstats.table', 'w') - #f_handle.write ("# File generato da PHCStats\n") - #for index, t in enumerate(np.linspace(0,-7,samples)): - # f_handle.write(str(t) + " " + str(plot_data[index]) + "\n") - #f_handle.close () - - pylab.title("Client accesi nell'ultima settimana") + # Plot vero e proprio + pylab.title("Client accesi negli ultimi %d giorni" % days) pylab.xlabel("Giorni passati") pylab.ylabel("Numero di client") - pylab.plot (np.linspace(0,-7,samples)[::-1], plot_data) - pylab.axis([-7.5, 0, -0.5, 10]) + pylab.plot (np.linspace(0,(-1) * days,samples)[::-1], plot_data) + pylab.axis([-0.5 - days, 0, -0.5, len(clients) + 1]) f = open(filename, "w") pylab.savefig(f, format='png') f.close() +def AvailabilityPlot(filename): + """ + Plot an histogram of the availability of the clients + """ + clients = LoadClients() + av = [] + for client in clients: + av.append (Availability(client)) + + # Istogramma con i dati + pylab.title("Uptime dei client") + pylab.xticks(3 * np.array(range(0,len(av))) + 1.7, clients) + pylab.xlabel("") + pylab.ylabel("% of uptime") + pylab.bar(3 * np.array(range(0, len(av))) + 1, av, width=0.8) + pylab.axis([0 , 2*len(av), 0, 102]) + f = open(filename, "w") + pylab.savefig(f, format='png') + f.close() + def ClientUptime(times, client): """ Ritorna un vettore della stessa lunghezza di times con @@ -244,6 +255,9 @@ if __name__ == "__main__": help="Be verbose", default=False) parser.add_option("-p", "--plot", dest="plot", action="store_true", help="Plot the data to a png file", default=False) + parser.add_option("-a", "--availability", dest="availability", action="store_true", + help="Plot the data of availability a png file", default=False) + (options, args) = parser.parse_args() group = os.path.expanduser(options.group_file) @@ -251,7 +265,8 @@ if __name__ == "__main__": # Se non mi chiedi di fare niente non hai capito # come funziono, molto probabilmente. - if not (options.check or options.stats or options.plot): + if not (options.check or options.stats or + options.plot or options.availability): parser.print_help() if options.check: @@ -259,7 +274,10 @@ if __name__ == "__main__": UpdateClientsData(client, IsAlive(client)) if options.plot: - UptimePlot("/home/robol/public_html/files/up-clients.png") + UptimePlot("/home/robol/public_html/files/up-clients.png", 5) + + if options.availability: + AvailabilityPlot("/home/robol/public_html/files/av-clients.png") if options.stats: try: -- 2.1.4