# ############################################################# # .. # .... ............ ........ # . ....... . .... .. # . ... .. .. .. .. ..... . .. # .. .. ....@@@. .. . ........ . # .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... # .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... # @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. # .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... # ...@@@.... @@@ .@@.......... ........ ..... .. # . ..@@@@.. . .@@@@. .. ....... . ............. # . .. .... .. .. . ... .... # . . .... ............. .. ... # .. .. ... ........ ... ... # ................................ # # ############################################################# """ digicode.py Fonctions pour controler le digicode du 4@J Copyright (c) 2006 by www.crans.org """ import sys, time, tempfile, os, commands, string, random import crans.utils.files def __init__(): pass # ############################################################# # CONSTANTES # ############################################################# CODES_SERVER = "zamok" CODES_DIR = "/var/impression/codes/" # ############################################################# # EXCEPTIONS # ############################################################# def CodeAlreadyExists(Exception): pass # ############################################################# # FONCTIONS # ############################################################# # test pour voir si on est bien sur la bonne machine import socket if socket.gethostname() != CODES_SERVER: raise EnvironmentError, "La manipulation des codes pour le digicode n'est possible que sur %s" % CODES_SERVER # ############################### # save_code # ############################### # enregistre le codes avec "monString" dans le fichier # def save_code(code, monString=""): """enregistre le codes avec "monString" dans le fichier """ code = str(code) if os.path.exists( os.path.join( CODES_DIR, code ) ): raise CodeAlreadyExists # On enregistre le fichier avec le code pour numero codefichier = open( os.path.join( CODES_DIR, code ) , 'w') codefichier.write(monString) codefichier.write("\n") codefichier.close() return code # ############################### # gen_code # ############################### # genere un code aleatoire # et l'enregistre # def gen_code(user_name): """ Genere un code au hasard l'enregistre avec user_name dans le fichier""" # Generation du code et ecriture du code rand=random.Random() # Graine automatique avec le temps rand.seed() for i in range(1000): # On genere un code code = rand.randint(100000, 999999) # Si le code est libre, on sort de la boucle if not os.path.exists( os.path.join( CODES_DIR, str( code ) ) ): break else: # Pas de code disponible print ("ERROR: Il n'y a pas de code disponible" ) sys.stderr.write ("ERROR: Il n'y a pas de code disponible" ) try: sys.stderr.write("DEBUG: Un rapport de bug a ete automatiquement envoye.\n") except: sys.stderr.write("ERROR: Impossible d'envoyer le rapport de bug.\n") sys.stderr.write("ERROR: Plus de codes disponibles.\n") sys.stderr.write("ERROR: Penser a ouvrir a l'adherent debite...\n") return save_code(code, user_name) return code # ############################### # list_code # ############################### # liste les codes et leur age en secondes # def list_code(): """ Renvoie la liste des codes existants. La liste est sous la forme [(code, age (en sec), contenu du fichier),...] """ files = os.listdir(CODES_DIR) code_list = [] for aCode in files: age = crans.utils.files.ageOfFile(os.path.join(CODES_DIR, aCode ) ) content = read_code_file(aCode) code_list.append((aCode, age, content ) ) return code_list def read_code_file(code): """ Lis le fichier correspondant à code. Renvoie le contenu du fichier. """ myfile = open(os.path.join(CODES_DIR, code ), 'r') lineStr = myfile.readline() myfile.close() return lineStr.replace('\n','') # ############################### # menage # ############################### # supprime les codes vieux de plus de 24h # def menage(): """ Supprime les codes vieux de plus de 24h """ fileList = os.listdir(CODES_DIR) for aFile in fileList: aFilePath = os.path.join(CODES_DIR, aFile) if os.path.isfile(aFilePath): if crans.utils.files.fileIsOlderThan(aFilePath, days=1): os.remove(aFilePath)