Geçerli ağ yapılandırmanızdaki değişiklikler için yoklama yapmaktan daha hızlı tepki vermenizi sağlayacak dbus sinyallerini dinleyen bir komut dosyası sağlıyorum. Komut dosyalarının / etc / komutunun istediğiniz zaman yürütülmediği sistemlerde yardımcı olur (14.04 sistemimde olduğu gibi).
giriş / çıkış kancalarım. çalışmıyor
NetworkManager dhclient'i -sf /usr/lib/NetworkManager/nm-dhcp-client.action
normal giriş / çıkış kanca davranışını geçersiz kılan bayrakla başlatır . Dhclient ile varsayılan davranış komut dosyalarını içeri çağırmaktır /etc/dhcp/dhclient-{enter,exit}-hooks.d
. Bunlar benim sistemimde hiç aranmıyor.
NetworkManager dispatcher.d komut dosyalarım da çalışmıyor
Ancak NM, /etc/NetworkManager/dispatcher.d
çeşitli olayları bildirmek için farklı bir komut dizisi çağırır . NetworkManagerın (8) kılavuz sayfasına tanımlarınızı dhcp4-change
ve dhcp6-change
ne istediğinizi tam olarak yapmak gibi görünüyor eylemleri. Manpage'in söylediklerine rağmen, en azından sistemimde sadece up
ve down
eylemler çağrılır. Bu senaryoları başka bir şeye ateşleyemem. Yani bu IP değişikliklerini izlemek için de harika bir yol değil.
bu nedenle, NM tarafından yayılan dbus sinyallerine doğrudan göz atın
nm-dhcp-client.action
( kaynak ) komut satırından dhclient tarafından ayarlanan tüm ortam değişkenlerini bir dbus sinyaline dönüştürür. Bu ortam değişkenleri man dhclient-script
(8) ' de tanımlanmıştır . Özel ilgi alanlarından biri $new_ip_address
. @Bernhard tarafından önerildiği gibi yapabileceğiniz şey, sinyali izlemek ve içeriğine göre hareket etmektir.
İşte bu ikili tarafından sinyal verilen tüm olay verilerini göz ardı edecek bir program:
#!/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
Dbus monitörünün çıkışı komut dosyalarında ayrıştırmak için kolay değildir. Belki belirli bir anahtar kelimelerin varlığını tetiklemek daha kolaydır, örneğin new_ip_address
oradan değişen bilgileri almak için farklı araçlar kullanın (örneğin ip veya 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"
)
...
Bi dene!
dhclient-enter-hooks.d
komut ... ama hiç denemedim! Varolan/etc/dhcp/dhclient-enter-hooks.d/resolvconf
komut dosyası sözdizimi ve hangi sinyalleri aramak için yararlı olabilir ("$reason" == "BOUND"
belki?)