←AllStar Linking
Explorations
Digging Deeper into Allstar
I've seen a few examples of small networks and am interested in building up a mixed protocol system too.
Some examples that interested me:
-
-
This one was discovered by accident on Allstar's Portal I mistyped my own original base node ID (pre-NNX)
48148 as
48418 and found his system with lots of information on his blog
Adding more nodes
It's possible to have up to 10 individual Node IDs with a single Allstar node number, by using NNX to add a 6th digit to the base node number…
My Base Number is 48148
and I activated the NNX
feature and created 3 nodes
Since they are all behind a NAT firewall, sharing one public IP address the nodes must use different UDP ports. To make this possible I created 2 new Server
instances on the Allstar Portal, one per node, and chose the UDP ports :
https://www.allstarlink.org/portal/servers.php
node481480
⇒ UDP 4569
node481481
⇒ UDP 4570
node481482
⇒ UDP 4571
The choice of which server is used per node is chosen on the Node configuration page for each node, on the Allstar Portal
https://www.allstarlink.org/portal/nodes.php
Then I flashed new SD cards for the new nodes using the ASL 2.0.0 Beta 6 image I've used for the initial VHF Gateway node.
https://github.com/AllStarLink/ASL-Live-Build/releases/download/2.0.0-beta.6/asl-2.0.0-beta.6-kc1kcc-20210324-raspberrypi-armhf.img.zip
The config. for the original node had to be changed, to reflect the new node number 481480
versus 48148
which means editing (at least)
To ensure each internal LAN node can find each other (can't rely on Allstar's DNS) it's necessary to add each one to the [nodes]
stanza in each node's config file /etc/asterisk/rpt.conf
using the appropriate IP and UDP port depending on which node is being configured.
; from the VHF Gateway node 481480
[nodes]
481480 = radio@127.0.0.1:4569/481480,NONE
481481 = radio@192.168.21.241:4570/481481,NONE
481482 = radio@192.168.21.242:4571/481482,NONE
I added the DVSwitch bridging to the hub node 481481
which is configured as radioless, I made a local/private node on that machine 1399
for this purpose.
All 3 nodes have supermon
and this needed some configuration to make sure the Asterisk Manager ports were available on their external interfaces bindaddr = 0.0.0.0
and not just on the loopback bindaddr = 127.0.0.1
/etc/asterisk/manager.conf
⇒
;
; Asterisk Call Management support
;
; By default asterisk will listen on localhost only.
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
[admin]
secret = YOUR_MANAGER_PASSWORD
read = all,system,call,log,verbose,command,agent,user,config
write = all,system,call,log,verbose,command,agent,user,config
Port Forwarding
My ADSL router has the following port forwards to allow external incoming connections to be set up
UDP 4569
⇒ 192.168.21.240
for the VHF Gateway / Echolink node
UDP 4570
⇒ 192.168.21.241
for the DMR Bridge node
UDP 4571
⇒ 192.168.21.242
for the Test Node
UDP 5198-5199
⇒ 192.168.21.240
for Echolink client connections
TCP 42110
⇒ 192.168.21.240
for the VHF Gateway/Echolink node's Dashboard
TCP 42111
⇒ 192.168.21.241
for the DMR Bridge node's Dashboard
TCP 42112
⇒ 192.168.21.242
for the Test node's Dashboard
To allow the node numbers to be resolved to useful names tp display on the dashboards the script astdb.php
should run nightly to maintain a lookup table.
The image came with several copies of astdb.php
in different places, all updating a central data file /var/log/asterisk/astdb.txt
. Which was confusing, as they all looked in different places for the file detailing private nodes.
Private Node Names
To allow private node numbers to appear as useful information, rather than not in database
you first put the information in a file privatenodes.txt
1399|GM4SLV|Bridge to DMR|TGIF TG2354429
1398|GM4SLV|Bridge to DMR|TGIF TG2354435
and then the astdb.php
script pulls it in, with all the other nodes downloaded from the web, but astdb.php
must know where to find the privatenodes.txt
file.
The easiest way is to run the astdb.php
from the directory containing privatenodes.txt
and therefore it's the copy in /var/www/html/supermon/
that is used, since privatenodes.txt
resides here too.
To automate the process the update is done nightly via /etc/cron.daily/allstar_helpers
which was modified to point to the correct version of astdb.php
#!/bin/bash
# Get new allmon data daily
/var/www/html/supermon/astdb.php
Semi-automated Private Node descriptions
I've written a small bash script on the gateway node481480.local to make it easier to re-name the internal “private nodes” as they appear listed in Supermon
for this to work it's necessary to arrange public-key authentication on the nodes, with passwordless logins. But that's normal, anyway, no?
#!/bin/bash
NODE1=node481480.local
NODE2=node481481.local
NODE3=node481482.local
WEB=/var/www/html/supermon/
PRIVATE_NODES=/home/gm4slv/privatenodes.txt
sudo cp $PRIVATE_NODES $WEB
sudo $WEB/astdb.php
scp $PRIVATE_NODES gm4slv@$NODE2:
ssh $NODE2 'sudo cp /home/gm4slv/privatenodes.txt /var/www/html/supermon/ && /var/www/html/supermon/astdb.php'
scp $PRIVATE_NODES gm4slv@$NODE3:
ssh $NODE3 'sudo cp /home/gm4slv/privatenodes.txt /var/www/html/supermon/ && /var/www/html/supermon/astdb.php'
gm4slv@node481480:~$ ./update_private.sh
Success: astdb.txt 1422647 bytes
privatenodes.txt 100% 79 39.0KB/s 00:00
Success: astdb.txt 1422647 bytes
privatenodes.txt 100% 79 24.9KB/s 00:00
Success: astdb.txt 1422647 bytes
Favourites
./update_favorites.sh
#!/bin/bash
# update_favorites.sh
# a script to keep the supermon favorites.ini file synchronized on all nodes
NODE1=node481480.local
NODE2=node481481.local
NODE3=node481482.local
WEB=/var/www/html/supermon/
FAVORITES=/home/gm4slv/favorites.ini
sudo cp $FAVORITES $WEB
scp $FAVORITES gm4slv@$NODE2:
ssh $NODE2 'sudo cp /home/gm4slv/favorites.ini /var/www/html/supermon/'
scp $FAVORITES gm4slv@$NODE3:
ssh $NODE3 'sudo cp /home/gm4slv/favorites.ini /var/www/html/supermon/'
Supermon : allmon.ini
The nodes monitored, and the menu to select them, and external websites, on each node's Supermon Dashboard is configured by allmon.ini
Here's the current version:
Generic /var/www/html/supermon/allmon.ini
[All Nodes]
nodes = 481480,481481,481482,1399,1398
menu = yes
system = Nodes
[481480]
host = 192.168.21.240:5038
user = admin
passwd = "XXXX"
menu = yes
hideNodeURL = no
system = Nodes
[481481]
host = 192.168.21.241:5038
user = admin
passwd = "XXXX"
menu = yes
hideNodeURL = no
system = Nodes
[481482]
host = 192.168.21.242:5038
user = admin
passwd = "XXXX"
menu = yes
hideNodeURL = no
system = Nodes
[1399]
host = 192.168.21.241:5038
user = admin
passwd = "XXXX"
menu = yes
hideNodeURL = yes
system = Nodes
[1398]
host = 192.168.21.242:5038
user = admin
passwd = "XXXX"
menu = yes
hideNodeURL = yes
system = Nodes
[lsNodes 481480]
url = "http://gm4slv.plus.com:42110/cgi-bin/lsnodes_web?node=481480"
menu = yes
system = LsNodes
[lsNodes 481481]
url = "http://gm4slv.plus.com:42111/cgi-bin/lsnodes_web?node=481481"
menu = yes
system = LsNodes
[lsNodes 481482]
url = "http://gm4slv.plus.com:42112/cgi-bin/lsnodes_web?node=481482"
menu = yes
system = LsNodes
[Node 481840]
url = "http://gm4slv.plus.com:42110/"
menu = yes
system = Dashboards
[Node 481841]
url = "http://gm4slv.plus.com:42111/"
menu = yes
system = Dashboards
[Node 481842]
url = "http://gm4slv.plus.com:42112/"
menu = yes
system = Dashboards
[GM4SLV Wiki]
url = "https://gm4slv.org.uk/dokuwiki/doku.php?id=start"
menu = yes
system = External Sites
[Echolink Link Status]
url = "https://echolink.org/links.jsp?d=1&gs=IP90gg&sel=gridsq"
menu = yes
system = External Sites
[TGIF]
url = "https://tgif.network/"
menu = yes
system = External Sites
[AllStarLink]
url = "http://www.allstarlink.org"
menu = yes
system = External Sites
#!/bin/bash
# update_allmon.sh
# a script to distribute a common supermon config to all nodes
NODE1=node481480.local
NODE2=node481481.local
NODE3=node481482.local
WEB=/var/www/html/supermon/
ALLMON=/home/gm4slv/allmon.ini
sudo cp $ALLMON $WEB
scp $ALLMON gm4slv@$NODE2:
ssh $NODE2 'sudo cp /home/gm4slv/allmon.ini /var/www/html/supermon/'
scp $ALLMON gm4slv@$NODE3:
ssh $NODE3 'sudo cp /home/gm4slv/allmon.ini /var/www/html/supermon/'
Node Callsigns instead of Numbers
To have the telemetry say the callsign of a connected node, instead of its node number, install the script write_node_callsigns_ulaw.sh
I put it in /usr/local/bin/
and run it via root's crontab each day - but via a wrapper script /usr/local/bin/update_names.sh
that then deletes the ulaw sound file for my own nodes, as I don't want all of them to be announced as GM4SLV
- I'd rather hear the actual node numbers:
#!/bin/bash
/usr/local/bin/write_node_callsigns_ulaw.sh
rm /var/lib/asterisk/sounds/rpt/nodenames/481480.ulaw
rm /var/lib/asterisk/sounds/rpt/nodenames/481481.ulaw
rm /var/lib/asterisk/sounds/rpt/nodenames/1399.ulaw
rm /var/lib/asterisk/sounds/rpt/nodenames/1398.ulaw
rm /var/lib/asterisk/sounds/rpt/nodenames/48148.ulaw
rm /var/lib/asterisk/sounds/rpt/nodenames/481482.ulaw
I forget where I found it, so here's the write_node
script itself
write_node_callsigns_ulaw.sh
#!/bin/bash
#
# Created by Marshall Dias
# Modified by Doug, WA3DSP 8/18/2015
#
# using ULAW format
#
# Script to write Calls to /var/lib/asterisk/sounds/rpt/nodenames
# which will then be used in place of node numbers. This script
# will NOT overwrite exisitng files unless you use the -o option.
# If you want to start clean and delete all nodename files do
# rm -rf /var/lib/asterisk/sounds/rpt/nodenames/*
# or delete just the files you want to replace.
#
# A single node number can be specified on the command line with
# the -n node -ex. -n 40000
#
# A -v option gives a little more info
# See all comments below
# Set the source directory to the Allstar database on your system.
# 'locate astdb.php' This file will exist if you are running any of the
# images from hamvoip.org or you have installed allmon or lsnodes on
# your system. For the BBB and RPi2 it will generally be /var/log/asterisk
SRCDIR=/var/log/asterisk
#SRCDIR=/var/www/html/allmon
# Set the destination directory.
# Use a tmp directory for testing
# The final destination for Allstar would be
# /var/lib/asterisk/sounds/rpt/nodenames
# Use the -d path option to overide
DESTDIR=/var/lib/asterisk/sounds/rpt/nodenames
# Test destination directory - must exist
#DESTDIR=/tmp/nodes
# Definitions of sound file directories
NODENAMES=/var/lib/asterisk/sounds/rpt/nodenames
LETTERS=/var/lib/asterisk/sounds/letters
NUMBERS=/var/lib/asterisk/sounds/digits
STRING=""
usage()
{
cat << EOF
Usage: $0 options
Writes voice files of call signs from node numbers
OPTIONS:
-h Show this message
-o Overwrite existings file(s)
-n node Specify node number - single write
-d path Specify path to output files
Default: /var/lib/asterisk/sounds/rpt/nodenames
-v Verbose
Write callsign for node 40000, no overwrite -
$0 -n 40000
Write callsign for node 40000, overwrite -
$0 -on 40000
Write all callsigns, no overwrite -
$0
Write all callsigns, overwrite
$0 -o
Write single node to specific directory -
$0 -n 40000 -d /etc/asterisk/local
EOF
}
OVERWRITE=""
VERBOSE=""
while getopts "hovn:d:" OPTION
do
case $OPTION in
h)
usage
exit 1
;;
d)
DESTDIR=$OPTARG
;;
o)
OVERWRITE=1
;;
n)
node=$OPTARG
;;
v)
VERBOSE=1
;;
?)
usage
exit
;;
esac
done
# Form filenames from callsign
make_call ()
{
STRING=""
foo=${f2,,}
for (( i=0; i<${#foo}; i++ )); do
char=${foo:$i:1}
case ${foo:$i:1} in
[0-9]*) FILENAME=$NUMBERS/$char.ulaw ;;
"/") FILENAME=$LETTERS/slash.ulaw ;;
"-") FILENAME=$LETTERS/dash.ulaw ;;
[a-z]*|[A-Z]*) FILENAME=$LETTERS/$char.ulaw ;;
esac
STRING="$STRING $FILENAME"
done
}
# Concatenate filenames into final audio file
write_call ()
{
if [ ! $OVERWRITE ]
then
if [ -f "$DESTDIR/$f1.ulaw" ]
then
echo "$DESTDIR/$f1.ulaw exists - not overwriting"
return
fi
fi
echo "Writing $DESTDIR/$f1.ulaw"
cat $STRING > "$DESTDIR/$f1.ulaw"
}
# If no node given process all nodes
if [ -z "$node" ]
then
while IFS='|' read f1 f2 f3 f4
do
if [ $VERBOSE ]; then echo "Processing Node Number: $f1 - Callsign: $f2" ; fi
make_call
write_call
done < $SRCDIR/astdb.txt
else
# process just given node
CALL=`grep -m 1 $node $SRCDIR/astdb.txt`
if [ -z "$CALL" ]
then
echo "No Call found for node - $1"
exit
else
f2=`echo $CALL | awk -F"|" '{print $2}'`
fi
f1=$node
if [ $VERBOSE ]; then echo "Processing Node Number: $node - Callsign: $f2" ; fi
make_call
write_call
fi
There's a version that uses GSM coded files which didn't work on my system, as all the numbers and letters are in ulaw
format, but for completeness here's the gsm
version
write_node_callsigns.sh
# !/bin/bash
#
# write_node_callsigns.sh v0.8
#
# Doug, WA3DSP 8/18/2015
# Portions by Marshall Dias
#
# Script to write Calls to /var/lib/asterisk/sounds/rpt/nodenames
# which will then be used in place of node numbers. This script
# will NOT overwrite exisitng files unless you use the -o option.
# If you want to start clean and delete all nodename files do
# rm -rf /var/lib/asterisk/sounds/rpt/nodenames/*
# or delete just the files you want to replace.
#
# A single node number can be specified on the command line with
# the -n node -ex. -n 40000
#
# A -v option gives a little more info
#
# v 0.7 - removed level changing as this is accomplished in
# global telemetry level parameters. Files should
# stay at nominal levels.
# V 0.8 - added code to ignore semicolon comments. 6/5/2020, WA3DSP
# See all comments below
# Set the source directory to the Allstar database on your system.
# 'locate astdb.php' This file will exist if you are running any of the
# images from hamvoip.org or you have installed allmon or lsnodes on
# your system. For the BBB and RPi2 it will generally be /var/log/asterisk
SRCDIR=/var/log/asterisk
# Set the destination directory.
# Use a tmp directory for testing
# The final destination for Allstar would be
# /var/lib/asterisk/sounds/rpt/nodenames
# Use the -d path option to overide
DESTDIR=/var/lib/asterisk/sounds/rpt/nodenames
# Test destination directory - must exist
#DESTDIR=/tmp/nodes
# Definitions of sound file directories
RPTSOUNDS=/var/lib/asterisk/sounds/rpt
NODENAMES=/var/lib/asterisk/sounds/rpt/nodenames
LETTERS=/var/lib/asterisk/sounds/letters
NUMBERS=/var/lib/asterisk/sounds/digits
STRING=""
usage()
{
cat << EOF
write_node_callsigns.sh v0.8
Usage: write_node_callsigns.sh options
Writes Asterisk Allstar voice files of call signs from node numbers
OPTIONS:
-h Show this message
-a Process all nodes
-i Include node number with call
-o Overwrite existing file(s)
-n node Process single node (overrides -a)
-d path Specify path to output files
Default: /var/lib/asterisk/sounds/rpt/nodenames
-v Verbose
Write callsign for node 40000, no overwrite, all nodes -
$0 -n 40000
Write callsign for node 40000, overwrite, all nodes -
$0 -on 40000
Write all callsigns, no overwrite -
$0 -a
Write all callsigns, overwrite
$0 -ao
Write single node to specific directory -
$0 -n 40000 -d /etc/asterisk/local
Write single node including both call and node number, overwrite
$0 -ion 40000
EOF
}
OVERWRITE=""
VERBOSE=""
INCNODE=""
VOLUME=""
if [ $# -eq 0 ];
then
usage
exit 0
fi
if [ ! -e $SRCDIR/astdb.txt ]
then
echo "$SRCDIR/astdb.txt not found - Be sure to point SRCDIR in script to file location."
exit
fi
while getopts "hail:ovn:d:" OPTION
do
case $OPTION in
h)
usage
exit 1
;;
a) ;;
d)
DESTDIR=$OPTARG
;;
i)
INCNODE=1
;;
o)
OVERWRITE=1
;;
n)
node=$OPTARG
;;
v)
VERBOSE=1
;;
?)
usage
exit
;;
esac
done
# Form filenames from callsign
make_call ()
{
foo=${1,,}
for (( i=0; i<${#foo}; i++ )); do
char=${foo:$i:1}
case ${foo:$i:1} in
[0-9]*) FILENAME=$NUMBERS/$char.gsm ;;
"/") FILENAME=$LETTERS/slash.gsm ;;
"-") FILENAME=$LETTERS/dash.gsm ;;
[a-z]*|[A-Z]*) FILENAME=$LETTERS/$char.gsm ;;
esac
STRING="$STRING $FILENAME"
done
}
# Concatenate filenames into final audio file
write_call ()
{
if [ ! $OVERWRITE ]
then
if [ -f "$DESTDIR/$f1.gsm" ]
then
echo "$DESTDIR/$f1.gsm exists - not overwriting"
return
fi
fi
echo "Writing $DESTDIR/$f1.gsm"
cat $STRING > $DESTDIR/$f1.gsm
}
# If no node given process all nodes
if [ -z "$node" ]
then
Total=0
while IFS='|' read f1 f2 f3 f4
do
if [[ $f1 =~ ^\; ]]; then continue ; fi
if [ -z $f1 ]; then continue ; fi
if [ $VERBOSE ]; then echo "Processing Node Number: $f1 - Callsign: $f2" ; fi
((Total=Total+1))
STRING=""
make_call $f2
# Test for including node number
if [ $INCNODE ]
then
STRING=$STRING" $RPTSOUNDS/node.gsm "
make_call $f1
fi
write_call
done < $SRCDIR/astdb.txt
echo -e "\nProcessed $Total Nodes\n"
else
# process just given node (-n node)
CALL=`grep -m 1 $node $SRCDIR/astdb.txt`
if [ -z "$CALL" ]
then
echo "No Call found for node - $1"
exit
else
f2=`echo $CALL | awk -F"|" '{print $2}'`
fi
f1=$node
if [ $VERBOSE ]; then echo "Processing Node Number: $node - Callsign: $f2" ; fi
STRING=""
make_call $f2
# Test for including node number
if [ $INCNODE ]
then
STRING=$STRING" $RPTSOUNDS/node.gsm "
make_call $f1
fi
write_call
fi
I only have this on the node that's my VHF Gateway 481480
Nodes Created
Accessing remotely via IAX
Morse / Speech IDs
Bridges
Configs
— John Pumford-Green 05/06/25 22:30 BST