Forum Linux.debian/ubuntu [Résolu] Lancer une commande des qu'une connexion internet est détéctée.

Posté par  . Licence CC By‑SA.
Étiquettes :
0
1
mai
2018

Bonjour,
Très récemment, j'ai décidé d'en finir définitivement avec Windows qui ne me servait plus que pour les cours.
J'avais déjà mon debian en dual boot, donc j'installe les logiciels dont j'ai besoin et je me dis qu'il serait bien de mettre en place rsync pour sauvegarder mes cours au cas ou.
J'ai un raspberry pi chez moi donc pas de soucis mais c'est la que j'en viens à vous : comment faire pour que rsync s’exécute dès qu'il détecte un réseau ?
Apres je combinerais ça avec crontab pour qu'il s’exécute au bon moment.
J'imaginais un truc comme ça:
#!/bin/bash

while [ -z $test ]
do
        echo test
        if [ test_reseau ]; then
                rsync
                test=0
        fi
done

Et le script serait exécuté à 18h tous les jours par exemple.
Peut être un ping google.fr avec un grep ?
N'y a t'il pas une solution plus "propre" ?
Merci d'avance.

  • # ifup.d

    Posté par  . Évalué à 1.

    Cela doit dépendre des distributions mais normalement si tu mets un script shell dans /etc/network/ifup.d/ il s'ecécutera à chaque fois qu'un interface réseau se connecte. Dans ce script tu peux pinger un host comme google.fr et si ça passe, lancer ton rsync.

    • [^] # Re: ifup.d

      Posté par  . Évalué à 1.

      Merci pour cette réponse, j'ai donc placé un script tout simple (juste un echo redirigé vers un fichier) dans /etc/network/if-up.d (légèrement différent mais cela doit dépendre des distributions) mais malgré plusieurs connexions et déconnexions il n'y a rien…

      • [^] # Re: ifup.d

        Posté par  (site web personnel) . Évalué à 1. Dernière modification le 02 mai 2018 à 09:23.

        Bon après là c'est du debug classique hein

        Arrives-tu à faire tourner ton script en standalone (sans passer par if-up.d) ?

        Es-tu sûr que le script s'exécute ? Vérifie ses droits, notamment le droit x pour l'utilisateur qui va bien (ce ne sera pas ton utilisateur, mais probablement root) et qu'il est dans un dossier accessible (pas dans ton home directory en somme)

        Dans le doute, ajoute un echo vers ton fichier, non conditionné, dès le début de ton script pour s'assurer qu'il est bien exécuté.

        Ensuite ajoute un echo dans un bloc else, pour savoir si tu tombes dans l'embranchement "pas d'internet" pour une raison quelconque.

        Bref, diagnostique le problème :-)

        • [^] # Re: ifup.d

          Posté par  . Évalué à 1.

          Oui oui, un echo au debut du fichier sans condition c'est ce que j'ai fait.
          J'ai aussi donné les droits d'execution à tous les utilisateurs au cas ou.
          Si j'éxecute le script à la main le comportement est bien celui attendu.
          Et oui mon script est au bon endroit, donc je pense que le problème ne vient pas de la, je pense plutot que le comportement de ce dossier n'est pas celui que l'on recherche.

      • [^] # Re: ifup.d

        Posté par  . Évalué à 2.

        ifup.d c'est quand l'interface physique s'active,
        - le cable est branché en RJ45
        - la carte wifi est activé (mode avion OFF)

        tu peux simplement placer ton script ou tu veux et l'appeler depuis un fichier de configuration dans /etc/cron.d/
        ou dans crontab -e -u ton_user qui dira de le lancer à 18h.

        et c'est ton script qui va regarder sur quel reseau il est (sur un portable, ca ne sert à rien de tenter de se connecter à ton RPi si tu n'es pas à ton domicile), et lancer le rsync uniquement dans ce cas là.

        • [^] # Re: ifup.d

          Posté par  . Évalué à 1.

          Peu m'importe le réseau sur lequel je suis, j'ai des redirections sur les ports 21 (ssh), 80, 443 (http/https) et 873 (rsync) donc je n'ai pas besoin d'être sur le même réseau.
          Et oui mon script va regarder si il est connecté à un réseau mais la question est comment faire ?
          Y a-t'il une autre solution que de faire avec ping et grep ?

  • # google (ou autre moteur de recherche) est ton ami

    Posté par  . Évalué à 2.

    • [^] # Re: google (ou autre moteur de recherche) est ton ami

      Posté par  . Évalué à 1.

      Je n'avais en effet pas vu ce topic (malgré des recherches), mais la solution n'est pas celle que je souhaite, mon script ne doit pas s’exécuter au démarrage d'une interface mais à une connexion à un réseau wifi (mon ordinateur n'ayant pas de port rj45).

      • [^] # Re: google (ou autre moteur de recherche) est ton ami

        Posté par  . Évalué à 2.

        Dans ce cas si tu as des pistes je suis intéressé. Personnellement, si je devais le faire, j'irais voir comment les plugins de nos IHM vont détecter la présence d'une connection wifi.

        • [^] # Re: google (ou autre moteur de recherche) est ton ami

          Posté par  . Évalué à 2. Dernière modification le 02 mai 2018 à 18:07.

          • [^] # Re: google (ou autre moteur de recherche) est ton ami

            Posté par  . Évalué à 1.

            Intéressant, j'irais creuser.
            En attendant, j'utilise ce code :

            #!/bin/bash
            while [ 1 ]
            do
                    ping -c 1 google.fr
                    if [ $? = 0 ]
                    then
                            break
                    fi
                    sleep 1m
            done
            
            • [^] # Re: google (ou autre moteur de recherche) est ton ami

              Posté par  . Évalué à 1.

              Intéressant, j'irais creuser.
              En attendant, j'utilise ce code :

              #!/bin/bash
              while [ 1 ]
              do
                      ping -c 1 google.fr
                      if [ $? = 0 ]
                      then
                              rsync
                              break
                      fi
                      sleep 1m
              done
              

              Qui me paraissait la solution la plus propre à ma disposition.
              Je regarde votre lien mais je ne sais pas si il est valable car je dois effectuer ça une seule fois par jour a partir d'une heure donnée.
              Merci quand même,
              Raphael

              • [^] # Re: google (ou autre moteur de recherche) est ton ami

                Posté par  . Évalué à 2. Dernière modification le 02 mai 2018 à 23:20.

                Je cite la demande initiale :

                comment faire pour que rsync s’exécute dès qu'il détecte un reseau ?

                C'est à mon avis la façon la plus propre de répondre à ce problème. Maintenant, s'il y a besoin d'exécuter cette commande à une heure précise, il vaut mieux passer par cron. Celà dit, on peut envisager un script qui positionne un fichier témoin quand le réseau est up, et le supprime quand le réseau est down, et le script lancé par cron ne s'exécute que lorsque ce fichier est présent.

                Maintenant je n'ai pas perdu mon temps car j'avais pensé à faire ça pour synchroniser le homedir de mon portable (homedir que j'ai malencontreusement perdu hier), et je n'avais pas pensé à NetworkManager, et c'est en répondant à ce post que j'y ai pensé, donc c'est moi qui te remercie.

                • [^] # Re: google (ou autre moteur de recherche) est ton ami

                  Posté par  . Évalué à 2.

                  Juste si ça vous intéresse, voici mon dernier script:

                  #!/bin/bash
                  
                  executed=$(cat executed.txt)
                  if [ "$executed" = "0" ]
                  then
                          echo 2 > executed.txt
                          while [ 1 ]
                          do
                                  ping -c 1 google.fr
                                  if [ $? = 0 ]
                                  then
                                          rsync
                                          echo 1 > executed.txt
                                          break
                                  fi
                                  sleep 1m
                          done
                  fi
                  

                  Il y a un cron qui remet le fichier avec un 0 dedans tous les jours a minuit et ce script est exécuté toutes les 10 minutes a partir de 18h.
                  Ainsi si l'ordi est éteint à 18h c'est bon et ca syncro qu'une seule fois par jour.
                  Le 2 dans executed.txt peut être remplacé par un fichier lock mais c'est dans l'idée.
                  Je pense qu'on peut clore le sujet car deux solutions ont été proposées pour des besoins différent, c'est parfait.
                  Merci à tous,
                  Raphael

  • # par le client dhcp

    Posté par  . Évalué à 2.

    Sinon, il est aussi possible avec certains clients dhcp d'exécuter un script lorsque l'on reçoit un bail DHCP.
    Du coup, en écrivant les scripts qui vont bien (qui doivent, entres autres, configurer le réseau correctement par contre), il devrait être possible d'identifier le réseau sur lequel on est (par exemple, en obtenant l'adresse MAC du serveur DHCP, en demandant au daemon wpa_supplicant, en vérifiant la présence d'un nom DNS connu, etc… avec tous les risque d'usurpation d'identité à prendre en compte, bien entendu, sauf si l'on sait que l'on a une machine spécifique sur laquelle on peut vérifier une identité par exemple SSH, je ne vois pas trop comment éviter ce problème de toute façon).

    • [^] # Re: par le client dhcp

      Posté par  . Évalué à 1.

      Merci, ça peut être intéressant.
      De toute façon, comme dit lus haut, je n'ai pas besoin de vérifier l'identité du réseau car ma box est configurée pour rediriger les requêtes rsync vers mon RPi.
      Malgré tout, je pense que cette solution c'est un peu se compliquer la vie, mais je me renseignerai.

      • [^] # Re: par le client dhcp

        Posté par  . Évalué à 2.

        Malgré tout, je pense que cette solution c'est un peu se compliquer la vie, mais je me renseignerai.

        C'était juste pour mentionner cette possibilité, on ne sait jamais l'utilité que ça peut avoir, par exemple dans le cas ou quelqu'un n'utilise pas ifupdown (qui est, je crois, spécifique à Debian et ses filles, et n'est donc pas disponible sur des systèmes comme voidlinux, par exemple).

    • [^] # Re: par le client dhcp

      Posté par  . Évalué à 2.

      Avec dhcpcd aussi (man dhcpcd-run-hooks)

  • # systemd

    Posté par  . Évalué à 3.

    https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

    As tu tenté un module (?) systemd ?
    Tu as des cibles simple que tu peux mettre en dépendances qui ton module sera démarré/arrêté quand une de ces cibles deviens valide/invalide.

    • [^] # Re: systemd

      Posté par  . Évalué à 1. Dernière modification le 03 mai 2018 à 16:59.

      Bonjour,
      Cette solution m’intéresse beaucoup mais je ne comprend pas, la commande
      systemctl status network-online.target

      Me renvoie systématiquement que le réseau est actif, par conséquent mon démon ne marche pas…
      Aurais-je mal compris le fonctionnement de ce démon ?

  • # Avec network manager et dispatcher:

    Posté par  (site web personnel) . Évalué à 2.

    Je fais exactement ça avec mon laptop. Quand je me connecte sur le wifi de la maison, je lance un borg backup sur mon raspberry.

    Je suis sous Fedora, mais ça devrait fonctionner avec n'importe quel Os utilisant network-manager:

    Dans /etc/NetworkManager/dispatcher.d , j'ai créé le fichier 99-backup.sh suivant:

    #!/bin/bash
    IF=$1
    STATUS=$2
    if [ "$IF" == "wlp3s0" ]
    then
      case "$2" in
      (up)
         if [ $CONNECTION_ID == "atom" ] ; then
           su tom -c "/home/tom/Documents/Opendoor/Developpement/Scripts/Backups/backup.sh"
         fi
         ;;      
      esac
    fi

    La variable CONNECTION_ID contient le nom de la connexion active. IF et STATUS contiennent respectivement l'interface concernée et l'opération.

    Mes 2 ¢

    • [^] # Re: Avec network manager et dispatcher:

      Posté par  . Évalué à 1.

      Merci pour ce script, je pourrais le simplifier vu que je peux synchroniser mes données de n'importe où.
      Seulement, quand je place ce script dans le dossier indiqué, cela ne marche pas (j'ai bien sur adapté le code à mon réseau).
      J'ai donc essayé de faire un appel sans condition a un simple - echo redirigé vers un fichier mais rien, même après un redémarrage du service…
      J'ai comme l'impression que NetworkManager ne fonctionne pas normalement chez moi, c'est déjà la deuxième solution avec ce service qui ne marche pas, pourtant c'est bien lui qui gère le réseau car quand je le redémarre je perd la connexion…
      Une idée ?
      PS: J'ai déjà réinstallé NetworkManager mais étrangement, après une désinstallation en mode simulation, je n'avais plus l'icone en bas de mon bureau mais j'avais toujours accès à internet, peut être est-ce dû au fonctionnement du mode simulation.

      • [^] # Re: Avec network manager et dispatcher:

        Posté par  (site web personnel) . Évalué à 1.

        Le script est bien exécutable ?

        Que disent les logs, ( journalctl |grep nm-dispatcher )

        • [^] # Re: Avec network manager et dispatcher:

          Posté par  . Évalué à 2.

          Bonjour,
          Après vérification des logs, il s'agissait bien d'un problème de permissions.
          Pour ceux qui liront ce forum : attention, le fichier doit être propriété de root et surtout doit être en chmod 700, un chmod 777 ne marchera pas !
          Au final voici mon script, nommé 99-backup.sh, placé dans /etc/NetworkManager/dispatcher.d/

          #!/bin/bash
          
          heure=`date +%H`
          if [ $heure -ge 18 ] && [ $heure -lt 23 ] #vous pouvez changer l'heure de début et de fin de l’exécution du script
          then
                  echo yes
                  IF=$1
                  STATUS=$2
                  if [ "$IF" == "wlp2s0" ] #à remplacer par le nom de votre interface
                  then
                          case "$2" in
                          (up)
                                  su user -c "bash /home/user/dev/scripts/backup.sh" #nom d'utilisateur et chemin du script à changer bien evidemment
                                  ;;
                          esac
                  fi
          fi

          Ici je n'ai pas fait de vérification du réseau car je peux le faire de n'importe ou mais il suffit de vous aider du script originel de @ranDom pour le faire.
          Merci à tous, c'est un sujet résolu !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.