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: