From 6099c147a509b841104232521dcc57055afa8a83 Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 09:16:17 -0700 Subject: [PATCH 01/11] et-mode - Added initial policy kit rule to allow any non-privileged users in the et-data group (default for all users) to manage systemd services. --- .../localauthority.conf.d/52-et-group-service-manage.conf | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf diff --git a/overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf b/overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf new file mode 100644 index 0000000..32ff105 --- /dev/null +++ b/overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf @@ -0,0 +1,4 @@ +[Allow Group to Manage Service] +Identity=unix-group:et-data +Action=org.freedesktop.systemd1.manage-units +ResultActive=yes From ce5b49b855fb5e6aaef3dc1fc798089fbe0f8f4f Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 10:36:03 -0700 Subject: [PATCH 02/11] et-mode Changed approach for et-mode design. Removed PolKit rule for group-level systemd acesses. Switched to user-level systemd service pattern. Added initial systemd service for ARDOP --- .../52-et-group-service-manage.conf | 4 ---- .../systemd/user/et-service-ardop.service | 21 +++++++++++++++++++ overlay/opt/emcomm-tools/bin/et-ardop | 14 +++++++++++-- 3 files changed, 33 insertions(+), 6 deletions(-) delete mode 100644 overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf create mode 100644 overlay/etc/skel/.config/systemd/user/et-service-ardop.service diff --git a/overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf b/overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf deleted file mode 100644 index 32ff105..0000000 --- a/overlay/etc/polkit-1/localauthority.conf.d/52-et-group-service-manage.conf +++ /dev/null @@ -1,4 +0,0 @@ -[Allow Group to Manage Service] -Identity=unix-group:et-data -Action=org.freedesktop.systemd1.manage-units -ResultActive=yes diff --git a/overlay/etc/skel/.config/systemd/user/et-service-ardop.service b/overlay/etc/skel/.config/systemd/user/et-service-ardop.service new file mode 100644 index 0000000..931a538 --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-ardop.service @@ -0,0 +1,21 @@ +# Author : Gaston Gonzalez +# Date : 6 November 2024 +# Purpose : User systemd unit file for EmComm Tools ARDOP service +# +# Usage: +# Check status : systemctl --user status et-service-ardop +# Start service : systemctl --user start et-service-ardop +# Stop service : systemctl --user stop et-service-ardop +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools ARDOP service +# Disable conditional check for audio device. Allow et-ardop to enforce. +#ConditionPathExists=/dev/et-audio + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-ardop +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/opt/emcomm-tools/bin/et-ardop b/overlay/opt/emcomm-tools/bin/et-ardop index 8f6bc5d..0d3a8ee 100755 --- a/overlay/opt/emcomm-tools/bin/et-ardop +++ b/overlay/opt/emcomm-tools/bin/et-ardop @@ -1,7 +1,7 @@ #!/bin/bash # # Author : Gaston Gonzalez -# Date : 5 November 2024 +# Date : 6 November 2024 # Purpose : Wrapper script for starting ARDOP # # Preconditions: @@ -16,6 +16,14 @@ ARDOP_PORT=8515 +notify_user() { + notify-send \ + -t 10000 \ + --app-name="EmComm Tools" \ + "$1" +} + + [ -z ${ET_LOG_DIR} ] && ET_LOG_DIR="${HOME}/.local/share/emcomm-tools" [ ! -e ${ET_LOG_DIR} ] && mkdir -p ${ET_LOG_DIR} @@ -37,10 +45,12 @@ if [ -e /dev/et-audio ]; then else et-log "Can't start ARDOP modem. No ET_AUDIO device detected." + notify_user "Select radio and plug it in" exit 1 fi else - et-log "No ET_AUDIO device plugged in. No supported audio device plugged it." + et-log "No ET_AUDIO device plugged in. No supported audio device plugged in." + notify_user "Select radio and plug it in" exit 1 fi From 08259f0b870845b1c56bb2147df087a1fe38a3de Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 10:48:23 -0700 Subject: [PATCH 03/11] et-mode - Added initial user-level systemd services for the Dire Wolf packet modes --- .../et-service-direwolf-digipeater.service | 22 +++++++++++++++++++ .../user/et-service-direwolf-simple.service | 22 +++++++++++++++++++ overlay/opt/emcomm-tools/bin/et-direwolf | 12 +++++----- 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service create mode 100644 overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service diff --git a/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service new file mode 100644 index 0000000..cb32204 --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service @@ -0,0 +1,22 @@ +# Author : Gaston Gonzalez +# Date : 6 November 2024 +# Purpose : User systemd unit file for EmComm Tools Dire Wolf digipeater packet +# : service. +# +# Usage: +# Check status : systemctl --user status et-service-direwolf-digipeater +# Start service : systemctl --user start et-service-direwolf-digipeater +# Stop service : systemctl --user stop et-service-direwolf-digipeater +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools Dir Wolf simple packet service +# Disable conditional check for audio device. Allow et-ardop to enforce. +#ConditionPathExists=/dev/et-audio + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-direwolf start digipeater +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service new file mode 100644 index 0000000..fbb1eec --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service @@ -0,0 +1,22 @@ +# Author : Gaston Gonzalez +# Date : 6 November 2024 +# Purpose : User systemd unit file for EmComm Tools Dire Wolf simple packet +# : service. +# +# Usage: +# Check status : systemctl --user status et-service-direwolf-simple +# Start service : systemctl --user start et-service-direwolf-simple +# Stop service : systemctl --user stop et-service-direwolf-simple +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools Dir Wolf simple packet service +# Disable conditional check for audio device. Allow et-ardop to enforce. +#ConditionPathExists=/dev/et-audio + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-direwolf start simple +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/opt/emcomm-tools/bin/et-direwolf b/overlay/opt/emcomm-tools/bin/et-direwolf index 239e540..111f17b 100755 --- a/overlay/opt/emcomm-tools/bin/et-direwolf +++ b/overlay/opt/emcomm-tools/bin/et-direwolf @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 1 November 2024 -# Updated : 3 November 2024 +# Updated : 6 November 2024 # Purpose : Wrapper script for starting Dire Wolf with PnP support # # Preconditions: @@ -21,8 +21,8 @@ usage() { echo " update-config - Update configuration for selected mode" echo "" echo " " - echo " digipeater-only - Run in RF-only digipeater mode" - echo " simple-packet - Run in simple packet mode" + echo " digipeater - Run in RF-only digipeater mode" + echo " simple - Run in simple packet mode" } if [ $# -ne 2 ]; then @@ -32,10 +32,10 @@ fi MODE=$2 case "${MODE}" in - digipeater-only) + digipeater) DIREWOLF_TEMPLATE_CONF_FILE="${ET_HOME}/conf/template.d/packet/direwolf.${MODE}.conf" ;; - simple-packet) + simple) DIREWOLF_TEMPLATE_CONF_FILE="${ET_HOME}/conf/template.d/packet/direwolf.${MODE}.conf" ;; *) @@ -47,7 +47,7 @@ esac notify_user() { notify-send \ - -t 5000 \ + -t 10000 \ --app-name="EmComm Tools" \ "$1" } From d991824f82286ef6e2d4fc561c38deed6b8fa84e Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 11:00:07 -0700 Subject: [PATCH 04/11] et-mode - Added initial user-level systemd services Winlink packet and ARDOP modes --- .../et-service-direwolf-digipeater.service | 2 +- .../user/et-service-direwolf-simple.service | 2 +- .../user/et-service-winlink-ardop.service | 19 +++++++++++++++++++ .../user/et-service-winlink-packet.service | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 overlay/etc/skel/.config/systemd/user/et-service-winlink-ardop.service create mode 100644 overlay/etc/skel/.config/systemd/user/et-service-winlink-packet.service diff --git a/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service index cb32204..08d2b0b 100644 --- a/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service +++ b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-digipeater.service @@ -10,7 +10,7 @@ # Reload this config : systemctl --user daemon-reload [Unit] -Description=EmComm Tools Dir Wolf simple packet service +Description=EmComm Tools Dire Wolf simple packet service # Disable conditional check for audio device. Allow et-ardop to enforce. #ConditionPathExists=/dev/et-audio diff --git a/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service index fbb1eec..d5fa2f8 100644 --- a/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service +++ b/overlay/etc/skel/.config/systemd/user/et-service-direwolf-simple.service @@ -10,7 +10,7 @@ # Reload this config : systemctl --user daemon-reload [Unit] -Description=EmComm Tools Dir Wolf simple packet service +Description=EmComm Tools Dire Wolf simple packet service # Disable conditional check for audio device. Allow et-ardop to enforce. #ConditionPathExists=/dev/et-audio diff --git a/overlay/etc/skel/.config/systemd/user/et-service-winlink-ardop.service b/overlay/etc/skel/.config/systemd/user/et-service-winlink-ardop.service new file mode 100644 index 0000000..3ea723d --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-winlink-ardop.service @@ -0,0 +1,19 @@ +# Author : Gaston Gonzalez +# Date : 6 November 2024 +# Purpose : User systemd unit file for EmComm Tools Winlink over ARDOP +# +# Usage: +# Check status : systemctl --user status et-service-winlink-ardop +# Start service : systemctl --user start et-service-winlink-ardop +# Stop service : systemctl --user stop et-service-winlink-ardop +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools Winlink ARDOP service + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-winlink start-ardop +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.config/systemd/user/et-service-winlink-packet.service b/overlay/etc/skel/.config/systemd/user/et-service-winlink-packet.service new file mode 100644 index 0000000..498f1ab --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-winlink-packet.service @@ -0,0 +1,19 @@ +# Author : Gaston Gonzalez +# Date : 6 November 2024 +# Purpose : User systemd unit file for EmComm Tools Winlink over packet +# +# Usage: +# Check status : systemctl --user status et-service-winlink-packet +# Start service : systemctl --user start et-service-winlink-packet +# Stop service : systemctl --user stop et-service-winlink-packet +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools Winlink packet service + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-winlink start-packet +Restart=no + +[Install] +WantedBy=multi-user.target From 49b2298e4bc01d17b604796ebbdb802a331b0ccc Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 11:18:15 -0700 Subject: [PATCH 05/11] et-mode - Initial skeleton for et-mode command --- overlay/opt/emcomm-tools/bin/et-mode | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 overlay/opt/emcomm-tools/bin/et-mode diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode new file mode 100755 index 0000000..82fd689 --- /dev/null +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -0,0 +1,43 @@ +#!/bin/bash +# +# Author : Gaston Gonzalez +# Date : 6 November 2024 +# Purpose : Configures the system for a specific mode of operation +set -e + +# TODO check for call, radio, audio + +MODE_ID_NONE="none" +MODE_ID_APRS_DIGIPEATER="aprs-digipeater" +MODE_ID_APRS_CLIENT="aprs-client" +MODE_ID_WINLINK_ARDOP="winlink-ardop" +MODE_ID_WINLINK_PACKET="winlink-packet" + +options=() +options+=("${MODE_ID_NONE}" "No mode selected") +options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Client (YAAC)") +options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Digipeater") +options+=("${MODE_ID_WINLINK_ARDOP}" "Winlink ARDOP") +options+=("${MODE_ID_WINLINK_PACKET}" "Winlink Packet") + +SELECTED_MODE=$(dialog --clear --menu "Select a mode:" 20 60 10 "${options[@]}" 3>&1 1>&2 2>&3) +exit_status=$? + +tput sgr 0 && clear + +if [ $exit_status -eq 0 ]; then + + # TODO Stop all modes before start + + case ${SELECTED_MODE} in + *) + echo "Mode ${SELECTED_MODE} not ey supported" + exit 1 + ;; + esac + +else + et-log "No mode selected" + exit 1 +fi + From 4a8fbfc0da07efd289cb58bf5867ade833859512 Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 11:52:52 -0700 Subject: [PATCH 06/11] et-mode - Added very rough implementation to start each mode --- overlay/opt/emcomm-tools/bin/et-mode | 45 ++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 82fd689..867ab61 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -3,9 +3,10 @@ # Author : Gaston Gonzalez # Date : 6 November 2024 # Purpose : Configures the system for a specific mode of operation -set -e # TODO check for call, radio, audio +# TODO show current mode (delegate to et-system-info to align with Conky) +# TODO Add better detection between startup services / apps MODE_ID_NONE="none" MODE_ID_APRS_DIGIPEATER="aprs-digipeater" @@ -13,9 +14,19 @@ MODE_ID_APRS_CLIENT="aprs-client" MODE_ID_WINLINK_ARDOP="winlink-ardop" MODE_ID_WINLINK_PACKET="winlink-packet" +# 1. Attempt to stop all EmComm Tools services regardless if they are running. +# 2. Stop the applications first, then the modems +stop_all_services() { + systemctl --user stop et-service-winlink-ardop + systemctl --user stop et-service-winlink-packet + systemctl --user stop et-service-ardop + systemctl --user stop et-service-direwolf-simple + systemctl --user stop et-service-direwolf-digipeater +} + options=() options+=("${MODE_ID_NONE}" "No mode selected") -options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Client (YAAC)") +options+=("${MODE_ID_APRS_CLIENT}" "APRS Client (YAAC)") options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Digipeater") options+=("${MODE_ID_WINLINK_ARDOP}" "Winlink ARDOP") options+=("${MODE_ID_WINLINK_PACKET}" "Winlink Packet") @@ -27,11 +38,36 @@ tput sgr 0 && clear if [ $exit_status -eq 0 ]; then - # TODO Stop all modes before start + stop_all_services case ${SELECTED_MODE} in + ${MODE_ID_NONE}) + et-log "No mode selected" + ;; + ${MODE_ID_APRS_DIGIPEATER}) + systemctl --user start et-service-direwolf-digipeater + ;; + ${MODE_ID_APRS_CLIENT}) + systemctl --user start et-service-direwolf-simple + sleep 3 + et-yaac start + ;; + ${MODE_ID_WINLINK_ARDOP}) + systemctl --user start et-service-ardop + sleep 3 + systemctl --user start et-service-winlink-ardop + sleep 3 + min http://localhost:8080 + ;; + ${MODE_ID_WINLINK_PACKET}) + systemctl --user start et-service-direwolf-simple + sleep 3 + systemctl --user start et-service-winlink-packet + sleep 3 + min http://localhost:8080 + ;; *) - echo "Mode ${SELECTED_MODE} not ey supported" + et-log "Mode ${SELECTED_MODE} not yet supported" exit 1 ;; esac @@ -40,4 +76,3 @@ else et-log "No mode selected" exit 1 fi - From 908a0c8d70ff63de16e9507169cba655a06cbb99 Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 11:58:40 -0700 Subject: [PATCH 07/11] et-mode - Added support for saving current mode --- overlay/etc/skel/.config/emcomm-tools/et-mode | 1 + overlay/opt/emcomm-tools/bin/et-mode | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 overlay/etc/skel/.config/emcomm-tools/et-mode diff --git a/overlay/etc/skel/.config/emcomm-tools/et-mode b/overlay/etc/skel/.config/emcomm-tools/et-mode new file mode 100644 index 0000000..621e94f --- /dev/null +++ b/overlay/etc/skel/.config/emcomm-tools/et-mode @@ -0,0 +1 @@ +none diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 867ab61..1c501b4 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -4,6 +4,8 @@ # Date : 6 November 2024 # Purpose : Configures the system for a specific mode of operation +MODE_STATUS_FILE="${HOME}/.config/emcomm-tools/et-mode" + # TODO check for call, radio, audio # TODO show current mode (delegate to et-system-info to align with Conky) # TODO Add better detection between startup services / apps @@ -72,7 +74,10 @@ if [ $exit_status -eq 0 ]; then ;; esac + echo ${SELECTED_MODE} > ${MODE_STATUS_FILE} + else et-log "No mode selected" + echo ${MODE_ID_NONE} > ${MODE_STATUS_FILE} exit 1 fi From 1b5b08a4c25630d9fd67d32453170b24aafa9f6b Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Wed, 6 Nov 2024 13:06:16 -0700 Subject: [PATCH 08/11] et-mode Added mode to Conky --- overlay/etc/skel/.conkyrc | 2 ++ overlay/opt/emcomm-tools/bin/et-mode | 4 +-- overlay/opt/emcomm-tools/bin/et-system-info | 34 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/overlay/etc/skel/.conkyrc b/overlay/etc/skel/.conkyrc index 6a20cd7..ca48a38 100644 --- a/overlay/etc/skel/.conkyrc +++ b/overlay/etc/skel/.conkyrc @@ -36,6 +36,8 @@ CAT : ${execpi 10 et-system-info et-cat} GPS : ${execpi 10 et-system-info et-gps} Audio: ${execpi 10 et-system-info et-audio} +Mode : ${execpi 10 et-system-info et-mode} + ${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}OPERATOR ${font DejaVu Sans Mono:size=11}${color yellow}Callsign: ${execpi 10 et-system-info callsign} Grid : ${execpi 10 et-system-info grid} diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 1c501b4..5d668d3 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -6,8 +6,6 @@ MODE_STATUS_FILE="${HOME}/.config/emcomm-tools/et-mode" -# TODO check for call, radio, audio -# TODO show current mode (delegate to et-system-info to align with Conky) # TODO Add better detection between startup services / apps MODE_ID_NONE="none" @@ -65,7 +63,7 @@ if [ $exit_status -eq 0 ]; then systemctl --user start et-service-direwolf-simple sleep 3 systemctl --user start et-service-winlink-packet - sleep 3 + sleep 2 min http://localhost:8080 ;; *) diff --git a/overlay/opt/emcomm-tools/bin/et-system-info b/overlay/opt/emcomm-tools/bin/et-system-info index 8dc6702..476c2b5 100755 --- a/overlay/opt/emcomm-tools/bin/et-system-info +++ b/overlay/opt/emcomm-tools/bin/et-system-info @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 6 October 2024 -# Updated : 30 October 2024 +# Updated : 6 November 2024 # Purpose : Utility script for dumping system information function usage() { @@ -13,6 +13,7 @@ function usage() { echo " et-audio-card - Display audio card and device: ," echo " et-cat - Show state of CAT control interface" echo " et-gps - Show state of GPS interface" + echo " et-mode - Show current mode" echo " grid - Current grid square defined by user" echo " ip - System IP address" echo " release - EmComm Tools release" @@ -168,6 +169,37 @@ case $1 in fi ;; + et-mode) + SELECTED_MODE=$(cat "${HOME}/.config/emcomm-tools/et-mode") + + MODE_ID_NONE="none" + MODE_ID_APRS_DIGIPEATER="aprs-digipeater" + MODE_ID_APRS_CLIENT="aprs-client" + MODE_ID_WINLINK_ARDOP="winlink-ardop" + MODE_ID_WINLINK_PACKET="winlink-packet" + + case ${SELECTED_MODE} in + ${MODE_ID_NONE}) + echo "Not selected" + ;; + ${MODE_ID_APRS_DIGIPEATER}) + echo "Digipeater" + ;; + ${MODE_ID_APRS_CLIENT}) + echo "APRS" + ;; + ${MODE_ID_WINLINK_ARDOP}) + echo "Winlink ARDOP" + ;; + ${MODE_ID_WINLINK_PACKET}) + echo "Winlink Packet" + ;; + *) + echo "Unknown" + ;; + esac + + ;; ip) hostname -I | awk '{print $1}' ;; From 4ada7f1aafe8a66ab6dbc1188b9353eacf171576 Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Thu, 7 Nov 2024 08:41:39 -0700 Subject: [PATCH 09/11] et-mode - Added more robust checks for starting services and their dependencies --- overlay/etc/skel/.conkyrc | 3 +- overlay/opt/emcomm-tools/bin/et-mode | 50 +++++++++++++++++++++------- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/overlay/etc/skel/.conkyrc b/overlay/etc/skel/.conkyrc index ca48a38..04ba620 100644 --- a/overlay/etc/skel/.conkyrc +++ b/overlay/etc/skel/.conkyrc @@ -36,7 +36,8 @@ CAT : ${execpi 10 et-system-info et-cat} GPS : ${execpi 10 et-system-info et-gps} Audio: ${execpi 10 et-system-info et-audio} -Mode : ${execpi 10 et-system-info et-mode} +${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}MODE +${font DejaVu Sans Mono:size=11}${color yellow}${execpi 10 et-system-info et-mode} ${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}OPERATOR ${font DejaVu Sans Mono:size=11}${color yellow}Callsign: ${execpi 10 et-system-info callsign} diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 5d668d3..152e843 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -2,12 +2,13 @@ # # Author : Gaston Gonzalez # Date : 6 November 2024 +# Updated : 7 November 2024 # 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" -# TODO Add better detection between startup services / apps - +# List of supported modes of operation MODE_ID_NONE="none" MODE_ID_APRS_DIGIPEATER="aprs-digipeater" MODE_ID_APRS_CLIENT="aprs-client" @@ -24,6 +25,34 @@ stop_all_services() { systemctl --user stop et-service-direwolf-digipeater } +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 +} + +# Build list of options options=() options+=("${MODE_ID_NONE}" "No mode selected") options+=("${MODE_ID_APRS_CLIENT}" "APRS Client (YAAC)") @@ -31,6 +60,7 @@ options+=("${MODE_ID_APRS_DIGIPEATER}" "APRS Digipeater") options+=("${MODE_ID_WINLINK_ARDOP}" "Winlink ARDOP") options+=("${MODE_ID_WINLINK_PACKET}" "Winlink Packet") +# Prompt user for option and save exit status SELECTED_MODE=$(dialog --clear --menu "Select a mode:" 20 60 10 "${options[@]}" 3>&1 1>&2 2>&3) exit_status=$? @@ -46,24 +76,20 @@ if [ $exit_status -eq 0 ]; then ;; ${MODE_ID_APRS_DIGIPEATER}) systemctl --user start et-service-direwolf-digipeater + et-log "APRS digipeater now running." ;; ${MODE_ID_APRS_CLIENT}) - systemctl --user start et-service-direwolf-simple - sleep 3 + start_and_wait_for_service et-service-direwolf-simple et-yaac start ;; ${MODE_ID_WINLINK_ARDOP}) - systemctl --user start et-service-ardop - sleep 3 - systemctl --user start et-service-winlink-ardop - sleep 3 + start_and_wait_for_service et-service-ardop + start_and_wait_for_service et-service-winlink-ardop min http://localhost:8080 ;; ${MODE_ID_WINLINK_PACKET}) - systemctl --user start et-service-direwolf-simple - sleep 3 - systemctl --user start et-service-winlink-packet - sleep 2 + start_and_wait_for_service et-service-direwolf-simple + start_and_wait_for_service et-service-winlink-packet min http://localhost:8080 ;; *) From 8492bceddab162eaa01e4ac97fa9f0a619643c74 Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Thu, 7 Nov 2024 09:15:53 -0700 Subject: [PATCH 10/11] Dire Wolf - Added logging to external file --- overlay/opt/emcomm-tools/bin/et-direwolf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/overlay/opt/emcomm-tools/bin/et-direwolf b/overlay/opt/emcomm-tools/bin/et-direwolf index 111f17b..1d3b8e8 100755 --- a/overlay/opt/emcomm-tools/bin/et-direwolf +++ b/overlay/opt/emcomm-tools/bin/et-direwolf @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 1 November 2024 -# Updated : 6 November 2024 +# Updated : 7 November 2024 # Purpose : Wrapper script for starting Dire Wolf with PnP support # # Preconditions: @@ -52,19 +52,22 @@ notify_user() { "$1" } +[ -z ${ET_LOG_DIR} ] && ET_LOG_DIR="${HOME}/.local/share/emcomm-tools" +[ ! -e ${ET_LOG_DIR} ] && mkdir -p ${ET_LOG_DIR} + start() { update-config if [ $? -eq 0 ]; then - RIGCTLD_OUT=$(systemctl status rigctld) + systemctl is-active --quiet rigctld if [ $? -ne 0 ]; then et-log "Can't start Dire Wolf. rigctld not running. Ensure radio is selected." notify_user "Can't start Dire Wolf. rigctld not running." exit 1 fi - CMD="direwolf -c ${DIREWOLF_CONF_FILE} -t 0 -p" + CMD="direwolf -c ${DIREWOLF_CONF_FILE} -l ${ET_LOG_DIR} -t 0 -p" et-log "Starting Dire Wolf with: '${CMD}'" echo ${CMD} From d25dfcfaed9d60961bb1bc4f5646d226cb84f317 Mon Sep 17 00:00:00 2001 From: Gaston Gonzalez Date: Thu, 7 Nov 2024 09:31:11 -0700 Subject: [PATCH 11/11] et-mode Added on more method to check the a systemd unit is in fact running --- overlay/opt/emcomm-tools/bin/et-mode | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 152e843..d4e23c5 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -25,6 +25,15 @@ stop_all_services() { systemctl --user stop et-service-direwolf-digipeater } +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 @@ -50,6 +59,9 @@ start_and_wait_for_service() { # 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} } # Build list of options