#!/bin/bash PING_COUNT=2 CHECK_INTERVAL_SEC=120 FORCE_RECONNECT_PING_NG_COUNT=2 FORCE_REBOOT_PING_NG_COUNT=$(( $FORCE_RECONNECT_PING_NG_COUNT+2 )) CONFIG_FILE_EXT=_connection-recover.conf CONFIG_FILE_DIR=/etc/connection-recover/ active_connection_exist() { nmcli -f NAME connection | sed -e 's/ *$//' | grep -x -q ${CONNECTION} if [ $? -eq 0 ]; then return 0 fi return 1 } get_connection_status() { nmcli -f DEVICE,STATE device | grep "$DEVICE" } reconnect() { logger -t connection-recover "$DEVICE reconnect start... " timetou 60 nmcli connection down ${CONNECTION} > /dev/null 2>&1 sleep 5 timeout 60 nmcli connection up ${CONNECTION} > /dev/null 2>&1 if [ $? -eq 0 ]; then logger -t connection-recover "$DEVICE reconnect success" else logger -t connection-recover "$DEVICE reconnect fail" return -1 fi return 0 } check_route() { ip route get ${PING_DEST_IP} | grep ${NETWORK_IF} > /dev/null 2>&1 } is_connect() { if ! check_route; then logger -t connection-recover "$DEVICE: In the route setting, the destination host can not be reached" return 0 fi ping -s 1 -c ${PING_COUNT} -w 10 -I ${NETWORK_IF} ${PING_DEST_IP} > /dev/null 2>&1 if [ $? -eq 0 ]; then return 0 else logger -t connection-recover "$DEVICE ping fail" fi return 1 } clear_config() { PRODUCT_NAME="" PING_DEST_IP="" DEVICE="" TYPE="" NETWORK_IF="" } read_config_file() { . ${CONFIG_FILE} if [ ! -n "$PRODUCT_NAME" ]; then logger -t connection-recover "$1 is PRODUCT_NAME not set" return 1 fi if [ ! -n "$PING_DEST_IP" ]; then logger -t connection-recover "$1 is PING_DEST_IP not set" return 1 fi if [ ! -n "$DEVICE" ]; then logger -t connection-recover "$1 is DEVICE not set" return 1 fi if [ ! -n "$TYPE" ]; then logger -t connection-recover "$1 is TYPE not set" return 1 fi if [ ! -n "$NETWORK_IF" ]; then logger -t connection-recover "$1 is NETWORK_IF not set" return 1 fi if [ ! -n "$FORCE_REBOOT" ]; then logger -t connection-recover "$1 is FORCE_REBOOT not set" return 1 fi grep ${PRODUCT_NAME} /proc/device-tree/model -q if [ $? -ne 0 ]; then return 1 fi return 0 } load_config() { OLD_IFS=$IFS IFS=" " for CONFIG_FILE in `find ${CONFIG_FILE_DIR} -name "*${CONFIG_FILE_EXT}"`; do clear_config if ! read_config_file; then continue else IFS=$OLD_IFS return fi done logger -t connection-recover "error: config file is not found" exit 1 } load_config PING_NG_COUNT=0 while true; do sleep ${CHECK_INTERVAL_SEC} CONNECTION=`basename $CONFIG_FILE | sed -e "s/${CONFIG_FILE_EXT}//g"` if [ -z "$CONNECTION" ]; then continue fi if active_connection_exist; then PING_STATUS=1 STATUS=`get_connection_status` case ${STATUS} in *disconnected*|*failed*|*unknown*|"*connection failed*") reconnect if [ $? -eq 0 ]; then continue fi ;; *connected*) is_connect PING_STATUS=$? if [ $PING_STATUS -ne 0 ]; then reconnect fi ;; *deactivating*|*unmanaged*|*unavailable*|*connecting*) continue ;; esac if [ $PING_STATUS -ne 0 ]; then PING_NG_COUNT=$(( $PING_NG_COUNT+1 )) if [ "$FORCE_REBOOT" = "TRUE" ]; then if [ $PING_NG_COUNT -ge $FORCE_REBOOT_PING_NG_COUNT ]; then logger -t connection-recover "exec system reboot" reboot fi fi if [ $PING_NG_COUNT -ge $FORCE_RECONNECT_PING_NG_COUNT ]; then logger -t connection-recover "exec wwan-force-restart" wwan-force-restart fi else PING_NG_COUNT=0 fi fi done