luci-app-serverchan: bump to v1.77

This commit is contained in:
CN_SZTL 2020-04-19 20:03:12 +08:00
parent 0bd3bb5365
commit 80d18a0f7e
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
11 changed files with 1007 additions and 1219 deletions

View File

@ -6,8 +6,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-serverchan
PKG_VERSION:=1.63
PKG_RELEASE:=7
PKG_VERSION:=1.77
PKG_RELEASE:=8
include $(INCLUDE_DIR)/package.mk
@ -28,12 +28,12 @@ define Package/$(PKG_NAME)/conffiles
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/bin/serverchan $(1)/etc/config $(1)/usr/lib/lua/luci
$(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/bin/serverchan $(1)/etc/config $(1)/usr/lib/lua/luci $(1)/etc/uci-defaults
$(CP) ./luasrc/* $(1)/usr/lib/lua/luci
$(INSTALL_CONF) ./root/etc/config/serverchan $(1)/etc/config
$(INSTALL_BIN) ./root/etc/init.d/serverchan $(1)/etc/init.d
$(INSTALL_BIN) ./root/etc/uci-defaults/luci-serverchan $(1)/etc/uci-defaults/luci-serverchan
$(INSTALL_BIN) ./root/usr/bin/serverchan/serverchan $(1)/usr/bin/serverchan
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

View File

@ -1,15 +1,33 @@
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
if not nixio.fs.access("/etc/config/serverchan")then
return
end
entry({"admin", "services", "serverchan"}, alias("admin", "services", "serverchan", "setting"),_("微信推送"), 30).dependent = true
entry({"admin","services","serverchan","status"},call("act_status")).leaf=true
entry({"admin", "services", "serverchan", "setting"}, cbi("serverchan/setting"),_("配置"), 40).leaf = true
entry({"admin", "services", "serverchan", "advanced"}, cbi("serverchan/advanced"),_("高级设置"), 90).leaf = true
entry({"admin", "services", "serverchan", "log"}, form("serverchan/log"),_("日志"), 99).leaf = true
entry({"admin", "services", "serverchan", "get_log"}, call("get_log")).leaf = true
entry({"admin", "services", "serverchan", "clear_log"}, call("clear_log")).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
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
function get_log()
luci.http.write(luci.sys.exec(
"[ -f '/tmp/serverchan/serverchan.log' ] && cat /tmp/serverchan/serverchan.log"))
end
function clear_log()
luci.sys.call("echo '' > /tmp/serverchan/serverchan.log")
end

View File

@ -1,373 +0,0 @@
local nt = require "luci.sys".net
local fs=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」是一款从服务器推送报警信息和日志到微信的工具。<br /><br />如果你在使用中遇到问题,请到这里提交:")
.. [[<a href="https://github.com/tty228/luci-app-serverchan" target="_blank">]]
.. translate("github 项目地址")
.. [[</a>]]
)
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("tab_basic5", translate("高级设置"))
s:tab("log",translate("客户端日志"))
s.addremove = false
s.anonymous = true
--基本设置
a=s:taboption("tab_basic", Flag,"serverchan_enable",translate("启用"))
a.default=0
a.rmempty=true
a=s:taboption("tab_basic", Value,"sckey",translate('SCKEY'), translate("Serverchan Sckey").."<br>调用代码获取<a href='http://sc.ftqq.com' target='_blank'>点击这里</a><br><br>")
a.rmempty=true
device_name=s:taboption("tab_basic", Value,"device_name",translate('本设备名称'))
device_name.rmempty=true
device_name.description = translate("在推送信息标题中会标识本设备名称,用于区分推送信息的来源设备")
sleeptime=s:taboption("tab_basic", Value,"sleeptime",translate('检测时间间隔'))
sleeptime.default = "60"
sleeptime.description = translate("越短的时间时间响应越及时,但会占用更多的系统资源")
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("<br/> 请输入设备 MAC 和设备别名,用“-”隔开,如:<br/> XX:XX:XX:XX:XX:XX-我的手机")
--设备状态
a=s:taboption("tab_basic2", ListValue,"serverchan_ipv4",translate("ipv4 变动通知"))
a.default="disable"
a:value("0",translate("关闭"))
a:value("1",translate("通过接口获取"))
a:value("2",translate("通过URL获取"))
a = s:taboption("tab_basic2", ListValue, "ipv4_interface", translate("接口名称"))
a:depends({serverchan_ipv4="1"})
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, ",")
a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
end
end
a.description = translate("<br/>一般选择 wan 接口,多拨环境请自行选择")
a= s:taboption("tab_basic2", Value, "ipv4_URL", "URL 地址")
a.rmempty = true
a.default = "members.3322.org/dyndns/getip"
a:depends({serverchan_ipv4="2"})
a.description = translate("<br/>会因服务器稳定性/连接频繁等原因导致获取失败,一般不推荐")
a=s:taboption("tab_basic2", ListValue,"serverchan_ipv6",translate("ipv6 变动通知"))
a.default="disable"
a:value("0",translate("关闭"))
a:value("1",translate("通过接口获取"))
a:value("2",translate("通过URL获取"))
a = s:taboption("tab_basic2", ListValue, "ipv6_interface", translate("接口名称"))
a:depends({serverchan_ipv6="1"})
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, ",")
a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
end
end
a.description = translate("<br/>一般选择 wan 接口,多拨环境请自行选择")
a= s:taboption("tab_basic2", Value, "ipv6_URL", "URL 地址")
a.rmempty = true
a.default = "v6.ip.zxinc.org/getip"
a:depends({serverchan_ipv6="2"})
a.description = translate("<br/>会因服务器稳定性/连接频繁等原因导致获取失败,一般不推荐")
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.default = "3.0"
a.rmempty = true
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.default = "80"
a.datatype="uinteger"
a:depends({temperature_enable="1"})
a.description = translate("<br/>设备报警只会在连续五分钟超过设定值时才会推送<br/>而且一个小时内不会再提醒第二次")
--定时推送
e=s:taboption("tab_basic3", ListValue,"send_mode",translate("定时任务设定"))
e.default=""
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=8
e.datatype=uinteger
e:depends("send_mode","1")
e=s:taboption("tab_basic3", ListValue,"regular_time_2",translate("发送时间"))
e:value("",translate("关闭"))
for t=0,23 do
e:value(t,translate("每天"..t..""))
end
e.default="关闭"
e.datatype=uinteger
e:depends("send_mode","1")
e=s:taboption("tab_basic3", ListValue,"regular_time_3",translate("发送时间"))
e:value("",translate("关闭"))
for t=0,23 do
e:value(t,translate("每天"..t..""))
end
e.default="关闭"
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")
e.description = translate("<br/>从 00:00 开始,每 * 小时发送一次")
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("<br/>使用特殊符号可能会造成发送失败")
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("在指定整点时间段内,暂停推送消息<br/>免打扰时间中,定时推送也会被阻止。"))
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
--高级设置
a=s:taboption("tab_basic5", Value,"up_timeout",translate('设备上线检测超时'))
a.default = "2"
a.datatype="uinteger"
a=s:taboption("tab_basic5", Value,"down_timeout",translate('设备离线检测超时'))
a.default = "5"
a.datatype="uinteger"
a.description = translate("如果遇到设备 wifi 休眠,频繁推送离线,可以把超时时间设置长一些")
a=s:taboption("tab_basic5", Value, "soc_code", "自定义温度读取命令")
a.rmempty = true
a:value("",translate("默认"))
a:value("sensors",translate("sensors命令"))
a.description = translate("请尽量避免使用特殊符号,如双引号、$、!等,执行结果需为数字,用于温度对比")
a=s:taboption("tab_basic5", Button,"soc",translate("测试温度命令"))
a.inputtitle = translate("输出信息")
a.write = function()
luci.sys.call("/usr/bin/serverchan/serverchan soc")
luci.http.redirect(luci.dispatcher.build_url("admin","services","serverchan"))
end
if nixio.fs.access("/tmp/serverchan/soc_tmp") then
e=s:taboption("tab_basic5",TextValue,"soc_tmp")
e.rows=2
e.readonly=true
e.cfgvalue = function()
return luci.sys.exec("cat /tmp/serverchan/soc_tmp && rm -f /tmp/serverchan/soc_tmp")
end
end
a=s:taboption("tab_basic5", Flag,"err_enable",translate("无人值守任务"))
a.default=0
a.rmempty=true
a.description = translate("请确认脚本可以正常运行,否则可能造成频繁重启等错误!<br/>如果你不了解这些选项的含义,请不要修改")
a=s:taboption("tab_basic5", Flag,"err_sheep_enable",translate("仅在免打扰时段重拨"))
a.default=0
a.rmempty=true
a.description = translate("避免白天重拨 ddns 域名等待解析,此功能不影响断网检测<br/>因夜间跑流量问题,该功能可能不稳定")
a:depends({err_enable="1"})
device_aliases= s:taboption("tab_basic5", DynamicList, "err_device_aliases", translate("关注列表"))
device_aliases.rmempty = true
device_aliases.optional = true
device_aliases.description = translate("只会在列表中设备都不在线时才会执行<br/>免打扰时段一小时后关注设备五分钟低流量约10kb/m将视为离线")
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_basic5", 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 次。<br/>选项 3 会将设置项备份于 /usr/bin/serverchan/configbak 目录,并在失败后还原。<br/>【!!无法保证兼容性!!】不熟悉系统设置项,不会救砖请勿使用")
a=s:taboption("tab_basic5", 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_basic5", 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_basic5", 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_basic5", Flag,"public_ip_event",translate("重拨尝试获取公网 ip"))
a.default=0
a.rmempty=true
a:depends({err_enable="1"})
a.description = translate("重拨时不会推送 ip 变动通知,并会导致你的域名无法及时更新 ip 地址<br/>请确认你可以通过重拨获取公网 ip否则这不仅徒劳无功还会引起频繁断网<br/>移动等大内网你就别挣扎了!!")
a= s:taboption("tab_basic5", Value, "public_ip_retry_count", "当天最大重试次数")
a.rmempty = true
a.default = "10"
a.datatype="uinteger"
a:depends({public_ip_event="1"})
--客户端日志
local logfile = "/tmp/serverchan/serverchan.log"
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 fs.readfile(logfile)or""
end
e.write=function(e,e,e)
end
e=s:taboption("log", Button,translate(""))
e:depends({debuglevel="1"})
e:depends({debuglevel="2"})
e.inputtitle=translate("清理日志")
e.inputstyle = "clean_log"
function e.write(self, section)
luci.sys.call("cbi.clean_log")
fs.writefile(logfile, "")
end
local apply = luci.http.formvalue("cbi.apply")
if apply then
io.popen("/etc/init.d/serverchan start &")
end
return m

View File

@ -0,0 +1,112 @@
local nt = require "luci.sys".net
local fs=require"nixio.fs"
m=Map("serverchan",translate("提示:"),
translate("如果你不了解这些选项的含义,请不要修改这些选项"))
s = m:section(TypedSection, "serverchan", "高级设置")
s.anonymous = true
s.addremove = false
a=s:option(Value,"up_timeout",translate('设备上线检测超时'))
a.default = "2"
a.optional=false
a.datatype="uinteger"
a=s:option(Value,"down_timeout",translate('设备离线检测超时'))
a.default = "20"
a.optional=false
a.datatype="uinteger"
a=s:option(Value,"timeout_retry_count",translate('离线检测次数'))
a.default = "2"
a.optional=false
a.datatype="uinteger"
a.description = translate("若无二级路由设备,信号强度良好,可以减少以上数值<br/>因夜间 wifi 休眠较为玄学,遇到设备频繁推送断开,烦请自行调整参数<br/>..╮(╯_╰╭..")
a=s:option(Value,"thread_num",translate('最大并发进程数'))
a.default = "3"
a.datatype="uinteger"
a=s:option(Value, "soc_code", "自定义温度读取命令")
a.rmempty = true
a:value("",translate("默认"))
a:value("sensors",translate("sensors命令"))
a.description = translate("请尽量避免使用特殊符号,如双引号、$、!等,执行结果需为数字,用于温度对比")
a=s:option(Button,"soc",translate("测试温度命令"))
a.inputtitle = translate("输出信息")
a.write = function()
luci.sys.call("/usr/bin/serverchan/serverchan soc")
luci.http.redirect(luci.dispatcher.build_url("admin","services","serverchan","advanced"))
end
if nixio.fs.access("/tmp/serverchan/soc_tmp") then
e=s:option(TextValue,"soc_tmp")
e.rows=2
e.readonly=true
e.cfgvalue = function()
return luci.sys.exec("cat /tmp/serverchan/soc_tmp && rm -f /tmp/serverchan/soc_tmp")
end
end
a=s:option(Flag,"err_enable",translate("无人值守任务"))
a.default=0
a.rmempty=true
a.description = translate("请确认脚本可以正常运行,否则可能造成频繁重启等错误!")
a=s:option(Flag,"err_sheep_enable",translate("仅在免打扰时段重拨"))
a.default=0
a.rmempty=true
a.description = translate("避免白天重拨 ddns 域名等待解析,此功能不影响断网检测<br/>因夜间跑流量问题,该功能可能不稳定")
a:depends({err_enable="1"})
a= s:option(DynamicList, "err_device_aliases", translate("关注列表"))
a.rmempty = true
a.description = translate("只会在列表中设备都不在线时才会执行<br/>免打扰时段一小时后关注设备五分钟低流量约10kb/m将视为离线")
nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end)
a:depends({err_enable="1"})
a=s:option(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 次。<br/>选项 3 会将设置项备份于 /usr/bin/serverchan/configbak 目录,并在失败后还原。<br/>【!!无法保证兼容性!!】不熟悉系统设置项,不会救砖请勿使用")
a=s:option(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:option(Value, "autoreboot_time", "系统运行时间大于")
a.rmempty = true
a.default = "24"
a.datatype="uinteger"
a:depends({system_time_event="1"})
a.description = translate("单位为小时")
a=s:option(Value, "network_restart_time", "网络在线时间大于")
a.rmempty = true
a.default = "24"
a.datatype="uinteger"
a:depends({system_time_event="2"})
a.description = translate("单位为小时")
a=s:option(Flag,"public_ip_event",translate("重拨尝试获取公网 ip"))
a.default=0
a.rmempty=true
a:depends({err_enable="1"})
a.description = translate("重拨时不会推送 ip 变动通知,并会导致你的域名无法及时更新 ip 地址<br/>请确认你可以通过重拨获取公网 ip否则这不仅徒劳无功还会引起频繁断网<br/>移动等大内网你就别挣扎了!!")
a= s:option(Value, "public_ip_retry_count", "当天最大重试次数")
a.rmempty = true
a.default = "10"
a.datatype="uinteger"
a:depends({public_ip_event="1"})
return m

View File

@ -0,0 +1,5 @@
f = SimpleForm("serverchan")
f.reset = false
f.submit = false
f:append(Template("serverchan/log"))
return f

View File

@ -0,0 +1,297 @@
local nt = require "luci.sys".net
local fs=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」是一款从服务器推送报警信息和日志到微信的工具。<br /><br />如果你在使用中遇到问题,请到这里提交:")
.. [[<a href="https://github.com/tty228/luci-app-serverchan" target="_blank">]]
.. translate("github 项目地址")
.. [[</a>]]
)
m:section(SimpleSection).template = "serverchan/status"
s=m:section(NamedSection,"serverchan","serverchan",translate(""))
s:tab("basic", translate("基本设置"))
s:tab("content", translate("推送内容"))
s:tab("crontab", translate("定时推送"))
s:tab("disturb", translate("免打扰"))
s.addremove = false
s.anonymous = true
--基本设置
a=s:taboption("basic", Flag,"serverchan_enable",translate("启用"))
a.default=0
a.rmempty = true
a=s:taboption("basic", ListValue,"send_tg",translate("推送模式"))
a.default=""
a.rmempty = true
a:value("",translate("微信"))
a:value("1",translate("Telegram"))
a=s:taboption("basic", Value,"sckey",translate('SCKEY'), translate("Serverchan Sckey").."<br>调用代码获取<a href='http://sc.ftqq.com' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("send_tg","")
a=s:taboption("basic", Value, "tgtoken", translate("tg推送链接"),translate("").."<br>获取机器人<a href='https://t.me/notificationme_bot' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("send_tg","1")
a.placeholder="https://tgbot.lbyczf.com/sendMessage/:Token"
a=s:taboption("basic", Value,"device_name",translate('本设备名称'))
a.rmempty = true
a.description = translate("在推送信息标题中会标识本设备名称,用于区分推送信息的来源设备")
a=s:taboption("basic", Value,"sleeptime",translate('检测时间间隔'))
a.rmempty = true
a.optional = false
a.default = "60"
a.description = translate("越短的时间时间响应越及时,但会占用更多的系统资源")
a=s:taboption("basic", Flag,"debuglevel",translate("开启日志"))
a.rmempty = true
a= s:taboption("basic", DynamicList, "device_aliases", translate("设备别名"))
a.rmempty = true
a.description = translate("<br/> 请输入设备 MAC 和设备别名,用“-”隔开,如:<br/> XX:XX:XX:XX:XX:XX-我的手机")
--设备状态
a=s:taboption("content", ListValue,"serverchan_ipv4",translate("ipv4 变动通知"))
a.rmempty = true
a.default=""
a:value("",translate("关闭"))
a:value("1",translate("通过接口获取"))
a:value("2",translate("通过URL获取"))
a = s:taboption("content", ListValue, "ipv4_interface", translate("接口名称"))
a.rmempty = true
a:depends({serverchan_ipv4="1"})
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, ",")
a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
end
end
a.description = translate("<br/>一般选择 wan 接口,多拨环境请自行选择")
a= s:taboption("content", Value, "ipv4_URL", "URL 地址")
a.rmempty = true
a.default = "members.3322.org/dyndns/getip"
a:depends({serverchan_ipv4="2"})
a.description = translate("<br/>会因服务器稳定性/连接频繁等原因导致获取失败")
a=s:taboption("content", ListValue,"serverchan_ipv6",translate("ipv6 变动通知"))
a.rmempty = true
a.default="disable"
a:value("0",translate("关闭"))
a:value("1",translate("通过接口获取"))
a:value("2",translate("通过URL获取"))
a = s:taboption("content", ListValue, "ipv6_interface", translate("接口名称"))
a.rmempty = true
a:depends({serverchan_ipv6="1"})
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, ",")
a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
end
end
a.description = translate("<br/>一般选择 wan 接口,多拨环境请自行选择")
a= s:taboption("content", Value, "ipv6_URL", "URL 地址")
a.rmempty = true
a.default = "v6.ip.zxinc.org/getip"
a:depends({serverchan_ipv6="2"})
a.description = translate("<br/>会因服务器稳定性/连接频繁等原因导致获取失败")
a=s:taboption("content", Flag,"serverchan_up",translate("设备上线通知"))
a.default=1
a.rmempty = true
a=s:taboption("content", Flag,"serverchan_down",translate("设备下线通知"))
a.default=1
a.rmempty = true
a=s:taboption("content", Flag,"cpuload_enable",translate("CPU 负载报警"))
a.default=1
a.rmempty = true
a= s:taboption("content", Value, "cpuload", "负载报警阈值")
a.default = 2
a.rmempty = true
a:depends({cpuload_enable="1"})
a=s:taboption("content", Flag,"temperature_enable",translate("CPU 温度报警"))
a.default=70
a.rmempty = true
a= s:taboption("content", Value, "temperature", "温度报警阈值")
a.rmempty = true
a.default = "80"
a.datatype="uinteger"
a:depends({temperature_enable="1"})
a.description = translate("<br/>设备报警只会在连续五分钟超过设定值时才会推送<br/>而且一个小时内不会再提醒第二次")
--定时推送
a=s:taboption("crontab", ListValue,"send_mode",translate("定时任务设定"))
a.rmempty = true
a.default=""
a:value("",translate("关闭"))
a:value("1",translate("定时发送"))
a:value("2",translate("间隔发送"))
a=s:taboption("crontab", ListValue,"regular_time",translate("发送时间"))
a.rmempty = true
for t=0,23 do
a:value(t,translate("每天"..t..""))
end
a.default=8
a.datatype=uinteger
a:depends("send_mode","1")
a=s:taboption("crontab", ListValue,"regular_time_2",translate("发送时间"))
a.rmempty = true
a:value("",translate("关闭"))
for t=0,23 do
a:value(t,translate("每天"..t..""))
end
a.default="关闭"
a.datatype=uinteger
a:depends("send_mode","1")
a=s:taboption("crontab", ListValue,"regular_time_3",translate("发送时间"))
a.rmempty = true
a:value("",translate("关闭"))
for t=0,23 do
a:value(t,translate("每天"..t..""))
end
a.default="关闭"
a.datatype=uinteger
a:depends("send_mode","1")
a=s:taboption("crontab", ListValue,"interval_time",translate("发送间隔"))
a.rmempty = true
for t=1,23 do
a:value(t,translate(t.."小时"))
end
a.default=6
a.datatype=uinteger
a:depends("send_mode","2")
a.description = translate("<br/>从 00:00 开始,每 * 小时发送一次")
a= s:taboption("crontab", Value, "send_title", translate("微信推送标题"))
a:depends("send_mode","1")
a:depends("send_mode","2")
a.placeholder = "OpenWrt By tty228 路由状态:"
a.description = translate("<br/>使用特殊符号可能会造成发送失败")
a=s:taboption("crontab", Flag,"router_status",translate("系统运行情况"))
a.default=1
a:depends("send_mode","1")
a:depends("send_mode","2")
a=s:taboption("crontab", Flag,"router_temp",translate("设备温度"))
a.default=1
a:depends("send_mode","1")
a:depends("send_mode","2")
a=s:taboption("crontab", Flag,"router_wan",translate("WAN信息"))
a.default=1
a:depends("send_mode","1")
a:depends("send_mode","2")
a=s:taboption("crontab", Flag,"client_list",translate("客户端列表"))
a.default=1
a:depends("send_mode","1")
a:depends("send_mode","2")
e=s:taboption("crontab", 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
--免打扰
a=s:taboption("disturb", ListValue,"serverchan_sheep",translate("免打扰时段设置"),translate("在指定整点时间段内,暂停推送消息<br/>免打扰时间中,定时推送也会被阻止。"))
a.rmempty = true
a:value("",translate("关闭"))
a:value("1",translate("模式一:脚本挂起"))
a:value("2",translate("模式二:静默模式"))
a.description = translate("模式一停止一切检测,包括无人值守。")
a=s:taboption("disturb", ListValue,"starttime",translate("免打扰开始时间"))
a.rmempty = true
for t=0,23 do
a:value(t,translate("每天"..t..""))
end
a.default=0
a.datatype=uinteger
a:depends({serverchan_sheep="1"})
a:depends({serverchan_sheep="2"})
a=s:taboption("disturb", ListValue,"endtime",translate("免打扰结束时间"))
a.rmempty = true
for t=0,23 do
a:value(t,translate("每天"..t..""))
end
a.default=8
a.datatype=uinteger
a:depends({serverchan_sheep="1"})
a:depends({serverchan_sheep="2"})
a=s:taboption("disturb", ListValue,"macmechanism",translate("MAC过滤"))
a:value("",translate("disable"))
a:value("allow",translate("忽略列表内设备"))
a:value("block",translate("仅通知列表内设备"))
a:value("interface",translate("仅通知此接口设备"))
a.rmempty = true
a = s:taboption("disturb", DynamicList, "serverchan_whitelist", translate("忽略列表"))
nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism="allow"})
a = s:taboption("disturb", DynamicList, "serverchan_blacklist", translate("关注列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism="block"})
a = s:taboption("disturb", ListValue, "serverchan_interface", translate("接口名称"))
a:depends({macmechanism="interface"})
a.rmempty = true
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, ",")
a:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
end
end
return m

View File

@ -0,0 +1,32 @@
<%
local dsp = require "luci.dispatcher"
-%>
<script type="text/javascript">
//<![CDATA[
function clearlog(btn) {
XHR.get('<%=dsp.build_url("admin/services/serverchan/clear_log")%>', null,
function(x, data) {
if(x && x.status == 200) {
var log_textarea = document.getElementById('log_textarea');
log_textarea.innerHTML = "";
log_textarea.scrollTop = log_textarea.scrollHeight;
}
}
);
}
XHR.poll(2, '<%=dsp.build_url("admin/services/serverchan/get_log")%>', null,
function(x, data) {
if(x && x.status == 200) {
var log_textarea = document.getElementById('log_textarea');
log_textarea.innerHTML = x.responseText;
log_textarea.scrollTop = log_textarea.scrollHeight;
}
}
);
//]]>
</script>
<fieldset class="cbi-section" id="_log_fieldset">
<input class="cbi-button cbi-input-remove" type="button" onclick="clearlog()" value="<%:Clear logs%>" />
<textarea id="log_textarea" class="cbi-input-textarea" style="width: 100%;margin-top: 10px;" data-update="change" rows="30" wrap="off" readonly="readonly"></textarea>
</fieldset>

View File

@ -4,17 +4,23 @@ START=99
STOP=10
start() {
kill -9 `pgrep -f "/usr/bin/serverchan/serverchan"` 2>/dev/null
/usr/bin/serverchan/serverchan &
state=`pgrep -f "/usr/bin/serverchan/serverchan"`
if [ ! -z "$state" ]; then
restart
else
/usr/bin/serverchan/serverchan &
fi
echo "serverchan is starting now ..."
}
stop() {
kill -9 `pgrep -f "/usr/bin/serverchan/serverchan"` 2>/dev/null
kill -9 `pgrep -f "/etc/init.d/serverchan"` 2>/dev/null
echo "serverchan exit ..."
}
restart(){
stop
sleep 2
start
}
echo "restarted."
}

View File

@ -0,0 +1,11 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@serverchan[-1]
add ucitrack serverchan
set ucitrack.@serverchan[-1].init=serverchan
commit ucitrack
EOF
rm -rf /tmp/luci-*
exit 0