207 lines
5.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
. /lib/functions.sh
. /usr/share/qmodem/modem_util.sh
sim_gpio="/sys/class/gpio/sim/value"
modem_gpio="/sys/class/gpio/4g/value"
debug=0
debug_log()
{
[ "$debug" -eq 1 ] && echo $1
}
# get detect config
load_detect_config()
{
config_load qmodem_hc_sim
config_get ping_dest main ping_dest
config_get judge_time main judge_time 5
config_get detect_interval main detect_interval 10
config_get modem_config main modem_config
[ -z "$modem_config" ] && get_first_avalible_config
debug_log "ping_dest:$ping_dest"
debug_log "judge_time:$judge_time"
debug_log "detect_interval:$detect_interval"
debug_log "modem_config:$modem_config"
}
_enabled_config()
{
cfg=$1
local state
config_get state $cfg state
[ -n "$state" ] && [ "$state" != "disabled" ] && modem_config=$cfg
}
get_first_avalible_config()
{
config_load qmodem
config_foreach _enabled_config modem-device
}
reboot_modem() {
echo 0 > $modem_gpio
sleep 1
echo 1 > $modem_gpio
}
switch_sim() {
if [ -f $sim_gpio ]; then
sim_status=$(cat $sim_gpio)
if [ "$sim_status" -eq 0 ]; then
echo 1 > $sim_gpio
else
echo 0 > $sim_gpio
fi
reboot_modem
logger -t modem_sim "switch sim from $sim_status to $(cat $sim_gpio)"
fi
}
_get_netdev() {
local modemconfig
config_load modemconfig $1 modem_config
[ "$modemconfig" != "$target_modemconfig" ] && return 1
config_get netdev $1 ifname
}
get_associa_netdev() {
config_load network
target_modemconfig=$1
config_foreach _get_netdev interface
unset target_modemconfig
}
ping_monitor() {
#ping_dest为空则不进行ping检测 ,如果有多个,用空格隔开
has_success=0
for dest in $ping_dest; do
ping -c 1 -W 1 $dest -I $netdev > /dev/null
if [ $? -eq 0 ]; then
return 1
fi
done
return 0
}
at_sim_monitor() {
ttydev=$1
#检查sim卡状态有sim卡则返回1
expect="+CPIN: READY"
result=$(at $ttydev "AT+CPIN?" | grep -o "$expect")
debug_log $result
if [ -n "$result" ]; then
return 1
fi
return 0
}
at_dial_monitor() {
ttydev=$1
define_connect=$2
#检查拨号状况,有v4或v6地址则返回1
at_cmd="AT+CGPADDR=1"
[ "$define_connect" == "3" ] && at_cmd="AT+CGPADDR=3"
expect="+CGPADDR:"
result=$(at $ttydev $at_cmd | grep "$expect")
debug_log $result
if [ -n "$result" ];then
ipv6=$(echo $result | grep -oE "\b([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\b")
ipv4=$(echo $result | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b")
disallow_ipv4="0.0.0.0"
#remove the disallow ip
if [ "$ipv4" == "$disallow_ipv4" ];then
ipv4=""
fi
if [ -n "$ipv4" ] || [ -n "$ipv6" ];then
return 1
fi
fi
return 0
}
precheck()
{
config_load qmodem
modem_config=$1
config_get state $modem_config state
# is empty or is disabled
config_get at_port $modem_config at_port
config_get enable_dial $modem_config enable_dial 0
config_get define_connect $modem_config define_connect 1
config_get global_en main enable_dial 0
debug_log "state:$state"
debug_log "at_port:$at_port"
debug_log "enable_dial:$enable_dial"
debug_log "define_connect:$define_connect"
debug_log "global_en:$global_en"
[ -z "$state" ] || [ "$state" == "disabled" ] && return 1
[ "$global_en" == "0" ] && return 1
[ -z "$enable_dial" ] || [ "$enable_dial" == "0" ] && return 1
[ -z "$at_port" ] && return 1
[ ! -e "$at_port" ] && return 1
return 0
}
main_loop()
{
while true;do
precheck $modem_config
if [ $? -eq 1 ];then
sleep $detect_interval
continue
fi
get_associa_netdev $modem_config
if [ -n "$ping_dest" ]; then
ping_monitor
ping_result=$?
fi
if [ -n "$at_port" ] && [ -n "$define_connect" ];then
at_dial_monitor $at_port $define_connect
dial_result=$?
fi
if [ -n "$at_port" ]; then
at_sim_monitor $at_port
sim_result=$?
fi
debug_log "ping_result:$ping_result dial_result:$dial_result sim_result:$sim_result"
if [ -n "$ping_dest" ];then
#策略ping成功则重置fail_times否则fail_times累加
[ -z "$dial_result" ] && dial_result=1
[ -z "$sim_result" ] && sim_result=1
fail_total=$((3 - $ping_result - $dial_result - $sim_result))
if [ $ping_result -eq 1 ]; then
fail_times=0
else
fail_times=$(($fail_times + $fail_total))
fi
#如果失败次数超过judge_time * 3则切卡 切卡后等待3分钟
else
#策略 无ping则检测拨号和sim卡状态拨号成功则重置fail_times否则fail_times累加
[ -z "$dial_result" ] && dial_result=1
[ -z "$sim_result" ] && sim_result=1
fail_total=$((2 - $dial_result - $sim_result))
if [ $dial_result -eq 1 ]; then
fail_times=0
else
fail_times=$(($fail_times + $fail_total))
fi
fi
logger -t modem_sim "ping_result:$ping_result dial_result:$dial_result sim_result:$sim_result fail_times:$fail_times fail_total:$fail_total fail_times:$fail_times"
if [ $fail_times -ge $(($judge_time * 2)) ]; then
switch_sim
fail_times=0
sleep 240
fi
sleep $detect_interval
done
}
if [ ! "$debug" -eq 1 ]; then
sleep 180
fi
load_detect_config
main_loop