From e13b84841393dd0bee4794715ec4113a7a6d658a Mon Sep 17 00:00:00 2001 From: Leonardo Robol Date: Sun, 18 Apr 2010 18:30:12 +0200 Subject: [PATCH] Aggiunto lock sul database e informazioni di debug --- phcstats.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) 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. -- 2.1.4