scripts/impression/digicode.py

168 lines
5.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# #############################################################
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# #############################################################
"""
digicode.py
Fonctions pour controler le digicode du 4@J (simulation)
Copyright (c) 2006, 2007, 2008, 2009 by Cr@ns (http://www.crans.org)
"""
import sys
import time
import tempfile
import os
import commands
import string
import random
sys.path.append("/usr/scripts/")
import cranslib.utils.files
# #############################################################
# 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:
CODES_DIR = tempfile.mkdtemp(prefix='fake_digicode')
FAKE_DIR = True
#raise EnvironmentError, "La manipulation des codes pour le digicode n'est possible que sur %s" % CODES_SERVER
else:
FAKE_DIR = False
def __del__():
if FAKE_DIR:
os.rmdir(CODES_DIR)
def __init__():
pass
# ###############################
# 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 = cranslib.utils.files.ageOfFile(os.path.join(CODES_DIR, aCode ) )
content = read_code_file(aCode)
code_list.append((aCode, age, content ) )
return code_list
def get_codes(login):
return [code for (code, age, uid) in list_code() if uid == login]
def read_code_file(code):
"""
Lis le fichier correspondant au 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 cranslib.utils.files.fileIsOlderThan(aFilePath, days=1):
os.remove(aFilePath)