मैं एक स्क्रिप्ट प्रदान कर रहा हूं जो डबस संकेतों पर सुनती है, जो आपको तेजी से प्रतिक्रिया करने की अनुमति देगा यदि आप अपने नेटवर्क नेटवर्क कॉन्फ़िगरेशन में बदलाव के लिए मतदान कर रहे थे। यह उन प्रणालियों पर मदद करता है जहां स्क्रिप्ट / आदि / निष्पादित नहीं किए जाते हैं जब आप उन्हें पसंद करेंगे (जैसे मेरे 14.04 सिस्टम पर)।
मेरा प्रवेश / निकास हुकसेड काम नहीं करता है
NetworkManager उस झंडे के साथ धीरज शुरू करता है -sf /usr/lib/NetworkManager/nm-dhcp-client.action
जो सामान्य प्रवेश / निकास हुक व्यवहार को ओवरराइड करने लगता है। Dhclient के साथ डिफ़ॉल्ट व्यवहार में स्क्रिप्ट को कॉल करना है /etc/dhcp/dhclient-{enter,exit}-hooks.d
। उन सभी को मेरे सिस्टम पर नहीं बुलाया जाता है।
मेरा NetworkManager dispatcher.d स्क्रिप्ट या तो काम नहीं करता है
हालाँकि, /etc/NetworkManager/dispatcher.d
विभिन्न घटनाओं की सूचना देने के लिए, स्क्रिप्ट्स का एक अलग सेट है । NetworkManager (8) मैन पेज परिभाषित करता है dhcp4-change
और ऐसे dhcp6-change
कार्य करता है जो आपको वही चाहिए जो आप चाहते हैं। मैंन्यू के कहने के बावजूद, मेरे सिस्टम पर, कम से कम, केवल up
और down
एक्शन का ही इस्तेमाल किया जाता है। मैं उन लिपियों को किसी और चीज़ में आग नहीं लगा सकता। तो यह आईपी परिवर्तनों की निगरानी के लिए एक महान एवेन्यू नहीं है।
इसलिए, NM द्वारा उत्सर्जित dbus संकेतों पर सीधे स्नूप करें
nm-dhcp-client.action
( स्रोत ), कमांड लाइन से, बस dhclient द्वारा निर्धारित सभी पर्यावरण चर को एक डबस सिग्नल में परिवर्तित करता है। उन पर्यावरण चर को man dhclient-script
(8) में परिभाषित किया गया है । विशेष रुचि में से एक है $new_ip_address
। आप क्या कर सकते हैं, जैसा कि @Bernhard द्वारा सुझाया गया है, संकेत की निगरानी करना और उसकी सामग्री के आधार पर कार्य करना है।
यहां एक कार्यक्रम है जो उस बाइनरी द्वारा संकेतित सभी घटना डेटा को स्नूप करेगा:
#!/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
स्क्रिप्ट में पार्स करने के लिए डब-मॉनिटर का आउटपुट सीधा नहीं है। शायद एक निश्चित कीवर्ड (ओं) की उपस्थिति पर ट्रिगर करना आसान है, उदाहरण के लिए new_ip_address
, और वहां से अलग-अलग टूल का उपयोग करके उस जानकारी को प्राप्त किया जा सकता है (जैसे आईपी या 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"
)
...
इसे आजमा कर देखें!
dhclient-enter-hooks.d
... लेकिन मैंने कभी कोशिश नहीं की है! मौजूदा/etc/dhcp/dhclient-enter-hooks.d/resolvconf
स्क्रिप्ट वाक्य रचना के संदर्भ में उपयोगी हो सकता है और क्या संकेत देखने के लिए ("$reason" == "BOUND"
शायद?)