[Montage réseau] Script attente de réseau pour systemd

Applications, problèmes de configuration réseau
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

[Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

Bonjour,

Comme de nombreuses personnes possèdent des soucis avec les montages réseaux, et comme je n’apprécie pas trop l'utilisation de x-systemd.automount j'ai essayé de corriger ce point en m'inspirant de NetworkManager-wait-online.service

J'ouvre ce sujet pour discuter de mon implémentation, pour permettre de suggérer des améliorations et pourquoi pas le mettre dans le Wiki et si oui quel serait le meilleur endroit ?

Donc voici les 2 fichiers nécessaires :
/usr/bin/network-wait-online.sh

Code : Tout sélectionner

#!/bin/bash

ADDR_PING=$1
TIMEOUT=$2

TIMEWAIT=$(( TIMEOUT * 5 ))
resping=3

for timeleft in $(eval "echo {$TIMEWAIT..0}")
do
    timeleft=$(( timeleft / 5 ))
    /usr/bin/ping -c1 -W$timeleft $ADDR_PING
    resping=$?
    if [ $resping -eq 2 ] ; then
        sleep 0.2
    else
        break
    fi
done

exit $resping
/etc/systemd/system/network-wait-online.service

Code : Tout sélectionner

[Unit]
Description=Network Wait Online
After=dhcpcd@eth0.service
Wants=network.target
Before=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/network-wait-online.sh 192.168.0.254 10

[Install]
WantedBy=network.target
Le service à été conçu pour être exécuté après mon service réseau qui est dhcpcd@eth0.service, mais il peut être remplacé par n'importe quel autre service réseau (Wicd, netcfg, ...)
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Plutôt pratique comme script, il pourrait être sympa de le faire fonctionner pour tous types de services réseau et tous types d'interfaces et pourquoi pas le mettre sur AUR ?

J'ai testé avec cette modification et ça fonctionne pour mon interface dhcpcd@enp0s25, avant :

Code : Tout sélectionner

After=dhcpcd@eth0.service
Par :

Code : Tout sélectionner

After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Il pourrait aussi être pratique d'initier le service de cette façon :

Code : Tout sélectionner

systemctl enable network-wait-online@192.168.0.254
De cette façon pas besoin de modifier network-wait-online.service au cas par cas, on peut choisir qui pinger, que ce soit 8.8.8.8 / 192.168.1.254 / google.fr etc...

Je trouve les timers trop court aussi.
Pour pinger Internet c'est plus long et ça peut servir de vouloir attendre un accès au net pour les services comme ntpd par exemple.
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [Montage réseau] Script attente de réseau pour systemd

Message par tuxce »

J'allais écrire que pour les dhcpcd*, il me paraît plus simple de modifier le service qu'on utiliserait éventuellement pour le faire attendre une ip quand j'ai vu qu'en fait le dhcpcd@.service fait déjà cela, il ne rend la main que quand il a une adresse IP.
Pour dhcpcd.service, on peut le modifier pour ne pas lui passer le -b
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

J'ai testé en faisant quelques modifications et ça marche aussi :

/usr/lib/systemd/system/network-wait-online@.service :

Code : Tout sélectionner

[Unit]
Description=Network Wait Online
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Wants=network.target
Before=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/network-wait-online.sh %I

[Install]
WantedBy=multi-user.target
/usr/bin/network-wait-online.sh :

Code : Tout sélectionner

#!/bin/bash

for i in `seq 1 20`
do
        if eval "ping -c1 -W1 $1"; then
                sleep 2
                break
        else
                sleep 1
        fi
done

exit
Activation du service :

Code : Tout sélectionner

systemctl enable network-wait-online@8.8.4.4
systemctl status network-wait-online@8.8.4.4 :

Code : Tout sélectionner

network-wait-online@8.8.4.4.service - Network Wait Online
	  Loaded: loaded (/usr/lib/systemd/system/network-wait-online@.service; enabled)
	  Active: inactive (dead) since mer. 2013-02-13 09:44:46 CET; 1min 9s ago
	 Process: 323 ExecStart=/usr/bin/network-wait-online.sh %I (code=exited, status=0/SUCCESS)

févr. 13 09:44:40 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:41 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:42 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:43 tetsu-arch network-wait-online.sh[323]: connect: Network is unreachable
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data.
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: 64 bytes from 8.8.4.4: icmp_seq=1 ttl=47 time=29.5 ms
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: --- 8.8.4.4 ping statistics ---
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: 1 packets transmitted, 1 received, 0% packet loss, time 0ms
févr. 13 09:44:44 tetsu-arch network-wait-online.sh[323]: rtt min/avg/max/mdev = 29.599/29.599/29.599/0.000 ms
févr. 13 09:44:46 tetsu-arch systemd[1]: Started Network Wait Online.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

@Tetsumaki Merci pour les suggestions, en effet on peut l'améliorer via passage de paramètre, mais sinon les timings sont déjà très long et celui-ci est un paramètre, personnellement je l'ai fixé à 10 secondes.

Une petite explication de mon script :
- On lance un ping avec 10 secondes de timeout
- S'il retourne 2 car aucune IP n'est encore fixé, on attend 0.2 seconde
- On lance un ping avec 10 secondes de timeout
- ...
- On lance un ping avec 9 secondes de timeout
- ...
- Si le ping retourne autre chose que 2, soit le ping a réussi soit il y a échoué après le timeout
- On retourne le code d’erreur pour en informer systemd
@Tetsumaki Ton script est pire que le mien, de plus pourquoi ajouter un sleep 2 ? Certes mon sleep 0.2 est un peu bourrin mais au moins on a une meilleur réactivité, après on peut très bien ajuster le code pour avoir un pas un peu moins brutale

@Tuxce J'utilise dhcpcd@.service et le service lancé après qui a comme dépendance network.target n'a pas immédiatement accès au réseau en IPv4 uniquement en IPv6...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

@benjarobin je suis d'accord il est crade mon network-wait-online.sh je voulais simplifier pour mes tests.
Je continue les tests.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10709
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Montage réseau] Script attente de réseau pour systemd

