Estou fornecendo um script que escuta os sinais do dbus, o que permitirá que você reaja mais rapidamente do que se estivesse pesquisando alterações na sua configuração de rede atual. Ajuda em sistemas onde scripts / etc / não são executados quando você gostaria (como no meu sistema 14.04).
meus hooksd de entrada / saída não funcionam
O NetworkManager inicia o dhclient com o sinalizador -sf /usr/lib/NetworkManager/nm-dhcp-client.action
que parece substituir o comportamento normal do gancho de entrada / saída. O comportamento padrão com o dhclient é chamar scripts /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Esses não são chamados no meu sistema.
meus scripts do dispatcher do NetworkManager.d também não funcionam
NM, no entanto, invoca um conjunto diferente de scripts, in /etc/NetworkManager/dispatcher.d
, para informar sobre vários eventos. A página do manual NetworkManager (8) define dhcp4-change
e dhcp6-change
ações que parecem fazer exatamente o que você deseja. Apesar do que a página de manual diz, pelo menos no meu sistema, apenas up
e as down
ações são invocadas. Não consigo fazer com que esses scripts disparem em mais nada. Portanto, este também não é um ótimo caminho para monitorar alterações de IP.
então, bisbilhotar diretamente nos sinais dbus emitidos pelo NM
nm-dhcp-client.action
( fonte ), na linha de comando, simplesmente converte todas as variáveis de ambiente definidas pelo dhclient em um sinal dbus. Essas variáveis de ambiente são definidas em man dhclient-script
(8). Um de particular interesse é $new_ip_address
. O que você pode fazer, conforme sugerido por @Bernhard, é monitorar o sinal e agir de acordo com o conteúdo.
Aqui está um programa que espionará todos os dados de eventos sinalizados por esse binário:
#!/bin/bash -e
#
# This script listens for the org.freedesktop.nm_dhcp_client signal.
# The signal is emitted every time dhclient-script would execute.
# It has the same contents as the environment passed to
# dhclient-script (8). Refer to manpage for variables of interest.
#
# "org.freedesktop.nm_dhcp_client" is an undocumented signal name,
# as far as I could tell. it is emitted by nm-dhcp-client.action,
# which is from the NetworkManager package source code.
#
# detail: todo cleanup subprocess on exit. if the parent exits,
# the subprocess will linger until it tries to print
# at which point it will get SIGPIPE and clean itself.
# trap on bash's EXIT signal to do proper cleanup.
mkfifo /tmp/monitor-nm-change
(
dbus-monitor --system "type='signal',interface='org.freedesktop.nm_dhcp_client'"
) > /tmp/monitor-nm-change &
exec </tmp/monitor-nm-change
rm /tmp/monitor-nm-change
while read EVENT; do
#change this condition to the event you're interested in
if echo "$EVENT" | grep -q BOUND6; then
# do something interesting
echo "current ipv6 addresses:"
ip addr show | grep inet6
fi
done
A saída do dbus-monitor não é simples de analisar em scripts. Talvez seja mais fácil acionar a presença de determinadas palavras-chave, por exemplo new_ip_address
, e a partir daí usar ferramentas diferentes para obter as informações que foram alteradas (por exemplo, ip ou ifconfig).
# example output data from dbus-monitor for that signal
...
dict entry(
string "new_routers"
variant array of bytes "192.168.2.11"
)
dict entry(
string "new_subnet_mask"
variant array of bytes "255.255.255.0"
)
dict entry(
string "new_network_number"
variant array of bytes "192.168.2.0"
)
dict entry(
string "new_ip_address"
variant array of bytes "192.168.2.4"
)
dict entry(
string "pid"
variant array of bytes "12114"
)
dict entry(
string "reason"
variant array of bytes "REBOOT"
)
dict entry(
string "interface"
variant array of bytes "eth0"
)
...
Experimente!
dhclient-enter-hooks.d
script ... mas nunca tentei! O actual/etc/dhcp/dhclient-enter-hooks.d/resolvconf
roteiro pode ser útil em termos de sintaxe e que sinais de olhar para ("$reason" == "BOUND"
talvez?)