NetworkManager - o script if-down.d não é executado

2

Estou tentando usar /etc/network/if-up.d/ e /etc/network/if-down.d para enviar um SMS do meu computador para meu telefone via Gmail sempre que meu computador entrar ou sair de uma rede sem fio. O script principal é escrito em Perl, e os scripts nas referidas pastas são essencialmente wrappers em torno dele. Aqui está o 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 $@;

O script a seguir é /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 '} | sed 's!/[0-9]*!!g''
    ssid='iwgetid -r'
    ~user/bin/laptopSMS.pl "connected" "$ssid" "$ipaddr"
fi

Isso funciona bem e recebo uma mensagem de texto sempre que meu telefone entra em uma rede; o script if-down.d correspondente enviar um sinal de "desconexão", no entanto:

#!/bin/bash

set -e

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

Isso não está sendo executado; Tentei colocar o seguinte snippet no script para ver se algo está sendo executado:

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

Deixar isso no script por si só é executado bem, mas anexá-lo ao wrapper para o script Perl não. (Nenhum arquivo é gerado.)

A saída de ifconfig >> $ifdowntest mostra que o wlan0 não tem um IP - ele foi removido. Posso obter este script para executar pre-down (eu pensei que é o que a pasta if-down.d fez) ou de alguma forma editar algo para fazer este trabalho? Note que leva cerca de 3 segundos para o script Perl ser acionado quando executado manualmente.

FWIW: Estou derrubando a rede manualmente clicando no applet NetworkManager e clicando em "Desconectar". Eu poderia apenas matar meu roteador para testar isso também, mas não sei se há uma diferença entre desconectar manualmente e o AP não existir mais.

    
por Dang Khoa 21.09.2011 / 08:18

1 resposta

4

Tente mover seu script de "desconexão" para /etc/network/if-post-down.d , esse é o diretório que deve ser executado quando o NetworkManager se desconecta, em vez de se -down.d (o que significaria disparar algo quando o dispositivo fica inativo, não quando é desconectado). Para o que você está tentando alcançar, não deve ser um problema e, de fato, evitar tentar enviar o SMS pela rede, enquanto o gateway padrão ainda pode não ter sido atualizado.

Isso obviamente pressupõe que você ainda tenha outra conexão (com fio) para enviar o SMS. Qualquer outra coisa é muito incerta e não confiável para valer a pena usar (você não pode esperar que a conexão sem fio funcione o suficiente no momento em que os scripts são executados para enviar um SMS sobre ela).

Se você quiser investigar mais sobre isso, consulte /etc/NetworkManager/dispatcher.d/01ifupdown .

    
por Mathieu Trudel-Lapierre 02.11.2011 / 15:44