#!/bin/bash ################################################################################## # Background process started by the initializing script start_aprs_server.sh # # # # It processes all incomming traffic and filters out heard stations. # # # # (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 . # # # ################################################################################## # The script aprs_utils.sh starts a filters means of tail | grep on the log file of aprx. # The output of this command goes to this script via stdin. This script reads this line by line. # Directory where APRS data files are stored APRS_DATA_DIR=/home/marcel/ham/aprs_utils/aprs_log/ APRS_STATIONS_HEARD_DIRECT=aprs_stations_heard_direct.log APRS_STATIONS_HEARD_DIGIPEATED=aprs_stations_heard_digipeated.log # If files do not exist, create them if [ ! -f "$APRS_DATA_DIR$APRS_STATIONS_HEARD_DIRECT" ]; then touch $APRS_DATA_DIR$APRS_STATIONS_HEARD_DIRECT fi if [ ! -f "$APRS_DATA_DIR$APRS_STATIONS_HEARD_DIGIPEATED" ]; then touch $APRS_DATA_DIR$APRS_STATIONS_HEARD_DIGIPEATED fi # Maybe there is an old temporary file still pressent: remove it for ACTIVE_FILE in $APRS_STATIONS_HEARD_DIRECT $APRS_STATIONS_HEARD_DIGIPEATED do rm $APRS_DATA_DIR$ACTIVE_FILE".tmp" done # Get current date YYYY-MM-DD #CURRENT_DATE=$(date +"%Y-%m-%d") CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S") LAST_EPOCH_DATE="$(date -d"$CURRENT_DATE_TIME" +%s)" #Read file line by line and send acknowledge if needed while read LINE do # Start filter for received messages to PE1RXF (all sufixes) # Messages addressed to PE1RXF are stored in file /home/marcel/ham/aprs_utils/aprs_received_messages.log MESSAGE_FOR_PE1RXF="$(grep "::PE1RXF"<<<$LINE)" if [[ $MESSAGE_FOR_PE1RXF ]]; then #echo "Message from PE1RXF" /home/marcel/ham/aprs_utils/process_aprs_messages.sh <<<$MESSAGE_FOR_PE1RXF fi # Get current date YYYY-MM-DD (do this every time, because a day may already have passed) CURRENT_DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S") CURRENT_DATE=$(date +"%Y-%m-%d") # figure out who sent the message # Check channel 1 (internal radio) #CALL="$(grep -o -P "(?<=PE1RXF-1 R \*).+?\>"<<<$LINE)" CALL="$(grep -oP "(?<=PE1RXF-1 R ).+?\>"<<<$LINE)" PORT="ax0" # If call is empty, frame not from channel 1, maybe from channel 2? if [ -z $CALL ]; then #CALL="$(grep -o -P "(?<=PE1RXF-2 R \*).+?\>"<<<$LINE)" CALL="$(grep -oP "(?<=PE1RXF-2 R ).+?\>"<<<$LINE)" PORT="ax1" fi # If call is still empty, frame not from channel 1 or 2, maybe from channel 3? if [ -z $CALL ]; then #CALL="$(grep -o -P "(?<=PE1RXF-3 R \*).+?\>"<<<$LINE)" CALL="$(grep -oP "(?<=PE1RXF-3 R ).+?\>"<<<$LINE)" PORT="ax2" fi # Lets do something with the frame from channel 1, 2 or 3 if [[ $CALL ]]; then # Remove last character from string CALL=${CALL::-1} # Get full path of message if [ $PORT == "ax0" ]; then #FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 R \*).+?:'<<<$LINE)" FULL_PATH="$(grep -oP "(?<=PE1RXF-1 R ).+?:"<<<$LINE)" elif [ $PORT == "ax1" ]; then #FULL_PATH="$(grep -o -P '(?<=PE1RXF-1 R \*).+?:'<<<$LINE)" FULL_PATH="$(grep -oP "(?<=PE1RXF-2 R ).+?:"<<<$LINE)" else #FULL_PATH="$(grep -o -P '(?<=PE1RXF-3 R \*).+?:'<<<$LINE)" FULL_PATH="$(grep -oP "(?<=PE1RXF-3 R ).+?:"<<<$LINE)" fi FULL_PATH="$(grep -o -P '(?<=\>).*'<<<$FULL_PATH)" # Remove last character from string FULL_PATH=${FULL_PATH::-1} # Messages direct from sender do not contain a '*' in the path DIRECT="$(grep '*' <<<$FULL_PATH)" if [ -z $DIRECT ]; then DIRECT="true" else unset DIRECT fi # First call in path is destination DESTINATION="$(awk -F "," '{ print $1} ' <<<$FULL_PATH)" #echo "Port: " $PORT #echo "Call:" $CALL #echo "Path:" $FULL_PATH #echo "Destination: "$DESTINATION # Select correct log file to use: direct or digipeated if [ $DIRECT ]; then ACTIVE_FILE=$APRS_STATIONS_HEARD_DIRECT else ACTIVE_FILE=$APRS_STATIONS_HEARD_DIGIPEATED fi # get line number where call occurs (will return NULL if call is never heard) LINE_NUMBER="$(grep -n $PORT","$CALL "$APRS_DATA_DIR$ACTIVE_FILE" | cut -d : -f 1)" #LINE_NUMBER=2 # If call already heard: replace line if [[ $LINE_NUMBER ]]; then # replace found line with new date and time #SED_CMD="'$LINE_NUMBER c\\""$CURRENT_DATE_TIME"",""$CALL"","$DESTINATION"' ""$APRS_DATA_DIR""$ACTIVE_FILE" #echo $SED_CMD RESULT="$(sed -i "$LINE_NUMBER c\\$CURRENT_DATE_TIME,$PORT,$CALL,$DESTINATION" $APRS_DATA_DIR$ACTIVE_FILE )" # If call not heard before: add to file else echo "$CURRENT_DATE_TIME"",""$PORT"",""$CALL"",""$DESTINATION" >> "$APRS_DATA_DIR""$ACTIVE_FILE" fi fi # Do maintenance on all log files (every 10 minutes) # Remove all heard calls older than 24 hours EPOCH_DATE="$(date -d"$CURRENT_DATE_TIME" +%s)" EPOCH_COUNTER=$((EPOCH_DATE-LAST_EPOCH_DATE)) if [ "$EPOCH_COUNTER" -gt "600" ]; then LAST_EPOCH_DATE="$EPOCH_DATE" for ACTIVE_FILE in $APRS_STATIONS_HEARD_DIRECT $APRS_STATIONS_HEARD_DIGIPEATED do touch $APRS_DATA_DIR$ACTIVE_FILE".tmp" LINE_NR=1 while read FILE_LINE; do # reading each line # echo "Line No. $LINE_NR : $FILE_LINE" LINE_DATE="$(awk -F "," '{ print $1} ' <<<$FILE_LINE)" EPOCH_LINE_DATE="$(date -d"$LINE_DATE" +%s)" # echo $EPOCH_LINE_DATE ELAPSED_TIME=$((EPOCH_DATE-EPOCH_LINE_DATE)) # echo $ELAPSED_TIME # Entry older than 24 hours? Remove entry if [ "$ELAPSED_TIME" -lt "86400" ]; then #RESULT="$(sed -e "$LINE_NR d" $APRS_DATA_DIR$ACTIVE_FILE >> $APRS_DATA_DIR$ACTIVE_FILE".tmp")" echo $FILE_LINE >> $APRS_DATA_DIR$ACTIVE_FILE".tmp" # echo "OUD" fi LINE_NR=$((LINE_NR+1)) done < $APRS_DATA_DIR$ACTIVE_FILE cp $APRS_DATA_DIR$ACTIVE_FILE".tmp" $APRS_DATA_DIR$ACTIVE_FILE rm $APRS_DATA_DIR$ACTIVE_FILE".tmp" done fi # END: remove all heard calls older than 24 hours done < /dev/stdin