diff --git a/README.md b/README.md
index e224fe2787..7017818575 100755
--- a/README.md
+++ b/README.md
@@ -37,7 +37,7 @@ make -j1 V=s
Packages jsda: [jsda/packages2](https://github.com/jsda/packages2).
luci-theme-netgearv2 source: [tracemouse/luci-theme-netgear](https://github.com/tracemouse/luci-theme-netgear).
-MTK Properties source: [Nossiac/mtk-openwrt-feeds](https://github.com/Nossiac/mtk-openwrt-feeds).
+luci-app-serverchan source: [zxlhhyccc/luci-app-serverchan](https://github.com/zxlhhyccc/luci-app-serverchan).
# License
### [GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
diff --git a/package/cnsztl/luci-app-serverchan/Makefile b/package/cnsztl/luci-app-serverchan/Makefile
new file mode 100644
index 0000000000..57279accc4
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/Makefile
@@ -0,0 +1,58 @@
+# Copyright (C) 2016 Openwrt.org
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-app-serverchan
+PKG_VERSION:=1.0
+PKG_RELEASE:=40
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/luci-app-serverchan
+ SECTION:=luci
+ CATEGORY:=LuCI
+ SUBMENU:=3. Applications
+ TITLE:=LuCI Support for serverchan on or off
+ DEPENDS:=+iputils-arping +curl
+endef
+
+define Package/luci-app-serverchan/description
+ LuCI support for serverchan
+endef
+
+define Build/Prepare
+endef
+
+define Build/Compile
+endef
+
+define Package/luci-app-serverchan/install
+ $(INSTALL_DIR) $(1)/usr/lib/lua/luci
+ cp -pR ./luasrc/* $(1)/usr/lib/lua/luci
+ $(INSTALL_DIR) $(1)/
+ cp -pR ./root/* $(1)/
+endef
+
+define Package/luci-app-serverchan/postinst
+#!/bin/sh
+ chmod 755 /etc/init.d/serverchan >/dev/null 2>&1
+ chmod 755 /usr/bin/serverchan/serverchan >/dev/null 2>&1
+ /etc/init.d/serverchan enable >/dev/null 2>&1
+exit 0
+endef
+
+define Package/luci-app-serverchan/prerm
+#!/bin/sh
+if [ -z "$${IPKG_INSTROOT}" ]; then
+ /etc/init.d/serverchan disable
+ /etc/init.d/serverchan stop
+fi
+exit 0
+endef
+
+$(eval $(call BuildPackage,luci-app-serverchan))
diff --git a/package/cnsztl/luci-app-serverchan/luasrc/controller/serverchan.lua b/package/cnsztl/luci-app-serverchan/luasrc/controller/serverchan.lua
new file mode 100644
index 0000000000..36cf8258dc
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/luasrc/controller/serverchan.lua
@@ -0,0 +1,15 @@
+module("luci.controller.serverchan",package.seeall)
+function index()
+if not nixio.fs.access("/etc/config/serverchan")then
+return
+end
+entry({"admin","services","serverchan"},cbi("serverchan"),_("微信推送"),30).dependent=true
+entry({"admin","services","serverchan","status"},call("act_status")).leaf=true
+end
+
+function act_status()
+ local e={}
+ e.running=luci.sys.call("pgrep -f serverchan/serverchan >/dev/null")==0
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(e)
+end
\ No newline at end of file
diff --git a/package/cnsztl/luci-app-serverchan/luasrc/model/cbi/serverchan.lua b/package/cnsztl/luci-app-serverchan/luasrc/model/cbi/serverchan.lua
new file mode 100644
index 0000000000..b7cd890751
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/luasrc/model/cbi/serverchan.lua
@@ -0,0 +1,195 @@
+local nt = require "luci.sys".net
+local log=require"nixio.fs"
+local e=luci.model.uci.cursor()
+local net = require "luci.model.network".init()
+local sys = require "luci.sys"
+local ifaces = sys.net:devices()
+
+m=Map("serverchan",translate("ServerChan"),translate("「Server酱」,英文名「ServerChan」,是一款从服务器推送报警信息和日志到微信的工具。"))
+
+m:section(SimpleSection).template = "serverchan/serverchan_status"
+
+s=m:section(NamedSection,"serverchan","serverchan",translate("Server酱设置"))
+s:tab("tab_basic", translate("基本设置"))
+s:tab("tab_basic2", translate("设备状态"))
+s:tab("tab_basic3", translate("定时推送"))
+s:tab("tab_basic4", translate("免打扰"))
+s:tab("log",translate("客户端日志"))
+s.addremove = false
+s.anonymous = true
+
+--Base Setting
+a=s:taboption("tab_basic", Flag,"serverchan_enable",translate("启用"))
+a.default=0
+a.rmempty=true
+
+a=s:taboption("tab_basic", Value,"sckey",translate('SCKEY'))
+a.rmempty=true
+
+debuglevel=s:taboption("tab_basic", ListValue,"debuglevel",translate("日志调试等级"))
+debuglevel:value("",translate("关闭"))
+debuglevel:value("1",translate("简单"))
+debuglevel:value("2",translate("详细"))
+debuglevel.rmempty = true
+debuglevel.optional = true
+
+device_aliases= s:taboption("tab_basic", DynamicList, "device_aliases", translate("设备别名"))
+device_aliases.rmempty = true
+device_aliases.optional = true
+device_aliases.description = translate("
请输入设备 MAC 和设备别名,用“-”隔开,如:
XX:XX:XX:XX:XX:XX-我的手机")
+
+
+e=s:taboption("log",TextValue,"log")
+e:depends({debuglevel="1"})
+e:depends({debuglevel="2"})
+e.rows=26
+e.wrap="off"
+e.readonly=true
+e.cfgvalue=function(s,s)
+return log.readfile("/tmp/serverchan/server_chan.log")or""
+end
+e.write=function(e,e,e)
+end
+
+a=s:taboption("tab_basic2", Flag,"serverchan_ip",translate("WAN ip 变化通知"))
+a.default=0
+a.rmempty=true
+a=s:taboption("tab_basic2", Flag,"serverchan_up",translate("设备上线通知"))
+a.default=0
+a.rmempty=true
+a=s:taboption("tab_basic2", Flag,"serverchan_down",translate("设备下线通知"))
+a.default=0
+a.rmempty=true
+a=s:taboption("tab_basic2", Flag,"cpuload_enable",translate("CPU 负载报警"))
+a.default=0
+a.rmempty=true
+a= s:taboption("tab_basic2", Value, "cpuload", "负载报警阈值")
+a.rmempty = true
+a.placeholder = "2.0"
+a:depends({cpuload_enable="1"})
+a=s:taboption("tab_basic2", Flag,"temperature_enable",translate("CPU 温度报警"))
+a.default=0
+a.rmempty=true
+a= s:taboption("tab_basic2", Value, "temperature", "温度报警阈值")
+a.rmempty = true
+a.placeholder = "80"
+a:depends({temperature_enable="1"})
+a.description = translate("
设备报警只会在连续五次超过阈值的时候才会推送
而且一个小时内不会再提醒第二次")
+
+e=s:taboption("tab_basic3", ListValue,"send_mode",translate("定时任务设定"))
+e.default="disable"
+e:value("",translate("关闭"))
+e:value("1",translate("定时发送"))
+e:value("2",translate("间隔发送"))
+
+e=s:taboption("tab_basic3", ListValue,"regular_time",translate("发送时间"))
+for t=0,23 do
+e:value(t,translate("每天"..t.."点"))
+end
+e.default=12
+e.datatype=uinteger
+e:depends("send_mode","1")
+
+e=s:taboption("tab_basic3", ListValue,"interval_time",translate("发送间隔"))
+for t=1,23 do
+e:value(t,translate(t.."小时"))
+end
+e.default=6
+e.datatype=uinteger
+e:depends("send_mode","2")
+
+title= s:taboption("tab_basic3", Value, "send_title", translate("微信推送标题"))
+title:depends("send_mode","1")
+title:depends("send_mode","2")
+title.placeholder = "OpenWrt By tty228 路由状态:"
+title.optional = true
+title.description = translate("
使用特殊符号可能会造成发送失败")
+
+router_status=s:taboption("tab_basic3", Flag,"router_status",translate("系统运行情况"))
+router_status:depends("send_mode","1")
+router_status:depends("send_mode","2")
+
+router_temp=s:taboption("tab_basic3", Flag,"router_temp",translate("设备温度"))
+router_temp:depends("send_mode","1")
+router_temp:depends("send_mode","2")
+
+router_wan=s:taboption("tab_basic3", Flag,"router_wan",translate("WAN信息"))
+router_wan:depends("send_mode","1")
+router_wan:depends("send_mode","2")
+
+client_list=s:taboption("tab_basic3", Flag,"client_list",translate("客户端列表"))
+client_list:depends("send_mode","1")
+client_list:depends("send_mode","2")
+
+e=s:taboption("tab_basic3", Button,"_add",translate("手动发送"))
+e.inputtitle=translate("发送")
+e:depends("send_mode","1")
+e:depends("send_mode","2")
+e.inputstyle = "apply"
+function e.write(self, section)
+
+luci.sys.call("cbi.apply")
+ luci.sys.call("/usr/bin/serverchan/serverchan send &")
+end
+
+sheep=s:taboption("tab_basic4", ListValue,"serverchan_sheep",translate("免打扰时段设置"),translate("在指定整点时间段内,暂停推送消息
免打扰时间中,定时推送也会被阻止。"))
+sheep:value("0",translate("关闭"))
+sheep:value("1",translate("模式一:脚本挂起,不检测设备"))
+--[[sheep:value("2",translate("模式二:脚本继续运行但不发送消息"))--]]
+sheep.rmempty = true
+sheep.optional = true
+sheep=s:taboption("tab_basic4", ListValue,"starttime",translate("免打扰开始时间"))
+for t=0,23 do
+sheep:value(t,translate("每天"..t.."点"))
+end
+sheep.default=0
+sheep.datatype=uinteger
+sheep:depends({serverchan_sheep="1"})
+sheep:depends({serverchan_sheep="2"})
+sheep=s:taboption("tab_basic4", ListValue,"endtime",translate("免打扰结束时间"))
+for t=0,23 do
+sheep:value(t,translate("每天"..t.."点"))
+end
+sheep.default=8
+sheep.datatype=uinteger
+sheep:depends({serverchan_sheep="1"})
+sheep:depends({serverchan_sheep="2"})
+
+mac=s:taboption("tab_basic4", ListValue,"macmechanism",translate("MAC过滤"))
+mac:value("",translate("disable"))
+mac:value("allow",translate("忽略列表内设备"))
+mac:value("block",translate("仅通知列表内设备"))
+mac:value("interface",translate("仅通知此接口设备"))
+
+allowedmac = s:taboption("tab_basic4", DynamicList, "serverchan_whitelist", translate("忽略列表"))
+nt.mac_hints(function(mac, name) allowedmac :value(mac, "%s (%s)" %{ mac, name }) end)
+allowedmac.rmempty = true
+allowedmac.optional = true
+allowedmac:depends({macmechanism="allow"})
+
+blockedmac = s:taboption("tab_basic4", DynamicList, "serverchan_blacklist", translate("关注列表"))
+nt.mac_hints(function(mac, name) blockedmac:value(mac, "%s (%s)" %{ mac, name }) end)
+blockedmac.rmempty = true
+blockedmac.optional = true
+blockedmac:depends({macmechanism="block"})
+
+n = s:taboption("tab_basic4", ListValue, "serverchan_interface", translate("接口名称"))
+n:depends({macmechanism="interface"})
+for _, iface in ipairs(ifaces) do
+ if not (iface == "lo" or iface:match("^ifb.*")) then
+ local nets = net:get_interface(iface)
+ nets = nets and nets:get_networks() or {}
+ for k, v in pairs(nets) do
+ nets[k] = nets[k].sid
+ end
+ nets = table.concat(nets, ",")
+ n:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
+ end
+end
+
+
+local apply = luci.http.formvalue("cbi.apply")
+ if apply then
+ io.popen("/etc/init.d/serverchan start")
+end
+return m
\ No newline at end of file
diff --git a/package/cnsztl/luci-app-serverchan/luasrc/view/serverchan/serverchan_status.htm b/package/cnsztl/luci-app-serverchan/luasrc/view/serverchan/serverchan_status.htm
new file mode 100644
index 0000000000..b215c93a2b
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/luasrc/view/serverchan/serverchan_status.htm
@@ -0,0 +1,22 @@
+
+
+
\ No newline at end of file
diff --git a/package/cnsztl/luci-app-serverchan/root/etc/config/serverchan b/package/cnsztl/luci-app-serverchan/root/etc/config/serverchan
new file mode 100644
index 0000000000..b120684af6
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/root/etc/config/serverchan
@@ -0,0 +1,16 @@
+
+config serverchan 'serverchan'
+ option serverchan_ip '1'
+ option serverchan_up '1'
+ option serverchan_down '1'
+ option serverchan_sleeptime '60'
+ option sheep_enabled '1'
+ option temp_mask '1'
+ option cpuload_enable '1'
+ option temperature_enable '1'
+ option cpuload '2'
+ option temperature '70'
+ option send_enable '0'
+ option serverchan_enable '0'
+ option serverchan_sheep '0'
+
diff --git a/package/cnsztl/luci-app-serverchan/root/etc/init.d/serverchan b/package/cnsztl/luci-app-serverchan/root/etc/init.d/serverchan
new file mode 100644
index 0000000000..2aff7bfff3
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/root/etc/init.d/serverchan
@@ -0,0 +1,14 @@
+#!/bin/sh /etc/rc.common
+START=99
+STOP=10
+
+
+start() {
+flag=$(ps | grep "serverchan/serverchan" | grep -v "grep" | wc -l)
+if [ $flag -eq 0 ] ;then
+/usr/bin/serverchan/serverchan &
+fi
+}
+stop() {
+kill -9 `pgrep -f serverchan`
+}
diff --git a/package/cnsztl/luci-app-serverchan/root/usr/bin/serverchan/serverchan b/package/cnsztl/luci-app-serverchan/root/usr/bin/serverchan/serverchan
new file mode 100644
index 0000000000..482c68c639
--- /dev/null
+++ b/package/cnsztl/luci-app-serverchan/root/usr/bin/serverchan/serverchan
@@ -0,0 +1,851 @@
+#!/bin/sh
+
+# 读取设置文件
+function get_config(){
+serverchan_enable=`uci get serverchan.serverchan.serverchan_enable`>/dev/null 2>&1
+serverchan_sckey=`uci get serverchan.serverchan.sckey`>/dev/null 2>&1
+serverchan_ip=`uci get serverchan.serverchan.serverchan_ip`>/dev/null 2>&1
+serverchan_up=`uci get serverchan.serverchan.serverchan_up`>/dev/null 2>&1
+serverchan_down=`uci get serverchan.serverchan.serverchan_down`>/dev/null 2>&1
+serverchan_sheep=`uci get serverchan.serverchan.serverchan_sheep`>/dev/null 2>&1
+if [ -z "$serverchan_sheep" ] ; then serverchan_sheep="0";fi
+serverchan_whitelist=`uci get serverchan.serverchan.serverchan_whitelist` >/dev/null 2>&1
+serverchan_blacklist=`uci get serverchan.serverchan.serverchan_blacklist` >/dev/null 2>&1
+serverchan_interface=`uci get serverchan.serverchan.serverchan_interface` >/dev/null 2>&1
+device_aliases=`uci get serverchan.serverchan.device_aliases` >/dev/null 2>&1
+device_aliases=`echo $device_aliases | sed 's/ /\n/g' | sed 's/-/ /g'`
+starttime=`uci get serverchan.serverchan.starttime` >/dev/null 2>&1
+endtime=`uci get serverchan.serverchan.endtime` >/dev/null 2>&1
+#sleeptime=`uci get serverchan.serverchan.serverchan_sleeptime` >/dev/null 2>&1
+#if [ -z "$sleeptime" ] ; then sleeptime="60";fi
+sleeptime=60
+cpuload_enable=`uci get serverchan.serverchan.cpuload_enable` >/dev/null 2>&1
+cpuload=`uci get serverchan.serverchan.cpuload` >/dev/null 2>&1
+temperature_enable=`uci get serverchan.serverchan.temperature_enable` >/dev/null 2>&1
+temperature=`uci get serverchan.serverchan.temperature` >/dev/null 2>&1
+dir="/tmp/serverchan/"
+debuglevel=`uci get serverchan.serverchan.debuglevel` >/dev/null 2>&1
+#debuglevel="5"
+if [ -z "$debuglevel" ] ; then logfile="/dev/null";else logfile="/tmp/serverchan/server_chan.log";fi
+if [ -z "$serverchan_enable" ] ; then echo "`date "+%H:%M:%S"` 【!!!】无法读取程序开关 " >> ${logfile};fi
+#if [ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] ; then echo "`date "+%H:%M:%S"` 【!!!】程序未启用,即将关闭 " >> ${logfile};fi
+if [ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] ; then exit;fi
+if [ -z "$serverchan_sckey" ] ; then echo "`date "+%H:%M:%S"` 【!!!】无法读取 SCKEY" >> ${logfile};fi
+if [ -z "$serverchan_sckey" ] ; then exit;fi
+if [ -z "$serverchan_sckey" ] && [ "${#serverchan_sckey}" -lt "50" ] ; then echo "`date "+%H:%M:%S"` 【!!!】请填入正确的 SCKEY " >> ${logfile};fi
+if [ -z "$serverchan_ip" ] || [ "$serverchan_ip" -ne "0" ] && [ "$serverchan_ip" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【!!!】无法读取 ip 变化通知 开关" >> ${logfile};fi
+if [ -z "$serverchan_up" ] || [ "$serverchan_up" -ne "0" ] && [ "$serverchan_up" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【!!!】无法读取 设备上线提醒 开关" >> ${logfile};fi
+if [ -z "$serverchan_down" ] || [ "$serverchan_down" -ne "0" ] && [ "$serverchan_down" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【!!!】无法读取 设备下线提醒 开关" >> ${logfile};fi
+}
+#等待 5s,确保 luci 设置已保存
+sleep 5
+get_config
+
+# 检测程序开关
+function enable_detection(){
+ if [ "$1" ] ;then
+ for i in `seq 1 $1`
+ do
+ serverchan_enable=`uci get serverchan.serverchan.serverchan_enable`>/dev/null 2>&1
+ if [ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] ; then kill -9 `pgrep -f serverchan`;fi
+ sleep 1
+ done
+ else
+ serverchan_enable=`uci get serverchan.serverchan.serverchan_enable`>/dev/null 2>&1
+ if [ -z "$serverchan_enable" ] || [ "$serverchan_enable" -eq "0" ] ; then kill -9 `pgrep -f serverchan`;fi
+ fi
+}
+
+# 初始化
+function serverchan_init(){
+mkdir -p ${dir}
+network_enable="200"
+rm -f ${dir}title >/dev/null 2>&1
+rm -f ${dir}content >/dev/null 2>&1
+rm -f ${dir}serverchan.lock >/dev/null 2>&1
+Temperature_n=0
+cpuload_n=0
+send_enable=0
+echo "`date "+%H:%M:%S"` 【初始化】载入配置文件" >> ${logfile}
+if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【初始化】工作目录为 $dir " >> ${logfile};fi
+if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【初始化】log 目录为 $logfile " >> ${logfile};fi
+
+# 如果 “忽略列表 为空” 并且 “关注列表为空”
+if [ -z "$serverchan_whitelist" ] && [ -z "$serverchan_blacklist" ] && [ -z "$serverchan_interface" ]; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【初始化】未启用 MAC 过滤" >> ${logfile};fi
+
+# 如果 “忽略列表不为空”
+elif [ ! -z "$serverchan_whitelist" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【初始化】忽略列表内设备" >> ${logfile};fi
+
+# 如果 “关注列表不为空”
+elif [ ! -z "$serverchan_blacklist" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【初始化】仅关注列表内设备" >> ${logfile};fi
+
+# 如果 “仅关注接口选项打开”
+elif [ ! -z "$serverchan_interface" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【初始化】仅关注接口内设备" >> ${logfile};fi
+fi
+
+}
+serverchan_init
+
+#创建计划任务
+function serverchan_cron(){
+send_mode=`uci get serverchan.serverchan.send_mode`>/dev/null 2>&1
+if [ ! -z "$send_mode" ] ; then
+ if [ "$send_mode" -eq "1" ] ; then
+ regular_time=`uci get serverchan.serverchan.regular_time`>/dev/null 2>&1
+ if ( echo `crontab -l` | grep "serverchan" | grep -q " $regular_time " ); then
+ echo "" >/dev/null
+ elif ( echo `crontab -l` | grep -q "serverchan" ); then
+ crontab -l > conf && sed -i "/serverchan/d" conf && crontab conf && rm -f conf
+ crontab -l > conf && echo -e "0 $regular_time * * * /usr/bin/serverchan/serverchan send &" >> conf && crontab conf && rm -f conf
+ /etc/init.d/cron stop
+ /etc/init.d/cron start
+ else
+ crontab -l > conf && echo -e "0 $regular_time * * * /usr/bin/serverchan/serverchan send &" >> conf && crontab conf && rm -f conf
+ /etc/init.d/cron stop
+ /etc/init.d/cron start
+ fi
+ elif [ "$send_mode" -eq "2" ] ; then
+ interval_time=`uci get serverchan.serverchan.interval_time`>/dev/null 2>&1
+ if ( echo `crontab -l` | grep "serverchan" | grep -q "*/$interval_time " ); then
+ echo "" >/dev/null
+ elif ( echo `crontab -l` | grep -q "serverchan" ); then
+ crontab -l > conf && sed -i "/serverchan/d" conf && crontab conf && rm -f conf
+ crontab -l > conf && echo -e "0 */$interval_time * * * /usr/bin/serverchan/serverchan send &" >> conf && crontab conf && rm -f conf
+ /etc/init.d/cron stop
+ /etc/init.d/cron start
+ else
+ crontab -l > conf && echo -e "0 $regular_time * * * /usr/bin/serverchan/serverchan send &" >> conf && crontab conf && rm -f conf
+ /etc/init.d/cron stop
+ /etc/init.d/cron start
+ fi
+ fi
+elif [ -z "$send_mode" ] ; then
+ if ( echo `crontab -l` | grep -q "serverchan" ); then
+ crontab -l > conf && sed -i "/serverchan/d" conf && crontab conf && rm -f conf
+ /etc/init.d/cron stop
+ /etc/init.d/cron start
+ fi
+fi
+}
+serverchan_cron
+
+#免打扰检测
+function serverchan_disturb(){
+if [ ! -z "$serverchan_sheep" ] && [ "$serverchan_sheep" -eq "1" ] && [ ! -z "$starttime" ] && [ ! -z "$endtime" ] ;then
+ if [ `date +%H` -ge $endtime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a `date +%H` -ge $endtime -a $starttime -gt $endtime ] ; then enable=1;else enable=0;fi
+
+ if [ "$enable" -eq "0" ] ;then
+ sheep_str=0
+ while [ $enable -eq "0" ] ;
+ do
+ if [ "$sheep_str" -eq "0" ] ; then
+ echo "`date "+%H:%M:%S"` 【免打扰】夜深了,该休息了" >> ${logfile}
+ sheep_str=1
+ fi
+ get_config
+ if [ `date +%H` -ge $endtime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a `date +%H` -ge $endtime -a $starttime -gt $endtime ] ; then
+ enable=1
+ else
+ enable=0
+ enable_detection 1
+ fi
+ continue
+ done
+ unset title
+ unset content
+ rm -f ${dir}title >/dev/null 2>&1
+ rm -f ${dir}content >/dev/null 2>&1
+ fi
+fi
+}
+serverchan_disturb
+
+#清理日志
+function clean_log(){
+logrow=$(grep -c "" ${logfile})
+if [ $logrow -gt 500 ] ;then
+ #cat /dev/null > ${logfile}
+ sed -i '1,100d' ${logfile}
+ echo "`date "+%H:%M:%S"` 【清理】日志超出上限,删除前 100 条" >> ${logfile}
+fi
+}
+if [ -f ${logfile} ] ; then clean_log;fi
+
+#文件锁
+function LockFile()
+{
+if [ ! -f "${dir}serverchan.lock" ] ; then
+ > ${dir}serverchan.lock
+else
+ while [ -f "${dir}serverchan.lock" ] ;
+ do
+ #sleep 1
+ continue
+ done
+ LockFile
+fi
+}
+
+#检测设备上线
+function up(){
+if [ ! -f "${dir}ipAddress" ] ; then > ${dir}ipAddress;fi
+if [ "$1" ] ;then
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ local temp_send_enable="$send_enable"
+ grep -w -q $1 ${dir}ipAddress
+ if [ $? -ne 0 ] ; then
+ # 如果 ipAddress 文件中存在此ip,则跳过,待断线检测
+ ip_mac=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $1 | awk '{print $4}' | grep -v "^$" | sort -u );fi
+
+ if [ ! -z "$device_aliases" ] && [ ! -z "$ip_mac" ] && ( echo "$device_aliases" | grep -q -i $ip_mac ); then
+ ip_name=$( echo "$device_aliases" | grep -i $ip_mac |awk '{print $2}' | grep -v "^$" | sort -u )
+ else
+ ip_name=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u )
+ fi
+
+ if [ -z "$ip_mac" ] ; then ip_mac="未知设备";fi
+ if [ -z "$ip_name" ] ; then ip_name="未知设备";fi
+
+ local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 10 -f -w 3 $1)`
+
+ if ( ! echo ${ip_ms} | grep -q ms );then
+ local ip_ms=`ping -c 1 -w 2 $1`
+
+ if ( ! echo ${ip_ms} | grep -q ms );then
+ sleep 2
+ local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 10 -f -w 5 $1)`
+ fi
+ fi
+
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ if [ "$temp_send_enable" -ne "$send_enable" ] ; then return;fi
+
+ if ( echo ${ip_ms} | grep -q ms ); then
+ # 如果连接成功
+ LockFile
+ if ( echo "$ip_mac" | grep -q "未知设备" ) || ( echo "$ip_name" | grep -q "未知设备" ) ; then
+ for i in `seq 1 5`
+ do
+ echo "`date "+%H:%M:%S"` 获取 $1 $ip_mac 设备信息失败,重试中" >> ${logfile}
+ sleep 1
+ ip_mac=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $1 | awk '{print $4}' | grep -v "^$" | sort -u );fi
+ if [ ! -z "$device_aliases" ] && [ ! -z "$ip_mac" ] && ( echo "$device_aliases" | grep -q -i $ip_mac ); then
+ ip_name=$( echo "$device_aliases" | grep -i $ip_mac |awk '{print $2}' | grep -v "^$" | sort -u )
+ else
+ ip_name=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u )
+ fi
+ if [ ! -z "$ip_mac" ] && [ ! -z "$ip_name" ] ; then break;fi
+ done
+ fi
+ if [ -z "$ip_mac" ] ; then
+ ip_mac="未知设备"
+ echo "`date "+%H:%M:%S"` 获取 $1 mac 超时,暂停跳过" >> ${logfile}
+ fi
+ if [ -z "$ip_name" ] ; then
+ ip_name="未知设备"
+ echo "`date "+%H:%M:%S"` 获取 $1 设备名超时,暂停跳过" >> ${logfile}
+ fi
+
+ if [ ! -z "$send_enable" ] && [ "$send_enable" -ne 3 ] ; then
+ # 如果定时任务没有运行
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if [ -z "$title" ] ; then
+ title="有人连接了你的路由器"
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A####新设备连接%0D%0A%0D%0A"">$ip_name"
+ elif ( echo ${title} | grep -q "有人连接了你的路由器" ) ; then
+ title="有人连接了你的路由器"
+ content="%0D%0A%0D%0A"">$ip_name"
+ else
+ title="设备状态变化"
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A####新设备连接%0D%0A%0D%0A"">$ip_name"
+ fi
+ #echo "$1 $( cat /var/dhcp.leases | grep -w $1 |awk '{print $2" "$4}' )" >> ${dir}ipAddress
+ echo "$1 $ip_mac $ip_name" >> ${dir}ipAddress
+ echo "`date "+%H:%M:%S"` 【微信推送】新设备 $ip_name $1 连接了">> ${logfile}
+
+ if [ ! -z "$serverchan_blacklist" ] ; then
+ if ( echo $serverchan_blacklist | grep -q -i $ip_mac ); then
+ title="你偷偷关注的设备上线了"
+ fi
+ fi
+
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ else
+ # 如果定时任务运行
+ echo "`date "+%H:%M:%S"` 新设备 $ip_name $1 连接了" >> ${logfile}
+ echo "$1 $ip_mac $ip_name" >> ${dir}ipAddress
+ unset title
+ unset content
+ fi
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 设备 $ip_name $1 连接失败" >> ${logfile};fi
+ fi
+ rm -f ${dir}serverchan.lock >/dev/null 2>&1
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -eq "5" ] ; then echo "`date "+%H:%M:%S"` $ip_name $1 已存在,跳过" >> ${logfile};fi
+ fi
+
+ unset ip_ms
+fi
+}
+
+#检测设备下线
+function down(){
+if [ ! -f "${dir}ipAddress" ] ; then return;fi
+if [ "$1" ] ;then
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ local temp_send_enable="$send_enable"
+ ip_mac=$( cat ${dir}ipAddress | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $1 | awk '{print $4}' | grep -v "^$" | sort -u );fi
+ ip_name=$( cat ${dir}ipAddress | grep -w $1 |awk '{print $3}' | grep -v "^$" | sort -u )
+ if ( echo "$ip_mac" | grep -q "未知设备" ) || ( echo "$ip_name" | grep -q "未知设备" ) ; then
+ echo "`date "+%H:%M:%S"` $1 $ip_mac 无设备名,尝试重新读取" >> ${logfile}
+ sed -i "/$1/d" ${dir}ipAddress
+ ip_mac=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $1 | awk '{print $4}' | grep -v "^$" | sort -u );fi
+ if [ ! -z "$device_aliases" ] && [ ! -z "$ip_mac" ] && ( echo "$device_aliases" | grep -q -i $ip_mac ); then
+ ip_name=$( echo "$device_aliases" | grep -i $ip_mac |awk '{print $2}' | grep -v "^$" | sort -u )
+ else
+ ip_name=$( cat /var/dhcp.leases | grep -w $1 |awk '{print $4}' | grep -v "^$" | sort -u )
+ fi
+ if [ -z "$ip_mac" ] ; then ip_mac="未知设备";fi
+ if [ -z "$ip_name" ] ; then ip_name="未知设备";fi
+ echo "$1 $ip_mac $ip_name" >> ${dir}ipAddress
+ fi
+
+ local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 10 -f -w 3 $1)`
+ if ( ! echo ${ip_ms} | grep -q ms );then
+ local ip_ms=`ping -c 1 -w 2 $1`
+
+ if ( ! echo ${ip_ms} | grep -q ms );then
+ sleep 3
+ local ip_ms=`echo $( arping -I $( cat /proc/net/arp | grep -w $1 | awk '{print $6}' | grep -v "^$" | sort -u ) -c 10 -f -w 10 $1)`
+ fi
+ fi
+
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ if [ "$temp_send_enable" -ne "$send_enable" ] ; then return;fi
+
+ if ( echo ${ip_ms} | grep -q ms ); then
+ # 如果连接成功
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 设备 $ip_name $1 依然坚挺" >> ${logfile};fi
+ else
+ # 如果连接失败
+ LockFile
+ if [ ! -z "$send_enable" ] && [ "$send_enable" -ne 3 ] && [ ! -z "$ip_ms" ] ; then
+ # 如果定时任务没有运行
+ if [ ! -z "$serverchan_down" ] && [ "$serverchan_down" -eq "1" ] ; then
+ # 如果打开了下线提醒
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+
+ if [ -z "$title" ] ; then
+ title="设备离线通知"
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A####设备断开连接%0D%0A%0D%0A"">$ip_name"
+ elif ( echo ${title} | grep -q "设备离线通知" ) ; then
+ title="设备离线通知"
+ content="%0D%0A%0D%0A"">$ip_name"
+ else
+ title="设备状态变化"
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A####设备断开连接%0D%0A%0D%0A"">$ip_name"
+ fi
+
+ echo "`date "+%H:%M:%S"` 【微信推送】设备 $ip_name $1 断开连接 " >> ${logfile}
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ fi
+ echo "`date "+%H:%M:%S"` 设备 $ip_name $1 断开连接 " >> ${logfile}
+ sed -i "/$1/d" ${dir}ipAddress
+ unset title
+ unset content
+ fi
+ rm -f ${dir}serverchan.lock >/dev/null 2>&1
+ fi
+ unset ip_ms
+fi
+}
+
+#发送定时数据
+function send(){
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 创建定时任务" >> ${logfile};fi
+ uci set serverchan.serverchan.send_enable=3
+ uci commit serverchan
+ unset title
+ unset content
+ send_content=""
+ serverchan_cron
+ send_title=`uci get serverchan.serverchan.send_title` >/dev/null 2>&1
+ if [ -z "$send_title" ] ; then send_title="OpenWrt By tty228 路由状态:";fi
+ router_status=`uci get serverchan.serverchan.router_status` >/dev/null 2>&1
+ if [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ] ; then send_content=${send_content}"%0D%0A%0D%0A---%0D%0A%0D%0A#### 系统运行状态%0D%0A%0D%0A";fi
+ #if [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ] ; then send_content=${send_content}"%0D%0A%0D%0A"" CPU占用:`top -n 1 |grep -i Cpu:| awk '{print $3":"$2" "$5":"$4}'`";fi
+ if [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ] ; then send_content=${send_content}"%0D%0A%0D%0A"" 平均负载:`cat /proc/loadavg | awk '{print $1" "$2" "$3}'`";fi
+ if [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ] ; then send_content=${send_content}"%0D%0A%0D%0A"" 内存占用:`free -m | sed -n '2p' | awk '{print""($3/$2)*100"%"}'`";fi
+ if [ ! -z "$router_status" ] && [ "$router_status" -eq "1" ] ; then send_content=${send_content}"%0D%0A%0D%0A""`cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(" 运行时间:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'`";fi
+ router_temp=`uci get serverchan.serverchan.router_temp` >/dev/null 2>&1
+ if [ ! -z "$router_temp" ] && [ "$router_temp" -eq "1" ] ; then send_content=${send_content}"%0D%0A%0D%0A""---%0D%0A%0D%0A#### 设备温度%0D%0A%0D%0A CPU:`cut -c1-2 /sys/class/thermal/thermal_zone0/temp`%e2%84%83";fi
+ router_wan=`uci get serverchan.serverchan.router_wan` >/dev/null 2>&1
+ 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}')
+ send_hostIP=$(curl -k -s "http://members.3322.org/dyndns/getip")
+ if [ ! -z "$router_wan" ] && [ "$router_wan" -eq "1" ] ; then
+ send_content=${send_content}"%0D%0A%0D%0A""---%0D%0A%0D%0A#### WAN 口信息%0D%0A%0D%0A WAN ip:$send_wanIP"
+ send_content=${send_content}"%0D%0A%0D%0A"" 外网 ip:$send_hostIP"
+ if [ ! -z "$send_content" ] && [ ! -z "$router_wan" ] ; then
+ if ( ! echo ${send_wanIP} | grep -q ${send_hostIP} );then send_content=${send_content}"%0D%0A%0D%0A"" 外网 ip 与接口 ip 不一致,你的 ip 不是公网 ip";fi
+ else
+ send_content=${send_content}"%0D%0A%0D%0A"" ip 获取失败"
+ fi
+ send_content=${send_content}"%0D%0A%0D%0A""`ubus call network.interface.wan status | grep \"uptime\" | sed $'s/\"uptime": //g'| sed $'s/\,//g'| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(" 在线时间:%d天%d时%d分%d秒",run_days,run_hour,run_minute,run_second)}'`"
+ fi
+ client_list=`uci get serverchan.serverchan.client_list` >/dev/null 2>&1
+ if [ ! -z "$client_list" ] && [ "$client_list" -eq "1" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 检测客户端列表" >> ${logfile};fi
+
+ if [ ! -f "${dir}ipAddress" ] ; then > ${dir}ipAddress;fi
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【连接】开始进行设备下线检测" >> ${logfile};fi
+ IPLIST=$( cat ${dir}ipAddress| awk '{print $1}' | grep -v "^$" | sort -u )
+ for ip in $IPLIST; do
+ if [ ! -z "$ip" ] ; then
+ down $ip &
+ fi
+ done
+ wait
+
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【连接】开始进行设备接入检测" >> ${logfile};fi
+ IPLISTrow=$(grep -c "" ${dir}ipAddress)
+ IPLIST=$( cat /proc/net/arp | grep "0x2" | awk '{print $1}' | grep -v "^$" | sort -u )
+ for ip in $IPLIST; do
+ if [ ! -z "$ip" ] ; then
+ up $ip &
+ fi
+ done
+ wait
+
+ if [ "$IPLISTrow" -eq $(grep -c "" ${dir}ipAddress) ] ; then echo "`date "+%H:%M:%S"` 没有新设备连接" >> ${logfile};fi
+ send_content=${send_content}"%0D%0A%0D%0A---%0D%0A%0D%0A#### 在线设备%0D%0A%0D%0A";
+
+ IPLIST=$( cat ${dir}ipAddress| awk '{print $1" "$3}' )
+ n=0
+ for ip in $IPLIST; do
+ n=$(($n+1))
+ if [ "${#ip}" -gt "20" ] ; then ip=`echo ${ip:0:20}"*"`;fi
+ [ $((n%2)) -eq 1 ] && send_content=${send_content}"%0D%0A%0D%0A"" $ip "
+ [ $((n%2)) -eq 0 ] && send_content=${send_content}"$ip"
+ done
+ fi
+ send_title=$( echo $send_title | sed $'s/\ /%20/g'| sed $'s/\"/%22/g'| sed $'s/\#/%23/g'| sed $'s/\&/%26/g'| sed $'s/\,/%2C/g'| sed $'s/\//%2F/g'| sed $'s/\:/%3A/g'| sed $'s/\;/%3B/g'| sed $'s/\=/%3D/g'| sed $'s/\@/%40/g')
+ #send_content=$( echo $send_content | sed $'s/\ /%20/g'| sed $'s/\"/%22/g'| sed $'s/\#/%23/g'| sed $'s/\&/%26/g'| sed $'s/\,/%2C/g'| sed $'s/\//%2F/g'| sed $'s/\:/%3A/g'| sed $'s/\;/%3B/g'| sed $'s/\=/%3D/g'| sed $'s/\@/%40/g')
+ #未转义 | sed $'s/\(/%28/g' | sed $'s/\)/%29/g' | sed $'s/\+/%2B/g' | sed $'s/\%/%25/g' | sed $'s/\%3C/g' | sed $'s/\>/%3E/g' | sed $'s/\?/%3F/g' | sed $'s/\\/%5C/g' | sed $'s/\|/%7C/g'
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 进行 URL 编码,标题=$send_title" >> ${logfile};fi
+ if [ -z "$send_content" ] ; then
+ send_content="%0D%0A%0D%0A---%0D%0A%0D%0A#### 我遇到了一个难题%0D%0A%0D%0A>你没有选择需要发送的项目,该怎么办呢%0D%0A%0D%0A---";
+ echo "`date "+%H:%M:%S"` 【!!!】定时发送选项错误,请检查你的设置" >> ${logfile}
+ fi
+ nowtime=`date "+%Y-%m-%d %H:%M:%S"`
+ curl -s "http://sc.ftqq.com/$serverchan_sckey.send?text=${send_title}" -d "&desp=${nowtime}%0D%0A%0D%0A${send_content}" >/dev/null
+
+ uci set serverchan.serverchan.send_enable=0
+ uci commit serverchan
+ echo "`date "+%H:%M:%S"` 【微信推送】定时发送状态消息" >> ${logfile}
+ exit
+}
+
+if [ "$1" ] ;then
+ if [ $1="send" ] ;then send;fi
+ exit
+fi
+
+#初始化在线设备列表
+function serverchan_first(){
+if [ ! -z "$serverchan_enable" ] && [ "$serverchan_enable" -eq "1" ] ; then
+ echo "`date "+%H:%M:%S"` 【初始化】初始化在线设备列表" >> ${logfile}
+ uci set serverchan.serverchan.send_enable=3
+ uci commit serverchan
+ IPLIST=$( cat /proc/net/arp | grep "0x2" | awk '{print $1}' | grep -v "^$" | sort -u )
+ > ${dir}ipAddress
+ for ip in $IPLIST; do
+ #忽略列表不检测
+ #只检测关注列表
+
+ # 如果 “ip 列表不为空”
+ if [ ! -z "$ip" ] ; then
+
+ ip_mac=$( cat /var/dhcp.leases | grep -w $ip |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $ip | awk '{print $4}' | grep -v "^$" | sort -u );fi
+
+ if [ ! -z "$device_aliases" ] && [ ! -z "$ip_mac" ] && ( echo "$device_aliases" | grep -q -i $ip_mac ); then
+ ip_name=$( echo "$device_aliases" | grep -i $ip_mac |awk '{print $2}' | grep -v "^$" | sort -u )
+ else
+ ip_name=$( cat /var/dhcp.leases | grep -w $ip |awk '{print $4}' | grep -v "^$" | sort -u )
+ fi
+
+ if [ -z "$ip_name" ] ; then
+ temp_ms=`ping -c 1 -w 2 $ip` &
+ fi
+ if [ -z "$ip_mac" ] ; then ip_mac="未知设备";fi
+ if [ -z "$ip_name" ] ; then ip_name="未知设备";fi
+
+ # 如果 “忽略列表 为空” 并且 “关注列表为空”
+ if [ -z "$serverchan_whitelist" ] && [ -z "$serverchan_blacklist" ] && [ -z "$serverchan_interface" ]; then
+ up $ip &
+
+ # 如果 “忽略列表不为空”
+ elif [ ! -z "$serverchan_whitelist" ] ; then
+ if ( ! echo $serverchan_whitelist | grep -q -i $ip_mac ); then
+ up $ip &
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && ( ! echo ${ip_mac} | grep -q "未知设备" ) ; then echo "`date "+%H:%M:%S"` 忽略列表已启用,跳过$ip_name $ip" >> ${logfile};fi
+ fi
+
+ # 如果 “关注列表不为空”
+ elif [ ! -z "$serverchan_blacklist" ] ; then
+ if ( echo $serverchan_blacklist | grep -q -i $ip_mac ); then
+ up $ip &
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && ( ! echo ${ip_mac} | grep -q "未知设备" ) ; then echo "`date "+%H:%M:%S"` 关注列表已启用,跳过$ip_name $ip" >> ${logfile};fi
+ fi
+ # 如果 “仅关注接口选项打开”
+ elif [ ! -z "$serverchan_interface" ] ; then
+ if ( echo $serverchan_interface | grep -q -i $( cat /proc/net/arp | grep $ip |awk '{print $6}' | grep -v "^$" | sort -u )); then
+ up $ip &
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && ( ! echo ${ip_mac} | grep -q "未知设备" ) ; then echo "`date "+%H:%M:%S"` 仅关注接口已启用,跳过$ip_name $ip" >> ${logfile};fi
+ fi
+ fi
+ fi
+ done
+ wait
+ uci set serverchan.serverchan.send_enable=0
+ uci commit serverchan
+fi
+}
+serverchan_first
+
+while [ "$serverchan_enable" -eq "1" ] ;
+do
+if [ -f ${logfile} ] ; then clean_log;fi
+get_config
+
+function rand_geturl(){
+ urllist="https://www.163.com https://www.qq.com https://www.baidu.com https://www.qidian.com https://www.douban.com"
+ url_str=$( echo "$urllist" | awk -v i="`awk 'BEGIN{srand();sum=rand()*5+ 1;printf("%d",sum)}'`" '{print $i}' )
+ 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`
+}
+ rand_geturl
+ if [ -z "$check" ] || [ "$check" -ne "200" ] ; then sleep 1 && rand_geturl;fi
+ if [ ! -z "$check" ] && [ "$check" -eq "200" ] ; then
+ if [ ! -z "$network_enable" ] && [ "$network_enable" -eq "404" ] ; then echo "`date "+%H:%M:%S"` 【网络状态】网络恢复正常.." >> ${logfile};fi
+ network_enable="200"
+
+ #外网IP变化
+ if [ ! -z "$serverchan_ip" ] && [ "$serverchan_ip" -eq "1" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【外网IP】正在检测外网IP变化" >> ${logfile};fi
+ nowtime=`date "+%Y-%m-%d %H:%M:%S"`
+ #查询当前ip
+ #hostIP=$(curl -k -s "http://members.3322.org/dyndns/getip")
+ 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}')
+ #查询ip历史记录
+ if [ -f ${dir}ip ] ; then lastIP=$( cat "${dir}ip");else unset lastIP;fi
+ if [ ! -z "$lastIP" ] ; then
+ #if [ "$wanIP"!="$lastIP" ] && [ ! -z "$wanIP" ] ; then
+ if [ ! -z "$wanIP" ] && ( echo ${wanIP} | grep -w -q ${lastIP} );then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` IP 无变化,当前 ip 为 $lastIP" >> ${logfile};fi
+ else
+ echo "`date "+%H:%M:%S"` 当前 IP: ${wanIP}" >> ${logfile}
+ echo "`date "+%H:%M:%S"` 上次 IP: ${lastIP}" >> ${logfile}
+ echo "`date "+%H:%M:%S"` 【微信推送】当前IP:${wanIP}" >> ${logfile}
+ echo -n $wanIP > ${dir}ip
+
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if ( echo ${title} | grep -q "外网IP地址变化" ) || [ -z "$title" ] ; then
+ title="外网IP地址变化"
+ else
+ title="设备状态变化"
+ fi
+
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A""####外网IP地址变化%0D%0A%0D%0A>当前IP:${wanIP}"
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ fi
+
+ else
+ echo "`date "+%H:%M:%S"` 【微信推送】路由器已经重启!当前IP:${wanIP}" >> ${logfile}
+ echo "`date "+%H:%M:%S"` 当前IP: ${wanIP}" >> ${logfile}
+ echo -n $wanIP > ${dir}ip
+
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if ( echo ${title} | grep -q "路由器重新启动" ) || [ -z "$title" ] ; then
+ title="路由器重新启动"
+ else
+ title="设备状态变化"
+ fi
+
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A""####路由器重新启动%0D%0A%0D%0A>当前IP:${wanIP}"
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ fi
+ if [ -f ${logfile} ] ; then clean_log;fi
+ fi
+
+ #设备下线提醒
+ if [ ! -z "$serverchan_down" ] && [ "$serverchan_down" -eq "1" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【离线】开始进行设备下线检测" >> ${logfile};fi
+ fi
+ get_config
+ IPLIST=$( cat ${dir}ipAddress | awk '{print $1}' | grep -v "^$" | sort -u )
+ #从 ipAddress 文件中读取上次检测到的在线列表
+ for ip in $IPLIST; do
+ # 如果 ip 列表不为空
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ if [ ! -z "$ip" ] && [ "$send_enable" -ne 3 ] ; then
+ ip_mac=$( cat /var/dhcp.leases | grep -w $ip |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $ip | awk '{print $4}' | grep -v "^$" | sort -u );fi
+
+ if [ ! -z "$device_aliases" ] && [ ! -z "$ip_mac" ] && ( echo "$device_aliases" | grep -q -i $ip_mac ); then
+ ip_name=$( echo "$device_aliases" | grep -i $ip_mac |awk '{print $2}' | grep -v "^$" | sort -u )
+ ipAddress_name=$( cat ${dir}ipAddress | grep -w $ip | awk '{print $3}' | grep -v "^$" | sort -u )
+ if [ ! -z ipAddress_name ] && ( ! echo $ip_name | grep -q $ipAddress_name ) ; then
+ sed -i "/$ip/d" ${dir}ipAddress
+ echo "$ip $ip_mac $ip_name" >> ${dir}ipAddress
+ fi
+ else
+ ip_name=$( cat /var/dhcp.leases | grep -w $ip |awk '{print $4}' | grep -v "^$" | sort -u )
+ fi
+
+ if [ -z "$ip_mac" ] ; then ip_mac="未知设备";fi
+ if [ -z "$ip_name" ] ; then ip_name="未知设备";fi
+
+ # 如果 “忽略列表 为空” 并且 “关注列表为空”
+ if [ -z "$serverchan_whitelist" ] && [ -z "$serverchan_blacklist" ] && [ -z "$serverchan_interface" ]; then
+ down $ip &
+
+ # 如果 “忽略列表不为空”
+ elif [ ! -z "$serverchan_whitelist" ] ; then
+ if ( ! echo $serverchan_whitelist | grep -q -i $ip_mac ); then
+ down $ip &
+ else
+ sed -i "/$ip/d" ${dir}ipAddress
+ fi
+
+ # 如果 “关注列表不为空”
+ elif [ ! -z "$serverchan_blacklist" ] ; then
+ if ( echo $serverchan_blacklist | grep -q -i $ip_mac ); then
+ down $ip &
+ else
+ sed -i "/$ip/d" ${dir}ipAddress
+ fi
+ # 如果 “仅关注接口选项打开”
+ elif [ ! -z "$serverchan_interface" ] ; then
+ if ( echo $serverchan_interface | grep -q -i $( cat /proc/net/arp | grep $ip |awk '{print $6}' | grep -v "^$" | sort -u )); then
+ down $ip &
+ else
+ sed -i "/$ip/d" ${dir}ipAddress
+ fi
+ fi
+ fi
+ done
+ wait
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if [ -z "$content" ] || ( ! echo ${content} | grep -q "设备断开连接" ) ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 没有检测到设备离线" >> ${logfile};fi
+ fi
+ #fi
+
+ #新设备接入
+ if [ ! -z "$serverchan_up" ] && [ "$serverchan_up" -eq "1" ] ; then
+ get_config
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【连接】开始进行设备接入检测" >> ${logfile};fi
+ #从 arp 缓存中读取 0x2 在线列表
+ IPLIST=$( cat /proc/net/arp | grep "0x2" | awk '{print $1}' | grep -v "^$" | sort -u )
+ for ip in $IPLIST; do
+ # 如果 “ip 列表不为空”
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ if [ ! -z "$ip" ] && [ "$send_enable" -ne 3 ] ; then
+
+ ip_mac=$( cat /var/dhcp.leases | grep -w $ip |awk '{print $2}' | grep -v "^$" | sort -u )
+ if [ -z "$ip_mac" ] ; then ip_mac=$( cat /proc/net/arp | grep "0x2" | grep -w $ip | awk '{print $4}' | grep -v "^$" | sort -u );fi
+
+ if [ ! -z "$device_aliases" ] && [ ! -z "$ip_mac" ] && ( echo "$device_aliases" | grep -q -i $ip_mac ); then
+ ip_name=$( echo "$device_aliases" | grep -i $ip_mac |awk '{print $2}' | grep -v "^$" | sort -u )
+ else
+ ip_name=$( cat /var/dhcp.leases | grep -w $ip |awk '{print $4}' | grep -v "^$" | sort -u )
+ fi
+
+ if [ -z "$ip_name" ] ; then
+ temp_ms=`ping -c 1 -w 2 $ip` &
+ fi
+ if [ -z "$ip_mac" ] ; then ip_mac="未知设备";fi
+ if [ -z "$ip_name" ] ; then ip_name="未知设备";fi
+
+ # 如果 “忽略列表为空” 并且 “关注列表为空”
+ if [ -z "$serverchan_whitelist" ] && [ -z "$serverchan_blacklist" ] && [ -z "$serverchan_interface" ]; then
+ up $ip &
+
+ # 如果 “忽略列表不为空”
+ elif [ ! -z "$serverchan_whitelist" ] ; then
+ if ( ! echo $serverchan_whitelist | grep -q -i $ip_mac ); then
+ up $ip &
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && ( ! echo ${ip_mac} | grep -q "未知设备" ) ; then echo "`date "+%H:%M:%S"` 忽略列表已启用,跳过$ip_name $ip" >> ${logfile};fi
+ fi
+
+ # 如果 “关注列表不为空”
+ elif [ ! -z "$serverchan_blacklist" ] ; then
+ if ( echo $serverchan_blacklist | grep -q -i $ip_mac ); then
+ up $ip &
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && ( ! echo ${ip_mac} | grep -q "未知设备" ) ; then echo "`date "+%H:%M:%S"` 关注列表已启用,跳过$ip_name $ip" >> ${logfile};fi
+ fi
+
+ # 如果 “仅关注接口选项打开”
+ elif [ ! -z "$serverchan_interface" ] ; then
+ if ( echo $serverchan_interface | grep -q -i $( cat /proc/net/arp | grep $ip |awk '{print $6}' | grep -v "^$" | sort -u )); then
+ up $ip &
+ else
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && ( ! echo ${ip_mac} | grep -q "未知设备" ) ; then echo "`date "+%H:%M:%S"` 仅关注接口已启用,跳过$ip_name $ip" >> ${logfile};fi
+ fi
+ fi
+
+ fi
+ done
+ wait
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if [ -z "$content" ] || ( ! echo ${content} | grep -q "新设备连接" ) ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 没有新设备连接" >> ${logfile};fi
+ fi
+ fi
+
+ #负载状态报警
+ if [ ! -z "$cpuload_enable" ] && [ "$cpuload_enable" -eq "1" ] ; then
+
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【负载】正在检测 CPU 负载" >> ${logfile};fi
+ cpu_fuzai=`cat /proc/loadavg | awk '{print $1}'`
+ cpuload=`uci get serverchan.serverchan.cpuload`>/dev/null 2>&1
+
+ if [ ! -z "$cpuload" ] && [ `expr $cpu_fuzai \> $cpuload` -eq "1" ] ; then
+ cpuload_n=$(($cpuload_n+1))
+ echo "`date "+%H:%M:%S"` 【!!警报!!】当前 CPU 负载过高: ${cpu_fuzai}" >> ${logfile}
+ elif [ "$cpuload_n" -ge "5" ] ;then
+ cpuload_n=$(($cpuload_n+1))
+ else
+ cpuload_n=0
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` CPU 负载正常:$cpu_fuzai" >> ${logfile};fi
+ fi
+
+ if [ "$cpuload_n" -eq "5" ] ;then
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if ( echo ${title} | grep -q "设备报警" ) || [ -z "$title" ] ; then
+ title="CPU 负载过高!"
+ else
+ title="设备报警!"
+ fi
+ echo "`date "+%H:%M:%S"` 【微信推送】当前 CPU 负载过高: ${cpu_fuzai}" >> ${logfile}
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A""####CPU 负载过高%0D%0A%0D%0A>CPU 负载已连续五分钟超过预设%0D%0A%0D%0A>接下来一小时不再提示%0D%0A%0D%0A>当前负载:${cpu_fuzai}"
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ elif [ "$cpuload_n" -ge "60" ] ;then
+ cpuload_n=0
+ fi
+ fi
+
+ #温度状态报警
+ if [ ! -z "$temperature_enable" ] && [ "$temperature_enable" -eq "1" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【温度】正在检测 CPU 温度" >> ${logfile};fi
+ cpu_wendu=`cut -c1-2 /sys/class/thermal/thermal_zone0/temp`
+ temperature=`uci get serverchan.serverchan.temperature`>/dev/null 2>&1
+ if [ ! -z "$temperature" ] && [ "$cpu_wendu" -gt "$temperature" ] ; then
+ Temperature_n=$(($Temperature_n+1))
+ echo "`date "+%H:%M:%S"` 【!!警报!!】当前 CPU 温度过高: ${cpu_wendu}" >> ${logfile}
+ elif [ "$Temperature_n" -ge "5" ] ;then
+ Temperature_n=$(($Temperature_n+1))
+ else
+ Temperature_n=0
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` CPU 温度正常:$cpu_wendu" >> ${logfile};fi
+ fi
+ if [ "$Temperature_n" -eq "5" ] ;then
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if ( echo ${title} | grep -q "设备报警" ) || [ -z "$title" ] ; then
+ title="CPU 温度过高!"
+ else
+ title="设备报警!"
+ fi
+ echo "`date "+%H:%M:%S"` 【微信推送】当前 CPU 温度过高: ${cpu_wendu}" >> ${logfile}
+ content="%0D%0A%0D%0A---%0D%0A%0D%0A""####CPU 温度过高%0D%0A%0D%0A>CPU 温度已连续五分钟超过预设%0D%0A%0D%0A>接下来一小时不再提示%0D%0A%0D%0A>当前温度:${cpu_wendu}"
+ echo $title >${dir}title
+ echo -n $content >>${dir}content
+ elif [ "$Temperature_n" -ge "60" ] ;then
+ Temperature_n=0
+ fi
+ fi
+
+ else
+ if [ ! -z "$network_enable" ] && [ "$network_enable" -eq "200" ] ; then
+ echo "`date "+%H:%M:%S"` 【!!!!】当前网络不通!停止检测! " >> ${logfile}
+ network_enable="404"
+ fi
+ enable_detection 60
+ continue
+ fi
+
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ if [ ! -z "$send_enable" ] && [ "$send_enable" -eq "3" ] ;then
+ send_str=0
+ while [ $send_enable -eq "3" ] ;
+ do
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] && [ "$send_str" -eq "0" ] ; then
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "-----------------------------------------------------" >> ${logfile};fi
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 发送定时数据,程序暂停中" >> ${logfile};fi
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo ""-----------------------------------------------------"" >> ${logfile};fi
+ send_str=1
+ fi
+ enable_detection 60
+ send_enable=`uci get serverchan.serverchan.send_enable`>/dev/null 2>&1
+ continue
+ done
+ continue
+ fi
+
+ enable_detection
+
+function serverchan_send(){
+ if [ -f "${dir}title" ] ; then title=`cat ${dir}title` ;fi
+ if [ -f "${dir}content" ] ; then content=`cat ${dir}content` ;fi
+ if [ ! -z "$title" ] && [ ! -z "$content" ] ; then
+ nowtime=`date "+%Y-%m-%d %H:%M:%S"`
+ curl -s "http://sc.ftqq.com/$serverchan_sckey.send?text=${title}" -d "&desp=${nowtime}%0D%0A%0D%0A${content}" >/dev/null
+ unset title
+ unset content
+ rm -f ${dir}title >/dev/null 2>&1
+ rm -f ${dir}content >/dev/null 2>&1
+ fi
+ if [ ! -z "$debuglevel" ] && [ "$debuglevel" -ne "1" ] ; then echo "`date "+%H:%M:%S"` 【等待】我累了,$sleeptime 秒后再回来" >> ${logfile};fi
+ enable_detection 60
+ serverchan_disturb
+}
+
+ if [ ! -z "$serverchan_sheep" ] && [ "$serverchan_sheep" -eq "1" ] && [ ! -z "$starttime" ] && [ ! -z "$endtime" ] ;then
+ if [ `date +%H` -ge $endtime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a `date +%H` -ge $endtime -a $starttime -gt $endtime ] ; then
+ serverchan_send
+ else
+ serverchan_disturb
+ fi
+ else
+ serverchan_send
+ fi
+
+continue
+done
+echo "`date "+%H:%M:%S"` 【!!!】程序未启用,退出脚本!" >> ${logfile}
+exit