#!/bin/bash
# comparemac - script para comparar las direcciones MAC (ethernet) de los clientes
#	       conectados a la red con las registradas en OpenGnsys.
# Requisitos: arp-scan
# Autores: Manuel González, Ramón M. Gómez - Univ. Sevilla, Junio 2014.

# Variables.
PROG=$(basename $0)
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg

# Ficheros temporales.
MYCNF=$(mktemp /tmp/.my.cnf.XXXXX)
TMPSQL=$(mktemp /tmp/mysql.cnf.XXXXX)
TMPSCAN=$(mktemp /tmp/scan.cnf.XXXXX)

# Control de errores.
if [ ! -r $SERVERCONF ]; then
	echo "$PROG: Sin acceso a fichero de configuración."
	exit 2
fi
if ! which arp-scan &>/dev/null; then
	echo "$PROG: Debe instalarse el programa \"arp-scan\"."
	exit 2
fi

# Obtener datos de acceso a la base de datos.
source $SERVERCONF

# Componer fichero con credenciales de conexión.
cat << EOT > $MYCNF
[client]
user=$USUARIO
password=$PASSWORD
EOT

# Borrar ficheros temporales si termina el proceso.
trap "rm -f $MYCNF $TMPSQL $TMPSCAN" 0 1 2 3 6 9 15

# Obtener datos de ordenadores registrados.
mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \
		"SELECT ip, mac, REPLACE (aulas.nombreaula, ' ', '_') AS aula
		   FROM ordenadores
		   JOIN aulas USING (idaula)
		  ORDER BY ip" > $TMPSQL

# Obtener datos de red.
NET=$(ip -o addr show up | awk -v ip="^$ServidorAdm/" '{if ($3=="inet" && $4 ~ ip) print $4}')
arp-scan $NET 2>/dev/null | awk '/^[0-2]*\./ {gsub(/:/,"");print $1,toupper($2)}' > $TMPSCAN

# Comparar los ficheros y mostrar las diferencias de direcciones MAC.
(while read -e IP MAC; do
	awk -v ip=$IP -v mac=$MAC '{if ($1 == ip && $2 != mac)
					printf("%s (%s) conectado con MAC %s, registrado con %s\n",ip,$3,mac,$2);
				   }' $TMPSQL
done) < $TMPSCAN

