La necessitat
Necessitam saber quantes pàgines s’han imprès durant el darrer mes per usuari i per impressora.
La idea
Sabem que el gestor d’impressió CUPS genera el fitxer de log /var/log/cups/page_log on es crea una línia per a cada treball d’impressió. Una de les dades és el número de pàgines del treball.
Quan el fitxer de log “roti” es llançarà un script que ens generarà el total per usuari i total per impressora.
La sol·lució
Modificam el fitxer /etc/logrotate.d/cups-daemon que cridarà l’script:
/var/log/cups/*log { # Generam una estadística mensual monthly missingok rotate 7 sharedscripts postrotate invoke-rc.d --quiet cups restart > /dev/null #Executam el fitxer després d'haver fet el rotate /home/resum.py endscript nocompress create }
El contingut de /home/resum.py és:
#!/usr/bin/python3 import os import csv users = [] printers = [] pagesusers = [] pagesprinters = [] # Feim còpia sobre fitxer a treballar os.system("cp /var/log/cups/page_log.1 /tmp/page_log") # Iteram per a cada linia i guardam grups de llistes (total per usuari i total per impressora) # # posicio1 de llista "users" ha imprès el número de pàgines indicat a posició1 de "pagesusers" # Idem per printers i pagesprinters with open('/tmp/page_log') as csvfile: readCSV = csv.reader(csvfile, delimiter=' ') for row in readCSV: # Columna d'impressora printer = row[0] # Columna d'usuari user = row[1].lower() # Columna de pàgines del document page = int(row[6]) if not ( user in users ): # L'usuari és nou a la llista users.append(user) pagesusers.append(page) else: # Ja existeix l'usuari a la llista # Sumam número de pàgines ja comptabilitzades i el nou valor index = users.index(user) pagesusers[index] = pagesusers[index] + page if not ( printer in printers ): # L'usuari és nou a la llista printers.append(printer) pagesprinters.append(page) else: # Ja existeix l'usuari a la llista # Sumam número de pàgines ja comptabilitzades i el nou valor index = printers.index(printer) pagesprinters[index] = pagesprinters[index] + page csvfile.close() ########### # Escrivim resultats a fitxers amb format csv # Totals per usuari with open('/tmp/totalXusuari.csv', 'w') as csvfile: writeCSV = csv.writer(csvfile, delimiter=' ', quoting=csv.QUOTE_MINIMAL) # Posam capçalera csvfile.write("usuari pagines\n") # Per a cada usuari cream línia al fitxer for user in users: index = users.index(user) row = users[index]+" "+str(pagesusers[index])+"\n" csvfile.write(row) csvfile.close() # Totals per impressora with open('/tmp/totalXimpresora.csv', 'w') as csvfile: writeCSV = csv.writer(csvfile, delimiter=' ', quoting=csv.QUOTE_MINIMAL) # Posam capalera csvfile.write("impressora pagines\n") # Per a cada usuari cream línia al fitxer for printer in printers: index = printers.index(printer) row = printers[index]+" "+str(pagesprinters[index])+"\n" csvfile.write(row) csvfile.close()
D’aquesta manera tenim el fitxers:
- /tmp/totalXusuari.csv -> total de pàgines de cada usuari
- /tmp/totalXimpresora.csvon -> total de pàgines de cada impressora
😉