Saya menyediakan skrip yang mendengarkan sinyal dbus, yang akan memungkinkan Anda untuk bereaksi lebih cepat daripada jika Anda melakukan polling untuk perubahan pada konfigurasi jaringan Anda saat ini. Ini membantu pada sistem di mana skrip / etc / tidak dieksekusi ketika Anda menginginkannya (seperti pada sistem 14.04 saya).
enter / exit hooks.d saya tidak berfungsi
NetworkManager mulai dhclient dengan flag -sf /usr/lib/NetworkManager/nm-dhcp-client.action
yang tampaknya mengesampingkan perilaku normal kait masuk / keluar. Perilaku default dengan dhclient adalah untuk memanggil skrip/etc/dhcp/dhclient-{enter,exit}-hooks.d
. Itu tidak dipanggil sama sekali di sistem saya.
skrip NetworkManager dispatcher.d saya juga tidak berfungsi
Namun NM tidak meminta set script yang berbeda, di /etc/NetworkManager/dispatcher.d
, untuk menginformasikan berbagai peristiwa. Halaman manual NetworkManager (8) mendefinisikan dhcp4-change
dan dhcp6-change
tindakan yang tampaknya melakukan apa yang Anda inginkan. Terlepas dari apa yang dikatakan halaman manual tersebut, setidaknya pada sistem saya, hanya saja up
dan down
tindakan dapat dilakukan. Saya tidak bisa membuat skrip-skrip itu diaktifkan. Jadi ini bukan jalan yang bagus untuk memonitor perubahan IP.
jadi, mengintip langsung pada sinyal dbus yang dipancarkan oleh NM
nm-dhcp-client.action
( sumber ), dari baris perintah, cukup mengkonversi semua variabel lingkungan yang ditetapkan oleh dhclient menjadi sinyal dbus. Variabel lingkungan tersebut didefinisikan dalam man dhclient-script
(8). Salah satu yang menarik adalah$new_ip_address
. Apa yang dapat Anda lakukan, seperti yang disarankan oleh @Bernhard, adalah memantau sinyal dan bertindak sesuai dengan isinya.
Berikut adalah program yang akan mengintip semua data acara yang ditandai oleh biner itu:
#!/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
Output dbus-monitor tidak mudah untuk diuraikan dalam skrip. Mungkin lebih mudah untuk memicu keberadaan kata kunci tertentu, misalnya new_ip_address
, dan dari sana menggunakan alat yang berbeda untuk mendapatkan informasi yang berubah (mis. Ip atau 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"
)
...
Cobalah!
dhclient-enter-hooks.d
skrip ... tapi saya belum pernah mencobanya!/etc/dhcp/dhclient-enter-hooks.d/resolvconf
Skrip yang ada mungkin membantu dalam hal sintaks dan sinyal apa yang harus dicari ("$reason" == "BOUND"
mungkin?)