Sommaire
- Préambule
- Le problème
- La solution…
- … mais ce n’est pas fini !
- Ce n’est toujours pas fini !
- Conclusions et perspectives
Une histoire pleine d’aventure où l’on commence par un problème, puis sa solution, puis après cette solution, l’envie de résoudre d’autres problèmes.
Préambule
Je ne contribue pas beaucoup à la vie de LinuxFr alors que j’en apprécie beaucoup la lecture. J’ai toujours l’impression de n’avoir pas grand chose de bien intéressant à raconter. Heureusement une série de journaux récents à la pertinence tout à fait discutable me rend la comparaison moins impressionnante. Même si, parmi les journaux listés précédemment, l’un d’eux est plus impertinent qu’inutile et m’a quand même bien fait rire1. En plus, il m’est arrivé des trucs avec mon ordinateur récemment. Alors, allez, je vous raconte.
D’abord un peu de contexte, j’avais depuis un certain temps une station d’accueil pour mon ordinateur portable au bureau, qui attendait dans une armoire. Commandée en même temps que l’ordinateur, elle a très mal fonctionné dès le moment où mon service info me l’a filée, et elle donc a rapidement été remplacée avec davantage de succès par un simple adaptateur USB vers ethernet+USB+HDMI. Sauf que ces adaptateur qu’on transporte facilement se prêtent et se perdent aussi facilement qu’ils se transportent et qu’un triste jour de longues réunions en visio je suis venu à en manquer. J’ai donc mis dans mon sac celui qui trônait sur mon bureau et pris mon courage à deux mains pour essayer de faire fonctionner ma station d’accueil.
Le problème
Cette station d’accueil prétend pouvoir faire de l’« Ethernet Pass-through ». Le nom en jette parce-que c’est un pur truc marketing. En fait, c’est juste une solution pour se connecter au réseau avec la station d’accueil en utilisant l’adresse MAC de la carte réseau de l’ordinateur portable connecté à la station, sauf que c’est une technologie exclusive à un constructeur. Comme toute technologie propriétaire, le fonctionnement est parfois peu fiable, mais plus souvent encore complètement inopérant. Effet bonus, comme le constructeur est tout content de vendre sa formule super tip-top, il se fiche qu’on puisse faire aussi bien sans utiliser sa technologie à lui en indiquant juste une adresse MAC à cloner dans les réglages réseau du système. Fort de sa techno à lui, il fournit donc des pilotes qui ne marchent qu’à moitié pour changer l’adresse MAC de ses stations d’accueil. Après avoir sollicité la sagesse des moules déhèlefpiennes sur le forum, j’ai compris (et même compris pourquoi) il fallait que j’active le mode « promiscuous » sur la connexion réseau de la station pour que je puisse utiliser sa connexion avec une autre adresse MAC que celle d’origine. C’était une belle histoire, mais ce n’est pas celle que je vais vous raconter aujourd’hui.
L’histoire du jour, c’est que sur mon réseau au taf, je ne peux me connecter qu’avec un adresse MAC validée, à savoir celle de la carte de l’ordinateur portable, et non celle de la station. Vu ma situation, il faut donc que j’active le mode « promiscuous » avant de chercher à me connecter au réseau. Des recherches en ligne disent comment régler de manière permanente une interface réseau en mode promiscuous depuis NetworkManager Dispatcher, mais ces solutions ne fonctionnent pas si vous avez besoin que l’interface soit en mode « promiscuous » avant d’établir la connexion ou si l’interface réseau n’est pas présente à chaque démarrage du système (j’utilise aussi mon ordinateur sans sa station d’accueil). Impossible donc d’indiquer ce réglage dans NetworkManager (ni dans ceux de NetworkManager Dispatcher).
La solution…
Finalement, elle est plutôt simple, même si j’ai mis beaucoup de temps à la trouver : ajouter une règle udev :
cat > /etc/udev/rules.d/50-ethstation.rules << EOF
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ad:re:ss:em:ac:do:ri:gi:ne", NAME="ethstation"
RUN+="/usr/bin/ip link set ethstation promisc on"
EOF
où « ad:re:ss:em:ac:do:ri:gi:ne » est l’adresse MAC de la carte de la station d’accueil. Cette règle exécute une commande qui active le mode "promiscuous" au moment ou l’interface apparaît (c’est-à-dire quand on branche l’ordinateur sur sa station d’accueil) et en profite pour donner un nom explicite à l’interface réseau "ethstation" ce qui facilite un peu la vie pour régler NetworkManager ensuite.
Au cas où je démarre avec la station d’accueil déjà branchée à l’ordinateur, j’ajoute aussi la règle udev dans l’initramfs (ici avec l’outil initramfs-tools qui génère l’initramfs sur une Debian) :
cat > /etc/initramfs-tools/hooks/ethstation << EOF
#!/bin/sh
case $1 in
prereqs)
echo "udev"
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
mkdir -p $DESTDIR/lib/udev/rules.d/
for rules in 50-ethstation.rules; do
if [ -e /etc/udev/rules.d/$rules ]; then
cp -p /etc/udev/rules.d/$rules $DESTDIR/lib/udev/rules.d/
fi
done
EOF
update-initramfs -u
Et voilà, maintenant dès que je branche ma station d’accueil en USB, son interface réseau apparaît avec le nom « ethstation » et est tout de suite mise en mode « promiscuous », et dans mes réglages NetworkManager, j’ai activé le clonage d’adresse MAC pour cette connexion.
… mais ce n’est pas fini !
Mon probème est résolu, mais comme j’ai galéré pour le régler, entre temps je me suis péter de la lecture sur NetworkManager Dispatcher et SystemD et ça m’a donné une autre idée. Pour faciliter l’utilisation des imprimantes sur le réseau du boulot, notre service info a installé un serveur d’impression CUPS qui expose les imprimantes. Donc quand je suis au taf, un coup de :
cat > /etc/cups/client.conf << EOF
ServerName 192.168.1.1
EOF
où « 192.168.1.1 » est l’adresse du serveur d’impression, et j’ai accès aux imprimantes, sans me soucier des pilotes, y compris quand le parc d’imprimantes est renouvelé et que les modèles changent.
Problème de cette solution, quand je ne suis pas connecté au réseau du boulot, le serveur est injoignable et dès que je tente de lancer une impression mes programmes figent pendant presque une minute en attendant le time-out avant de se rabattre sur le serveur local et me permettre d’imprimer. Donc, quand je suis sur un autre réseau que celui du boulot, j’ajoute un petit « # » devant « ServerName » pour commenter ce réglage. C’est laborieux, et chaque fois que j’oublie la manip’, la punition dure une minute à attendre que CUPS time-out, chaque fois que j’ai oublié d’enlever le maudit croisillon, ou alors je dois redémarrer mes logiciels pour qu’ils rechargent la configuration CUPS client si j’ai laissé le croisillon mais que je suis au taf.
Comme je sais désormais quand je suis connecté au boulot ou ailleurs en fonction de ma connexion via ma station d’accueil, autant utiliser cette information pour mettre à jour mon fichier cups.client. Entre en jeu NetworkManager Dispatcher, avec :
cat /etc/NetworkManager/dispatcher.d/50-cupsserverdutaf << EOF
#!/usr/bin/bash -e
if [[ "$1" = "ethstation" ]] ; then
case "$2" in
up)
/usr/local/bin/cupsserver.sh set-server
;;
down)
/usr/local/bin/cupsserver.sh unset-server
;;
esac
fi
EOF
cat > /usr/local/bin/cupsserver.sh << EOF
#!/usr/bin/bash -e
case "$1" in
set-server)
sed -i ’s/^#*\(ServerName\)/\1/’ /etc/cups/client.conf
;;
unset-server)
sed -i ’s/^\(ServerName\)/#\1/’ /etc/cups/client.conf
;;
esac
EOF
Et pouf, j’ai un petit script /usr/local/bin/cupsserver.sh
qui commente ou décommente la ligne "ServerName" dans mes réglages de CUPS en fonction de l’état de ma connexion. Sauf que…
Ce n’est toujours pas fini !
… si je ne débranche pas ma station avant d’éteindre mon ordinateur, le fichier cups.client
reste avec le "ServerName" décommenté à l’extinction, et si je suis sur un autre de réseau au prochain démarrage, sblam, punition d’une minute à la prochaine tentative d’impression. Si seulement il existait un logiciel simple et élégant qui permette de gérer l’état du système et de s’assurer de la cohérence de celui lors des phases de démarrage et d’arrêt. Bon, on ne peut pas tout avoir, mais si on enlève les deux premiers qualificatifs, SystemD répond au besoin. Donc on va faire appel à lui plutôt que d’appeler le script directement, comme ça, SystemD pourra remettre le fichier cups.client
dans un état acceptable lors de l’arrêt. C’est reparti :
cat /etc/NetworkManager/dispatcher.d/50-cupsserverdutaf << EOF
#!/usr/bin/bash -e
if [[ "$1" = "ethstation" ]] ; then
case "$2" in
up)
systemctl start cupsserverdutaf.service
;;
down)
systemctl stop cupsserverdutaf.service
;;
esac
fi
EOF
cat > /etc/systemd/system/cupsserverdutaf.service << EOF
[Unit]
Description=Network CUPS server at mon taf
[Service]
RemainAfterExit=yes
ExecStart=/usr/local/bin/cupsserver.sh set-server
ExecStop=/usr/local/bin/cupsserver.sh unset-server
EOF
Alors attention, ici toute la subtilité est dans le « RemainAfterExit=yes » qui dit à SystemD que ce service « tourne » encore même quand le script ExecStart
a fini de s’exécuter et qu’il faut donc exécuter le script ExecStop
pour arrêter le service au moment voulu. Comme ça, quand on démarre le service SystemD exécute /usr/local/bin/cupsserver.sh set-server
et considère que le service (qui enregistre ici l’état du système connecté sur station d’accueil) est actif. Et quand on arrête de service, soit via l’appel depuis le script de NetworkManager Dispatcher ci-dessus, soit lors l’arrêt du système, SystemD exécute la commande ExecStop
.
Conclusions et perspectives
Maintenant, sur le réseau du boulot, dès que je connecte la station, udev met la carte réseau en mode « promiscuous » qui me permet de l’utiliser. Jusqu’ici ce n’est que du contournement de bug pour que NetworkManager puisse lancer le réglage de la connexion. Lorsque celle-ci est établie, NetworkManager Dispatcher s’active et lance un service SystemD qui, via un simple script, met à jour le fichier cups.client
. Si je me déconnecte du réseau via ma station (si je passe en Wifi par exemple), si je déconnecte la station ou si j’éteints l’ordinateur, le service SystemD est arrêté (par NetworkManager Dispatcher ou par la séquence d’arrêt du système) et met à jour le fichier cups.client
. La vie est belle, les oiseaux chantent, et je peux continuer à imbiber d’encre hors de prix des fibres d’arbres morts pour maximiser mon empreinte carbone. Et en plus, ça me fait une aventure à partager avec vous, mes très chères moules. J’espère que ça vous a plu !
-
C’est celui qui est discutable, pour ceux qui suivent. ↩
# Merci
Posté par Psychofox (Mastodon) . Évalué à 5 (+2/-0).
Merci pour ce journal instructif dans cet océan de journal memes/comique de répétition.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.