#!/bin/sh

#  Скрипт для обработки поступающей от FRN-System-Manager почты с паролями для FRN сервера или клиента
#  The script receives the email with passwords for FRN server or client from FRN-System-Manager(s) 

# Первый параметр - адрес электронной почты на который поступает это сообщение
# The first parameter is the email address this message arrives at 

xemail="$1"

wdir="/FRNs"
ldir="/FRNs"
ddir="/FRNs"

tmpf="${wdir}/mail_tmp.$$.tmp"
trap 'rm -f ${tmpf}' EXIT

# поменяем umask, унаследованный от fetchmail, чтобы конфигурационные и другие файлы получили нужные права (644)
# change umask inherited from fetchmail to make correct rights (644) for configuration and other files
umask 022


# запоминаем входящее сообщение в файле
# remember incoming message in file
cat > ${tmpf}

# имя отдельного файла журнала для этого е-адреса
# name of specific log for the email
logf="${ldir}/fetchmail.${xemail}.log"
echo "" >> ${logf}
date >> ${logf}

# пытаемся определить конкретный FRN System Manager, отправивший сообщение
# try to detect exact FRN System Manager sent the message
llast=`grep -n "You can connect your FRN Client to the FreeRadioNetwork with the following password:" < ${tmpf} | awk -F: '{ print $1}' | tail -n 1`
if [ -n "$llast" ] ; then
  managerhost="sysman.freeradionetwork.eu"
else
  #
  llast=`grep -n "You can connect your FRN Client or FRN Server to the FreeRadioNetwork with the following password:" < ${tmpf} | awk -F: '{ print $1}' | tail -n 1`
  if [ -n "${llast}" ] ; then
    managerhost="sysman.freeradionetwork.de"
  else
    echo "Not detected FRN Sysman response" >> ${logf}
    cat ${tmpf} >> ${logf}
    exit 0
  fi
fi
echo "Key phrase line number: ${llast}" >> ${logf}
echo "FRN Sysman: ${managerhost}" >> ${logf}


# удостоверимся, что почта отправлена именно на тот адрес, с которого ее вычитал fetchmail
# check if the recepient is the same fetchmail fetched for
x=$(grep -i ${xemail}  ${tmpf})
if [ -z "${x}" ] ; then
    echo "Not detected Email for: ${xemail}" >> ${logf}
    cat ${tmpf} >> ${logf}
    exit 0
fi
lemail=$xemail
echo "E-Mail: ${lemail}" >> ${logf}

# файл задания на получение нового пароля от FRN-System-Manager - создается "invalid password" скриптом сервера или клиента
# job file to receive new password from FRN-System-Manager - crated by "invalid password" script of server or client
jobfile="${ddir}/JOB_${lemail}_${managerhost}.dat"

# проверим наличие файла задания, как признак действительного ожидания нового пароля
# check if job file exists as flag of real waiting of new password
if [ ! -f ${jobfile} ] ; then
    echo "Job file not found: ${jobfile}" >> ${logf}
    cat ${tmpf} >> ${logf}
    exit 0
fi

# проверим содержимое файла задания - в первой строке время [epoch] UNIX создания задания
# check job file contain - at 1st line UNIX epoch time of creating of the job
epoch=$(cat $jobfile)
if [ -z "${epoch}" ] ; then
    echo "Job file is empty: ${jobfile}" >> ${logf}
    cat ${tmpf} >> ${logf}
    exit 0
fi


# рассчитаем местоположение пароля в сохраненном сообщении
# calculate position of the password in the saved message
ltotal=`cat ${tmpf} | wc -l | sed 's/ //g'`
echo "Total lines: ${ltotal}" >> ${logf}
ltail=`expr $ltotal - $llast`
echo "Tail lines: ${ltail}" >> ${logf}

# извлечем новый пароль из сообщения
# extract the new password from the message
lpass=`tail -n ${ltail} ${tmpf} | head -n 1`
if [ -z "${lpass}" ] ; then
    echo "ERROR: password is not found" >> ${logf}
    cat ${tmpf} >> ${logf}
    exit 0
fi
echo "New password: ${lpass}" >> ${logf}



# применить новый пароль в конфигурационный файл AlterFRN-сервера и в запущенный демон AlterFRN-сервера без его перезагрузки
# apply the new password into AlterFRN-server config file and into the running daemon of AlterFRN-server without its restart
echo "Setting the new password ${lpass} for the manager ${managerhost}" >> ${logf}
sudo ${wdir}/FRNServerConsole setmanpassaddr ${managerhost} ${lpass} >> ${logf}
sudo ${wdir}/FRNServerConsole dsetmanpassaddr ${managerhost} ${lpass} >> ${logf}


# удаляем файл успешно выполненного задания
# remove successfully executed job file
rm -f ${jobfile}

# имя конфигурационного файла AlterFRN-клиента
# AlterFRN-client config file name
ccfg="${wdir}/CLI_${lemail}_${managerhost}.cfg"
if [ -f ${ccfg} ] ; then

    # имя PID-файла для этого экземпляра AlterFRN-клиента
    # name of the PID-file for the instance of AlterFRN-client
    pidf=$( ${wdir}/FRNClientConsole pidfilename ${ccfg})

    # применить новый пароль в конфигурационный файл AlterFRN-клиента
    # apply the new password into AlterFRN-client config file
    echo "Setting the new password for the client with config file: ${ccfg}" >> ${logf}
    sudo ${wdir}/FRNClientConsole setauthpass ${lpass} ${ccfg}


    if [ -f ${pidf} ] ; then

	# PID-файл существует - AlterFRN-клиент запущен
	# the PID-file exists - the AlterFRN-client is running

	# остановим AlterFRN-клиент
	# stop the AlterFRN-client
	echo "Stopping the client" >> ${logf}
	sudo ${wdir}/FRNClientConsole stop ${ccfg}
        sleep 1

	# запросим новый динамический пароль для AlterFRN-клиента, используя свежеполученный статический пароль
	# request new dynamic password for AlterFRN-client using just received static password
	echo "Requesting new dynamic password with new static password" >> ${logf}
	sudo ${wdir}/FRNClientConsole dynpass ${ccfg}

	echo "Staring the client" >> ${logf}
	sudo nice --adjustment=-20 ${wdir}/FRNClientConsole daemon ${ccfg}
    else

	# PID-файл не существует -- AlterFRN-клиент не запущен, например, используется только для получения пароля для AlterFRN-сервера
	# PID-file does not exist -- AlterFRN-client is not running, for example, it is used to request new password for AlterFRN-сервера

	echo "Requesting dynamic password with new static password" >> ${logf}
	sudo ${wdir}/FRNClientConsole dynpass ${ccfg}

    fi


else
    echo "Client config nof found: ${ccfg}" >> ${logf}
fi
