それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashのループと数字比較を組み合わせでVPNを接続開始して接続待ち、接続後に処理をする。

bash のサンプルプログラムを考えてた。

よくあるパターンとして、

〇〇を実行して〇〇が△△になるのをまってから、□□する

を考えてみた。

VPN の接続を待機する

今回のサンプルはMacVPNを接続し、接続待ちをし、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;

関連資料

bashのif文で数字の比較を評価条件ぱぱっとやる方法(C言語スタイル - それマグで!