Loading

15/02/2008
Comparación de views de zonas DNS para detectar diferencias
por +Joaquín Herrero a las 15:47 [ enlace a esta entrada ]

Tags: dns, views

Uno de los problemas que podrían suceder por mantener dos (o más) ficheros de resolución de nombres/direcciones para implementar views en DNS como comentamos el otro día es que puede que agregues un nombre a uno de los ficheros (por ejemplo, para resolver la IP pública de ese nombre), y se te olvide introducir ese nombre en la vista para las direcciones privadas.

Para detectar estas diferencias, es decir, nombres que están definido en una de las vistas y no lo están en otra, podemos ejecutar este script, al que pasaremos como parámetros los dos ficheros que queremos comparar.

# diffviews db.dominio.com db.dominio.com.local

El script hace una verificación básica de que se haya pasado dos nombres de ficheros como parámetros y que no sean el mismo y a continuación produce un listado de las diferencias entre ellos o un mensaje que indica que son iguales. Incluso genera un código de salida para poder incluirlo en scripts que tengan que verificar si las zonas son iguales o no.

La clave del invento está en estas dos líneas:

awk '$3 == "A" {print $1}' $_FILE_1  | sort  > $_TEMPFILE1
awk '$3 == "A" {print $1}' $_FILE_2  | sort  > $_TEMPFILE2

que lo que hacen es extraer los nombres de cada fichero de zona, ordenarlos alfabéticamente y crear con cada uno de los conjuntos de nombres un fichero temporal. A continuación hacemos un diff de esos dos ficheros temporales y nos dirá qué nombres están en un fichero y faltan en el otro.

Este es el script "diffviews", que hace el trabajo de comparación de dos ficheros de definición de zona DNS:

#/bin/sh
#    diffviews    (C) 2008 Joaquin Herrero, Creative Codeworks
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see .

_ZONES_DIRECTORY="/var/named/master/"

echo ""

if [ $# != 2 ]
then
   echo "Must specify two zone files to process"
   exit 127
fi

if [ ! -f $1 ] 
then
   echo "Error: $1 not found."
   exit 127
fi

if [ ! -f $2 ] 
then
   echo "Error: $2 not found."
   exit 127
fi

if [ $1 == $2 ]
then
   echo "Files must exist and have different names"
   exit 127
fi

echo "diff between addresses in $1 and $2"
_FILE_1=$_ZONES_DIRECTORY$1
_FILE_2=$_ZONES_DIRECTORY$2


_TEMPFILE1=/tmp/_diffzona_`echo $USER`_`date +%Y%m%d%H%M%S`_$1
_TEMPFILE2=/tmp/_diffzona_`echo $USER`_`date +%Y%m%d%H%M%S`_$2

awk '$3 == "A" {print $1}' $_FILE_1  | sort  > $_TEMPFILE1
awk '$3 == "A" {print $1}' $_FILE_2  | sort  > $_TEMPFILE2

diff $_DIFF_OPTS $_TEMPFILE1 $_TEMPFILE2

if [ $? == 0 ]
then
  echo "No differences were found."
  _EXIT_STATUS=0
elif [ $? == 1 ]
then
  echo "Differences were found."
  _EXIT_STATUS=1
elif [ $? > 1 ]
then
  echo "Errors were found."
  _EXIT_STATUS=127
fi


rm $_TEMPFILE1 $_TEMPFILE2
exit $_EXIT_STATUS

Para ejecutar "diffviews" para todas las zonas que tengan un view asociado (suponiendo que el view tenga una extensión predeterminada, "local" en este caso) podemos usar este otro script:

#/bin/sh
#    checkviews    (C) 2008 Joaquin Herrero, Creative Codeworks
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see .

_ZONES_DIRECTORY="/var/named/master/"

cd $_ZONES_DIRECTORY

for i in *local
do
  _FILE_1=$i
  _FILE_2=`basename $i .local`
  diffviews $_FILE_1 $_FILE_2
done

echo "done."

Este script se puede poner en las tareas diarias de administración del sistema y así cada día, o cada semana, automáticamente se nos enviaría un email con las diferencias entre las vistas de un mismo dominio.

En OpenBSD esto se haría incluyendo la ejecución de este script en /etc/daily o /etc/weekly o /etc/monthly dependiendo de la periodicidad con la que lo queramos ejecutar.

enlace a esta entrada | categoría: /sistemas |

 

 

Creative Commons License

Otras entradas:

Últimos cursos

Categorías

powered by blosxom edited with vi powered by OpenBSD powered by perl powered by apache graphics by GIMP