ispadmin.berkeleydb (version 1.0)
index
/usr/lib/python2.2/site-packages/ispadmin/berkeleydb.py

ispadmin - Suite Administración Correo/Web/DNS
hector@bith.net
---
Librería
 
Gestión de los ficheros de texto que el sistema de correo utiliza
para almacenar información que él lee después en formato BerkeleyDB
de otro fichero parejo con extensión .db
 
La clase fichero gestiona dichos ficheros: al abrirlos los carga en
un diccionario del que es sencillo obtener/introducir datos, y al
salir si hubo modificaciones las guarda en el fichero.
 
Se utiliza además la librería fcntl para bloquear el fichero en
previsión de entornos multiusuario, y dado que la lectura y la escritura
se realizan en diferente momento, al leer nos quedamos con la fecha de
modificación del fichero, y si ésta ha cambiado, se aborta cualquier
cambio.
 
Es independiente de la suite.
Se definen las siguientes constantes a nivel de librería que definen
el comportamiento de la clase fichero:
 
 
- caracter_comentario
  define el comienzo de un comentario en una línea:
 
- comentario_a_insertar_en_borrados
  texto que colocará en una línea que haya de borrar, y que nosotros 
  haremos que sea el día y hora en que se borró esa entrada:
 
- nombre_canonico_del_servidor
  nombre de la máquina, para permitir borrar las redundancias en el fichero
  en el caso de direcciones de email, usándose '' o None si no se quiere
  que se elimine dicha redundancia:
 
- formato_nueva_entrada
  formato a usar con las nuevas entradas parte izquierda y parte derecha
  serán los dos %s que debeen aparecer de manera única:
 
