Dostarczam skrypt, który nasłuchuje na sygnałach dbus, co pozwoli ci zareagować szybciej niż gdybyś sondował zmiany w obecnej konfiguracji sieci. Pomaga w systemach, w których skrypty / etc / nie są wykonywane, kiedy chcesz (tak jak w moim systemie 14.04).
moje haki wejścia / wyjścia. d nie działają
NetworkManager uruchamia dhclient z flagą, -sf /usr/lib/NetworkManager/nm-dhcp-client.action
która wydaje się zastępować normalne zachowanie przechwytywania wejścia / wyjścia. Domyślnym działaniem dhclient jest wywoływanie skryptów /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Te w ogóle nie są wywoływane w moim systemie.
moje skrypty dispatcher.d NetworkManager również nie działają
NM wywołuje jednak inny zestaw skryptów w /etc/NetworkManager/dispatcher.d
celu informowania o różnych zdarzeniach. Strona man NetworkManager (8) definiuje dhcp4-change
i dhcp6-change
akcje, które wydają się robić dokładnie to, co chcesz. Wbrew temu, co twierdzi strona podręcznika, w moim systemie co najmniej, tylko up
i down
działania się powoływać. Nie mogę zmusić tych skryptów do odpalenia na czymkolwiek innym. Dlatego też nie jest to świetna droga do monitorowania zmian IP.
więc snoop bezpośrednio na sygnałach dbus emitowanych przez NM
nm-dhcp-client.action
( źródło ), z wiersza poleceń, po prostu konwertuje wszystkie zmienne środowiskowe ustawione przez dhclient na sygnał dbus. Te zmienne środowiskowe są zdefiniowane w man dhclient-script
(8). Jednym ze szczególnie interesujących jest $new_ip_address
. Jak sugeruje @Bernhard, możesz zrobić, aby monitorować sygnał i odpowiednio postępować w oparciu o jego zawartość.
Oto program, który podejmie wszystkie dane zdarzenia zasygnalizowane przez ten plik binarny:
#!/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
Dane wyjściowe dbus-monitor nie są łatwe do przeanalizowania w skryptach. Być może łatwiej jest wywołać obecność określonych słów kluczowych, np. new_ip_address
I stamtąd użyć różnych narzędzi, aby uzyskać informacje, które uległy zmianie (np. Ip lub 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"
)
...
Spróbuj!
dhclient-enter-hooks.d
skryptu ... ale nigdy tego nie próbowałem! Istniejący/etc/dhcp/dhclient-enter-hooks.d/resolvconf
skrypt może być pomocny pod względem składni i jakich sygnałów szukać ("$reason" == "BOUND"
być może?)