viewgit/index.php:465 Only variables should be passed by reference [2048]
viewgit/index.php:466 Non-static method GeSHi::get_language_name_from_extension() should not be called statically [2048]
#!/usr/bin/python # -*- coding: utf-8 -*- # # Monitora se i computer dell'aula studenti sono accesi # e restituisce delle statistiche a proposito. import subprocess, time, os, matplotlib matplotlib.use ('Agg') import numpy as np, pylab from optparse import OptionParser # Qualche variabile globale 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(): """ Ritorna una lista con tutti i client all'interno del gruppo group di dsh. Il default è 'all' """ global group clients = [] try: for client in open(group, 'r'): client = client.strip() if client.strip != '' and client[0] != '#': clients.append (client) 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): """ Ritorna True se il client è acceso e risponde ai ping """ alive = subprocess.call(["fping", client], stdout = subprocess.PIPE, stderr = subprocess.PIPE) return (alive == 0) def IsLastAlive(client): """ Ritorna True se il client era acceso durante l'ultimo check effettuato. """ data = LoadClientData(client) data = data.items() 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') except IOError: return data for line in f: if ":" in line: (time, alive) = line.split(":") alive = ("True" in alive) data[float(time)] = alive f.close() UnlockDatabase() return data 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): """ 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) def PrintStats(client): """ Stampa le statistiche sul client prescelto """ data = LoadClientData(client) d = data.items() d.sort() ss = 0 old_time = d[0][0] # Un piccolo integrale sul tempo della funzione # up(client) for (time_entry, up) in d[1:]: if up: ss += (time_entry - old_time) old_time = time_entry ss = ss / (d[-1:][0][0] - d[0][0]) uptime = 100.0 * ss if IsLastAlive(client): is_online = "yes" else: is_online = "no" print "Client: %s" % client print "IsOnline: %s" % is_online print "Uptime: %3.2f %% " % uptime print "----------------------------------------------------" def UptimePlot(filename): """ 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 # ogni 10 minuti. plot_time = np.linspace(0,-7, 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. plot_time = 86400 * plot_time + float(time.time()) - 360 # Inizializziamo i dati a zero plot_data = np.zeros(samples) for client in clients: 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") 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]) f = open(filename, "w") pylab.savefig(f, format='png') f.close() def ClientUptime(times, client): """ Ritorna un vettore della stessa lunghezza di times con il valore 1 se il client era acceso e 0 se era spento """ data = LoadClientData(client) data = data.items() data.sort() iterator = data.__iter__() item = iterator.next() values = np.zeros(len(times)) i = 0 for t in times[::-1]: if item[0] > t: values[i] = 0 i += 1 continue try: while (item[0] < t): item = iterator.next() except StopIteration: return values if (item[1] == True): values[i] = 1 else: values[i] = 0 i += 1 return values if __name__ == "__main__": parser = OptionParser() parser.add_option("-c", "--check", dest="check", help = "Check if clients are up and update database", action = "store_true", default=False) parser.add_option("-s", "--stats", dest="stats", help = "Print stats about collected informations", 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. if not (options.check or options.stats or options.plot): parser.print_help() if options.check: for client in LoadClients(): UpdateClientsData(client, IsAlive(client)) if options.plot: UptimePlot("/home/robol/public_html/files/up-clients.png") if options.stats: try: for client in LoadClients(): PrintStats(client) except Exception, e: print "Errore durante l'esecuzione!\n ==> %s" % e