User Tools

Site Tools


services:svxreflector

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
services:svxreflector [2023/03/16 07:28] f4hofservices:svxreflector [2024/09/07 15:47] (current) – [Configuration d'Icecast] f4hof
Line 301: Line 301:
 ==== Mosquitto ==== ==== Mosquitto ====
  
-<code bash> +Remplacer ''admin-user'' par le nom d'utilisateur de votre administrateur pour le plugin de sécurité dynamique.
-apt install mosquitto+
  
 +<code bash>
 +apt install mosquitto
 +mosquitto_ctrl dynsec init /var/lib/mosquitto/dynamic-security.json admin-user
 +chown mosquitto:mosquitto /var/lib/mosquitto/dynamic-security.json
 </code> </code>
  
-<pre>listener 1883+<code - /etc/mosquitto/conf.d/general.conf>listener 1883
 allow_anonymous false allow_anonymous false
 per_listener_settings false per_listener_settings false
  
 plugin /usr/lib/x86_64-linux-gnu/mosquitto_dynamic_security.so plugin /usr/lib/x86_64-linux-gnu/mosquitto_dynamic_security.so
-plugin_opt_config_file /var/lib/mosquitto/dynamic-security.json</pre>+plugin_opt_config_file /var/lib/mosquitto/dynamic-security.json</code> 
 + 
 +FIXME TODO 
 +<code bash> 
 +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 
 + 
 +</code> 
 + 
 +Where acltype is one of publishClientSend, publishClientReceive, subscribeLiteral, subscribePattern, unsubscribeLiteral, and unsubscribePattern. 
 + 
 +https://mosquitto.org/documentation/dynamic-security/#creating-and-modifying-roles 
 + 
 +===== Diffusion d'un salon sur Icecast ===== 
 + 
 +Cette section décrit la procédure qui permet d'ajouter la rediffusion d'un salon avec Icecast. 
 + 
 +==== Architecture Générale ==== 
 + 
 +<code>   ______________                _________                        _________                _________   
 +  |   Instance                | Client  |                      |                      |         |  
 +  | SVXReflector |===[socket]===| SVXLink |===[Loopback audio]===| DarkICE |===[socket]===| Icecast |  
 +  |______________|              |_________|                      |_________|              |_________|  
 +</code> 
 + 
 +==== Installation des prérequis ==== 
 + 
 +Lancer les commandes suivantes en tant que root: 
 + 
 +<code bash>apt install darkice icecast2</code> 
 + 
 +==== Configuration d'Icecast ==== 
 + 
 +Le fichier de configuration suivant permet de servir les flux de diffusion avec une socket non sécurisée, et une socket sécurisée (utile pour mettre un lecteur sur une page web en HTTPS). 
 + 
 +Les valeurs des champs suivants DOIT être modifiée: 
 +  * ''location'' -> Localisation géographique 
 +  * ''admin'' -> E-mail de contact de l'administrateur, si applicable 
 +  * ''source-password'' -> Mot de passe utilisé pour l'injection de flux sur le serveur Icecast 
 +  * ''relay-password'' -> Mot de passe utilisé pour le relai de flux sur le serveur Icecast (ne sera pas utilisé dans ce tuto, mais nécessaire pour la sécurisation. 
 +  * ''admin-password'' -> Mot de passe d'administration pour l'interface web disponible sur le port 8080. 
 +  * ''hostname'' -> FQDN utilisé pour servir vos flux audio. Si vous utilisez les connexions TLS, la valeur de ce champ doit être incluse dans la liste des SubjectAltName de votre certificat. 
 + 
 +<code xml> 
 +<icecast> 
 +    <location>Ma localisation</location> 
 +    <admin>icemaster@example.com</admin> 
 +    <limits> 
 +        <clients>100</clients> 
 +        <sources>10</sources> 
 +        <queue-size>524288</queue-size> 
 +        <client-timeout>30</client-timeout> 
 +        <header-timeout>15</header-timeout> 
 +        <source-timeout>10</source-timeout> 
 +        <burst-on-connect>0</burst-on-connect> 
 +        <burst-size>65535</burst-size> 
 +    </limits> 
 + 
 +    <authentication> 
 +        <source-password>mdp_injection_changezmoi</source-password> 
 +        <relay-password>mdp_relai_changezmoi</relay-password> 
 + 
 +        <admin-user>admin</admin-user> 
 +        <admin-password>mdp_admin_changezmoi</admin-password> 
 +    </authentication> 
 +    <hostname>icecast.example.com</hostname> 
 + 
 +    <!-- You may have multiple <listener> elements --> 
 +    <listen-socket> 
 +        <port>5299</port> 
 +    </listen-socket> 
 +     
 +    <listen-socket> 
 +        <port>8080</port> 
 +        <bind-address>127.0.0.1</bind-address> 
 +    </listen-socket> 
 +     
 +     
 +    <listen-socket> 
 +        <port>5243</port> 
 +        <ssl>1</ssl> 
 +    </listen-socket> 
 +     
 +    <http-headers> 
 +        <header name="Access-Control-Allow-Origin" value="*" /> 
 +    </http-headers> 
 +    <fileserve>1</fileserve> 
 + 
 +    <paths> 
 +        <basedir>/usr/share/icecast2</basedir> 
 +        <logdir>/var/log/icecast2</logdir> 
 +        <webroot>/usr/share/icecast2/web</webroot> 
 +        <adminroot>/usr/share/icecast2/admin</adminroot> 
 +        <alias source="/" destination="/status.xsl"/> 
 +        <ssl-certificate>/etc/icecast2/bundle.pem</ssl-certificate> 
 +    </paths> 
 + 
 +    <logging> 
 +        <accesslog>access.log</accesslog> 
 +        <errorlog>error.log</errorlog> 
 +        <loglevel>3</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error --> 
 +        <logsize>10000</logsize> <!-- Max size of a logfile --> 
 +    </logging> 
 + 
 +    <security> 
 +        <chroot>0</chroot> 
 +    </security> 
 +</icecast> 
 +</code> 
 + 
 +Si vous n'utilisez pas de connexion TLS, commentez ou supprimez le bloc ''listen-socket'' qui contient une balise ''ssl'', et supprimez la ligne avec la balise ''ssl-certificate''
 + 
 +La génération des certificats est laissée à votre discrétion, à chaque renouvellement, vous devez regénérer le fichier ''/etc/icecast2/bundle.pem'' en concaténant, au format PEM, dans l'ordre suivant: 
 +  - La chaîne de certification dans l'ordre descendant. 
 +  - Le certificat utilisé par le serveur. 
 +  - La clé privée, non protégée par un mot de passe. 
 + 
 +Les permissions de votre fichier bundle.pem doivent être positionnées à ''600''
 + 
 + 
 +==== Ajout des interfaces de bouclage ==== 
 + 
 +Lancer les commandes suivantes pour créer une interface de bouclage. 
 +<code bash> 
 +echo "options snd-aloop enable=1 index=10" > /etc/modprobe.d/aloop.conf 
 +echo "snd-aloop" >> /etc/modules 
 +modprobe snd-aloop 
 +</code> 
 + 
 +Lancer les commandes suivantes pour créer quatre interfaces de bouclage. 
 +<code bash> 
 +echo "options snd-aloop enable=1,1,1,1 index=10,11,12,13" > /etc/modprobe.d/aloop.conf 
 +echo "snd-aloop" >> /etc/modules 
 +modprobe snd-aloop 
 +</code> 
 + 
 +Le code précédent permet de: 
 +- Définir des options à passer implicitement au chargement du module ''snd-aloop''
 +- Ajouter ''snd-aloop'' dans la liste des modules à charger automatiquement à chaque boot. 
 +- Charger le module manuellement pour cette fois-ci sans avoir à rebooter. 
 + 
 +Si vous voulez modifier le nombre d'interfaces, il faudra modifier ''/etc/modprobe.d/aloop.conf'' pour ajouter/supprimer des interfaces. Les ''index'' de chaque interface sont séparés par une virgule, et pensez bien à mettre à jour le nombre de 1 correspondant dans le champ ''enable'' pour que vos interfaces soient actives par défaut. 
 + 
 +Pour appliquer les changements sans rebooter votre serveur, il faut arrêter tous les programmes qui utilise les interfaces de bouclage, puis lancer la commande suivante en tant que root, pour que les nouveaux paramètres soient pris en compte: 
 + 
 +<code bash>modprobe -r snd-aloop; modprobe snd-aloop</code> 
 +==== Configuration des clients SVXLink ==== 
 + 
 +Un client SVXLink doit être configuré pour chaque réflecteur. 
 + 
 +Reprendre le patron de configuration suivant, et changer le contenu de ces champs: 
 +  * ''CALLSIGN'' -> Nom d'utilisateur à afficher pour le client Icecast. Attention: plusieurs occurences dans le fichier. 
 +  * ''AUTH_KEY'' -> Mot de passe de votre réflecteur, ou celui associé à votre client SVXLink, selon votre configuration. 
 +  * ''HOST'' -> Adresse IP ou FQDN du réflecteur à diffuser. Laisser par défaut si la diffusion se fait sur la même machine. 
 +  * ''PORT'' -> Port d'écoute du réflecteur à diffuser. 
 +  * ''AUDIO_DEV'' -> Remplacer la valeur ''10'' par le numéro de l'interface loopback sur laquelle injecter le flux de ce réflecteur. 
 + 
 +<code ini> 
 +############################################################################### 
 +#                                                                             # 
 +#                Configuration file for the SvxLink client                    # 
 +#                                                                             # 
 +############################################################################### 
 + 
 +[GLOBAL] 
 +LOGICS=SimplexLogic,ReflectorLogic 
 +CFG_DIR=svxlink.d 
 +TIMESTAMP_FORMAT="%c" 
 +CARD_SAMPLE_RATE=48000 
 +LINKS=ALLlink 
 + 
 +[SimplexLogic] 
 +TYPE=Simplex 
 +RX=NONE 
 +TX=TxStream 
 +CALLSIGN=ICECAST 
 +EVENT_HANDLER=/usr/share/svxlink/events.tcl 
 +DEFAULT_LANG=en_US 
 + 
 +[ReflectorLogic] 
 +TYPE=Reflector 
 +HOST=127.0.0.1 
 +PORT=5310 
 +CALLSIGN="ICECAST" 
 +AUTH_KEY="MotDePasseSvxReflector" 
 +AUDIO_CODEC=OPUS 
 +EVENT_HANDLER=/usr/share/svxlink/events.tcl 
 + 
 +[ALLlink] 
 +CONNECT_LOGICS=SimplexLogic:94:SK3AB,ReflectorLogic 
 +DEFAULT_ACTIVE=1 
 +TIMEOUT=0 
 + 
 +[TxStream] 
 +TYPE=Local 
 +AUDIO_DEV=alsa:hw:10,
 +AUDIO_CHANNEL=0 
 +PTT_TYPE=NONE 
 +TIMEOUT=7200 
 +TX_DELAY=0 
 +PREEMPHASIS=0 
 +</code> 
 + 
 +Sauver le résultat modifié dans ''/etc/svxlink/svxlink-nomreflecteur.conf''
 + 
 + 
 + 
 +==== Configuration de Darkice ==== 
 + 
 +Editer votre fichier ''/etc/hosts'' pour faire boucler le FQDN de votre serveur icecast sur votre machine (pour éviter les boucles sur le réseau local, notamment si vous êtes derrière un NAT en IPv4). 
 + 
 +<code> 
 +127.0.0.1 localhost icecast.example.com 
 +</code> 
 + 
 +Dans le dossier ''/etc/darkice'', créer un fichier de configuration par réflecteur. 
 + 
 +<code ini my-reflector.cfg> 
 +[general] 
 +duration        = 0        # duration of encoding, in seconds. 0 means forever 
 +bufferSecs      = 1         # size of internal slip buffer, in seconds 
 +reconnect       = yes       # reconnect to the server(s) if disconnected 
 +realtime        = no 
 +rtpio           = 3 
 + 
 + 
 +[input] 
 +device          = hw:10,1 
 +sampleRate      = 48000     # sample rate in Hz. try 11025, 22050 or 44100 
 +bitsPerSample   = 16        # bits per sample. try 16 
 +channel         = 2         # channels. 1 = mono, 2 = stereo 
 + 
 + 
 +[icecast2-0] 
 +bitrateMode     = cbr 
 +format          = opus 
 +bitrate         = 64 
 +#quality         = 0.8 
 +channel         = 1 
 +lowpass         = -1       #Débrayage des filtres 
 +highpass        = -1       #Débrayage des filtres 
 +server          = 127.0.0.1  # host name of the server 
 +port            = 5299       # port of the IceCast2 server, usually 8000 
 +password        = mdp_injection_changezmoi    # source password to the IceCast2 server 
 +mountPoint      = my-reflector  # mount point of this stream on the server 
 +name            = Reflecteur-ARA # name of the stream 
 +description     = Vous ecoutez le reflecteur Auvergne-Rhone-Alpes # description of the stream 
 +url             = http://icecast.example.com/my-reflector  # URL related to the stream 
 +genre           = Ham Radio  ,  Radioamateur    # genre of the stream 
 +public          = yes       # advertise this stream on Icecast's status page? 
 + 
 +</code> 
 + 
 +Fichier d'unité à déposer sur ''/etc/systemd/system/darkice@.service'': 
 + 
 +<code ini darkice@.service> 
 +[Unit] 
 +Description=Darkice server for room %I 
 +Documentation=man:darkice(1) 
 +After=network.target time.target sound.target icecast2.service 
 + 
 +[Service] 
 +Type=simple 
 +User=svxlink 
 +Group=svxlink 
 +EnvironmentFile=-/etc/default/darkice-%i 
 +Environment=CFGFILE=/etc/darkice/%i.cfg 
 +#RuntimeDirectory=/etc/darkice 
 +ExecStart=/usr/bin/darkice -c $CFGFILE 
 +ExecStop=/bin/kill -s TERM $MAINPID 
 +Restart=on-failure 
 +TimeoutStartSec=60 
 + 
 +[Install] 
 +WantedBy=multi-user.target 
 + 
 +</code> 
 + 
 +Lancer la commande suivante en tant que root pour rafraîchir la config de systemd 
 + 
 +<code bash>systemctl daemon-reload</code> 
 + 
 +Ensuite, activer votre instance nommée de darkice pour qu'elle se lance à chaque boot, et lancez-la manuellement: 
 +<code bash>systemctl enable darkice@my-reflector 
 +systemctl start darkice@my-reflector 
 +</code> 
 + 
 +Répéter cette opération pour l'ensemble des salons à diffuser. 
services/svxreflector.1678951696.txt.gz · Last modified: 2023/03/16 07:28 by f4hof