diff --git a/REGRESSION.md b/REGRESSION.md index fdc731b..420383a 100644 --- a/REGRESSION.md +++ b/REGRESSION.md @@ -1,7 +1,7 @@ # ETC Regression Tests -- **Build**: ETC R7 Build 1 -- **Date**: 16 April 2026 +- **Build**: ETC R7 Build 5 +- **Date**: 14 June 2026 ## Desktop/Launcher Icons @@ -83,6 +83,7 @@ * [ ] Select RMS gateway => VFO updated * [ ] Connect * [ ] wwv +* [ ] reticulum ## Bluetooth TNC @@ -141,3 +142,12 @@ * [ ] `offline` folder on Desktop * [ ] Check `nets` folder for `amrron` and `ghostnet` * [ ] Test gpg signature verifcation (see gpg crypto doc) + +## LoRa + +* [ ] LoRa listed in Conky +* [ ] Heltec v4 PnP +* [ ] et-reticulum + * [ ] All blueprints + * [ ] All permutations of radios and LoRa connected/disconnected + diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..7d4be29 --- /dev/null +++ b/TODO.md @@ -0,0 +1,19 @@ +# To-Do + +* [ ] Add Reticulum + * [ ] Add solution for handling first start + * [ ] et-user-backup + * [ ] ~/.reticulum/storage/identities + * [ ] ~/.nomadnetwork/storage + * [ ] Add PnP support for LoRa devices + * [ ] Add support for Bluetooth devices (et-uv-pro) +* [ ] et-mail +* [ ] et-debug +* [ ] et-index +* [ ] See email: "Found on Discord GPS issue" + * [ ] Fix dial frequency + * [ ] Update rmslist.csv (et-data-winlink) +* Add radio support + * [ ] TX500MP + LINK500MP + * [ ] IC-7300 MkII +* [ ] Thunderbird (Optional) diff --git a/overlay/etc/skel/.bash_profile b/overlay/etc/skel/.bash_profile index 8b31d4d..58c1ba2 100644 --- a/overlay/etc/skel/.bash_profile +++ b/overlay/etc/skel/.bash_profile @@ -3,6 +3,8 @@ # Updated : 16 April 2026 # Description : bash profile +export PATH="$HOME/.local/bin:$PATH" + # All user accounts should be in the 'et-data' group to allow data sharing with # EmComm Tools. A umask of 002 is required to allow users and the system to # read and write shared data files. diff --git a/overlay/etc/skel/.config/systemd/user/et-service-modem73-default.service b/overlay/etc/skel/.config/systemd/user/et-service-modem73-default.service new file mode 100644 index 0000000..a4f87a4 --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-modem73-default.service @@ -0,0 +1,21 @@ +# Author : Gaston Gonzalez +# Date : 28 June 2026 +# Updated : 30 June 2026 +# Purpose : User systemd unit file for EmComm Tools that starts modem73 +# : in a default configuration. +# +# Usage: +# Check status : systemctl --user status et-service-modem73-default +# Start service : systemctl --user start et-service-modem73-default +# Stop service : systemctl --user stop et-service-modem73-default +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools modem73 default service for balanced performance + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-modem73 balanced --headless +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.config/systemd/user/et-service-modem73-fast.service b/overlay/etc/skel/.config/systemd/user/et-service-modem73-fast.service new file mode 100644 index 0000000..1cc4664 --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-modem73-fast.service @@ -0,0 +1,20 @@ +# Author : Gaston Gonzalez +# Date : 30 June 2026 +# Purpose : User systemd unit file for EmComm Tools that starts modem73 +# : in a fast configuration. +# +# Usage: +# Check status : systemctl --user status et-service-modem73-fast +# Start service : systemctl --user start et-service-modem73-fast +# Stop service : systemctl --user stop et-service-modem73-fast +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools modem73 service for fast performance + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-modem73 fast --headless +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.config/systemd/user/et-service-modem73-faster.service b/overlay/etc/skel/.config/systemd/user/et-service-modem73-faster.service new file mode 100644 index 0000000..8639953 --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-modem73-faster.service @@ -0,0 +1,20 @@ +# Author : Gaston Gonzalez +# Date : 30 June 2026 +# Purpose : User systemd unit file for EmComm Tools that starts modem73 +# : in a faster configuration. +# +# Usage: +# Check status : systemctl --user status et-service-modem73-faster +# Start service : systemctl --user start et-service-modem73-faster +# Stop service : systemctl --user stop et-service-modem73-faster +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools modem73 service for faster performance + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-modem73 faster --headless +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.config/systemd/user/et-service-modem73-fastest.service b/overlay/etc/skel/.config/systemd/user/et-service-modem73-fastest.service new file mode 100644 index 0000000..b5cee20 --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-modem73-fastest.service @@ -0,0 +1,20 @@ +# Author : Gaston Gonzalez +# Date : 30 June 2026 +# Purpose : User systemd unit file for EmComm Tools that starts modem73 +# : in a fastest configuration. +# +# Usage: +# Check status : systemctl --user status et-service-modem73-fastest +# Start service : systemctl --user start et-service-modem73-fastest +# Stop service : systemctl --user stop et-service-modem73-fastest +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools modem73 service for fastest performance + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-modem73 fastest --headless +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.config/systemd/user/et-service-modem73-reliability.service b/overlay/etc/skel/.config/systemd/user/et-service-modem73-reliability.service new file mode 100644 index 0000000..28a84ac --- /dev/null +++ b/overlay/etc/skel/.config/systemd/user/et-service-modem73-reliability.service @@ -0,0 +1,20 @@ +# Author : Gaston Gonzalez +# Date : 30 June 2026 +# Purpose : User systemd unit file for EmComm Tools that starts modem73 +# : in a reliability configuration. +# +# Usage: +# Check status : systemctl --user status et-service-modem73-reliability +# Start service : systemctl --user start et-service-modem73-reliability +# Stop service : systemctl --user stop et-service-modem73-reliability +# Reload this config : systemctl --user daemon-reload + +[Unit] +Description=EmComm Tools modem73 service for reliable performance + +[Service] +ExecStart=/opt/emcomm-tools/bin/et-modem73 reliability --headless +Restart=no + +[Install] +WantedBy=multi-user.target diff --git a/overlay/etc/skel/.conkyrc b/overlay/etc/skel/.conkyrc index 5b55577..cf0a64d 100644 --- a/overlay/etc/skel/.conkyrc +++ b/overlay/etc/skel/.conkyrc @@ -18,33 +18,34 @@ conky.config = { conky.text = [[ ${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}DATE/TIME -${font DejaVu Sans Mono:size=11}${color yellow}${alignc}${time %A, %B %d %Y} +${font DejaVu Sans Mono:size=10}${color yellow}${alignc}${time %A, %B %d %Y} Local: ${alignr}${time %H:%M:%S} UTC: ${alignr}${tztime UTC %H:%M:%S} GPS Time: ${alignr}${execpi 30 et-system-info et-time} ${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}SYSTEM -${font DejaVu Sans Mono:size=11}${color yellow}Uptime : ${uptime} +${font DejaVu Sans Mono:size=10}${color yellow}Uptime : ${uptime} CPU Util : ${cpu}% Disk Free: ${fs_free /} ${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}NETWORK -${font DejaVu Sans Mono:size=11}${color yellow}IP: ${execpi 60 /opt/emcomm-tools/bin/et-system-info ip} +${font DejaVu Sans Mono:size=10}${color yellow}IP: ${execpi 60 /opt/emcomm-tools/bin/et-system-info ip} ${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}INTERFACES -${font DejaVu Sans Mono:size=11}${color yellow}Radio: ${execpi 10 et-system-info active-radio} +${font DejaVu Sans Mono:size=10}${color yellow}Radio: ${execpi 10 et-system-info active-radio} CAT : ${execpi 10 et-system-info et-cat} GPS : ${execpi 10 et-system-info et-gps} Audio: ${execpi 10 et-system-info et-audio} -${if_existing /dev/et-sdr}SDR : ${execpi 10 et-system-info et-sdr}${endif} +SDR : ${execpi 10 et-system-info et-sdr} +LoRa : ${execpi 10 et-system-info et-lora} ${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} +${font DejaVu Sans Mono:size=10}${color yellow}Callsign: ${execpi 10 et-system-info callsign} Grid : ${execpi 10 et-system-info grid} ${font DejaVu Sans:bold:size=10}${color white}${alignc}MODE -${font DejaVu Sans:bold:size=11}${color red}${alignc}${execpi 10 et-system-info et-mode} +${font DejaVu Sans:bold:size=10}${color red}${alignc}${execpi 10 et-system-info et-mode} -${font DejaVu Sans:bold:size=9}${color grey}${alignc}${execp /opt/emcomm-tools/bin/et-system-info release} +${font DejaVu Sans:bold:size=8}${color grey}${alignc}${execp /opt/emcomm-tools/bin/et-system-info release} ]]; diff --git a/overlay/etc/skel/.nomadnetwork/config b/overlay/etc/skel/.nomadnetwork/config new file mode 100644 index 0000000..edb48ca --- /dev/null +++ b/overlay/etc/skel/.nomadnetwork/config @@ -0,0 +1,334 @@ +# This is the default Nomad Network config file. +# You should probably edit it to suit your needs and use-case, + +[logging] +# Valid log levels are 0 through 7: +# 0: Log only critical information +# 1: Log errors and lower log levels +# 2: Log warnings and lower log levels +# 3: Log notices and lower log levels +# 4: Log info and lower (this is the default) +# 5: Verbose logging +# 6: Debug logging +# 7: Extreme logging + +loglevel = 4 +destination = file + +[client] + +enable_client = yes +user_interface = text +downloads_path = ~/Downloads +notify_on_new_message = yes + +# By default, the peer is announced at startup +# to let other peers reach it immediately. +announce_at_start = yes + +# By default, the client will try to deliver a +# message via the LXMF propagation network, if +# a direct delivery to the recipient is not +# possible. +try_propagation_on_send_fail = yes + +# Nomadnet will periodically sync messages from +# LXMF propagation nodes by default, if any are +# present. You can disable this if you want to +# only sync when manually initiated. +periodic_lxmf_sync = yes + +# The sync interval in minutes. This value is +# equal to 6 hours (360 minutes) by default. +lxmf_sync_interval = 360 + +# By default, automatic LXMF syncs will only +# download 8 messages at a time. You can change +# this number, or set the option to 0 to disable +# the limit, and download everything every time. +lxmf_sync_limit = 8 + +# You can specify a required stamp cost for +# inbound messages to be accepted. Specifying +# a stamp cost will require untrusted senders +# that message you to include a cryptographic +# stamp in their messages. Performing this +# operation takes the sender an amount of time +# proportional to the stamp cost. As a rough +# estimate, a stamp cost of 8 will take less +# than a second to compute, and a stamp cost +# of 20 could take several minutes, even on +# a fast computer. +required_stamp_cost = None + +# You can signal stamp requirements to senders, +# but still accept messages with invalid stamps +# by setting this option to True. +accept_invalid_stamps = False + +# The maximum accepted unpacked size for mes- +# sages received directly from other peers, +# specified in kilobytes. Messages larger than +# this will be rejected before the transfer +# begins. +max_accepted_size = 500 + +# The announce stream will only show one entry +# per destination or node by default. You can +# change this to show as many announces as have +# been received, for every destination. +compact_announce_stream = yes + +[textui] + +# Amount of time to show intro screen +intro_time = 1 + +# You can specify the display theme. +# theme = light +theme = dark + +# Specify the number of colors to use +# valid colormodes are: +# monochrome, 16, 88, 256 and 24bit +# +# The default is a conservative 256 colors. +# If your terminal does not support this, +# you can lower it. Some terminals support +# 24 bit color. + +# colormode = monochrome +# colormode = 16 +# colormode = 88 +colormode = 256 +# colormode = 24bit + +# By default, unicode glyphs are used. If +# you have a Nerd Font installed, you can +# enable this for a better user interface. +# You can also enable plain text glyphs if +# your terminal doesn't support unicode. + +# glyphs = plain +glyphs = unicode +# glyphs = nerdfont + +# You can specify whether mouse events +# should be considered as input to the +# application. On by default. +mouse_enabled = True + +# What editor to use for editing text. +editor = nano + +# If you don't want the Guide section to +# show up in the menu, you can disable it. +hide_guide = no + +[node] + +# Whether to enable node hosting +enable_node = no + +# The node name will be visible to other +# peers on the network, and included in +# announces. +node_name = None + +# Automatic announce interval in minutes. +# 6 hours by default. +announce_interval = 360 + +# Whether to announce when the node starts. +announce_at_start = Yes + +# When Nomad Network is hosting a page-serving +# node, it can also act as an LXMF propagation +# node. This is a convenient feature that lets +# you easily set up and run a propagation node +# on the network, but it is not as fully +# featured as using the lxmd program to host a +# propagation node. For complete control and +# flexibility, use lxmd to run a PN. For a +# small local system or network, the built-in +# PN functionality will suffice for most cases. +# +# If there is already a large amount of +# propagation nodes on the network, or you +# simply want to run a pageserving-only node, +# you should disable running a propagation node. +# Due to lots of propagation nodes being +# available, this is currently the default. + +disable_propagation = Yes + +# For clients and other propagation nodes +# delivering messages via this node, you can +# configure the minimum required propagation +# stamp costs. All messages delivered to the +# propagation node network must have a valid +# propagation stamp, or they will be rejected. +# Clients automatically detect the stamp cost +# for the node they are delivering to, and +# compute a corresponding stamp before trying +# to deliver the message to the propagation +# node. +# +# Propagation stamps are easier to verify in +# large batches, and therefore also somewhat +# easier to compute for the senders. As such, +# a reasonable propagation stamp cost should +# be a bit higher than the normal peer-to-peer +# stamp costs. +# +# Propagation stamps does not incur any extra +# load for propagation nodes processing them, +# since they are only required to verify that +# they are correct, and only the generation +# is computationally costly. Setting a sensible +# propagation stamp cost (and periodically +# checking the average network consensus) helps +# keep spam and misuse out of the propagation +# node network. + +propagation_cost = 16 + +# The maximum amount of storage to use for +# the LXMF Propagation Node message store, +# specified in megabytes. When this limit +# is reached, LXMF will periodically remove +# messages in its message store. By default, +# LXMF prioritises keeping messages that are +# new and small. Large and old messages will +# be removed first. This setting is optional +# and defaults to 2 gigabytes. + +# message_storage_limit = 2000 + +# The maximum accepted transfer size per in- +# coming propagation message, in kilobytes. +# This sets the upper limit for the size of +# single messages accepted onto this node. + +max_transfer_size = 256 + +# The maximum accepted transfer size per in- +# coming propagation node sync. +# +# If a node wants to propagate a larger number +# of messages to this node, than what can fit +# within this limit, it will prioritise sending +# the smallest messages first, and try again +# with any remaining messages at a later point. + +max_sync_size = 10240 + +# You can tell the LXMF message router to +# prioritise storage for one or more +# destinations. If the message store reaches +# the specified limit, LXMF will prioritise +# keeping messages for destinations specified +# with this option. This setting is optional, +# and generally you do not need to use it. + +# prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf + +# You can configure the maximum number of other +# propagation nodes that this node will peer +# with automatically. The default is 20. + +# max_peers = 20 + +# You can configure a list of static propagation +# node peers, that this node will always be +# peered with, by specifying a list of +# destination hashes. + +# static_peers = e17f833c4ddf8890dd3a79a6fea8161d, 5a2d0029b6e5ec87020abaea0d746da4 + +# You can specify the interval in minutes for +# rescanning the hosted pages path. By default, +# this option is disabled, and the pages path +# will only be scanned on startup. + +# page_refresh_interval = 0 + +# You can specify the interval in minutes for +# rescanning the hosted files path. By default, +# this option is disabled, and the files path +# will only be scanned on startup. + +# file_refresh_interval = 0 + +[printing] + +# You can configure Nomad Network to print +# various kinds of information and messages. + +# Printing messages is disabled by default + +print_messages = No + +# You can configure a custom template for +# message printing. If you uncomment this +# option, set a path to the template and +# restart Nomad Network, a default template +# will be created that you can edit. + +# message_template = ~/.nomadnetwork/print_template_msg.txt + +# You can configure Nomad Network to only +# print messages from trusted destinations. + +# print_from = trusted + +# Or specify the source LXMF addresses that +# will automatically have messages printed +# on arrival. + +# print_from = 76fe5751a56067d1e84eef3e88eab85b, 0e70b5848eb57c13154154feaeeb89b7 + +# Or allow printing from anywhere, if you +# are feeling brave and adventurous. + +# print_from = everywhere + +# You can configure the printing command. +# This will use the default CUPS printer on +# your system. + +print_command = lp + +# You can specify what printer to use +# print_command = lp -d [PRINTER_NAME] + +# Or specify more advanced options. This +# example works well for small thermal- +# roll printers: +# print_command = lp -d [PRINTER_NAME] -o cpi=16 -o lpi=8 + +# This one is more suitable for full-sheet +# printers. It will print a QR code at the center of any media +# your printer will accept, print in portrait mode, and move the message to +# the top of the print queue: +# print_command = lp -d [PRINTER_NAME] -o job-priority=100 -o media=Custom.75x75mm -o orientation-requested=3 + +# But you can modify the size to fit your needs. +# The custom media option accepts millimeters, centimeters, and +# inches in a width by length format like so: +# -o media=Custom.[WIDTH]x[LENGTH][mm,cm,in] +# +# The job priority option accepts 1-100, though you can remove it +# entirely if you aren't concerned with a print queue: +# -o job-priority=[1-100] +# +# Finally, the orientation option allows for 90 degree rotations beginning with 3, so: +# -o orientation-requested=4 (landscape, 90 degrees) +# -o orientation-requested=5 (reverse portrait, 180 degrees) +# +# Here is the full command with the recommended customizable variables: +# print_command = lp -d [PRINTER_NAME] -o job-priority=[N] -o media=[MEDIA_SIZE] -o orientation-requested=[N] -o sides=one-sided + +# For example, here's a configuration for USB thermal printer that uses the POS-58 PPD driver +# with rolls 47.98x209.9mm in size: +# print_command = lp -d [PRINTER_NAME] -o job-priority=100 -o media=custom_47.98x209.9mm_47.98x209.9mm -o sides=one-sided diff --git a/overlay/etc/skel/.reticulum/README.md b/overlay/etc/skel/.reticulum/README.md new file mode 100644 index 0000000..ede9738 --- /dev/null +++ b/overlay/etc/skel/.reticulum/README.md @@ -0,0 +1,44 @@ +# Emcomm Tools Configuration for Reticulum + +EmComms Tools provides plug-and-play support to reduce the barrier to +entry for non-technical users. Reticulum is a very powerful tool for +building user-defined networks. This has the effect of allowing for +users to create sophisticated, end-to-end encrypted networks that can +leverage many different transport mediums. While this is powerful, it +has the potential for introducing complexity for new users. + +This document describes the approach that EmComm Tools takes for +supporting plug-and-play support with near-zero configuration. + +## Blueprint Configuration Files + +EmComm Tools uses a _blueprint_ approach for defining a set of reference +network configurations to help new users get started. + +config.blueprint.permanent-transport-node + +## Replacement Tokens + +Replacement tokens are defined by `{{TOKEN}}` where `TOKEN` is one of +the supported tokens below. + +``` +ET_CALLSIGN +ET_RETICULUM_INTERFACE_AUTO_ENABLED +ET_RETICULUM_INTERFACE_AX25KISS_ENABLED +ET_RETICULUM_INTERFACE_MODEM73_ENABLED +ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH +ET_RETICULUM_INTERFACE_RNODE_CODINGRATE +ET_RETICULUM_INTERFACE_RNODE_ENABLED +ET_RETICULUM_INTERFACE_RNODE_FREQUENCY +ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR +ET_RETICULUM_INTERFACE_RNODE_TXPOWER +... +``` + +* Valid characters are capitalized letters (`A-Z`) and underscores (`_`). +* Start with the prefix: `ET_`. +* Reticulum specific tokens start with the prefix: `ET_RETICULUM_`. + + + diff --git a/overlay/etc/skel/.reticulum/config.blueprint.internet-client-only-node b/overlay/etc/skel/.reticulum/config.blueprint.internet-client-only-node new file mode 100644 index 0000000..40cc846 --- /dev/null +++ b/overlay/etc/skel/.reticulum/config.blueprint.internet-client-only-node @@ -0,0 +1,125 @@ +# Author : Gaston Gonzalez +# Date : 18 June 2026 +# Blueprint : Internet client only +# Purpose : This configuration is a blueprint for running a node that +# connects to a gateway node over the Internet using the +# TCPClientInterface. + +[reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = False + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # instance names for each. On platforms supporting domain + # sockets, this can be done with the instance_name option: + + instance_name = default + + +# Some platforms don't support domain sockets, and if that +# is the case, you can isolate different instances by +# specifying a unique set of ports for each: + +# shared_instance_port = 37428 +# instance_control_port = 37429 + + +# If you want to explicitly use TCP for shared instance +# communication, instead of domain sockets, this is also +# possible, by using the following option: + +# shared_instance_type = tcp + + +# You can configure whether Reticulum should discover +# available interfaces from other Transport Instances over +# the network. If this option is enabled, Reticulum will +# collect interface information discovered from the network. + +# discover_interfaces = No + + +# You can configure Reticulum to panic and forcibly close +# if an unrecoverable interface error occurs, such as the +# hardware device for an interface disappearing. This is +# an optional directive, and can be left out for brevity. +# This behaviour is disabled by default. + +# panic_on_interface_error = No + + +# If you're connecting to a large external network, you +# can use one or more external blackhole list to block +# spammy and excessive announces onto your network. This +# funtionality is especially useful if you're hosting public +# entrypoints or gateways. The list source below provides a +# functional example, but better, more timely maintained +# lists probably exist in the community. + +# blackhole_sources = 521c87a83afb8f29e4455e77930b973b + + +[logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + +# The interfaces section defines the physical and virtual +# interfaces Reticulum will use to communicate on. This +# section will contain examples for a variety of interface +# types. You can modify these or use them as a basis for +# your own config, or simply remove the unused ones. + +[interfaces] + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + + [[Default Interface]] + type = AutoInterface + enabled = no + + [[TCP Client to TTP Gateway]] + type = TCPClientInterface + mode = boundary + enabled = yes + target_host = rns.thetechprepper.com + target_port = 11312 + network_name = ttp_internal + passphrase = resistance202606 + diff --git a/overlay/etc/skel/.reticulum/config.blueprint.local-network-only-node b/overlay/etc/skel/.reticulum/config.blueprint.local-network-only-node new file mode 100644 index 0000000..bef0286 --- /dev/null +++ b/overlay/etc/skel/.reticulum/config.blueprint.local-network-only-node @@ -0,0 +1,115 @@ +# Author : Gaston Gonzalez +# Date : 14 June 2026 +# Blueprint : Local network only +# Purpose : This configuration is a blueprint for running a node that +# only interacts with other nodes on the local Ethernet or +# Wi-Fi. + +[reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = False + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # instance names for each. On platforms supporting domain + # sockets, this can be done with the instance_name option: + + instance_name = default + + +# Some platforms don't support domain sockets, and if that +# is the case, you can isolate different instances by +# specifying a unique set of ports for each: + +# shared_instance_port = 37428 +# instance_control_port = 37429 + + +# If you want to explicitly use TCP for shared instance +# communication, instead of domain sockets, this is also +# possible, by using the following option: + +# shared_instance_type = tcp + + +# You can configure whether Reticulum should discover +# available interfaces from other Transport Instances over +# the network. If this option is enabled, Reticulum will +# collect interface information discovered from the network. + +# discover_interfaces = No + + +# You can configure Reticulum to panic and forcibly close +# if an unrecoverable interface error occurs, such as the +# hardware device for an interface disappearing. This is +# an optional directive, and can be left out for brevity. +# This behaviour is disabled by default. + +# panic_on_interface_error = No + + +# If you're connecting to a large external network, you +# can use one or more external blackhole list to block +# spammy and excessive announces onto your network. This +# funtionality is especially useful if you're hosting public +# entrypoints or gateways. The list source below provides a +# functional example, but better, more timely maintained +# lists probably exist in the community. + +# blackhole_sources = 521c87a83afb8f29e4455e77930b973b + + +[logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + +# The interfaces section defines the physical and virtual +# interfaces Reticulum will use to communicate on. This +# section will contain examples for a variety of interface +# types. You can modify these or use them as a basis for +# your own config, or simply remove the unused ones. + +[interfaces] + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + + [[Default Interface]] + type = AutoInterface + enabled = Yes diff --git a/overlay/etc/skel/.reticulum/config.blueprint.modem73-only-node b/overlay/etc/skel/.reticulum/config.blueprint.modem73-only-node new file mode 100644 index 0000000..e3b6e85 --- /dev/null +++ b/overlay/etc/skel/.reticulum/config.blueprint.modem73-only-node @@ -0,0 +1,136 @@ +# Author : Gaston Gonzalez +# Date : 28 June 2026 +# Blueprint : Radio-Only Node, transport disabled +# Purpose : This confguration is a blueprint for a radio-only node. +# It uses modem73 as the radio interface. If a supported +# et-lora device is detected, it will be enabled, too. + +[reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = False + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # instance names for each. On platforms supporting domain + # sockets, this can be done with the instance_name option: + + instance_name = default + +# You can configure whether Reticulum should discover +# available interfaces from other Transport Instances over +# the network. If this option is enabled, Reticulum will +# collect interface information discovered from the network. + +# discover_interfaces = No + + +# You can configure Reticulum to panic and forcibly close +# if an unrecoverable interface error occurs, such as the +# hardware device for an interface disappearing. This is +# an optional directive, and can be left out for brevity. +# This behaviour is disabled by default. + +# panic_on_interface_error = No + + +# If you're connecting to a large external network, you +# can use one or more external blackhole list to block +# spammy and excessive announces onto your network. This +# funtionality is especially useful if you're hosting public +# entrypoints or gateways. The list source below provides a +# functional example, but better, more timely maintained +# lists probably exist in the community. + +# blackhole_sources = 521c87a83afb8f29e4455e77930b973b + + +[logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + +[interfaces] + + [[Default Interface]] + type = AutoInterface + enabled = No + + [[RNode LoRa Interface]] + type = RNodeInterface + mode = roaming + enabled = {{ET_RETICULUM_INTERFACE_RNODE_ENABLED}} + + port = /dev/et-lora + + # Set frequency to 915 MHz + frequency = 915000000 + #frequency = {{ET_RETICULUM_INTERFACE_RNODE_FREQUENCY}} + + # Set LoRa bandwidth to 125 KHz + bandwidth = 125000 + #bandwidth = {{ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH}} + + # Set TX power in dBm + # + # 7 dBm = 5 mW + # 10 dBm = 10 mW + # 14 dBm = 25 mW + # 17 dBm = 50 mW + # 20 dBm = 100 mW + # 22 dBm = 158 mW + # 24 dBm = 251 mW + # 27 dBm = 501 mW + # 28 dBm = 631 mW + # 30 dBm = 1000 mW (1 W) + txpower = {{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}} + + # Select spreading factor 8. Valid + # range is 7 through 12, with 7 + # being the fastest and 12 having + # the longest range. + spreadingfactor = 9 + #spreadingfactor = {{ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR}} + + # Select coding rate 5. Valid range + # is 5 throough 8, with 5 being the + # fastest, and 8 the longest range. + codingrate = 5 + #codingrate = {{ET_RETICULUM_INTERFACE_RNODE_CODINGRATE}} + + [[modem73]] + type = Modem73Interface + mode = roaming + enabled = {{ET_RETICULUM_INTERFACE_MODEM73_ENABLED}} + target_host = 127.0.0.1 + target_port = 8001 + control_host = 127.0.0.1 + control_port = 8073 diff --git a/overlay/etc/skel/.reticulum/config.blueprint.packet-only-node b/overlay/etc/skel/.reticulum/config.blueprint.packet-only-node new file mode 100644 index 0000000..6b47185 --- /dev/null +++ b/overlay/etc/skel/.reticulum/config.blueprint.packet-only-node @@ -0,0 +1,140 @@ +# Author : Gaston Gonzalez +# Date : 7 June 2026 +# Updated : 28 June 2026 +# Blueprint : Radio-Only Node, transport disabled +# Purpose : This confguration is a blueprint for a radio-only node. +# It uses an AX.25 KISS radio interface. If a supported +# et-lora device is detected, it will be enabled, too. + + +[reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = False + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # instance names for each. On platforms supporting domain + # sockets, this can be done with the instance_name option: + + instance_name = default + +# You can configure whether Reticulum should discover +# available interfaces from other Transport Instances over +# the network. If this option is enabled, Reticulum will +# collect interface information discovered from the network. + +# discover_interfaces = No + + +# You can configure Reticulum to panic and forcibly close +# if an unrecoverable interface error occurs, such as the +# hardware device for an interface disappearing. This is +# an optional directive, and can be left out for brevity. +# This behaviour is disabled by default. + +# panic_on_interface_error = No + + +# If you're connecting to a large external network, you +# can use one or more external blackhole list to block +# spammy and excessive announces onto your network. This +# funtionality is especially useful if you're hosting public +# entrypoints or gateways. The list source below provides a +# functional example, but better, more timely maintained +# lists probably exist in the community. + +# blackhole_sources = 521c87a83afb8f29e4455e77930b973b + + +[logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + +[interfaces] + + [[Default Interface]] + type = AutoInterface + enabled = No + + [[Packet Radio AX.25 KISS]] + type = AX25KISSInterface + mode = roaming + enabled = {{ET_RETICULUM_INTERFACE_AX25KISS_ENABLED}} + + callsign = {{ET_CALLSIGN}} + ssid = 1 + + port = /tmp/kisstnc + mtu = 256 + + [[RNode LoRa Interface]] + type = RNodeInterface + mode = roaming + enabled = {{ET_RETICULUM_INTERFACE_RNODE_ENABLED}} + + port = /dev/et-lora + + # Set frequency to 915 MHz + frequency = 915000000 + #frequency = {{ET_RETICULUM_INTERFACE_RNODE_FREQUENCY}} + + # Set LoRa bandwidth to 125 KHz + bandwidth = 125000 + #bandwidth = {{ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH}} + + # Set TX power in dBm + # + # 7 dBm = 5 mW + # 10 dBm = 10 mW + # 14 dBm = 25 mW + # 17 dBm = 50 mW + # 20 dBm = 100 mW + # 22 dBm = 158 mW + # 24 dBm = 251 mW + # 27 dBm = 501 mW + # 28 dBm = 631 mW + # 30 dBm = 1000 mW (1 W) + txpower = {{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}} + + # Select spreading factor 8. Valid + # range is 7 through 12, with 7 + # being the fastest and 12 having + # the longest range. + spreadingfactor = 9 + #spreadingfactor = {{ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR}} + + # Select coding rate 5. Valid range + # is 5 throough 8, with 5 being the + # fastest, and 8 the longest range. + codingrate = 5 + #codingrate = {{ET_RETICULUM_INTERFACE_RNODE_CODINGRATE}} diff --git a/overlay/etc/skel/.reticulum/config.blueprint.permanent-transport-node b/overlay/etc/skel/.reticulum/config.blueprint.permanent-transport-node new file mode 100644 index 0000000..206b869 --- /dev/null +++ b/overlay/etc/skel/.reticulum/config.blueprint.permanent-transport-node @@ -0,0 +1,155 @@ +# Author : Gaston Gonzalez +# Date : 7 June 2026 +# Updated : 15 June 2026 +# Blueprint : Permament Transport Node +# Purpose : This configuration is a blueprint for running a +# node that runs as a 24x7 transport node with +# multiple interfaces. + +[reticulum] + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport = True + + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance = Yes + + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # instance names for each. On platforms supporting domain + # sockets, this can be done with the instance_name option: + + instance_name = default + +# You can configure whether Reticulum should discover +# available interfaces from other Transport Instances over +# the network. If this option is enabled, Reticulum will +# collect interface information discovered from the network. + +# discover_interfaces = No + + +# You can configure Reticulum to panic and forcibly close +# if an unrecoverable interface error occurs, such as the +# hardware device for an interface disappearing. This is +# an optional directive, and can be left out for brevity. +# This behaviour is disabled by default. + +# panic_on_interface_error = No + + +# If you're connecting to a large external network, you +# can use one or more external blackhole list to block +# spammy and excessive announces onto your network. This +# funtionality is especially useful if you're hosting public +# entrypoints or gateways. The list source below provides a +# functional example, but better, more timely maintained +# lists probably exist in the community. + +# blackhole_sources = 521c87a83afb8f29e4455e77930b973b + + +[logging] + # Valid log levels are 0 through 7: + # 0: Log only critical information + # 1: Log errors and lower log levels + # 2: Log warnings and lower log levels + # 3: Log notices and lower log levels + # 4: Log info and lower (this is the default) + # 5: Verbose logging + # 6: Debug logging + # 7: Extreme logging + + loglevel = 4 + + +[interfaces] + + [[Default Interface]] + type = AutoInterface + enabled = Yes + + [[Packet Radio AX.25 KISS]] + type = AX25KISSInterface + mode = ap + enabled = {{ET_RETICULUM_INTERFACE_AX25KISS_ENABLED}} + + callsign = {{ET_CALLSIGN}} + ssid = 1 + + port = /tmp/kisstnc + mtu = 256 + + [[RNode LoRa Interface]] + type = RNodeInterface + mode = ap + enabled = {{ET_RETICULUM_INTERFACE_RNODE_ENABLED}} + + port = /dev/et-lora + #port = tcp://192.168.8.200 + + # Set frequency to 915 MHz + frequency = 915000000 + #frequency = {{ET_RETICULUM_INTERFACE_RNODE_FREQUENCY}} + + # Set LoRa bandwidth to 125 KHz + bandwidth = 125000 + #bandwidth = {{ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH}} + + # Set TX power in dBm + # + # 7 dBm = 5 mW + # 10 dBm = 10 mW + # 14 dBm = 25 mW + # 17 dBm = 50 mW + # 20 dBm = 100 mW + # 22 dBm = 158 mW + # 24 dBm = 251 mW + # 27 dBm = 501 mW + # 28 dBm = 631 mW + # 30 dBm = 1000 mW (1 W) + txpower = {{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}} + + # Select spreading factor 8. Valid + # range is 7 through 12, with 7 + # being the fastest and 12 having + # the longest range. + spreadingfactor = 9 + #spreadingfactor = {{ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR}} + + # Select coding rate 5. Valid range + # is 5 throough 8, with 5 being the + # fastest, and 8 the longest range. + codingrate = 5 + #codingrate = {{ET_RETICULUM_INTERFACE_RNODE_CODINGRATE}} + + # EmComm Tools is designed to be an offline platform, so the + # TCP Client interface is left as an example that user must + # configure. +# [[TCP Client]] +# type = TCPClientInterface +# enabled = Yes +# mode = boundary +# # Set the IP address to the remote TCP Server +# target_host = IP_ADDRESS_HERE +# target_port = 4242 +# # If the remote TCP Server uses IFAC (Interface Access Codes), +# # set the network_name and passphrase. +# #network_name = NETWORK_NAME_HERE +# #passphrase = PASSPHRASE_HERE diff --git a/overlay/etc/skel/Desktop/offline/crypto/gpg-cheatsheet.md b/overlay/etc/skel/Desktop/offline/crypto/gpg-cheatsheet.md index fd1cfca..667c355 100644 --- a/overlay/etc/skel/Desktop/offline/crypto/gpg-cheatsheet.md +++ b/overlay/etc/skel/Desktop/offline/crypto/gpg-cheatsheet.md @@ -122,7 +122,8 @@ standard that provides strong security and works well for radio use due to smaller key sizes. 1. Create a primary key for signing using ECC. Replace FIRSTNAME, - LASTNAME, and EMAIL (keep the < and > characters). + LASTNAME, and EMAIL. NOTE: You MUST keep `<` and `>` characters around + your EMAIL. For example: `John Doe `. gpg --quick-generate-key "FIRSTNAME LASTNAME " ed25519 sign 0 diff --git a/overlay/etc/skel/Desktop/offline/reticulum/ttp-reticulum-setup-notes.md b/overlay/etc/skel/Desktop/offline/reticulum/ttp-reticulum-setup-notes.md new file mode 100644 index 0000000..b291606 --- /dev/null +++ b/overlay/etc/skel/Desktop/offline/reticulum/ttp-reticulum-setup-notes.md @@ -0,0 +1,102 @@ +--- +title: Reticulum Setup Notes +date: 2026-02-13 +updated: 2026-05-11 +author: [The Tech Prepper] +categories: [reticulum] +tags: [reticulum] +--- + +The following are my personal notes while workthrough an initial evaluation +of Reticulum for use over packet radio. + +1. Install Python 3. +``` +sudo apt install \ + python3 \ + python3-pip \ + -y +``` + +2. Add `~/.local/bin` to your PATH. + +3. Install Reticulum as a non-priveleged user. +``` +python3 -m pip install --user rns +``` + +4. Verify that the Reticulum daemon is installed correctly. +``` +which rnsd +``` + +4. Start Reticulum. This will start the service and create an initial + configuration file under `.reticulum/config`. +``` +rnsd +``` + + +5. Stop the service with `+C`. + +6. Edit `~/.reticulum/config` and enable the AX.25 interface by + adding the KISS section below. +``` +[interfaces] + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + + # Default local LAN interface (keep this enabled for testing) + [[Default Interface]] + type = AutoInterface + enabled = No + + [[Packet Radio AX25 KISS]] + type = AX25KISSInterface + enabled = Yes + + callsign = KT7RUN + ssid = 2 + + port = /tmp/kisstnc + mtu = 256 +``` + +7. Start Dire Wolf. In EmComm Tools, run `et-mode` and select + `bbs-client`. + +8. In another terminal, start Reticulum. +``` +rnsd +``` + +If successful, you should see something like the following: +``` +$ rnsd +[2026-02-14 12:59:02] [Notice] Serial port /tmp/kisstnc is now open +[2026-02-14 12:59:02] [Notice] Configuring KISS interface parameters... +[2026-02-14 12:59:02] [Notice] KISS interface configured +[2026-02-14 12:59:02] [Notice] Started rnsd version 1.1.3 +``` + +## Install a Message App + +1. Install NomadNet. +``` +python3 -m pip install --user nomadnet +``` + +2. Start NomadNet. +``` +nomadnet +``` + +## Add Identity + +TODO diff --git a/overlay/etc/udev/rules.d/76-et-lora.rules b/overlay/etc/udev/rules.d/76-et-lora.rules new file mode 100644 index 0000000..1a8c6b7 --- /dev/null +++ b/overlay/etc/udev/rules.d/76-et-lora.rules @@ -0,0 +1,29 @@ +# Author : Gaston Gonzalez +# Date : 14 June 2026 +# Purpose : udev rules for supported LoRa devices +# +# Supported Devices +# 1. Heltec v4 +# 2. Heltec v3 (disabled due to collection with et-radio devices) +# 3. LilyGO TTGO v2.1 +# +# Preconditions: +# 1. LoRa device connected via USB cable +# +# Postconditions: +# 1. /dev/et-lora created + +# Heltec v4 +SUBSYSTEM=="tty", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", ENV{ET_LORA_DEVICE}=="" \ + ACTION=="add", \ + ENV{ET_LORA_DEVICE}="Heltec v4" GROUP="dialout", MODE="0660", SYMLINK+="et-lora" + +# Heltec v3 +# Uses the CP210x so this will collide with radios already supported by et-radio +#SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", \ +# GROUP="dialout", MODE="0660", SYMLINK+="et-lora" + +# LilyGO TTGO v2.1 +SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ENV{ET_LORA_DEVICE}=="" \ + ACTION=="add", \ + ENV{ET_LORA_DEVICE}="LillyGO TTGO v2.1" GROUP="dialout", MODE="0660", SYMLINK+="et-lora" diff --git a/overlay/opt/emcomm-tools/bin/et-common b/overlay/opt/emcomm-tools/bin/et-common index 104e998..7947a30 100755 --- a/overlay/opt/emcomm-tools/bin/et-common +++ b/overlay/opt/emcomm-tools/bin/et-common @@ -1,7 +1,7 @@ #!/bin/bash # Author : Gaston Gonzalez # Date : 1 February 2025 -# Updated : 16 April 2026 +# Updated : 15 June 2026 # Purpose : Common environment variables and functions # Standardized device paths for supported hardware @@ -9,6 +9,7 @@ export ET_DEVICE_AUDIO="/dev/et-audio" export ET_DEVICE_CAT="/dev/et-cat" export ET_DEVICE_GPS="/dev/et-gps" export ET_DEVICE_SDR="/dev/et-sdr" +export ET_DEVICE_LORA="/dev/et-lora" # Standardized configuration locations and files export ET_HOME="/opt/emcomm-tools" diff --git a/overlay/opt/emcomm-tools/bin/et-kill-all b/overlay/opt/emcomm-tools/bin/et-kill-all index ed0b8b3..bea4a3e 100755 --- a/overlay/opt/emcomm-tools/bin/et-kill-all +++ b/overlay/opt/emcomm-tools/bin/et-kill-all @@ -2,9 +2,9 @@ # # Author : Gaston Gonzalez # Date : 12 November 2024 -# Updated : 2 October 2025 -# Purpose : Stops all EmComm Tools sound-based services (i.e. modems) and -# amatuer radio applications to ensure a clean start for the next mode. +# Updated : 29 June 2026 +# Purpose : Stops all EmComm Tools soundcard-based services (i.e. modems) +# and radio applications to ensure a clean start for the next mode. stop_pat() { PS_OUT=$(ps -ef | grep "[p]at http") @@ -28,6 +28,11 @@ stop_all_services() { systemctl --user stop et-service-direwolf-aprs-digipeater systemctl --user stop et-service-direwolf-packet-digipeater + # Stop modem73 with a sledge hammer (belt and suspenders) as the current + # 1.0.7 version can hang on exit. + systemctl --user stop et-service-modem73-default + pkill -9 modem73 + # Stop VARA with a sledge hammer pkill et-winlink pkill et-vara diff --git a/overlay/opt/emcomm-tools/bin/et-mode b/overlay/opt/emcomm-tools/bin/et-mode index 3700d3b..be31cff 100755 --- a/overlay/opt/emcomm-tools/bin/et-mode +++ b/overlay/opt/emcomm-tools/bin/et-mode @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 6 November 2024 -# Updated : 16 March 2026 +# Updated : 14 June 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 diff --git a/overlay/opt/emcomm-tools/bin/et-modem73 b/overlay/opt/emcomm-tools/bin/et-modem73 new file mode 100755 index 0000000..274ea50 --- /dev/null +++ b/overlay/opt/emcomm-tools/bin/et-modem73 @@ -0,0 +1,158 @@ +#!/bin/bash +# +# Author : Gaston Gonzalez +# Date : 30 June 2026 +# Purpose : Wrapper script for starting modem73 with PnP support +# +# Preconditions: +# 1. Supported radio and audio interface are connected and properly detected +# +# Postconditions: +# 1. modem73 started with sane defaults +# +# Notes: +# +# modem73 supports many modulation types and configuration options. To +# keep usage simple, only five modulation settings have been configured +# that map to a combination of reliability and speed for most general +# purpose applications. +# +# In all cases, normal frames and 1/2 coding rate is used. +# +# There are faster speeds, but EmComm Tools has the design goal of +# getting the message through and favoring delivery over speed.. + +MODEM73_CONF_FILE="${HOME}/.config/modem73/settings" + +usage() { + echo "usage: $(basename $0) [options]" + echo " " + echo " reliability - Max reliability (Slower Speed) [BPSK]" + echo " balanced - Balanced (Reliability and Speed) [QPSK] RECOMMENDED" + echo " fast - Fast (Low Reliability) [8PSK]" + echo " faster - Faster (Lower Reliability) [QAM16]" + echo " fastest - Fastest (Lowest Reliability) [QAM64]" + echo "" + echo " [options]" + echo " --headless - Run modem73 headless" +} + +HEADLESS="" +MODE="" +MODE_ARGS="" +CALLSIGN="N0CALL" + +for arg in "$@"; do + case "$arg" in + --headless) + HEADLESS="--headless" + ;; + reliability|balanced|fast|faster|fastest) + if [[ -n "${MODE}" ]]; then + et-log "Only one mode may be specified." + usage + exit 1 + fi + MODE="$arg" + ;; + *) + echo "Unknown argument: $arg" + usage + exit 1 + ;; + esac +done + +if [[ -z "${MODE}" ]]; then + et-log "Can't started modem73. Mode not specified." + usage + exit 1 +fi + +case "${MODE}" in + reliability) + MODE_ARGS="--modulation BPSK --normal --rate 1/2" + ;; + balanced) + MODE_ARGS="--modulation QPSK --normal --rate 1/2" + ;; + fast) + MODE_ARGS="--modulation 8PSK --normal --rate 1/2" + ;; + faster) + MODE_ARGS="--modulation QAM16 --normal --rate 1/2" + ;; + fastest) + MODE_ARGS="--modulation QAM64 --normal --rate 1/2" + ;; +esac + +[[ -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 + + systemctl is-active --quiet rigctld + if [[ $? -ne 0 ]]; then + et-log "Can't start modem73. rigctld not running. Ensure radio is selected." + notify_user "Can't start modem73. rigctld not running." + exit 1 + fi + + ALSA_DEVICE=$(et-system-info et-audio-card) + INPUT_AUDIO=$(modem73 --list-audio | grep input | grep $ALSA_DEVICE | cut -d":" -f3) + OUTPUT_AUDIO=$(modem73 --list-audio | grep output| grep $ALSA_DEVICE | cut -d":" -f3) + + CMD="modem73 --input-device ${INPUT_AUDIO} --output-device ${OUTPUT_AUDIO} --ptt rigctl --callsign ${CALLSIGN} ${MODE_ARGS} ${HEADLESS}" + et-log "Starting modem73 in mode ${MODE} with: '${CMD}'" + echo + ${CMD} + else + et-log "Error configurating modem. Can't start modem73" + exit 1 + fi +} + +update_config () { + + # The modem73 configuration file causes issues when using it in combination with + # command line arguments during manual runs. It is best to remove it before each + # run and drive the modem using only command line arguments. + if [[ -e "${MODEM73_CONF_FILE}" ]]; then + et-log "Removing previous configuration file: ${MODEM73_CONF_FILE}" + rm -v ${MODEM73_CONF_FILE} + fi + + et-log "Attempting to start modem73 in mode: '${MODE}'" + + [[ -z "$ET_USER_CONFIG" ]] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json" + + CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign) + + # 1. Check if the symlink was created by the udev rules + if [[ -e /dev/et-audio ]]; then + + # 2. Check that this device was properly tagged with the ET_AUDIO env variable with a udev rule + APLAY_OUT=$(arecord -l | grep ET_AUDIO) + if [[ $? -eq 0 ]]; then + + # Configure ALSA settings for sound card + /opt/emcomm-tools/bin/et-audio update-config + + else + et-log "No ET_AUDIO device detected." + notify_user "Can't start modem73. No ET_AUDIO device detected." + exit 1 + fi + else + et-log "No ET_AUDIO device plugged in." + notify_user "Can't start modem73. No supported audio device plugged in." + exit 1 + fi + +} + +start diff --git a/overlay/opt/emcomm-tools/bin/et-reticulum b/overlay/opt/emcomm-tools/bin/et-reticulum new file mode 100755 index 0000000..9d57456 --- /dev/null +++ b/overlay/opt/emcomm-tools/bin/et-reticulum @@ -0,0 +1,229 @@ +#!/bin/bash +# +# Author : Gaston Gonzalez +# Date : 12 May 2026 +# Updated : 30 June 2026 +# Purpose : Wrapper script for starting Reticulum with PnP support +# +# Preconditions: +# 1. Supported radio and audio interface are connected and properly detected +# +# Postconditions: +# 1. Reticulum configuration updated +# 2. Optional modem started +# 3. Reticulum started + +# The current version of modem73 does not alway exit. +cleanup() { + pkill -9 modem73 2>/dev/null || true +} + +trap cleanup EXIT INT TERM + +. /opt/emcomm-tools/bin/et-common + +# Ensure that no other modes are running +et-kill-all + +APP="Reticulum" +RETICULUM_CONF_DIR="${HOME}/.reticulum" +RETICULUM_CONF_FILE="${RETICULUM_CONF_DIR}/config" + +INTERFACE_RNODE_TXPOWER_DEFAULT=17 + +options=() +files=() +index=1 + +while IFS= read -r file; do + name=$(basename "$file") + files[$index]="$name" + options+=("$index" "$name") + ((index++)) +done < <(find "${HOME}/.reticulum" -type f -name 'config.blueprint.*' | sort) + +choice=$(dialog \ + --title "Reticulum Configuration" \ + --menu "Choose a blueprint:" \ + 15 60 10 \ + "${options[@]}" \ + 2>&1 >/dev/tty) +EXIT_STATUS=$? + +tput sgr0 && clear + +if [[ ${EXIT_STATUS} -ne 0 ]]; then + et-log "No blueprint configuration selected" + exit ${EXIT_STATUS} +fi + +SELECTED_CONF="${files[$choice]}" + +if [[ ! -e "${RETICULUM_CONF_DIR}" ]]; then + et-log "Creating missing configuration directory: ${RETICULUM_CONF_DIR}" + mkdir -p "${RETICULUM_CONF_DIR}" +fi + +ACTIVE_CONF_FILE="${RETICULUM_CONF_DIR}/${SELECTED_CONF}" +if [[ ! -e ${ACTIVE_CONF_FILE} ]]; then + et-log "${ACTIVE_CONF_FILE} does not exist." + exit 1 +fi + +et-log "Using ${ACTIVE_CONF_FILE}" + +if [[ -e "${RETICULUM_CONF_FILE}" ]]; then + et-log "Removing previous Reticulum configuration: ${RETICULUM_CONF_FILE}" + rm "${RETICULUM_CONF_FILE}" +fi + +et-log "Linking new configuration..." +ln -v -s "${ACTIVE_CONF_FILE}" "${RETICULUM_CONF_FILE}" + +############################################################ +# Optionally, launch a modem if a radio is connected +############################################################ + +# If a supported radio is plugged in and detected, it will have the +# rigctld process running automatically. +IS_RADIO_CONNECTED=`ps -ef | grep [r]igctld` +if [[ $? -eq 0 ]]; then + + et-log "Radio connected and detected." + + modem_options=() + + HAS_PACKET_CONFIG=`grep AX25KISSInterface ~/.reticulum/config` + if [[ $? -eq 0 ]]; then + modem_options+=("1200-packet" "1200 baud packet (VHF/UHF)") + modem_options+=("300-packet" "300 baud packet (HF)") + fi + + HAS_MODEM73_CONFIG=`grep Modem73Interface ~/.reticulum/config` + if [[ $? -eq 0 ]]; then + modem_options+=("modem73-reliability" "Max reliability (Slower Speed) [BPSK]") + modem_options+=("modem73-balanced" "Balanced (Reliability and Speed) [QPSK] RECOMENDED") + modem_options+=("modem73-fast" "Fast (Low Reliability) [8PSK]") + modem_options+=("modem73-faster" "Faster (Lower Reliability) [QAM16]") + modem_options+=("modem73-fastest" "Fastest (Lowest Reliability) [QAM64]") + fi + + modem_choice=$(dialog \ + --clear \ + --title "Reticulum Configuration" \ + --menu "Select a modem" \ + 13 70 10 \ + "${modem_options[@]}" \ + 2>&1 >/dev/tty) + + dialog \ + --title "Note on Reticulum" \ + --yesno "Reticulum uses end-to-end encryption. Check your local laws and regulations and ensure that you can legally run this mode! Are you sure that you want to run this?" \ + 0 0 + EXIT_STATUS=$? + + tput sgr 0 && clear + + if [[ ${EXIT_STATUS} -ne 0 ]]; then + et-log "User canceled modem selection. Packet modem will not be started and interface will not be enabled." + else + case ${modem_choice} in + 300-packet) + et-log "Starting 300 baud packet modem" + start_and_wait_for_service et-service-direwolf-300 + ;; + 1200-packet) + et-log "Starting 1200 baud packet modem" + start_and_wait_for_service et-service-direwolf-simple + ;; + modem73-reliability) + et-log "Starting modem73 in reliability mode" + start_and_wait_for_service et-service-modem73-reliability + ;; + modem73-balanced) + et-log "Starting modem73 in balanced mode" + start_and_wait_for_service et-service-modem73-default + ;; + modem73-fast) + et-log "Starting modem73 in fast mode" + start_and_wait_for_service et-service-modem73-fast + ;; + modem73-faster) + et-log "Starting modem73 in faster mode" + start_and_wait_for_service et-service-modem73-faster + ;; + modem73-fastest) + et-log "Starting modem73 in fastest mode" + start_and_wait_for_service et-service-modem73-fastest + ;; + *) + et-log "No modem specified" + ;; + esac + fi +fi + +et-log "Updating configuration for this session..." + +############################################################ +# MODEM73 interface updates +############################################################ + +# Enable/disable intereface based on PnP device detection +IS_MODEM73_RUNNING=`ps -ef | grep [m]odem73` +if [[ $? -eq 0 ]]; then + INTERFACE_MODEM73_ENABLED="yes" +else + INTERFACE_MODEM73_ENABLED="no" +fi +sed -i "s|{{ET_RETICULUM_INTERFACE_MODEM73_ENABLED}}|${INTERFACE_MODEM73_ENABLED}|g" ${RETICULUM_CONF_FILE} + +############################################################ +# AX.25 KISS (Packet Radio) interface updates +############################################################ + +# Enable/disable intereface based on PnP device detection +if [[ -e /tmp/kisstnc ]]; then + INTERFACE_AX25KISS_ENABLED="yes" +else + INTERFACE_AX25KISS_ENABLED="no" +fi +sed -i "s|{{ET_RETICULUM_INTERFACE_AX25KISS_ENABLED}}|${INTERFACE_AX25KISS_ENABLED}|g" ${RETICULUM_CONF_FILE} + +# Update callsign +[[ -z "$ET_USER_CONFIG" ]] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json" +CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign) +sed -i "s|{{ET_CALLSIGN}}|${CALLSIGN}|g" ${RETICULUM_CONF_FILE} + + +############################################################ +# RNode (LoRA) interface updates +############################################################ + +# Enable/disable intereface based on PnP device detection +if [[ -e "${ET_DEVICE_LORA}" ]]; then + INTERFACE_RNODE_ENABLED="yes" + + # Determine max power settings + et-log "Connecting to device to determine max power..." + + INTERFACE_RNODE_TXPOWER=`rnodeconf -i ${ET_DEVICE_LORA} | awk -F': ' '/Max TX power/ {print $2}' | awk '{print $1}'` + if [[ $? -ne 0 ]]; then + INTERFACE_RNODE_TXPOWER=${INTERFACE_RNODE_TXPOWER_DEFAULT} + et-log "Can't determine max power. Using defaulting ${INTERFACE_RNODE_TXPOWER}." + fi + + et-log "Setting max power to ${INTERFACE_RNODE_TXPOWER} dBm." + sed -i "s|{{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}}|${INTERFACE_RNODE_TXPOWER}|g" ${RETICULUM_CONF_FILE} + +else + INTERFACE_RNODE_ENABLED="no" +fi + +sed -i "s|{{ET_RETICULUM_INTERFACE_RNODE_ENABLED}}|${INTERFACE_RNODE_ENABLED}|g" ${RETICULUM_CONF_FILE} + + +CMD="rnsd" +et-log "Starting Reticulum: ${CMD}" + +${CMD} diff --git a/overlay/opt/emcomm-tools/bin/et-system-info b/overlay/opt/emcomm-tools/bin/et-system-info index dfcdd69..d748d77 100755 --- a/overlay/opt/emcomm-tools/bin/et-system-info +++ b/overlay/opt/emcomm-tools/bin/et-system-info @@ -3,7 +3,7 @@ # Author : Gaston Gonzalez # Author : William McKeehan # Date : 6 October 2024 -# Updated : 5 September 2025 +# Updated : 14 June 2025 # Purpose : Utility script for dumping system information function usage() { @@ -13,6 +13,7 @@ function usage() { echo " et-audio - Show state of audio interface" echo " et-audio-card - Display audio card and device: ," echo " et-cat - Show state of CAT control interface" + echo " et-lora - Show state of LoRa interface" echo " et-gps - Show state of GPS interface" echo " et-time - Show if time is synched via GPS" echo " et-mode - Show current mode" @@ -143,6 +144,15 @@ case $1 in fi ;; + et-lora) + # 1. Check if the symlink was created by the udev rules + if [ -e /dev/et-lora ]; then + echo "Connected"; + else + echo "Not connected"; + fi + + ;; et-sdr) # 1. Check if the symlink was created by the udev rules if [ -e /dev/et-sdr ]; then diff --git a/overlay/usr/share/applications/meshchat.desktop b/overlay/usr/share/applications/meshchat.desktop new file mode 100644 index 0000000..c0f6e9b --- /dev/null +++ b/overlay/usr/share/applications/meshchat.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Version=1.0 +Name=MeshChat +Comment=MeshChat +Exec=/opt/emcomm-tools/bin/et-meshchat +Icon=/opt/ReticulumMeshChat/logo-chat-bubble.png +Terminal=false +X-MultipleArgs=false +Type=Application +Categories=Radio; +StartupNotify=true diff --git a/scripts/debrand.sh b/scripts/debrand.sh index 8de1229..8d1bcf0 100755 --- a/scripts/debrand.sh +++ b/scripts/debrand.sh @@ -1,14 +1,24 @@ #!/bin/bash # Author : Gaston Gonzalez # Date : 7 May 2026 -# Updated : 11 May 2026 +# Updated : 12 May 2026 # Purpose : Debrand Ubuntu # # Post Conditions: -# 1. Plymouth splash screen displays on Live USB boot +# 1. EmComm Tools splash screen displays on Live USB boot +# 2. Installer shows EmComm Tools slideshow et-log "Debranding Ubuntu..." +et-log "Customizing Installer..." +apt install \ + ubiquity-slideshow-ubuntu \ + -y +cp -v -r ../overlay/usr/share/ubiquity-slideshow/* /usr/share/ubiquity-slideshow + +et-log "Customizing boot screen..." +cp -v -r ../overlay/usr/share/plymouth/* /usr/share/plymouth + # A new kernel is required as the initramfs that Cubic uses is # based on the base ISO by default. et-log "Installing latest kernel..." diff --git a/scripts/install-meshchat.sh b/scripts/install-meshchat.sh new file mode 100755 index 0000000..39d078c --- /dev/null +++ b/scripts/install-meshchat.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# Author : Gaston Gonzalez +# Date : 13 May 2026 +# Updated : 23 June 2026 +# Purpose : Install MeshChat for Reticulum +set -e +trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG +trap 'et-log "\"${last_command}\" command failed with exit code $?."' ERR + +. ./env.sh +. ../overlay/opt/emcomm-tools/bin/et-common + +APP=ReticulumMeshChat +VERSION="2.3.0-R7B7" +INSTALL_DIR="/opt/${APP}-${VERSION}" +INSTALL_BIN_DIR="${INSTALL_DIR}/bin" +LINK_PATH="/opt/${APP}" + +DOWNLOAD_FILE="${APP}-v${VERSION}-linux.AppImage" +URL="https://github.com/thetechprepper/reticulum-meshchat/releases/download/${VERSION}/ReticulumMeshChat-v${VERSION}-linux.AppImage" + +et-log "Installing ${APP} ${VERSION}..." + +if [[ ! -e ${DOWNLOAD_FILE} ]]; then + download_with_retries ${URL} ${DOWNLOAD_FILE} +fi + +chmod -v 755 ${DOWNLOAD_FILE} + +[[ ! -e "${INSTALL_BIN_DIR}" ]] && mkdir -v -p "${INSTALL_BIN_DIR}" + +mv ${DOWNLOAD_FILE} ${INSTALL_BIN_DIR} + +ET_WRAPPER_SCRIPT="${ET_HOME}/bin/et-meshchat" + +et-log "Creating wrapper script: ${ET_WRAPPER_SCRIPT}" +cat < ${ET_WRAPPER_SCRIPT} +#!/bin/bash + +${INSTALL_BIN_DIR}/${DOWNLOAD_FILE} +EOF + +chmod -v 755 ${ET_WRAPPER_SCRIPT} + +ICON=logo-chat-bubble.png +ICON_URL="https://raw.githubusercontent.com/thetechprepper/reticulum-meshchat/master/logo/${ICON}" +download_with_retries ${ICON_URL} ${ICON} +mv ${ICON} ${INSTALL_DIR} + +cp ../overlay/usr/share/applications/meshchat.desktop /usr/share/applications + +[[ -e ${LINK_PATH} ]] && rm ${LINK_PATH} +ln -s ${INSTALL_DIR} ${LINK_PATH} + +stow -v -d /opt ${APP} -t /usr/local diff --git a/scripts/install-modem73.sh b/scripts/install-modem73.sh new file mode 100755 index 0000000..46df0bf --- /dev/null +++ b/scripts/install-modem73.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Author : Gaston Gonzalez +# Date : 28 June 2026 +# Purpose : Installs modem73 +set -e +trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG +trap 'et-log "\"${last_command}\" command failed with exit code $?."' ERR + +. ./env.sh +. ../overlay/opt/emcomm-tools/bin/et-common + +APP="modem73" +VERSION="1.0.7" +APP_AND_VERSION="${APP}-${VERSION}" +GIT_URL="https://github.com/thetechprepper/modem73.git" +GIT_WORKSPACE="modem73" +INSTALL_DIR="/opt/${APP_AND_VERSION}" +INSTALL_BIN_DIR="${INSTALL_DIR}/bin" +LINK_PATH="/opt/${APP}" + +et-log "Installing ${APP} dependencies..." +apt install \ + libncurses-dev \ + -y + +et-log "Installing ${APP} ${VERSION}" + +CWD_DIR=`pwd` + +cd ${ET_SRC_DIR} +[[ ! -e ${GIT_WORKSPACE} ]] && git clone --branch emcomm-tools --single-branch ${GIT_URL} + +cd ${GIT_WORKSPACE} +make + +[[ ! -e "${INSTALL_BIN_DIR}" ]] && mkdir -v -p "${INSTALL_BIN_DIR}" +[[ -e "${APP}" ]] && cp ${APP} "${INSTALL_BIN_DIR}" + + +[[ -e ${LINK_PATH} ]] && rm ${LINK_PATH} +ln -v -s ${INSTALL_DIR} ${LINK_PATH} + +stow -v -d /opt ${APP} -t /usr/local + +cd ${CWD} + + +et-log "Enabling modem73 interface..." + +INTERFACE_FILE=Modem73Interface.py +INTERFACE_DIR=/etc/skel/.reticulum/interfaces + +download_with_retries https://raw.githubusercontent.com/thetechprepper/modem73interface/refs/heads/master/Modem73Interface.py ${INTERFACE_FILE} + +[[ ! -e ${INTERFACE_DIR} ]] && mkdir -v -p ${INTERFACE_DIR} +mv -v ${INTERFACE_FILE} /etc/skel/.reticulum/interfaces + diff --git a/scripts/install-offline-lib.json b/scripts/install-offline-lib.json index 606ff6f..444ea6d 100644 --- a/scripts/install-offline-lib.json +++ b/scripts/install-offline-lib.json @@ -9,6 +9,16 @@ "file": "bpq-user-and-sysop-commands.pdf", "dir": "bbs/bpq" }, + { + "url": "https://resource.heltec.cn/download/WiFi_LoRa_32_V3/HTIT-WB32LA_V3.2.pdf", + "file": "HTIT-WB32LA_V3.2.pdf", + "dir": "lora/heltec" + }, + { + "url": "https://resource.heltec.cn/download/WiFi_LoRa_32_V4/datasheet/WiFi_LoRa_32_V4.2.0.pdf", + "file": "WiFi_LoRa_32_V4.2.0.pdf", + "dir": "lora/heltec" + }, { "url": "https://www.icomamerica.com/api/download.php?page_id=171&fl=JTJGdXBsb2FkcyUyRlVTQV9CYW5kX1BsYW4lMkZCYW5kX1BsYW5fTWFwJTJGQW1hdHVlckdyaWRTcXVhcmVNYXBfVVNBJTVCMTMlNUQucGRm", "file": "icom-us-grid.pdf", @@ -38,5 +48,15 @@ "url": "https://www.swpc.noaa.gov/sites/default/files/images/NOAAscales.pdf", "file": "NOAAscales.pdf", "dir": "space-weather" + }, + { + "url": "https://reticulum.betweentheborders.com/primer.pdf", + "file": "primer.pdf", + "dir": "reticulum" + }, + { + "url": "https://github.com/markqvist/Reticulum/releases/download/1.2.5/Reticulum.Manual.pdf", + "file": "Reticulum.Manual.pdf", + "dir": "reticulum" } ] diff --git a/scripts/install-pfte.sh b/scripts/install-pfte.sh index e26464f..348fb07 100755 --- a/scripts/install-pfte.sh +++ b/scripts/install-pfte.sh @@ -1,6 +1,7 @@ #!/bin/bash # Author : Gaston Gonzalez # Date : 27 March 2026 +# Updated : 15 June 2026 # Purpose : Install Paranoia File & Text Encryption set -e @@ -18,7 +19,7 @@ et-log "Installing ${APP} ${VERSION}..." if [[ ! -e ${ET_DIST_DIR}/${DOWNLOAD_FILE} ]]; then - URL="https://paranoiaworks.mobi/download/files/${DOWNLOAD_FILE}" + URL="https://paranoiaworks.com/download/pfte_15.0.8-1_amd64.deb" download_with_retries ${URL} ${DOWNLOAD_FILE} mv ${DOWNLOAD_FILE} ${ET_DIST_DIR} diff --git a/scripts/install-reticulum.sh b/scripts/install-reticulum.sh new file mode 100755 index 0000000..a3b3f8f --- /dev/null +++ b/scripts/install-reticulum.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Author : Gaston Gonzalez +# Date : 13 February 2026 +# Updated : 23 June 2026 +# Purpose : Install Reticulum + +RNS_VERSION=1.3.5 + +et-log "Installing Python3..." +apt install \ + python3 \ + python3-pip \ + -y + +et-log "Downloading rns ${RNS_VERSION} for offline install..." +python3 -m pip download -d wheelhouse rns==${RNS_VERSION} + +#et-log "Downloading nomadnet for offline install..." +#python3 -m pip download -d wheelhouse + +et-log "Installing Reticulum for single user use..." +PYTHONUSERBASE=/etc/skel/.local \ + python3 -m pip install --user \ + --no-index --find-links=wheelhouse \ + rns==${RNS_VERSION} + +#et-log "Removing wheelhouse to save space..." +#[[ -e wheelhouse ]] && rm -vrf wheelhouse diff --git a/scripts/install.sh b/scripts/install.sh index e09c6fb..81aee52 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -2,7 +2,7 @@ # # Author : Gaston Gonzalez # Date : 16 March 2024 -# Updated : 7 May 2026 +# Updated : 28 June 2026 # Purpose : Main installer for EmComm Tools Community (ETC) . ./env.sh @@ -119,5 +119,10 @@ exitIfNotRoot # Security Patches ./patch-copy-fail.sh +# Install Reticulum and related applications +./install-reticulum.sh +./install-meshchat.sh +./install-modem73.sh + # Debrand Ubuntu ./debrand.sh diff --git a/tests/test-modem73.sh b/tests/test-modem73.sh new file mode 100755 index 0000000..753791e --- /dev/null +++ b/tests/test-modem73.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Author : Gaston Gonzalez +# Date : 28 June 2026 +# Purpose : Test modem73 installation + +OUT=$(which modem73) +exit $? diff --git a/tests/test-rnsd.sh b/tests/test-rnsd.sh new file mode 100755 index 0000000..c762f5b --- /dev/null +++ b/tests/test-rnsd.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Author : Gaston Gonzalez +# Date : 11 April 2025 +# Purpose : Test Reticulum installation + +OUT=$(PYTHONUSERBASE=/etc/skel/.local /etc/skel/.local/bin/rnsd --version) +exit $?