web-dev-qa-db-fra.com

NetworkManager - le script if-down.d ne s'exécute pas

J'essaie d'utiliser /etc/network/if-up.d/ et /etc/network/if-down.d pour envoyer un SMS de mon ordinateur à mon téléphone via Gmail lorsque mon ordinateur entre ou sort d'un réseau sans fil. Le script principal est écrit en Perl et les scripts de ces dossiers sont essentiellement des wrappers. Voici le script Perl, ~user/bin/laptopSMS.pl:

#!/usr/bin/Perl

use strict;
use warnings;

use Email::Send;
use Email::Send::Gmail;
use Email::Simple::Creator;

my $addy = q{[email protected]};
my $pass  = q{myPass};
my $sms   = q{[email protected]};

my $email = Email::Simple->create(
   header => [
          From    => $addy,
              To      => $sms,
          Subject => "$ARGV[0]",
  ],
  body => "$ARGV[1] / $ARGV[2]",
);

my $sender = Email::Send->new(
    {     mailer      => 'Gmail',
          mailer_args => [
              username => $addy,
              password => $pass,
          ]
    }
 );
eval { $sender->send($email) };
die "Error sending email: $@" if $@;

Le script suivant est /etc/network/if-up.d/99postconnect_laptopSMS:

#!/bin/bash

set -e

if [ "$IFACE" == "wlan0" ]; then
    ipaddr=`ip addr | grep inet[^6] | grep -v 127.0.0.1 | awk {'print $2'} | sed 's!/[0-9]*!!g'`
    ssid=`iwgetid -r`
    ~user/bin/laptopSMS.pl "connected" "$ssid" "$ipaddr"
fi

Cela fonctionne bien et je reçois un message texte chaque fois que mon téléphone entre en réseau. le script if-down.d correspondant pour envoyer un signal de "déconnexion" ne le fait toutefois pas:

#!/bin/bash

set -e

if [ "$IFACE" == "wlan0" ]; then
    ~user/bin/laptopSMS.pl "disconnect" "disconnect" "disconnect"
fi

Ceci n’exécute pas; J'ai essayé de mettre l'extrait de code suivant dans le script pour voir si quelque chose est en cours d'exécution:

ifdowntest=/home/user/ifdown_test.txt
date >> $ifdowntest
whoami >> $ifdowntest
ifconfig >> $ifdowntest
sleep 5

Le fait de laisser cela dans le script seul s'exécute correctement, mais ne l'ajoute pas à l'encapsuleur au script Perl. (Aucun fichier n'est généré.)

La sortie de ifconfig >> $ifdowntest montre que wlan0 n'a pas d'adresse IP - elle a été supprimée. Puis-je obtenir que ce script soit exécuté en pré-descente (je pensais que c'était ce que le dossier if-down.d avait)) ou en quelque sorte éditer quelque chose pour que cela fonctionne? Notez que le script Perl met environ 3 secondes à se déclencher lors de son exécution manuelle.

FWIW: Je désactive manuellement le réseau en cliquant sur l'applet NetworkManager, puis en cliquant sur "Déconnecter". Je pourrais aussi potentiellement tuer mon routeur pour le tester, mais je ne sais pas s’il existe une différence entre une déconnexion manuelle et un AP qui n’existe plus.

2
Dang Khoa

Essayez de déplacer votre script de "déconnexion" vers / etc/network/if-post-down.d, c’est le répertoire qui devrait être exécuté lorsque NetworkManager se déconnecte, plutôt que if-down.d (ce qui signifierait déclencher quelque chose lorsque l’appareil tombe en panne, pas quand il vient de se déconnecter). Pour ce que vous essayez d’atteindre, cela ne devrait pas être un problème, mais en fait, évitez d’essayer d’envoyer le SMS via le réseau alors que la passerelle par défaut n’a peut-être pas encore été mise à jour.

Cela suppose évidemment que vous ayez encore une autre connexion (filaire) pour envoyer le SMS. Tout le reste est trop incertain et peu fiable pour être utile (vous ne pouvez pas vous attendre à ce que la connexion sans fil fonctionne suffisamment au moment où les scripts sont exécutés pour envoyer un SMS dessus).

Si vous souhaitez approfondir ce sujet, vous pouvez consulter / etc/NetworkManager/dispatcher.d/01ifupdown.