Proporciono un script que escucha las señales dbus, lo que le permitirá reaccionar más rápido que si tuviera que sondear los cambios en la configuración actual de su red. Ayuda en los sistemas donde los scripts / etc / no se ejecutan cuando lo desea (como en mi sistema 14.04).
mis ganchos de entrada / salida.d no funcionan
NetworkManager inicia dhclient con el indicador -sf /usr/lib/NetworkManager/nm-dhcp-client.action
que parece anular el comportamiento normal de enlace de entrada / salida. El comportamiento predeterminado con dhclient es llamar a los scripts /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Esos no reciben ninguna llamada en mi sistema.
mis scripts de NetworkManager dispatcher.d tampoco funcionan
Sin embargo, NM invoca un conjunto diferente de scripts, en /etc/NetworkManager/dispatcher.d
, para informar sobre varios eventos. La página del comando man NetworkManager (8) define dhcp4-change
y dhcp6-change
acciones que parecen hacer exactamente lo que usted desea. A pesar de lo que dice la página de manual, en mi sistema al menos, solo up
y las down
acciones se invocan. No puedo hacer que esos guiones disparen sobre otra cosa. Por lo tanto, esta tampoco es una gran vía para monitorear los cambios de IP.
entonces, espíe directamente sobre las señales dbus emitidas por NM
nm-dhcp-client.action
( fuente ), desde la línea de comandos, simplemente convierte todas las variables de entorno establecidas por dhclient en una señal dbus. Esas variables de entorno se definen en man dhclient-script
(8). Uno de particular interés es $new_ip_address
. Lo que podría hacer, como lo sugiere @Bernhard, es monitorear la señal y actuar en consecuencia según su contenido.
Aquí hay un programa que analizará todos los datos de eventos señalados por ese 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
La salida de dbus-monitor no es fácil de analizar en scripts. Quizás sea más fácil disparar ante la presencia de una determinada palabra (s) clave, por ejemplo new_ip_address
, y desde allí utilizar diferentes herramientas para obtener la información que cambió (por ejemplo, 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"
)
...
¡Dale un tiro!
dhclient-enter-hooks.d
script ... ¡pero nunca lo he probado! El/etc/dhcp/dhclient-enter-hooks.d/resolvconf
script existente podría ser útil en términos de sintaxis y qué señales buscar ("$reason" == "BOUND"
¿tal vez?)