1
0
mirror of https://github.com/kenzok8/small-package synced 2025-11-18 01:01:34 +08:00

update 2025-11-18 00:31:46

This commit is contained in:
kenzok8
2025-11-18 00:31:46 +08:00
parent d08b66584f
commit 10408726af
14 changed files with 256 additions and 771 deletions

View File

@@ -338,7 +338,7 @@ o.remove = function(self, section)
local new_val = (v.type == "Xray") and "xray" or "sing-box"
m:set(section, self.option, new_val)
local dns_field = s.fields[new_val .. "_dns_mode"]
local dns_field = s.fields[v.type == "Xray" and "xray_dns_mode" or "singbox_dns_mode"]
local v2ray_dns_mode = dns_field and dns_field:formvalue(section)
if v2ray_dns_mode then
m:set(section, "v2ray_dns_mode", v2ray_dns_mode)
@@ -350,6 +350,8 @@ o.remove = function(self, section)
end
o = s:option(ListValue, "xray_dns_mode", translate("Request protocol"))
o.default = "tcp"
o:value("udp", "UDP")
o:value("tcp", "TCP")
o:value("tcp+doh", "TCP + DoH (" .. translate("A/AAAA type") .. ")")
o:depends("dns_mode", "xray")
@@ -363,6 +365,8 @@ o.write = function(self, section, value)
end
o = s:option(ListValue, "singbox_dns_mode", translate("Request protocol"))
o.default = "tcp"
o:value("udp", "UDP")
o:value("tcp", "TCP")
o:value("doh", "DoH")
o:depends("dns_mode", "sing-box")
@@ -387,53 +391,53 @@ o:value("149.112.112.112", "149.112.112.112 (Quad9-Recommended)")
o:value("208.67.220.220", "208.67.220.220 (OpenDNS)")
o:value("208.67.222.222", "208.67.222.222 (OpenDNS)")
o:depends({dns_mode = "dns2socks"})
o:depends({xray_dns_mode = "udp"})
o:depends({xray_dns_mode = "tcp"})
o:depends({xray_dns_mode = "tcp+doh"})
o:depends({singbox_dns_mode = "udp"})
o:depends({singbox_dns_mode = "tcp"})
if has_singbox or has_xray then
o = s:option(Value, "remote_dns_doh", translate("Remote DNS DoH"))
o:value("https://1.1.1.1/dns-query", "CloudFlare")
o:value("https://1.1.1.2/dns-query", "CloudFlare-Security")
o:value("https://8.8.4.4/dns-query", "Google 8844")
o:value("https://8.8.8.8/dns-query", "Google 8888")
o:value("https://9.9.9.9/dns-query", "Quad9-Recommended 9.9.9.9")
o:value("https://149.112.112.112/dns-query", "Quad9-Recommended 149.112.112.112")
o:value("https://208.67.222.222/dns-query", "OpenDNS")
o:value("https://dns.adguard.com/dns-query,176.103.130.130", "AdGuard")
o:value("https://doh.libredns.gr/dns-query,116.202.176.26", "LibreDNS")
o:value("https://doh.libredns.gr/ads,116.202.176.26", "LibreDNS (No Ads)")
o.default = "https://1.1.1.1/dns-query"
o.validate = function(self, value, t)
if value ~= "" then
value = api.trim(value)
local flag = 0
local util = require "luci.util"
local val = util.split(value, ",")
local url = val[1]
val[1] = nil
for i = 1, #val do
local v = val[i]
if v then
if not api.datatypes.ipmask4(v) then
flag = 1
end
o = s:option(Value, "remote_dns_doh", translate("Remote DNS DoH"))
o:value("https://1.1.1.1/dns-query", "1.1.1.1 (CloudFlare)")
o:value("https://1.1.1.2/dns-query", "1.1.1.2 (CloudFlare-Security)")
o:value("https://8.8.4.4/dns-query", "8.8.4.4 (Google)")
o:value("https://8.8.8.8/dns-query", "8.8.8.8 (Google)")
o:value("https://9.9.9.9/dns-query", "9.9.9.9 (Quad9)")
o:value("https://149.112.112.112/dns-query", "149.112.112.112 (Quad9)")
o:value("https://208.67.222.222/dns-query", "208.67.222.222 (OpenDNS)")
o:value("https://dns.adguard.com/dns-query,94.140.14.14", "94.140.14.14 (AdGuard)")
o:value("https://doh.libredns.gr/dns-query,116.202.176.26", "116.202.176.26 (LibreDNS)")
o:value("https://doh.libredns.gr/ads,116.202.176.26", "116.202.176.26 (LibreDNS-NoAds)")
o.default = "https://1.1.1.1/dns-query"
o.validate = function(self, value, t)
if value ~= "" then
value = api.trim(value)
local flag = 0
local util = require "luci.util"
local val = util.split(value, ",")
local url = val[1]
val[1] = nil
for i = 1, #val do
local v = val[i]
if v then
if not api.datatypes.ipmask4(v) then
flag = 1
end
end
if flag == 0 then
return value
end
end
return nil, translate("DoH request address") .. " " .. translate("Format must be:") .. " URL,IP"
if flag == 0 then
return value
end
end
o:depends({xray_dns_mode = "tcp+doh"})
o:depends({singbox_dns_mode = "doh"})
o = s:option(Value, "remote_dns_client_ip", translate("EDNS Client Subnet"))
o.datatype = "ipaddr"
o:depends({dns_mode = "sing-box"})
o:depends({dns_mode = "xray"})
return nil, translate("DoH request address") .. " " .. translate("Format must be:") .. " URL,IP"
end
o:depends({xray_dns_mode = "tcp+doh"})
o:depends({singbox_dns_mode = "doh"})
o = s:option(Value, "remote_dns_client_ip", translate("EDNS Client Subnet"))
o.datatype = "ipaddr"
o:depends({dns_mode = "sing-box"})
o:depends({dns_mode = "xray"})
o = s:option(ListValue, "chinadns_ng_default_tag", translate("Default DNS"))
o.default = "none"

View File

@@ -432,6 +432,8 @@ if api.is_finded("smartdns") then
end
o = s:taboption("DNS", ListValue, "xray_dns_mode", translate("Remote DNS") .. " " .. translate("Request protocol"))
o.default = "tcp"
o:value("udp", "UDP")
o:value("tcp", "TCP")
o:value("tcp+doh", "TCP + DoH (" .. translate("A/AAAA type") .. ")")
o:depends("dns_mode", "xray")
@@ -446,6 +448,8 @@ o.write = function(self, section, value)
end
o = s:taboption("DNS", ListValue, "singbox_dns_mode", translate("Remote DNS") .. " " .. translate("Request protocol"))
o.default = "tcp"
o:value("udp", "UDP")
o:value("tcp", "TCP")
o:value("doh", "DoH")
o:depends("dns_mode", "sing-box")
@@ -485,8 +489,10 @@ o:value("208.67.222.222", "208.67.222.222 (OpenDNS)")
o:depends({dns_mode = "dns2socks"})
o:depends({dns_mode = "tcp"})
o:depends({dns_mode = "udp"})
o:depends({xray_dns_mode = "udp"})
o:depends({xray_dns_mode = "tcp"})
o:depends({xray_dns_mode = "tcp+doh"})
o:depends({singbox_dns_mode = "udp"})
o:depends({singbox_dns_mode = "tcp"})
---- DoH

View File

@@ -1544,8 +1544,7 @@ function gen_config(var)
}
if remote_dns_udp_server then
local server_port = tonumber(remote_dns_port) or 53
remote_server.address = "udp://" .. remote_dns_udp_server .. ":" .. server_port
remote_server.address = remote_dns_udp_server
end
if remote_dns_tcp_server then
@@ -1597,9 +1596,9 @@ function gen_config(var)
if remote_dns_udp_server then
local server_port = tonumber(remote_dns_port) or 53
remote_server.type = "udp"
remote_server.server = remote_dns_udp_server
remote_server.server = remote_dns_server
remote_server.server_port = server_port
tmp_address = remote_dns_udp_server
tmp_address = remote_dns_server
end
if remote_dns_tcp_server then

View File

@@ -580,6 +580,8 @@ function gen_config(var)
local direct_dns_udp_server = var["-direct_dns_udp_server"]
local direct_dns_tcp_server = var["-direct_dns_tcp_server"]
local direct_dns_query_strategy = var["-direct_dns_query_strategy"]
local remote_dns_udp_server = var["-remote_dns_udp_server"]
local remote_dns_udp_port = var["-remote_dns_udp_port"]
local remote_dns_tcp_server = var["-remote_dns_tcp_server"]
local remote_dns_tcp_port = var["-remote_dns_tcp_port"]
local remote_dns_doh_url = var["-remote_dns_doh_url"]
@@ -1175,7 +1177,7 @@ function gen_config(var)
end
end
if remote_dns_tcp_server and remote_dns_tcp_port then
if (remote_dns_udp_server and remote_dns_udp_port) or (remote_dns_tcp_server and remote_dns_tcp_port) then
if not routing then
routing = {
domainStrategy = "IPOnDemand",
@@ -1230,8 +1232,13 @@ function gen_config(var)
local _remote_dns = {
--tag = "dns-global-remote",
queryStrategy = (remote_dns_query_strategy and remote_dns_query_strategy ~= "") and remote_dns_query_strategy or "UseIPv4",
address = "tcp://" .. remote_dns_tcp_server .. ":" .. tonumber(remote_dns_tcp_port) or 53
}
if remote_dns_udp_server then
_remote_dns.address = remote_dns_udp_server
_remote_dns.port = tonumber(remote_dns_udp_port) or 53
else
address = "tcp://" .. remote_dns_tcp_server .. ":" .. tonumber(remote_dns_tcp_port) or 53
end
local _remote_dns_host
if remote_dns_doh_url and remote_dns_doh_host then
@@ -1309,8 +1316,8 @@ function gen_config(var)
protocol = "dokodemo-door",
tag = "dns-in",
settings = {
address = remote_dns_tcp_server,
port = tonumber(remote_dns_tcp_port),
address = remote_dns_udp_server or remote_dns_tcp_server,
port = tonumber(remote_dns_udp_port) or tonumber(remote_dns_tcp_port),
network = "tcp,udp"
}
})
@@ -1322,9 +1329,9 @@ function gen_config(var)
tag = dns_outbound_tag
} or nil,
settings = {
address = remote_dns_tcp_server,
port = tonumber(remote_dns_tcp_port),
network = "tcp",
address = remote_dns_udp_server or remote_dns_tcp_server,
port = tonumber(remote_dns_udp_port) or tonumber(remote_dns_tcp_port),
network = remote_dns_udp_server and "udp" or "tcp",
nonIPQuery = "drop"
}
})

