mirror of
https://github.com/thetechprepper/emcomm-tools-os-community.git
synced 2026-09-17 15:41:44 -04:00
Merge pull request #105 from thetechprepper/feature/reticulum
feature/reticulum
This commit is contained in:
+12
-2
@@ -1,7 +1,7 @@
|
|||||||
# ETC Regression Tests
|
# ETC Regression Tests
|
||||||
|
|
||||||
- **Build**: ETC R7 Build 1
|
- **Build**: ETC R7 Build 5
|
||||||
- **Date**: 16 April 2026
|
- **Date**: 14 June 2026
|
||||||
|
|
||||||
## Desktop/Launcher Icons
|
## Desktop/Launcher Icons
|
||||||
|
|
||||||
@@ -83,6 +83,7 @@
|
|||||||
* [ ] Select RMS gateway => VFO updated
|
* [ ] Select RMS gateway => VFO updated
|
||||||
* [ ] Connect
|
* [ ] Connect
|
||||||
* [ ] wwv
|
* [ ] wwv
|
||||||
|
* [ ] reticulum
|
||||||
|
|
||||||
## Bluetooth TNC
|
## Bluetooth TNC
|
||||||
|
|
||||||
@@ -141,3 +142,12 @@
|
|||||||
* [ ] `offline` folder on Desktop
|
* [ ] `offline` folder on Desktop
|
||||||
* [ ] Check `nets` folder for `amrron` and `ghostnet`
|
* [ ] Check `nets` folder for `amrron` and `ghostnet`
|
||||||
* [ ] Test gpg signature verifcation (see gpg crypto doc)
|
* [ ] 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
|
# Updated : 16 April 2026
|
||||||
# Description : bash profile
|
# Description : bash profile
|
||||||
|
|
||||||
|
export PATH="$HOME/.local/bin:$PATH"
|
||||||
|
|
||||||
# All user accounts should be in the 'et-data' group to allow data sharing with
|
# 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
|
# EmComm Tools. A umask of 002 is required to allow users and the system to
|
||||||
# read and write shared data files.
|
# 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 = [[
|
conky.text = [[
|
||||||
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}DATE/TIME
|
${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}
|
Local: ${alignr}${time %H:%M:%S}
|
||||||
UTC: ${alignr}${tztime UTC %H:%M:%S}
|
UTC: ${alignr}${tztime UTC %H:%M:%S}
|
||||||
GPS Time: ${alignr}${execpi 30 et-system-info et-time}
|
GPS Time: ${alignr}${execpi 30 et-system-info et-time}
|
||||||
|
|
||||||
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}SYSTEM
|
${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}%
|
CPU Util : ${cpu}%
|
||||||
Disk Free: ${fs_free /}
|
Disk Free: ${fs_free /}
|
||||||
|
|
||||||
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}NETWORK
|
${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: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}
|
CAT : ${execpi 10 et-system-info et-cat}
|
||||||
GPS : ${execpi 10 et-system-info et-gps}
|
GPS : ${execpi 10 et-system-info et-gps}
|
||||||
Audio: ${execpi 10 et-system-info et-audio}
|
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: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}
|
Grid : ${execpi 10 et-system-info grid}
|
||||||
|
|
||||||
${font DejaVu Sans:bold:size=10}${color white}${alignc}MODE
|
${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.
|
due to smaller key sizes.
|
||||||
|
|
||||||
1. Create a primary key for signing using ECC. Replace FIRSTNAME,
|
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
|
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
|
#!/bin/bash
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 1 February 2025
|
# Date : 1 February 2025
|
||||||
# Updated : 16 April 2026
|
# Updated : 15 June 2026
|
||||||
# Purpose : Common environment variables and functions
|
# Purpose : Common environment variables and functions
|
||||||
|
|
||||||
# Standardized device paths for supported hardware
|
# 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_CAT="/dev/et-cat"
|
||||||
export ET_DEVICE_GPS="/dev/et-gps"
|
export ET_DEVICE_GPS="/dev/et-gps"
|
||||||
export ET_DEVICE_SDR="/dev/et-sdr"
|
export ET_DEVICE_SDR="/dev/et-sdr"
|
||||||
|
export ET_DEVICE_LORA="/dev/et-lora"
|
||||||
|
|
||||||
# Standardized configuration locations and files
|
# Standardized configuration locations and files
|
||||||
export ET_HOME="/opt/emcomm-tools"
|
export ET_HOME="/opt/emcomm-tools"
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
#
|
#
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 12 November 2024
|
# Date : 12 November 2024
|
||||||
# Updated : 2 October 2025
|
# Updated : 29 June 2026
|
||||||
# Purpose : Stops all EmComm Tools sound-based services (i.e. modems) and
|
# Purpose : Stops all EmComm Tools soundcard-based services (i.e. modems)
|
||||||
# amatuer radio applications to ensure a clean start for the next mode.
|
# and radio applications to ensure a clean start for the next mode.
|
||||||
|
|
||||||
stop_pat() {
|
stop_pat() {
|
||||||
PS_OUT=$(ps -ef | grep "[p]at http")
|
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-aprs-digipeater
|
||||||
systemctl --user stop et-service-direwolf-packet-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
|
# Stop VARA with a sledge hammer
|
||||||
pkill et-winlink
|
pkill et-winlink
|
||||||
pkill et-vara
|
pkill et-vara
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 6 November 2024
|
# Date : 6 November 2024
|
||||||
# Updated : 16 March 2026
|
# Updated : 14 June 2026
|
||||||
# Purpose : Configures the system for a specific mode of operation
|
# Purpose : Configures the system for a specific mode of operation
|
||||||
|
|
||||||
# Use a simple text file to save the state of the last mode selected
|
# 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 : Gaston Gonzalez
|
||||||
# Author : William McKeehan
|
# Author : William McKeehan
|
||||||
# Date : 6 October 2024
|
# Date : 6 October 2024
|
||||||
# Updated : 5 September 2025
|
# Updated : 14 June 2025
|
||||||
# Purpose : Utility script for dumping system information
|
# Purpose : Utility script for dumping system information
|
||||||
|
|
||||||
function usage() {
|
function usage() {
|
||||||
@@ -13,6 +13,7 @@ function usage() {
|
|||||||
echo " et-audio - Show state of audio interface"
|
echo " et-audio - Show state of audio interface"
|
||||||
echo " et-audio-card - Display audio card and device: <card>,<device>"
|
echo " et-audio-card - Display audio card and device: <card>,<device>"
|
||||||
echo " et-cat - Show state of CAT control interface"
|
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-gps - Show state of GPS interface"
|
||||||
echo " et-time - Show if time is synched via GPS"
|
echo " et-time - Show if time is synched via GPS"
|
||||||
echo " et-mode - Show current mode"
|
echo " et-mode - Show current mode"
|
||||||
@@ -143,6 +144,15 @@ case $1 in
|
|||||||
fi
|
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)
|
et-sdr)
|
||||||
# 1. Check if the symlink was created by the udev rules
|
# 1. Check if the symlink was created by the udev rules
|
||||||
if [ -e /dev/et-sdr ]; then
|
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
|
||||||
+12
-2
@@ -1,14 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 7 May 2026
|
# Date : 7 May 2026
|
||||||
# Updated : 11 May 2026
|
# Updated : 12 May 2026
|
||||||
# Purpose : Debrand Ubuntu
|
# Purpose : Debrand Ubuntu
|
||||||
#
|
#
|
||||||
# Post Conditions:
|
# 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 "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
|
# A new kernel is required as the initramfs that Cubic uses is
|
||||||
# based on the base ISO by default.
|
# based on the base ISO by default.
|
||||||
et-log "Installing latest kernel..."
|
et-log "Installing latest kernel..."
|
||||||
|
|||||||
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",
|
"file": "bpq-user-and-sysop-commands.pdf",
|
||||||
"dir": "bbs/bpq"
|
"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",
|
"url": "https://www.icomamerica.com/api/download.php?page_id=171&fl=JTJGdXBsb2FkcyUyRlVTQV9CYW5kX1BsYW4lMkZCYW5kX1BsYW5fTWFwJTJGQW1hdHVlckdyaWRTcXVhcmVNYXBfVVNBJTVCMTMlNUQucGRm",
|
||||||
"file": "icom-us-grid.pdf",
|
"file": "icom-us-grid.pdf",
|
||||||
@@ -38,5 +48,15 @@
|
|||||||
"url": "https://www.swpc.noaa.gov/sites/default/files/images/NOAAscales.pdf",
|
"url": "https://www.swpc.noaa.gov/sites/default/files/images/NOAAscales.pdf",
|
||||||
"file": "NOAAscales.pdf",
|
"file": "NOAAscales.pdf",
|
||||||
"dir": "space-weather"
|
"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
|
#!/bin/bash
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 27 March 2026
|
# Date : 27 March 2026
|
||||||
|
# Updated : 15 June 2026
|
||||||
# Purpose : Install Paranoia File & Text Encryption
|
# Purpose : Install Paranoia File & Text Encryption
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
@@ -18,7 +19,7 @@ et-log "Installing ${APP} ${VERSION}..."
|
|||||||
|
|
||||||
if [[ ! -e ${ET_DIST_DIR}/${DOWNLOAD_FILE} ]]; then
|
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}
|
download_with_retries ${URL} ${DOWNLOAD_FILE}
|
||||||
mv ${DOWNLOAD_FILE} ${ET_DIST_DIR}
|
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
|
||||||
+6
-1
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Author : Gaston Gonzalez
|
# Author : Gaston Gonzalez
|
||||||
# Date : 16 March 2024
|
# Date : 16 March 2024
|
||||||
# Updated : 7 May 2026
|
# Updated : 28 June 2026
|
||||||
# Purpose : Main installer for EmComm Tools Community (ETC)
|
# Purpose : Main installer for EmComm Tools Community (ETC)
|
||||||
|
|
||||||
. ./env.sh
|
. ./env.sh
|
||||||
@@ -119,5 +119,10 @@ exitIfNotRoot
|
|||||||
# Security Patches
|
# Security Patches
|
||||||
./patch-copy-fail.sh
|
./patch-copy-fail.sh
|
||||||
|
|
||||||
|
# Install Reticulum and related applications
|
||||||
|
./install-reticulum.sh
|
||||||
|
./install-meshchat.sh
|
||||||
|
./install-modem73.sh
|
||||||
|
|
||||||
# Debrand Ubuntu
|
# Debrand Ubuntu
|
||||||
./debrand.sh
|
./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