Message par FoolEcho »

Sur /usr/bin/network-wait-online.sh:
benjarobin a écrit :

Code : Tout sélectionner

    /usr/bin/ping -c1 -W$timeleft $ADDR_PING
    resping=$?
    if [ $resping -eq 2 ] ; then
        sleep 0.2
    else
        break
    fi
:?: Je suppose que tu as testé mais je demande quand même: le sleep, même minime, est nécessaire ? ( :aimepas: ) C'est-à-dire sortir sur un code autre que 2 et continuer la boucle sinon n'est pas suffisant ou la latence entre les 2 pings n'est pas suffisante sans le sleep ?

Sinon je ne peux pas tester, pas de montage réseau :P ... mais ce qui a été dit avant comme le passage des paramètres est mieux.
benjarobin a écrit :pourquoi pas le mettre dans le Wiki et si oui quel serait le meilleur endroit ?
C'est une colle vu qu'il n'y a pas de pages vraiment dédiées à ça... :)
On pourrait rajouter quelque chose sur la page de Systemd (équivalent à l'automount du wiki en) mais je pense qu'un script "officieux" n'y a pas trop sa place et la page est déjà bien chargée...
:idea: Du coup, je verrai bien ça sur la page Services dans une autre section qui pourrait regrouper tous les services de ce type comme on peut en trouver sur le wiki (en): https://wiki.archlinux.org/index.php/Systemd/Services (et du coup en rapatrier éventuellement quelques uns ou au moins lier leur page).
«The following statement is not true. The previous statement is true.» :nage:
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

@FoolEcho Ping retourne comme code d'erreur 2 si le réseau n'est pas accessible et dans ce cas bien que l'on est définit un timeout via l'option "-W" ping retourne immédiatement. Donc en gros on essaye/on vérifie toute les 0.2 secondes que l'on est du réseau, et une fois que l'on en a, on fait un ping avec le timeout passé en paramètre

Si on ne met pas de sleep, on a 100% d'usage CPU car le ping retourne de suite
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

Suite à vos nombreuses remarques que j'ai pu analyser cette fois ci à tête reposée, je propose une nouvelle version en ayant essayé de prendre en compte toute vos améliorations
/etc/systemd/system/network-wait-online@.service

Code : Tout sélectionner

[Unit]
Description=Network Wait Online
After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Wants=network.target
Before=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/network-wait-online.sh %I

[Install]
WantedBy=network.target
/usr/bin/network-wait-online.sh

Code : Tout sélectionner

#!/bin/bash

ADDR_PING=$1
TIMEOUT=$2

[ -z "$ADDR_PING" ] && exit 5
[ -z "$TIMEOUT" ] && TIMEOUT=30

timeEnd=$(( $(date +%s) + TIMEOUT ))
timeLeft=$TIMEOUT
resPing=4

while [ $timeLeft -gt 0 ] ; do

	/usr/bin/ping -c1 -W1 $ADDR_PING
	resPing=$?
	if [ $resPing -eq 0 ] ; then
		break
	else
		sleep 0.3
		timeLeft=$(( timeEnd - $(date +%s) ))
	fi

done

exit $resPing

Ou alors cette version qui n'utilise pas de ping, mais qui à l’inconvénient de fournir toujours un résultat s'il y a une gateway valide de définit et que l'on possède 2 cartes réseaux : Une externe et une interne, l'IP de l'externe ayant été positionnée avant celle de l'interne... Cela devient difficile de faire du générique, je crains que ce soit plus simple de fournir des exemples et les personnes pourront s'en inspirer :D

Code : Tout sélectionner

#!/bin/bash

ADDR_ROUTE=$1
TIMEOUT=$2

[ -z "$ADDR_ROUTE" ] && exit 5
[ -z "$TIMEOUT" ] && TIMEOUT=30

nbStepLeft=$(( TIMEOUT * 5 ))

while [ $nbStepLeft -gt 0 ] ; do

    /usr/sbin/ip route get $ADDR_ROUTE && exit 0
    sleep 0.2
    nbStepLeft=$(( nbStepLeft - 1 ))

done

exit 1
Merci encore... J'attends les critiques de pied ferme :D
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Je vais tester ça de suite.
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Ça fonctionne super bien.
J'ai supprimé :

Code : Tout sélectionner

noauto,x-systemd.automount
dans mon /etc/fstab et aucune erreur au boot.
Pour mes tests j'ai désactivé le lancement automatique de gdm pour bien voir le déroulement.

Je l'ai activé de cette façon :

Code : Tout sélectionner

systemctl enable network-wait-online@8.8.4.4
Je me suis fais un paquet pour l'installer proprement sur mon serveur, ça te dérange si je le publie sur AUR ou pas ?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

Je préfère le gérer moi même, je suis l'auteur et donc son mainteneur, ce sera plus pratique... Le but de se sujet est d'avoir des retours avant une éventuelle publication sur AUR, Wiki...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Aucun problème benjarobin, c'est tout à ton honneur ne t'inquiètes pas.
Quoi qu'il arrive j'ai mis le paquet pour mes tests ici provisoirement http://tetsumaki.free.fr/network-wait-online/
Je ne permettrais pas de le mettre sur AUR.
Il pourrait être sympa de faire encore une modification sans doute.

Avant :

Code : Tout sélectionner

After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service
Après :

Code : Tout sélectionner

After=dhcpcd.service dhcpcd@.service netcfg.service netcfg@.service NetworkManager.service wicd.service
Je sais qu'il existe NetworkManager-wait-online.service pour NetworkManager mais je me suis dis que ça ne coûtait rien d'ajouter NetworkManager.service et wicd.service.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

Je me posais aussi cette question, doit-on ajouter tous les gestionnaires réseaux, par défaut je ne pense pas que mettre NetworkManager soit une bonne idée, car NetworkManager à un comportement très particulier et différent des autres, en effet je compter ajouter wicd à la liste
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Oui tu dois avoir raison concernant networkmanager et ne pas le mettre est une bonne idée.
J'ai installé mon paquet sur le serveur et sur le pc et ça marche au poil.
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Ça avance benjarobin ?
Pour ma part je trouve ça nickel comme il est actuellement, adopté sur mes 2 machines, j'ai testé pas mal de reboot et aucune erreur avec smbd ou autres.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

Je m'en occuperai ce Week-end, rien ne presse non ?
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Non pas du tout.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17393
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Montage réseau] Script attente de réseau pour systemd

