1
0
Fork 0
mirror of https://github.com/sdr-enthusiasts/docker-adsb-ultrafeeder.git synced 2024-11-22 13:50:14 +00:00

intermediate commit

This commit is contained in:
kx1t 2023-04-18 20:36:45 -04:00
parent 9e20d48d76
commit 19a2b4d0db
5 changed files with 193 additions and 23 deletions

View file

@ -153,7 +153,7 @@ The following parameters must be set (mandatory) for the container to function:
| `S6_SERVICES_GRACETIME` | Optional, set to 30000 when saving traces / globe_history | | `3000` | | `S6_SERVICES_GRACETIME` | Optional, set to 30000 when saving traces / globe_history | | `3000` |
| `LOGLEVEL` | `verbose` (all messages), `error` (errors only), `none` (minimal) | | `verbose` | | `LOGLEVEL` | `verbose` (all messages), `error` (errors only), `none` (minimal) | | `verbose` |
`READSB_EXTRA_ARGS` just passes arguments to the commandline, you can check this file for more options for wiedehofp's readsb fork: <https://github.com/wiedehopf/readsb/blob/dev/help.h> `READSB_EXTRA_ARGS` just passes arguments to the commandline, you can check this file for more options for wiedehopf's readsb fork: <https://github.com/wiedehopf/readsb/blob/dev/help.h>
### Getting ADSB data to the Ultrafeeder ### Getting ADSB data to the Ultrafeeder
@ -218,6 +218,38 @@ docker exec -it ultrafeeder /usr/local/bin/autogain1090 reset
In addition to (or instead of) connecting to a SDR or hardware device to get ADSB data, the container also supports ingesting data from a TCP port. Here are some parameters that you need to configure if you want to make this happen: In addition to (or instead of) connecting to a SDR or hardware device to get ADSB data, the container also supports ingesting data from a TCP port. Here are some parameters that you need to configure if you want to make this happen:
##### All-in-One Configuration using `ULTRAFEEDER_CONFIG`
`ULTRAFEEDER_CONFIG` is a new parameter that can be used instead of separately defining `READSB_NET_CONNECTOR`, `MLAT_NET_CONNECTOR`, `MLATHUB_NET_CONNECTOR`/`MLATHUB_CONFIG`. These legacy parameters will still work; however, we wanted to provide a single parameter that enables configuration of incoming and outgoing ADSB data, MLAT-client data, and MLATHUB data.
Note that `ULTRAFEEDER_CONFIG` and `ULTRAFEEDER_NET_CONNECTOR` can be used interchangeably; in this documentation, we'll use `ULTRAFEEDER_CONFIG` as an example.
# Format:
# ULTRAFEEDER_CONFIG=adsb,host,port,protocol[,uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX][,extra-arguments]
# ULTRAFEEDER_CONFIG=mlat,host,port[,return_port][,uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX][,extra-arguments]
# ULTRAFEEDER_CONFIG=mlathub,host,port,protocol[,uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX][,extra-arguments]
#
# The ULTRAFEEDER_CONFIG parameter can have multiple config strings, separated by a `;`
# Please note that the config strings cannot containe `;` or `,` -- undefined things may happen if these characters are present.
#
# In the above configuration strings:
# `host` is an IP address. Specify an IP/hostname/containername for incoming or outgoing connections.
# `port` is a TCP port number
# `protocol` can be one of the following:
# `beast_reduce_out`: Beast-format output with lower data throughput (saves bandwidth and CPU)
# `beast_reduce_plus_out`: Beast-format output with extra data (UUID). This is the preferred format when feeding the "new" aggregator services
# `beast_out`: Beast-format output
# `beast_in`: Beast-format input
# `raw_out`: Raw output
# `raw_in`: Raw input
# `sbs_out`: SBS-format output
# `vrs_out`: SBS-format output
# `uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` is an optional parameter that sets the UUID for this specific instance.
# It will override the global `UUID` parameter. This is only needed when you want to send different UUIDs to different aggregators.
# `extra-arguments` can be any additional command line argument you want to pass to readsb, mlathub, or mlat-client
# Example: `--net-only`. Please make sure to only once pass in an extra argument for each of the adsb|mlat|mlathub service.
##### Networking parameters ##### Networking parameters
| Environment Variable | Purpose | Default | | Environment Variable | Purpose | Default |

View file

