Skip to content

Instantly share code, notes, and snippets.

@kevinelliott
Last active September 18, 2024 01:24
Show Gist options
  • Save kevinelliott/8bfbcc5555624082f743a7620322ee5c to your computer and use it in GitHub Desktop.
Save kevinelliott/8bfbcc5555624082f743a7620322ee5c to your computer and use it in GitHub Desktop.
Script to manage MUCCC Iridium Toolkit
#!/usr/bin/env bash
IRIDIUM_TOOLKIT_PATH="$HOME/iridium-toolkit"
SDR_CONFIG="$HOME/iridium-config/airspy.conf"
SDR_DECIMATION="4"
LOG_PATH="$HOME/iridium-logs"
ACARS="true"
ACARS_STATION_ID="XX-YYYY-IRIDIUM1" # Recommended: XX-YYYY-IRIDIUMN where XX is your initials, YYYY is your nearest medium/large airport ICAO, and N is the instance number
ACARS_ADDITIONAL_OUTPUTS="udp:47.150.14.53:1987" # Additional output destinations for ACARS messages. Example: "tcp:remotehost1:4444,udp:remotehost2:5555"
IDA="false"
IDAPP="false"
LAP="false"
LIVEMAP="true"
MSG="true"
PAGE="false"
PPM="true"
SATMAP="false"
SBD="true"
#!/bin/bash
#
# iridium.sh <start/stop>
#
# Version 1.2 by Kevin Elliott <[email protected]>
#
# Script to run the iridium-extractor, iridium-parser, and reassembler together in various ways
#
#### CONFIGURATION
# MANDATORY: Edit the config.sh for your setup
source config.sh
REASSEMBLER_EXTRA=""
REASSEMBLER_ACARS_EXTRA=""
if [ "$ACARS" = "true" ]; then
REASSEMBLER_ACARS_EXTRA="$REASSEMBLER_ACARS_EXTRA --station $ACARS_STATION_ID"
fi
#### Internal paths & logs
CONFIG_FILE="${IRIDIUM_TOOLKIT_CONFIG_FILE:=${IRIDIUM_TOOLKIT_PATH}/config.sh}"
PARSER_PATH="${IRIDIUM_TOOLKIT_PATH}/iridium-parser.py"
REASSEMBLER_PATH="${IRIDIUM_TOOLKIT_PATH}/reassembler.py"
LIVEMAP_HTML_PATH="${IRIDIUM_TOOLKIT_PATH}/html"
SATS_JSON_PATH="${LIVEMAP_HTML_PATH}"
PID_FILE_PATH="/tmp/iridium.pid"
EXTRACTOR_LOG="${LOG_PATH}/extractor.log"
PARSER_STATS_LOG="${LOG_PATH}/parser-stats.log"
MODE_ACARS_LOG="${LOG_PATH}/acars.log"
MODE_IDA_LOG="${LOG_PATH}/ida.log"
MODE_IDAPP_LOG="${LOG_PATH}/idapp.log"
MODE_LAP_LOG="${LOG_PATH}/lap.log"
MODE_PAGE_LOG="${LOG_PATH}/page.log"
MODE_MSG_LOG="${LOG_PATH}/msg.log"
MODE_SBD_LOG="${LOG_PATH}/sbd.log"
MODE_PPM_LOG="${LOG_PATH}/ppm.log"
MODE_SATMAP_LOG="${LOG_PATH}/satmap.log"
MODE_LIVEMAP_ACCESS_LOG="${LOG_PATH}/livemap-access.log"
MODE_LIVEMAP_STATS_LOG="${LOG_PATH}/livemap-stats.log"
#### INIT
cd ${IRIDIUM_TOOLKIT_PATH}
mkdir -p ${LOG_PATH}
#### MAIN
if [ ! -f $CONFIG_FILE ]; then
echo "Config file '$CONFIG_FILE' not found. Please edit the config.sh.example file and save it as config.sh."
exit 1
fi
if [ "$1" == "start" ]; then
echo "Starting iridium..."
touch ${PID_FILE_PATH}
export PYTHONUNBUFFERED=x
# Process: Extractor + Parser --> ZMQ
(sudo iridium-extractor -D ${SDR_DECIMATION} --multi-frame ${SDR_CONFIG} 2> ${EXTRACTOR_LOG} & echo $! >&3) 3>pid | ${PARSER_PATH} -o zmq 2> ${PARSER_STATS_LOG} &
echo $(<pid) >> ${PID_FILE_PATH}
echo $! >> ${PID_FILE_PATH}
if [ "$ACARS" == "true" ]; then
# Process: ZMQ --> Reassembler (ACARS) --> Log
${REASSEMBLER_PATH} -i zmq: -m acars ${REASSEMBLER_EXTRA} ${REASSEMBLER_ACARS_EXTRA} > ${MODE_ACARS_LOG} &
echo $! >> ${PID_FILE_PATH}
# Process: ZMQ --> Reassembler (ACARS) --> Remote
ACARS_ADDITIONAL_OUTPUTS_CMD=""
if [ ! -z "$ACARS_ADDITIONAL_OUTPUTS" ]; then
# Split the comma-separated list of outputs
IFS=',' read -ra ACARS_ADDITIONAL_OUTPUTS_ARRAY <<< "$ACARS_ADDITIONAL_OUTPUTS"
# Construct the command line
for i in "${ACARS_ADDITIONAL_OUTPUTS_ARRAY[@]}"; do
ACARS_ADDITIONAL_OUTPUTS_CMD="${ACARS_ADDITIONAL_OUTPUTS_CMD} -o $i"
done
fi
(${REASSEMBLER_PATH} -i zmq: -m acars -a json ${REASSEMBLER_EXTRA} ${REASSEMBLER_ACARS_EXTRA} & echo $!>&3) 3>pid | $IRIDIUM_TOOLKIT_PATH/iridium-acars-to-airframes.py
-d $ACARS_ADDITIONAL_OUTPUTS_CMD &
echo $(<pid) >> ${PID_FILE_PATH}
echo $! >> ${PID_FILE_PATH}
fi
cat ${PID_FILE_PATH}
if [ "$IDA" == "true" ]; then
# Process: ZMQ --> Reassembler (IDA) --> Log
${REASSEMBLER_PATH} -i zmq: -m ida ${REASSEMBLER_EXTRA} > ${MODE_IDA_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$IDAPP" == "true" ]; then
# Process: ZMQ --> Reassembler (IDAPP) --> Log
${REASSEMBLER_PATH} -i zmq: -m idapp ${REASSEMBLER_EXTRA} > ${MODE_IDAPP_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$LAP" == "true" ]; then
# Process: ZMQ --> Reassembler (LAP) --> Log
${REASSEMBLER_PATH} -i zmq: -m lap ${REASSEMBLER_EXTRA} > ${MODE_LAP_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$PAGE" == "true" ]; then
# Process: ZMQ --> Reassembler (Page) --> Log
${REASSEMBLER_PATH} -i zmq: -m page ${REASSEMBLER_EXTRA} > ${MODE_PAGE_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$MSG" == "true" ]; then
# Process: ZMQ --> Reassembler (MSG) --> Log
${REASSEMBLER_PATH} -i zmq: -m msg ${REASSEMBLER_EXTRA} > ${MODE_MSG_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$SBD" == "true" ]; then
# Process: ZMQ --> Reassembler (SBD) --> Log
${REASSEMBLER_PATH} -i zmq: -m sbd ${REASSEMBLER_EXTRA} > ${MODE_SBD_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$PPM" == "true" ]; then
# Process: ZMQ --> Reassembler (PPM) --> Log
${REASSEMBLER_PATH} -i zmq: -m ppm ${REASSEMBLER_EXTRA} > ${MODE_PPM_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$SATMAP" == "true" ]; then
# Process: ZMQ --> Reassembler (SatMap) --> Log
${REASSEMBLER_PATH} -i zmq: -m satmap ${REASSEMBLER_EXTRA} > ${MODE_SATMAP_LOG} &
echo $! >> ${PID_FILE_PATH}
fi
if [ "$LIVEMAP" == "true" ]; then
# Process: ZMQ --> Reassembler (LiveMap)
${REASSEMBLER_PATH} -i zmq: -m live-map -o ${SATS_JSON_PATH}/sats.json --stats zmq: 2> ${MODE_LIVEMAP_STATS_LOG} &
echo $! >> ${PID_FILE_PATH}
echo "Live map is running at http://$HOSTNAME:8888/"
python3 -m http.server --directory ${LIVEMAP_HTML_PATH} 8888 2> ${MODE_LIVEMAP_ACCESS_LOG} > ${MODE_LIVEMAP_ACCESS_LOG} &
echo $! >> ${PID_FILE_PATH}
if [ "$LIVEMAP_TO_TBG" == "true" ]; then
# Process: ZMQ --> Reassembler (LiveMap) --> thebaldgeek
# Process: Watch for changes to sats.json and send to thebaldgeek
$HOME/.local/bin/when-changed $SATS_JSON_PATH/sats.json cat $SATS_JSON_PATH/sats.json | $HOME/thebaldgeek-send-sats.py > /dev/null &
echo $! >> ${PID_FILE_PATH}
fi
fi
elif [ "$1" == "stop" ]; then
echo "Stopping iridium..."
if [ -f "$PID_FILE_PATH" ]; then
(cat ${PID_FILE_PATH} | sudo xargs kill) 2> /dev/null
rm -f ${PID_FILE_PATH}
fi
else
echo "usage: $0 <start/stop>"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment