#!/bin/bash # app_rpt email star72 script for Debian by Kyle Yoksh, K0KN # November 2012. Last revised 5/13/2018 # # This script is used to create a list of nodes connected to your node, and send it to you off-air via text message or email. # # Note: W3m is required for this script to operate. # # Usage = star72 [your node#] [e] e = email output # # MAXCHARS will set a limit to the size of the email or text message based # on the number of characters in the message. Set to 30000 or so if you # are using email and do not need to limit size. # # # CHANGE THESE VARIABLES ONLY # --------------------------- # MAXCHARS="30000" SUBJECT="Connected to $1" SENDTO="TARGET EMAIL ADDRESS" SENDAS="SNEDING EMAIL ADDRESS" PRIVATE_LIST="/home/kyle/private_nodelist" if [ "$1" == "" ] ; then echo "Usage = star72 [your node#] [e]" ; exit fi # YOU SHOULD NOT NEED TO EDIT THESE VARIABLES # ------------------------------------------- SUBJECT="Star72" LOGFILE="/var/log/asterisk/connectlog" LISTURL=stats.allstarlink.org NODELIST="/dev/shm/allstar_nodelist" ALLSTARRPTEXTNODES="/var/lib/asterisk/rpt_extnodes" charcount="" TEMP="/dev/shm" FILENAME1="/dev/shm/star72.tmp1" FILENAME2="/dev/shm/star72.tmp2" # # Flush variables retrycount=0 url="" name="" COUNT="" NODENO="" echo downloadnodelist () { # Create / update local nodelist retrycount=$((retrycount + 1)) if [ $retrycount == 10 ] ; then echo $(date) "Error downloading nodelist - star72" >> $LOGFILE ; echo "Error downloading nodelist -- exiting" ; exit ; fi if ! [ -f $NODELIST ] ; then echo "No nodelist found - downloading" ; w3m -dump -cols 120 $LISTURL > "$NODELIST" ; checknodelist ; fi if [ "$(( $(date +"%s") - $(stat -c "%Y" $NODELIST) ))" -gt "3600" ] ; then echo "Nodelist over 1 hour old - downloading new" ; w3m -dump -cols 120 $LISTURL > "$NODELIST" ; checknodelist ; fi } checknodelist () { # Check nodelist for proper header HEADER=$(grep 'Click here for Graphical Status' $NODELIST) if [ "$HEADER" != "" ] ; then echo "Header check complete" > /dev/null else echo "Does not match" ; downloadnodelist fi # Check nodelist for proper footer FOOTER=$(grep 'nodes reporting' $NODELIST) if [ "$FOOTER" != "" ] ; then echo "Footer check complete" > /dev/null else echo "Does not match" ; downloadnodelist fi # Remove header if [ -f "$NODELIST" ] then awk 'FNR>5{print}' $NODELIST > "$NODELIST"2 fi # Remove footer, keyed y/n and uptime # if [ -f "$NODELIST"2 ] then sed '/^$/d' "$NODELIST"2 > "$NODELIST" sed '$d' < "$NODELIST" > "$NODELIST"2 sed '$d' < "$NODELIST"2 > "$NODELIST"2a cut -c1-94 "$NODELIST"2a > "$NODELIST"2b sed 's/....//' < "$NODELIST"2b > "$NODELIST"2a # sed 's/Map Bubble//g' < "$NODELIST"2a > "$NODELIST" rm -f "$NODELIST"2* fi # Append private nodelist to Allstar nodelist if file exists if [ -s "$PRIVATE_LIST" ] ; then grep -v '^$' "$PRIVATE_LIST" > "$PRIVATE_LIST"2 cp -f "$PRIVATE_LIST"2 "$PRIVATE_LIST" rm -f "$PRIVATE_LIST"2 echo "Private nodelist found. Adding entries from $PRIVATE_LIST to $NODELIST" cat "$PRIVATE_LIST" >> "$NODELIST" fi } emailroutine () { if [ -f $TEMP/star72aa ] ; then echo "Sending email to $SENDTO" mail -s "$SUBJECT" -a "From: $SENDAS <$SENDAS>" "$SENDTO" < $TEMP/star72aa fi if [ -f $TEMP/star72ab ] ; then sleep 10 echo "Sending email part 2 to $SENDTO" mail -s "continued" -a "From: $SENDAS <$SENDAS>" "$SENDTO" < $TEMP/star72ab fi if [ -f $TEMP/star72ac ] ; then sleep 10 echo "Sending email part 3 to $SENDTO" mail -s "continued" -a "From: $SENDAS <$SENDAS>" "$SENDTO" < $TEMP/star72ac fi if [ -f $TEMP/star72ad ] ; then sleep 10 echo "Sending email part 4 to $SENDTO" mail -s "continued" -a "From: $SENDAS <$SENDAS>" "$SENDTO" < $TEMP/star72ad fi } # Delete nodelist if zero bytes if ! [ -s $NODELIST ] ; then rm -f $NODELIST ; fi # Run Check/download nodelist routine downloadnodelist ############################# # remove temp files rm -f $FILENAME1 rm -f $FILENAME2 rm -f $TEMP/star72aa rm -f $TEMP/star72ab rm -f $TEMP/star72ac rm -f $TEMP/star72ad /usr/sbin/asterisk -rx "rpt nodes $1" > $FILENAME1 cat $FILENAME1 | grep -v "*" > $FILENAME2 sed '/^$/d' $FILENAME2 > $FILENAME1 if grep -q "" $FILENAME1 ; then rm -f $FILENAME1 touch $FILENAME1 fi rm -f $FILENAME2 # Assemble Output PARSEALLSTAR=$(cat $FILENAME1 | tr "," "\n") for x in $PARSEALLSTAR do echo "${x:1:${#x}-1}" >> "$FILENAME2" done # Count number of connected nodes TOTALCOUNT=($( wc -w $FILENAME1)) echo "Total connected nodes: $TOTALCOUNT" if [ -s "$FILENAME2" ] ; then mv -f $FILENAME2 $FILENAME1 fi # Get nodelist details for globally connected node numbers if [ -s "$FILENAME1" ] ; then while read line; do if [ "$line" -eq "$line" ] 2>/dev/null; then grep ^$line "$NODELIST" >> "$FILENAME2" || echo "" >> "$FILENAME2" else line="$line Callsign" fi done < "$FILENAME1" fi if [ -s "$FILENAME2" ] ; then mv -f $FILENAME2 $FILENAME1 fi echo "Number of nodes connected to $1 [$TOTALCOUNT]" > $FILENAME2 cat $FILENAME1 >> $FILENAME2 mv -f $FILENAME2 $FILENAME1 # count number of characters in message, and split into multiple # messages if necessary - useful if sending text messages charcount=($(wc -m $FILENAME1)) echo "charcount is $charcount" # Split into multiple messages if necessary split -b $MAXCHARS --verbose $FILENAME1 $TEMP/star72 echo if ! [ "$2" == "e" -o "$2" == "E" ] ; then echo $(date) "star72 executed on node $1 - $TOTALCOUNT nodes connected (screen output only)" >> $LOGFILE clear cat $FILENAME1 else echo $(date) "star72 executed on node $1 - $TOTALCOUNT nodes connected (email sent to $SENDTO)" >> $LOGFILE emailroutine fi # Done! echo exit 0