#!/bin/bash #Usage: firetext.sh [lat min.] [lat max.] [long min.] [long max.] [mobile no. 1] # # This script downloads the incident alert XML document from # emergency.vic.gov.au, checks the location of each incident, and # if it is within the area specified in latitude and longitude, # sends relevent information about the incident to the mobile # phone numbers specified (if any), as SMS messages. Also prints # new alerts to stdout. # # Version: 1.0 # Author: The Free Thinker, 2020 ( gopher://aussies.space/1/%7efreet/ ) # #TODO: #-Multiple Phone Numbers #Mobile Modem Device: TTYDEV='/dev/ttyUSB1' #Incidents XML Data URL: URL='http://data.emergency.vic.gov.au/Show?pageId=getIncidentXML' #Output to terminal: messagedisplay () { echo "--- --- --- --- --- --- --- --- --- $last_updated_dt_str $category1 , $incident_type , $category2 $incident_status $name, $incident_location Longitude: $LONG Latitude: $LAT Ref: $UTMREF Status: $origin_status Size: $incident_size Resources: $RESOURCES Incident No. $INCIDENT_NO Event Code: $event_code --- --- --- --- --- --- --- --- --- " #Bell: echo -e "\a" } #Output to SMS: #Manual terminal command: # picocom -b 9600 -f s -r /dev/ttyUSB1 messageoutput () { #SMS Commands stty -F "$TTYDEV" 9600 raw #echo "\ chat -e \ '' AT \ OK\\r \ AT+CMGF=1 \ OK\\r \ AT+CMGS=\""$PHONENO1"\" \ '> ' \ \ "$category1 , $incident_type , $category2"\\n\ "$origin_status"\\n\ "$name, $incident_location"\\n\ "Ref: $UTMREF"\\n\"^z \ OK\\r \ < "$TTYDEV" > "$TTYDEV" #" > smschat.temp #chat -t 15 -f smschat.temp -T "$PHONENO1" < "$TTYDEV" > "$TTYDEV" } #Check for incidents not yet processed newincident () { local IFS='>' if read -d '<' TAG VALUE then # echo "TAG: $TAG" # echo "VALUE: $VALUE" #The following commands use two regular expressions to extract the #field with its data, then extract only the data from that string. #The first, its command nested in the seccond, skips all data #before the tag name, then ends with the final ". #The second skips all data that isn't a number until it finds a #sequence of numbers, beginning with a number, then outputs all #sequential numbers after that. #Latter part copied from sed example here: #https://unix.stackexchange.com/questions/31476/extracting-a-regex-matched-with-sed-without-printing-the-surrounding-character/31479#31479 #Below line works on its own but not in a script for some reason... # UPDATETIME="`expr '\`expr "$TAG" : '.*\(last-updated-dt=\"[0-9]*\"\)'\`' : '.*[^0-9]\([0-9][0-9]*\).*'`" UPDATETIMETEMP=`expr "$TAG" : '.*\(last-updated-dt=\"[0-9]*\"\)'` #Variable will be empty if not on an incident tag if [ -n '$UPDATETIMETEMP' ] then UPDATETIME=`expr "$UPDATETIMETEMP" : '.*[^0-9]\([0-9][0-9]*\).*'` # echo "UPDATETIME is: $UPDATETIME" if (( UPDATETIME > OLDLATESTTIME )) && (( GETINCIDENT == 0 )) then # LONG="`expr \`expr "$TAG" : '.*\(longitude=\"[.0-9]*\"\)'\` : '.*[^0-9]\([0-9]*[.][0-9]*\).*'`" LONG=`expr "$TAG" : '.*\(longitude=\"[.0-9]*\"\)'` LONG=`expr "$LONG" : '.*[^0-9]\([0-9]*[.][0-9]*\).*'` #Remove "-" from latitude regex for northern hemisphere # LAT="`expr \`expr "$TAG" : '.*\(latitude=\"-[.0-9]*\"\)'\` : '.*[^0-9]\(-[0-9][.0-9]*\).*'`" LAT=`expr "$TAG" : '.*\(latitude=\"-[.0-9]*\"\)'` LAT=`expr "$LAT" : '.*[^0-9]\(-[0-9][.0-9]*\).*'` # RESOURCES="`expr \`expr "$TAG" : '.*\(resource-count=\"[0-9]*\"\)'\` : '.*[^0-9]\([0-9][0-9]*\).*'`" RESOURCES=`expr "$TAG" : '.*\(resource-count=\"[0-9]*\"\)'` RESOURCES=`expr "$RESOURCES" : '.*[^0-9]\([0-9][0-9]*\).*'` # INCIDENT_NO="`expr \`expr "$TAG" : '.*\(incident-no=\"[0-9]*\"\)'\` : '.*[^0-9]\([0-9][0-9]*\).*'`" INCIDENT_NO=`expr "$TAG" : '.*\(incident-no=\"[0-9]*\"\)'` INCIDENT_NO=`expr "$INCIDENT_NO" : '.*[^0-9]\([0-9][0-9]*\).*'` #Check LAT and LONG here and set GETINCIDENT accordingly #Results are all negative when within range: LATUPPER=`echo "$LAT - $LATMAX" | bc` LATLOWER=`echo "$LATMIN - $LAT" | bc` LONGUPPER=`echo "$LONG - $LONGMAX" | bc` LONGLOWER=`echo "$LONGMIN - $LONG" | bc` if [ "${LATUPPER:0:1}" != "-" ] || \ [ "${LATLOWER:0:1}" != "-" ] || \ [ "${LONGUPPER:0:1}" != "-" ] || \ [ "${LONGLOWER:0:1}" != "-" ] || \ grep -xFq "$INCIDENT_NO" oldincidents.lst then GETINCIDENT=0 else GETINCIDENT=1 #Fetch UTM/WGS84/GDA94 map ref: NCATRES="`wget -q --no-check-certificate -O - \"https://www.ngs.noaa.gov/api/ncat/llh?lat=$LAT&lon=$LONG&a=6378160.0&invf=298.25\"`" UTME=`expr "$NCATRES" : '.*"utmEasting": "\([0-9,.]*\)"' | tr -d ,` UTMN=`expr "$NCATRES" : '.*"utmNorthing": "\([0-9,.]*\)"' | tr -d ,` UTMREF="${UTME:1:3} ${UTMN:2:3}" fi # Track the latest incident read. assume they're not in order: LATESTTIME=$LATESTTIME if (( LATESTTIME < UPDATETIME )) then LATESTTIME=$UPDATETIME fi fi fi else if (( GETINCIDENT == 1 )) then echo "ERROR: Unexpected End of XML File While Reading Incident Information" return 1 else # Save timestamp of latest incident read: echo "$LATESTTIME" > "latesttime" return 10 fi fi return 0 } #Read incident info and format it in text readincident () { case $TAG in "last-updated-dt-str") last_updated_dt_str=$VALUE ;; "origin-date-time-str") origin_date_time_str=$VALUE ;; "incident-status") incident_status=$VALUE ;; "incident-type") incident_type=$VALUE ;; "event-code") event_code=$VALUE ;; "incident-location") incident_location=$VALUE ;; "origin-status") origin_status=$VALUE ;; "incident-size") incident_size=$VALUE ;; "category2") category2=$VALUE ;; "category1") category1=$VALUE ;; "name") name=$VALUE messagedisplay [ "$PHONENO1" ] && messageoutput oldincidents="`tail -n 5 oldincidents.lst`" echo -e -n "$oldincidents\n$INCIDENT_NO" > oldincidents.lst #early exit: # exit 0 GETINCIDENT=0 ;; esac return 0 } #MAIN #Check at least four command line parameters for lat/long range if [ $# -lt 4 ] then echo "Invalid parameters - Need at least four parameters for Lat/Long range. Usage: firetext.sh LAT_MIN LAT_MAX LONG_MIN LONG_MAX [MOBILE_NUMBER] Messages will be sent to MOBILE_NUMBER by SMS if number is supplied." exit 1 fi #Check that XML data has changed (can only check the size - other headers aren't useful): XMLSIZE="`wget --no-check-certificate --spider \"$URL\" 2>&1 | grep -o 'Length: [0-9]*'`" if [ -f lastsize ] && [ "`cat lastsize`" == "$XMLSIZE" ] then # echo "no change" exit 0 else echo -n "$XMLSIZE" > lastsize fi #Command-Line Parameters: LATMIN=$1 LATMAX=$2 LONGMIN=$3 LONGMAX=$4 PHONENO1=$5 GETINCIDENT=0 # Start latesttime at zero if it doesn't exist: if [ ! -f latesttime ] then echo "0" > "latesttime" fi LATESTTIME=`cat latesttime` OLDLATESTTIME=$LATESTTIME #Download the latest Incident XML file: if ! wget -q --no-check-certificate -O "incident.xml" "$URL" then echo -n "ERROR: Download of XML File Failed on: " date +"%Y-%m-%d %H:%M:%S" exit 1 fi cat incident.xml | while newincident do if (( GETINCIDENT > 0 )) then readincident fi done if (( GETINCIDENT == 0 )) then exit 0 else echo "ERROR: Terminating before output of last message." exit 1 fi