@ -1,8 +1,6 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash disable=SC1091,SC2015,SC2016 # shellcheck shell=bash disable=SC1091,SC2015,SC2016
source /scripts/common
#--------------------------------------------------------------------------------------------- #---------------------------------------------------------------------------------------------
# Copyright (C) 2023, Ramon F. Kolb (kx1t) # Copyright (C) 2023, Ramon F. Kolb (kx1t)
# #
@ -22,6 +20,9 @@ source /scripts/common
APPNAME="mlat-client" APPNAME="mlat-client"
echo "[$(date)][${APPNAME}] Started as an s6 service" echo "[$(date)][${APPNAME}] Started as an s6 service"
source /scripts/common
source /scripts/interpret_ultrafeeder_config
MLAT_CMD="/usr/bin/mlat-client" MLAT_CMD="/usr/bin/mlat-client"
RESTARTTIMER=15 RESTARTTIMER=15
@ -61,7 +62,10 @@ fi
# anything else will be appended as extra parameter(s) to the mlat-client command line # anything else will be appended as extra parameter(s) to the mlat-client command line
# parse MLAT_CONFIG string into mlat_configs array # parse MLAT_CONFIG string into mlat_configs array
readarray -td ";" mlat_configs < <(printf '%s' "${MLAT_CONFIG// /}") # Strip any extraneous spaces:
MLAT_CONFIG="${MLAT_CONFIG#"${MLAT_CONFIG%%[![:space:]]*}"}" # strip leading space
MLAT_CONFIG="${MLAT_CONFIG//; /;}"
readarray -td ";" mlat_configs < <(printf '%s' "${MLAT_CONFIG}")
# Now loop through the MLAT_CONFIG items and start up an Mlat_client for each of them: # Now loop through the MLAT_CONFIG items and start up an Mlat_client for each of them:
for instance in "${mlat_configs[@]}" for instance in "${mlat_configs[@]}"

View file

