bash のサンプルプログラムを考えてた。
よくあるパターンとして、
〇〇を実行して〇〇が△△になるのをまってから、□□する
を考えてみた。
VPN の接続を待機する
今回のサンプルはMacでVPNを接続し、接続待ちをし、VPN接続が完了したらルーティングを加える。
vpn の接続
mac の場合は次のようにする。
networksetup -connectpppoeservice "$VPN_NAME"
VPNの接続名は次のようにして取得できる
VPN_NAME=$(networksetup -listallnetworkservices | \grep interlink )
VPNの接続状態を取得する。
[[ $(networksetup -showpppoestatus $VPN_NAME ) == connected ]];
IPルーティングのテーブルにVPNへの経路を追加する。
ip route add $TARGET_IP/32 dev ppp0
一定間隔で状態をウォッチして、指定時間超えたら失敗とみなす。
これは、bashの数値演算と数値の比較を組み合せる。
while check_status do sleep -1 ; (( cnt++ )); if (( $cnt > 30 )) ; then return 1 ; done done
全部まとめたのがこれ。
接続を試行して、接続中を待機しつつ、接続後にIP routing をする。
最初に考えた処理待ちをしながら処理が終わったらXXXするのサンプルとしては良いと思う。
ここでは、コマンドがノンブロッキングな場合を想定している。
VPN_NAME=$(networksetup -listallnetworkservices | \grep interlink ) TARGET_IP=192.168.111.156 function isConnected(){ [[ $(networksetup -showpppoestatus $VPN_NAME ) == connected ]]; } function disconnectVPN(){ networksetup -disconnectpppoeservice "$VPN_NAME" } function connectVPN(){ # isConnected || networksetup -connectpppoeservice "$VPN_NAME" cnt=0 while !isConnected ; do (( cnt++ )) printf "${cnt} time .waiting...\r" sleep 1 if (( $cnt > 30 )) ; then echo failed. return 1 ; fi done; return 0; } function addRoute(){ echo add route ip route add $TARGET_IP/32 dev ppp0 } function main() { # echo start ## connectVPN && addRoute; } main;