SvxLink Neustart, Reboot oder Shutdown per DTMF Kommando ausführen

Eine nützliche Funktion bei persönlichen SvxLink Hotspots ist es, bestimmte Funktionen per DTMF Kommando ausführen zu können, z.B. einen Neustart der Software SvxLink, einem Neustart des ganzen RaspberryPi oder auch ein sauberes Herunterfahren des Pi, um ihn dann auszuschalten. Auch für Sysops von Relais ist es manchmal sinnvoll, diese Funktionen nutzen zu können, z.B. wenn mal keine Netzwerkverbindung gegeben ist.

Zunächst sollte man seinen RaspberryPi so vorbereiten, dass man auch eigene Funktionen hinzufügen kann. Das kann von Image zu Image unterschiedlich sein. Am Beispiel des Image für den RF Guru habe ich hierzu bereits Informationen zusammengestellt.

Hinweis vorab, es ist sehr ratsam von der Logic.tcl eine Sicherungskopie zu machen wie in dem Artikel beschrieben. Jeder kleine Fehler in der Logic.tcl wird dazu führen, dass SvxLink nicht mehr startet. Eine aussagekräftige Fehlermeldung gibt es dann auch nicht. Also bevor man den Hotspot unbrauchbar macht, Backup erstellen!

An der folgenden Stelle der Datei /usr/share/svxlink/events.d/local/Logic.tcl fügt man zunächst den untenstehenden Code ein:

sudo nano /usr/share/svxlink/events.d/local/Logic.tcl
proc dtmf_cmd_received {cmd} {
variable port;
variable number;
variable ignore_dtmf 0;
global mycall;
puts "DTMF command received: $cmd";
variable ignore_dtmf;
if {$cmd == "999"} {
set ignore_dtmf 1;
return 1;
}

# shutdown Raspberry pi
if {$cmd == "*99123"} {
puts "Halting RPi: $cmd";
playMsg "Core" "shutdown";
playSilence 500;
exec bash /etc/svxlink/scripts/shutdown.sh &
return 1
}


# restart Svxlink
if {$cmd == "*99124"} {
puts "Restart SVXLink: $cmd";
playMsg "Core" "svxneustart";
playSilence 500;
exec bash /etc/svxlink/scripts/restart.sh &
return 1
}

# restart Svxlink Server
if {$cmd == "*99125"} {
puts "Rebooting RPi: $cmd";
playMsg "Core" "neustart";
playSilence 500;
exec bash /etc/svxlink/scripts/reboot.sh &
return 1
}

if {$ignore_dtmf} {
if {$cmd == "998"} {
set ignore_dtmf 0;
return 1;
} elseif {$cmd == ""} {
return 1;
}
}
return 0;
}

So sieht es dann aus:

Dieser Code führt dazu, dass nach Eingabe der DTMF Codes *99123#, *99124# und *99125# etwas passiert. Die DTMF Codes kann man beliebig anpassen. Insbesondere bei öffentlich zugänglichen Relais solltes diese Codes aber geheim bleiben. Im Text hier habe ich eine Raute „#“ hinzugefügt. Diese steht jedoch nicht in den Codezeilen, denn mit der Raute „#“ schließt man immer jedes DTMF-Kommando in SvxLink ab. Würde man im Code eine Raute „#“ eingeben, müsste man dieses Zeichen zweimal senden.

So, was passiert nun mit dem Code. Im folgenden Beispiel verwende ich das Kommando „*91125“, „Reboot SvxLink Server“.

Wenn man die andere Seite bereits aufmerksam gelesen hat, weiß man, dass der Befehl puts einen Eintrag im Log von SvxLink erzeugt. Somit kann man bei Beobachten des Logs auch sehen, welche Funktion ausgeführt wurde. Gleichzeitig wird eine Audio-Ansage abgespielt. Hier ist es das Audiofile „neustart.wav“ im Unterordner „Core“. Die Datei muss natürlich existieren. In deutschen Audiofiles sind diese in der Regel enthalten. Falls nicht, wird einfach kein Sound abgespielt. Anschließend ist eine kurze Sprechpause von 0,5 Sekunden vorgesehen. Der wichtigste Part folgt zum Schluss, es wird mit „exec bash“ ein externes Skript aufgerufen.

In den drei genannten Skripten sind wiederrum die Befehle drin, um Svxlink neu zu starten, den Raspberry Pi neu zu starten oder herunterzufahren.

shutdown.sh:

!bin/bash
sleep 15
sudo halt

reboot.sh:

!bin/bash
sleep 5
sudo reboot

restart.sh:

!bin/bash
sleep 3
sudo systemctl restart svxlink

Diese drei Dateien müssen mit dem aufgeführten Inhalt unter /etc/svxlink/scripts/ angelegt werden und auch ausführbar sein (chmod +x „datei.sh“). Die Befehle selbst kennt ihr bestimmt schon.

Um es einfach zu machen, habe ich euch die Dateien auf meinem Server abgelegt. Ihr könnt sie wie folgt downloaden und ausführbar machen. Loggt euch dazu bitte mit z.B. Putty per SSH auf eurem Hotspot / SvxLink System an und gebt folgende Kommandos ein.

sudo mkdir /etc/svxlink/scripts/
sudo wget https://www.dl1nux.de/shutdown.sh -O /etc/svxlink/scripts/shutdown.sh
sudo wget https://www.dl1nux.de/reboot.sh -O /etc/svxlink/scripts/reboot.sh
sudo wget https://www.dl1nux.de/restart.sh -O /etc/svxlink/scripts/restart.sh
sudo chmod +x /etc/svxlink/scripts/*.sh

Damit ladet ihr die drei Dateien runter und speichert sie unter /etc/svxlink/scripts/

Wenn ihr nun sowohl die Dateien heruntergeladen und gespeichert habt, sowie die Logic.tcl angepasst habt, müsst ihr nur noch SvxLink neustarten.

sudo systemctl restart svxlink

Am Beispiel des SvxLink Neustartes, aknn man im SvxLink Log mitverfolgen was passiert:

Um 21:33:16 wird begonnen den DTMF-Code zu übermitteln. SvxLink meldet das empfangene Kommando und setzt den Text aus der „puts“ Meldung ab, „Restart SVXlink:“ und den entsprechenden Code. Anschließend wird noch das Audiofile abgespielt, sichtbar am „turning the transmitter ON“ Text, da der Sender dafür aufgetastet wird. Anschließend wird SvxLink beendet und neu gestartet.

Auf diese Art und weise kann man beliebige Befehle per DTMF-Code auf dem SvxLink Rechner ausführen lassen. Der Fantasie sind keine Grenzen gesetzt.