View File

@@ -486,11 +486,12 @@ run_singbox() {
[ -n "$remote_dns_query_strategy" ] && _extra_param="${_extra_param} -remote_dns_query_strategy ${remote_dns_query_strategy}"
case "$remote_dns_protocol" in
tcp)
local _dns=$(get_first_dns remote_dns_tcp_server 53 | sed 's/#/:/g')
udp|tcp)
local _proto="$remote_dns_protocol"
local _dns=$(get_first_dns remote_dns_${_proto}_server 53 | sed 's/#/:/g')
local _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')
local _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')
_extra_param="${_extra_param} -remote_dns_server ${_dns_address} -remote_dns_port ${_dns_port} -remote_dns_tcp_server tcp://${_dns}"
_extra_param="${_extra_param} -remote_dns_server ${_dns_address} -remote_dns_port ${_dns_port} -remote_dns_${_proto}_server ${_proto}://${_dns}"
;;
doh)
local _doh_url _doh_host _doh_port _doh_bootstrap
@@ -508,7 +509,7 @@ run_singbox() {
run_xray() {
local flag type node tcp_redir_port tcp_proxy_way udp_redir_port socks_address socks_port socks_username socks_password http_address http_port http_username http_password
local dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port
local dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port
local loglevel log_file config_file server_host server_port no_run
local _extra_param=""
eval_set_val $@
@@ -557,18 +558,27 @@ run_xray() {
[ -n "$remote_dns_client_ip" ] && _extra_param="${_extra_param} -remote_dns_client_ip ${remote_dns_client_ip}"
[ "$remote_fakedns" = "1" ] && _extra_param="${_extra_param} -remote_dns_fake 1"
[ -n "$dns_cache" ] && _extra_param="${_extra_param} -dns_cache ${dns_cache}"
[ -n "${remote_dns_tcp_server}" ] && {
local _dns=$(get_first_dns remote_dns_tcp_server 53 | sed 's/#/:/g')
local _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')
local _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')
_extra_param="${_extra_param} -remote_dns_tcp_server ${_dns_address} -remote_dns_tcp_port ${_dns_port}"
}
[ -n "${remote_dns_doh}" ] && {
local _doh_url _doh_host _doh_port _doh_bootstrap
parse_doh "$remote_dns_doh" _doh_url _doh_host _doh_port _doh_bootstrap
[ -n "$_doh_bootstrap" ] && _extra_param="${_extra_param} -remote_dns_doh_ip ${_doh_bootstrap}"
_extra_param="${_extra_param} -remote_dns_doh_port ${_doh_port} -remote_dns_doh_url ${_doh_url} -remote_dns_doh_host ${_doh_host}"
}
case "$remote_dns_protocol" in
udp)
local _dns=$(get_first_dns remote_dns_udp_server 53 | sed 's/#/:/g')
local _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')
local _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')
_extra_param="${_extra_param} -remote_dns_udp_server ${_dns_address} -remote_dns_udp_port ${_dns_port}"
;;
tcp|tcp+doh)
local _dns=$(get_first_dns remote_dns_tcp_server 53 | sed 's/#/:/g')
local _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')
local _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')
_extra_param="${_extra_param} -remote_dns_tcp_server ${_dns_address} -remote_dns_tcp_port ${_dns_port}"
[ "$remote_dns_protocol" = "tcp+doh" ] && {
local _doh_url _doh_host _doh_port _doh_bootstrap
parse_doh "$remote_dns_doh" _doh_url _doh_host _doh_port _doh_bootstrap
[ -n "$_doh_bootstrap" ] && _extra_param="${_extra_param} -remote_dns_doh_ip ${_doh_bootstrap}"
_extra_param="${_extra_param} -remote_dns_doh_port ${_doh_port} -remote_dns_doh_url ${_doh_url} -remote_dns_doh_host ${_doh_host}"
}
;;
esac
_extra_param="${_extra_param} -loglevel $loglevel"
[ -n "$no_run" ] && _extra_param="${_extra_param} -no_run 1"
lua $UTIL_XRAY gen_config ${_extra_param} > $config_file
@@ -963,9 +973,10 @@ run_redir() {
_args="${_args} remote_dns_protocol=${v2ray_dns_mode}"
case "$v2ray_dns_mode" in
tcp)
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
resolve_dns_log="Sing-Box DNS(127.0.0.1#${resolve_dns_port}) -> tcp://${REMOTE_DNS}"
udp|tcp)
local _proto="$v2ray_dns_mode"
_args="${_args} remote_dns_${_proto}_server=${REMOTE_DNS}"
resolve_dns_log="Sing-Box DNS(127.0.0.1#${resolve_dns_port}) -> ${_proto}://${REMOTE_DNS}"
;;
doh)
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
@@ -1041,14 +1052,23 @@ run_redir() {
;;
esac
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
_args="${_args} remote_dns_doh=${remote_dns_doh}"
resolve_dns_log="Xray DNS(127.0.0.1#${resolve_dns_port}) -> (${remote_dns_doh})(A/AAAA) + tcp://${REMOTE_DNS}"
else
resolve_dns_log="Xray DNS(127.0.0.1#${resolve_dns_port}) -> tcp://${REMOTE_DNS}"
fi
_args="${_args} remote_dns_protocol=${v2ray_dns_mode}"
case "$v2ray_dns_mode" in
udp)
_args="${_args} remote_dns_udp_server=${REMOTE_DNS}"
resolve_dns_log="Xray DNS(127.0.0.1#${resolve_dns_port}) -> udp://${REMOTE_DNS}"
;;
tcp|tcp+doh)
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
_args="${_args} remote_dns_doh=${remote_dns_doh}"
resolve_dns_log="Xray DNS(127.0.0.1#${resolve_dns_port}) -> (${remote_dns_doh})(A/AAAA) + tcp://${REMOTE_DNS}"
else
resolve_dns_log="Xray DNS(127.0.0.1#${resolve_dns_port}) -> tcp://${REMOTE_DNS}"
fi
;;
esac
local remote_fakedns=$(config_t_get global remote_fakedns 0)
[ "${remote_fakedns}" = "1" ] && {
fakedns=1
@@ -1498,9 +1518,10 @@ start_dns() {
_args="${_args} dns_listen_port=${NEXT_DNS_LISTEN_PORT}"
_args="${_args} remote_dns_protocol=${v2ray_dns_mode}"
case "$v2ray_dns_mode" in
tcp)
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
echolog " - Sing-Box DNS(${TUN_DNS}) -> tcp://${REMOTE_DNS}"
udp|tcp)
local _proto="$v2ray_dns_mode"
_args="${_args} remote_dns_${_proto}_server=${REMOTE_DNS}"
echolog " - Sing-Box DNS(${TUN_DNS}) -> ${_proto}://${REMOTE_DNS}"
;;
doh)
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
@@ -1531,19 +1552,27 @@ start_dns() {
[ -n "${_remote_dns_client_ip}" ] && _args="${_args} remote_dns_client_ip=${_remote_dns_client_ip}"
TCP_PROXY_DNS=1
_args="${_args} dns_listen_port=${NEXT_DNS_LISTEN_PORT}"
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
_args="${_args} remote_dns_doh=${remote_dns_doh}"
echolog " - Xray DNS(${TUN_DNS}) -> (${remote_dns_doh})(A/AAAA) + tcp://${REMOTE_DNS}"
case "$v2ray_dns_mode" in
udp)
_args="${_args} remote_dns_udp_server=${REMOTE_DNS}"
echolog " - Xray DNS(${TUN_DNS}) -> udp://${REMOTE_DNS}"
;;
tcp|tcp+doh)
_args="${_args} remote_dns_tcp_server=${REMOTE_DNS}"
local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
if [ "$v2ray_dns_mode" = "tcp+doh" ]; then
remote_dns_doh=$(config_t_get global remote_dns_doh "https://1.1.1.1/dns-query")
_args="${_args} remote_dns_doh=${remote_dns_doh}"
echolog " - Xray DNS(${TUN_DNS}) -> (${remote_dns_doh})(A/AAAA) + tcp://${REMOTE_DNS}"
local _doh_url _doh_host _doh_port _doh_bootstrap
parse_doh "$remote_dns_doh" _doh_url _doh_host _doh_port _doh_bootstrap
[ -n "${_doh_bootstrap}" ] && REMOTE_DNS="${REMOTE_DNS},${_doh_bootstrap}#${_doh_port}"
else
echolog " - Xray DNS(${TUN_DNS}) -> tcp://${REMOTE_DNS}"
fi
local _doh_url _doh_host _doh_port _doh_bootstrap
parse_doh "$remote_dns_doh" _doh_url _doh_host _doh_port _doh_bootstrap
[ -n "${_doh_bootstrap}" ] && REMOTE_DNS="${REMOTE_DNS},${_doh_bootstrap}#${_doh_port}"
else
echolog " - Xray DNS(${TUN_DNS}) -> tcp://${REMOTE_DNS}"
fi
;;
esac
_args="${_args} dns_socks_address=127.0.0.1 dns_socks_port=${tcp_node_socks_port}"
run_xray ${_args}
}
@@ -1849,7 +1878,7 @@ acl_app() {
dnsmasq_filter_proxy_ipv6=0
remote_dns_query_strategy="UseIP"
[ "$filter_proxy_ipv6" = "1" ] && remote_dns_query_strategy="UseIPv4"
run_${type} flag=acl_${sid} type=$dns_mode dns_socks_address=127.0.0.1 dns_socks_port=$socks_port dns_listen_port=${_dns_port} remote_dns_protocol=${v2ray_dns_mode} remote_dns_tcp_server=${remote_dns} remote_dns_doh="${remote_dns_doh}" remote_dns_query_strategy=${remote_dns_query_strategy} remote_dns_client_ip=${remote_dns_client_ip} config_file=$config_file
run_${type} flag=acl_${sid} type=$dns_mode dns_socks_address=127.0.0.1 dns_socks_port=$socks_port dns_listen_port=${_dns_port} remote_dns_protocol=${v2ray_dns_mode} remote_dns_udp_server=${remote_dns} remote_dns_tcp_server=${remote_dns} remote_dns_doh="${remote_dns_doh}" remote_dns_query_strategy=${remote_dns_query_strategy} remote_dns_client_ip=${remote_dns_client_ip} config_file=$config_file
fi
set_cache_var "node_${tcp_node}_$(echo -n "${remote_dns}" | md5sum | cut -d " " -f1)" "${_dns_port}"
}
@@ -1944,7 +1973,7 @@ acl_app() {
remote_dns_query_strategy="UseIP"
[ "$filter_proxy_ipv6" = "1" ] && remote_dns_query_strategy="UseIPv4"
[ "$dns_mode" = "xray" ] && [ "$v2ray_dns_mode" = "tcp+doh" ] && remote_dns_doh=${remote_dns_doh:-https://1.1.1.1/dns-query}
_extra_param="dns_listen_port=${_dns_port} remote_dns_protocol=${v2ray_dns_mode} remote_dns_tcp_server=${remote_dns} remote_dns_doh=${remote_dns_doh} remote_dns_query_strategy=${remote_dns_query_strategy} remote_dns_client_ip=${remote_dns_client_ip}"
_extra_param="dns_listen_port=${_dns_port} remote_dns_protocol=${v2ray_dns_mode} remote_dns_udp_server=${remote_dns} remote_dns_tcp_server=${remote_dns} remote_dns_doh=${remote_dns_doh} remote_dns_query_strategy=${remote_dns_query_strategy} remote_dns_client_ip=${remote_dns_client_ip}"
fi
[ -n "$udp_node" ] && ([ "$udp_node" = "tcp" ] || [ "$udp_node" = "$tcp_node" ]) && {
config_file="${config_file//TCP_/TCP_UDP_}"

View File

@@ -7,7 +7,7 @@ local sys = require "luci.sys"
local ifaces = sys.net:devices()
m=Map("pushbot",translate("PushBot"),
translate("「全能推送」英文名「PushBot」是一款从服务器推送报警信息和日志到各平台的工具<EFBFBD><EFBFBD>?br>支持钉钉推送企业微信推送PushPlus推送<EFBFBD><EFBFBD>?br>本插件由tty228/luci-app-serverchan创建然后七年修改为全能推送自用<EFBFBD><EFBFBD>?br /><br />如果你在使用中遇到问题,请到这里提交<EFBFBD><EFBFBD>?)
translate("「全能推送」英文名「PushBot」是一款从服务器推送报警信息和日志到各平台的工具。<br>支持钉钉推送企业微信推送PushPlus推送。<br>本插件由tty228/luci-app-serverchan创建然后七年修改为全能推送自用。<br /><br />如果你在使用中遇到问题,请到这里提交")
.. [[<a href="https://github.com/zzsj0928/luci-app-pushbot" target="_blank">]]
.. translate("github 项目地址")
.. [[</a>]]
@@ -17,14 +17,9 @@ m:section(SimpleSection).template = "pushbot/pushbot_status"
s=m:section(NamedSection,"pushbot","pushbot",translate(""))
s:tab("basic", translate("基本设置"))
s:tab("content", translate("<EFBFBD><EFBFBD>?))
s:tab("crontab", translate("定时推<EFBFBD><EFBFBD>?))
s:tab("disturb", translate("<EFBFBD><EFBFBD>?))
s:tab("showdoc", translate("ShowDoc"))
o = s:taboption("showdoc", Flag, "enable_showdoc", translate("启用 ShowDoc 推<><E68EA8>?))
o = s:taboption("showdoc", Value, "showdoc_api_key", translate("API Key"))
o = s:taboption("showdoc", Value, "showdoc_api_token", translate("API Token"))
o = s:taboption("showdoc", Value, "showdoc_item_id", translate(" ID"))
s:tab("content", translate("推送内容"))
s:tab("crontab", translate("定时推"))
s:tab("disturb", translate("免打扰"))
s.addremove = false
s.anonymous = true
@@ -37,13 +32,13 @@ a.rmempty = true
a = s:taboption("basic", MultiValue, "lite_enable", translate("精简模式"))
a:value("device", translate("精简当前设备列表"))
a:value("nowtime", translate("精简当前时间"))
a:value("content", translate("<EFBFBD><EFBFBD>?))
a:value("content", translate("只推送标题"))
a.widget = "checkbox"
a.default = nil
a.optional = true
--推送模<EFBFBD><EFBFBD>?
a=s:taboption("basic", ListValue,"jsonpath",translate("推送模<EFBFBD><EFBFBD>?))
--推送模
a=s:taboption("basic", ListValue,"jsonpath",translate("推送模"))
a.default="/usr/bin/pushbot/api/dingding.json"
a.rmempty = true
a:value("/usr/bin/pushbot/api/dingding.json",translate("钉钉"))
@@ -52,13 +47,13 @@ a:value("/usr/bin/pushbot/api/feishu.json",translate("飞书"))
a:value("/usr/bin/pushbot/api/bark.json",translate("Bark"))
a:value("/usr/bin/pushbot/api/pushplus.json",translate("PushPlus"))
a:value("/usr/bin/pushbot/api/pushdeer.json",translate("PushDeer"))
a:value("/usr/bin/pushbot/api/diy.json",translate("<EFBFBD><EFBFBD>?))
a:value("/usr/bin/pushbot/api/diy.json",translate("自定义推送"))
a=s:taboption("basic", Value,"dd_webhook",translate('Webhook'), translate("钉钉机器<EFBFBD><EFBFBD>?Webhook").."只输入access_token=后面的即<EFBFBD><EFBFBD>?br>调用代码获取<a href='https://developers.dingtalk.com/document/robots/custom-robot-access' target='_blank'>点击这里</a><br><br>")
a=s:taboption("basic", Value,"dd_webhook",translate('Webhook'), translate("钉钉机器Webhook").."只输入access_token=后面的即可<br>调用代码获取<a href='https://developers.dingtalk.com/document/robots/custom-robot-access' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/dingding.json")
a=s:taboption("basic", Value, "we_webhook", translate("Webhook"),translate("企业微信机器<EFBFBD><EFBFBD>?Webhook").."只输入key=后面的即<EFBFBD><EFBFBD>?br>调用代码获取<a href='https://work.weixin.qq.com/api/doc/90000/90136/91770' target='_blank'>点击这里</a><br><br>")
a=s:taboption("basic", Value, "we_webhook", translate("Webhook"),translate("企业微信机器Webhook").."只输入key=后面的即可<br>调用代码获取<a href='https://work.weixin.qq.com/api/doc/90000/90136/91770' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/ent_wechat.json")
@@ -69,24 +64,24 @@ a:depends("jsonpath","/usr/bin/pushbot/api/pushplus.json")
a=s:taboption("basic", ListValue,"pp_channel",translate('PushPlus Channel'))
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushplus.json")
a:value("wechat",translate("wechatPushPlus微信公众<EFBFBD><EFBFBD>?))
a:value("cp",translate("cp<EFBFBD><EFBFBD>?))
a:value("wechat",translate("wechatPushPlus微信公众"))
a:value("cp",translate("cp:企业微信应用"))
a:value("webhook",translate("webhook第三方webhook"))
a:value("sms",translate("sms<EFBFBD><EFBFBD>?))
a:value("mail",translate("mail<EFBFBD><EFBFBD>?))
a.description = translate("第三方webhook企业微信、钉钉、飞书、server<EFBFBD><EFBFBD>?br>sms短信/mail邮箱PushPlus暂未开<EFBFBD><EFBFBD>?br>具体channel设定参见<EFBFBD><EFBFBD>?a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a>")
a:value("sms",translate("sms"))
a:value("mail",translate("mail:邮箱"))
a.description = translate("第三方webhook企业微信、钉钉、飞书、server酱<br>sms短信/mail邮箱PushPlus暂未开放<br>具体channel设定参见<a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a>")
a=s:taboption("basic", Value,"pp_webhook",translate('PushPlus Custom Webhook'), translate("PushPlus 自定义Webhook").."<br>第三方webhook或企业微信调<EFBFBD><EFBFBD>?br>具体自定义Webhook设定参见<EFBFBD><EFBFBD>?a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a><br><br>")
a=s:taboption("basic", Value,"pp_webhook",translate('PushPlus Custom Webhook'), translate("PushPlus 自定义Webhook").."<br>第三方webhook或企业微信调用<br>具体自定义Webhook设定参见<a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("pp_channel","cp")
a:depends("pp_channel","webhook")
a=s:taboption("basic", Flag,"pp_topic_enable",translate("PushPlus 一对多推<EFBFBD><EFBFBD>?))
a=s:taboption("basic", Flag,"pp_topic_enable",translate("PushPlus 一对多推"))
a.default=0
a.rmempty = true
a:depends("pp_channel","wechat")
a=s:taboption("basic", Value,"pp_topic",translate('PushPlus Topic'), translate("PushPlus ").."<br><EFBFBD><EFBFBD>?br>Topic设定参见<EFBFBD><EFBFBD>?a href='http://www.pushplus.plus/push2.html' target='_blank'></a><br><br>")
a=s:taboption("basic", Value,"pp_topic",translate('PushPlus Topic'), translate("PushPlus 群组编").."<br>一对多推送时指定的群组编码<br>具体群组编码Topic设定参见<a href='http://www.pushplus.plus/push2.html' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("pp_topic_enable","1")
@@ -94,7 +89,7 @@ a=s:taboption("basic", Value,"pushdeer_key",translate('PushDeer Key'), translate
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushdeer.json")
a=s:taboption("basic", Flag,"pushdeer_srv_enable",translate(" PushDeer <EFBFBD><EFBFBD>?))
a=s:taboption("basic", Flag,"pushdeer_srv_enable",translate("自建 PushDeer 服务器"))
a.default=0
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushdeer.json")
@@ -111,7 +106,7 @@ a=s:taboption("basic", Value,"bark_token",translate('Bark Token'), translate("Ba
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", Flag,"bark_srv_enable",translate("自建 Bark 服务<EFBFBD><EFBFBD>?))
a=s:taboption("basic", Flag,"bark_srv_enable",translate("自建 Bark 服务"))
a.default=0
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
@@ -120,7 +115,7 @@ a=s:taboption("basic", Value,"bark_srv",translate('Bark Server'), translate("Bar
a.rmempty = true
a:depends("bark_srv_enable","1")
a=s:taboption("basic", Value,"bark_sound",translate('Bark Sound'), translate("Bark ").."<br>silence.caf<br><EFBFBD><EFBFBD>?a href='https://github.com/Finb/Bark/tree/master/Sounds' target='_blank'></a><br><br>")
a=s:taboption("basic", Value,"bark_sound",translate('Bark Sound'), translate("Bark 通知声").."<br>如silence.caf<br>具体设定参见:<a href='https://github.com/Finb/Bark/tree/master/Sounds' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a.default = "silence.caf"
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
@@ -130,17 +125,17 @@ a.default=0
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", Value,"bark_icon",translate('Bark Icon'), translate("Bark ").."(<EFBFBD><EFBFBD>?iOS15 <EFBFBD><EFBFBD>?<br>http://day.app/assets/images/avatar.jpg<br><EFBFBD><EFBFBD>?a href='https://github.com/Finb/Bark#%E5%85%B6%E4%BB%96%E5%8F%82%E6%95%B0' target='_blank'></a><br><br>")
a=s:taboption("basic", Value,"bark_icon",translate('Bark Icon'), translate("Bark 通知图").."(仅 iOS15 或以上支持)<br>如http://day.app/assets/images/avatar.jpg<br>具体设定参见:<a href='https://github.com/Finb/Bark#%E5%85%B6%E4%BB%96%E5%8F%82%E6%95%B0' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a.default = "http://day.app/assets/images/avatar.jpg"
a:depends("bark_icon_enable","1")
a=s:taboption("basic", Value,"bark_level",translate('Bark Level'), translate("Bark ").."<br><br/>active<EFBFBD><EFBFBD>?br/>timeSensitive<EFBFBD><EFBFBD>?br/>passive<EFBFBD><EFBFBD>?)
a=s:taboption("basic", Value,"bark_level",translate('Bark Level'), translate("Bark 时效性通").."<br>可选参数值:<br/>active不设置时的默认值系统会立即亮屏显示通知。<br/>timeSensitive时效性通知可在专注状态下显示通知。<br/>passive仅将通知添加到通知列表不会亮屏提醒。")
a.rmempty = true
a.default = "active"
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", TextValue, "diy_json", translate("自定义推<EFBFBD><EFBFBD>?))
a=s:taboption("basic", TextValue, "diy_json", translate("自定义推"))
a.optional = false
a.rows = 28
a.wrap = "soft"
@@ -152,51 +147,51 @@ a.write = function(self, section, value)
end
a:depends("jsonpath","/usr/bin/pushbot/api/diy.json")
a=s:taboption("basic", Button,"__add",translate("<EFBFBD><EFBFBD>?))
a.inputtitle=translate("<EFBFBD><EFBFBD>?)
a=s:taboption("basic", Button,"__add",translate("发送测试"))
a.inputtitle=translate("")
a.inputstyle = "apply"
function a.write(self, section)
luci.sys.call("cbi.apply")
luci.sys.call("/usr/bin/pushbot/pushbot test &")
end
a=s:taboption("basic", Value,"device_name",translate('本设备名<E5A487><E5908D>?))
a=s:taboption("basic", Value,"device_name",translate('本设备名称'))
a.rmempty = true
a.description = translate("在推送信息标题中会标识本设备名称,用于区分推送信息的来源设备")
a=s:taboption("basic", Value,"sleeptime",translate('检测时间间<E997B4><E997B4>?))
a=s:taboption("basic", Value,"sleeptime",translate('检测时间间隔'))
a.rmempty = true
a.optional = false
a.default = "60"
a.datatype = "and(uinteger,min(10))"
a.description = translate("越短的时间时间响应越及时,但会占用更多的系统资源")
a=s:taboption("basic", ListValue,"oui_data",translate("MAC设备信息数据<EFBFBD><EFBFBD>?))
a=s:taboption("basic", ListValue,"oui_data",translate("MAC设备信息数据"))
a.rmempty = true
a.default=""
a:value("",translate("关闭"))
a:value("1",translate("简化版"))
a:value("2",translate("完整<EFBFBD><EFBFBD>?))
a:value("2",translate("完整"))
a:value("3",translate("网络查询"))
a.description = translate(" 4.36m 1.2M<EFBFBD><EFBFBD>?250kb <br/>使<EFBFBD><EFBFBD>?)
a.description = translate("需下载 4.36m 原始数据,处理后完整版约 1.2M,简化版约 250kb <br/>若无梯子,请勿使用网络查询")
a=s:taboption("basic", Flag,"oui_dir",translate("下载到内<EFBFBD><EFBFBD>?))
a=s:taboption("basic", Flag,"oui_dir",translate("下载到内"))
a.rmempty = true
a:depends("oui_data","1")
a:depends("oui_data","2")
a.description = translate("<EFBFBD><EFBFBD>?<br/>")
a.description = translate("懒得做自动更新了,下载到内存中,重启会重新下载 <br/>若无梯子,还是下到机身")
a=s:taboption("basic", Flag,"reset_regularly",translate("每天零点重置流量数据"))
a.rmempty = true
a=s:taboption("basic", Flag,"debuglevel",translate("<EFBFBD><EFBFBD>?))
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/> 请输入设<EFBFBD><EFBFBD>?MAC 和设备别名,用<EFBFBD><EFBFBD>?”隔开,如<EFBFBD><EFBFBD>?br/> XX:XX:XX:XX:XX:XX-我的手机")
a.description = translate("<br/> 请输入设MAC 和设备别名,用“-”隔开,如<br/> XX:XX:XX:XX:XX:XX-我的手机")
--设备状<EFBFBD><EFBFBD>?
--设备状
a=s:taboption("content", ListValue,"pushbot_ipv4",translate("IPv4 变更通知"))
a.rmempty = true
a.default=""
@@ -230,7 +225,7 @@ end
a.write = function(self, section, value)
fs.writefile("/usr/bin/pushbot/api/ipv4.list", value:gsub("\r\n", "\n"))
end
a.description = translate("<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获<EFBFBD><EFBFBD>?IP不推荐使用<br/>从以上列表中随机地址访问")
a.description = translate("<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获IP不推荐使用<br/>从以上列表中随机地址访问")
a:depends({pushbot_ipv4="2"})
a=s:taboption("content", ListValue,"pushbot_ipv6",translate("IPv6 变更通知"))
@@ -266,7 +261,7 @@ end
a.write = function(self, section, value)
fs.writefile("/usr/bin/pushbot/api/ipv6.list", value:gsub("\r\n", "\n"))
end
a.description = translate("<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获<EFBFBD><EFBFBD>?IP不推荐使用<br/>从以上列表中随机地址访问")
a.description = translate("<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获IP不推荐使用<br/>从以上列表中随机地址访问")
a:depends({pushbot_ipv6="2"})
a=s:taboption("content", Flag,"pushbot_up",translate("设备上线通知"))
@@ -281,7 +276,7 @@ a=s:taboption("content", Flag,"cpuload_enable",translate("CPU 负载报警"))
a.default=1
a.rmempty = true
a= s:taboption("content", Value, "cpuload", "负载报警阈<EFBFBD><EFBFBD>?)
a= s:taboption("content", Value, "cpuload", "负载报警阈")
a.default = 2
a.rmempty = true
a:depends({cpuload_enable="1"})
@@ -291,24 +286,24 @@ a.default=1
a.rmempty = true
a.description = translate("请确认设备可以获取温度,如需修改命令,请移步高级设置")
a= s:taboption("content", Value, "temperature", "<EFBFBD><EFBFBD>?)
a= s:taboption("content", Value, "temperature", "温度报警阈值")
a.rmempty = true
a.default = "80"
a.datatype="uinteger"
a:depends({temperature_enable="1"})
a.description = translate("<br/>设备报警只会在连续五分钟超过设定值时才会推<EFBFBD><EFBFBD>?br/>而且一个小时内不会再提醒第二次")
a.description = translate("<br/>设备报警只会在连续五分钟超过设定值时才会推送<br/>而且一个小时内不会再提醒第二次")
a=s:taboption("content", Flag,"client_usage",translate("设备异常流量"))
a.default=0
a.rmempty = true
a= s:taboption("content", Value, "client_usage_max", "每分钟流量限<EFBFBD><EFBFBD>?)
a= s:taboption("content", Value, "client_usage_max", "每分钟流量限")
a.default = "10M"
a.rmempty = true
a:depends({client_usage="1"})
a.description = translate("byte<EFBFBD><EFBFBD>?K <EFBFBD><EFBFBD>?M")
a.description = translate("设备异常流量警报byte你可以追加 K 或者 M")
a=s:taboption("content", Flag,"client_usage_disturb",translate("<EFBFBD><EFBFBD>?))
a=s:taboption("content", Flag,"client_usage_disturb",translate("异常流量免打扰"))
a.default=1
a.rmempty = true
a:depends({client_usage="1"})
@@ -317,7 +312,7 @@ a = s:taboption("content", DynamicList, "client_usage_whitelist", translate("异
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({client_usage_disturb="1"})
a.description = translate("请输入设<EFBFBD><EFBFBD>?MAC")
a.description = translate("请输入设MAC")
--LoginNoti
a=s:taboption("content", Flag,"web_logged",translate("Web 登录提醒"))
@@ -341,7 +336,7 @@ a.default = "3"
a.datatype="and(uinteger,min(1))"
a:depends("web_login_failed","1")
a:depends("ssh_login_failed","1")
a.description = translate("超过次数后推送提<EFBFBD><EFBFBD>?)
a.description = translate("超过次数后推送提")
a=s:taboption("content", Flag,"web_login_black",translate("自动拉黑"))
a.default=0
@@ -350,13 +345,13 @@ a:depends("web_login_failed","1")
a:depends("ssh_login_failed","1")
a.description = translate("直到重启前都不会重置次数,请先添加白名单")
a= s:taboption("content", Value, "ip_black_timeout", "(<EFBFBD><EFBFBD>?")
a= s:taboption("content", Value, "ip_black_timeout", "拉黑时间(秒)")
a.default = "86400"
a.datatype="and(uinteger,min(0))"
a:depends("web_login_black","1")
a.description = translate("0 为永久拉黑,慎用<br>如不幸误操作,请更改设备 IP 进入 LUCI 界面清空规则")
a=s:taboption("content", DynamicList, "ip_white_list", translate("<EFBFBD><EFBFBD>?IP "))
a=s:taboption("content", DynamicList, "ip_white_list", translate("白名单 IP 列表"))
a.datatype = "ipaddr"
a.rmempty = true
luci.ip.neighbors({family = 4}, function(entry)
@@ -370,7 +365,7 @@ a:depends("web_login_failed","1")
a:depends("ssh_login_failed","1")
a.description = translate("忽略白名单登陆提醒和拉黑操作,暂不支持掩码位表示")
a=s:taboption("content", TextValue, "ip_black_list", translate("IP <EFBFBD><EFBFBD>?))
a=s:taboption("content", TextValue, "ip_black_list", translate("IP 黑名单列表"))
a.optional = false
a.rows = 8
a.wrap = "soft"
@@ -382,45 +377,45 @@ a.write = function(self, section, value)
end
a:depends("web_login_black","1")
--定时推<EFBFBD><EFBFBD>?
--定时推
a=s:taboption("crontab", ListValue,"crontab",translate("定时任务设定"))
a.rmempty = true
a.default=""
a:value("",translate("关闭"))
a:value("1",translate("定时发<EFBFBD><EFBFBD>?))
a:value("2",translate("<EFBFBD><EFBFBD>?))
a:value("1",translate("定时发"))
a:value("2",translate("间隔发送"))
a=s:taboption("crontab", ListValue,"regular_time",translate("发送时<EFBFBD><EFBFBD>?))
a=s:taboption("crontab", ListValue,"regular_time",translate("发送时"))
a.rmempty = true
for t=0,23 do
a:value(t,translate(""..t.."<EFBFBD><EFBFBD>?))
a:value(t,translate(""..t..""))
end
a.default=8
a.datatype=uinteger
a:depends("crontab","1")
a=s:taboption("crontab", ListValue,"regular_time_2",translate("发送时<EFBFBD><EFBFBD>?))
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.."<EFBFBD><EFBFBD>?))
a:value(t,translate(""..t..""))
end
a.default="关闭"
a.datatype=uinteger
a:depends("crontab","1")
a=s:taboption("crontab", ListValue,"regular_time_3",translate("发送时<EFBFBD><EFBFBD>?))
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.."<EFBFBD><EFBFBD>?))
a:value(t,translate(""..t..""))
end
a.default="关闭"
a.datatype=uinteger
a:depends("crontab","1")
a=s:taboption("crontab", ListValue,"interval_time",translate("发送间<EFBFBD><EFBFBD>?))
a=s:taboption("crontab", ListValue,"interval_time",translate("发送间"))
a.rmempty = true
for t=1,23 do
a:value(t,translate(t.."小时"))
@@ -428,13 +423,13 @@ end
a.default=6
a.datatype=uinteger
a:depends("crontab","2")
a.description = translate("<br/><EFBFBD><EFBFBD>?00:00 <EFBFBD><EFBFBD>?* <EFBFBD><EFBFBD>?)
a.description = translate("<br/>从 00:00 开始,每 * 小时发送一次")
a= s:taboption("crontab", Value, "send_title", translate("推送标<EFBFBD><EFBFBD>?))
a= s:taboption("crontab", Value, "send_title", translate("推送标"))
a:depends("crontab","1")
a:depends("crontab","2")
a.placeholder = "OpenWrt By tty228 路由状态:"
a.description = translate("<br/>使<EFBFBD><EFBFBD>?)
a.description = translate("<br/>使用特殊符号可能会造成发送失败")
a=s:taboption("crontab", Flag,"router_status",translate("系统运行情况"))
a.default=1
@@ -451,20 +446,20 @@ a.default=1
a:depends("crontab","1")
a:depends("crontab","2")
a=s:taboption("crontab", Flag,"client_list",translate("客户端列<EFBFBD><EFBFBD>?))
a=s:taboption("crontab", Flag,"client_list",translate("客户端列"))
a.default=1
a:depends("crontab","1")
a:depends("crontab","2")
a=s:taboption("crontab", Value,"google_check_timeout",translate("<EFBFBD><EFBFBD>?))
a=s:taboption("crontab", Value,"google_check_timeout",translate("全球互联检测超时时间"))
a.rmempty = true
a.optional = false
a.default = "10"
a.datatype = "and(uinteger,min(3))"
a.description = translate("过短的时间可能导致检测不准确")
e=s:taboption("crontab", Button,"_add",translate("手动发<EFBFBD><EFBFBD>?))
e.inputtitle=translate("<EFBFBD><EFBFBD>?)
e=s:taboption("crontab", Button,"_add",translate("手动发"))
e.inputtitle=translate("发送")
e:depends("crontab","1")
e:depends("crontab","2")
e.inputstyle = "apply"
@@ -473,29 +468,29 @@ luci.sys.call("cbi.apply")
luci.sys.call("/usr/bin/pushbot/pushbot send &")
end
--免打<EFBFBD><EFBFBD>?
a=s:taboption("disturb", ListValue,"pushbot_sheep",translate("免打扰时段设<EFBFBD><EFBFBD>?),translate("<EFBFBD><EFBFBD>?br/><EFBFBD><EFBFBD>?))
--免打
a=s:taboption("disturb", ListValue,"pushbot_sheep",translate("免打扰时段设"),translate("在指定整点时间段内,暂停推送消息<br/>免打扰时间中,定时推送也会被阻止。"))
a.rmempty = true
a:value("",translate("关闭"))
a:value("1",translate("模式一:脚本挂<EFBFBD><EFBFBD>?))
a:value("1",translate("模式一:脚本挂"))
a:value("2",translate("模式二:静默模式"))
a.description = translate("<EFBFBD><EFBFBD>?)
a=s:taboption("disturb", ListValue,"starttime",translate("免打扰开始时<EFBFBD><EFBFBD>?))
a.description = translate("模式一停止一切检测,包括无人值守。")
a=s:taboption("disturb", ListValue,"starttime",translate("免打扰开始时"))
a.rmempty = true
for t=0,23 do
a:value(t,translate(""..t.."<EFBFBD><EFBFBD>?))
a:value(t,translate(""..t..""))
end
a.default=0
a.datatype=uinteger
a:depends({pushbot_sheep="1"})
a:depends({pushbot_sheep="2"})
a=s:taboption("disturb", ListValue,"endtime",translate("免打扰结束时<EFBFBD><EFBFBD>?))
a=s:taboption("disturb", ListValue,"endtime",translate("免打扰结束时"))
a.rmempty = true
for t=0,23 do
a:value(t,translate(""..t.."<EFBFBD><EFBFBD>?))
a:value(t,translate(""..t..""))
end
a.default=8
a.datatype=uinteger
@@ -504,9 +499,9 @@ a:depends({pushbot_sheep="2"})
a=s:taboption("disturb", ListValue,"macmechanism",translate("MAC过滤"))
a:value("",translate("disable"))
a:value("allow",translate("忽略列表内设<EFBFBD><EFBFBD>?))
a:value("block",translate("<EFBFBD><EFBFBD>?))
a:value("interface",translate("仅通知此接口设<EFBFBD><EFBFBD>?))
a:value("allow",translate("忽略列表内设"))
a:value("block",translate("仅通知列表内设备"))
a:value("interface",translate("仅通知此接口设"))
a.rmempty = true
@@ -514,13 +509,13 @@ a = s:taboption("disturb", DynamicList, "pushbot_whitelist", translate("忽略
nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism="allow"})
a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B <EFBFBD><EFBFBD>?MAC <br/>线线<EFBFBD><EFBFBD>?wifi <EFBFBD><EFBFBD>?)
a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户<br/>任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送")
a = s:taboption("disturb", DynamicList, "pushbot_blacklist", translate("关注列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism="block"})
a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多<EFBFBD><EFBFBD>?MAC 视为同一用户<br/>任一设备在线后不再推送,设备全部离线时才会推送,避免<EFBFBD><EFBFBD>?wifi 频繁推<EFBFBD><EFBFBD>?)
a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多MAC 视为同一用户<br/>任一设备在线后不再推送,设备全部离线时才会推送,避免wifi 频繁推")
a = s:taboption("disturb", ListValue, "pushbot_interface", translate("接口名称"))
a:depends({macmechanism="interface"})
@@ -540,24 +535,18 @@ end
a=s:taboption("disturb", ListValue,"macmechanism2",translate("MAC过滤2"))
a:value("",translate("disable"))
a:value("MAC_online",translate("线<EFBFBD><EFBFBD>?))
a:value("MAC_online",translate("列表内任意设备在线时免打扰"))
a:value("MAC_offline",translate("列表内设备都离线后免打扰"))
a.rmempty = true
a = s:taboption("disturb", DynamicList, "MAC_online_list", translate("在线免打扰列<EFBFBD><EFBFBD>?))
a = s:taboption("disturb", DynamicList, "MAC_online_list", translate("在线免打扰列"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism2="MAC_online"})
a = s:taboption("disturb", DynamicList, "MAC_offline_list", translate("线<EFBFBD><EFBFBD>?))
a = s:taboption("disturb", DynamicList, "MAC_offline_list", translate("任意离线免打扰列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism2="MAC_offline"})
s:tab("showdoc", translate("ShowDoc"))
o = s:taboption("showdoc", Flag, "enable_showdoc", translate("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ShowDoc <20><><EFBFBD><EFBFBD>"))
o = s:taboption("showdoc", Value, "showdoc_api_key", translate("API Key"))
o = s:taboption("showdoc", Value, "showdoc_api_token", translate("API Token"))
o = s:taboption("showdoc", Value, "showdoc_item_id", translate("<EFBFBD>ĵ<EFBFBD> ID"))
return m

View File

@@ -1,557 +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("pushbot",translate("PushBot"),
translate("「全能推送」英文名「PushBot」是一款从服务器推送报警信息和日志到各平台的工具。<br>支持钉钉推送企业微信推送PushPlus推送。<br>本插件由tty228/luci-app-serverchan创建然后七年修改为全能推送自用。<br /><br />如果你在使用中遇到问题,请到这里提交:")
.. [[<a href="https://github.com/zzsj0928/luci-app-pushbot" target="_blank">]]
.. translate("github 项目地址")
.. [[</a>]]
)
m:section(SimpleSection).template = "pushbot/pushbot_status"
s=m:section(NamedSection,"pushbot","pushbot",translate(""))
s:tab("basic", translate("基本设置"))
s:tab("content", translate("推送内容"))
s:tab("crontab", translate("定时推送"))
s:tab("disturb", translate("免打扰"))
s:tab("showdoc", translate("ShowDoc"))
o = s:taboption("showdoc", Flag, "enable_showdoc", translate("启用 ShowDoc 推送"))
o = s:taboption("showdoc", Value, "showdoc_api_key", translate("API Key"))
o = s:taboption("showdoc", Value, "showdoc_api_token", translate("API Token"))
o = s:taboption("showdoc", Value, "showdoc_item_id", translate("文档 ID"))
s.addremove = false
s.anonymous = true
--基本设置
a=s:taboption("basic", Flag,"pushbot_enable",translate("启用"))
a.default=0
a.rmempty = true
--精简模式
a = s:taboption("basic", MultiValue, "lite_enable", translate("精简模式"))
a:value("device", translate("精简当前设备列表"))
a:value("nowtime", translate("精简当前时间"))
a:value("content", translate("只推送标题"))
a.widget = "checkbox"
a.default = nil
a.optional = true
--推送模式
a=s:taboption("basic", ListValue,"jsonpath",translate("推送模式"))
a.default="/usr/bin/pushbot/api/dingding.json"
a.rmempty = true
a:value("/usr/bin/pushbot/api/dingding.json",translate("钉钉"))
a:value("/usr/bin/pushbot/api/ent_wechat.json",translate("企业微信"))
a:value("/usr/bin/pushbot/api/feishu.json",translate("飞书"))
a:value("/usr/bin/pushbot/api/bark.json",translate("Bark"))
a:value("/usr/bin/pushbot/api/pushplus.json",translate("PushPlus"))
a:value("/usr/bin/pushbot/api/pushdeer.json",translate("PushDeer"))
a:value("/usr/bin/pushbot/api/diy.json",translate("自定义推送"))
a=s:taboption("basic", Value,"dd_webhook",translate('Webhook'), translate("钉钉机器人 Webhook").."只输入access_token=后面的即可<br>调用代码获取<a href='https://developers.dingtalk.com/document/robots/custom-robot-access' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/dingding.json")
a=s:taboption("basic", Value, "we_webhook", translate("Webhook"),translate("企业微信机器人 Webhook").."只输入key=后面的即可<br>调用代码获取<a href='https://work.weixin.qq.com/api/doc/90000/90136/91770' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/ent_wechat.json")
a=s:taboption("basic", Value,"pp_token",translate('PushPlus Token'), translate("PushPlus Token").."<br>调用代码获取<a href='http://pushplus.plus/doc/' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushplus.json")
a=s:taboption("basic", ListValue,"pp_channel",translate('PushPlus Channel'))
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushplus.json")
a:value("wechat",translate("wechatPushPlus微信公众号"))
a:value("cp",translate("cp企业微信应用"))
a:value("webhook",translate("webhook第三方webhook"))
a:value("sms",translate("sms短信"))
a:value("mail",translate("mail邮箱"))
a.description = translate("第三方webhook企业微信、钉钉、飞书、server酱<br>sms短信/mail邮箱PushPlus暂未开放<br>具体channel设定参见<a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a>")
a=s:taboption("basic", Value,"pp_webhook",translate('PushPlus Custom Webhook'), translate("PushPlus 自定义Webhook").."<br>第三方webhook或企业微信调用<br>具体自定义Webhook设定参见<a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("pp_channel","cp")
a:depends("pp_channel","webhook")
a=s:taboption("basic", Flag,"pp_topic_enable",translate("PushPlus 一对多推送"))
a.default=0
a.rmempty = true
a:depends("pp_channel","wechat")
a=s:taboption("basic", Value,"pp_topic",translate('PushPlus Topic'), translate("PushPlus 群组编码").."<br>一对多推送时指定的群组编码<br>具体群组编码Topic设定参见<a href='http://www.pushplus.plus/push2.html' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("pp_topic_enable","1")
a=s:taboption("basic", Value,"pushdeer_key",translate('PushDeer Key'), translate("PushDeer Key").."<br>调用代码获取<a href='http://www.pushdeer.com/' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushdeer.json")
a=s:taboption("basic", Flag,"pushdeer_srv_enable",translate("自建 PushDeer 服务器"))
a.default=0
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/pushdeer.json")
a=s:taboption("basic", Value,"pushdeer_srv",translate('PushDeer Server'), translate("PushDeer 自建服务器地址").."<br>如https://your.domain:port<br>具体自建服务器设定参见:<a href='http://www.pushdeer.com/selfhosted.html' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("pushdeer_srv_enable","1")
a=s:taboption("basic", Value,"fs_webhook",translate('WebHook'), translate("飞书 WebHook").."<br>调用代码获取<a href='https://www.feishu.cn/hc/zh-CN/articles/360024984973' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/feishu.json")
a=s:taboption("basic", Value,"bark_token",translate('Bark Token'), translate("Bark Token").."<br>调用代码获取<a href='https://github.com/Finb/Bark' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", Flag,"bark_srv_enable",translate("自建 Bark 服务器"))
a.default=0
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", Value,"bark_srv",translate('Bark Server'), translate("Bark 自建服务器地址").."<br>如https://your.domain:port<br>具体自建服务器设定参见:<a href='https://github.com/Finb/Bark' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a:depends("bark_srv_enable","1")
a=s:taboption("basic", Value,"bark_sound",translate('Bark Sound'), translate("Bark 通知声音").."<br>如silence.caf<br>具体设定参见:<a href='https://github.com/Finb/Bark/tree/master/Sounds' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a.default = "silence.caf"
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", Flag,"bark_icon_enable",translate(" Bark 通知图标"))
a.default=0
a.rmempty = true
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", Value,"bark_icon",translate('Bark Icon'), translate("Bark 通知图标").."(仅 iOS15 或以上支持)<br>如http://day.app/assets/images/avatar.jpg<br>具体设定参见:<a href='https://github.com/Finb/Bark#%E5%85%B6%E4%BB%96%E5%8F%82%E6%95%B0' target='_blank'>点击这里</a><br><br>")
a.rmempty = true
a.default = "http://day.app/assets/images/avatar.jpg"
a:depends("bark_icon_enable","1")
a=s:taboption("basic", Value,"bark_level",translate('Bark Level'), translate("Bark 时效性通知").."<br>可选参数值:<br/>active不设置时的默认值系统会立即亮屏显示通知。<br/>timeSensitive时效性通知可在专注状态下显示通知。<br/>passive仅将通知添加到通知列表不会亮屏提醒。")
a.rmempty = true
a.default = "active"
a:depends("jsonpath","/usr/bin/pushbot/api/bark.json")
a=s:taboption("basic", TextValue, "diy_json", translate("自定义推送"))
a.optional = false
a.rows = 28
a.wrap = "soft"
a.cfgvalue = function(self, section)
return fs.readfile("/usr/bin/pushbot/api/diy.json")
end
a.write = function(self, section, value)
fs.writefile("/usr/bin/pushbot/api/diy.json", value:gsub("\r\n", "\n"))
end
a:depends("jsonpath","/usr/bin/pushbot/api/diy.json")
a=s:taboption("basic", Button,"__add",translate("发送测试"))
a.inputtitle=translate("发送")
a.inputstyle = "apply"
function a.write(self, section)
luci.sys.call("cbi.apply")
luci.sys.call("/usr/bin/pushbot/pushbot test &")
end
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.datatype = "and(uinteger,min(10))"
a.description = translate("越短的时间时间响应越及时,但会占用更多的系统资源")
a=s:taboption("basic", ListValue,"oui_data",translate("MAC设备信息数据库"))
a.rmempty = true
a.default=""
a:value("",translate("关闭"))
a:value("1",translate("简化版"))
a:value("2",translate("完整版"))
a:value("3",translate("网络查询"))
a.description = translate("需下载 4.36m 原始数据,处理后完整版约 1.2M,简化版约 250kb <br/>若无梯子,请勿使用网络查询")
a=s:taboption("basic", Flag,"oui_dir",translate("下载到内存"))
a.rmempty = true
a:depends("oui_data","1")
a:depends("oui_data","2")
a.description = translate("懒得做自动更新了,下载到内存中,重启会重新下载 <br/>若无梯子,还是下到机身吧")
a=s:taboption("basic", Flag,"reset_regularly",translate("每天零点重置流量数据"))
a.rmempty = true
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,"pushbot_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({pushbot_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", TextValue, "ipv4_list", translate("IPv4 API列表"))
a.optional = false
a.rows = 8
a.wrap = "soft"
a.cfgvalue = function(self, section)
return fs.readfile("/usr/bin/pushbot/api/ipv4.list")
end
a.write = function(self, section, value)
fs.writefile("/usr/bin/pushbot/api/ipv4.list", value:gsub("\r\n", "\n"))
end
a.description = translate("<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获取 IP不推荐使用<br/>从以上列表中随机地址访问")
a:depends({pushbot_ipv4="2"})
a=s:taboption("content", ListValue,"pushbot_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({pushbot_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", TextValue, "ipv6_list", translate("IPv6 API列表"))
a.optional = false
a.rows = 8
a.wrap = "soft"
a.cfgvalue = function(self, section)
return fs.readfile("/usr/bin/pushbot/api/ipv6.list")
end
a.write = function(self, section, value)
fs.writefile("/usr/bin/pushbot/api/ipv6.list", value:gsub("\r\n", "\n"))
end
a.description = translate("<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获取 IP不推荐使用<br/>从以上列表中随机地址访问")
a:depends({pushbot_ipv6="2"})
a=s:taboption("content", Flag,"pushbot_up",translate("设备上线通知"))
a.default=1
a.rmempty = true
a=s:taboption("content", Flag,"pushbot_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=1
a.rmempty = true
a.description = translate("请确认设备可以获取温度,如需修改命令,请移步高级设置")
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("content", Flag,"client_usage",translate("设备异常流量"))
a.default=0
a.rmempty = true
a= s:taboption("content", Value, "client_usage_max", "每分钟流量限制")
a.default = "10M"
a.rmempty = true
a:depends({client_usage="1"})
a.description = translate("设备异常流量警报byte你可以追加 K 或者 M")
a=s:taboption("content", Flag,"client_usage_disturb",translate("异常流量免打扰"))
a.default=1
a.rmempty = true
a:depends({client_usage="1"})
a = s:taboption("content", DynamicList, "client_usage_whitelist", translate("异常流量关注列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({client_usage_disturb="1"})
a.description = translate("请输入设备 MAC")
--LoginNoti
a=s:taboption("content", Flag,"web_logged",translate("Web 登录提醒"))
a.default=0
a.rmempty = true
a=s:taboption("content", Flag,"ssh_logged",translate("SSH 登录提醒"))
a.default=0
a.rmempty = true
a=s:taboption("content", Flag,"web_login_failed",translate("Web 错误尝试提醒"))
a.default=0
a.rmempty = true
a=s:taboption("content", Flag,"ssh_login_failed",translate("SSH 错误尝试提醒"))
a.default=0
a.rmempty = true
a= s:taboption("content", Value, "login_max_num", "错误尝试次数")
a.default = "3"
a.datatype="and(uinteger,min(1))"
a:depends("web_login_failed","1")
a:depends("ssh_login_failed","1")
a.description = translate("超过次数后推送提醒")
a=s:taboption("content", Flag,"web_login_black",translate("自动拉黑"))
a.default=0
a.rmempty = true
a:depends("web_login_failed","1")
a:depends("ssh_login_failed","1")
a.description = translate("直到重启前都不会重置次数,请先添加白名单")
a= s:taboption("content", Value, "ip_black_timeout", "拉黑时间(秒)")
a.default = "86400"
a.datatype="and(uinteger,min(0))"
a:depends("web_login_black","1")
a.description = translate("0 为永久拉黑,慎用<br>如不幸误操作,请更改设备 IP 进入 LUCI 界面清空规则")
a=s:taboption("content", DynamicList, "ip_white_list", translate("白名单 IP 列表"))
a.datatype = "ipaddr"
a.rmempty = true
luci.ip.neighbors({family = 4}, function(entry)
if entry.reachable then
a:value(entry.dest:string())
end
end)
a:depends("web_logged","1")
a:depends("ssh_logged","1")
a:depends("web_login_failed","1")
a:depends("ssh_login_failed","1")
a.description = translate("忽略白名单登陆提醒和拉黑操作,暂不支持掩码位表示")
a=s:taboption("content", TextValue, "ip_black_list", translate("IP 黑名单列表"))
a.optional = false
a.rows = 8
a.wrap = "soft"
a.cfgvalue = function(self, section)
return fs.readfile("/usr/bin/pushbot/api/ip_blacklist")
end
a.write = function(self, section, value)
fs.writefile("/usr/bin/pushbot/api/ip_blacklist", value:gsub("\r\n", "\n"))
end
a:depends("web_login_black","1")
--定时推送
a=s:taboption("crontab", ListValue,"crontab",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("crontab","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("crontab","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("crontab","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("crontab","2")
a.description = translate("<br/>从 00:00 开始,每 * 小时发送一次")
a= s:taboption("crontab", Value, "send_title", translate("推送标题"))
a:depends("crontab","1")
a:depends("crontab","2")
a.placeholder = "OpenWrt By tty228 路由状态:"
a.description = translate("<br/>使用特殊符号可能会造成发送失败")
a=s:taboption("crontab", Flag,"router_status",translate("系统运行情况"))
a.default=1
a:depends("crontab","1")
a:depends("crontab","2")
a=s:taboption("crontab", Flag,"router_temp",translate("设备温度"))
a.default=1
a:depends("crontab","1")
a:depends("crontab","2")
a=s:taboption("crontab", Flag,"router_wan",translate("WAN信息"))
a.default=1
a:depends("crontab","1")
a:depends("crontab","2")
a=s:taboption("crontab", Flag,"client_list",translate("客户端列表"))
a.default=1
a:depends("crontab","1")
a:depends("crontab","2")
a=s:taboption("crontab", Value,"google_check_timeout",translate("全球互联检测超时时间"))
a.rmempty = true
a.optional = false
a.default = "10"
a.datatype = "and(uinteger,min(3))"
a.description = translate("过短的时间可能导致检测不准确")
e=s:taboption("crontab", Button,"_add",translate("手动发送"))
e.inputtitle=translate("发送")
e:depends("crontab","1")
e:depends("crontab","2")
e.inputstyle = "apply"
function e.write(self, section)
luci.sys.call("cbi.apply")
luci.sys.call("/usr/bin/pushbot/pushbot send &")
end
--免打扰
a=s:taboption("disturb", ListValue,"pushbot_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({pushbot_sheep="1"})
a:depends({pushbot_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({pushbot_sheep="1"})
a:depends({pushbot_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, "pushbot_whitelist", translate("忽略列表"))
nt.mac_hints(function(mac, name) a :value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism="allow"})
a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户<br/>任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送")
a = s:taboption("disturb", DynamicList, "pushbot_blacklist", translate("关注列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism="block"})
a.description = translate("AA:AA:AA:AA:AA:AA\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户<br/>任一设备在线后不再推送,设备全部离线时才会推送,避免双 wifi 频繁推送")
a = s:taboption("disturb", ListValue, "pushbot_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
a=s:taboption("disturb", ListValue,"macmechanism2",translate("MAC过滤2"))
a:value("",translate("disable"))
a:value("MAC_online",translate("列表内任意设备在线时免打扰"))
a:value("MAC_offline",translate("列表内设备都离线后免打扰"))
a.rmempty = true
a = s:taboption("disturb", DynamicList, "MAC_online_list", translate("在线免打扰列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism2="MAC_online"})
a = s:taboption("disturb", DynamicList, "MAC_offline_list", translate("任意离线免打扰列表"))
nt.mac_hints(function(mac, name) a:value(mac, "%s (%s)" %{ mac, name }) end)
a.rmempty = true
a:depends({macmechanism2="MAC_offline"})
return m

View File

@@ -107,23 +107,6 @@ function diy_send(){
curl -X POST -H "$content_type" -d "${data}" "${diyurl}"
}
# ---------- ShowDoc ----------
send_to_showdoc(){
local api_key=$(uci -q get pushbot.pushbot.showdoc_api_key)
local api_token=$(uci -q get pushbot.pushbot.showdoc_api_token)
local item_id=$(uci -q get pushbot.pushbot.showdoc_item_id)
[ -z "$api_key" -o -z "$api_token" -o -z "$item_id" ] && return 0
# 把 title + content 合并成 Markdown
local doc_content="## $title$str_linefeed$content"
doc_content=$(echo "$doc_content" | sed 's/\r//g; s/"/\\"/g; s/'"'/\\'"'/g')
curl -s -X POST "https://www.showdoc.com.cn/server/api/item/updateByApi" \
-d "api_key=$api_key" \
-d "api_token=$api_token" \
-d "item_id=$item_id" \
-d "content=$doc_content" >/dev/null 2>&1
}
# 下载设备MAC厂商信息
function down_oui(){
[ -f ${oui_base} ] && local logrow=$(grep -c "" ${oui_base}) || local logrow="0"
@@ -1194,7 +1177,6 @@ function send(){
[ ! -z "$device_name" ] && local send_title="【$device_name】${send_title}"
[ -z "$send_content" ] && local send_content="${str_splitline}${str_title_start} 我遇到了一个难题${str_title_end}${str_linefeed}${str_tab}定时发送选项错误,你没有选择需要发送的项目,该怎么办呢${str_splitline}"
[ "$disturb" -eq 0 ] && [ "$(uci -q get pushbot.pushbot.enable_showdoc)" = "1" ] && send_to_showdoc "$title" "$content"
[ "$send_disturb" -eq "0" ] && diy_send "${send_title}" "${send_content}" "${jsonpath}" >/dev/null 2>&1
[ $? -eq 1 ] && echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】定时推送失败,请检查网络或设置信息" >> ${logfile} || echo "`date "+%Y-%m-%d %H:%M:%S"` ${disturb_text}定时推送任务完成" >> ${logfile}
deltemp

View File

@@ -222,16 +222,27 @@ return view.extend({
o.rmempty = false;
o.depends('jsonpath', '/usr/share/wechatpush/api/pushplus.json');
o = s.taboption('basic', form.Value, 'tg_token', _('TG_token'));
o = s.taboption('basic', form.Value, 'tg_token', _('Bot Token'));
o.description = _('Get Bot') + ' <a href="https://t.me/BotFather" target="_blank">' + _('Click here') + '</a>' + _('<br />Send a message to the created bot to initiate a conversation.');
o.rmempty = false;
o.depends('jsonpath', '/usr/share/wechatpush/api/telegram.json');
o = s.taboption('basic', form.Value, 'chat_id', _('TG_chatid'));
o = s.taboption('basic', form.Value, 'tg_chat_id', _('Chat ID'));
o.description = _('Get chat_id') + ' <a href="https://t.me/getuserIDbot" target="_blank">' + _('Click here') + '</a>' + _('<br />If you want to send to a group/channel, please create a non-Chinese group/channel (for easier chatid lookup, you can rename it later).<br />Add the bot to the group, send a message, and use https://api.telegram.org/bot token /getUpdates to obtain the chatid.');
o.rmempty = false;
o.depends('jsonpath', '/usr/share/wechatpush/api/telegram.json');
o = s.taboption('basic', form.Value, 'tg_thread_id', _('Message Thread ID'));
o.description = _('Optional: specify a thread (topic) ID for forum-style Telegram chats.');
o.rmempty = false;
o.optional = true;
o.depends('jsonpath', '/usr/share/wechatpush/api/telegram.json');
o = s.taboption('basic', form.Value, 'tg_api_server', _('API Server URL'));
o.placeholder = 'https://api.telegram.org';
o.rmempty = false;
o.depends('jsonpath', '/usr/share/wechatpush/api/telegram.json');
o = s.taboption('basic', form.Value, 'recipient_email', _('Recipient Email Address'));
o.depends('jsonpath', '/usr/share/wechatpush/api/msmtp.json');
o.rmempty = false;

View File

@@ -210,6 +210,18 @@ msgstr "<br />与创建的机器人发一条消息,开启对话"
msgid "Get chat_id"
msgstr "获取 chat_id"
#: applications/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js:235
msgid "Optional: specify a thread (topic) ID for forum-style Telegram chats."
msgstr "可选:用于论坛式 Telegram 群的主题 ID。"
#: applications/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js:241
msgid "TG API Server"
msgstr "TG API 服务器"
#: applications/luci-app-wechatpush/htdocs/luci-static/resources/view/wechatpush/config.js:242
msgid "Override the Telegram API endpoint (scheme + host only), e.g. https://your-telegram-proxy.example"
msgstr "自定义 Telegram API 地址仅填写协议和主机例如https://your-telegram-proxy.example"
msgid "Recipient Email Address"
msgstr "收件邮箱地址"

View File

@@ -6,4 +6,6 @@ config wechatpush "config"
option up_timeout '2'
option down_timeout '10'
option timeout_retry_count '2'
option thread_num '3'
option thread_num '3'
option tg_api_server 'https://api.telegram.org'
option tg_chat_id ''

View File

@@ -18,13 +18,13 @@
"_type":
{
"_readme": "下文中text 为 telegram 推送需要的键值名称,参见 telegram 官方文档,后面的内容为生成标题所需要的字符串和变量,${1} 为标题内容变量,${nowtime} 为推送时间,${2} 为推送内容变量",
"_readme": "下文中chat_id 为 telegram 推送需要的键值名称,参见 telegram 官方文档,${chat_id} 为从脚本配置中读取名为 chat_id 的变量,其实就是你填写的机器人的 chat_id ",
"_readme": "下文中chat_id 为 telegram 推送需要的键值名称,参见 telegram 官方文档,${tg_chat_id} 为从脚本配置中读取名为 tg_chat_id 的变量,其实就是你填写的机器人的 chat_id ",
"_readme": "type 对象因为需要转义变量,前后必须使用 斜杠+双引号 转义",
"_readme": "参照上文说明,填写下文相关参数"
},
"_//": "-------------------------------------------------------------------------------",
"url": "https://api.telegram.org/bot${tg_token}/sendMessage",
"url": "${tg_api_server}/bot${tg_token}/sendMessage",
"data": "@${tempjsonpath}",
"content_type": "Content-Type: application/json",
"str_title_start": "<b>",
@@ -36,7 +36,7 @@
"type":
{
"text":"\"${str_title_start}${1}${str_title_end}${str_splitline}${nowtime}${2}\"",
"chat_id":"\"${chat_id}\"",
"chat_id":"\"${tg_chat_id}\"",
"parse_mode":"\"HTML\""
}
}

View File

@@ -2,7 +2,7 @@
"_api": "这是 telegram api 文件",
"_api": "【telegram】",
"url": "https://api.telegram.org/bot${tg_token}/sendMessage",
"url": "${tg_api_server}/bot${tg_token}/sendMessage",
"data": "@${tempjsonpath}",
"content_type": "Content-Type: application/json",
"str_title_start": "<b>",
@@ -14,7 +14,8 @@
"type":
{
"text":"\"${str_title_start}${1}${str_title_end}${str_splitline}${nowtime}${2}\"",
"chat_id":"\"${chat_id}\"",
"chat_id":"\"${tg_chat_id}\"",
"message_thread_id":"\"${tg_thread_id}\"",
"parse_mode":"\"HTML\""
}
}

View File

@@ -44,7 +44,7 @@ wait_and_cat() {
read_config() {
get_config \
"enable" "lite_enable" "device_name" "proxy_address" "sleeptime" "oui_data" "reset_regularly" "debuglevel" "lang" \
"jsonpath" "sckey" "sc3key" "sc3uid" "sc3tags" "corpid" "userid" "agentid" "corpsecret" "mediapath" "wxpusher_apptoken" "wxpusher_uids" "wxpusher_topicIds" "pushplus_token" "tg_token" "chat_id" "recipient_email" "smtp_host" "smtp_port" "smtp_tls" "smtp_starttls" "smtp_user" "smtp_passwordeval" "smtp_from" "smtp_from_full_name" \
"jsonpath" "sckey" "sc3key" "sc3uid" "sc3tags" "corpid" "userid" "agentid" "corpsecret" "mediapath" "wxpusher_apptoken" "wxpusher_uids" "wxpusher_topicIds" "pushplus_token" "tg_api_server" "tg_token" "tg_chat_id" "tg_thread_id" "recipient_email" "smtp_host" "smtp_port" "smtp_tls" "smtp_starttls" "smtp_user" "smtp_passwordeval" "smtp_from" "smtp_from_full_name" \
"get_ipv4_mode" "ipv4_interface" "get_ipv6_mode" "ipv6_interface" \
"device_notification" "cpu_notification" "cpu_load_threshold" "temperature_threshold" \
"client_usage" "client_usage_max" "client_usage_disturb" "client_usage_whitelist" \