207 lines
5.7 KiB
Bash
Executable File
207 lines
5.7 KiB
Bash
Executable File
#!/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
|