Initial load

This commit is contained in:
Eric Loyd
2026-09-06 12:08:05 -04:00
commit 3c8d0674ef
25 changed files with 1763 additions and 0 deletions
Executable
+188
View File
@@ -0,0 +1,188 @@
#!/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 <warn> -c <crit> -m <min> -M <max> [-d] (kp | flux | sun | puck <field> | NINA <topic> | weather <field> | ppba <field>)"
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