====== Mise en place d'un réflecteur public SVXLink ====== Au moment où ce guide a été fait, le code de svxlink était en version 17.12.1. Si la version a changé depuis, vous pouvez tenter d'appliquer les patches, tout en faisant attention à corriger sur les noms des dossiers. ===== Patchage et construction du paquet ===== La dernière version fournie de Svxreflector ne permet pas l'utilisation d'un mot de passe commun pour tous les clients qui veulent se connecter. D'autre part, la connexion de relais avec l'utilisateur par défaut dans la configuration (5P07N1K) n'est pas souhaitable. Pour pallier à ces problèmes, il faut reconstruire le paquet svxreflector après avoir appliqué des patchs. Pour ce faire, en tant que root, se mettre dans le dossier ''/usr/local/src/'', télécharger les dépendances nécessaires à la construction de svxlink, les sources du paquet et les outils nécessaires à la construction du paquet: apt-get update apt-get install quilt debhelper build-essential apt-get build-dep svxreflector apt-get source svxreflector Ajouter les fichiers suivants dans le dossier ''/usr/local/src/'': ''f4hof-add-svxreflector-default-pwd-group.patch'' Index: svxlink-17.12.1/src/svxlink/reflector/ReflectorClient.cpp =================================================================== --- svxlink-17.12.1.orig/src/svxlink/reflector/ReflectorClient.cpp +++ svxlink-17.12.1/src/svxlink/reflector/ReflectorClient.cpp @@ -520,9 +520,8 @@ std::string ReflectorClient::lookupUserK string auth_group; if (!m_cfg->getValue("USERS", callsign, auth_group) || auth_group.empty()) { - cout << "*** WARNING: Unknown user \"" << callsign << "\"" - << endl; - return ""; + /* Unknown user, silently hinting to group DefaultPassword. */ + auth_group = "DefaultPassword"; } string auth_key; if (!m_cfg->getValue("PASSWORDS", auth_group, auth_key) || auth_key.empty()) ''f4hof-reject-anon.patch'' Index: svxlink-17.12.1/src/svxlink/reflector/ReflectorClient.cpp =================================================================== --- svxlink-17.12.1.orig/src/svxlink/reflector/ReflectorClient.cpp +++ svxlink-17.12.1/src/svxlink/reflector/ReflectorClient.cpp @@ -518,6 +518,12 @@ void ReflectorClient::handleHeartbeat(As std::string ReflectorClient::lookupUserKey(const std::string& callsign) { string auth_group; + if (strcasestr( callsign.c_str(), "5P07N1K") != NULL) + { + /* Deny connection to anons */ + cout << "Attempt to connect as \"" << callsign << "\" denied." << endl; + return ""; + } if (!m_cfg->getValue("USERS", callsign, auth_group) || auth_group.empty()) { /* Unknown user, silently hinting to group DefaultPassword. */ Une fois cette étape réalisée, on passe à l'application des patch et à la compilation des paquets: cd svxlink-17.12.1 quilt import ../f4hof-add-svxreflector-default-pwd-group.patch quilt import ../f4hof-reject-anon.patch quilt push f4hof-add-svxreflector-default-pwd-group.patch quilt push f4hof-reject-anon.patch dpkg-buildpackage -us -uc -b Votre paquet, prêt à être installé, est dans le dossier ''/usr/local/src''. ===== Installation du paquet ===== Installer, puis figer le paquet, pour éviter que la version du dépôt vienne écraser votre version, lorsque faites une mise à jour. Attention, le nom du fichier du paquet va dépendre de l'architecture matérielle de votre machine. Votre paquet devrait avoir un nom structuré de la manière suivante: ''svxreflector__.deb'' cd /usr/local/src dpkg -i svxreflector_17.12.1-2_amd64.deb apt-mark hold svxreflector ===== Paramétrage environnement ===== Si vous n'avez pas d'utilisateur et de groupe svxlink, il faut le créer, ainsi qu'un répertoire dédié pour les logs. Le script suivant permet de le faire pour vous. #!/bin/bash grep svxlink /etc/passwd &> /dev/null if [[ "$?" != "0" ]]; then adduser --system --group --disabled-password svxlink useradd -rG audio,plugdev,gpio svxlink fi if [ ! -d /var/log/svxlink ]; then mkdir /var/log/svxlink chown svxlink:adm /var/log/svxlink fi ===== Fichier de configuration et unité systemd ===== ==== Pour héberger une seule instance ==== Si vous ne souhaitez mettre en place qu'un seul réflecteur (aussi appelé salon par certains outils francophones), la configuration suivante vous permettra de disposer d'un réflecteur sur le port 5300. Remplacer "VotreMotDePasseDeGroupe" par un mot de passe de votre choix pour le salon. Si votre serveur est situé derrière une box, ou un NAT, n'oubliez pas d'ajouter une règle de redirection de port, et une règle firewall pour autoriser les connexions entrantes. Créer le fichier ''/etc/svxlink/svxreflector.conf'' ################################################################### # # Configuration file for the SvxReflector SvxLink conference node # ################################################################### [GLOBAL] #CFG_DIR=svxreflector.d TIMESTAMP_FORMAT="%Y-%m-%dT%H:%M:%S%z" LISTEN_PORT=5300 #SQL_TIMEOUT=600 #SQL_TIMEOUT_BLOCKTIME=60 CODECS=OPUS [USERS] [PASSWORDS] DefaultPassword="VotreMotDePasseDeGroupe" Créer le fichier ''/etc/systemd/system/svxreflector.service'' [Unit] Description=SvxLink Reflector Documentation=man:svxreflector(1) After=network.target remote-fs.target time.target [Service] Type=simple User=svxlink Group=daemon EnvironmentFile=-/etc/default/svxreflector Environment=CFGFILE=/etc/svxlink/svxreflector.conf Environment=LOGFILE=/var/log/svxlink/svxreflector.log RuntimeDirectory=svxlink ExecStart=/usr/bin/svxreflector --config $CFGFILE --logfile $LOGFILE ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure TimeoutStartSec=60 [Install] WantedBy=multi-user.target ==== Pour héberger plusieurs instances ==== Reproduire la procédure ci-dessus en modifiant le nom du fichier de conf par un nom comprenant le nom de votre réflecteur. Par exemple, si vous voulez faire 3 réflecteurs: un général, un technique et un urgence, faites 3 fichiers de configuration nommés ''/etc/svxlink/svxreflector-general.conf'', ''/etc/svxlink/svxreflector-tech.conf'', et ''/etc/svxlink/svxreflector-urgence.conf'', où vous prendrez soin à choisir un numéro de port unique (par exemple, 5300, 5301 et 5302). L'utilisation d'un même mot de passe entre 2 salons n'est pas gênante. Pour les unités systemd, même principe: créer des noms d'unités qui comprennent le nom de votre réflecteur, collez le template ci-dessus et modifiez les lignes suivantes: Description=SvxLink Reflector serving room EnvironmentFile=-/etc/default/svxreflector- Environment=CFGFILE=/etc/svxlink/svxreflector-.conf Environment=LOGFILE=/var/log/svxlink/svxreflector-.log Par exemple, pour le réflecteur ''tech'', créer le fichier ''/etc/systemd/system/svxreflector-tech.service'' qui contient: [Unit] Description=SvxLink Reflector serving tech room Documentation=man:svxreflector(1) After=network.target remote-fs.target time.target [Service] Type=simple User=svxlink Group=daemon EnvironmentFile=-/etc/default/svxreflector-tech Environment=CFGFILE=/etc/svxlink/svxreflector-tech.conf Environment=LOGFILE=/var/log/svxlink/svxreflector-tech.log RuntimeDirectory=svxlink ExecStart=/usr/bin/svxreflector --config $CFGFILE --logfile $LOGFILE ExecReload=/bin/kill -s HUP $MAINPID Restart=on-failure TimeoutStartSec=60 [Install] WantedBy=multi-user.target ==== Activation des services ==== Pour que les changements soient pris en compte, puis activer au démarrage et démarrer votre unité: systemctl daemon-reload systemctl enable svxreflector.service systemctl start svxreflector.service Pour contrôler si le service tourne: systemctl status svxreflector.service Pour consulter le journal systemd du service: journalctl -u svxreflector.service ===== Paramétrage relais ===== Pour commencer, vous devez choisir un nom abrégé pour votre réflecteur, à trois lettres. ==== Fichier audio de nom de salon ==== Ce fichier permet d'annoncer le nom de votre réflecteur lorsqu'un relai va basculer dessus. Le format de fichier validé pour les annonces de nom de conférence est le suivant: WAVE PCM 16 bits signé, échantillonnage à 16kHz, mono. Si vous voulez convertir un fichier dans ce format à l'aide de ffmpeg, voici la commande: ffmpeg -i -c 1 -ar 16000 -acodec pcm_s16le Sxmp.wav Le nom du fichier doit respecter la forme S.wav (par ex: ''Sxmp.wav'' ). ==== Fichier restart ==== Vous devez également mettre à disposition un fichier restart. Le nom du fichier est de la forme restart.. #!/bin/bash # DTMF 123 xyz # # Stop svxlink pkill -TERM svxlink sleep 3 #/etc/spotnik/audio.sh #sleep 1 # Save network echo "xyz" > /etc/spotnik/network # Replace announcement rm /usr/share/svxlink/sounds/fr_FR/PropagationMonitor/name.wav ln -s /etc/spotnik/Sxyz.wav /usr/share/svxlink/sounds/fr_FR/PropagationMonitor/name.wav # Update config rm -f /etc/spotnik/svxlink.xyz cat /etc/spotnik/svxlink.cfg >/etc/spotnik/svxlink.xyz echo "HOST=svxlink.example.org" >> /etc/spotnik/svxlink.xyz echo "AUTH_KEY=VotreMotDePasseDeGroupe" >> /etc/spotnik/svxlink.xyz echo "PORT=5300" >> /etc/spotnik/svxlink.xyz # Clear logs > /tmp/svxlink.log # Launch svxlink svxlink --daemon --logfile=/tmp/svxlink.log --pidfile=/var/run/svxlink.pid --runasuser=root --config=/etc/spotnik/svxlink.xyz # Enable propagation monitor module #sleep 1 #echo "10#" > /tmp/svxlink_dtmf_ctrl_pty Remplacez dans ce fichier: * Toutes les occurrences de xyz par le nom abrégé de votre réflecteur. Vous pouvez le faire à l'aide de la commande suivante (donnée pour exemple avec l’abréviation abc): sed -i 's/xyz/abc/g' restart.abc * Le nom d'hôte par celui de votre serveur, ou une adresse IP, au choix. Privilégiez l'usage d'un nom d'hôte, car vous pourrez changer plus tard votre adresse IP sans impacter la configuration des relais déjà paramétrés. * Le mot de passe d'accès au groupe * Le numéro de port, si applicable. ==== Procédure de paramétrage relais ==== Fournissez le fichier audio et le fichier restart. Ci-dessous, un modèle de procédure que je communique d'habitude. (pour l'exemple, notre réflecteur s'appelle XYZ, et on y accèdera en tapant 123#) Bonjour, Voici la procédure pour ajouter l'accès au réflecteur XYZ sur un relais spotnik 2.0: Copier les 2 fichiers ci-joint dans le dossier /etc/spotnik de ton relais. Rendre le fichier /etc/spotnik/restart.xyz exécutable ( chmod a+x /etc/spotnik/restart.xyz ) Ensuite, éditer le fichier /usr/share/svxlink/events.d/local/Logic.tcl. Chercher la ligne "# 96 SvxReflector RRF", et coller le bloc suivant avant celle-ci: # 123 SvxReflector XYZ if {$cmd == "123"} { puts "Executing external command" playMsg "Core" "online" exec nohup /etc/spotnik/restart.xyz & return 1 } Une fois l'édition terminée, la commande ne sera pas prise en compte immédiatement. Il faut soit basculer sur un module existant ( 95# par exemple ), soit passer le relais à la main sur le réflecteur XYZ au moins une fois ( taper la commande /etc/spotnik/restart.xyz sur le terminal ). Je reste à dispo en cas de questions. Cordialement, ===== Plan de commande relais ===== ==== Mosquitto ==== Remplacer ''admin-user'' par le nom d'utilisateur de votre administrateur pour le plugin de sécurité dynamique. apt install mosquitto mosquitto_ctrl dynsec init /var/lib/mosquitto/dynamic-security.json admin-user chown mosquitto:mosquitto /var/lib/mosquitto/dynamic-security.json listener 1883 allow_anonymous false per_listener_settings false plugin /usr/lib/x86_64-linux-gnu/mosquitto_dynamic_security.so plugin_opt_config_file /var/lib/mosquitto/dynamic-security.json FIXME TODO systemctl restart mosquitto.service ufw allow from any to any port 1883 mosquitto_ctrl dynsec createRole repeater mosquitto_ctrl dynsec addRoleACL repeater subscribePattern repeaters/%u allow 0 mosquitto_ctrl dynsec addRoleACL repeater publishClientSend repeaters/%u/ack allow 0 mosquitto_ctrl dynsec createRole masterController mosquitto_ctrl dynsec addRoleACL masterController publishClientSend repeaters/+ allow 0 mosquitto_ctrl dynsec addRoleACL masterController subscribePattern repeaters/+/ack allow 0 mosquitto_ctrl dynsec createGroup gr_admin mosquitto_ctrl dynsec createGroup gr_master_controllers mosquitto_ctrl dynsec createGroup gr_repeaters mosquitto_ctrl dynsec addGroupRole gr_admin admin mosquitto_ctrl dynsec addGroupRole gr_repeaters repeater mosquitto_ctrl dynsec addGroupRole gr_master_controllers masterController Where acltype is one of publishClientSend, publishClientReceive, subscribeLiteral, subscribePattern, unsubscribeLiteral, and unsubscribePattern. https://mosquitto.org/documentation/dynamic-security/#creating-and-modifying-roles