Aggiunto lock sul database e informazioni di debug

Leonardo Robol [2010-04-18 16:30]
Aggiunto lock sul database e informazioni di debug
Filename
phcstats.py
diff --git a/phcstats.py b/phcstats.py
index 4f91f48..4f8083c 100755
--- a/phcstats.py
+++ b/phcstats.py
@@ -13,6 +13,11 @@ from optparse import OptionParser
 database_directory = '/home/robol/client_stats/' # Il traling slash ci serve
 max_time = 86400 * 10 / 3 / 60 # 10 giorni
 group = '/etc/dsh/group/all'
+verbose = False
+
+def Verbose(string):
+    if verbose:
+        print "> " + string

 def LoadClients():
     """
@@ -29,6 +34,9 @@ def LoadClients():
     except IOError:
         raise IOError('Il gruppo dsh \'%s\' non esiste, nessun client trovato!' %
                       group)
+    Verbose ("Client loaded!")
+    for client in clients:
+        Verbose("Client: %s" % client)
     return clients

 def IsAlive(client):
@@ -49,12 +57,37 @@ def IsLastAlive(client):
     data.sort()
     return data[-1:][0][1]

+def LockDatabase():
+    """
+    Effettua il lock del database
+    """
+    lockfile = database_directory + ".lock"
+    counter = 0
+    while (os.path.exists(lockfile)):
+        time.sleep(1000)
+        counter +=1
+        if (counter > 30):
+            raise RuntimeError('Impossible to unlock database')
+    f = open(lockfile, 'w')
+    f.write(str(time.time()))
+    f.close()
+    # Verbose("Database locked")
+
+def UnlockDatabase():
+    """
+    Sblocca il database
+    """
+    lockfile = database_directory + ".lock"
+    os.remove(lockfile)
+    # Verbose("Database unlocked")
+
 def LoadClientData(client):
     """
     Carica i dati relativi a quel determinato client. Questi
     sono nella forma di un dizionario con gli oggetti time e
     Valori True o False
     """
+    LockDatabase()
     data = {}
     try:
         f = open(database_directory + client, 'r')
@@ -66,6 +99,7 @@ def LoadClientData(client):
             alive = ("True" in alive)
             data[float(time)] = alive
     f.close()
+    UnlockDatabase()
     return data

 def DumpClientData(client, data):
@@ -73,11 +107,13 @@ def DumpClientData(client, data):
     Salva i dati relativi ad un client, eliminando quelli troppo
     vecchi
     """
+    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()
+    UnlockDatabase()

 def UpdateClientsData(client, alive):
     """
@@ -86,6 +122,10 @@ def UpdateClientsData(client, alive):
     """
     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)

 def PrintStats(client):
@@ -130,8 +170,9 @@ def UptimePlot(filename):
     # ogni 10 minuti.
     plot_time = np.linspace(0,-7, samples)

-    # Mi servono i dati in secondi
-    plot_time = 86400 * plot_time + float(time.time())
+    # Mi servono i dati in secondi, ma cominciamo da un'ora fa
+    # per evitare che il grafico vada a 0 per mancanza di dati.
+    plot_time = 86400 * plot_time + float(time.time()) - 360

     # Inizializziamo i dati a zero
     plot_data = np.zeros(samples)
@@ -199,11 +240,14 @@ if __name__ == "__main__":
                       action = "store_true", default = False)
     parser.add_option("-g", "--group-file", dest="group_file",
                       help="The dsh group file to use", default='/etc/dsh/group/all')
+    parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
+                      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)

     (options, args) = parser.parse_args()
     group = os.path.expanduser(options.group_file)
+    verbose = options.verbose

     # Se non mi chiedi di fare niente non hai capito
     # come funziono, molto probabilmente.
ViewGit