openwrt 網路檢測指令碼

2023-03-01 12:00:14

背景

openwrt 有些韌體不太穩定,會時不時的斷網,導致家裡無法上網,遇到這種情況只能手動重啟openwrt裝置,該操作不方便,作為一個極客愛好者,那肯定是要實現自動化處理的了,寫一個簡單的指令碼加入到crontab定時任務中,就可完全自動化檢測了,解放雙手。

指令碼思路

1、ping指定域名5次,只要要有2次以上的包響應,才表示網路暢通
2、如果低於2次,則視為網路不通,重啟網路,並等待20秒
3、再次檢測網路如果還是網路不通的話,則重啟openwrt服務
4、當連續失敗計數大道10次以上,則重啟次數改為10分鐘,重複上述步驟,當網路暢通後,計數歸零

指令碼

#!/bin/bash

# ping的域名
DOMAIN=baidu.com
# 連續計數
NETWORK_CHECK_COUNTER_FILE="/data/shell/log/network-check-counter.log"
# 執行紀錄檔
NETWORK_CHECK_LOG_FILE="/data/shell/log/network-check.log"
# 預設計數為0
COUNTER=0

# 連續失敗計數大於該數值,則進行 RESTART_INTERVAL 秒等待,再執行重新檢測
COUNTER_THRESHOLD=10
# 持續失敗,後預設等待時間(秒),然後再重啟
RESTART_INTERVAL=600

# 檢查檔案是否存在,如果不存在則建立檔案
touch $NETWORK_CHECK_LOG_FILE

if [ ! -e $NETWORK_CHECK_COUNTER_FILE ]; then
    touch $NETWORK_CHECK_COUNTER_FILE
    echo "0" >$NETWORK_CHECK_COUNTER_FILE
fi
COUNTER=$(cat $NETWORK_CHECK_COUNTER_FILE)

# 檢測網路連線函數
function check_network {
    # 如果ping 5次至少有2次包未響應,則執行一下程式碼
    if ! ping -c 5 $DOMAIN > /dev/null 2>&1; then
        # 如果無法連線網路,則重啟網路
        echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線失敗"
        echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線失敗" >>$NETWORK_CHECK_LOG_FILE
        /etc/init.d/network restart
        sleep 20
        if ! ping -c 5 $DOMAIN > /dev/null 2>&1; then
            # 如果仍無法連線網路,則重啟OpenWrt服務
            echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線仍然失敗,重啟OpenWrt服務"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線仍然失敗,重啟OpenWrt服務" >>$NETWORK_CHECK_LOG_FILE
            /etc/init.d/openwrt-service restart
            echo "$(date '+%Y-%m-%d %H:%M:%S') OpenWrt服務已重啟"
            echo "$(date '+%Y-%m-%d %H:%M:%S') OpenWrt服務已重啟" >>$NETWORK_CHECK_LOG_FILE
            echo $(($(cat $NETWORK_CHECK_COUNTER_FILE) + 1)) >$NETWORK_CHECK_COUNTER_FILE
        else
            echo "$(date '+%Y-%m-%d %H:%M:%S') 重啟網路網路後,連線已恢復"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 重啟網路網路後,連線已恢復" >>$NETWORK_CHECK_LOG_FILE
            echo "0" >$NETWORK_CHECK_COUNTER_FILE
        fi
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線正常"
        if [ $(cat $NETWORK_CHECK_COUNTER_FILE) -ge 1 ]; then
            # 如果網路暢通且之前有失敗計數,則進行POST請求
            echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線已恢復,傳送POST請求"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 網路連線已恢復,傳送POST請求" >>$NETWORK_CHECK_LOG_FILE
            # 使用curl傳送POST請求到 http://aaa.com
            # curl -X POST http://baidu.com
        fi
        echo "0" >$NETWORK_CHECK_COUNTER_FILE
    fi
}

# 計數器檢查函數
function check_counter {
    COUNTER=$(cat $NETWORK_CHECK_COUNTER_FILE)
    if [[ $COUNTER -ge $COUNTER_THRESHOLD ]]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') 計數器值大於等於 $COUNTER_THRESHOLD ,等待 $RESTART_INTERVAL 秒後重新檢測網路連線"
        echo "$(date '+%Y-%m-%d %H:%M:%S') 計數器值大於等於 $COUNTER_THRESHOLD ,等待 $RESTART_INTERVAL 秒後重新檢測網路連線" >>$NETWORK_CHECK_LOG_FILE
        sleep $RESTART_INTERVAL # 等待
        check_network
    else
        check_network
    fi
}

check_counter

echo "$(date '+%Y-%m-%d %H:%M:%S') network 檢查完畢"

部署

1、將該指令碼放在openwrt任意一個目錄,我這裡是放在 /data/shell/目錄下
2、新增執行許可權 chomd +x ./network-check.sh
3、執行crontab -ecrontab 中追加一行 */2 * * * * /data/shell/network-check.sh 2分鐘執行一次檢測
4、新增完成後,我們在openwrt後臺的計劃任務列表裡面就可以看到了,也可以直接通過計劃任務列表去新增