dbusシグナルをリッスンするスクリプトを提供しています。これにより、現在のネットワーク構成の変更をポーリングする場合よりも迅速に対応できます。これは、スクリプト/ etc /を実行したいときに実行したくない場合に役立ちます(私の14.04システムのように)。
出入りするhooks.dが機能しない
NetworkManagerは-sf /usr/lib/NetworkManager/nm-dhcp-client.action
、通常の開始/終了フック動作をオーバーライドするように思われるフラグでdhclientを起動します。dhclientのデフォルトの動作は、でスクリプトを呼び出すこと/etc/dhcp/dhclient-{enter,exit}-hooks.d
です。これらは私のシステムではまったく呼び出されません。
NetworkManager dispatcher.dスクリプトも機能しません
ただし、NMは/etc/NetworkManager/dispatcher.d
、さまざまなイベントを通知するために、の異なるスクリプトセットを呼び出します。NetworkManager(8)のマニュアルページはdhcp4-change
、dhcp6-change
あなたが望むものを正確に実行するように見えるアクションを定義します。マンページに書かれていることにもかかわらず、少なくとも私のシステムではup
、down
アクションのみが呼び出されます。これらのスクリプトを他のもので起動させることはできません。したがって、これはIPの変更を監視するのに最適な手段でもありません。
そのため、NMが発信するdbus信号を直接スヌープします
nm-dhcp-client.action
(source)、コマンドラインから、単にdhclientによって設定されたすべての環境変数をdbusシグナルに変換します。これらの環境変数はman dhclient-script
(8)で定義されています。特に興味深いものの1つです$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
dbus-monitorの出力は、スクリプトで解析するのは簡単ではありません。おそらく、特定のキーワードの存在でトリガーする方が簡単です。たとえばnew_ip_address
、そこからさまざまなツールを使用して、変更された情報(たとえば、ipまたは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"
かもしれません(多分?)