public:radio:2025:allstar_expands
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| public:radio:2025:allstar_expands [10/06/25 08:55 BST] – [Configs] john | public:radio:2025:allstar_expands [10/06/25 10:33 BST] (current) – removed john | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | < | ||
| - | |||
| - | |||
| - | ====== Allstar : 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: | ||
| - | |||
| - | * Milnet [[http:// | ||
| - | * Allstar node status [[http:// | ||
| - | * W2YMM [[https:// | ||
| - | * This one was discovered by accident on Allstar' | ||
| - | |||
| - | ===== 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 '' | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | 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 '' | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | |||
| - | The choice of which server is used per node is chosen on the Node configuration page for each node, on the Allstar Portal | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | 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:// | ||
| - | |||
| - | The config. for the original node had to be changed, to reflect the new node number '' | ||
| - | |||
| - | * ''/ | ||
| - | * ''/ | ||
| - | * ''/ | ||
| - | |||
| - | To ensure each internal LAN node can find each other (can't rely on Allstar' | ||
| - | |||
| - | < | ||
| - | |||
| - | ; from the VHF Gateway node 481480 | ||
| - | [nodes] | ||
| - | 481480 = radio@127.0.0.1: | ||
| - | |||
| - | 481481 = radio@192.168.21.241: | ||
| - | |||
| - | 481482 = radio@192.168.21.242: | ||
| - | |||
| - | </ | ||
| - | |||
| - | I added the DVSwitch bridging to the hub node '' | ||
| - | |||
| - | All 3 nodes have '' | ||
| - | |||
| - | ''/ | ||
| - | |||
| - | < | ||
| - | ; | ||
| - | ; 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, | ||
| - | write = all, | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Port Forwarding ===== | ||
| - | |||
| - | My ADSL router has the following port forwards to allow external incoming connections to be set up | ||
| - | |||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * '' | ||
| - | * [[http:// | ||
| - | * '' | ||
| - | * [[http:// | ||
| - | * '' | ||
| - | * [[http:// | ||
| - | |||
| - | |||
| - | |||
| - | To allow the node numbers to be resolved to useful names tp display on the dashboards the script '' | ||
| - | |||
| - | The image came with several copies of '' | ||
| - | |||
| - | ===== Private Node Names ===== | ||
| - | To allow private node numbers to appear as useful information, | ||
| - | |||
| - | < | ||
| - | 1399|GM4SLV|Bridge to DMR|TGIF TG2354429 | ||
| - | 1398|GM4SLV|Bridge to DMR|TGIF TG2354435 | ||
| - | </ | ||
| - | |||
| - | and then the '' | ||
| - | |||
| - | The easiest way is to run the '' | ||
| - | |||
| - | and therefore it's the copy in ''/ | ||
| - | |||
| - | To automate the process the update is done nightly via ''/ | ||
| - | |||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | |||
| - | # Get new allmon data daily | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | === 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 //" | ||
| - | * for this to work it's necessary to arrange public-key authentication on the nodes, with passwordless logins. But that's normal, anyway, no? | ||
| - | | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | NODE1=node481480.local | ||
| - | NODE2=node481481.local | ||
| - | NODE3=node481482.local | ||
| - | WEB=/ | ||
| - | |||
| - | PRIVATE_NODES=/ | ||
| - | |||
| - | |||
| - | sudo cp $PRIVATE_NODES $WEB | ||
| - | sudo $WEB/ | ||
| - | |||
| - | |||
| - | scp $PRIVATE_NODES gm4slv@$NODE2: | ||
| - | ssh $NODE2 'sudo cp / | ||
| - | |||
| - | |||
| - | scp $PRIVATE_NODES gm4slv@$NODE3: | ||
| - | ssh $NODE3 'sudo cp / | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| - | * Just make changes to the '' | ||
| - | |||
| - | <code bash> | ||
| - | gm4slv@node481480: | ||
| - | Success: astdb.txt 1422647 bytes | ||
| - | privatenodes.txt | ||
| - | Success: astdb.txt 1422647 bytes | ||
| - | privatenodes.txt | ||
| - | Success: astdb.txt 1422647 bytes | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Favourites ===== | ||
| - | |||
| - | * to keep the '' | ||
| - | * I edit the copy in my home directory on '' | ||
| - | |||
| - | ./ | ||
| - | |||
| - | <code bash> | ||
| - | #!/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=/ | ||
| - | |||
| - | FAVORITES=/ | ||
| - | |||
| - | sudo cp $FAVORITES $WEB | ||
| - | |||
| - | scp $FAVORITES gm4slv@$NODE2: | ||
| - | ssh $NODE2 'sudo cp / | ||
| - | |||
| - | scp $FAVORITES gm4slv@$NODE3: | ||
| - | ssh $NODE3 'sudo cp / | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Supermon : allmon.ini ===== | ||
| - | |||
| - | The nodes monitored, and the menu to select them, and external websites, on each node's Supermon Dashboard is configured by '' | ||
| - | |||
| - | Here's the current version: | ||
| - | |||
| - | ++++ Generic / | ||
| - | |||
| - | <code ini> | ||
| - | [All Nodes] | ||
| - | nodes = 481480, | ||
| - | menu = yes | ||
| - | system = Nodes | ||
| - | |||
| - | [481480] | ||
| - | host = 192.168.21.240: | ||
| - | user = admin | ||
| - | passwd = " | ||
| - | menu = yes | ||
| - | hideNodeURL = no | ||
| - | system = Nodes | ||
| - | |||
| - | [481481] | ||
| - | host = 192.168.21.241: | ||
| - | user = admin | ||
| - | passwd = " | ||
| - | menu = yes | ||
| - | hideNodeURL = no | ||
| - | system = Nodes | ||
| - | |||
| - | [481482] | ||
| - | host = 192.168.21.242: | ||
| - | user = admin | ||
| - | passwd = " | ||
| - | menu = yes | ||
| - | hideNodeURL = no | ||
| - | system = Nodes | ||
| - | |||
| - | [1399] | ||
| - | host = 192.168.21.241: | ||
| - | user = admin | ||
| - | passwd = " | ||
| - | menu = yes | ||
| - | hideNodeURL = yes | ||
| - | system = Nodes | ||
| - | |||
| - | [1398] | ||
| - | host = 192.168.21.242: | ||
| - | user = admin | ||
| - | passwd = " | ||
| - | menu = yes | ||
| - | hideNodeURL = yes | ||
| - | system = Nodes | ||
| - | |||
| - | [lsNodes 481480] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = LsNodes | ||
| - | |||
| - | [lsNodes 481481] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = LsNodes | ||
| - | |||
| - | [lsNodes 481482] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = LsNodes | ||
| - | |||
| - | [Node 481840] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = Dashboards | ||
| - | |||
| - | [Node 481841] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = Dashboards | ||
| - | |||
| - | [Node 481842] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = Dashboards | ||
| - | |||
| - | [GM4SLV Wiki] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = External Sites | ||
| - | |||
| - | [Echolink Link Status] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = External Sites | ||
| - | |||
| - | [TGIF] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = External Sites | ||
| - | |||
| - | [AllStarLink] | ||
| - | url = " | ||
| - | menu = yes | ||
| - | system = External Sites | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| - | ++++ | ||
| - | |||
| - | * I've also made it easy to distribute the same '' | ||
| - | |||
| - | <code bash> | ||
| - | #!/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=/ | ||
| - | |||
| - | ALLMON=/ | ||
| - | |||
| - | sudo cp $ALLMON $WEB | ||
| - | |||
| - | scp $ALLMON gm4slv@$NODE2: | ||
| - | ssh $NODE2 'sudo cp / | ||
| - | |||
| - | scp $ALLMON gm4slv@$NODE3: | ||
| - | ssh $NODE3 'sudo cp / | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Node Callsigns instead of Numbers ===== | ||
| - | |||
| - | To have the telemetry say the // | ||
| - | |||
| - | I put it in ''/ | ||
| - | |||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | |||
| - | / | ||
| - | |||
| - | rm / | ||
| - | rm / | ||
| - | rm / | ||
| - | rm / | ||
| - | rm / | ||
| - | rm / | ||
| - | </ | ||
| - | |||
| - | I forget where I found it, so here's the '' | ||
| - | |||
| - | ++++ write_node_callsigns_ulaw.sh | | ||
| - | <code bash> | ||
| - | |||
| - | #!/bin/bash | ||
| - | # | ||
| - | # Created by Marshall Dias | ||
| - | # Modified by Doug, WA3DSP 8/18/2015 | ||
| - | # | ||
| - | # using ULAW format | ||
| - | # | ||
| - | # Script to write Calls to / | ||
| - | # 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 / | ||
| - | # 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. | ||
| - | # ' | ||
| - | # images from hamvoip.org or you have installed allmon or lsnodes on | ||
| - | # your system. For the BBB and RPi2 it will generally be / | ||
| - | |||
| - | SRCDIR=/ | ||
| - | # | ||
| - | |||
| - | # Set the destination directory. | ||
| - | # Use a tmp directory for testing | ||
| - | # The final destination for Allstar would be | ||
| - | # / | ||
| - | # Use the -d path option to overide | ||
| - | |||
| - | DESTDIR=/ | ||
| - | # Test destination directory - must exist | ||
| - | # | ||
| - | |||
| - | # Definitions of sound file directories | ||
| - | |||
| - | NODENAMES=/ | ||
| - | LETTERS=/ | ||
| - | NUMBERS=/ | ||
| - | STRING="" | ||
| - | |||
| - | usage() | ||
| - | { | ||
| - | cat << EOF | ||
| - | |||
| - | Usage: $0 options | ||
| - | |||
| - | Writes voice files of call signs from node numbers | ||
| - | |||
| - | OPTIONS: | ||
| - | | ||
| - | | ||
| - | -n node | ||
| - | -d path | ||
| - | | ||
| - | | ||
| - | |||
| - | 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 / | ||
| - | |||
| - | |||
| - | EOF | ||
| - | } | ||
| - | |||
| - | OVERWRITE="" | ||
| - | VERBOSE="" | ||
| - | |||
| - | while getopts " | ||
| - | do | ||
| - | case $OPTION in | ||
| - | h) | ||
| - | usage | ||
| - | exit 1 | ||
| - | ;; | ||
| - | d) | ||
| - | | ||
| - | ;; | ||
| - | o) | ||
| - | | ||
| - | ;; | ||
| - | n) | ||
| - | | ||
| - | ;; | ||
| - | v) | ||
| - | | ||
| - | ;; | ||
| - | ?) | ||
| - | usage | ||
| - | exit | ||
| - | ;; | ||
| - | esac | ||
| - | done | ||
| - | |||
| - | # Form filenames from callsign | ||
| - | make_call () | ||
| - | { | ||
| - | | ||
| - | | ||
| - | for (( i=0; i< | ||
| - | char=${foo: | ||
| - | |||
| - | case ${foo:$i:1} in | ||
| - | [0-9]*) FILENAME=$NUMBERS/ | ||
| - | "/" | ||
| - | " | ||
| - | [a-z]*|[A-Z]*) FILENAME=$LETTERS/ | ||
| - | esac | ||
| - | STRING=" | ||
| - | done | ||
| - | } | ||
| - | |||
| - | # Concatenate filenames into final audio file | ||
| - | write_call () | ||
| - | { | ||
| - | if [ ! $OVERWRITE ] | ||
| - | then | ||
| - | if [ -f " | ||
| - | then | ||
| - | echo " | ||
| - | return | ||
| - | fi | ||
| - | fi | ||
| - | echo " | ||
| - | cat $STRING > " | ||
| - | } | ||
| - | |||
| - | # If no node given process all nodes | ||
| - | if [ -z " | ||
| - | then | ||
| - | while IFS=' | ||
| - | do | ||
| - | if [ $VERBOSE ]; then echo " | ||
| - | make_call | ||
| - | write_call | ||
| - | done < $SRCDIR/ | ||
| - | else | ||
| - | # process just given node | ||
| - | CALL=`grep -m 1 $node $SRCDIR/ | ||
| - | if [ -z " | ||
| - | then | ||
| - | echo "No Call found for node - $1" | ||
| - | exit | ||
| - | else | ||
| - | f2=`echo $CALL | awk -F" | ||
| - | fi | ||
| - | f1=$node | ||
| - | if [ $VERBOSE ]; then echo " | ||
| - | make_call | ||
| - | write_call | ||
| - | fi | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| - | ++++ | ||
| - | |||
| - | There' | ||
| - | |||
| - | ++++ write_node_callsigns.sh | | ||
| - | |||
| - | <code bash> | ||
| - | |||
| - | # !/bin/bash | ||
| - | # | ||
| - | # write_node_callsigns.sh v0.8 | ||
| - | # | ||
| - | # Doug, WA3DSP 8/18/2015 | ||
| - | # Portions by Marshall Dias | ||
| - | # | ||
| - | # Script to write Calls to / | ||
| - | # 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 / | ||
| - | # 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 | ||
| - | # | ||
| - | # stay at nominal levels. | ||
| - | |||
| - | # V 0.8 - added code to ignore semicolon comments. | ||
| - | |||
| - | # See all comments below | ||
| - | |||
| - | # Set the source directory to the Allstar database on your system. | ||
| - | # ' | ||
| - | # images from hamvoip.org or you have installed allmon or lsnodes on | ||
| - | # your system. For the BBB and RPi2 it will generally be / | ||
| - | |||
| - | SRCDIR=/ | ||
| - | |||
| - | # Set the destination directory. | ||
| - | # Use a tmp directory for testing | ||
| - | # The final destination for Allstar would be | ||
| - | # / | ||
| - | # Use the -d path option to overide | ||
| - | |||
| - | DESTDIR=/ | ||
| - | # Test destination directory - must exist | ||
| - | # | ||
| - | |||
| - | # Definitions of sound file directories | ||
| - | |||
| - | RPTSOUNDS=/ | ||
| - | NODENAMES=/ | ||
| - | LETTERS=/ | ||
| - | NUMBERS=/ | ||
| - | 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: | ||
| - | |||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | -n node | ||
| - | -d path | ||
| - | | ||
| - | | ||
| - | |||
| - | 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 / | ||
| - | 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/ | ||
| - | then | ||
| - | echo " | ||
| - | exit | ||
| - | fi | ||
| - | |||
| - | while getopts " | ||
| - | do | ||
| - | case $OPTION in | ||
| - | h) | ||
| - | usage | ||
| - | exit 1 | ||
| - | ;; | ||
| - | a) ;; | ||
| - | d) | ||
| - | | ||
| - | ;; | ||
| - | i) | ||
| - | | ||
| - | ;; | ||
| - | | ||
| - | | ||
| - | ;; | ||
| - | n) | ||
| - | | ||
| - | ;; | ||
| - | v) | ||
| - | | ||
| - | ;; | ||
| - | ?) | ||
| - | usage | ||
| - | exit | ||
| - | ;; | ||
| - | esac | ||
| - | done | ||
| - | |||
| - | # Form filenames from callsign | ||
| - | make_call () | ||
| - | { | ||
| - | | ||
| - | for (( i=0; i< | ||
| - | char=${foo: | ||
| - | |||
| - | case ${foo:$i:1} in | ||
| - | [0-9]*) FILENAME=$NUMBERS/ | ||
| - | "/" | ||
| - | " | ||
| - | [a-z]*|[A-Z]*) FILENAME=$LETTERS/ | ||
| - | esac | ||
| - | STRING=" | ||
| - | done | ||
| - | } | ||
| - | |||
| - | # Concatenate filenames into final audio file | ||
| - | write_call () | ||
| - | { | ||
| - | if [ ! $OVERWRITE ] | ||
| - | then | ||
| - | if [ -f " | ||
| - | then | ||
| - | echo " | ||
| - | return | ||
| - | fi | ||
| - | fi | ||
| - | |||
| - | echo " | ||
| - | cat $STRING > $DESTDIR/ | ||
| - | } | ||
| - | |||
| - | # If no node given process all nodes | ||
| - | if [ -z " | ||
| - | then | ||
| - | Total=0 | ||
| - | while IFS=' | ||
| - | do | ||
| - | if [[ $f1 =~ ^\; ]]; then continue ; fi | ||
| - | if [ -z $f1 ]; then continue ; fi | ||
| - | if [ $VERBOSE ]; then echo " | ||
| - | ((Total=Total+1)) | ||
| - | STRING="" | ||
| - | make_call $f2 | ||
| - | # Test for including node number | ||
| - | if [ $INCNODE ] | ||
| - | then | ||
| - | | ||
| - | | ||
| - | fi | ||
| - | write_call | ||
| - | done < $SRCDIR/ | ||
| - | echo -e " | ||
| - | else | ||
| - | # process just given node (-n node) | ||
| - | CALL=`grep -m 1 $node $SRCDIR/ | ||
| - | if [ -z " | ||
| - | then | ||
| - | echo "No Call found for node - $1" | ||
| - | exit | ||
| - | else | ||
| - | f2=`echo $CALL | awk -F" | ||
| - | fi | ||
| - | f1=$node | ||
| - | if [ $VERBOSE ]; then echo " | ||
| - | STRING="" | ||
| - | make_call $f2 | ||
| - | # Test for including node number | ||
| - | if [ $INCNODE ] | ||
| - | then | ||
| - | STRING=$STRING" | ||
| - | make_call $f1 | ||
| - | fi | ||
| - | write_call | ||
| - | fi | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| - | ++++ | ||
| - | |||
| - | I only have this on the node that's my VHF Gateway '' | ||
| - | |||
| - | ===== Nodes Created ===== | ||
| - | |||
| - | See : [[Allstar Nodes built]] | ||
| - | |||
| - | ===== Accessing remotely via IAX ===== | ||
| - | |||
| - | See [[iax_access|]] | ||
| - | |||
| - | ===== Morse / Speech IDs ===== | ||
| - | |||
| - | See [[Allstar_Id]] | ||
| - | |||
| - | ===== Bridges ===== | ||
| - | |||
| - | * DMR : [[allstr_dmr]] | ||
| - | * NXDN : [[allstar_nxdn|]] | ||
| - | |||
| - | ===== Configs ===== | ||
| - | |||
| - | * {{ : | ||
| - | * {{ : | ||
| - | * {{ : | ||
| - | |||
| - | |||
| - | |||
| - | --- //John Pumford-Green 05/06/25 22:30 BST// | ||
| - | |||
| - | |||
| - | ===== Further Information ===== | ||
| - | |||
| - | |||
| - | {{tag> | ||
| - | |||
public/radio/2025/allstar_expands.1749542142.txt.gz · Last modified: by john
