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