#!/bin/bash
##################################################################################
# Formats crontab string for periodic APRS beacon and #
# replaces the original crontab entry string with this #
# new string thus changing the crontab. #
# #
# (C)2021 M.T. Konstapel https://meezenest.nl/mees #
# #
# This file is part of PE1RXF-APRS-server. #
# #
# PE1RXF-APRS-server is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# PE1RXF-APRS-server is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with PE1RXF-APRS-server If not, see <https://www.gnu.org/licenses/>. #
# #
##################################################################################
source /home/marcel/ham/aprs_utils/config.shlib; # load the config library functions
############################################################
# Help #
############################################################
Help( )
{
# Display Help
echo "Set interval of APRS beacons in crontab."
echo
echo "Syntax: set_beacon.sh [-i <interface>|-t <time>|-c <config-file>]"
echo "Options:"
echo "-i AX.25 interface (ax0 or ax1)"
echo "-t Time interval in minutes (0-60), 0 disables beacon"
echo "-c Read from config file instead of command line arguments"
echo
}
############################################################
# This function update the crontab of user marcel #
############################################################
UpdateCrontab( )
{
# All those escaped characters were a nightmare, but in the end the resulting string was perfect. But executing the string directly from this script proved to be another nightmare:
# It appears that bash inserts additional escape characters, resulting in the command not working. The solution below is not very elegant, but hey...it works!
# Let's make a bash script, execute is and remove it again.
echo "#!/bin/bash"
echo " $sed_string "
echo "#!/bin/bash" > $sed_tmp_command_file
echo " $sed_string " >> $sed_tmp_command_file
chmod u+x $sed_tmp_command_file
$sed_tmp_command_file
rm $sed_tmp_command_file
# Update crontab
/usr/bin/crontab -u marcel $crontab_intermediate_file
}
###############################################################
# Generates beacon files which are send via a crontab process #
###############################################################
ConstructBeaconFile( )
{
if [ " ${ 1 } " = = "ax0" ] ; then
ConstructBeaconFile_Destination = " $( config_get ax0_beacon_destination $ConfigFile ) "
ConstructBeaconFile_Path = " $( config_get ax0_beacon_path $ConfigFile ) "
ConstructBeaconFile_Position = " $( config_get ax0_beacon_position $ConfigFile ) "
ConstructBeaconFile_Comment = " $( config_get ax0_beacon_comment $ConfigFile ) "
ConstructBeaconFile_File = " $( config_get ax0_beacon_file $ConfigFile ) "
if [ " $ConstructBeaconFile_Path " = = "none" ] ; then
ConstructBeaconFile_Beacon = " PE1RXF-1> $ConstructBeaconFile_Destination : $ConstructBeaconFile_Position $ConstructBeaconFile_Comment "
else
ConstructBeaconFile_Beacon = " PE1RXF-1> $ConstructBeaconFile_Destination , $ConstructBeaconFile_Path : $ConstructBeaconFile_Position $ConstructBeaconFile_Comment "
fi
echo "Beacon for ax0:"
echo $ConstructBeaconFile_Beacon
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
elif [ " ${ 1 } " = = "ax1" ] ; then
ConstructBeaconFile_Destination = " $( config_get ax1_beacon_destination $ConfigFile ) "
ConstructBeaconFile_Path = " $( config_get ax1_beacon_path $ConfigFile ) "
ConstructBeaconFile_Position = " $( config_get ax1_beacon_position $ConfigFile ) "
ConstructBeaconFile_Comment = " $( config_get ax1_beacon_comment $ConfigFile ) "
ConstructBeaconFile_File = " $( config_get ax1_beacon_file $ConfigFile ) "
if [ " $ConstructBeaconFile_Path " = = "none" ] ; then
ConstructBeaconFile_Beacon = " PE1RXF-2> $ConstructBeaconFile_Destination : $ConstructBeaconFile_Position $ConstructBeaconFile_Comment "
else
ConstructBeaconFile_Beacon = " PE1RXF-2> $ConstructBeaconFile_Destination , $ConstructBeaconFile_Path : $ConstructBeaconFile_Position $ConstructBeaconFile_Comment "
fi
echo "Beacon for ax1:"
echo $ConstructBeaconFile_Beacon
if [ " $ConstructBeaconFile_Path " = = "none" ] ; then
ConstructBeaconFile_Beacon = " /usr/sbin/beacon -d \" $ConstructBeaconFile_Destination \" -s ax1 ' $ConstructBeaconFile_Position $ConstructBeaconFile_Comment ' "
else
ConstructBeaconFile_Beacon = " /usr/sbin/beacon -d \" $ConstructBeaconFile_Destination $ConstructBeaconFile_Path \" -s ax1 ' $ConstructBeaconFile_Position $ConstructBeaconFile_Comment ' "
fi
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
elif [ " ${ 1 } " = = "ax2" ] ; then
ConstructBeaconFile_Destination = " $( config_get ax2_beacon_destination $ConfigFile ) "
ConstructBeaconFile_Path = " $( config_get ax2_beacon_path $ConfigFile ) "
ConstructBeaconFile_Position = " $( config_get ax2_beacon_position $ConfigFile ) "
ConstructBeaconFile_Comment = " $( config_get ax2_beacon_comment $ConfigFile ) "
ConstructBeaconFile_File = " $( config_get ax2_beacon_file $ConfigFile ) "
if [ " $ConstructBeaconFile_Path " = = "none" ] ; then
ConstructBeaconFile_Beacon = " PE1RXF-3> $ConstructBeaconFile_Destination : $ConstructBeaconFile_Position $ConstructBeaconFile_Comment "
else
ConstructBeaconFile_Beacon = " PE1RXF-3> $ConstructBeaconFile_Destination , $ConstructBeaconFile_Path : $ConstructBeaconFile_Position $ConstructBeaconFile_Comment "
fi
echo "Beacon for ax2:"
echo $ConstructBeaconFile_Beacon
if [ " $ConstructBeaconFile_Path " = = "none" ] ; then
ConstructBeaconFile_Beacon = " /usr/sbin/beacon -d \" $ConstructBeaconFile_Destination \" -s ax2 ' $ConstructBeaconFile_Position $ConstructBeaconFile_Comment ' "
else
ConstructBeaconFile_Beacon = " /usr/sbin/beacon -d \" $ConstructBeaconFile_Destination $ConstructBeaconFile_Path \" -s ax2 ' $ConstructBeaconFile_Position $ConstructBeaconFile_Comment ' "
fi
echo $ConstructBeaconFile_Beacon > $ConstructBeaconFile_File
fi
}
############################################################
############################################################
# Main program #
############################################################
############################################################
# Set variables
Interface = "0"
TimeInterval = "-1"
crontab_time_string = "* * * * *"
crontab_delay_string = "sleep \\\$(echo | awk '{print rand()*60};') && "
crontab_command_string_ax0 = "/home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh"
crontab_command_string_ax1 = "/home/marcel/ham/aprs_utils/send_beacon_external_radio.sh"
crontab_command_string_ax2 = "/home/marcel/ham/aprs_utils/send_beacon_lora_radio.sh"
crontab_full_string = "#* * * * * /home/marcel/ham/aprs_utils/send_beacon_internal_radio.sh"
crontab_intermediate_file = "/home/marcel/ham/aprs_utils/crontab.pe1rxf"
sed_tmp_command_file = "/home/marcel/ham/aprs_utils/sed.cmd"
work_with_config_file = "0"
############################################################
# Process the input options. #
############################################################
# Get the options
while getopts i:t:c: flag; do
case " ${ flag } " in
i) # interface
Interface = ${ OPTARG } ; ;
t) # time interval beacon
TimeInterval = ${ OPTARG } ; ;
c) # work with config_file
work_with_config_file = "1"
ConfigFile = ${ OPTARG } ; ;
\? ) # Invalid option
echo "Syntax error!"
Help
exit; ;
esac
done
##############################################################
# Get Beacon Timer Interval and translate to crontab syntax #
##############################################################
# Read values from config-file
if [ " $work_with_config_file " -eq "1" ] ; then
for ax_port in ax0 ax1 ax2
do
Interface = " $ax_port "
if [ " $Interface " = = "ax0" ] ; then
TimeInterval = " $( config_get ax0_beacon_time $ConfigFile ) "
elif [ " $Interface " = = "ax1" ] ; then
TimeInterval = " $( config_get ax1_beacon_time $ConfigFile ) "
elif [ " $Interface " = = "ax2" ] ; then
TimeInterval = " $( config_get ax2_beacon_time $ConfigFile ) "
fi
# Let's generate new beacon files according to values in configuration file
ConstructBeaconFile $Interface
# Every 1 to 59 minutes
if [ " $TimeInterval " -gt 0 ] && [ " $TimeInterval " -lt 60 ] ; then
crontab_time_string = " */ $TimeInterval * * * * "
# Never
elif [ " $TimeInterval " -eq 0 ] ; then
crontab_time_string = "#* * * * *"
# Every hour
elif [ " $TimeInterval " -eq 60 ] ; then
crontab_time_string = "0 * * * *"
else
echo "No valid value. Using default."
crontab_time_string = "#* * * * *"
fi
# Select ax.25 port
if [ " $Interface " = = "ax0" ] ; then
crontab_full_string = " $crontab_time_string $crontab_delay_string $crontab_command_string_ax0 "
sed_string = " sed -i \"/send_beacon_internal_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
elif [ " $Interface " = = "ax1" ] ; then
crontab_full_string = " $crontab_time_string $crontab_delay_string $crontab_command_string_ax1 "
sed_string = " sed -i \"/send_beacon_external_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
elif [ " $Interface " = = "ax2" ] ; then
crontab_full_string = " $crontab_time_string $crontab_delay_string $crontab_command_string_ax2 "
sed_string = " sed -i \"/send_beacon_lora_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
else
echo "No valid value. Using default."
crontab_full_string = " $crontab_time_string $crontab_delay_string $crontab_command_string_ax0 "
sed_string = " sed -i \"/send_beacon_internal_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
fi
UpdateCrontab
done
printf -- " Values read from file: %s $ConfigFile \n " ;
printf -- "ax0 beacon time: %s\n" " $( config_get ax0_beacon_time $ConfigFile ) " ;
printf -- "ax1 beacon time: %s\n" " $( config_get ax1_beacon_time $ConfigFile ) " ;
printf -- "ax2 beacon time: %s\n" " $( config_get ax2_beacon_time $ConfigFile ) " ;
# Read values from command line arguments
else
# Every 1 to 59 minutes
if [ " $TimeInterval " -gt 0 ] && [ " $TimeInterval " -lt 60 ] ; then
crontab_time_string = " */ $TimeInterval * * * * "
# Never
elif [ " $TimeInterval " -eq 0 ] ; then
crontab_time_string = "#* * * * *"
# Every hour
elif [ " $TimeInterval " -eq 60 ] ; then
crontab_time_string = "0 * * * *"
else
echo "Syntax error!"
Help
exit
fi
# Select ax.25 port
if [ " $Interface " = = "ax0" ] ; then
crontab_full_string = " $crontab_time_string $crontab_command_string_ax0 "
sed_string = " sed -i \"/send_beacon_internal_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
elif [ " $Interface " = = "ax1" ] ; then
crontab_full_string = " $crontab_time_string $crontab_command_string_ax1 "
sed_string = " sed -i \"/send_beacon_external_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
elif [ " $Interface " = = "ax2" ] ; then
crontab_full_string = " $crontab_time_string $crontab_command_string_ax2 "
sed_string = " sed -i \"/send_beacon_external_radio/c\\ $crontab_full_string \" $crontab_intermediate_file "
else
echo "Syntax error!"
Help
exit
fi
UpdateCrontab
fi