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

ispadmin - Suite Administracion Correo/Web/DNS
 
Gestión de dominios -> clase para manejar un fichero de zona 
   (zone_parser) y clase para gestionar la configuración del bind
   (bind_parser)

 
Modules
            
DNS
ispadmin.config
ispadmin.interfaz
re
ispadmin.system
types
 
Classes
            
bind_parser
zone_parser
zone_sin_comentarios
 
class bind_parser
      clase para leer UN UNICO fichero de configuración de bind
donde SOLO DEBE HABER instrucciones zone
 - los comentarios se los come (aquello con //,/*,...)
 
 - ejemplos:
 > a = bind_parser("/etc/local/dns/zones.conf")
 > print a.get("bith.net")
 > a.append("bith.net", [config] ) -> formato [config] ver en append()
 > a.delete("bith.net")
 > a.imprimir()  -> para ver todo el fichero
 > a.guardar()   -> para que se guarde cualquier modificación habida
 
   Methods defined here:
__append__(self, zona, valores)
añadir una nueva zona
valores debe ser un diccionario del tipo:
  {'file': '"/etc/local/dns/master/zeus.bith.net"',
   'type': 'master'}
   
  {'file': '"/var/prueba.com"', 'type': 'slave', 
   'transfer-notify': [], 
   'masters': [['194.224.81.34'], ['194.224.81.33']]}
__check_string__(self, string)
verifica que comience por " y acabe con " el string, 
además de eliminar éstos caracteres
__error__(self, mensaje, token='?')
 error irrecuperable: la zona contiene errores y continuar
sería peligroso, así que lo mejor es abortar a lo bestia,
indicando la línea en que se produjo el error y el token
que la causó
__init__(self, fichero)
 fichero: debe ser una cadena que referencie a un fichero
         si se llama a guardar() se guardarán los cambios
         que hubiera, en caso contrario no
         
se limita a cargar en el buffer self.__zones__ el fichero,
sin analizar si están bien creadas o no, o si la sintaxis
dentro de {} es correcta o no
__obtener_elemento__(self)
 recupera de self.___lexer__ un elemento de una manera
un poco especial: a diferencia de lo que hace shlex.get_token()
lee más de un token si hay una serie de valores entre {}, etc
    
    shlex.get_token()             devuelto por la función
    -----------------             -----------------------
    nombre '{' + ... + '}'+';'    return { nombre:[ ... ] }
                                  (1 array con lo que hay entre {})
    nombre valor ;                return { nombre:valor }
    parametro;                    return { parametro:None }
    
dentro de un {} puede haber otros {} anidados: para cada uno
de ellos se crea una lista
__save__(self, fichero)
guarda en un fichero YA abierto la configuración completa
(también se utiliza para mostrarla, de ahí que no abra o cierre el
 fichero)
all(self)
devuelve los nombres de todas las zonas
(ordenados alfabéticamente)
append_master(self, zona)
crea una nueva zona dns de tipo MASTER
(también tiene que crearse en los esclavos correspondientes,
 y para ello usaremos ssh: el servicio debe estar habilitado
 para trabajar con claves, si slaves==None o slaves==[] pues
 entonces no se les notifica)
  {'file': '"/var/prueba.com"', 'type': 'slave', 
   'transfer-notify': [], 
   'masters': [['194.224.81.34'], ['194.224.81.33']]}
   
slaves puede ser una ip o un nombre, pero ha de permitírsenos
el acceso a esa máquina
append_slave(self, zona, masters)
crea una nueva zona dns de tipo SLAVE
(no se tiene que crear en el master: el master lo crea y nos lo
 notifica)
el master ha de ser único
delete(self, zona)
borrar una zona existente
exists(self, zona)
comprueba si existe una zona con este nombre
get(self, zona)
obtiene una zona
(si hay que modificar hay que hacer un get(), del() y luego add()
guardar(self)
guarda los cambios que pudiera haber en este fichero de 
configuración (si no los hay no hace nada)
se pierden todos los comentarios
imprimir(self)
para mostrar por pantalla el fichero de configuración leído
(pero no guarda nada)

Data and non-method functions defined here:
__doc__ = 'clase para leer UN UNICO fichero de configuraci\xf3... que se guarde cualquier modificaci\xf3n habida\n '
__module__ = 'ispadmin.dns'
 
class zone_parser
      clase para leer un fichero de configuracion de zona de bind
- los comentarios se los come (aquello con ;)
- se detecta la directiva $TTL, pero NO el resto con $
 
- ejemplos:
 
> a = zone_parser("/etc/local/dns/master/bith.net","bith.net")
> print a.zone("www")
> a.zone("www","213.201.48.162")
> a.zone("ftp","ftp.bith.net.")   -> ya determina él si es cname|a
> a.mx("@", [[0,"bith.net"],[1,"otro.com"]])
> print a.mx()
> print a.imprimir() -> mostrar por stdout
> a.guardar()
 
   Methods defined here:
__error__(self, mensaje, token='?')
 error irrecuperable: la zona contiene errores y continuar
sería peligroso, así que lo mejor es abortar a lo bestia
__get__(self, i='@')
recuperar la configuración de una zona (la @ por defecto), None
en caso de que no la haya
__init__(self, fichero, zona=None)
 fichero: debe ser una cadena que referencie a un fichero
si se llama a guardar() se guardarán los cambios
que hubiera, en caso contrario no
__save__(self, fichero)
guarda en un fichero YA abierto la zona dns contenida
(también se utiliza para mostrarla, de ahí que no abra o cierre el
 fichero)
__split__(self, cadena)
 el split es algo especial: sepera por espacios, excepto cuando
encuentra un '"', ya que los strings con "" los dejaremos juntos
sin borrar espacios o tabuladores (no acepta texto multilínea)
dnsservers(self, lista)
email(self, valor)
expiracion(self, valor)
guardar(self)
guarda los cambios que pudiera haber en este fichero de zona
(si no los hay no hace nada)
imprimir(self)
para mostrar por pantalla una zona dns (es equivalente a la
del fichero, pero no guarda nada)
mx(self, zona='@', nuevos=None)
ver/modificar (si se indica nuevos entonces se modifica) los relays
de correo para 'zona'
 
nuevos deberá ser una lista de nombres junto a sus números de 
precedencia, igual formato que usamos nosotros para devolver datos:
    [[0,'mail0.bith.net'],[1,'mail1.bith.net'],[2,'mail2.bith.net']]
 
si la zona no existe, entonces devuelve None, si se ha indicado
nuevos entonces es creada
nuevo(self, email, refresco, reintento, expiracion, ttl, dnsservers)
plantilla para crear nuevas entradas 
(la pega es que para llegar aquí el fichero ha de existir,
pero sirve un fichero vacío)
 
de dnsservers, el primero será el master que haremos anteceder en el soa
refresco(self, valor)
reintento(self, valor)
ttl(self, valor)
zone(self, zona='@', nuevos=None)
ver/modificar (si se indica nuevos entonces se modifica) una
entrada del tipo cname o a (también ipv6 con a6)
 
nuevos deberá ser una lista de nombres o bien el elemento para 
que reemplace al actual, tanto en ip como en cname (ambos tipos 
serán incompatibles, luego si se reemplaza se eliminarán ambos)
 
si la zona no existe, entonces devuelve None, si se ha indicado
nuevos entonces es creada

Data and non-method functions defined here:
__doc__ = 'clase para leer un fichero de configuracion de z...imir() -> mostrar por stdout\n\t> a.guardar()\t\n '
__module__ = 'ispadmin.dns'
 
class zone_sin_comentarios
      objeto encargado de borrar los comentarios de un fichero de config
de zona, ya que el shlex es incapaz de eliminar correctamente los
comentarios que están en medio de una línea (o al menos sin unir
la línea anterior y la siguiente)
 
in ; comentario
out        
--> shlex me devuelve 'in out'
 
   Methods defined here:
__init__(self, nombre)
leemos todo el buffer, eliminando los trozos a partir del ;
close(self)
read(self, num=1)
readline(self)

Data and non-method functions defined here:
__doc__ = "objeto encargado de borrar los comentarios de un... \n --> shlex me devuelve 'in out'\n "
__module__ = 'ispadmin.dns'
 
Functions
            
check_dominio_es_local(dominio)
devuelve 1 si el dominio indicado tiene su correo alojado aquí como
relay de mayor prioridad, usando el servidor DNS configurado, y 
mirando si la primera respuesta nos tiene allí
convertir_a_ip(lista)
dada una lista de strings con nombres o ips, resuleve toda la lista
a sus ips, y en caso de no poder, emite un warning y borra ese 
elemento de la lista que es devuelta
(si se suministra un string en lugar de lista no falla tampoco)
es_cname(cname)
verifica que el argumento dado puede ser tomado como una 
zona dns válida (acaba en al menos un .algo)
es_direccion(ipcname)
por ésto entenderemos que vale tanto una ip como un cname
es_ipv4(ip)
verifica que el valor dado es una IP correcta (IPV4 SÓLO)
es_ipv6(ip)
verifica que el valor dado es una IP correcta (IPV6 SÓLO)
ip(nombre)
convierte un nombre en su IP (devuelve '' si no lo encuentra)
si ya es IP no hace nada
tipo(valor)
a partir de un valor, devuelve el tipo que le corresponde
(CNAME|A|A6)
tipo("192.168.0.1") --> "A"
tipo("bith.net.")-----> "CNAME"
tipo("bith")---------> "CNAME"
tipo("E2:F4:A1:0:5:6:FF:88") -> "A6"
 
Data
             __cnamere__ = <_sre.SRE_Pattern object>
__file__ = '/usr/lib/python2.2/site-packages/ispadmin/dns.py'
__ipv4re__ = <_sre.SRE_Pattern object>
__ipv6re__ = <_sre.SRE_Pattern object>
__name__ = 'ispadmin.dns'
__version__ = '1.0'