Aggiunto lock sul database e informazioni di debug
Leonardo Robol [2010-04-18 16:30]
Aggiunto lock sul database e informazioni di debug
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.