#!/bin/bash

# **************************************************************************
# *                                                                        *
# *  Pointtools v.0.3 by Alexey Khromov AKA zxalexis AKA 2:5030/723        *
# *                                                                        *
# **************************************************************************
# *                                                                        *
# * mkuserdb - generate Userlist files from Pointlist, Binkd Passwords     *
# *     and HPT links file                                                 *
# *                                                                        *
# **************************************************************************

NMSBASE=""
FIDOBASE=""

# Read parameters
while [ -n "$1" ]
do
        case "$1" in
                -f)     cfgfile="$2"
                        shift;;
                *)      cmdusage="1";;
        esac
        shift
done

if [[ "${cmdusage}" = "1" ]]; then
        echo -ne "Usage: \n\
mkuserdb {-f <cfgfile>}\n"
        exit -2
fi

pwdsource=${BASH_SOURCE[0]}
while [ -L "$pwdsource" ]; do
        pwddir=$( cd -P "$( dirname "$pwdsource" )" > /dev/null 2>&1 && pwd )
        pwdsource=$( readlink "$pwdsource" )
        [[ $pwdsource != /* ]] && pwdsource=$pwddir/$pwdsource
done
pwddir=$( cd -P "$( dirname "$pwdsource" )" > /dev/null 2>&1 && pwd )

if [ -f /etc/fidonms ]; then
    source /etc/fidonms
fi
if [ -z $NMSBASE ]; then
    #Try to guess
    NMSBASE=/opt/fidonms
fi
if [ -z $FIDOBASE ]; then
    FIDOBASE=/var/spool/ftn
fi

if [[ -z ${cfgfile} ]]; then
        if [[ -f "${NMSBASE}/etc/pointcfg" ]]; then
                cfgfile="${NMSBASE}/etc/pointcfg"
        elif [[ -f "/etc/pointcfg" ]]; then
                cfgfile="/etc/pointcfg"
        elif [[ -f "$pwddir/etc/pointcfg" ]]; then
                cfgfile="$pwddir/etc/pointcfg"
        else
                echo "Config file not found. Please specify one"
                exit -2
        fi
fi

echo "Applying config: ${cfgfile}"
source ${cfgfile}

# --------------------------------------------------------------------------
# Here comes a script
# --------------------------------------------------------------------------

if [ -f ${FIDOCONFIG} ];
then
    AKA=$(grep -ie ^Address ${FIDOCONFIG}| head -n1 | awk -F'[ @]' '{ print $2 }')
    echo "Generating userdb for ${AKA}"
else
    echo "No FIDOCONFIG var found..."
    break;
fi

if [ -f ${HPT_POINTS} ] && [ -f ${BINKD_PASSWD} ];
then
    echo -en "# UserDB generated on ${LISTDATE}\n" > ${USERLIST}
    NODENUM=$(echo ${AKA}| awk -F'/' '{ print $2 }')

    # todo - make index Array, go through indexes
    LNKIDX=($(grep -n 'Link ' ${HPT_POINTS} | awk -F':' '{ printf $1" " }')$(cat ${HPT_POINTS}| wc -l))
    echo "Indexes: ${LNKIDX[@]}"
    LNKCNT=${#LNKIDX[@]}
    echo "Count: ${LNKCNT}"
    
    #Declaring arrays
    declare -a ALNK_PNUM=()
    declare -a ALNK_AKA=()
    declare -a ALNK_SYSNAME=()
    declare -a ALNK_CITY=()
    declare -a ALNK_NAME=()
    declare -a ALNK_TEL=()
    declare -a ALNK_FLAGS=()
    declare -a ALNK_LGRP=()
    declare -a ALNK_AGRP=()
    declare -a ALNK_PASSWD=()
    
    
    for lidx in ${!LNKIDX[@]}; do
	if [ $(($lidx+1)) == ${LNKCNT} ];
	then
	    break
	fi
        echo "Reading element $(($lidx+1))"
        # Parsing links and passwds file
        #LNKCUT=$(cat ${HPT_POINTS} | sed -n ${LNKIDX[$lidx]},$(( ${LNKIDX[$(( $lidx + 1))]} - 1 ))p)
        LNKCUT=$(cat ${HPT_POINTS} | awk "NR==${LNKIDX[$lidx]}, NR==$(( ${LNKIDX[$(( $lidx + 1))]} - 1 )) ")
        # echo "${LNKCUT}"
	while read -r lline;
	    do
		# echo ${lline}
		LLARG1=$(echo -e ${lline} | awk '{ printf $1 }')
		LLARG2=$(echo -e ${lline} | awk '{ printf $2 }')
		# echo "ARG1 is ${LLARG1} and ARG2 is ${LLARG2}"
		
		# Storing variables
		if [[ ${LLARG1} =~ ^[Ll][Ii][Nn][Kk]$ ]];
		    then
			# echo "Link found"
			ALNK_SYSNAME+=(${LLARG2})
			TMPLNKNAME=${LLARG2}
		elif [[ ${LLARG1} =~ ^[Aa][Kk][Aa]$ ]];
		    then
			ALNK_AKA+=(${LLARG2})
			TMPAKA=${LLARG2}
			PNUM=$(echo "${TMPAKA}"| awk -F'/' '{ print $2 }' | awk -F'.' '{ print $NF }')
			# echo ${PNUM}
			ALNK_PNUM+=(${PNUM})
		elif [[ ${LLARG1} =~ ^[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]$ ]];
		    then
			PSWPSW=$(grep -P "^${TMPAKA}[\\t\\ ]" ${BINKD_PASSWD}| awk '{ print $2 }')
			if [ ${PSWPSW} == ${LLARG2} ];
			    then
				ALNK_PASSWD+=(${LLARG2})
			    else
				echo "Passwords do not match!!!"
				break
			fi
		elif [[ ${LLARG1} =~ ^[Ll][Ii][Nn][Kk][Gg][Rr][Pp]$ ]];
		    then
			ALNK_LGRP+=(${LLARG2})
		elif [[ ${LLARG1} =~ ^[Aa][Cc][Cc][Ee][Ss][Ss][Gg][Rr][Pp]$ ]];
		    then
			ALNK_AGRP+=(${LLARG2})
		fi
		
	    done <<< $(echo "${LNKCUT}")
	# Now we have AKA,PointNum,LinkGrp and AccessGrp from links file
	# and Password from passwords file.
	# Now we need (Not technical) data from PointList:
	# City, Name, Flags
	if [[ ! -f ${POINTLIST} ]]; then
	    echo "No pointlist found! Using blank for name and city and defaults for flags."
	    USE_PNT=0
	else
	    USE_PNT=1
	fi
	if [ ${USE_PNT} == 1 ]; then
	    POINTLINE=$(grep -P "^${PNUM}," ${POINTLIST})
	    echo "Pointline: ${POINTLINE}"
	    TMPSYS=$(echo "${POINTLINE}"|awk -F',' '{ print $2 }')
	    if [ ${TMPSYS} != ${TMPLNKNAME} ]; then
		echo "Warning! Sysname from links file differs from pointlist!"
	    fi
	    # Extracting pointlist data
	    ALNK_CITY+=( $(echo "${POINTLINE}"|awk -F',' '{ print $3 }') )
	    ALNK_NAME+=( "$(echo ${POINTLINE}|awk -F',' '{ print $4 }')" )
	    ALNK_TEL+=( $(echo "${POINTLINE}" |awk -F',' '{ print $5 }') )
	    # TODO: remove trailing ','if any
	    ALNK_FLAGS+=( $(echo "${POINTLINE}" | cut -d, -f6-) )
	else
	    # Adding default data
	    ALNK_CITY+=("${DefCity}")
	    ALNK_NAME+=("<Check name>")
	    ALNK_TEL+=("-unpublished-")
	    ALNK_FLAGS+=("${DefFlags}")
	fi
    done
    # echo -en "NUMS: ${#ALNK_PNUM[@]}, ${#ALNK_AKA[@]}, ${#ALNK_SYSNAME[@]}, ${#ALNK_CITY[@]}, "
    # echo -en "${#ALNK_NAME[@]}, ${#ALNK_TEL[@]}, ${#ALNK_FLAGS[@]}, ${#ALNK_LGRP[@]}, ${#ALNK_AGRP[@]}, ${#ALNK_PASSWD[@]}\n"
    # IMPORT TO ARRAYS IS DONE!
    # NOW CHECK ALL IS RIGHT and publish userdb!
    LC=${#ALNK_PNUM[@]}
    if [ ${#ALNK_AKA[@]} == ${LC} ] && [ ${#ALNK_SYSNAME[@]} == ${LC} ] && [ ${#ALNK_CITY[@]} == ${LC} ] && \
       [ ${#ALNK_NAME[@]} == ${LC} ] && [ ${#ALNK_TEL[@]} == ${LC} ] && [ ${#ALNK_FLAGS[@]} == ${LC} ] && \
       [ ${#ALNK_LGRP[@]} == ${LC} ] && [ ${#ALNK_AGRP[@]} == ${LC} ] && [ ${#ALNK_PASSWD[@]} == ${LC} ]; then
        echo "ALL GOOD!"
    else
	echo "Something wrong in code. Stopping now"
    fi
    
    echo -ne "${UDB_HEADER}" > ${USERLIST}
    for lidx in ${!LNKIDX[@]}; do
	if [ $(($lidx+1)) == ${LNKCNT} ]; then
	    break
	fi
        echo "Writing element $(($lidx+1))"
        echo "Point,${ALNK_PNUM[$lidx]},${ALNK_SYSNAME[$lidx]},${ALNK_CITY[$lidx]},${ALNK_NAME[$lidx]},\
${ALNK_TEL[$lidx]},${ALNK_FLAGS[$lidx]}|${ALNK_PASSWD[$lidx]}|${ALNK_LGRP[$lidx]}|${ALNK_AGRP[$lidx]}" >> ${USERLIST}
    done
#    while read -r line;
#    do
#	if [[ ${line} =~ ]]; # is valid fidoconfig string
#	then
#	
#	fi
#    done < ${HPT_POINTS}

fi
