Sto fornendo uno script che ascolta i segnali dbus, che ti consentirà di reagire più rapidamente rispetto a se dovessi eseguire il polling per le modifiche alla tua attuale configurazione di rete. Aiuta su sistemi in cui gli script / etc / non vengono eseguiti quando si desidera (come sul mio sistema 14.04).
i miei hook di entrata / uscita.d non funzionano
NetworkManager avvia dhclient con il flag -sf /usr/lib/NetworkManager/nm-dhcp-client.action
che sembra sovrascrivere il normale comportamento hook di entrata / uscita. Il comportamento predefinito con dhclient è di chiamare gli script/etc/dhcp/dhclient-{enter,exit}-hooks.d
. Quelli non vengono chiamati affatto sul mio sistema.
gli script my NetworkManager dispatcher.d non funzionano neanche
NM, tuttavia, invoca un diverso set di script /etc/NetworkManager/dispatcher.d
per informare di vari eventi. La pagina man NetworkManager (8) definisce dhcp4-change
e le dhcp6-change
azioni che sembrano fare esattamente quello che vuoi. Nonostante quello che dice la pagina di manuale, sul mio sistema, almeno, solo up
e down
le azioni vengono invocati. Non riesco a far sparare quegli script su nient'altro. Quindi questa non è nemmeno una buona strada per monitorare le modifiche dell'IP.
quindi, curiosare direttamente sui segnali dbus emessi da NM
nm-dhcp-client.action
( source ), dalla riga di comando, converte semplicemente tutte le variabili d'ambiente impostate da dhclient in un segnale dbus. Tali variabili di ambiente sono definite inman dhclient-script
(8). Uno di particolare interesse è $new_ip_address
. Quello che potresti fare, come suggerito da @ Bernard, è monitorare il segnale e agire di conseguenza in base al suo contenuto.
Ecco un programma che snooperà tutti i dati degli eventi segnalati da quel binario:
#!/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
L'output di dbus-monitor non è semplice da analizzare negli script. Forse è più facile innescare la presenza di determinate parole chiave, ad esempio new_ip_address
, e da lì utilizzare strumenti diversi per ottenere le informazioni modificate (ad esempio ip o 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"
)
...
Dagli Un colpo!
dhclient-enter-hooks.d
script ... ma non l'ho mai provato! Lo/etc/dhcp/dhclient-enter-hooks.d/resolvconf
script esistente potrebbe essere utile in termini di sintassi e quali segnali cercare ("$reason" == "BOUND"
forse?)