diff --git a/package/ctcgfw/luci-app-serverchan/Makefile b/package/ctcgfw/luci-app-serverchan/Makefile
index 580fbff122..f0a7bf58ca 100644
--- a/package/ctcgfw/luci-app-serverchan/Makefile
+++ b/package/ctcgfw/luci-app-serverchan/Makefile
@@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-serverchan
-PKG_VERSION:=1.42
+PKG_VERSION:=1.43
PKG_RELEASE:=6
include $(INCLUDE_DIR)/package.mk
diff --git a/package/ctcgfw/luci-app-serverchan/luasrc/model/cbi/serverchan.lua b/package/ctcgfw/luci-app-serverchan/luasrc/model/cbi/serverchan.lua
index a7e4a86ed6..10435d7051 100644
--- a/package/ctcgfw/luci-app-serverchan/luasrc/model/cbi/serverchan.lua
+++ b/package/ctcgfw/luci-app-serverchan/luasrc/model/cbi/serverchan.lua
@@ -144,11 +144,59 @@ a.rmempty=true
a= s:taboption("tab_basic2", Value, "temperature", "温度报警阈值")
a.rmempty = true
a.default = "80"
+a.datatype="uinteger"
a:depends({temperature_enable="1"})
a.description = translate("
设备报警只会在连续五分钟超过设定值时才会推送
而且一个小时内不会再提醒第二次")
+a=s:taboption("tab_basic2", Flag,"err_enable",translate("无人值守任务"))
+a.default=0
+a.rmempty=true
+a.description = translate("请确认脚本可以正常运行!!
否则可能造成频繁重启等错误!")
+device_aliases= s:taboption("tab_basic2", DynamicList, "err_device_aliases", translate("列表中设备都不在线时才会执行"))
+device_aliases.rmempty = true
+device_aliases.optional = true
+device_aliases.description = translate("请输入设备 MAC")
+nt.mac_hints(function(mac, name) device_aliases :value(mac, "%s (%s)" %{ mac, name }) end)
+device_aliases:depends({err_enable="1"})
+a=s:taboption("tab_basic2", ListValue,"network_err_event",translate("网络断开时"))
+a.default=""
+a:depends({err_enable="1"})
+a:value("",translate("无操作"))
+a:value("1",translate("重启路由器"))
+a:value("2",translate("重启网络接口"))
+a:value("3",translate("修改相关设置项,尝试自动修复网络"))
+a.description = translate("选项 1 选项 2 不会修改设置,并最多尝试 2 次。
选项 3 会将设置项备份于 /usr/bin/serverchan/configbak 目录,并在失败后还原。
自用于远程误操作无法连接,人在塔在请自行修复。
【!!因为我无法保证兼容性!!】不熟悉系统设置项,不会救砖请勿使用")
+a=s:taboption("tab_basic2", ListValue,"system_time_event",translate("定时重启"))
+a.default=""
+a:depends({err_enable="1"})
+a:value("",translate("无操作"))
+a:value("1",translate("重启路由器"))
+a:value("2",translate("重启网络接口"))
+a= s:taboption("tab_basic2", Value, "autoreboot_time", "系统运行时间大于")
+a.rmempty = true
+a.default = "24"
+a.datatype="uinteger"
+a:depends({system_time_event="1"})
+a.description = translate("单位为小时")
+a= s:taboption("tab_basic2", Value, "network_restart_time", "网络在线时间大于")
+a.rmempty = true
+a.default = "24"
+a.datatype="uinteger"
+a:depends({system_time_event="2"})
+a.description = translate("单位为小时")
+
+a=s:taboption("tab_basic2", Flag,"public_ip_event",translate("重拨尝试获取公网 ip"))
+a.default=0
+a.rmempty=true
+a:depends({err_enable="1"})
+a.description = translate("重拨时不会推送 ip 变动通知,并会导致你的域名无法及时更新 ip 地址
请确认你可以通过重拨获取公网 ip,否则这不仅徒劳无功还会引起频繁断网
移动等大内网你就别挣扎了!!")
+a= s:taboption("tab_basic2", Value, "public_ip_retry_count", "当天最大重试次数")
+a.rmempty = true
+a.default = "10"
+a.datatype="uinteger"
+a:depends({public_ip_event="1"})
e=s:taboption("tab_basic3", ListValue,"send_mode",translate("定时任务设定"))
-e.default="disable"
+e.default=""
e:value("",translate("关闭"))
e:value("1",translate("定时发送"))
e:value("2",translate("间隔发送"))
@@ -224,10 +272,12 @@ end
up_timeout=s:taboption("tab_basic4", Value,"up_timeout",translate('设备上线检测超时'))
up_timeout.default = "2"
+up_timeout.datatype="uinteger"
down_timeout=s:taboption("tab_basic4", Value,"down_timeout",translate('设备离线检测超时'))
down_timeout.default = "10"
-down_timeout.description = translate("如果遇到设备频繁离线,可以把超时时间设置长一些
因为会重试两次,所以实际时间会略大于设定值的 2 倍")
+down_timeout.datatype="uinteger"
+down_timeout.description = translate("如果遇到设备 wifi 休眠,频繁推送离线,可以把超时时间设置长一些")
sheep=s:taboption("tab_basic4", ListValue,"serverchan_sheep",translate("免打扰时段设置"),translate("在指定整点时间段内,暂停推送消息
免打扰时间中,定时推送也会被阻止。"))
sheep:value("0",translate("关闭"))
diff --git a/package/ctcgfw/luci-app-serverchan/root/usr/bin/serverchan/serverchan b/package/ctcgfw/luci-app-serverchan/root/usr/bin/serverchan/serverchan
index f178091657..48bfe32a67 100755
--- a/package/ctcgfw/luci-app-serverchan/root/usr/bin/serverchan/serverchan
+++ b/package/ctcgfw/luci-app-serverchan/root/usr/bin/serverchan/serverchan
@@ -12,7 +12,6 @@ function get_config(){
# 初始化设置信息
function read_config(){
- debuglevel=`get_config debuglevel` && if [ -z "$debuglevel" ] ; then logfile="/dev/null";else logfile="/tmp/serverchan/serverchan.log";fi
serverchan_enable=`get_config serverchan_enable`
serverchan_sckey=`get_config sckey`
serverchan_ipv4=`get_config serverchan_ipv4`
@@ -27,7 +26,7 @@ function read_config(){
serverchan_whitelist=`get_config serverchan_whitelist`
serverchan_blacklist=`get_config serverchan_blacklist`
serverchan_interface=`get_config serverchan_interface`
- device_aliases=`get_config device_aliases` && if [ ! -z "$device_aliases" ] ; then device_aliases=`echo $device_aliases | sed 's/ /\n/g' | sed 's/-/ /g'`;fi
+ device_aliases=`get_config device_aliases | sed 's/ /\n/g' | sed 's/-/ /g' 2>/dev/null`
starttime=`get_config starttime`
endtime=`get_config endtime`
sleeptime=`get_config sleeptime` && if [ -z "$sleeptime" ] ; then sleeptime="60";fi
@@ -37,8 +36,18 @@ function read_config(){
temperature=`get_config temperature`
device_name=`get_config device_name`
dir="/tmp/serverchan/" && mkdir -p ${dir}
+ debuglevel=`get_config debuglevel` && if [ -z "$debuglevel" ] ; then logfile="/dev/null";else logfile="${dir}serverchan.log";fi
up_timeout=`get_config up_timeout` && if [ -z "$up_timeout" ] ; then up_timeout="2";fi
down_timeout=`get_config down_timeout` && if [ -z "$down_timeout" ] ; then down_timeout="10";fi
+ network_err_event=`get_config network_err_event`
+ err_device_aliases=`get_config err_device_aliases`
+ system_time_event=`get_config system_time_event`
+ autoreboot_time=`get_config autoreboot_time`
+ network_restart_time=`get_config network_restart_time`
+ wlan_interface=`iw dev | grep Interface | awk '{print $2}'`
+ public_ip_event=`get_config public_ip_event`
+ public_ip_retry_count=`get_config public_ip_retry_count`
+ enable_detection
}
# 检测程序开关
@@ -60,12 +69,20 @@ function enable_detection(){
function serverchan_init(){
rm -f ${dir}usage.db >/dev/null 2>&1
rm -f ${dir}fd1 >/dev/null 2>&1
+ public_ip_today=`date +"%d"`
+ public_ip_retry_count=0
uci set serverchan.serverchan.send_enable=0
uci commit serverchan
+ if [ -f "/usr/bin/serverchan/errlog" ] ; then
+ cat /usr/bin/serverchan/errlog > ${logfile}
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】载入上次重启前日志" >> ${logfile}
+ echo "--------------------------------------------------------" >> ${logfile}
+ rm -f /usr/bin/serverchan/errlog >/dev/null 2>&1
+ fi
echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】载入配置文件" >> ${logfile}
if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】工作目录为 $dir " >> ${logfile};fi
if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】log 目录为 $logfile " >> ${logfile};fi
- if [ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] ; then exit;fi
+ if [ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] ; then `/etc/init.d/serverchan stop`;fi
if [ -z "$serverchan_sckey" ] || [ "${#serverchan_sckey}" -lt "50" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】请填入正确的 SCKEY " >> ${logfile};fi
if [ -z "$serverchan_sckey" ] && [ "${#serverchan_sckey}" -lt "50" ] ; then exit;fi
if [ -z "$serverchan_ipv4" ] || [ "$serverchan_ipv4" -ne "0" ] && [ "$serverchan_ipv4" -ne "1" ] && [ "$serverchan_ipv4" -ne "2" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】无法读取 ipv4 变化通知 开关" >> ${logfile};fi
@@ -152,7 +169,10 @@ function serverchan_disturb(){
local enable=1
else
local enable=0
- enable_detection 1
+ enable_detection
+ sleep $sleeptime
+ serverchan_first
+ unattended
fi
continue
done
@@ -288,46 +308,94 @@ function usage_down(){
# 检测黑白名单
function blackwhitelist(){
if [ "$1" ] ;then
- local ip_mac=`getmac $1`
# 如果 “忽略列表 为空” 并且 “关注列表为空”
if [ -z "$serverchan_whitelist" ] && [ -z "$serverchan_blacklist" ] && [ -z "$serverchan_interface" ]; then
echo 1
# 如果 “忽略列表不为空”
elif [ ! -z "$serverchan_whitelist" ] ; then
- if ( ! echo $serverchan_whitelist | grep -q -i -w $ip_mac); then
+ if ( ! echo $serverchan_whitelist | grep -q -i -w $1); then
echo 1
- else
- echo 0
fi
# 如果 “关注列表不为空”
elif [ ! -z "$serverchan_blacklist" ] ; then
- if ( echo $serverchan_blacklist | grep -q -i -w $ip_mac); then
+ if ( echo $serverchan_blacklist | grep -q -i -w $1); then
echo 1
- else
- echo 0
fi
# 如果 “仅关注接口选项打开”
elif [ ! -z "$serverchan_interface" ] ; then
- if ( echo $serverchan_interface | grep -q -i -w $ip_mac) ; then
+ local ip=`iw dev $serverchan_interface station dump | grep -i -w $1 | grep Station 2>/dev/null`
+ if [ ! -z "$ip" ];then local ip=`getinterface $1 | grep -i -w $serverchan_interface`;fi
+ if [ ! -z "$ip" ];then
echo 1
- else
- local wlan_interface=`iw dev $serverchan_interface station dump | grep -i -w $ip_mac | grep Station`
- local ipAddress_interface=$( cat ${dir}ipAddress | grep -w $1 |awk '{print $5}' | grep -v "^$" | sort -u )
- if [ ! -z "$wlan_interface" ] || [ ! -z "$ipAddress_interface" ] ; then
- echo 1
- else
- echo 0
- fi
fi
fi
fi
}
+# 重启网络服务
+function network_restart(){
+ /etc/init.d/network restart &
+ /etc/init.d/firewall reload &
+ /etc/init.d/dnsmasq restart &
+ if [ "$1" ] ;then
+ sleep $1
+ fi
+}
+
+# 无人值守任务
+function unattended(){
+if [ `get_config send_enable` -eq 3 ] ; then return;fi
+if [ ! -z "$err_device_aliases" ] && [ -f ${dir}ipAddress ] ; then
+ MACLIST=$( cat ${dir}ipAddress | awk '{print $2}' | grep -v "^$" | sort -u )
+ for mac in $MACLIST; do
+ if [ -z "$ip_mac" ] && [ ! -z "$mac" ] ; then
+ local ipmac=$( echo "$err_device_aliases" | grep -i -w $mac | grep -v "^$" | sort -u )
+ fi
+ done
+fi
+
+# 关注设备不在线,执行任务
+if [ -z "$ipmac" ] && [ ! -z "$system_time_event" ] && [ ! -z "$autoreboot_time" ]; then
+ if [ `cat /proc/uptime | awk -F. '{run_hour=$1/3600;printf("%d",run_hour)}'` -ge "$autoreboot_time" ] && [ "$system_time_event" -eq "1" ] ; then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重启路由器咯" >> ${logfile}
+ cat ${logfile} > /usr/bin/serverchan/errlog
+ sleep 2
+ reboot
+ exit
+ elif [ `ubus call network.interface.wan status | grep \"uptime\" | sed $'s/\"uptime": //g'| sed $'s/\,//g' | awk -F. '{run_hour=$1/3600;printf("%d",run_hour)}'` -ge "$network_restart_time" ] && [ "$system_time_event" -eq "2" ] ; then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重新拨号咯" >> ${logfile}
+ network_restart 60
+ fi
+fi
+
+# 重拨尝试获取公网
+if [ -z "$ipmac" ] && [ ! -z "$public_ip_event" ] && [ ! -z "$public_ip_retry_count" ] ; then
+ if [ -z "$ipv4_URL" ] ; then local ipv4_URL="members.3322.org/dyndns/getip";fi
+ if [ ! -z "$ipv4_interface" ] ; then local wanIP=$(/sbin/ifconfig $ipv4_interface | awk '/inet addr/ {print $2}' | awk -F: '{print $2}'| grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}');fi
+ if [ -z "$ipv4_interface" ] ; then local wanIP=$(ubus call network.interface.wan status | grep '\"address\"' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}');fi
+ if [ ! -z "$ipv4_interface" ] ; then local hostIP=$(curl -k -s -4 --interface $ipv4_interface $ipv4_URL);fi
+ if [ -z "$ipv4_interface" ] ; then local hostIP=$(curl -k -s -4 $ipv4_URL);fi
+ if ( ! echo ${wanIP} | grep -q -w ${hostIP} );then
+ if [ $today -eq `date +"%d"` ] ;then public_ip_retry_count=`expr $public_ip_retry_count + 1`;else public_ip_today=`date +"%d"` && public_ip_retry_count=1;fi
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【无人值守任务】重拨尝试获取公网 ip,当前第 $public_ip_retry_count 次 " >> ${logfile}
+ network_restart 60
+ if [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "1" ] ; then local IPv4=$wanIP;fi
+ if [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "2" ] ; then local IPv4=$hostIP;fi
+ if [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "1" ] ; then local IPv6=$(ip -6 address show "$ipv6_interface" | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | head -n 1 | grep -v "^$" | sort -u);fi
+ if [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "2" ] ; then local IPv6=$(curl -k -s -6 "$ipv6_URL");fi
+ echo IPv4 $IPv4 > ${dir}ip
+ echo -e IPv6 $last_IPv6 >> ${dir}ip
+ fi
+fi
+}
+
# 检测网络状态
function rand_geturl(){
local urllist="https://www.163.com https://www.qq.com https://www.baidu.com https://www.qidian.com https://www.douban.com"
local url_str=$( echo "$urllist" | awk -v i="`awk 'BEGIN{srand();sum=rand()*5+ 1;printf("%d",sum)}'`" '{print $i}' )
local check=`curl -k -s -w "%{http_code}" $url_str -A "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11" -o /dev/null`
+ local retry_count=0
+
while [ -z "$check" ] || [ "$check" -ne "200" ];
do
local check=`curl -k -s -w "%{http_code}" $url_str -A "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11" -o /dev/null`
@@ -335,18 +403,140 @@ function rand_geturl(){
if [ ! -z "$network_enable" ] && [ "$network_enable" -eq "404" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【网络状态】网络恢复正常.." >> ${logfile};fi
local network_enable="200"
else
- if [ ! -z "$network_enable" ] && [ "$network_enable" -eq "200" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】当前网络不通!停止检测! " >> ${logfile};fi
+ if [ -z "$network_enable" ] || [ "$network_enable" -eq "200" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】当前网络不通!停止检测! " >> ${logfile};fi
local network_enable="404"
- enable_detection $sleeptime
+
+ if [ -z "$network_err_time" ] ; then local network_err_time=`date +%s`;fi
+ # 网络断开超过十分钟,检测是否执行网络重置
+ if [ ! -z "$network_err_event" ] && [ "$((`date +%s`-$network_err_time))" -ge "600" ] ; then
+ # 查找列表 MAC 是否在线
+ serverchan_first
+ if [ ! -z "$err_device_aliases" ] && [ -f ${dir}ipAddress ] ; then
+ MACLIST=$( cat ${dir}ipAddress | awk '{print $2}' | grep -v "^$" | sort -u )
+ for mac in $MACLIST; do
+ if [ -z "$ip_mac" ] && [ ! -z "$mac" ] ; then
+ local ip_mac=$( echo "$err_device_aliases" | grep -i $mac | grep -v "^$" | sort -u )
+ fi
+ done
+ fi
+
+ # 关注设备不在线,尝试修复网络
+ if [ -z "$ip_mac" ] ; then
+ # 修复方式为重启路由器
+ if [ "$network_err_event" -eq "1" ] ;then
+ if [ -f /usr/bin/serverchan/autoreboot_count ] ; then
+ retry_count=`cat /usr/bin/serverchan/autoreboot_count`
+ fi
+ retry_count=`expr $retry_count + 1`
+
+ if [ "$retry_count" -lt "3" ] ;then
+ echo "$retry_count" > /usr/bin/serverchan/autoreboot_count
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启网络,当前第 $retry_count 次 " >> ${logfile}
+ cat ${logfile} > /usr/bin/serverchan/errlog
+ sleep 2
+ reboot
+ exit
+ elif [ "$retry_count" -eq "3" ] ;then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】已经重启路由2次,修复失败,请主人自行修复哦" >> ${logfile}
+ fi
+ fi
+
+ # 修复方式为重启网络接口
+ if [ "$network_err_event" -eq "2" ] ;then
+ retry_count=`expr $retry_count + 1`
+ if [ "$retry_count" -lt "3" ] ;then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启网络,当前第 $retry_count 次 " >> ${logfile}
+ network_restart 60
+ elif [ "$retry_count" -eq "3" ] ;then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】已经重启网络2次,修复失败,请主人自行修复哦 " >> ${logfile}
+ fi
+ fi
+
+ # 修复方式为修改相关设置项,尝试修复网络
+ if [ "$network_err_event" -eq "3" ] ;then
+ if [ -f /usr/bin/serverchan/autoreboot_count ] ; then retry_count=`cat /usr/bin/serverchan/autoreboot_count`;fi
+ retry_count=`expr $retry_count + 1`
+
+ # 重启网络
+ if [ "$retry_count" -eq "1" ] ;then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 1 次,重启网络服务中 " >> ${logfile}
+ network_restart 60
+ elif [ "$retry_count" -eq "2" ] ;then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 2 次,关闭可能造成网络断开的软件" >> ${logfile}
+ # 备份设置项
+ if [ `uci get koolproxy.@global[0].enabled 2>/dev/null` -eq "1" ] && [ `uci get koolproxy.@global[0].koolproxy_mode 2>/dev/null` -eq "1" ] ;then /etc/init.d/koolproxy stop;fi
+ if [ `uci get adbyby.@adbyby[0].enable 2>/dev/null` -eq "1" ] && [ `uci get adbyby.@adbyby[0].wan_mode 2>/dev/null` -eq "0" ] ;then /etc/init.d/adbyby stop;fi
+ if [ `uci get passwall.@global[0].enabled 2>/dev/null` -eq "1" ] && [ `uci get passwall.@global[0].proxy_mode 2>/dev/null | grep global` ];then /etc/init.d/koolproxy stop;fi
+ shadowsocksr_enabled=`uci get shadowsocksr.@global[0].global_server 2>/dev/null | grep nil`
+ shadowsocksr_run_mode=`uci get shadowsocksr.@global[0].run_mode 2>/dev/null | grep all`
+ if [ -z "$shadowsocksr_enabled" ] && [ ! -z "$shadowsocksr_run_mode" ];then /etc/init.d/shadowsocksr stop;fi
+ network_restart 60
+ elif [ "$retry_count" -eq "3" ] ;then
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试修复网络,当前第 3 次,备份设置项,并修改相关设置" >> ${logfile}
+ # 备份设置项
+ mkdir -p /usr/bin/serverchan/configbak
+ cp -p -f /etc/config/network /usr/bin/serverchan/configbak/network
+ cp -p -f /etc/config/dhcp /usr/bin/serverchan/configbak/dhcp
+ cp -p -f /etc/config/firewall /usr/bin/serverchan/configbak/firewall
+ cp -p -f /etc/firewall.user /usr/bin/serverchan/configbak/firewall.user
+ # 设置 dns 为自动获取
+ #uci set network.wan.peerdns='1'
+ #uci delete network.wan.dns
+ # 设置 dns 为阿里+腾讯
+ uci set network.wan.peerdns='0'
+ uci delete network.wan.dns
+ uci add_list network.wan.dns='223.5.5.5'
+ uci add_list network.wan.dns='119.29.29.29'
+ # 还原 MTU 为默认获取
+ uci delete network.wan.mtu
+ uci commit network
+ # 还原 dns 重定向
+ uci set dhcp.@dnsmasq[0].port='53'
+ uci delete dhcp.@dnsmasq[0].server
+ # 删除静态租约
+ #uci delete dhcp.host
+ # 删除防火墙转发规则
+ uci delete firewall.redirect
+ # 删除防火墙自定义规则
+ >/etc/firewall.user
+ uci commit firewall
+ echo "$retry_count" > /usr/bin/serverchan/autoreboot_count
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】正在尝试重启网络,当前第 $retry_count 次 " >> ${logfile}
+ cat ${logfile} > /usr/bin/serverchan/errlog
+ sleep 2
+ reboot
+ elif [ "$retry_count" -eq "4" ] ;then
+ echo "$retry_count" > /usr/bin/serverchan/autoreboot_count
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!!】修复失败,还原设置中,请自行检查网络设置" >> ${logfile}
+ # 还原设置项
+ cp -p -f /usr/bin/serverchan/configbak/network /etc/config/network
+ cp -p -f /usr/bin/serverchan/configbak/dhcp /etc/config/dhcp
+ cp -p -f /usr/bin/serverchan/configbak/firewall /etc/config/firewall
+ cp -p -f /usr/bin/serverchan/configbak/firewall.user /etc/firewall.user
+ #rm -rf /usr/bin/serverchan/configbak >/dev/null 2>&1
+ # 如果 LAN 口误设置为 pppoe 则改为静态分配,不还原,点错懒得捅菊花就拔网线等十分钟
+ lan_proto=`uci get network.lan.proto 2>/dev/null | grep pppoe`
+ if [ ! -z "$lan_proto" ];then uci set network.lan.proto='static' && uci set network.lan.ipaddr='192.168.1.1' && uci set network.lan.netmask='255.255.255.0' && uci commit network;fi
+ network_restart
+ fi
+ fi
+ fi
+ elif [ -f /usr/bin/serverchan/autoreboot_count ] ; then
+ network_err_time=`expr $network_err_time - 600`
+ sleep 60
+ fi
+ enable_detection
+ sleep $sleeptime
fi
continue
done
+ rm -f /usr/bin/serverchan/autoreboot_count >/dev/null 2>&1
}
# 检测 ip 状况
function ip_changes(){
if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【外网IP】正在检测外网IP变化" >> ${logfile};fi
- if [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "1" ] ; then local IPv4=$(ip -4 address show "$ipv4_interface" | grep inet | grep -v 127.0.0 | awk '{print $2}' | cut -d'/' -f1 | head -n 1 | grep -v "^$" | sort -u);fi
+ if [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "1" ] ; then local IPv4=$(/sbin/ifconfig $ipv4_interface | awk '/inet addr/ {print $2}' | awk -F: '{print $2}'| grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}');fi
if [ ! -z "$serverchan_ipv4" ] && [ "$serverchan_ipv4" -eq "2" ] ; then local IPv4=$(curl -k -s -4 "$ipv4_URL");fi
if [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "1" ] ; then local IPv6=$(ip -6 address show "$ipv6_interface" | grep inet6 | awk '{print $2}' | cut -d'/' -f1 | head -n 1 | grep -v "^$" | sort -u);fi
if [ ! -z "$serverchan_ipv6" ] && [ "$serverchan_ipv6" -eq "2" ] ; then local IPv6=$(curl -k -s -6 "$ipv6_URL");fi
@@ -425,25 +615,39 @@ function ip_changes(){
# 查询 mac 地址
function getmac(){
- if [ -f "${dir}ipAddress" ] ; then local ip_mac=$( cat ${dir}ipAddress | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u );fi
- if ( echo "$ip_mac" | grep -q "unknown" ) || [ -z "$ip_mac" ] ; then local ip_mac=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u );fi
- if ( echo "$ip_mac" | grep -q "unknown" ) || [ -z "$ip_mac" ] ; then local ip_mac=$( cat /proc/net/arp | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u );fi
+ if [ -f "${dir}ipAddress" ] ; then local ip_mac=`cat ${dir}ipAddress | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u`;fi
+ if [ -f "${dir}tmp_downlist" ] && [ -z "$ip_mac" ] ; then local ip_mac=`cat ${dir}tmp_downlist | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u`;fi
+ if ( echo "$ip_mac" | grep -q "unknown" ) || [ -z "$ip_mac" ] ; then local ip_mac=`cat /var/dhcp.leases | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u`;fi
+ if ( echo "$ip_mac" | grep -q "unknown" ) || [ -z "$ip_mac" ] ; then local ip_mac=`cat /proc/net/arp | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u`;fi
if [ -z "$ip_mac" ] ; then local ip_mac="unknown";fi
echo "$ip_mac"
}
# 查询主机名
function getname(){
- if [ -f "${dir}ipAddress" ] ; then local ip_name=$( cat ${dir}ipAddress | grep -w $1 |awk '{print $3}' | grep -v "^$" | sort -u );fi
- if ( echo "$ip_name" | grep -q "unknown" ) || [ -z "$ip_name" ] ; then local ip_name=$( echo "$device_aliases" | grep -i $2 |awk '{print $2}' | grep -v "^$" | sort -u );fi
- if ( echo "$ip_name" | grep -q "unknown" ) || [ -z "$ip_name" ] ; then local ip_name=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u );fi
+ if [ -f "${dir}ipAddress" ] ; then local ip_name=`cat ${dir}ipAddress | grep -w $1 |awk '{print $3}' | grep -v "^$" | sort -u`;fi
+ if [ -f "${dir}tmp_downlist" ] && [ -z "$ip_name" ] ; then local ip_name=`cat ${dir}tmp_downlist | grep -w $1 |awk '{print $3}' | grep -v "^$" | sort -u`;fi
+ if ( echo "$ip_name" | grep -q "unknown" ) || [ -z "$ip_name" ] ; then local ip_name=`echo "$device_aliases" | grep -i $2 |awk '{print $2}' | grep -v "^$" | sort -u`;fi
+ if ( echo "$ip_name" | grep -q "unknown" ) || [ -z "$ip_name" ] ; then local ip_name=`cat /var/dhcp.leases | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u`;fi
if [ -z "$ip_name" ] ; then local ip_name="unknown";fi
echo "$ip_name"
}
+# 查询设备接口
+function getinterface(){
+ if [ -f "${dir}ipAddress" ] ; then local ip_interface=`cat ${dir}ipAddress | grep -w $1 |awk '{print $5}' | grep -v "^$" | sort -u`;fi
+ if [ -f "${dir}tmp_downlist" ] && [ -z "$ip_interface" ] ; then local ip_interface=`cat ${dir}tmp_downlist | grep -w $1 |awk '{print $5}' | grep -v "^$" | sort -u`;fi
+ if [ ! -z "$wlan_interface" ] ; then
+ for interface in $wlan_interface; do
+ if [ -z "$ip_interface" ] ; then local ip_interface=`iw dev $interface station dump | grep Station | grep -i -w $1 | sed -nr 's#^.*on (.*))#\1#gp' 2>/dev/null`;fi
+ done
+ fi
+ if [ -z "$ip_interface" ] ; then local ip_interface=`cat /proc/net/arp | grep "0x2" | grep -i -w $1 | awk '{print $6}' | grep -v "^$" | sort -u`;fi
+ echo $ip_interface
+}
+
# 检测设备上线
function up(){
-if [ ! -f "${dir}ipAddress" ] ; then > ${dir}ipAddress;fi
if [ "$1" ] ;then
# 如果 ipAddress 文件中存在此ip,则跳过,待断线检测
local ip=`cat ${dir}ipAddress | grep -w $1`
@@ -453,7 +657,7 @@ if [ "$1" ] ;then
local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 10 -f -w 1 $1)`
if ( ! echo ${ip_ms} | grep -q ms );then
- local ip_ms=`ping -c 10 -w $up_timeout $1`
+ local ip_ms=`ping -c 10 -w 1 $1`
if ( ! echo ${ip_ms} | grep -q ms );then
enable_detection 1
local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 10 -f -w $up_timeout $1)`
@@ -463,39 +667,48 @@ if [ "$1" ] ;then
# 如果连接成功
if ( echo ${ip_ms} | grep -q ms ); then
LockFile lock
- usage_down $1
-
- # 如果定时任务没有运行
- local send_enable=`get_config send_enable`
- if [ ! -z "$send_enable" ] && [ "$send_enable" -ne 3 ] ; then
- if [ ! -z "$serverchan_up" ] && [ "$serverchan_up" -eq "1" ] ; then
- # 如果通过黑白名单验证
- if [ ! -z `blackwhitelist $1` ] && [ `blackwhitelist $1` -eq 1 ] ; then
- if [ -f "${dir}title" ] ; then local title=`cat ${dir}title` ;fi
- if [ -f "${dir}content" ] ; then local content=`cat ${dir}content` ;fi
- if [ -z "$title" ] ; then
- local title="$ip_name 连接了你的路由器"
- local content="%0D%0A%0D%0A---%0D%0A%0D%0A####新设备连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端 MAC:%26ensp%3b%26ensp%3b$ip_mac"
- elif ( echo ${title} | grep -q "连接了你的路由器" ) ; then
- local title="$ip_name 连接了你的路由器"
- local content="%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端 MAC:%26ensp%3b%26ensp%3b$ip_mac"
- else
- local title="设备状态变化"
- local content="%0D%0A%0D%0A---%0D%0A%0D%0A####新设备连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端 MAC:%26ensp%3b%26ensp%3b$ip_mac"
- fi
- echo "`date "+%Y-%m-%d %H:%M:%S"` 【微信推送】新设备 $ip_name $1 连接了">> ${logfile}
+ local ip_interface=`getinterface $ip_mac`
+ # 刚刚掉线又重连了
+ if [ -f "${dir}tmp_downlist" ];then local tmp_downip=`cat ${dir}tmp_downlist | grep -w $1 | awk '{print $2}' | grep -v "^$" | sort -u`;fi
+ if [ ! -z "$tmp_downip" ] ; then
+ cat ${dir}tmp_downlist | grep -w $1 | grep -v "^$" | sort -u >> ${dir}ipAddress
+ sed -i "/$1/d" ${dir}tmp_downlist
+ # 真·刚上线
+ else
+ usage_down $1
+ echo "$1 $ip_mac $ip_name `date +%s` $ip_interface" >> ${dir}ipAddress
+ # 如果定时任务没有运行
+ local send_enable=`get_config send_enable`
+ if [ ! -z "$send_enable" ] && [ "$send_enable" -ne 3 ] ; then
+ if [ ! -z "$serverchan_up" ] && [ "$serverchan_up" -eq "1" ] ; then
+ # 如果通过黑白名单验证
+ local ip_blackwhite=`blackwhitelist $ip_mac`
+ if [ ! -z "$ip_blackwhite" ] && [ "$ip_blackwhite" -eq 1 ] ; then
+ if [ -f "${dir}title" ] ; then local title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then local content=`cat ${dir}content` ;fi
+ if [ -z "$title" ] ; then
+ local title="$ip_name 连接了你的路由器"
+ local content="%0D%0A%0D%0A---%0D%0A%0D%0A####新设备连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端 MAC:%26ensp%3b%26ensp%3b$ip_mac"
+ elif ( echo ${title} | grep -q "连接了你的路由器" ) ; then
+ local title="$ip_name 连接了你的路由器"
+ local content="%0D%0A%0D%0A---%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端 MAC:%26ensp%3b%26ensp%3b$ip_mac"
+ else
+ local title="设备状态变化"
+ local content="%0D%0A%0D%0A---%0D%0A%0D%0A####新设备连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端 MAC:%26ensp%3b%26ensp%3b$ip_mac"
+ fi
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【微信推送】新设备 $ip_name $1 连接了">> ${logfile}
- if [ ! -z "$serverchan_blacklist" ] ; then
- local title="你偷偷关注的设备上线了"
- fi
+ if [ ! -z "$serverchan_blacklist" ] ; then
+ local title="你偷偷关注的设备上线了"
+ fi
- echo $title >${dir}title
- echo -n $content >>${dir}content
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ fi
fi
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 新设备 $ip_name $1 连接了" >> ${logfile};fi
fi
- if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 新设备 $ip_name $1 连接了" >> ${logfile};fi
fi
- echo "$1 $ip_mac $ip_name `date +%s` `iw dev $serverchan_interface station dump | grep Station | grep -i -w $ip_mac | sed -nr 's#^.*on (.*))#\1#gp'`" >> ${dir}ipAddress
LockFile unlock
else
if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 设备 $ip_name $1 连接失败" >> ${logfile};fi
@@ -504,68 +717,85 @@ if [ "$1" ] ;then
fi
}
-# 检测设备下线
+# 检测设备离线
function down(){
if [ ! -f "${dir}ipAddress" ] ; then return;fi
if [ "$1" ] ;then
local ip_mac=`getmac $1`
local ip_name=`getname $1 $ip_mac`
-
- local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 20 -f -w $down_timeout $1)`
- if ( ! echo ${ip_ms} | grep -q ms );then
- local ip_ms=`ping -c 5 -w 5 $1`
-
+ local ip_interface=`getinterface $ip_mac`
+
+ local wlan_online=`iw dev $ip_interface station dump | grep -i -w $ip_mac | grep Station 2>/dev/null`
+ local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 20 -f -w 2 $1)`
+ if [ -z "$wlan_online" ] && ( ! echo ${ip_ms} | grep -q ms );then
+ local ip_ms=`ping -c 5 -w 3 $1`
if ( ! echo ${ip_ms} | grep -q ms );then
enable_detection 1
local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 20 -f -w $down_timeout $1)`
fi
fi
- if ( echo ${ip_ms} | grep -q ms ); then
# 如果连接成功
- if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 设备 $ip_name $1 依然坚挺" >> ${logfile};fi
-
- # 如果连接失败
+ if [ ! -z "$wlan_online" ] || ( echo ${ip_ms} | grep -q ms ); then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 设备 $ip_name $1 依然坚挺" >> ${logfile};fi
+ # 如果连接失败
else
LockFile lock
# 如果定时任务没有运行
local send_enable=`get_config send_enable`
if [ ! -z "$send_enable" ] && [ "$send_enable" -ne 3 ] && [ ! -z "$ip_ms" ] ; then
- if [ ! -z "$serverchan_down" ] && [ "$serverchan_down" -eq "1" ] ; then
- # 如果通过黑白名单验证
- if [ ! -z `blackwhitelist $1` ] && [ `blackwhitelist $1` -eq 1 ] ; then
- if [ -f "${dir}title" ] ; then local title=`cat ${dir}title` ;fi
- if [ -f "${dir}content" ] ; then local content=`cat ${dir}content` ;fi
- local ip_total=`usage_ip $1` && if [ ! -z "$ip_total" ] ; then local ip_total="%0D%0A%0D%0A总计流量: %26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_total";fi
- local time_down=`date +%s`
- local time_up=$( cat ${dir}ipAddress | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u )
- local time1=$(($time_down-$time_up))
- local time1=`time_for_humans $time1`
- if [ -z "$title" ] ; then
- local title="$ip_name 断开连接"
- local content="%0D%0A%0D%0A---%0D%0A%0D%0A####设备断开连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP: %26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端MAC: %26ensp%3b%26ensp%3b$ip_mac$ip_total%0D%0A%0D%0A在线时间: %26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$time1"
- elif ( echo ${title} | grep -q "断开连接" ) ; then
- local title="$ip_name 断开连接"
- local content="%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端MAC:$ip_mac$ip_total%0D%0A%0D%0A在线时间:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$time1"
- else
- local title="设备状态变化"
- local content="%0D%0A%0D%0A---%0D%0A%0D%0A####设备断开连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$1%0D%0A%0D%0A客户端MAC:$ip_mac$ip_total%0D%0A%0D%0A在线时间:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$time1"
- fi
-
- echo "`date "+%Y-%m-%d %H:%M:%S"` 【微信推送】设备 $ip_name $1 断开连接 " >> ${logfile}
- echo $title >${dir}title
- echo -n $content >>${dir}content
- fi
- fi
- if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 设备 $ip_name $1 断开连接 " >> ${logfile};fi
- sed -i "/$1/d" ${dir}ipAddress
- usage_down $1
+ # 先放到缓存区
+ echo "$1 $ip_mac $ip_name `cat ${dir}ipAddress | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u` $ip_interface" >> ${dir}tmp_downlist
fi
+ sed -i "/$1/d" ${dir}ipAddress
LockFile unlock
fi
fi
}
+# 设备离线通知
+function down_send(){
+if [ ! -f "${dir}tmp_downlist" ] ; then return;fi
+local IPLIST=$( cat ${dir}tmp_downlist | awk '{print $1}' )
+for ip in $IPLIST; do
+ if [ ! -z "$ip" ] ; then
+ local ip_mac=$( cat ${dir}tmp_downlist | grep -w $ip |awk '{print $2}' | grep -v "^$" | sort -u )
+ local ip_name=$( cat ${dir}tmp_downlist | grep -w $ip |awk '{print $3}' | grep -v "^$" | sort -u )
+ local ip_uptime=$( cat ${dir}tmp_downlist | grep -w $ip |awk '{print $4}' | grep -v "^$" | sort -u )
+ local ip_interface=$( cat ${dir}tmp_downlist | grep -w $ip |awk '{print $5}' | grep -v "^$" | sort -u )
+
+ if [ ! -z "$serverchan_down" ] && [ "$serverchan_down" -eq "1" ] ; then
+ # 如果通过黑白名单验证
+ local ip_blackwhite=`blackwhitelist $ip_mac`
+ if [ ! -z "$ip_blackwhite" ] && [ "$ip_blackwhite" -eq 1 ] ; then
+ if [ -f "${dir}title" ] ; then local title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then local content=`cat ${dir}content` ;fi
+ local ip_total=`usage_ip $ip` && if [ ! -z "$ip_total" ] ; then local ip_total="%0D%0A%0D%0A总计流量: %26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_total";fi
+ local time_down=`date +%s`
+ local time1=$(($time_down-$ip_uptime))
+ local time1=`time_for_humans $time1`
+ if [ -z "$title" ] ; then
+ local title="$ip_name 断开连接"
+ local content="%0D%0A%0D%0A---%0D%0A%0D%0A####设备断开连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP: %26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip%0D%0A%0D%0A客户端MAC: %26ensp%3b%26ensp%3b$ip_mac$ip_total%0D%0A%0D%0A在线时间: %26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$time1"
+ elif ( echo ${title} | grep -q "断开连接" ) ; then
+ local title="$ip_name 断开连接"
+ local content="%0D%0A%0D%0A---%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip%0D%0A%0D%0A客户端MAC:$ip_mac$ip_total%0D%0A%0D%0A在线时间:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$time1"
+ else
+ local title="设备状态变化"
+ local content="%0D%0A%0D%0A---%0D%0A%0D%0A####设备断开连接%0D%0A%0D%0A客户端名:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip_name%0D%0A%0D%0A客户端 IP:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$ip%0D%0A%0D%0A客户端MAC:$ip_mac$ip_total%0D%0A%0D%0A在线时间:%26ensp%3b%26ensp%3b%26ensp%3b%26ensp%3b$time1"
+ fi
+
+ echo "`date "+%Y-%m-%d %H:%M:%S"` 【微信推送】设备 $ip_name $ip 断开连接 " >> ${logfile}
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 设备 $ip_name $ip 断开连接 " >> ${logfile};fi
+ fi
+ fi
+ fi
+done
+rm -f ${dir}tmp_downlist >/dev/null 2>&1
+}
+
# 当前设备列表
function current_device(){
local content=`cat ${dir}content`
@@ -711,11 +941,7 @@ function send(){
local router_temp=`get_config router_temp`
if [ ! -z "$router_temp" ] && [ "$router_temp" -eq "1" ] ; then local send_content=${send_content}"%0D%0A%0D%0A""---%0D%0A%0D%0A#### 设备温度%0D%0A%0D%0A CPU:`soc_temp`%e2%84%83";fi
local router_wan=`get_config router_wan`
- local ipv4_interface=$(get_config ipv4_interface)
- local ipv6_interface=$(get_config ipv6_interface)
- local ipv4_URL=`get_config ipv4_URL`
if [ -z "$ipv4_URL" ] ; then local ipv4_URL="members.3322.org/dyndns/getip";fi
- local ipv6_URL=`get_config ipv6_URL`
if [ -z "$ipv6_URL" ] ; then local ipv6_URL="v6.ip.zxinc.org/getip";fi
if [ ! -z "$ipv4_interface" ] ; then local send_wanIP=$(/sbin/ifconfig $ipv4_interface | awk '/inet addr/ {print $2}' | awk -F: '{print $2}'| grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}');fi
if [ -z "$ipv4_interface" ] ; then local send_wanIP=$(ubus call network.interface.wan status | grep '\"address\"' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}');fi
@@ -810,7 +1036,6 @@ function send(){
# 初始化在线设备列表
function serverchan_first(){
if [ ! -z "$serverchan_enable" ] && [ "$serverchan_enable" -eq "1" ] ; then
- echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】载入在线设备" >> ${logfile}
uci set serverchan.serverchan.send_enable=3
uci commit serverchan
local IPLIST=$( cat /proc/net/arp | grep "0x2" | awk '{print $1}' | grep -v "^$" | sort -u )
@@ -820,14 +1045,12 @@ if [ ! -z "$serverchan_enable" ] && [ "$serverchan_enable" -eq "1" ] ; then
if [ ! -z "$ip" ] ; then
local ip_mac=`getmac $ip`
local ip_name=`getname $ip $ip_mac`
-
up $ip &
fi
done
wait
uci set serverchan.serverchan.send_enable=0
uci commit serverchan
- echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】初始化完成" >> ${logfile}
fi
}
@@ -863,7 +1086,9 @@ fi
# 初始化
serverchan_init
+echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】载入在线设备" >> ${logfile}
serverchan_first
+echo "`date "+%Y-%m-%d %H:%M:%S"` 【初始化】初始化完成" >> ${logfile}
# 循环
while [ "$serverchan_enable" -eq "1" ] ;
@@ -879,7 +1104,8 @@ do
# 设备下线检测
# 从 ipAddress 文件中读取上次检测到的在线列表
- if [ -f ${dir}ipAddress ] ; then IPLIST=$( cat ${dir}ipAddress | awk '{print $1}' | grep -v "^$" | sort -u ) && IPLISTrow=$(grep -c "" ${dir}ipAddress);fi
+ if [ ! -f "${dir}ipAddress" ] ; then > ${dir}ipAddress;fi
+ IPLIST=$( cat ${dir}ipAddress | awk '{print $1}' | grep -v "^$" | sort -u ) && IPLISTrow=$(grep -c "" ${dir}ipAddress)
send_enable=`get_config send_enable`
for ip in $IPLIST; do
if [ ! -z "$ip" ] && [ $send_enable -ne 3 ] ; then
@@ -898,7 +1124,8 @@ do
# 新设备接入检测
# 从 arp 缓存中读取 0x2 在线列表
- if [ -f ${dir}ipAddress ] ; then IPLIST=$( cat /proc/net/arp | grep "0x2" | awk '{print $1}' | grep -v "^$" | sort -u ) && IPLISTrow=$(grep -c "" ${dir}ipAddress);fi
+ if [ ! -f "${dir}ipAddress" ] ; then > ${dir}ipAddress;fi
+ IPLIST=$( cat /proc/net/arp | grep "0x2" | awk '{print $1}' | grep -v "^$" | sort -u ) && IPLISTrow=$(grep -c "" ${dir}ipAddress)
send_enable=`get_config send_enable`
for ip in $IPLIST; do
# 如果 “ip 列表不为空”
@@ -917,12 +1144,17 @@ do
usage
fi
unset IPLIST && unset IPLISTrow
+
+ down_send
# 当前设备列表
if [ -f "${dir}content" ] && [ `get_config send_enable` -ne 3 ] ; then
current_device
fi
+ # 无人值守任务
+ unattended
+
# CPU 检测
cpu_load
@@ -938,7 +1170,7 @@ do
if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo ""-----------------------------------------------------"" >> ${logfile};fi
send_str=1
fi
- enable_detection $sleeptime
+ sleep $sleeptime
send_enable=`get_config send_enable`
continue
done
@@ -961,6 +1193,6 @@ do
fi
deltemp
if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%Y-%m-%d %H:%M:%S"` 【等待】我累了,$sleeptime 秒后再回来" >> ${logfile};fi
- enable_detection $sleeptime
+ sleep $sleeptime
continue
done