- programa_creacion_tabla_berkeley
  programa responsable de que se convierta el fichero de texto modificado 
  en un berkeley db adecuado (en el string el 1er %s se reemplazará por
  el fichero sobre el que ejecutar la acción, y el segundo será el fichero
  .db (aquí postmap sólo requiere el primero, luego el segundo lo dejamos
  como un comentario del shell):
 
- caracteres_validos_en_email
  únicos caracteres válidos como dirección de email antes de la @
  (se usa en las búsquedas):

 
Modules
            
fcntl
os
re
string
sys
tempfile
time
 
Classes
            
fichero
 
class fichero
      gestiona un fichero de texto que define el contenido de otro parejo
en formato BerkeleyDB, además de encargarse de generar al acabar si
hay cambios de generar ese fichero .db llamando al programa indicado
-el fichero está en texto plano
-los comentarios comienzan por '#'
-cada línea con contenido tiene una parte izquierda (clave única en
 todo el fichero) y una parte derecha en la que pueden haber más de
 una entrada (separadas por comas y que nosotros convertimos en vector)
-agrupa las partes izquierdas según el dominio si se trata de
 direcciones de correo, o según lo que va detrás de '_' en la palabra
 que está a la izquierda
 
este tipo de fichero es utilizado por postfix para mantener las 
equivalencias entre email y usuario ('virtual' es el nombre habitual
del fichero)
 
cuando se carga un fichero:
-lee el fichero y lo carga en forma de diccionarios sobre la clase
-permite insertar nuevas tuplas o borrarlas con append/delete
-permite listar con get1/get2 (según si queremos recuperar a partir
 de la parte izquierda o de la parte derecha)
-al salir guarda los cambios y hace el makemap correspondiente
 
internamente guarda:
-__lista__ -> lista con los comentarios (que se quedarán justo donde
              los pusieron)
-__dict1__ -> diccionario ordenado por la parte izda (emails)
-__dict2__ -> contiene lo mismo que __dict1__, pero ahora las claves
              son la parte derecha (usuarios)
 
   Methods defined here:
__anyade__(self, l, a, b)
añade al diccionario 'l' la clave 'a' con valor ['b'],
pero si ya existía lo que hace es a ese vector añadirle el
elemento 'b'
__borra__(self, l, a, b, guarda, informa=0)
elimina del diccionacio 'b' la pareja 'a','b', siendo
'a' la clave y 'b' un elemento del vector asociado a esa clave.
-'guarda' indica que se ha de mantener como comentario en el fichero
-'informa' indica que ha de escribirse por pantalla el resultado
__busca__(self, l, e, expr_reg=0)
busca en el diccionario 'l' elementos que casen con la expresión
'e', que puede ser regular si usamos 'expr_reg', y los devuelve
en una lista
__consulta__(self, l, a)
comprueba que la lista 'l' tenga la clave 'a' y devuelve None
en caso contrario (a diferencia de l[a], que genera una 
excepción
__del__(self)
el destructor de la clase se limita a comprobar que no hayamos
querido acabar sin guardar cambios
__error__(self, mensaje, nlinea=0, linea='')
tratamiento de errores: aborta el programa, dado que el fichero
de direcciones virtuales contiene datos incorrectos
__extraer_dominio__(self, email, nlinea, linea)
dado un email se queda con @loquesea.com, y si lo que nos
dan es algo con un "_", devolvemos la segunda componente
(los usuarios de correo suelen tener de nombre user_dominio)
__init__(self, fichero, funcion_stdout=None, funcion_stderr=None, depurar=0, anything=1)
carga el fichero en el objeto llamando a __procesar_fichero__
y configura las opciones indicadas:
    - fichero = string fichero a procesar
                (el postmap lo hará luego al destruír el objeto)
    - depurar = eliminar comentarios que sigan un patrón específico
    - anything= permite que sea opcional que haya apariciones de
                la palabra 'anything' asociada a cada dominio que
                esté en el fichero de direcciones virtuales
                (si está a 1 a todos los dominios -lo tuvieran o
                 o no- le añade 'anything')
    - funcion_stdout = en caso de haber de mostrar algún
                       mensaje por dónde lo ha de mostrar
    - funcion_stderr = en caso de haber de mostrar errores,
                       por dónde lo ha de hacer
__message__(self, mensaje)
muestra un mensaje (por <stdout> a menos que se indique una
función que lo haga, y la cual ha de tener como único argumento
el string a mostrar
__procesar_fichero__(self, fichero, depurar=0)
'fichero' debe ser una instancia (vamos, que el fichero debe estar
ya abierto), y 'depurar' significa que ignore las líneas de 
comentario que tengan un determinado formato (MB_VIRTUAL_COMENTARIO)
- el fichero ES LEIDO y devuelto a memoria, NO GUARDADO
- devuelve tres elementos:
    lista -> lista con los comentarios (que se quedarán justo donde
             los pusieron)
    dict --> diccionario ordenado por emails
    dict_usuarios --> misma información pero la clave es el usuario
append(self, email, usuario)
añadir entradas 'email'->'usuario' al fichero
-si ya existe no hace nada
-si es un dominio nuevo también lo detecta
busca1(self, email, expr_regular=0)
búsqueda por la parte izquierda (es posible indicar una 
expresión regular)
busca2(self, usuario, expr_regular=0)
búsqueda por la parte derecha (es posible indicar una 
expresión regular)
delete(self, email, usuario=None, informar=0)
borra la tupla 'email'->'usuario' del fichero
-si 'email' es None entonces borra cualquier combinación
 que tenga ese email con cualquier usuario
-lo mismo para 'usuario'
finalizar(self)
finalizar el flujo de operaciones grabando el fichero modificado 
(si es que se ha modificado) y creando su hashdb llamando al
comando correspondiente
get1(self, email, recursiva=1)
la recuperación habrá de ser recursiva, ya que a derecha puede haber
valores que a su vez vuelvan a estar a la izquierda, los cuales 
también se recuperan si se usa 'recursiva'
get2(self, usuario, recursiva=1)
al igual que get1() pero ahora se recupera por la parte derecha
todas las partes izquierdas que lo contienen

Data and non-method functions defined here:
__doc__ = 'gestiona un fichero de texto que define el conte... son la parte derecha (usuarios)\n '
__module__ = 'ispadmin.berkeleydb'
 
Data
             __file__ = '/usr/lib/python2.2/site-packages/ispadmin/berkeleydb.pyc'
__name__ = 'ispadmin.berkeleydb'
__version__ = '1.0'
caracter_comentario = '#'
caracteres_validos_en_email = r'a-zA-Z0-9\.\-_'
comentario_a_insertar_en_borrados = 'Sun Jul 13 13:09:23 2003 -> '
formato_nueva_entrada = '%-35s %s'
nombre_canonico_del_servidor = None
programa_creacion_tabla_berkeley = '/usr/sbin/postmap hash:%s # %s'