@ -1,15 +1,17 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash disable=SC1091,SC2016 # shellcheck shell=bash disable=SC1091,SC2015,SC2016
APPNAME="mlathub"
source /scripts/common source /scripts/common
source /scripts/interpret_ultrafeeder_config
if [[ -z "${MLAT_CONFIG}" ]] && [[ -z "$MLATHUB_NET_CONNECTOR" ]]; then if [[ -z "${MLAT_CONFIG}" ]] && [[ -z "$MLATHUB_NET_CONNECTOR" ]]; then
echo "[$(date)][mlathub] No MLAT servers have been defined in MLAT_CONFIG and no external sources have been defined in MLATHUB_NET_CONNECTOR - no need to start MLATHUB" echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] No MLAT servers have been defined in MLAT_CONFIG and no external sources have been defined in MLATHUB_NET_CONNECTOR - no need to start MLATHUB"
sleep infinity sleep infinity
fi fi
if chk_enabled "${MLATHUB_DISABLED}"; then if chk_enabled "${MLATHUB_DISABLED}"; then
echo "[$(date)][mlathub] MLATHUB is disabled." echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] MLATHUB is disabled."
sleep infinity sleep infinity
fi fi
@ -56,25 +58,25 @@ done
if (( mlat_result_sources == 0 )) if (( mlat_result_sources == 0 ))
then then
echo "[$(date)][mlathub] No MLAT servers have been defined in MLAT_CONFIG - no need to start MLATHUB" echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] No MLAT servers have been defined in MLAT_CONFIG - no need to start MLATHUB"
sleep infinity sleep infinity
fi fi
# removed as it will cause looping:
# handle MLATHUB_ENABLE_ADSB_INGEST (if set, connect to readsb as input)
# if [[ -n "$MLATHUB_ENABLE_ADSB_INGEST" ]]; then
# MLATHUB_CMD+=("--net-connector=localhost,30006,beast_in")
# fi
# Add any additional net_connectors: # Add any additional net_connectors:
if [[ -n "$MLATHUB_NET_CONNECTOR" ]]; then if [[ -n "$MLATHUB_NET_CONNECTOR" ]]; then
# Strip any extraneous spaces:
MLATHUB_NET_CONNECTOR="${MLATHUB_NET_CONNECTOR#"${MLATHUB_NET_CONNECTOR%%[![:space:]]*}"}" # strip leading spaces
MLATHUB_NET_CONNECTOR="${MLATHUB_NET_CONNECTOR//; /;}" # strip space after semicolon
IFS=';' read -r -a MLATHUB_NET_CONNECTOR_ARRAY <<< "$MLATHUB_NET_CONNECTOR" IFS=';' read -r -a MLATHUB_NET_CONNECTOR_ARRAY <<< "$MLATHUB_NET_CONNECTOR"
for NET_CONNECTOR_ELEMENT in "${MLATHUB_NET_CONNECTOR_ARRAY[@]}" for NET_CONNECTOR_ELEMENT in "${MLATHUB_NET_CONNECTOR_ARRAY[@]}"
do do
MLATHUB_CMD+=("--net-connector=${NET_CONNECTOR_ELEMENT// /}") MLATHUB_CMD+=("--net-connector=${NET_CONNECTOR_ELEMENT}")
done done
fi fi
# Handle ULTRAFEEDER_CONFIG / ULTRAFEEDER_NET_CONNECTOR elements relevant to readsb:
[[ "${#MLATHUB_CONF_ARR[@]}" -gt 0 ]] && MLATHUB_CMD+=("${MLATHUB_CONF_ARR[@]}") || true
if chk_enabled "${READSB_DEBUG}"; then if chk_enabled "${READSB_DEBUG}"; then
MLATHUB_CMD+=("--debug=$READSB_DEBUG") MLATHUB_CMD+=("--debug=$READSB_DEBUG")
fi fi
@ -106,7 +108,7 @@ MLATHUB_CMD+=("--net-heartbeat=${READSB_NET_HEARTBEAT:-30}")
if [[ ! -f /run/mlathub_up ]] if [[ ! -f /run/mlathub_up ]]
then then
echo "[$(date)][mlathub] Delaying MLAT hub start until container is established..." echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] Delaying MLAT hub start until container is established..."
while [[ ! -f /run/mlathub_up ]] while [[ ! -f /run/mlathub_up ]]
do do
sleep 2 sleep 2
@ -114,18 +116,18 @@ then
fi fi
sleep 5 # sleep a bit so everything is well established sleep 5 # sleep a bit so everything is well established
echo "[$(date)][mlathub] Starting MLATHUB..." echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] Starting MLATHUB..."
# shellcheck disable=SC2086 # shellcheck disable=SC2086
if [[ -z "${LOGLEVEL}" ]] || [[ "${LOGLEVEL,,}" == "verbose" ]]; then if [[ -z "${LOGLEVEL}" ]] || [[ "${LOGLEVEL,,}" == "verbose" ]]; then
"${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS 2>&1 | \ "${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS 2>&1 | \
mawk -W Interactive '{print "[" strftime("%Y/%m/%d %H:%M:%S", systime()) "][mlathub] " $0}' mawk -W Interactive '{print "[" strftime("%Y-%m-%d %H:%M:%S", systime()) "][mlathub] " $0}'
elif [[ "${LOGLEVEL,,}" == "error" ]]; then elif [[ "${LOGLEVEL,,}" == "error" ]]; then
"${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS 2>&1 >/dev/null | \ "${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS 2>&1 >/dev/null | \
mawk -W Interactive '{print "[" strftime("%Y/%m/%d %H:%M:%S", systime()) "][mlathub] " $0}' mawk -W Interactive '{print "[" strftime("%Y-%m-%d %H:%M:%S", systime()) "][mlathub] " $0}'
elif [[ "${LOGLEVEL,,}" == "none" ]]; then elif [[ "${LOGLEVEL,,}" == "none" ]]; then
"${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS >/dev/null 2>/dev/null "${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS >/dev/null 2>/dev/null
fi fi
echo "[$(date "+%Y-%m-%d %H:%M:%S")][mlathub] The mlathub instance has exited. Restarting in 10 seconds." echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] The mlathub instance has exited. Restarting in 10 seconds."
sleep 10 sleep 10

View file

@ -1,7 +1,10 @@
#!/usr/bin/with-contenv bash #!/usr/bin/with-contenv bash
# shellcheck shell=bash disable=SC2016,SC1091 # shellcheck shell=bash disable=SC2016,SC1091
APPNAME="readsb"
source /scripts/common source /scripts/common
source /scripts/interpret_ultrafeeder_config
mkdir -p /run/readsb mkdir -p /run/readsb
@ -61,12 +64,12 @@ if ! chk_enabled "$READSB_NET_SBS_DISABLE_REDUCE"; then
fi fi
if chk_enabled "${READSB_FORWARD_MLAT}"; then if chk_enabled "${READSB_FORWARD_MLAT}"; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")][readsb] WARNING -- READSB_FORWARD_MLAT has been set! Do not feed the output of this container to any aggregators!" echo "[$(date +"%Y-%m-%d %H:%M:%S")][${APPNAME}] WARNING -- READSB_FORWARD_MLAT has been set! Do not feed the output of this container to any aggregators!"
READSB_CMD+=("--forward-mlat") READSB_CMD+=("--forward-mlat")
fi fi
if chk_enabled "${READSB_FORWARD_MLAT_SBS}"; then if chk_enabled "${READSB_FORWARD_MLAT_SBS}"; then
echo "[$(date +"%Y-%m-%d %H:%M:%S")][readsb] WARNING -- READSB_FORWARD_MLAT_SBS has been set! Do not feed the SBS (BaseStation) output of this container to any aggregators!" echo "[$(date +"%Y-%m-%d %H:%M:%S")][${APPNAME}] WARNING -- READSB_FORWARD_MLAT_SBS has been set! Do not feed the SBS (BaseStation) output of this container to any aggregators!"
READSB_CMD+=("--forward-mlat-sbs") READSB_CMD+=("--forward-mlat-sbs")
fi fi
@ -168,6 +171,9 @@ fi
# Handle "--net-connector=<ip,port,protocol>" # Handle "--net-connector=<ip,port,protocol>"
if [[ -n "$READSB_NET_CONNECTOR" ]]; then if [[ -n "$READSB_NET_CONNECTOR" ]]; then
# Strip any extraneous spaces:
READSB_NET_CONNECTOR="${READSB_NET_CONNECTOR#"${READSB_NET_CONNECTOR%%[![:space:]]*}"}" # strip leading space
READSB_NET_CONNECTOR="${READSB_NET_CONNECTOR//; /;}"
IFS=';' read -r -a READSB_NET_CONNECTOR_ARRAY <<< "$READSB_NET_CONNECTOR" IFS=';' read -r -a READSB_NET_CONNECTOR_ARRAY <<< "$READSB_NET_CONNECTOR"
for NET_CONNECTOR_ELEMENT in "${READSB_NET_CONNECTOR_ARRAY[@]}" for NET_CONNECTOR_ELEMENT in "${READSB_NET_CONNECTOR_ARRAY[@]}"
do do
@ -175,6 +181,9 @@ if [[ -n "$READSB_NET_CONNECTOR" ]]; then
done done
fi fi
# Handle ULTRAFEEDER_CONFIG / ULTRAFEEDER_NET_CONNECTOR elements relevant to readsb:
[[ "${#READSB_CONF_ARR[@]}" > 0 ]] && READSB_CMD+=("${READSB_CONF_ARR[@]}") || true
# Handle "--net-connector-delay=<seconds>" # Handle "--net-connector-delay=<seconds>"
if [[ -n "$READSB_NET_CONNECTOR_DELAY" ]]; then if [[ -n "$READSB_NET_CONNECTOR_DELAY" ]]; then
READSB_CMD+=("--net-connector-delay=$READSB_NET_CONNECTOR_DELAY") READSB_CMD+=("--net-connector-delay=$READSB_NET_CONNECTOR_DELAY")
@ -320,7 +329,7 @@ elif [[ "${LOGLEVEL,,}" == "none" ]]; then
"${READSB_BIN}" "${READSB_CMD[@]}" $READSB_EXTRA_ARGS >/dev/null 2>/dev/null "${READSB_BIN}" "${READSB_CMD[@]}" $READSB_EXTRA_ARGS >/dev/null 2>/dev/null
fi fi
echo "[$(date "+%Y-%m-%d %H:%M:%S")][readsb] The main readsb instance has exited. Restarting in 10 seconds." echo "[$(date "+%Y-%m-%d %H:%M:%S")][${APPNAME}] The main readsb instance has exited. Restarting in 10 seconds."
sleep 10 sleep 10

View file

@ -0,0 +1,123 @@
# shellcheck shell=bash disable=SC2015
#
# This scripts should be sourced by the /etc/services.d/xxx/run modules for
# readsb, mlat-client, and mlathub. It interprets the ULTRAFEEDER_CONFIG / ULTRAFEEDER_NET_CONNECTOR parameter
# and makes individual net-connector strings available for these three modules.
#
#---------------------------------------------------------------------------------------------
# Copyright (C) 2023, Ramon F. Kolb (kx1t)
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program.
# If not, see <https://www.gnu.org/licenses/>.
#---------------------------------------------------------------------------------------------
#
# Note:
# ULTRAFEEDER_CONFIG and ULTRAFEEDER_NET_CONNECTOR can be used interchangeably
# If both are defined, they will be considered jointly.
#
# Format:
# ULTRAFEEDER_CONFIG=adsb,host,port,protocol[,uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX][,extra-arguments]
# ULTRAFEEDER_CONFIG=mlat,host,port[,return_port][,uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX][,extra-arguments]
# ULTRAFEEDER_CONFIG=mlathub,host,port,protocol[,uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX][,extra-arguments]
#
# The ULTRAFEEDER_CONFIG parameter can have multiple config strings, separated by a `;`
# Please note that the config strings cannot containe `;` or `,` -- undefined things may happen if these characters are present.
#
# In the above configuration strings:
# `host` is an IP address. Specify an IP/hostname/containername for incoming or outgoing connections.
# `port` is a TCP port number
# `protocol` can be one of the following:
# `beast_reduce_out`: Beast-format output with lower data throughput (saves bandwidth and CPU)
# `beast_reduce_plus_out`: Beast-format output with extra data (UUID). This is the preferred format when feeding the "new" aggregator services
# `beast_out`: Beast-format output
# `beast_in`: Beast-format input
# `raw_out`: Raw output
# `raw_in`: Raw input
# `sbs_out`: SBS-format output
# `vrs_out`: SBS-format output
# `uuid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` is an optional parameter that sets the UUID for this specific instance.
# It will override the global `UUID` parameter. This is only needed when you want to send different UUIDs to different aggregators.
# `extra-arguments` can be any additional command line argument you want to pass to readsb, mlathub, or mlat-client
# Example: `--net-only`. Please make sure to only once pass in an extra argument for each of the adsb|mlat|mlathub service.
# Do some prep work:
# combine ULTRAFEEDER_CONFIG and ULTRAFEEDER_NET_CONNECTOR
ULTRAFEEDER_CONFIG="${ULTRAFEEDER_CONFIG}${ULTRAFEEDER_CONFIG:+;}${ULTRAFEEDER_NET_CONNECTOR}"
# Strip any extraneous spaces:
ULTRAFEEDER_CONFIG="${ULTRAFEEDER_CONFIG#"${ULTRAFEEDER_CONFIG%%[![:space:]]*}"}" # strip leading space
ULTRAFEEDER_CONFIG="${ULTRAFEEDER_CONFIG//; /;}"
# Now read each entry and parse it:
READSB_CONF_ARR=()
MLATHUB_CONF_ARR=()
readarray -td ";" configs < <(printf '%s' "${ULTRAFEEDER_CONFIG}")
# Now loop through the MLAT_CONFIG items and start up an Mlat_client for each of them:
for instance in "${configs[@]}"
do
[[ -z "${instance}" ]] && continue || true
# put individual params into the $params array:
readarray -td "," param < <(printf '%s' "${instance}")
# Process based on parameter string type in param[0]:
param[0]="${param[0],,}"
case "${param[0]}" in
adsb)
# parse arguments for main readsb
# build net-connector string into $readsb_str
# and add any extra arguments in as individual entries into READSB_CONF_ARR()
readsb_str="${param[1]},${param[2]},${param[3]}"
for ((i=4; i<${#param[*]}; i++))
do
if [[ "${param[i]:0:5}" == "uuid=" ]]; then
readsb_str="${readsb_str},${param[i]}"
elif [[ -n "${param[i]}" ]]; then
READSB_CONF_ARR+=("${param[i]}")
fi
done
# Now add $readsb_str to the READSB_CONF_ARR() as --net-connector argument:
READSB_CONF_ARR+=("--net-connector=${readsb_str}")
;;
mlat)
# parse arguments for the individual MLAT clients.
# In this case, the mlat-client run module will interpret everything
# as long as it is in the MLAT_CONFIG parameter. So we'll just add that here.
MLAT_CONFIG="${MLAT_CONFIG}${MLAT_CONFIG:+;}${instance#*,}"
;;
mlathub)
# parse arguments for mlat_hub
# build net-connector string into $readsb_str
# and add any extra arguments in as individual entries into MLATHUB_CONF_STR()
mlathub_str="${param[1]},${param[2]},${param[3]}"
for ((i=4; i<${#param[*]}; i++))
do
if [[ "${param[i]:0:5}" == "uuid=" ]]; then
mlathub_str="${readsb_str},${param[i]}"
elif [[ -n "${param[i]}" ]]; then
MLATHUB_CONF_ARR+=("${param[i]}")
fi
done
# Now add $readsb_str to the READSB_CONF_STR as --net-connector argument:
MLATHUB_CONF_ARR+=("--net-connector=${mlathub_str}")
;;
*)
# unknown string; warn and skip
echo "[$(date)][${APPNAME}] Warning: skipping unknown ULTRAFEEDER_CONFIG config element \"${instance}\""
esac
done