Linuxガジェットを作成しています。
起動後にネットワークケーブルを接続した場合、またはネットワークケーブルを抜き差しした場合にDHCPを取得したい。
1つの解決策は、次のようなスクリプトを実行することです(これは機能します)。
#!/bin/bash
NET_STATUS='different'
while true
do
NEW_NET_STATUS=`ifconfig | grep RUNNING | grep -v LOOPBACK`
if [ "${NEW_NET_STATUS}" = "${NET_STATUS}" ]
then
echo "no change"
sleep 1
continue
fi
NET_STATUS=${NEW_NET_STATUS}
if [ "${NET_STATUS}" ]
then
echo "cable plugged in"
else
echo "cable unplugged"
fi
sleep 1
done
しかし、私は小指の奥深くで、イーサネットケーブルのホットプラグイベントを処理するためのより良い方法があることを教えてくれます。
netplug
は私が行ったソリューションです。 ifplugd
も同様に機能します。
Sudo apt-get install netplug
cat /etc/netplug/netplugd.conf
eth*
cat /etc/netplug/netplug
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
export PATH
dev="$1"
action="$2"
case "$action" in
in)
echo "$dev : $action : plugged in" >> /tmp/netplug.log
;;
out)
echo "$dev : $action : unplugged" >> /tmp/netplug.log
;;
probe)
echo "$dev : $action : probed" >> /tmp/netplug.log
;;
*)
echo "$dev : $action : I feel violated" >> /tmp/netplug.log
exit 1
;;
esac
/etc/init.d/netplug stop
/etc/init.d/netplug start
cat /tmp/netplug.log
eth0 : probe : probed
eth1 : probe : probed
...
eth15 : probe : probed
eth0 : in : plugged in
ifplugd はこの状況を非常にうまく処理します:
ifplugd
はLinuxデーモンであり、ケーブルが接続されるとイーサネットデバイスが自動的に構成され、ケーブルが抜かれると自動的に構成が解除されます。これは、ケーブルが実際に接続されている場合にのみインターフェイスを構成するため、オンボードネットワークアダプターを備えたラップトップで役立ちます。
ifplugd
は、ディストリビューションのネイティブネットワーク構成ユーティリティとインターフェイスします。いくつかの機能:
- ディストリビューションのネイティブ
ifup
/ifdown
プログラムを使用します。- [...]
- Linux
SIOCETHTOOL
(新しい、別名ethtool
API)、SIOCGMIIREG
(古い、別名_mii-diag
_/_mii-tool
_ API)およびSIOCDEVPRIVATE
(最も古く、別名_mii-tool
_ API)ioctl()
sリンクのステータスを取得します。リリース0.24では、_IFF_RUNNING
_インターフェースフラグを使用したリンク検出のサポートが導入されています。- [...]
- 短い「アンプラグド」期間(_
-d
_オプション)または短い「プラグイン」期間(_-u
_オプション)を無視するように構成できます。- [...]
- ケーブル検出をサポートしないネットワークデバイスの互換モード(_
-F
_オプション)
私のこのソフトウェアをネットワーク構成に使用すると、非常に簡単です。
http://code.google.com/p/badvpn/wiki/NCD
次のNCDプログラムで十分です。また、この場合、ネットワークがアップまたはダウンしたときに何かを実行することにより、構成を拡張する方法も示しています。
process eth0 {
# Set device.
var("eth0") dev;
# Wait for device to appear, set it up, and wait for cable to be plugged in.
net.backend.waitdevice(dev);
net.up(dev);
net.backend.waitlink(dev);
# DHCP configuration.
# net.ipv4.dhcp() will block here until it obtaines an IP address.
# It doesn't check the obtained address in any way,
# so as a basic security measure, do not proceed if it is local.
net.ipv4.dhcp(dev) dhcp;
ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
ifnot(test_local);
# Assign IP address to interface, as obtained by DHCP.
net.ipv4.addr(dev, dhcp.addr, dhcp.prefix);
# Add default route.
net.ipv4.route("0.0.0.0", "0", dhcp.gateway, "20", dev);
# Add DNS servers.
net.dns(dhcp.dns_servers, "20");
# Run an external program when network comes up or goes down.
list("/some/program/to/run/when/up", "argument") do;
list("/some/program/to/run/when/down", "argument") undo;
run(do, undo);
}
これは、プラグインまたはプラグアウトされるネットワークケーブルを処理するだけでなく、ネットワークインターフェース自体が表示されたり消えたりすることにも注意してください(USBの場合に役立ちます)。
Ifplugdのような他のソフトウェアと比較してNCDを使用する利点は、その設計が柔軟性に欠けることです。ハードコードされた機能の限られたセットに限定されるのではなく、基本的に、独自のネットワーク構成をプログラムすることができます。
更新:BadVPNおよびNCD用のUbuntuパッケージを作成しました。 Ubuntuのインストールと使用方法についても、Wikiを更新しました。 http://code.google.com/p/badvpn/wiki/NCD#Running_it