mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-01 15:43:56 +08:00
🌴 Sync 2026-03-05 23:51:42
This commit is contained in:
1 parent
0d155c70be
commit
32600acc60
14258 files changed
+3954570
No files matched your search
@@ -0,0 +1,36 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ssw
|
||||
PKG_VERSION:=0.0.2
|
||||
PKG_RELEASE:=1
|
||||
PKG_MAINTAINER:=Konstantine Shevlakov <shevlakov@132lan.ru>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/$(PKG_NAME)
|
||||
PKGARCH:=all
|
||||
DEPENDS:=+modemmanager +mwan3
|
||||
TITLE:=SIM-card switcher and tracker
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/description
|
||||
SIM-card tracker for HuastLink HC-G60 and ZBTLint ZBT-WE2806-A
|
||||
or similar CPE-routers with two SIM slots and one 4g/5G modem
|
||||
endef
|
||||
|
||||
|
||||
define Build/Prepare
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(CP) ./root/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,$(PKG_NAME)))
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
config modem 'modem'
|
||||
option gpio 'modem'
|
||||
option value '1'
|
||||
|
||||
config sim 'sim'
|
||||
option gpio 'sim'
|
||||
option value '1'
|
||||
|
||||
config failover 'failover'
|
||||
|
||||
Executable
+74
@@ -0,0 +1,74 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
# SIM slot switcher for HuastLink HC-G60 or ZBT-WE2806-A
|
||||
# by Konstantine Shevlakov at <shevlakov@132lan.ru> 2025
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
USE_PROCD=1
|
||||
|
||||
load_config_gpio(){
|
||||
local gpio value
|
||||
for c in gpio value; do
|
||||
config_get $1_$c "$1" $c
|
||||
export $1_$c
|
||||
done
|
||||
}
|
||||
|
||||
load_config_failover(){
|
||||
local enable mode interval times_rsrp times_ping revert rsrp host
|
||||
for c in enable mode interval times_rsrp times_ping revert rsrp host; do
|
||||
config_get $1_$c "$1" $c
|
||||
export $1_$c
|
||||
done
|
||||
}
|
||||
|
||||
reload_iface(){
|
||||
[ "$iface" ] && {
|
||||
for i in $iface; do
|
||||
ifup $i
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
start_service(){
|
||||
config_load ssw
|
||||
config_foreach load_config_gpio modem
|
||||
config_foreach load_config_gpio sim
|
||||
modem_cur=$(cat /sys/class/gpio/$modem_gpio/value)
|
||||
sim_cur=$(cat /sys/class/gpio/$sim_gpio/value)
|
||||
iface=$(uci show network | awk -F [.] '/devices/{gsub("'\''","");print $2}' | tail -1)
|
||||
if [ "$modem_value" = "$modem_cur" -a "$sim_value" = "$sim_cur" ]; then
|
||||
continue
|
||||
elif [ "$modem_value" = "$modem_cur" -a "$modem_value" = "1" ]; then
|
||||
logger -t "SIM SW" "modem already enabled on gpio $modem_gpio. Restart it"
|
||||
echo "0" > /sys/class/gpio/$modem_gpio/value
|
||||
sleep 2
|
||||
echo "$sim_value" > /sys/class/gpio/$sim_gpio/value
|
||||
echo "$modem_value" > /sys/class/gpio/$modem_gpio/value
|
||||
if [ -x /etc/init.d/smstools3 ]; then
|
||||
/etc/init.d/smstools3 restart
|
||||
fi
|
||||
sleep 30 && reload_iface &
|
||||
else
|
||||
logger -t "SIM SW" "modem powered changed"
|
||||
echo "$sim_value" > /sys/class/gpio/$sim_gpio/value
|
||||
echo "$modem_value" > /sys/class/gpio/$modem_gpio/value
|
||||
if [ -x /etc/init.d/smstools3 ]; then
|
||||
/etc/init.d/smstools3 restart
|
||||
fi
|
||||
sleep 30 && reload_iface &
|
||||
fi
|
||||
#config_foreach load_config_failover failover
|
||||
procd_open_instance
|
||||
procd_set_param command /usr/share/ssw_track.sh
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
reload_service(){
|
||||
start
|
||||
}
|
||||
|
||||
service_triggers(){
|
||||
procd_add_reload_trigger "ssw"
|
||||
}
|
||||
Executable
+188
@@ -0,0 +1,188 @@
|
||||
#!/bin/sh
|
||||
|
||||
# SIM slot switcher for HuastLink HC-G60 or ZBT-WE2806-A
|
||||
# or similiar cpe OpenWrt-routers
|
||||
# by Konstantine Shevlakov at <shevlakov@132lan.ru> 2025
|
||||
|
||||
NODE="SW SIM"
|
||||
|
||||
# config file stored in /etc/config/ssw
|
||||
# define gpios in /etc/config/system
|
||||
#
|
||||
# mandatory section names of gpio: modem and sim
|
||||
# example config file /etc/config/system for gpio_switch
|
||||
#
|
||||
# config gpio_switch 'modem'
|
||||
# option name 'Modem pwr'
|
||||
# option gpio_pin '512'
|
||||
# option value '1'
|
||||
#
|
||||
# config gpio_switch 'sim'
|
||||
# option name 'SIM switch'
|
||||
# option gpio_pin 'sim'
|
||||
# option value '1'
|
||||
#
|
||||
# if gpio not defined on dts and have integer number on gpioswitch then
|
||||
# option gpio must have value 'gpioN'. Example /etc/config/ssw:
|
||||
#
|
||||
# config modem 'modem'
|
||||
# option gpio 'gpio512'
|
||||
# option value '1'
|
||||
#
|
||||
# config sim 'sim'
|
||||
# option gpio 'sim'
|
||||
# option value '1'
|
||||
|
||||
|
||||
# Get Variables
|
||||
get_vars(){
|
||||
for v in enable interval revert rsrp times_rsrp apn1 apn2; do
|
||||
eval $v=$(uci -q get ssw.failover.${v} 2>/dev/nul)
|
||||
done
|
||||
for d in modem sim; do
|
||||
for s in gpio value; do
|
||||
eval "${d}_${s}=$(uci -q get ssw.${d}.${s} 2>/dev/null)"
|
||||
done
|
||||
done
|
||||
[ -n "$interval" ] || interval=60
|
||||
[ -n "$times_rsrp" ] || times_rsrp=5
|
||||
}
|
||||
|
||||
# SIM Switch
|
||||
sw_sim(){
|
||||
case $cur_sim in
|
||||
0) next_sim=1 ;;
|
||||
1) next_sim=0 ;;
|
||||
esac
|
||||
|
||||
echo "0" > /sys/class/gpio/$modem_gpio/value
|
||||
echo "$next_sim" > /sys/class/gpio/$sim_gpio/value
|
||||
|
||||
if [ "$modem_value" = "1" ]; then
|
||||
sleep 2
|
||||
echo "1" > /sys/class/gpio/$modem_gpio/value
|
||||
if [ -x /etc/init.d/smstools3 ]; then
|
||||
/etc/init.d/smstools3 restart
|
||||
fi
|
||||
fi
|
||||
set > /tmp/apn.ssw
|
||||
}
|
||||
|
||||
# Revert rule switch
|
||||
sw_rule(){
|
||||
if [ -f /tmp/ssw.vars ]; then
|
||||
. /tmp/ssw.vars
|
||||
fi
|
||||
# Revert SIM card to default slot
|
||||
if [ "$cur_sim" -ne "$sim_value" ]; then
|
||||
if [ "$(date +%s)" -gt "$SWDATE" ]; then
|
||||
logger -t "$NODE" "Revert to default SIM slot with $apn"
|
||||
sw_sim
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Check interface state via mwan3
|
||||
monitor_mwan3(){
|
||||
iface=$(uci show network | awk -F [.] '/devices/{print $2}')
|
||||
# Check link status
|
||||
if [ -r /tmp/run/mwan3/iface_state/$iface ]; then
|
||||
link_status=$(cat /tmp/run/mwan3/iface_state/$iface | grep online | wc -l)
|
||||
else
|
||||
# Disable track link via mwan3
|
||||
link_status=1
|
||||
fi
|
||||
}
|
||||
|
||||
# RSRP average value by modemmanager. Enable singnal monitor!
|
||||
monitor_rsrp(){
|
||||
device="$(uci show network | awk -F [=] '/devices/{gsub("'\''","");print $2}')"
|
||||
SIGNAL="$(mmcli -J -m $device --signal-get)"
|
||||
CRSRP=$(echo "$SIGNAL" | jsonfilter -e '@["modem"][*]["lte"]["rsrp"]' | awk '{printf "%.0f\n", $1}')
|
||||
if ! [ $CRSRP ]; then
|
||||
CRSRP=$(echo "$SIGNAL" | jsonfilter -e '@["modem"][*]["5g"]["rsrp"]' | awk '{printf "%.0f\n", $1}')
|
||||
fi
|
||||
|
||||
if [ $CRSRP -ne 0 ]; then
|
||||
echo $CRSRP >> /tmp/ssw_rsrp.var
|
||||
fi
|
||||
if [ $cnt -eq $times_rsrp ]; then
|
||||
RSRP=$(awk '{sum+=$1} END { printf "%.0f\n", sum/NR }' /tmp/ssw_rsrp.var)
|
||||
cat /dev/null > /tmp/ssw_rsrp.var
|
||||
if [ $RSRP -lt $rsrp ]; then
|
||||
mon_rsrp=0
|
||||
else
|
||||
mon_rsrp=1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# reload iface
|
||||
reload_iface(){
|
||||
[ "$iface" ] && {
|
||||
for i in $iface; do
|
||||
ifup $i
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
# Stuff
|
||||
cnt=1
|
||||
while true; do
|
||||
get_vars
|
||||
sleep $interval
|
||||
if [ "$enable" = "1" ]; then
|
||||
cur_sim=$(cat /sys/class/gpio/$sim_gpio/value)
|
||||
monitor_rsrp
|
||||
monitor_mwan3
|
||||
if [ "$cnt" -eq "$times_rsrp" ]; then
|
||||
if [ "$link_status" = "0" -o "$mon_rsrp" = "0" ]; then
|
||||
|
||||
if [ "$sim_value" -eq "$cur_sim" ]; then
|
||||
apn=$apn2
|
||||
else
|
||||
apn=$apn1
|
||||
fi
|
||||
iface=$(uci show network | awk -F [.] '/devices/{gsub("'\''","");print $2}' | tail -1)
|
||||
if [ $RSRP ]; then
|
||||
if [ "$mon_rsrp" = "0" ]; then
|
||||
logger -t "$NODE" "Modem interface: $iface is average RSRP= ${RSRP} dBm. Min. value ${rsrp} dBm."
|
||||
fi
|
||||
if [ "$link_status" = "0" ]; then
|
||||
logger -t "$NODE" "Modem interface: $iface is loss connectivity"
|
||||
fi
|
||||
else
|
||||
logger -t "$NODE" "WARNING: RSRP value not exist. Please check \"Resfesh signal\" option of modem interface!"
|
||||
fi
|
||||
if [ "${#apn}" -gt "0" ]; then
|
||||
uci set network.$iface.apn="$apn"
|
||||
logger -t "$NODE" "Switch SIM-card slot with APN: $apn"
|
||||
else
|
||||
logger -t "$NODE" "WARNING: APN not defined. Switch SIM-card slot with default APN."
|
||||
uci set network.$iface.apn="internet"
|
||||
fi
|
||||
|
||||
uci commit network
|
||||
reload_config network
|
||||
|
||||
if [ "$revert" = "1" ]; then
|
||||
if [ "$cur_sim" -eq "$sim_value" ]; then
|
||||
FBT=${FBT:=$((($interval+$times_rsrp)*2))}
|
||||
FBT=$(($FBT*2))
|
||||
SWDATE=$((`date +%s`+$FBT))
|
||||
echo "FBT=$FBT" > /tmp/ssw.vars
|
||||
echo SWDATE=$SWDATE >> /tmp/ssw.vars
|
||||
logger -t "$NODE" "Back to default SIM-slot after $(date -d @${SWDATE})"
|
||||
fi
|
||||
fi
|
||||
sw_sim && sleep 20 && reload_iface &
|
||||
fi
|
||||
if [ "$revert" = "1" ]; then
|
||||
sw_rule && sleep 20 && reload_iface &
|
||||
fi
|
||||
cnt=0
|
||||
else
|
||||
cnt=$(($cnt+1))
|
||||
fi
|
||||
fi
|
||||
done
|
||||
Reference in new issue
Block a user