#!/bin/sh
# Para que se lance al inicio, editar /etc/rc.local y anade la ruta al script con un & al final para que se quede en segundo plano
#  ej: /etc/config/scripts/MailNewClients.sh &

##################################################

Reporta_Nuevas_Conexiones_a_Wifi_eMail=True   # Reporta cuando alguien se conecta a nuestra wifi enviando un email
Reporta_Nuevas_Conexiones_a_Wifi_botTG=False  # Reporta cuando alguien se conecta a nuestra wifi con un mensaje de Telegram
Reporta_Acciones_Fwknopd_eMail=True           # Reporta cuando fwknopd acepta una peticion de apertura o redireccion de puertos (por correo)
Reporta_Acciones_Fwknopd_botTG=False          # Reporta cuando fwknopd acepta una peticion de apertura o redireccion de puertos (por telegram)
Registra_ControlHorario=True                  # Funciona en conjuncion con el script ControlHorario.sh, que se lanzara antes de finalizar cada dia
PathForControlHorario="/tmp/ControlHorario"   # Si no existe la carpeta, la creara. Aqui creara los ficheros FirstWcon.<NombreEquipo>.<YYYY-MM-DD> y LastWcon.<NombreEquipo>.<YYYY-MM-DD>
                                              # Ten presente que /tmp esta en ram y se borra al reiniciar. Valora anadir un pendrive para no machacar la flash:  https://micorreo.email/OpenWRT.html#USBStorage

#### Opciones de reporte conexiones a wifi ####

Omite_Reservas_DHCP=True                                       # Omitira las mac que aparezcan en el fichero /etc/config/dhcp (reservas de DHCP)
Omite_Ficheros="/etc/config/myconfig/MailNewClients_Whitelist" # Omitira las mac que aparezan en este fichero. Puedes poner varios ficheros, ej: "/path/file1 /path/file2".
                                                               # El fichero debe tener una mac por linea y acepta un espacio y comentario, ej: 00:00:00:00:00:00 # Ejemplo

####### Datos para los envios de correo #######

SMTP_SERVER=smtp.gmail.com   # Si pones la ip podras recibir notificaciones aunque todavia no haya levantado dnscrypt/adblock o haya alguna incidencia al respecto
SMTP_SERVER_PORT=587
SMTP_AUTH=tucorreo
SMTP_PASS="tupass"
MAIL_FROM=$SMTP_AUTH
MAIL_TO=correodestino
MAIL_SUBJECT_FWKNOPD="Nueva regla fwknopd en $(uname -n)"
MAIL_SUBJECT_WIFI="Nuevo dispositivo conectado en $(uname -n)"

#### Datos para la notificacion por Telegram ####

BOT_TG_CHAT_ID='[CHAT_ID]'
BOT_TG_TOKEN_KEY='[TOKEN_KEY]'
BOT_TG_API="https://api.telegram.org/bot$BOT_TG_TOKEN_KEY"   #  Crea bot con @BotFather para enviar info directamente a tu chat.  https://core.telegram.org/bots#6-botfather


#### Opciones internas que no se deben tocar ####

TEXT_TO_FIND="pairwise key handshake completed"
Wifi_Desconecta="AP-STA-DISCONNECTED"           # Si ponen mal la contrasena?



######################################
#############  Funciones #############
######################################

EnviaMail(){
         mailsend -smtp $SMTP_SERVER -port $SMTP_SERVER_PORT -t "$MAIL_TO" -f "$MAIL_FROM" -sub "$1" -starttls -auth -user "$SMTP_AUTH" -pass "$SMTP_PASS"  -M "$2" > /dev/null
}

EnviaBot(){
         curl -s -X POST ${BOT_TG_API}/sendMessage -d chat_id=$BOT_TG_CHAT_ID -d parse_mode=Markdown --data-urlencode text="$1" > /dev/null
}

conexion(){
        sleep 20;                                                               # Para dar tiempo a que asigne dhcp y se alimente la tabla arp
        MAC=$(echo $line | awk '{ print $10 }')                                 # Extrae la mac del nuevo emparejamiento de cliente wifi
        FECHA=$(echo $line | awk '{print $5"_"$2"_"$3"_"$4"_"$1}')              # Extraigo fecha en que se une el cliente wifi
        cat $Omite_Ficheros | grep -i $MAC                                      # Omito si esta en una lista de omisiones
        if [ $? -ne 0 ]; then                                                   # Si no esta en omisiones, he de notificar
            IP=$(cat /proc/net/arp | grep $MAC | awk '{print $1}')              # Extraigo ip de tablas arp
            IP_MAC=$(cat /proc/net/arp | grep $MAC | awk '{print $1 "  " $4}')  # Estraigo IP y MAC
            NOMBRE=$(logread | grep "DHCPACK(" | grep -i "$MAC" | awk '{print $11 }' | sed '$!d')
            echo $IP_MAC $NOMBRE $FECHA >> /tmp/autenticaciones.txt             # Guardo historico

            if [ "$Reporta_Nuevas_Conexiones_a_Wifi_eMail" == "True" ]; then
                EnviaMail "$MAIL_SUBJECT_WIFI - $NOMBRE" "$NOMBRE $IP_MAC $FECHA" > /dev/null  # Notifico por email
            fi
            if [ "$Reporta_Nuevas_Conexiones_a_Wifi_botTG" == "True" ]; then
                EnviaBot "$NOMBRE $IP_MAC $FECHA" > /dev/null                                  # Notifico telegram_bot
            fi
        fi

        if [ "$Registra_ControlHorario" == "True" ]; then
            echo "`date +%F' '%H:%M` $MAC" >> ${PathForControlHorario}/FirstWcon.$(uname -n).`date +%F`    # date +%F" "%H:%M   #%X
        fi
}


