#!/bin/bash . /home/eloyd/NWC2026-AstropotaPOD/AstropotaUtils.sh # Default states, minimums and maximums, etc mqtt_host="192.168.0.6" debug="" min="" max="" warn="" crit="" exitCode="0" statusText="OK" # Definitions for where the AstropotaPOD is located (using Nagios Global Headquarters) LAT="44.973N" LON="93.155W" TARGET_TZ="EDT" sunwait="/home/eloyd/NWC2026-AstropotaPOD/sunwait" do_debug() { [ -z "$debug" ] && return echo "DEBUG: $*" >&2 } do_help() { echo "Usage: $0 -w -c -m -M [-d] (kp | flux | sun | puck | NINA | weather | ppba )" exit } while getopts "w:c:m:M:hd" opt; do case "$opt" in w) warn="$OPTARG";; c) crit="$OPTARG";; m) min="$OPTARG";; M) max="$OPTARG";; h) do_help;; d) debug="true";; esac done shift $((OPTIND - 1)) command="$@" [ "$warn" = "-c" -o "$warn" = "ignored" ] && warn="" [ "$crit" = "ignored" ] && crit="" [ "$min" = "-M" -o "$min" = "ignored" ] && min="" [ "$max" = "ignored" ] && max="" do_debug "We'll be looking for: $command [-w $warn] [-c $crit] [-m $min] [-M $max]" get_weather() { do_debug "In get_weather" do_debug "mosquitto_sub -W 5 -h $mqtt_host -t AstropotaPOD/weather/$1 -C 1" mosquitto_sub -W 5 -h $mqtt_host -t AstropotaPOD/weather/$1 -C 1 } convert_to_time_t() { theTime="$1" whatDay="${2:-today}" theTZ="${3:-EDT}" do_debug "convert_to_time_t: theTime=$theTime, whatDay=$whatDay" NOW=$(date +%s) # Now in time_t theDate=$(date -d "$whatDay" +"%d-%b-%Y") do_debug "theDate=$theDate" nextEvent=$(date -d "$theDate $theTime ${theTZ}" +%s) do_debug "nextEvent=$nextEvent" echo "$nextEvent" } # Sunwait will get today's rise (rise) today's set (set) or tomorrow's rise (tomorrow) get_sunrise() { do_debug "In get_sunrise" NOW=$(date +%s) do_debug "NOW=$NOW" dawnTime=$($sunwait list 1 nautical rise $LAT $LON | tail -1) nextDawn=$(convert_to_time_t $dawnTime) # If it's 2am, then NOW is less than DAWN, we don't need to do anything. # If it's 2pm, then NOW is greater than DAWN, so we need to get tomorrow's dawn. if [ "$NOW" -gt "$nextDawn" ]; then do_debug "Need to look at tomorrow's dawn" dawnTime=$($sunwait list 2 nautical rise $LAT $LON | tail -1) nextDawn=$(convert_to_time_t $dawnTime tomorrow) do_debug "Tomorrow's dawn is nextDawn=$nextDawn" else do_debug "Dawn is still in the future for today, so the next dawn is today's dawn: $nextDawn" fi do_debug "dawnTime=$dawnTime, nextDawn=$nextDawn" duskTime=$($sunwait list nautical set $LAT $LON) nextDusk=$(date -d "${dateToday} ${duskTime} ${TARGET_TZ}" +%s) do_debug "duskTime=$duskTime, nextDusk=$nextDusk" echo "nextDusk=$nextDusk, nextDawn=$nextDawn" } get_mqtt() { do_debug "In get_mqtt" do_debug "mosquitto_sub -W 5 -h $mqtt_host -t \"$1\" -C 1" mosquitto_sub -W 5 -h $mqtt_host -t "$1" -C 1 } get_puck() { do_debug "In get_puck" do_debug "mosquitto_sub -W 5 -h $mqtt_host -t AstropotaPOD/sensor/AstropotaPOD-e9af/$1 -C 1" mosquitto_sub -W 5 -h $mqtt_host -t AstropotaPOD/sensor/AstropotaPOD-e9af/$1 -C 1 } get_ppba() { do_debug "In get_ppba" do_debug "mosquitto_sub -W 5 -h $mqtt_host -t PPBA/status/$1 -C 1" mosquitto_sub -W 5 -h $mqtt_host -t PPBA/status/$1 -C 1 } get_NINA() { do_debug "In get_NINA" do_debug "mosquitto_sub -W 5 -h $mqtt_host -t Astro/NINA/$1 -C 1" mosquitto_sub -W 5 -h $mqtt_host -t Astro/NINA/$1 -C 1 } get_suntime() { do_debug "In get_suntime" ${sunwait} poll nautical $LAT $LON >/dev/null sunState=$? do_debug "sunState=$sunState" exitCode=0 statusText="OK" case "$sunState" in 2) exitCode=1; statusText="WARNING - Sky is too bright for imaging.";; 3) exitCode=0; statusText="OK - Sky is dark. Safe to image deep-sky targets.";; *) exitCode=3; statusText="UNKNOWN - invalid code returned from sunwait command";; esac sunRise=$(get_sunrise) echo "${statusText} | IsDark=$exitCode, $sunRise;;;;" exit $exitCode } # main value="" do_debug "command is $command" case "$command" in f*|F*) command="10MeV-Flux"; value=$(curl -s "https://services.swpc.noaa.gov/json/goes/primary/integral-protons-7-day.json" | jq '. | map(select(.energy == ">=10 MeV")) | last | .flux');; k*|K*) command="Kp-Index"; value=$(curl -s https://services.swpc.noaa.gov/products/noaa-planetary-k-index.json | jq '[last][].Kp');; n*|N*) command="$2"; value=$(get_NINA $2);; s*|S*) command="Suntime"; get_suntime;; t*|T*) command="SunRiseSunSet"; value=$(get_sunrise);; w*|W*) command="$2"; value=$(get_weather $2);; mqtt*) command="$2"; value=$(get_mqtt $2);; ppba*) command="$2"; value=$(get_ppba $2);; puck*) command="$2"; value=$(get_puck $2);; *) echo "unknown command was $command";; esac # --- FLOATING POINT FORMATTING --- # If value is not empty/unknown, check its formatting if [ "$value" != "?" ]; then # 1. First, check if it contains RA/Dec formatting symbols (: or °) # If it does, bypass formatting completely to preserve the raw coordinate string if [[ "$value" == *":"* ]] || [[ "$value" == *"°"* ]]; then value="$value" # 2. Otherwise, check if it's a strict decimal number and pad/round to 4 spaces elif [[ "$value" =~ ^-?[0-9]+\.[0-9]+$ ]]; then value=$(printf "%.4f" "$value") fi fi # CRITICAL check must always run first to ensure it takes precedence statusText=$(check_threshold "$value" "$warn" "$crit") exitCode=$? echo "$command $statusText: $value|$command=$value;$warn;$crit;$min;$max" exit $exitCode # --- NAGIOS OUTPUT STAGE --- # Because check_threshold already figured out the severity, we just match the exit code case $EXIT_CODE in 0) echo "OK - Value is $value | $command=$value;$warn;$crit;$min;$max" exit 0 ;; 1) echo "WARNING - Value $value is outside of warning range ($warn) | $command=$value;$warn;$crit;$min;$max" exit 1 ;; 2) echo "CRITICAL - Value $value is outside of critical range ($crit) | $command=$value;$warn;$crit;$min;$max" exit 2 ;; *) echo "UNKNOWN - Received unexpected response from check engine | $command=$value;$warn;$crit;$min;$max" exit 3 ;; esac