mirror of
https://github.com/thetechprepper/emcomm-tools-os-community.git
synced 2026-09-17 15:41:44 -04:00
+12
-2
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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}
|
||||
]];
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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_`.
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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}}
|
||||
@@ -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
|
||||
@@ -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 <john.doe@email.com>`.
|
||||
|
||||
gpg --quick-generate-key "FIRSTNAME LASTNAME <EMAIL>" ed25519 sign 0
|
||||
|
||||
|
||||
@@ -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 `<CTRL>+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
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Executable
+158
@@ -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) <mode> [options]"
|
||||
echo " <mode>"
|
||||
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
|
||||
Executable
+229
@@ -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}
|
||||
@@ -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: <card>,<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
|
||||
|
||||
@@ -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
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,15 @@
|
||||
<div class="header"><h1 class="slidetitle">Offline Aircraft Tracking</h1></div>
|
||||
|
||||
<div class="main">
|
||||
|
||||
<div class="text">
|
||||
|
||||
<div>
|
||||
<p>et-aircraft provides offline aircraft tracking using supported SDRs like the RTL-SDR. There is no need for an Internet connection. Just plug in your SDR and click the airplane icon on the desktop.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<img class="screenshot" src="screenshots/et-aircraft.png" />
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,15 @@
|
||||
<div class="header"><h1 class="slidetitle">Radio Email</h1></div>
|
||||
|
||||
<div class="main">
|
||||
|
||||
<div class="text">
|
||||
|
||||
<div>
|
||||
<p>et-mail provides a streamlined experience for radio based email by taking the guesswork out of which Winlink stations to connect to by incorporating real-time, offline HF prediction. It supports switching transport modes (AX.25, ardop, VARA) with zero configuration and without leaving the application.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<img class="screenshot" src="screenshots/et-mail.png" />
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,15 @@
|
||||
<div class="header"><h1 class="slidetitle">Offline HF Prediction</h1></div>
|
||||
|
||||
<div class="main">
|
||||
|
||||
<div class="text">
|
||||
|
||||
<div>
|
||||
<p>et-predict provides offline HF propagation prediction powered by VOACAP, helping operators take the guesswork out of establishing targeted contacts.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<img class="screenshot" src="screenshots/et-predict.png" />
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,46 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>ubiquity-slideshow-ubuntu</title>
|
||||
|
||||
<link href="link/base.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<base target="_blank" />
|
||||
|
||||
<script type="text/javascript" src="link-core/jquery.js"></script>
|
||||
<script type="text/javascript" src="link-core/jquery.cycle.all.js"></script>
|
||||
|
||||
<script type="text/javascript" src="link-core/base.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
SLIDESHOW_OPTIONS = {
|
||||
timeout:50000,
|
||||
speed:600,
|
||||
}
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="link-core/slideshow.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="wrapper">
|
||||
<div id="slideshow">
|
||||
<div><a href="welcome.html"></a></div>
|
||||
<div><a href="et-predict.html"></a></div>
|
||||
<div><a href="et-mail.html"></a></div>
|
||||
<div><a href="et-aircraft.html"></a></div>
|
||||
</div>
|
||||
|
||||
<div id="controls">
|
||||
<a class="control-arrow" id="prev-slide" style="display:none;"></a>
|
||||
<a class="control-arrow" id="next-slide"></a>
|
||||
<input type="hidden" id="current-slide" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 107 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
@@ -0,0 +1,15 @@
|
||||
<div class="header"><h1 class="slidetitle">Welcome to EmComm Tools</h1></div>
|
||||
|
||||
<div class="main wide">
|
||||
|
||||
<div class="text">
|
||||
|
||||
<div>
|
||||
<p>Built for off-grid communications and field operations, EmComm Tools provides a ready-to-use environment focused on radio, preparedness, and resilient computing. Here are just a few of the tools and capabilities included in this release.</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<img class="background" src="links/background.png" />
|
||||
|
||||
</div>
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 7 May 2026
|
||||
# Updated : 12 May 2026
|
||||
# Purpose : Debrand Ubuntu
|
||||
#
|
||||
# Post Conditions:
|
||||
# 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..."
|
||||
apt install \
|
||||
--reinstall \
|
||||
linux-headers-generic \
|
||||
linux-image-generic \
|
||||
-y
|
||||
|
||||
# Note: Ensure you select the new kernel on the "Options" screen
|
||||
# within your Cubic session.
|
||||
et-log "Rebuilding initramfs..."
|
||||
update-initramfs -uk all
|
||||
Executable
+55
@@ -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 <<EOF > ${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
|
||||
Executable
+57
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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}
|
||||
|
||||
Executable
+28
@@ -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
|
||||
+9
-1
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 16 March 2024
|
||||
# Updated : 2 May 2026
|
||||
# Updated : 28 June 2026
|
||||
# Purpose : Main installer for EmComm Tools Community (ETC)
|
||||
|
||||
. ./env.sh
|
||||
@@ -118,3 +118,11 @@ 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
|
||||
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
# Author : Gaston Gonzalez
|
||||
# Date : 28 June 2026
|
||||
# Purpose : Test modem73 installation
|
||||
|
||||
OUT=$(which modem73)
|
||||
exit $?
|
||||
Executable
+7
@@ -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 $?
|
||||
Reference in New Issue
Block a user