Aggiunto grafico della disponibilità dei client.

Leonardo Robol [2010-04-18 21:45]
Aggiunto grafico della disponibilità dei client.
Filename
phcstats.py
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:
ViewGit