| |
- 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'
| |