Message par benjarobin »

Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Tetsumaki
archer
Messages : 141
Inscription : jeu. 06 mai 2010, 05:44

Re: [Montage réseau] Script attente de réseau pour systemd

Message par Tetsumaki »

Salut, il y a une erreur dans ton PKGBUILD et je me suis permis 2-3 modifications.

1. Manque les guillemets, du coup erreur à la création du package si je me trouve dans un répertoire avec des espaces.
J'ai eu cette erreur en me trouvant dans "/home/tetsumaki/test 123/" :

Code : Tout sélectionner

==> ERREUR : Vous n'avez pas les permissions nécessaires (accès en écriture) pour enregistrer les paquets dans /home/tetsumaki/test.
    Abandon...
2. Je pense qu'il pourrait être sympa d'ajouter systemd en dépendance, en théorie on l'a forcément mais sur une vieille install, non.

3. C'est pas très propre d'utiliser mkdir dans un PKGBUILD, il est préférable d'utiliser install -D, de plus ça raccourci le code et c'est plus lisible.
Exemple :

Code : Tout sélectionner

package() {
	install -Dm755 "${srcdir}/network-wait-online.sh" "${pkgdir}/usr/bin/network-wait-online"
	install -Dm644 "${srcdir}/network-wait-online@.service" "${pkgdir}/usr/lib/systemd/system/network-wait-online@.service"
}
Je me suis permis de mettre le paquet ainsi que le paquet source modifié ici : http://tetsumaki.free.fr/network-wait-online/
Pour comparer :
Ton PKGBUILD : https://aur.archlinux.org/packages/ne/n ... e/PKGBUILD
Mon PKGBUILD : http://tetsumaki.free.fr/network-wait-online/PKGBUILD
Je me suis mis en contributor, libre à toi d'accepter, en tout cas ton script me tiens à coeur réellement ça m'honorerait, sérieusement je me vois mal ne pas l'utiliser, ça évite vraiment pas mal d'erreur au boot avec mes services réseaux (smbd, ntpd, ...)

Je pense aussi qu'il serait sympa d'ajouter un network-wait-online.install avec une fonction post_instal() expliquant en anglais que pour activer le service il faut tapper systemctl enable network-wait-install@maValeur, maValeur correspondant à la une ip publique/privé ou un dns exemple 8.8.4.4 ou google.fr par exemple.

PS : j'ai voté pour ton paquet, t'as même pas voté pour ton propre paquet! :)
Répondre