それマグで!

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

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

openwrt で IPアドレスが変わるまで再接続(IPガチャ)

openwrt でpppoe を再接続

再接続して、IPアドレスが変わるまで、PPPoEガチャをする。

IPアドレス判定がおかしいとき。

IPアドレスによる地域判定や、IPアドレスで「ブロック」されたときに、再接続する。

今どき、ipv4 をブロックリストに追加したり、地域判定でごちゃごちゃするのはありえないと思うんだけどさ。

ネットワーク関連のコマンド。

/lib/functions/network.sh にネットワーク関連のコマンドが用意されているのでそれを読み込む。

source   /lib/functions/network.sh

現在のIPアドレス

ネットワークコマンドから、現在のIPアドレスを取得できる。

  source   /lib/functions/network.sh
  network_flush_cache
  network_find_wan WAN_IF
  network_get_ipaddr IP_ADDR "${WAN_IF}"

再接続

PPPoEの再接続は ifup/ifdown でできる。

引数は、pppoe の接続名になる。

  ifdown ocn_pppoe;
  ifup ocn_pppoe;

IPアドレスを変えるまで無限ループにする。

#!/usr/bin/env bash


function get_current_ip(){
  . /lib/functions/network.sh
  network_flush_cache
  network_find_wan WAN_IF
  network_get_ipaddr IP_ADDR "${WAN_IF}"
  echo $IP_ADDR
}
function reconnet_pppoe(){
  # >&2 echo ${FUNCNAME[0]}
  ifdown ocn_pppoe;
  ifup ocn_pppoe;
  wait_reconnect
  # >&2 echo reconnect_end
}


function wait_reconnect() {
  IP_ADDR=` get_current_ip `
  while [[ -z $IP_ADDR ]]; do

    IP_ADDR=` get_current_ip `

    # >&2 echo IP_ADDR=$IP_ADDR
    if (( i++ > 60  ));  then
        # >&2 echo wait give up
        break
    fi
    sleep 1
  done

}



function main(){

  PREV_IP=` get_current_ip `
  while (( cnt++ < 100 )); do

    # echo $cnt
    reconnet_pppoe;
    # >&2 ip addr show pppoe-ybb

    CURR_IP=`get_current_ip`

    echo old_ip=${PREV_IP} ,new_ip=$CURR_IP
    ## ip 変わるまで再接続
    if [[ ! -z $CURR_IP ]] && [[ $PREV_IP != $CURR_IP ]] ;then
      break
    fi
  done

  echo done
}


main