Je fournis un script qui écoute les signaux dbus, ce qui vous permettra de réagir plus rapidement que si vous interrogiez les changements sur votre configuration réseau actuelle. Cela aide sur les systèmes où les scripts / etc / ne sont pas exécutés quand vous le souhaitez (comme sur mon système 14.04).
mon entrée / sortie hooks.d ne fonctionne pas
NetworkManager démarre dhclient avec l'indicateur -sf /usr/lib/NetworkManager/nm-dhcp-client.action
qui semble remplacer le comportement normal du hook d'entrée / sortie. Le comportement par défaut avec dhclient est d'appeler des scripts /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Ceux-ci ne sont pas du tout appelés sur mon système.
mes scripts NetworkManager dispatcher.d ne fonctionnent pas non plus
NM invoque cependant un ensemble différent de scripts, dans /etc/NetworkManager/dispatcher.d
, pour informer de divers événements. La page définit l'homme NetworkManager (8) dhcp4-change
et les dhcp6-change
actions qui semblent faire exactement ce que vous voulez. En dépit de ce que dit la page de manuel, sur mon système au moins, seulement up
et les down
actions s'invoquées. Je ne peux pas faire tirer ces scripts sur autre chose. Ce n'est donc pas non plus une excellente avenue pour surveiller les changements IP.
donc, snoop directement sur les signaux dbus émis par NM
nm-dhcp-client.action
( source ), à partir de la ligne de commande, convertit simplement toutes les variables d'environnement définies par dhclient en un signal dbus. Ces variables d'environnement sont définies dans man dhclient-script
(8). Un intérêt particulier est $new_ip_address
. Ce que vous pourriez faire, comme suggéré par @Bernhard, est de surveiller le signal et d'agir en fonction de son contenu.
Voici un programme qui espionne toutes les données d'événement signalées par ce binaire:
#!/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
La sortie de dbus-monitor n'est pas simple à analyser dans les scripts. Il est peut-être plus facile de déclencher la présence d'un certain mot-clé (s), par exemple new_ip_address
, et à partir de là, utiliser différents outils pour obtenir les informations qui ont changé (par exemple 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"
)
...
Donner un coup de feu!
dhclient-enter-hooks.d
script ... mais je ne l'ai jamais essayé! Le/etc/dhcp/dhclient-enter-hooks.d/resolvconf
script existant pourrait être utile en termes de syntaxe et quels signaux rechercher ("$reason" == "BOUND"
peut-être?)