#!/bin/sh

#
# Fri Jan 24 12:14:34 CET 2025
#
VERSION="0.0, Fri Jan 24 12:15:11 CET 2025"

if test -d  /usr/xpg4/bin/
then
	PATH=/usr/xpg4/bin/:$PATH
fi

FILE=dhcpd.csv

if [ `id -u` = "0" ]
then
	DIR=/var/run/dhcp
else
	DIR=dhcpd.d
fi

test -d $DIR || mkdir $DIR

DUMP=false
LOAD=false
LFILE=""

set -- `getopt Vdl:h $*`
for i in $*
do
	case $i in
	-V)
		echo "$version"
		exit 0
		shift;;
	-h)
		echo "Use: `basename $0` [-Vdl]"
		echo "-d: dump csv (${FILE}) and test"
		echo "-l file: load file and create dhcpd.conf files in $DIR"
		echo "-V: version"
		exit 0
		shift;;
	-l) LOAD=:; shift; LFILE="$1";;
	-d) DUMP=:; shift;;
	esac
done




dump()
{
update=false
update=:

if $update
then
cat \
	/etc/dhcpd.conf \
	/etc/dhcpd-giga.conf \
	/etc/dhcpd-adm.conf \
	/etc/dhcpd-L00?.conf \
	/etc/dhcpd-L1*.conf \
	/etc/dhcpd-L2*.conf |\
egrep -v -e '^[ 	]*#' |\
sed \
	-e 's/#.*$//' \
	-e 's/[ ]*;[ 	]*$//' | tee foo |\
awk '
	/^[	 ]*host[	 ][	 ]*/ {host=$2}
	/hardware ethernet/ { mac=$3 } 
	/fixed-address/ { printf("%s,%s,%s\n", $2, host, mac);}' |\
sort -t . +1n -2 +2n -3 +3n -4 +4n -5  > ${FILE}
fi
}


check()
{
ERROR=0

CFILE=$1

echo "#### Syntax errors:"

EXPRIP='(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
EXPRIP="${EXPRIP}\.${EXPRIP}\.${EXPRIP}\.${EXPRIP}"
EXPRHOST='[a-z][a-z0-9\.-]*[a-z0-9]'
EXPRMAC='[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]'
EXPRMAC="${EXPRMAC}:${EXPRMAC}"

SERROR=`tr '[A-Z]' '[a-z]' < ${CFILE} |\
egrep -v -e "^${EXPRIP},${EXPRHOST},${EXPRMAC}$"`

if [ "_$SERROR" != "_" ]
then
	echo "## ERROR"
	echo "$SERROR" 
	ERROR=1
else
	echo "## none"
fi

echo "#### Duplicated IP adresses:"

DUPS=`awk -F, '{print $1}' ${CFILE} | sort | uniq -c |\
egrep -v -e '^[ ]*1'`

if [ "_$DUPS" != "_" ]
then
	echo "## ERROR"
	echo "$DUPS"
	ERROR=1
else
	echo "## none"
fi


echo "#### Duplicated names:"

DUPS=`awk -F, '{print $2}' ${CFILE} | tr '[A-Z]' '[a-z]' | sort | uniq -c |\
egrep -v -e '^[ ]*1'`

if [ "_$DUPS" != "_" ]
then
	echo "## ERROR"
	echo "$DUPS"
	ERROR=1
else
	echo "## none"
fi

echo "#### Duplicated MAC addresses:"

DUPS=`awk -F, '{print $3}' ${CFILE} | tr '[a-z]' '[A-Z]' | sort | uniq -c |\
egrep -v -e '^[ ]*1 '`

if [ "_$DUPS" != "_" ]
then
	echo "## WARNING"
	echo "$DUPS"
else
	echo "## none"
	echo "$DUPS"
fi

if [ "$ERROR" != "0" ]
then
	echo "#### Exiting (errors)"
	exit $ERROR
fi


echo "#### Discarded:"
egrep -v -e ',lab[0-9][0-9][0-9]-[a-z0-9\.-]*,' ${FILE}

}

load()
{
LFILE=$1
mkdir $DIR 2>/dev/null
rm -f ./${DIR}/*

echo "#### Creating files:"
IFS=,
egrep -e ',lab[0-9][0-9][0-9]-[a-z0-9\.-]*,' ${LFILE} |\
while read ip host mac
do
	name=`echo $host | sed -e 's/^lab/L/' -e 's/-.*//'`
	host=`echo $host | tr '[A-Z]' '[a-z]'`
	mac=`echo $mac | tr '[a-z]' '[A-Z]'`
	(
	echo "host $host {"
	echo "    hardware ethernet   ${mac};"
	echo "    fixed-address       ${ip};"
	echo "}"
	echo
	) >> ${DIR}/dhcpd-${name}.conf
done 

	echo "#### DONE"
	echo "## Created in $DIR:"
	ls ${DIR} | sed -e 's/^/# /'
	echo "## Please, copy files to DHCP server"
}


if $DUMP
then
	dump
	check ${FILE}
fi

if $LOAD
then
	check ${LFILE}
	load $LFILE
fi
