#!/bin/bash
#/**
#@file    comparemac
#@brief   Comparar las direcciones MAC (ethernet) de los clientes conectados a la red con las registradas en OpenGnsys.
#@usage   comparemac
#@warning Usa el programa "arp-scan".
#@version 1.0.6 - Versión inicial.
#@author  Manuel González, Ramón M. Gómez - Univ. Sevilla
#@date    2014-07-11
#*/ ##


# Variables.
OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg

# Funciones globales.
source $OPENGNSYS/lib/ogfunctions.sh || exit 1

# Control de errores.
[ "$*" == "help" ] && help
[ "$*" == "version" ] && version
[ $# -gt 0 ] && raiseError usage
[ "$USER" != "root" ] && raiseError access "Need to be root"
[ -r $SERVERCFG ] || raiseError access "Server configuration file"
which arp-scan &>/dev/null || raiseError notfound "Need to install \"arp-scan\""

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

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

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

# Obtener datos de ordenadores registrados.
dbexec "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