####################################
#############   Main   #############
####################################

[ -d "/etc/config/myconfig/" ] || mkdir "/etc/config/myconfig/" 

if [ "$Reporta_Nuevas_Conexiones_a_Wifi_eMail" == "True" ] || [ "$Reporta_Nuevas_Conexiones_a_Wifi_botTG" == "True" ]; then
	if [ "$Omite_Reservas_DHCP" == "True" ]; then
		cat /etc/config/dhcp | grep "option mac" | awk '{$1=$2=""; print $0}' | tr -d "'" | xargs -n 1 >> /tmp/Mac_Reservas
		Omite_Ficheros="$Omite_Ficheros /tmp/Mac_Reservas"
	fi
	for f in $Omite_Ficheros; do [ -f $f ] || touch $f; done        # Si no existe el fichero/s de omisiones, lo creo.
fi

if [ "$Registra_ControlHorario" == "True" ];then
    [ -d "$PathForControlHorario" ] || mkdir "$PathForControlHorario"
fi

logread -f | while read line; do

	# Si se abre un puerto con fwknop antes de levantar Adblock y DNSCrypt-proxy, ese correo no se recibira. Es mejor no retrasar la carga del script, ya que se corre el riesgo de que no notifique tambien conexiones wifi o aberturas de puertos aun despues de levantar DNS (Puedes poner la ip en vez de dns en el servidor smtp)

	if [ "$Reporta_Acciones_Fwknopd_eMail" == "True" ]; then
		echo "$line" | grep -q -e "Added access rule to FWKNOP_INPUT" -e "Added FORWARD rule to FWKNOP_FORWARD"
		[ $? -ne 0 ] || echo "$line" | awk '{ print "/usr/sbin/iptables -w 5 -nvL FWKNOP_INPUT | grep "$20";/usr/sbin/iptables -w 5 -t nat -nvL FWKNOP_PREROUTING | grep "$20}' | sh | awk '{print "Regla "$3"  Source:"$8" Details: "$10" "$11" "$15}' | EnviaMail "$MAIL_SUBJECT_FWKNOPD"
	fi

	if [ "$Reporta_Acciones_Fwknopd_botTG" == "True" ]; then
		echo "$line" | grep -q -e "Added access rule to FWKNOP_INPUT" -e "Added FORWARD rule to FWKNOP_FORWARD"
		[ $? -ne 0 ] || echo "$line" | awk '{ print "/usr/sbin/iptables -w 5 -nvL FWKNOP_INPUT | grep "$20";/usr/sbin/iptables -w 5 -t nat -nvL FWKNOP_PREROUTING | grep "$20}' | sh | awk '{print "Regla "$3"  Source:"$8" Details: "$10" "$11" "$15}' | EnviaBot  # "$MAIL_SUBJECT_FWKNOPD"
	fi

	if [ "$Reporta_Nuevas_Conexiones_a_Wifi_eMail" == "True" ] || [ "$Reporta_Nuevas_Conexiones_a_Wifi_botTG" == "True" ]; then
		echo $line | grep -q -e "$TEXT_TO_FIND"
   		[ $? -ne 0 ] || conexion &            # Si hay muchas conexiones wifi de golpe, se iran encadenando sleeps de la funcion conexion y podria llegar a estar ya eliminada la regla fwknopd (ej: reinicio con muchos clientes). Por eso lanzo la funcion conexion en un hilo adicional en segundo plano
	fi

    if [ "$Registra_ControlHorario" == "True" ]; then
        echo $line | grep -q -e "$Wifi_Desconecta"
        [ $? -ne 0 ] || echo "$line" | grep "$Wifi_Desconecta" | cut -d " " -f 10 | xargs -n 1 echo "`date +%F\" \"%H:%M`" | awk -v P=${PathForControlHorario} '{print "echo \""$1" "$2" "$3"\" >> "P"/LastWcon.$(uname -n)."$1 }' | sh
    fi
done
exit
