mirror of
https://github.com/thetechprepper/emcomm-tools-os-community.git
synced 2026-09-17 15:41:44 -04:00
309 lines
9.5 KiB
Bash
Executable File
309 lines
9.5 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Author : Gaston Gonzalez
|
|
# Date : 6 November 2024
|
|
# Updated : 29 August 2026
|
|
# Purpose : Configures the system for a specific mode of operation
|
|
|
|
# Use a simple text file to save the state of the last mode selected
|
|
MODE_STATUS_FILE="${HOME}/.config/emcomm-tools/et-mode"
|
|
|
|
QTTERMTCP_CONF_FILE="${HOME}/.config/QtTermTCP.ini"
|
|
|
|
# List of supported modes of operation
|
|
MODE_ID_NONE="none"
|
|
MODE_ID_APRS_DIGIPEATER="aprs-digipeater"
|
|
MODE_ID_APRS_CLIENT="aprs-client"
|
|
MODE_ID_BBS_CLIENT="bbs-client"
|
|
MODE_ID_BBS_CLIENT2="bbs-client2"
|
|
MODE_ID_BBS_SERVER="bbs-server"
|
|
MODE_ID_CHAT_CLIENT="chat-chattervox"
|
|
MODE_ID_PACKET_DIGIPEATER="packet-digipeater"
|
|
MODE_ID_WINLINK_ARDOP="winlink-ardop"
|
|
MODE_ID_WINLINK_MERCURY="winlink-mercury"
|
|
MODE_ID_WINLINK_PACKET="winlink-packet"
|
|
MODE_ID_WINLINK_VARA_HF="winlink-vara-hf"
|
|
MODE_ID_WINLINK_VARA_FM="winlink-vara-fm"
|
|
MODE_ID_WINLINK_TELNET="winlink-telnet"
|
|
MODE_ID_TIME_WWV="time-wwv"
|
|
|
|
# Default to 1200 baud packet for terminal sessions
|
|
TERM_MODE=1200
|
|
|
|
# Attempt to stop all EmComm Tools services regardless if they are running.
|
|
stop_all_services() {
|
|
et-kill-all
|
|
}
|
|
|
|
exit_on_service_failure() {
|
|
local systemd_unit_name="$1"
|
|
systemctl is-active --user --quiet "${systemd_unit_name}"
|
|
if [ $? -ne 0 ]; then
|
|
et-log "Can't start mode. ${systemd_unit_name} failed to start."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
TIMEOUT=15 # Total time to wait in seconds
|
|
INTERVAL=2 # Interval between checks in seconds
|
|
|
|
start_and_wait_for_service() {
|
|
local systemd_unit_name="$1"
|
|
local elapsed=0
|
|
|
|
et-log "Starting ${systemd_unit_name}..."
|
|
systemctl --user start ${systemd_unit_name}
|
|
|
|
et-log "Waiting for ${systemd_unit_name} to become active..."
|
|
|
|
while ! systemctl is-active --user --quiet "${systemd_unit_name}"; do
|
|
sleep "$INTERVAL"
|
|
elapsed=$((elapsed + INTERVAL))
|
|
if [ "$elapsed" -ge "$TIMEOUT" ]; then
|
|
et-log "Timeout reached. ${systemd_unit_name} failed to start."
|
|
exit 1
|
|
fi
|
|
et-log "Waiting for ${systemd_unit_name} to become active..."
|
|
done
|
|
|
|
# Some applications even when started still need a bit of extra time to be available.
|
|
# Add a short think time of 2 seconds. The ARDOP modem requies extra time.
|
|
sleep 2
|
|
|
|
# Do one more check to ensure that we are running, otherwise exit.
|
|
exit_on_service_failure ${systemd_unit_name}
|
|
}
|
|
|
|
start_and_wait_for_vara() {
|
|
local vara_cmd="$1"
|
|
local elapsed=0
|
|
|
|
et-log "Starting ${vara_cmd}..."
|
|
${vara_cmd} &
|
|
|
|
et-log "Waiting for ${vara_cmd} to become active..."
|
|
|
|
while true; do
|
|
CHECK_VARA=$(ps -ef | grep "[V]ARA")
|
|
if [ $? -eq 0 ]; then
|
|
break
|
|
fi
|
|
|
|
sleep "$INTERVAL"
|
|
elapsed=$((elapsed + INTERVAL))
|
|
if [ "$elapsed" -ge "$TIMEOUT" ]; then
|
|
et-log "Timeout reached. ${systemd_unit_name} failed to start."
|
|
exit 1
|
|
fi
|
|
et-log "Waiting for ${vara_cmd} to become active..."
|
|
done
|
|
}
|
|
|
|
select_term_mode () {
|
|
term_mode=()
|
|
term_mode+=("1200" "1200 baud (default for VHF/UHF)")
|
|
term_mode+=("9600" "9600 baud (VHF/UHF)")
|
|
term_mode+=("300" "300 baud (HF)")
|
|
term_mode+=("mercury" "Mercury (HF)")
|
|
|
|
# Only allow VARA terminal modes when using QtTermTCP
|
|
if [[ "${SELECTED_MODE}" == "${MODE_ID_BBS_CLIENT2}" ]]; then
|
|
if [ -e "${HOME}/.wine32/drive_c/VARA FM/VARAFM.exe" ]; then
|
|
term_mode+=("vara-fm" "VARA FM")
|
|
fi
|
|
|
|
if [ -e "${HOME}/.wine32/drive_c/VARA/VARA.exe" ]; then
|
|
term_mode+=("vara-hf" "VARA HF")
|
|
fi
|
|
fi
|
|
|
|
TERM_MODE=$(dialog --clear --menu "Select a modem" 13 60 10 "${term_mode[@]}" 3>&1 1>&2 2>&3)
|
|
exit_status=$?
|
|
|
|
if [ "${TERM_MODE}" == "9600" ]; then
|
|
dialog --title "Note on 9600 Baud" --msgbox "9600 baud is only supported on limited radios and typically requires a special cable.\n\nDon't forget to set the packet settings to 9600 on the radio." 0 0
|
|
fi
|
|
|
|
tput sgr 0 && clear
|
|
|
|
if [ ${exit_status} -ne 0 ]; then
|
|
et-log "No modem selected. Mode will not be started."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
wwv_mode () {
|
|
dialog --title "Note on WWV" --msgbox "Manually set your radio to AM and tune it to one of the WWV frequencies appropriate for this operating time.\n\nTry: 2.5, 5, 10, 15 or 20 MHz." 0 0
|
|
tput sgr 0 && clear
|
|
}
|
|
|
|
# Build list of options
|
|
options=()
|
|
options+=("${MODE_ID_NONE}" "No mode selected")
|
|
options+=("${MODE_ID_APRS_CLIENT}" "APRS Client (YAAC)")
|
|
options+=("${MODE_ID_BBS_CLIENT}" "BBS Client (Paracon)")
|
|
options+=("${MODE_ID_BBS_CLIENT2}" "BBS Client (QtTermTCP)")
|
|
options+=("${MODE_ID_BBS_SERVER}" "BBS Server (LinBPQ)")
|
|
options+=("${MODE_ID_CHAT_CLIENT}" "Chat (chattervox)")
|
|
options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Digipeater")
|
|
options+=("${MODE_ID_PACKET_DIGIPEATER}" "Packet Digipeater")
|
|
options+=("${MODE_ID_WINLINK_PACKET}" "Winlink over VHF/UHF (AX.25 Packet)")
|
|
|
|
if [ -e "${HOME}/.wine32/drive_c/VARA FM/VARAFM.exe" ]; then
|
|
options+=("${MODE_ID_WINLINK_VARA_FM}" "Winlink over VHF/UHF (VARA FM)")
|
|
fi
|
|
|
|
options+=("${MODE_ID_WINLINK_MERCURY}" "Winlink over HF (Mercury)")
|
|
options+=("${MODE_ID_WINLINK_ARDOP}" "Winlink over HF (ARDOP)")
|
|
|
|
if [ -e "${HOME}/.wine32/drive_c/VARA/VARA.exe" ]; then
|
|
options+=("${MODE_ID_WINLINK_VARA_HF}" "Winlink over HF (VARA HF)")
|
|
fi
|
|
|
|
options+=("${MODE_ID_WINLINK_TELNET}" "Winlink over telnet (Internet)")
|
|
options+=("${MODE_ID_TIME_WWV}" "Sync clock to WWV")
|
|
|
|
# Prompt user for option and save exit status
|
|
SELECTED_MODE=$(dialog --clear --menu "Select a mode:" 18 65 10 "${options[@]}" 3>&1 1>&2 2>&3)
|
|
exit_status=$?
|
|
|
|
tput sgr 0 && clear
|
|
|
|
if [ $exit_status -eq 0 ]; then
|
|
|
|
stop_all_services
|
|
|
|
echo ${SELECTED_MODE} > ${MODE_STATUS_FILE}
|
|
|
|
case ${SELECTED_MODE} in
|
|
${MODE_ID_NONE})
|
|
et-log "No mode selected"
|
|
;;
|
|
${MODE_ID_APRS_DIGIPEATER})
|
|
systemctl --user start et-service-direwolf-aprs-digipeater
|
|
et-log "APRS digipeater now running."
|
|
;;
|
|
${MODE_ID_APRS_CLIENT})
|
|
start_and_wait_for_service et-service-direwolf-simple
|
|
et-yaac start
|
|
;;
|
|
${MODE_ID_BBS_CLIENT})
|
|
select_term_mode
|
|
et-log "Using ${TERM_MODE} as the modem speed."
|
|
|
|
case "${TERM_MODE}" in
|
|
"1200")
|
|
start_and_wait_for_service et-service-direwolf-simple
|
|
;;
|
|
"9600")
|
|
start_and_wait_for_service et-service-direwolf-9600
|
|
;;
|
|
"300")
|
|
start_and_wait_for_service et-service-direwolf-300
|
|
;;
|
|
esac
|
|
|
|
et-log "Starting Paracon."
|
|
et-paracon start
|
|
;;
|
|
${MODE_ID_BBS_CLIENT2})
|
|
select_term_mode
|
|
et-log "Using ${TERM_MODE} as the modem."
|
|
|
|
case "${TERM_MODE}" in
|
|
"1200")
|
|
start_and_wait_for_service et-service-direwolf-simple
|
|
;;
|
|
"9600")
|
|
start_and_wait_for_service et-service-direwolf-9600
|
|
;;
|
|
"300")
|
|
start_and_wait_for_service et-service-direwolf-300
|
|
;;
|
|
"vara-fm")
|
|
sed -i "s|^VARAFM=.*|VARAFM=1|g" ${QTTERMTCP_CONF_FILE}
|
|
sed -i "s|^VARAHF=.*|VARAHF=0|g" ${QTTERMTCP_CONF_FILE}
|
|
start_and_wait_for_vara et-vara-fm
|
|
;;
|
|
"vara-hf")
|
|
sed -i "s|^VARAFM=.*|VARAFM=0|g" ${QTTERMTCP_CONF_FILE}
|
|
sed -i "s|^VARAHF=.*|VARAHF=1|g" ${QTTERMTCP_CONF_FILE}
|
|
start_and_wait_for_vara et-vara-hf
|
|
;;
|
|
"mercury")
|
|
sed -i "s|^VARAFM=.*|VARAFM=0|g" ${QTTERMTCP_CONF_FILE}
|
|
sed -i "s|^VARAHF=.*|VARAHF=1|g" ${QTTERMTCP_CONF_FILE}
|
|
start_and_wait_for_service et-service-mercury-arq
|
|
;;
|
|
esac
|
|
|
|
et-log "Starting QtTermTCP."
|
|
et-qttermtcp start
|
|
;;
|
|
${MODE_ID_BBS_SERVER})
|
|
start_and_wait_for_service et-service-direwolf-simple
|
|
et-log "Starting BBS server."
|
|
et-bbs-server start
|
|
;;
|
|
${MODE_ID_CHAT_CLIENT})
|
|
start_and_wait_for_service et-service-direwolf-simple
|
|
et-log "Starting chattervox"
|
|
et-chattervox start
|
|
;;
|
|
${MODE_ID_PACKET_DIGIPEATER})
|
|
systemctl --user start et-service-direwolf-packet-digipeater
|
|
et-log "Packet digipeater now running."
|
|
;;
|
|
${MODE_ID_WINLINK_ARDOP})
|
|
et-log "Using ARDOP as the modem."
|
|
start_and_wait_for_service et-service-ardop
|
|
start_and_wait_for_service et-service-winlink-ardop
|
|
min http://localhost:8080
|
|
;;
|
|
${MODE_ID_WINLINK_MERCURY})
|
|
et-log "Using Mercury as the modem."
|
|
start_and_wait_for_service et-service-mercury-arq
|
|
start_and_wait_for_service et-service-winlink-mercury
|
|
min http://localhost:8080
|
|
;;
|
|
${MODE_ID_WINLINK_PACKET})
|
|
start_and_wait_for_service et-service-direwolf-simple
|
|
start_and_wait_for_service et-service-winlink-packet
|
|
min http://localhost:8080
|
|
;;
|
|
${MODE_ID_WINLINK_VARA_FM})
|
|
dialog --title "User Action Required" --msgbox "VARA FM is not a plug and play mode. You must configure VARA manually." 10 50
|
|
tput sgr 0 && clear
|
|
start_and_wait_for_vara et-vara-fm
|
|
et-winlink start-vara-fm &
|
|
sleep 1
|
|
min http://localhost:8080 2>/dev/null
|
|
;;
|
|
${MODE_ID_WINLINK_VARA_HF})
|
|
dialog --title "User Action Required" --msgbox "VARA HF is not a plug and play mode. You must configure VARA manually." 10 50
|
|
tput sgr 0 && clear
|
|
start_and_wait_for_vara et-vara-hf
|
|
et-winlink start-vara-hf &
|
|
sleep 1
|
|
min http://localhost:8080 2>/dev/null
|
|
;;
|
|
${MODE_ID_WINLINK_TELNET})
|
|
start_and_wait_for_service et-service-winlink-telnet
|
|
min http://localhost:8080 2>/dev/null
|
|
;;
|
|
${MODE_ID_TIME_WWV})
|
|
wwv_mode
|
|
sudo /opt/emcomm-tools/sbin/wrapper-et-wwv.sh
|
|
;;
|
|
*)
|
|
et-log "Mode ${SELECTED_MODE} not yet supported"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
else
|
|
et-log "No mode selected"
|
|
echo ${MODE_ID_NONE} > ${MODE_STATUS_FILE}
|
|
exit 1
|
|
fi
|