আমি একটি স্ক্রিপ্ট সরবরাহ করছি যা ডিবিস সিগন্যালগুলিতে শোনায়, যা আপনাকে আপনার বর্তমান নেটওয়ার্ক কনফিগারেশনের পরিবর্তনের জন্য ভোট দেওয়ার চেয়ে দ্রুত প্রতিক্রিয়া জানাতে দেবে। এটি এমন সিস্টেমে সহায়তা করে যেখানে স্ক্রিপ্টগুলি / ইত্যাদি / কার্যকর করা হয় না যখন আপনি তাদের পছন্দ করতে চান (আমার 14.04 সিস্টেমে পছন্দ করুন)।
আমার প্রবেশ / প্রস্থান hooks.d কাজ করে না
নেটওয়ার্কম্যানেজারটি পতাকা সহ dhclient শুরু করে -sf /usr/lib/NetworkManager/nm-dhcp-client.action
যা মনে হয় স্বাভাবিক প্রবেশ / প্রস্থান হুক আচরণকে ওভাররাইড করে। ডিএইচসিলেট সহ ডিফল্ট আচরণ হ'ল স্ক্রিপ্টগুলিতে কল করা /etc/dhcp/dhclient-{enter,exit}-hooks.d
। এগুলি আমার সিস্টেমে মোটেই কল করে না।
আমার নেটওয়ার্কম্যানেজার dispatcher.d স্ক্রিপ্টগুলিও কাজ করে না
এনএম বিভিন্ন স্ক্রিপ্টের বিভিন্ন সেটকে /etc/NetworkManager/dispatcher.d
বিভিন্ন ইভেন্টের কথা জানাতে অনুরোধ করে। নেটওয়ার্কম্যানেজার (8) ম্যান পেজটি সংজ্ঞায়িত করে dhcp4-change
এবং dhcp6-change
ক্রিয়াগুলি যা আপনি যা চান ঠিক তেমন করে বলে মনে হয়। ম্যানপেজ যা বলেছে তা সত্ত্বেও, কমপক্ষে আমার সিস্টেমে কেবলমাত্র up
এবং down
ক্রিয়াগুলি আমন্ত্রণ জানায়। আমি এই স্ক্রিপ্টগুলিতে অন্য কোনও কিছুতে গুলি চালাতে পারি না। আইপি পরিবর্তনগুলি নিরীক্ষণ করার জন্য এটি কোনও দুর্দান্ত উপায় নয়।
সুতরাং, সরাসরি এনএম দ্বারা নির্গত ডিবিাস সংকেতগুলিতে স্নুপ করুন
nm-dhcp-client.action
( উত্স ), কমান্ড লাইন থেকে, dhclient দ্বারা নির্ধারিত সমস্ত পরিবেশের ভেরিয়েবলগুলি একটি dbus সংকেতে রূপান্তরিত করে। সেই পরিবেশের ভেরিয়েবলগুলি man dhclient-script
(8) এ সংজ্ঞায়িত করা হয়েছে । বিশেষ আগ্রহের একটি $new_ip_address
। @ বার্নহার্ডের পরামর্শ অনুসারে আপনি যা করতে পারেন তা হ'ল সিগন্যালটি পর্যবেক্ষণ করা এবং এর বিষয়বস্তুর উপর ভিত্তি করে কাজ করা।
এখানে এমন একটি প্রোগ্রাম রয়েছে যা সেই বাইনারি দ্বারা চিহ্নিত সমস্ত ইভেন্টের ডেটা স্নুপ করবে:
#!/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
, এবং সেখান থেকে পরিবর্তিত তথ্য (যেমন আইপি বা আইফোনফিগ) পেতে বিভিন্ন সরঞ্জাম ব্যবহার করুন।
# 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"
সম্ভবত?) সন্ধান করার জন্য সহায়ক হতে পারে