ctcgfw: move LuCI apps to luci feed
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
parent
b335ab8032
commit
8704d4af19
@ -1,58 +0,0 @@
|
||||
# Copyright (C) 2018-2019 Lienol
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-adguardhome
|
||||
PKG_VERSION:=1.8
|
||||
PKG_RELEASE:=12
|
||||
PKG_MAINTAINER:=<https://github.com/rufengsuixing/luci-app-adguardhome>
|
||||
|
||||
LUCI_TITLE:=LuCI app for AdGuardHome
|
||||
LUCI_PKGARCH:=all
|
||||
LUCI_DEPENDS:=+ca-certs +curl +wget-ssl +PACKAGE_$(PKG_NAME)_INCLUDE_binary:adguardhome
|
||||
LUCI_DESCRIPTION:=LuCI support for AdGuardHome
|
||||
|
||||
define Package/$(PKG_NAME)/config
|
||||
config PACKAGE_$(PKG_NAME)_INCLUDE_binary
|
||||
bool "Include Binary File"
|
||||
default y
|
||||
endef
|
||||
|
||||
PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_binary
|
||||
|
||||
define Package/luci-app-adguardhome/conffiles
|
||||
/usr/share/AdGuardHome/links.txt
|
||||
/etc/config/AdGuardHome
|
||||
endef
|
||||
|
||||
define Package/luci-app-adguardhome/postinst
|
||||
#!/bin/sh
|
||||
/etc/init.d/AdGuardHome enable >/dev/null 2>&1
|
||||
enable=$(uci get AdGuardHome.AdGuardHome.enabled 2>/dev/null)
|
||||
if [ "$enable" == "1" ]; then
|
||||
/etc/init.d/AdGuardHome reload
|
||||
fi
|
||||
rm -f /tmp/luci-indexcache
|
||||
rm -f /tmp/luci-modulecache/*
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Package/luci-app-adguardhome/prerm
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
/etc/init.d/AdGuardHome disable
|
||||
/etc/init.d/AdGuardHome stop
|
||||
uci -q batch <<-EOF >/dev/null 2>&1
|
||||
delete ucitrack.@AdGuardHome[-1]
|
||||
commit ucitrack
|
||||
EOF
|
||||
fi
|
||||
exit 0
|
||||
endef
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@ -1,127 +0,0 @@
|
||||
module("luci.controller.AdGuardHome",package.seeall)
|
||||
local fs=require"nixio.fs"
|
||||
local http=require"luci.http"
|
||||
local uci=require"luci.model.uci".cursor()
|
||||
function index()
|
||||
entry({"admin", "services", "AdGuardHome"},alias("admin", "services", "AdGuardHome", "base"),_("AdGuard Home"), 10).dependent = true
|
||||
entry({"admin","services","AdGuardHome","base"},cbi("AdGuardHome/base"),_("Base Setting"),1).leaf = true
|
||||
entry({"admin","services","AdGuardHome","log"},form("AdGuardHome/log"),_("Log"),2).leaf = true
|
||||
entry({"admin","services","AdGuardHome","manual"},cbi("AdGuardHome/manual"),_("Manual Config"),3).leaf = true
|
||||
entry({"admin","services","AdGuardHome","status"},call("act_status")).leaf=true
|
||||
entry({"admin", "services", "AdGuardHome", "check"}, call("check_update"))
|
||||
entry({"admin", "services", "AdGuardHome", "doupdate"}, call("do_update"))
|
||||
entry({"admin", "services", "AdGuardHome", "getlog"}, call("get_log"))
|
||||
entry({"admin", "services", "AdGuardHome", "dodellog"}, call("do_dellog"))
|
||||
entry({"admin", "services", "AdGuardHome", "reloadconfig"}, call("reload_config"))
|
||||
entry({"admin", "services", "AdGuardHome", "gettemplateconfig"}, call("get_template_config"))
|
||||
end
|
||||
function get_template_config()
|
||||
local b
|
||||
local d=""
|
||||
for cnt in io.lines("/tmp/resolv.conf.d/resolv.conf.auto") do
|
||||
b=string.match (cnt,"^[^#]*nameserver%s+([^%s]+)$")
|
||||
if (b~=nil) then
|
||||
d=d.." - "..b.."\n"
|
||||
end
|
||||
end
|
||||
local f=io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+")
|
||||
local tbl = {}
|
||||
local a=""
|
||||
while (1) do
|
||||
a=f:read("*l")
|
||||
if (a=="#bootstrap_dns") then
|
||||
a=d
|
||||
elseif (a=="#upstream_dns") then
|
||||
a=d
|
||||
elseif (a==nil) then
|
||||
break
|
||||
end
|
||||
table.insert(tbl, a)
|
||||
end
|
||||
f:close()
|
||||
http.prepare_content("text/plain; charset=utf-8")
|
||||
http.write(table.concat(tbl, "\n"))
|
||||
end
|
||||
function reload_config()
|
||||
fs.remove("/tmp/AdGuardHometmpconfig.yaml")
|
||||
http.prepare_content("application/json")
|
||||
http.write('')
|
||||
end
|
||||
function act_status()
|
||||
local e={}
|
||||
local binpath=uci:get("AdGuardHome","AdGuardHome","binpath")
|
||||
e.running=luci.sys.call("pgrep "..binpath.." >/dev/null")==0
|
||||
e.redirect=(fs.readfile("/var/run/AdGredir")=="1")
|
||||
http.prepare_content("application/json")
|
||||
http.write_json(e)
|
||||
end
|
||||
function do_update()
|
||||
fs.writefile("/var/run/lucilogpos","0")
|
||||
http.prepare_content("application/json")
|
||||
http.write('')
|
||||
local arg
|
||||
if luci.http.formvalue("force") == "1" then
|
||||
arg="force"
|
||||
else
|
||||
arg=""
|
||||
end
|
||||
if fs.access("/var/run/update_core") then
|
||||
if arg=="force" then
|
||||
luci.sys.exec("kill $(pgrep /usr/share/AdGuardHome/update_core.sh) ; sh /usr/share/AdGuardHome/update_core.sh "..arg.." >/tmp/AdGuardHome_update.log 2>&1 &")
|
||||
end
|
||||
else
|
||||
luci.sys.exec("sh /usr/share/AdGuardHome/update_core.sh "..arg.." >/tmp/AdGuardHome_update.log 2>&1 &")
|
||||
end
|
||||
end
|
||||
function get_log()
|
||||
local logfile=uci:get("AdGuardHome","AdGuardHome","logfile")
|
||||
if (logfile==nil) then
|
||||
http.write("no log available\n")
|
||||
return
|
||||
elseif (logfile=="syslog") then
|
||||
if not fs.access("/var/run/AdGuardHomesyslog") then
|
||||
luci.sys.exec("(/usr/share/AdGuardHome/getsyslog.sh &); sleep 1;")
|
||||
end
|
||||
logfile="/tmp/AdGuardHometmp.log"
|
||||
fs.writefile("/var/run/AdGuardHomesyslog","1")
|
||||
elseif not fs.access(logfile) then
|
||||
http.write("")
|
||||
return
|
||||
end
|
||||
http.prepare_content("text/plain; charset=utf-8")
|
||||
local fdp
|
||||
if fs.access("/var/run/lucilogreload") then
|
||||
fdp=0
|
||||
fs.remove("/var/run/lucilogreload")
|
||||
else
|
||||
fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0
|
||||
end
|
||||
local f=io.open(logfile, "r+")
|
||||
f:seek("set",fdp)
|
||||
local a=f:read(2048000) or ""
|
||||
fdp=f:seek()
|
||||
fs.writefile("/var/run/lucilogpos",tostring(fdp))
|
||||
f:close()
|
||||
http.write(a)
|
||||
end
|
||||
function do_dellog()
|
||||
local logfile=uci:get("AdGuardHome","AdGuardHome","logfile")
|
||||
fs.writefile(logfile,"")
|
||||
http.prepare_content("application/json")
|
||||
http.write('')
|
||||
end
|
||||
function check_update()
|
||||
http.prepare_content("text/plain; charset=utf-8")
|
||||
local fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0
|
||||
local f=io.open("/tmp/AdGuardHome_update.log", "r+")
|
||||
f:seek("set",fdp)
|
||||
local a=f:read(2048000) or ""
|
||||
fdp=f:seek()
|
||||
fs.writefile("/var/run/lucilogpos",tostring(fdp))
|
||||
f:close()
|
||||
if fs.access("/var/run/update_core") then
|
||||
http.write(a)
|
||||
else
|
||||
http.write(a.."\0")
|
||||
end
|
||||
end
|
||||
@ -1,304 +0,0 @@
|
||||
require("luci.sys")
|
||||
require("luci.util")
|
||||
require("io")
|
||||
local m,s,o,o1
|
||||
local fs=require"nixio.fs"
|
||||
local uci=require"luci.model.uci".cursor()
|
||||
local configpath=uci:get("AdGuardHome","AdGuardHome","configpath") or "/etc/AdGuardHome.yaml"
|
||||
local binpath=uci:get("AdGuardHome","AdGuardHome","binpath") or "/usr/bin/AdGuardHome"
|
||||
httpport=uci:get("AdGuardHome","AdGuardHome","httpport") or "3000"
|
||||
m = Map("AdGuardHome", "AdGuard Home")
|
||||
m.description = translate("Free and open source, powerful network-wide ads & trackers blocking DNS server.")
|
||||
m:section(SimpleSection).template = "AdGuardHome/AdGuardHome_status"
|
||||
|
||||
s = m:section(TypedSection, "AdGuardHome")
|
||||
s.anonymous=true
|
||||
s.addremove=false
|
||||
---- enable
|
||||
o = s:option(Flag, "enabled", translate("Enable"))
|
||||
o.default = 0
|
||||
o.optional = false
|
||||
---- httpport
|
||||
o =s:option(Value,"httpport",translate("Browser management port"))
|
||||
o.placeholder=3000
|
||||
o.default=3000
|
||||
o.datatype="port"
|
||||
o.optional = false
|
||||
o.description = translate("<input type=\"button\" style=\"width:210px;border-color:Teal; text-align:center;font-weight:bold;color:Green;\" value=\"AdGuardHome Web:"..httpport.."\" onclick=\"window.open('http://'+window.location.hostname+':"..httpport.."/')\"/>")
|
||||
---- update warning not safe
|
||||
local binmtime=uci:get("AdGuardHome","AdGuardHome","binmtime") or "0"
|
||||
local e=""
|
||||
if not fs.access(configpath) then
|
||||
e=e.." "..translate("no config")
|
||||
end
|
||||
if not fs.access(binpath) then
|
||||
e=e.." "..translate("no core")
|
||||
else
|
||||
local version=uci:get("AdGuardHome","AdGuardHome","version")
|
||||
local testtime=fs.stat(binpath,"mtime")
|
||||
if testtime~=tonumber(binmtime) or version==nil then
|
||||
local tmp=luci.sys.exec(binpath.." --version | grep -m 1 -E 'v[0-9.]+' -o ")
|
||||
version=string.sub(tmp, 1)
|
||||
if version=="" then version="core error" end
|
||||
uci:set("AdGuardHome","AdGuardHome","version",version)
|
||||
uci:set("AdGuardHome","AdGuardHome","binmtime",testtime)
|
||||
uci:save("AdGuardHome")
|
||||
end
|
||||
e=version..e
|
||||
end
|
||||
o=s:option(Button,"restart",translate("Update"))
|
||||
o.inputtitle=translate("Update core version")
|
||||
o.template = "AdGuardHome/AdGuardHome_check"
|
||||
o.showfastconfig=(not fs.access(configpath))
|
||||
o.description=string.format(translate("core version:").."<strong><font id=\"updateversion\" color=\"green\">%s </font></strong>",e)
|
||||
---- port warning not safe
|
||||
local port=luci.sys.exec("awk '/ port:/{printf($2);exit;}' "..configpath.." 2>nul")
|
||||
if (port=="") then port="?" end
|
||||
---- Redirect
|
||||
o = s:option(ListValue, "redirect", port..translate("Redirect"), translate("AdGuardHome redirect mode"))
|
||||
o.placeholder = "none"
|
||||
o:value("none", translate("none"))
|
||||
o:value("dnsmasq-upstream", translate("Run as dnsmasq upstream server"))
|
||||
o:value("redirect", translate("Redirect 53 port to AdGuardHome"))
|
||||
o:value("exchange", translate("Use port 53 replace dnsmasq"))
|
||||
o.default = "none"
|
||||
o.optional = true
|
||||
---- bin path
|
||||
o = s:option(Value, "binpath", translate("Bin Path"), translate("AdGuardHome Bin path if no bin will auto download"))
|
||||
o.default = "/usr/bin/AdGuardHome"
|
||||
o.datatype = "string"
|
||||
o.optional = false
|
||||
o.rmempty=false
|
||||
o.validate=function(self, value)
|
||||
if value=="" then return nil end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
fs.rmdir(value)
|
||||
end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
if (m.message) then
|
||||
m.message =m.message.."\nerror!bin path is a dir"
|
||||
else
|
||||
m.message ="error!bin path is a dir"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return value
|
||||
end
|
||||
--- upx
|
||||
o = s:option(ListValue, "upxflag", translate("use upx to compress bin after download"))
|
||||
o:value("", translate("none"))
|
||||
o:value("-1", translate("compress faster"))
|
||||
o:value("-9", translate("compress better"))
|
||||
o:value("--best", translate("compress best(can be slow for big files)"))
|
||||
o:value("--brute", translate("try all available compression methods & filters [slow]"))
|
||||
o:value("--ultra-brute", translate("try even more compression variants [very slow]"))
|
||||
o.default = ""
|
||||
o.description=translate("bin use less space,but may have compatibility issues")
|
||||
o.rmempty = true
|
||||
---- config path
|
||||
o = s:option(Value, "configpath", translate("Config Path"), translate("AdGuardHome config path"))
|
||||
o.default = "/etc/AdGuardHome.yaml"
|
||||
o.datatype = "string"
|
||||
o.optional = false
|
||||
o.rmempty=false
|
||||
o.validate=function(self, value)
|
||||
if value==nil then return nil end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
fs.rmdir(value)
|
||||
end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
if m.message then
|
||||
m.message =m.message.."\nerror!config path is a dir"
|
||||
else
|
||||
m.message ="error!config path is a dir"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return value
|
||||
end
|
||||
---- work dir
|
||||
o = s:option(Value, "workdir", translate("Work dir"), translate("AdGuardHome work dir include rules,audit log and database"))
|
||||
o.default = "/etc/AdGuardHome"
|
||||
o.datatype = "string"
|
||||
o.optional = false
|
||||
o.rmempty=false
|
||||
o.validate=function(self, value)
|
||||
if value=="" then return nil end
|
||||
if fs.stat(value,"type")=="reg" then
|
||||
if m.message then
|
||||
m.message =m.message.."\nerror!work dir is a file"
|
||||
else
|
||||
m.message ="error!work dir is a file"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
if string.sub(value, -1)=="/" then
|
||||
return string.sub(value, 1, -2)
|
||||
else
|
||||
return value
|
||||
end
|
||||
end
|
||||
---- log file
|
||||
o = s:option(Value, "logfile", translate("Runtime log file"), translate("AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log"))
|
||||
o.datatype = "string"
|
||||
o.rmempty = true
|
||||
o.validate=function(self, value)
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
fs.rmdir(value)
|
||||
end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
if m.message then
|
||||
m.message =m.message.."\nerror!log file is a dir"
|
||||
else
|
||||
m.message ="error!log file is a dir"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return value
|
||||
end
|
||||
---- debug
|
||||
o = s:option(Flag, "verbose", translate("Verbose log"))
|
||||
o.default = 0
|
||||
o.optional = true
|
||||
---- gfwlist
|
||||
local a=luci.sys.call("grep -m 1 -q programadd "..configpath)
|
||||
if (a==0) then
|
||||
a="Added"
|
||||
else
|
||||
a="Not added"
|
||||
end
|
||||
o=s:option(Button,"gfwdel",translate("Del gfwlist"),translate(a))
|
||||
o.optional = true
|
||||
o.inputtitle=translate("Del")
|
||||
o.write=function()
|
||||
luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh del 2>&1")
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome"))
|
||||
end
|
||||
o=s:option(Button,"gfwadd",translate("Add gfwlist"),translate(a))
|
||||
o.optional = true
|
||||
o.inputtitle=translate("Add")
|
||||
o.write=function()
|
||||
luci.sys.exec("sh /usr/share/AdGuardHome/gfw2adg.sh 2>&1")
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome"))
|
||||
end
|
||||
o = s:option(Value, "gfwupstream", translate("Gfwlist upstream dns server"), translate("Gfwlist domain upstream dns service")..translate(a))
|
||||
o.default = "tcp://208.67.220.220:5353"
|
||||
o.datatype = "string"
|
||||
o.optional = true
|
||||
---- chpass
|
||||
o = s:option(Value, "hashpass", translate("Change browser management password"), translate("Press load culculate model and culculate finally save/apply"))
|
||||
o.default = ""
|
||||
o.datatype = "string"
|
||||
o.template = "AdGuardHome/AdGuardHome_chpass"
|
||||
o.optional = true
|
||||
---- upgrade protect
|
||||
o = s:option(MultiValue, "upprotect", translate("Keep files when system upgrade"))
|
||||
o:value("$binpath",translate("core bin"))
|
||||
o:value("$configpath",translate("config file"))
|
||||
o:value("$logfile",translate("log file"))
|
||||
o:value("$workdir/data/sessions.db",translate("sessions.db"))
|
||||
o:value("$workdir/data/stats.db",translate("stats.db"))
|
||||
o:value("$workdir/data/querylog.json",translate("querylog.json"))
|
||||
o:value("$workdir/data/filters",translate("filters"))
|
||||
o.widget = "checkbox"
|
||||
o.default = nil
|
||||
o.optional=true
|
||||
---- wait net on boot
|
||||
o = s:option(Flag, "waitonboot", translate("On boot when network ok restart"))
|
||||
o.default = 1
|
||||
o.optional = true
|
||||
---- backup workdir on shutdown
|
||||
local workdir=uci:get("AdGuardHome","AdGuardHome","workdir") or "/etc/AdGuardHome"
|
||||
o = s:option(MultiValue, "backupfile", translate("Backup workdir files when shutdown"))
|
||||
o1 = s:option(Value, "backupwdpath", translate("Backup workdir path"))
|
||||
local name
|
||||
o:value("filters","filters")
|
||||
o:value("stats.db","stats.db")
|
||||
o:value("querylog.json","querylog.json")
|
||||
o:value("sessions.db","sessions.db")
|
||||
o1:depends ("backupfile", "filters")
|
||||
o1:depends ("backupfile", "stats.db")
|
||||
o1:depends ("backupfile", "querylog.json")
|
||||
o1:depends ("backupfile", "sessions.db")
|
||||
for name in fs.glob(workdir.."/data/*")
|
||||
do
|
||||
name=fs.basename (name)
|
||||
if name~="filters" and name~="stats.db" and name~="querylog.json" and name~="sessions.db" then
|
||||
o:value(name,name)
|
||||
o1:depends ("backupfile", name)
|
||||
end
|
||||
end
|
||||
o.widget = "checkbox"
|
||||
o.default = nil
|
||||
o.optional=false
|
||||
o.description=translate("Will be restore when workdir/data is empty")
|
||||
----backup workdir path
|
||||
|
||||
o1.default = "/etc/AdGuardHome"
|
||||
o1.datatype = "string"
|
||||
o1.optional = false
|
||||
o1.validate=function(self, value)
|
||||
if fs.stat(value,"type")=="reg" then
|
||||
if m.message then
|
||||
m.message =m.message.."\nerror!backup dir is a file"
|
||||
else
|
||||
m.message ="error!backup dir is a file"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
if string.sub(value,-1)=="/" then
|
||||
return string.sub(value, 1, -2)
|
||||
else
|
||||
return value
|
||||
end
|
||||
end
|
||||
|
||||
----Crontab
|
||||
o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab"))
|
||||
o:value("autoupdate",translate("Auto update core"))
|
||||
o:value("cutquerylog",translate("Auto tail querylog"))
|
||||
o:value("cutruntimelog",translate("Auto tail runtime log"))
|
||||
o:value("autohost",translate("Auto update ipv6 hosts and restart adh"))
|
||||
o:value("autogfw",translate("Auto update gfwlist and restart adh"))
|
||||
o.widget = "checkbox"
|
||||
o.default = nil
|
||||
o.optional=true
|
||||
|
||||
----downloadpath
|
||||
o = s:option(TextValue, "downloadlinks",translate("Download links for update"))
|
||||
o.optional = false
|
||||
o.rows = 4
|
||||
o.wrap = "soft"
|
||||
o.cfgvalue = function(self, section)
|
||||
return fs.readfile("/usr/share/AdGuardHome/links.txt")
|
||||
end
|
||||
o.write = function(self, section, value)
|
||||
fs.writefile("/usr/share/AdGuardHome/links.txt", value:gsub("\r\n", "\n"))
|
||||
end
|
||||
fs.writefile("/var/run/lucilogpos","0")
|
||||
function m.on_commit(map)
|
||||
if (fs.access("/var/run/AdGserverdis")) then
|
||||
io.popen("/etc/init.d/AdGuardHome reload &")
|
||||
return
|
||||
end
|
||||
local ucitracktest=uci:get("AdGuardHome","AdGuardHome","ucitracktest")
|
||||
if ucitracktest=="1" then
|
||||
return
|
||||
elseif ucitracktest=="0" then
|
||||
io.popen("/etc/init.d/AdGuardHome reload &")
|
||||
else
|
||||
if (fs.access("/var/run/AdGlucitest")) then
|
||||
uci:set("AdGuardHome","AdGuardHome","ucitracktest","0")
|
||||
io.popen("/etc/init.d/AdGuardHome reload &")
|
||||
else
|
||||
fs.writefile("/var/run/AdGlucitest","")
|
||||
if (ucitracktest=="2") then
|
||||
uci:set("AdGuardHome","AdGuardHome","ucitracktest","1")
|
||||
else
|
||||
uci:set("AdGuardHome","AdGuardHome","ucitracktest","2")
|
||||
end
|
||||
end
|
||||
uci:save("AdGuardHome")
|
||||
end
|
||||
end
|
||||
return m
|
||||
@ -1,16 +0,0 @@
|
||||
local fs=require"nixio.fs"
|
||||
local uci=require"luci.model.uci".cursor()
|
||||
local f,t
|
||||
f=SimpleForm("logview")
|
||||
f.reset = false
|
||||
f.submit = false
|
||||
t=f:field(TextValue,"conf")
|
||||
t.rmempty=true
|
||||
t.rows=20
|
||||
t.template="AdGuardHome/log"
|
||||
t.readonly="readonly"
|
||||
local logfile=uci:get("AdGuardHome","AdGuardHome","logfile") or ""
|
||||
t.timereplace=(logfile~="syslog" and logfile~="" )
|
||||
t.pollcheck=logfile~=""
|
||||
fs.writefile("/var/run/lucilogreload","")
|
||||
return f
|
||||
@ -1,97 +0,0 @@
|
||||
local m, s, o
|
||||
local fs = require "nixio.fs"
|
||||
local uci=require"luci.model.uci".cursor()
|
||||
local sys=require"luci.sys"
|
||||
require("string")
|
||||
require("io")
|
||||
require("table")
|
||||
function gen_template_config()
|
||||
local b
|
||||
local d=""
|
||||
for cnt in io.lines("/tmp/resolv.conf.d/resolv.conf.auto") do
|
||||
b=string.match (cnt,"^[^#]*nameserver%s+([^%s]+)$")
|
||||
if (b~=nil) then
|
||||
d=d.." - "..b.."\n"
|
||||
end
|
||||
end
|
||||
local f=io.open("/usr/share/AdGuardHome/AdGuardHome_template.yaml", "r+")
|
||||
local tbl = {}
|
||||
local a=""
|
||||
while (1) do
|
||||
a=f:read("*l")
|
||||
if (a=="#bootstrap_dns") then
|
||||
a=d
|
||||
elseif (a=="#upstream_dns") then
|
||||
a=d
|
||||
elseif (a==nil) then
|
||||
break
|
||||
end
|
||||
table.insert(tbl, a)
|
||||
end
|
||||
f:close()
|
||||
return table.concat(tbl, "\n")
|
||||
end
|
||||
m = Map("AdGuardHome")
|
||||
local configpath = uci:get("AdGuardHome","AdGuardHome","configpath")
|
||||
local binpath = uci:get("AdGuardHome","AdGuardHome","binpath")
|
||||
s = m:section(TypedSection, "AdGuardHome")
|
||||
s.anonymous=true
|
||||
s.addremove=false
|
||||
--- config
|
||||
o = s:option(TextValue, "escconf")
|
||||
o.rows = 66
|
||||
o.wrap = "off"
|
||||
o.rmempty = true
|
||||
o.cfgvalue = function(self, section)
|
||||
return fs.readfile("/tmp/AdGuardHometmpconfig.yaml") or fs.readfile(configpath) or gen_template_config() or ""
|
||||
end
|
||||
o.validate=function(self, value)
|
||||
fs.writefile("/tmp/AdGuardHometmpconfig.yaml", value:gsub("\r\n", "\n"))
|
||||
if fs.access(binpath) then
|
||||
if (sys.call(binpath.." -c /tmp/AdGuardHometmpconfig.yaml --check-config 2> /tmp/AdGuardHometest.log")==0) then
|
||||
return value
|
||||
end
|
||||
else
|
||||
return value
|
||||
end
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin","services","AdGuardHome","manual"))
|
||||
return nil
|
||||
end
|
||||
o.write = function(self, section, value)
|
||||
fs.move("/tmp/AdGuardHometmpconfig.yaml",configpath)
|
||||
end
|
||||
o.remove = function(self, section, value)
|
||||
fs.writefile(configpath, "")
|
||||
end
|
||||
--- js and reload button
|
||||
o = s:option(DummyValue, "")
|
||||
o.anonymous=true
|
||||
o.template = "AdGuardHome/yamleditor"
|
||||
if not fs.access(binpath) then
|
||||
o.description=translate("WARNING!!! no bin found apply config will not be test")
|
||||
end
|
||||
--- log
|
||||
if (fs.access("/tmp/AdGuardHometmpconfig.yaml")) then
|
||||
local c=fs.readfile("/tmp/AdGuardHometest.log")
|
||||
if (c~="") then
|
||||
o = s:option(TextValue, "")
|
||||
o.readonly=true
|
||||
o.rows = 5
|
||||
o.rmempty = true
|
||||
o.name=""
|
||||
o.cfgvalue = function(self, section)
|
||||
return fs.readfile("/tmp/AdGuardHometest.log")
|
||||
end
|
||||
end
|
||||
end
|
||||
function m.on_commit(map)
|
||||
local ucitracktest=uci:get("AdGuardHome","AdGuardHome","ucitracktest")
|
||||
if ucitracktest=="1" then
|
||||
return
|
||||
elseif ucitracktest=="0" then
|
||||
io.popen("/etc/init.d/AdGuardHome reload &")
|
||||
else
|
||||
fs.writefile("/var/run/AdGlucitest","")
|
||||
end
|
||||
end
|
||||
return m
|
||||
@ -1,78 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<%local fs=require"nixio.fs"%>
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="apply_update_button" value="<%:Update core version%>" onclick=" return apply_update() "/>
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="apply_forceupdate_button" value="<%:Force update%>" onclick=" return apply_forceupdate()" style="display:none"/>
|
||||
<% if self.showfastconfig then %>
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="to_configpage" value="<%:Fast config%>" onclick="location.href='<%=url([[admin]], [[services]], [[AdGuardHome]], [[manual]])%>'"/>
|
||||
<%end%>
|
||||
<div id="logview" style="display:none">
|
||||
<input type="checkbox" id="reversetag" value="reverse" onclick=" return reverselog()" style="vertical-align:middle;height: auto;"><%:reverse%></input>
|
||||
<textarea id="cbid.logview.1.conf" class="cbi-input-textarea" style="width: 100%;display:block;" data-update="change" rows="5" cols="60" readonly="readonly" > </textarea>
|
||||
</div>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var updatebtn = document.getElementById('apply_update_button');
|
||||
var forceupdatebtn = document.getElementById('apply_forceupdate_button');
|
||||
var islogreverse = false;
|
||||
function apply_forceupdate(){
|
||||
XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[doupdate]])%>',{ force: 1 },function(x, data){}
|
||||
);
|
||||
updatebtn.disabled = true;
|
||||
poll_check();
|
||||
return
|
||||
}
|
||||
function reverselog(){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
lv.innerHTML=lv.innerHTML.split('\n').reverse().join('\n')
|
||||
if (islogreverse){
|
||||
islogreverse=false;
|
||||
}else{
|
||||
islogreverse=true;
|
||||
}
|
||||
return
|
||||
}
|
||||
function apply_update(){
|
||||
XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[doupdate]])%>',null,function(x, data){}
|
||||
);
|
||||
updatebtn.disabled = true;
|
||||
updatebtn.value = '<%:Check...%>';
|
||||
forceupdatebtn.style.display="inline"
|
||||
poll_check();
|
||||
return
|
||||
}
|
||||
function poll_check(){
|
||||
var tag = document.getElementById('logview');
|
||||
tag.style.display="block"
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[check]])%>', null,
|
||||
function(x, data) {
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
if (x.responseText && lv) {
|
||||
if (x.responseText=="\u0000"){
|
||||
for(j = 0,len=this.XHR._q.length; j < len; j++) {
|
||||
if (this.XHR._q[j].url == '<%=url([[admin]], [[services]], [[AdGuardHome]], [[check]])%>'){
|
||||
this.XHR._q.splice(j,1);
|
||||
updatebtn.disabled = false;
|
||||
updatebtn.value = '<%:Updated%>';
|
||||
break;
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
if (islogreverse){
|
||||
lv.innerHTML = x.responseText.split('\n').reverse().join('\n')+lv.innerHTML;
|
||||
}else{
|
||||
lv.innerHTML += x.responseText;
|
||||
}
|
||||
}
|
||||
}
|
||||
);}
|
||||
<% if fs.access("/var/run/update_core") then %>
|
||||
updatebtn.disabled = true;
|
||||
updatebtn.value = '<%:Check...%>';
|
||||
forceupdatebtn.style.display="inline"
|
||||
poll_check();
|
||||
<%elseif fs.access("/var/run/update_core_error") then %>
|
||||
poll_check();
|
||||
<%end%>
|
||||
//]]>
|
||||
</script>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,49 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
function chpass(btn)
|
||||
{
|
||||
btn.disabled = true;
|
||||
btn.value = '<%:loading...%>';
|
||||
if (typeof bcryptloaded == 'undefined' ){
|
||||
var theHead = document.getElementsByTagName('head').item(0);
|
||||
//创建脚本的dom对象实例
|
||||
var myScript = document.createElement('script');
|
||||
myScript.src = '<%=resource%>/twin-bcrypt.min.js'; //指定脚本路径
|
||||
myScript.type = 'text/javascript'; //指定脚本类型
|
||||
myScript.defer = true; //程序下载完后再解析和执行
|
||||
theHead.appendChild(myScript);
|
||||
bcryptloaded=1;
|
||||
btn.value = '<%:Culculate%>';
|
||||
btn.disabled = false;
|
||||
return
|
||||
}
|
||||
var lv = document.getElementById('cbid.AdGuardHome.AdGuardHome.hashpass');
|
||||
if (lv.value != ""){
|
||||
var hash = TwinBcrypt.hashSync(lv.value);
|
||||
lv.value=hash;
|
||||
btn.value = '<%:Please save/apply%>';
|
||||
}else{
|
||||
btn.value = '<%:is empty%>';
|
||||
btn.disabled = false;
|
||||
}
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
<input data-update="change"<%=
|
||||
attr("id", cbid) ..
|
||||
attr("name", cbid) ..
|
||||
attr("type", self.password and "password" or "text") ..
|
||||
attr("class", self.password and "cbi-input-password" or "cbi-input-text") ..
|
||||
attr("value", self:cfgvalue(section) or self.default) ..
|
||||
ifattr(self.size, "size") ..
|
||||
ifattr(self.placeholder, "placeholder") ..
|
||||
ifattr(self.readonly, "readonly") ..
|
||||
ifattr(self.maxlength, "maxlength") ..
|
||||
ifattr(self.datatype, "data-type", self.datatype) ..
|
||||
ifattr(self.datatype, "data-optional", self.optional or self.rmempty) ..
|
||||
ifattr(self.combobox_manual, "data-manual", self.combobox_manual) ..
|
||||
ifattr(#self.keylist > 0, "data-choices", { self.keylist, self.vallist })
|
||||
%> />
|
||||
<% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="cbid.AdGuardHome.AdGuardHome.applychpass" value="<%:Load culculate model%>" onclick="return chpass(this)"/>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,27 +0,0 @@
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[status]])%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('AdGuardHome_status');
|
||||
if (data && tb) {
|
||||
if (data.running) {
|
||||
tb.innerHTML = '<em><b><font color=green>AdGuardHome <%:RUNNING%></font></b></em>';
|
||||
} else {
|
||||
tb.innerHTML = '<em><b><font color=red>AdGuardHome <%:NOT RUNNING%></font></b></em>';
|
||||
}
|
||||
if (data.redirect)
|
||||
{
|
||||
tb.innerHTML+='<em><b><font color=green><%:Redirected%></font></b></em>'
|
||||
} else {
|
||||
tb.innerHTML+='<em><b><font color=red><%:Not redirect%></font></b></em>'
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]>
|
||||
</script>
|
||||
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
|
||||
<fieldset class="cbi-section">
|
||||
<p id="AdGuardHome_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
</fieldset>
|
||||
@ -1,110 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<input type="checkbox" name="NAME" value="reverse" onclick=" return reverselog()" style="vertical-align:middle;height: auto;" checked><%:reverse%></input>
|
||||
<%if self.timereplace then%>
|
||||
<input type="checkbox" name="NAME" value="localtime" onclick=" return chlogtime()" style="vertical-align:middle;height: auto;" checked><%:localtime%></input><br>
|
||||
<%end%>
|
||||
<textarea id="cbid.logview.1.conf" class="cbi-input-textarea" style="width: 100%;display:inline" data-update="change" rows="32" cols="60" readonly="readonly" > </textarea>
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="apply_update_button" value="<%:dellog%>" onclick=" return apply_del_log() "/>
|
||||
<input type="button" class="cbi-button cbi-button-apply" value="<%:download log%>" style=" display:inline;" onclick=" return download_log()" />
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var islogreverse = true;
|
||||
var isutc2local = <%=tostring(self.timereplace)%>;
|
||||
function createAndDownloadFile(fileName, content) {
|
||||
var aTag = document.createElement('a');
|
||||
var blob = new Blob([content]);
|
||||
aTag.download = fileName;
|
||||
aTag.href = URL.createObjectURL(blob);
|
||||
aTag.click();
|
||||
URL.revokeObjectURL(blob);
|
||||
}
|
||||
function download_log(){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
var dt = new Date();
|
||||
var timestamp = (dt.getMonth()+1)+"-"+dt.getDate()+"-"+dt.getHours()+"_"+dt.getMinutes();
|
||||
createAndDownloadFile("AdGuardHome"+timestamp+".log",lv.innerHTML)
|
||||
return
|
||||
}
|
||||
function apply_del_log(){
|
||||
XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[dodellog]])%>',null,function(x, data){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
lv.innerHTML="";
|
||||
}
|
||||
);
|
||||
return
|
||||
}
|
||||
function chlogtime(){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
if (isutc2local){
|
||||
lv.innerHTML=line_toUTC(lv.innerHTML).join('\n');
|
||||
isutc2local=false;
|
||||
}else{
|
||||
lv.innerHTML=line_tolocal(lv.innerHTML).join('\n');
|
||||
isutc2local=true;
|
||||
}
|
||||
return
|
||||
}
|
||||
function reverselog(){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
lv.innerHTML=lv.innerHTML.split('\n').reverse().join('\n')
|
||||
if (islogreverse){
|
||||
islogreverse=false;
|
||||
}else{
|
||||
islogreverse=true;
|
||||
}
|
||||
return
|
||||
}
|
||||
function p(s) {
|
||||
return s < 10 ? '0' + s: s;
|
||||
}
|
||||
function line_tolocal(str){
|
||||
var strt=new Array();
|
||||
str.trim().split('\n').forEach(function(v, i) {
|
||||
var dt = new Date(v.substring(0,19)+" UTC");
|
||||
if (dt != "Invalid Date"){
|
||||
strt[i]=dt.getFullYear()+"/"+p(dt.getMonth()+1)+"/"+p(dt.getDate())+" "+p(dt.getHours())+":"+p(dt.getMinutes())+":"+p(dt.getSeconds())+v.substring(19);
|
||||
}else{
|
||||
strt[i]=v;}})
|
||||
return strt
|
||||
}
|
||||
function line_toUTC(str){
|
||||
var strt=new Array();
|
||||
str.trim().split('\n').forEach(function(v, i) {
|
||||
var dt = new Date(v.substring(0,19))
|
||||
if (dt != "Invalid Date"){
|
||||
strt[i]=dt.getUTCFullYear()+"/"+p(dt.getUTCMonth()+1)+"/"+p(dt.getUTCDate())+" "+p(dt.getUTCHours())+":"+p(dt.getUTCMinutes())+":"+p(dt.getUTCSeconds())+v.substring(19);
|
||||
}else{
|
||||
strt[i]=v;}})
|
||||
return strt
|
||||
}
|
||||
function poll_check(){
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[getlog]])%>', null,
|
||||
function(x, data) {
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
if (x.responseText && lv) {
|
||||
if (isutc2local)
|
||||
{
|
||||
var lines=line_tolocal(x.responseText);
|
||||
if (islogreverse){
|
||||
lv.innerHTML = lines.reverse().join('\n')+lv.innerHTML;
|
||||
}else{
|
||||
lv.innerHTML += lines.join('\n');
|
||||
}
|
||||
}else{
|
||||
if (islogreverse){
|
||||
lv.innerHTML = x.responseText.split('\n').reverse().join('\n')+lv.innerHTML;
|
||||
}else{
|
||||
lv.innerHTML += x.responseText;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);}
|
||||
<%if self.pollcheck then%>
|
||||
poll_check();
|
||||
<%else%>
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
lv.innerHTML="<%:Please add log path in config to enable log%>"
|
||||
<%end%>
|
||||
//]]>
|
||||
</script>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,39 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<script src="/luci-static/resources/codemirror/lib/codemirror.js"></script>
|
||||
<link rel="stylesheet" href="/luci-static/resources/codemirror/lib/codemirror.css"/>
|
||||
<script src="/luci-static/resources/codemirror/mode/yaml/yaml.js"></script>
|
||||
<link rel="stylesheet" href="/luci-static/resources/codemirror/theme/dracula.css"/>
|
||||
<link rel="stylesheet" href="/luci-static/resources/codemirror/addon/fold/foldgutter.css"/>
|
||||
<script src="/luci-static/resources/codemirror/addon/fold/foldcode.js"></script>
|
||||
<script src="/luci-static/resources/codemirror/addon/fold/foldgutter.js"></script>
|
||||
<script src="/luci-static/resources/codemirror/addon/fold/indent-fold.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById("cbid.AdGuardHome.AdGuardHome.escconf"), {
|
||||
mode: "text/yaml", //实现groovy代码高亮
|
||||
styleActiveLine: true,
|
||||
lineNumbers: true, //显示行号
|
||||
theme: "dracula", //设置主题
|
||||
lineWrapping: true, //代码折叠
|
||||
foldGutter: true,
|
||||
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
|
||||
matchBrackets: true //括号匹配
|
||||
}
|
||||
);
|
||||
function reload_config(){
|
||||
XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[reloadconfig]])%>', null,
|
||||
function(x, data) {
|
||||
location.reload();
|
||||
});}
|
||||
function use_template(){
|
||||
XHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[gettemplateconfig]])%>', null,
|
||||
function(x, data) {
|
||||
editor.setValue(x.responseText)
|
||||
});}
|
||||
//]]>
|
||||
</script>
|
||||
<%fs=require"nixio.fs"%>
|
||||
<%if fs.access("/tmp/AdGuardHometmpconfig.yaml") then%>
|
||||
<input type="button" id="apply_update_button" value="<%:Reload Config%>" onclick=" return reload_config() "/>
|
||||
<%end%>
|
||||
<input type="button" id="template_button" value="<%:Use template%>" onclick=" return use_template() "/>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,266 +0,0 @@
|
||||
#/cgi-bin/luci/admin/services/AdGuardHome
|
||||
msgid "Base Setting"
|
||||
msgstr "基础设置"
|
||||
|
||||
msgid "Log"
|
||||
msgstr "日志"
|
||||
|
||||
msgid "Manual Config"
|
||||
msgstr "手动设置"
|
||||
|
||||
msgid "Free and open source, powerful network-wide ads & trackers blocking DNS server."
|
||||
msgstr "免费开源,功能强大的全网络广告和跟踪程序拦截DNS服务器"
|
||||
|
||||
msgid "RUNNING"
|
||||
msgstr "运行中"
|
||||
|
||||
msgid "NOT RUNNING"
|
||||
msgstr "未运行"
|
||||
|
||||
msgid "Redirected"
|
||||
msgstr "已重定向"
|
||||
|
||||
msgid "Not redirect"
|
||||
msgstr "未重定向"
|
||||
|
||||
msgid "Collecting data..."
|
||||
msgstr "获取数据中..."
|
||||
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
msgid "Browser management port"
|
||||
msgstr "网页管理端口"
|
||||
|
||||
msgid "Update"
|
||||
msgstr "更新"
|
||||
#button change
|
||||
msgid "Update core version"
|
||||
msgstr "更新核心版本"
|
||||
|
||||
msgid "Check..."
|
||||
msgstr "检查中..."
|
||||
|
||||
msgid "Updated"
|
||||
msgstr "已更新"
|
||||
|
||||
#button hide
|
||||
msgid "Force update"
|
||||
msgstr "强制更新"
|
||||
|
||||
msgid "Fast config"
|
||||
msgstr "快速配置"
|
||||
#
|
||||
msgid "core version:"
|
||||
msgstr "核心版本:"
|
||||
#description change
|
||||
msgid "no config"
|
||||
msgstr "没有配置文件"
|
||||
msgid "no core"
|
||||
msgstr "没有核心"
|
||||
#
|
||||
msgid "Redirect"
|
||||
msgstr "重定向"
|
||||
#inlist
|
||||
msgid "none"
|
||||
msgstr "无"
|
||||
|
||||
msgid "Run as dnsmasq upstream server"
|
||||
msgstr "作为dnsmasq的上游服务器"
|
||||
|
||||
msgid "Redirect 53 port to AdGuardHome"
|
||||
msgstr "重定向53端口到AdGuardHome"
|
||||
|
||||
msgid "Use port 53 replace dnsmasq"
|
||||
msgstr "使用53端口替换dnsmasq"
|
||||
#
|
||||
msgid "AdGuardHome redirect mode"
|
||||
msgstr "AdGuardHome重定向模式"
|
||||
|
||||
msgid "Bin Path"
|
||||
msgstr "执行文件路径"
|
||||
|
||||
msgid "AdGuardHome Bin path if no bin will auto download"
|
||||
msgstr "AdGuardHome 执行文件路径 如果没有执行文件将自动下载"
|
||||
|
||||
msgid "use upx to compress bin after download"
|
||||
msgstr "下载后使用upx压缩执行文件"
|
||||
#inlist
|
||||
msgid "compress faster"
|
||||
msgstr "快速压缩"
|
||||
|
||||
msgid "compress better"
|
||||
msgstr "更好的压缩"
|
||||
|
||||
msgid "compress best(can be slow for big files)"
|
||||
msgstr "最好的压缩(大文件可能慢)"
|
||||
|
||||
msgid "try all available compression methods & filters [slow]"
|
||||
msgstr "尝试所有可能的压缩方法和过滤器[慢]"
|
||||
|
||||
msgid "try even more compression variants [very slow]"
|
||||
msgstr "尝试更多变体压缩手段[很慢]"
|
||||
|
||||
msgid "bin use less space,but may have compatibility issues"
|
||||
msgstr "减小执行文件空间占用,但是可能压缩后有兼容性问题"
|
||||
#
|
||||
msgid "Config Path"
|
||||
msgstr "配置文件路径"
|
||||
|
||||
msgid "AdGuardHome config path"
|
||||
msgstr "AdGuardHome 配置文件路径"
|
||||
|
||||
msgid "Work dir"
|
||||
msgstr "工作目录"
|
||||
|
||||
msgid "AdGuardHome work dir include rules,audit log and database"
|
||||
msgstr "AdGuardHome 工作目录包含规则,审计日志和数据库"
|
||||
|
||||
msgid "Runtime log file"
|
||||
msgstr "运行日志"
|
||||
|
||||
msgid "AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log"
|
||||
msgstr "AdGuardHome 运行日志 如果填syslog将写入系统日志;如果空则不记录日志"
|
||||
|
||||
msgid "Verbose log"
|
||||
msgstr "详细日志"
|
||||
#hide div
|
||||
msgid "Add gfwlist"
|
||||
msgstr "加入gfw列表"
|
||||
|
||||
msgid "Add"
|
||||
msgstr "添加"
|
||||
|
||||
msgid "Added"
|
||||
msgstr "已添加"
|
||||
|
||||
msgid "Not added"
|
||||
msgstr "未添加"
|
||||
#hide div
|
||||
msgid "Del gfwlist"
|
||||
msgstr "删除gfw列表"
|
||||
|
||||
msgid "Del"
|
||||
msgstr "删除"
|
||||
#hide div
|
||||
msgid "Gfwlist upstream dns server"
|
||||
msgstr "gfw列表上游服务器"
|
||||
|
||||
msgid "Gfwlist domain upstream dns service"
|
||||
msgstr "gfw列表域名上游服务器"
|
||||
#hide div
|
||||
msgid "Change browser management password"
|
||||
msgstr "改变网页登录密码"
|
||||
|
||||
msgid "Culculate"
|
||||
msgstr "计算"
|
||||
##button change
|
||||
msgid "Load culculate model"
|
||||
msgstr "载入计算模块"
|
||||
|
||||
msgid "loading..."
|
||||
msgstr "载入中"
|
||||
|
||||
msgid "Please save/apply"
|
||||
msgstr "请提交"
|
||||
|
||||
msgid "is empty"
|
||||
msgstr "为空"
|
||||
|
||||
msgid "Press load culculate model and culculate finally save/apply"
|
||||
msgstr "按载入计算模块 然后计算 最后保存/提交"
|
||||
#
|
||||
msgid "Keep files when system upgrade"
|
||||
msgstr "系统升级时保留文件"
|
||||
#checkbox
|
||||
msgid "core bin"
|
||||
msgstr "核心执行文件"
|
||||
|
||||
msgid "config file"
|
||||
msgstr "配置文件"
|
||||
|
||||
msgid "log file"
|
||||
msgstr "日志文件"
|
||||
|
||||
msgid "querylog.json"
|
||||
msgstr "审计日志.json"
|
||||
#
|
||||
msgid "On boot when network ok restart"
|
||||
msgstr "开机后网络准备好时重启"
|
||||
|
||||
msgid "Backup workdir files when shutdown"
|
||||
msgstr "在关机时备份工作目录文件"
|
||||
|
||||
msgid "Will be restore when workdir/data is empty"
|
||||
msgstr "在工作目录/data为空的时候恢复"
|
||||
|
||||
msgid "Backup workdir path"
|
||||
msgstr "工作目录备份路径"
|
||||
|
||||
msgid "Crontab task"
|
||||
msgstr "计划任务"
|
||||
|
||||
msgid "Auto update core"
|
||||
msgstr "自动升级核心"
|
||||
|
||||
msgid "Auto tail querylog"
|
||||
msgstr "自动截短查询日志"
|
||||
|
||||
msgid "Auto tail runtime log"
|
||||
msgstr "自动截短运行日志"
|
||||
|
||||
msgid "Auto update ipv6 hosts and restart adh"
|
||||
msgstr "自动更新ipv6主机并重启adh"
|
||||
|
||||
msgid "Auto update gfwlist and restart adh"
|
||||
msgstr "自动更新gfw列表并重启adh"
|
||||
|
||||
msgid "Please change time and args in crontab"
|
||||
msgstr "请在计划任务中修改时间和参数"
|
||||
|
||||
msgid "Download links for update"
|
||||
msgstr "升级用的下载链接"
|
||||
|
||||
#/cgi-bin/luci/admin/services/AdGuardHome/log/
|
||||
msgid "reverse"
|
||||
msgstr "逆序"
|
||||
|
||||
msgid "localtime"
|
||||
msgstr "本地时间"
|
||||
|
||||
msgid "Please add log path in config to enable log"
|
||||
msgstr "请在设置里填写日志路径以启用日志"
|
||||
|
||||
msgid "dellog"
|
||||
msgstr "删除日志"
|
||||
|
||||
msgid "download log"
|
||||
msgstr "下载日志"
|
||||
|
||||
#/cgi-bin/luci//admin/services/AdGuardHome/manual/
|
||||
msgid "Use template"
|
||||
msgstr "使用模板"
|
||||
#hide button
|
||||
msgid "Reload Config"
|
||||
msgstr "重新载入配置"
|
||||
|
||||
msgid "WARNING!!! no bin found apply config will not be test"
|
||||
msgstr "警告!!!未找到执行文件,提交配置将不会进行校验"
|
||||
#unused
|
||||
msgid "Change browser management username"
|
||||
msgstr "改变网页登录用户名"
|
||||
|
||||
msgid "Username"
|
||||
msgstr "用户名"
|
||||
|
||||
msgid "Check Config"
|
||||
msgstr "检查配置"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "未知"
|
||||
|
||||
msgid "Keep database when system upgrade"
|
||||
msgstr "系统升级时保留数据"
|
||||
|
||||
msgid "Boot delay until network ok"
|
||||
msgstr "开机时直到网络准备好再启动"
|
||||
@ -1,11 +0,0 @@
|
||||
config AdGuardHome 'AdGuardHome'
|
||||
option enabled '0'
|
||||
option httpport '3000'
|
||||
option redirect 'none'
|
||||
option configpath '/etc/AdGuardHome.yaml'
|
||||
option workdir '/etc/AdGuardHome'
|
||||
option logfile '/tmp/AdGuardHome.log'
|
||||
option verbose '0'
|
||||
option binpath '/usr/bin/AdGuardHome'
|
||||
option upxflag ''
|
||||
|
||||
@ -1,632 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
START=95
|
||||
STOP=01
|
||||
|
||||
CONFIGURATION=AdGuardHome
|
||||
CRON_FILE=/etc/crontabs/root
|
||||
|
||||
extra_command "do_redirect" "0 or 1"
|
||||
extra_command "testbackup" "backup or restore"
|
||||
extra_command "test_crontab"
|
||||
extra_command "force_reload"
|
||||
extra_command "isrunning"
|
||||
|
||||
set_forward_dnsmasq()
|
||||
{
|
||||
local PORT="$1"
|
||||
addr="127.0.0.1#$PORT"
|
||||
OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
|
||||
echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
return
|
||||
fi
|
||||
uci delete dhcp.@dnsmasq[0].server 2>/dev/null
|
||||
uci add_list dhcp.@dnsmasq[0].server=$addr
|
||||
for server in $OLD_SERVER; do
|
||||
if [ "$server" = "$addr" ]; then
|
||||
continue
|
||||
fi
|
||||
uci add_list dhcp.@dnsmasq[0].server=$server
|
||||
done
|
||||
uci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null
|
||||
uci set dhcp.@dnsmasq[0].noresolv=1
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq restart
|
||||
}
|
||||
|
||||
stop_forward_dnsmasq()
|
||||
{
|
||||
local OLD_PORT="$1"
|
||||
addr="127.0.0.1#$OLD_PORT"
|
||||
OLD_SERVER="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
|
||||
echo $OLD_SERVER | grep "^$addr" >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
uci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null
|
||||
addrlist="`uci get dhcp.@dnsmasq[0].server 2>/dev/null`"
|
||||
if [ -z "$addrlist" ] ; then
|
||||
uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto 2>/dev/null
|
||||
uci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null
|
||||
fi
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq restart
|
||||
}
|
||||
|
||||
set_iptable()
|
||||
{
|
||||
local ipv6_server=$1
|
||||
local tcp_server=$2
|
||||
uci -q batch <<-EOF >/dev/null 2>&1
|
||||
delete firewall.AdGuardHome
|
||||
set firewall.AdGuardHome=include
|
||||
set firewall.AdGuardHome.type=script
|
||||
set firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start
|
||||
set firewall.AdGuardHome.reload=1
|
||||
commit firewall
|
||||
EOF
|
||||
|
||||
IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`"
|
||||
for IP in $IPS
|
||||
do
|
||||
if [ "$tcp_server" == "1" ]; then
|
||||
iptables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
|
||||
fi
|
||||
iptables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
|
||||
done
|
||||
|
||||
if [ "$ipv6_server" == 0 ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`"
|
||||
for IP in $IPS
|
||||
do
|
||||
if [ "$tcp_server" == "1" ]; then
|
||||
ip6tables -t nat -A PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
|
||||
fi
|
||||
ip6tables -t nat -A PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT >/dev/null 2>&1
|
||||
done
|
||||
}
|
||||
|
||||
clear_iptable()
|
||||
{
|
||||
uci -q batch <<-EOF >/dev/null 2>&1
|
||||
delete firewall.AdGuardHome
|
||||
commit firewall
|
||||
EOF
|
||||
local OLD_PORT="$1"
|
||||
local ipv6_server=$2
|
||||
IPS="`ifconfig | grep "inet addr" | grep -v ":127" | grep "Bcast" | awk '{print $2}' | awk -F : '{print $2}'`"
|
||||
for IP in $IPS
|
||||
do
|
||||
iptables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
|
||||
iptables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
|
||||
done
|
||||
|
||||
if [ "$ipv6_server" == 0 ]; then
|
||||
return
|
||||
fi
|
||||
echo "warn ip6tables nat mod is needed"
|
||||
IPS="`ifconfig | grep "inet6 addr" | grep -v " fe80::" | grep -v " ::1" | grep "Global" | awk '{print $3}'`"
|
||||
for IP in $IPS
|
||||
do
|
||||
ip6tables -t nat -D PREROUTING -p udp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
|
||||
ip6tables -t nat -D PREROUTING -p tcp -d $IP --dport 53 -j REDIRECT --to-ports $OLD_PORT >/dev/null 2>&1
|
||||
done
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$CONFIGURATION"
|
||||
[ "$(uci get AdGuardHome.AdGuardHome.redirect)" == "redirect" ] && procd_add_reload_trigger firewall
|
||||
}
|
||||
|
||||
isrunning(){
|
||||
config_load "${CONFIGURATION}"
|
||||
_isrunning
|
||||
local r=$?
|
||||
([ "$r" == "0" ] && echo "running") || ([ "$r" == "1" ] && echo "not run" ) || echo "no bin"
|
||||
return $r
|
||||
}
|
||||
|
||||
_isrunning(){
|
||||
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
||||
[ ! -f "$binpath" ] && return 2
|
||||
pgrep $binpath 2>&1 >/dev/null && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
force_reload(){
|
||||
config_load "${CONFIGURATION}"
|
||||
_isrunning && procd_send_signal "$CONFIGURATION" || start
|
||||
}
|
||||
|
||||
get_tz()
|
||||
{
|
||||
SET_TZ=""
|
||||
|
||||
if [ -e "/etc/localtime" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
for tzfile in /etc/TZ /var/etc/TZ
|
||||
do
|
||||
if [ ! -e "$tzfile" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
tz="`cat $tzfile 2>/dev/null`"
|
||||
done
|
||||
|
||||
if [ -z "$tz" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
SET_TZ=$tz
|
||||
}
|
||||
|
||||
rm_port53()
|
||||
{
|
||||
local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
|
||||
dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
|
||||
if [ -z "$dnsmasq_port" ]; then
|
||||
dnsmasq_port="53"
|
||||
fi
|
||||
if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
|
||||
if [ "$dnsmasq_port" == "53" ]; then
|
||||
dnsmasq_port="1745"
|
||||
fi
|
||||
elif [ "$dnsmasq_port" == "53" ]; then
|
||||
return
|
||||
fi
|
||||
config_editor "dns.port" "$dnsmasq_port" "$configpath"
|
||||
uci set dhcp.@dnsmasq[0].port="53"
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq reload
|
||||
}
|
||||
|
||||
use_port53()
|
||||
{
|
||||
local AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
|
||||
dnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
|
||||
if [ -z "$dnsmasq_port" ]; then
|
||||
dnsmasq_port="53"
|
||||
fi
|
||||
if [ "$dnsmasq_port" == "$AdGuardHome_PORT" ]; then
|
||||
if [ "$dnsmasq_port" == "53" ]; then
|
||||
AdGuardHome_PORT="1745"
|
||||
fi
|
||||
elif [ "$AdGuardHome_PORT" == "53" ]; then
|
||||
return
|
||||
fi
|
||||
config_editor "dns.port" "53" "$configpath"
|
||||
uci set dhcp.@dnsmasq[0].port="$AdGuardHome_PORT"
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq reload
|
||||
}
|
||||
|
||||
do_redirect()
|
||||
{
|
||||
config_load "${CONFIGURATION}"
|
||||
_do_redirect $1
|
||||
}
|
||||
|
||||
_do_redirect()
|
||||
{
|
||||
local section="$CONFIGURATION"
|
||||
args=""
|
||||
ipv6_server=1
|
||||
tcp_server=0
|
||||
enabled=$1
|
||||
if [ "$enabled" == "1" ]; then
|
||||
echo -n "1">/var/run/AdGredir
|
||||
else
|
||||
echo -n "0">/var/run/AdGredir
|
||||
fi
|
||||
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
||||
AdGuardHome_PORT=$(config_editor "dns.port" "" "$configpath" "1")
|
||||
if [ -z "$AdGuardHome_PORT" ]; then
|
||||
AdGuardHome_PORT="0"
|
||||
fi
|
||||
config_get "redirect" "$section" "redirect" "none"
|
||||
config_get "old_redirect" "$section" "old_redirect" "none"
|
||||
config_get "old_port" "$section" "old_port" "0"
|
||||
config_get "old_enabled" "$section" "old_enabled" "0"
|
||||
uci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port="53" >/dev/null 2>&1
|
||||
if [ "$old_enabled" = "1" -a "$old_redirect" == "exchange" ]; then
|
||||
AdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)
|
||||
fi
|
||||
|
||||
if [ "$old_redirect" != "$redirect" ] || [ "$old_port" != "$AdGuardHome_PORT" ] || [ "$old_enabled" = "1" -a "$enabled" = "0" ]; then
|
||||
if [ "$old_redirect" != "none" ]; then
|
||||
if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
|
||||
clear_iptable "$old_port" "$ipv6_server"
|
||||
elif [ "$old_redirect" == "dnsmasq-upstream" ]; then
|
||||
stop_forward_dnsmasq "$old_port"
|
||||
elif [ "$old_redirect" == "exchange" ]; then
|
||||
rm_port53
|
||||
fi
|
||||
fi
|
||||
elif [ "$old_enabled" = "1" -a "$enabled" = "1" ]; then
|
||||
if [ "$old_redirect" == "redirect" -a "$old_port" != "0" ]; then
|
||||
clear_iptable "$old_port" "$ipv6_server"
|
||||
fi
|
||||
fi
|
||||
uci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null
|
||||
uci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null
|
||||
uci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null
|
||||
uci add_list AdGuardHome.@AdGuardHome[0].old_redirect="$redirect" 2>/dev/null
|
||||
uci add_list AdGuardHome.@AdGuardHome[0].old_port="$AdGuardHome_PORT" 2>/dev/null
|
||||
uci add_list AdGuardHome.@AdGuardHome[0].old_enabled="$enabled" 2>/dev/null
|
||||
uci commit AdGuardHome
|
||||
[ "$enabled" == "0" ] && return 1
|
||||
if [ "$AdGuardHome_PORT" == "0" ]; then
|
||||
return 1
|
||||
fi
|
||||
if [ "$redirect" = "redirect" ]; then
|
||||
set_iptable $ipv6_server $tcp_server
|
||||
elif [ "$redirect" = "dnsmasq-upstream" ]; then
|
||||
set_forward_dnsmasq "$AdGuardHome_PORT"
|
||||
elif [ "$redirect" == "exchange" -a "$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)" == "53" ]; then
|
||||
use_port53
|
||||
fi
|
||||
}
|
||||
|
||||
get_filesystem()
|
||||
{
|
||||
# print out path filesystem
|
||||
echo $1 | awk '
|
||||
BEGIN{
|
||||
while (("mount"| getline ret) > 0)
|
||||
{
|
||||
split(ret,d);
|
||||
fs[d[3]]=d[5];
|
||||
m=index(d[1],":")
|
||||
if (m==0)
|
||||
{
|
||||
pt[d[3]]=d[1]
|
||||
}else{
|
||||
pt[d[3]]=substr(d[1],m+1)
|
||||
}}}{
|
||||
split($0,d,"/");
|
||||
if ("/" in fs)
|
||||
{
|
||||
result1=fs["/"];
|
||||
}
|
||||
if ("/" in pt)
|
||||
{
|
||||
result2=pt["/"];
|
||||
}
|
||||
for (i=2;i<=length(d);i++)
|
||||
{
|
||||
p[i]=p[i-1]"/"d[i];
|
||||
if (p[i] in fs)
|
||||
{
|
||||
result1=fs[p[i]];
|
||||
result2=pt[p[i]];
|
||||
}
|
||||
}
|
||||
if (result2 in fs){
|
||||
result=fs[result2]}
|
||||
else{
|
||||
result=result1}
|
||||
print(result);}'
|
||||
}
|
||||
|
||||
config_editor()
|
||||
{
|
||||
awk -v yaml="$1" -v value="$2" -v file="$3" -v ro="$4" '
|
||||
BEGIN{split(yaml,part,"\.");s="";i=1;l=length(part);}
|
||||
{
|
||||
if (match($0,s""part[i]":"))
|
||||
{
|
||||
if (i==l)
|
||||
{
|
||||
split($0,t,": ");
|
||||
if (ro==""){
|
||||
system("sed -i '\''"FNR"c \\"t[1]": "value"'\'' "file);
|
||||
}else{
|
||||
print(t[2]);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
s=s"[- ]{2}";
|
||||
i++;
|
||||
}
|
||||
}' $3
|
||||
}
|
||||
|
||||
boot_service() {
|
||||
rm /var/run/AdGserverdis >/dev/null 2>&1
|
||||
config_load "${CONFIGURATION}"
|
||||
config_get waitonboot $CONFIGURATION waitonboot "0"
|
||||
config_get_bool enabled $CONFIGURATION enabled 0
|
||||
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
||||
[ -f "$binpath" ] && start_service
|
||||
if [ "$enabled" == "1" ] && [ "$waitonboot" == "1" ]; then
|
||||
procd_open_instance "waitnet"
|
||||
procd_set_param command "/usr/share/AdGuardHome/waitnet.sh"
|
||||
procd_close_instance
|
||||
echo "no net start pinging"
|
||||
fi
|
||||
}
|
||||
|
||||
testbackup(){
|
||||
config_load "${CONFIGURATION}"
|
||||
if [ "$1" == "backup" ]; then
|
||||
backup
|
||||
elif [ "$1" == "restore" ]; then
|
||||
restore
|
||||
fi
|
||||
}
|
||||
|
||||
restore()
|
||||
{
|
||||
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
||||
config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome"
|
||||
cp -u -r -f $backupwdpath/data $workdir
|
||||
}
|
||||
|
||||
backup() {
|
||||
config_get backupwdpath $CONFIGURATION backupwdpath "/etc/AdGuardHome"
|
||||
mkdir -p $backupwdpath/data
|
||||
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
||||
config_get backupfile $CONFIGURATION backupfile ""
|
||||
for one in $backupfile;
|
||||
do
|
||||
while :
|
||||
do
|
||||
if [ -d "$backupwdpath/data/$one" ]; then
|
||||
cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data 2>&1)
|
||||
else
|
||||
cpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data/$one 2>&1)
|
||||
fi
|
||||
echo "$cpret"
|
||||
echo "$cpret" | grep "no space left on device"
|
||||
if [ "$?" == "0" ]; then
|
||||
echo "磁盘已满,删除log重试中"
|
||||
del_querylog && continue
|
||||
rm -f -r $backupwdpath/data/filters
|
||||
rm -f -r $workdir/data/filters && continue
|
||||
echo "backup failed"
|
||||
fi
|
||||
break
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
start_service() {
|
||||
# Reading config
|
||||
rm /var/run/AdGserverdis >/dev/null 2>&1
|
||||
config_load "${CONFIGURATION}"
|
||||
# update password
|
||||
config_get hashpass $CONFIGURATION hashpass ""
|
||||
config_get configpath $CONFIGURATION configpath "/etc/AdGuardHome.yaml"
|
||||
if [ -n "$hashpass" ]; then
|
||||
config_editor "users.password" "$hashpass" "$configpath"
|
||||
uci set $CONFIGURATION.$CONFIGURATION.hashpass=""
|
||||
fi
|
||||
local enabled
|
||||
config_get_bool enabled $CONFIGURATION enabled 0
|
||||
# update crontab
|
||||
do_crontab
|
||||
if [ "$enabled" == "0" ]; then
|
||||
_do_redirect 0
|
||||
return
|
||||
fi
|
||||
#what need to do before reload
|
||||
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
||||
|
||||
config_get backupfile $CONFIGURATION backupfile ""
|
||||
mkdir -p $workdir/data
|
||||
if [ -n "$backupfile" ] && [ ! -d "$workdir/data" ]; then
|
||||
restore
|
||||
fi
|
||||
# for overlay data-stk-oo not suppport
|
||||
local cwdfs=$(get_filesystem $workdir)
|
||||
echo "workdir is a $cwdfs filesystem"
|
||||
if [ "$cwdfs" == "jffs2" ]; then
|
||||
echo "fs error ln db to tmp $workdir $cwdfs"
|
||||
logger "AdGuardHome" "warning db redirect to tmp"
|
||||
touch $workdir/data/stats.db
|
||||
if [ ! -L $workdir/data/stats.db ]; then
|
||||
mv -f $workdir/data/stats.db /tmp/stats.db 2>/dev/null
|
||||
ln -s /tmp/stats.db $workdir/data/stats.db 2>/dev/null
|
||||
fi
|
||||
touch $workdir/data/sessions.db
|
||||
if [ ! -L $workdir/data/sessions.db ]; then
|
||||
mv -f $workdir/data/sessions.db /tmp/sessions.db 2>/dev/null
|
||||
ln -s /tmp/sessions.db $workdir/data/sessions.db 2>/dev/null
|
||||
fi
|
||||
fi
|
||||
local ADDITIONAL_ARGS=""
|
||||
config_get binpath $CONFIGURATION binpath "/usr/bin/AdGuardHome"
|
||||
|
||||
mkdir -p ${binpath%/*}
|
||||
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -c $configpath"
|
||||
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -w $workdir"
|
||||
config_get httpport $CONFIGURATION httpport 3000
|
||||
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -p $httpport"
|
||||
|
||||
# hack to save config file when upgrade system
|
||||
config_get upprotect $CONFIGURATION upprotect ""
|
||||
eval upprotect=${upprotect// /\\\\n}
|
||||
echo -e "$upprotect">/lib/upgrade/keep.d/luci-app-adguardhome
|
||||
|
||||
config_get logfile $CONFIGURATION logfile ""
|
||||
if [ -n "$logfile" ]; then
|
||||
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -l $logfile"
|
||||
fi
|
||||
|
||||
if [ ! -f "$binpath" ]; then
|
||||
_do_redirect 0
|
||||
/usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log &
|
||||
exit 0
|
||||
fi
|
||||
|
||||
config_get_bool verbose $CONFIGURATION verbose 0
|
||||
if [ "$verbose" -eq 1 ]; then
|
||||
ADDITIONAL_ARGS="$ADDITIONAL_ARGS -v"
|
||||
fi
|
||||
|
||||
procd_open_instance
|
||||
get_tz
|
||||
if [ -n "$SET_TZ" ]; then
|
||||
procd_set_param env TZ="$SET_TZ"
|
||||
fi
|
||||
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
|
||||
procd_set_param limits core="unlimited" nofile="65535 65535"
|
||||
procd_set_param stderr 1
|
||||
procd_set_param command $binpath $ADDITIONAL_ARGS
|
||||
procd_set_param file "$configpath" "/etc/hosts" "/etc/config/AdGuardHome"
|
||||
procd_close_instance
|
||||
if [ -f "$configpath" ]; then
|
||||
_do_redirect 1
|
||||
else
|
||||
_do_redirect 0
|
||||
config_get "redirect" "AdGuardHome" "redirect" "none"
|
||||
if [ "$redirect" != "none" ]; then
|
||||
procd_open_instance "waitconfig"
|
||||
procd_set_param command "/usr/share/AdGuardHome/watchconfig.sh"
|
||||
procd_close_instance
|
||||
echo "no config start watching"
|
||||
fi
|
||||
fi
|
||||
echo "AdGuardHome service enabled"
|
||||
echo "luci enable switch=$enabled"
|
||||
(sleep 10 && [ -z "$(pgrep $binpath)" ] && logger "AdGuardHome" "no process in 10s cancel redirect" && _do_redirect 0 )&
|
||||
}
|
||||
|
||||
reload_service()
|
||||
{
|
||||
rm /var/run/AdGlucitest >/dev/null 2>&1
|
||||
echo "AdGuardHome reloading"
|
||||
start
|
||||
}
|
||||
|
||||
del_querylog(){
|
||||
local btarget=$(ls $backupwdpath/data | grep -F "querylog.json" | sort -r | head -n 1)
|
||||
local wtarget=$(ls $workdir/data | grep -F "querylog.json" | sort -r | head -n 1)
|
||||
if [ "$btarget"x == "$wtarget"x ]; then
|
||||
[ -z "$btarget" ] && return 1
|
||||
rm -f $workdir/data/$wtarget
|
||||
rm -f $backupwdpath/data/$btarget
|
||||
return 0
|
||||
fi
|
||||
if [ "$btarget" \> "$wtarget" ]; then
|
||||
rm -f $backupwdpath/data/$btarget
|
||||
return 0
|
||||
else
|
||||
rm -f $workdir/data/$wtarget
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
stop_service()
|
||||
{
|
||||
config_load "${CONFIGURATION}"
|
||||
_do_redirect 0
|
||||
do_crontab
|
||||
if [ "$1" != "nobackup" ]; then
|
||||
config_get backupfile $CONFIGURATION backupfile "0"
|
||||
if [ -n "$backupfile" ]; then
|
||||
backup
|
||||
fi
|
||||
fi
|
||||
echo "AdGuardHome service disabled"
|
||||
touch /var/run/AdGserverdis
|
||||
}
|
||||
|
||||
boot() {
|
||||
rc_procd boot_service "$@"
|
||||
if eval "type service_started" 2>/dev/null >/dev/null; then
|
||||
service_started
|
||||
fi
|
||||
}
|
||||
|
||||
test_crontab(){
|
||||
config_load "${CONFIGURATION}"
|
||||
do_crontab
|
||||
}
|
||||
|
||||
do_crontab(){
|
||||
config_get_bool enabled $CONFIGURATION enabled 0
|
||||
config_get crontab $CONFIGURATION crontab ""
|
||||
local findstr default cronenable replace commit
|
||||
local cronreload=0
|
||||
local commit=0
|
||||
findstr="/usr/share/AdGuardHome/update_core.sh"
|
||||
default="30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1"
|
||||
[ "$enabled" == "0" ] || [ "${crontab//autoupdate/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
|
||||
config_get workdir $CONFIGURATION workdir "/etc/AdGuardHome"
|
||||
config_get lastworkdir $CONFIGURATION lastworkdir "/etc/AdGuardHome"
|
||||
findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json"
|
||||
#[ -n "$lastworkdir" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastworkdir/data/querylog.json" && [ "$lastworkdir" != "$workdir" ] && replace="${lastworkdir//\//\\/}/${workdir//\//\\/}"
|
||||
default="0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json"
|
||||
[ "$enabled" == "0" ] || [ "${crontab//cutquerylog/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
#[ "$lastworkdir" != "$workdir" ] && uci set AdGuardHome.AdGuardHome.lastworkdir="$workdir" && commit=1
|
||||
|
||||
config_get logfile $CONFIGURATION logfile ""
|
||||
config_get lastlogfile $CONFIGURATION lastlogfile ""
|
||||
findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* \$(uci get AdGuardHome.AdGuardHome.logfile)"
|
||||
default="30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 \$(uci get AdGuardHome.AdGuardHome.logfile)"
|
||||
#[ -n "$lastlogfile" ] && findstr="/usr/share/AdGuardHome/tailto.sh [0-9]* $lastlogfile" && [ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}"
|
||||
[ "$logfile" == "syslog" ] || [ "$logfile" == "" ] || [ "$enabled" == "0" ] || [ "${crontab//cutruntimelog/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
#[ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set AdGuardHome.AdGuardHome.lastlogfile="$logfile" && commit=1
|
||||
|
||||
findstr="/usr/share/AdGuardHome/addhost.sh"
|
||||
default="0 * * * * /usr/share/AdGuardHome/addhost.sh"
|
||||
[ "$enabled" == "0" ] || [ "${crontab//autohost/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
[ "$cronenable" == "0" ] && /usr/share/AdGuardHome/addhost.sh "del" "noreload" || /usr/share/AdGuardHome/addhost.sh "" "noreload"
|
||||
|
||||
findstr="/usr/share/AdGuardHome/gfw2adg.sh"
|
||||
default="30 3 * * * /usr/share/AdGuardHome/gfw2adg.sh"
|
||||
[ "$enabled" == "0" ] || [ "${crontab//autogfw/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
[ "$cronreload" -gt 0 ] && /etc/init.d/cron restart
|
||||
#[ "$commit" -gt 0 ] && uci commit AdGuardHome
|
||||
}
|
||||
|
||||
crontab_editor(){
|
||||
#usage input:
|
||||
#findstr=
|
||||
#default=
|
||||
#cronenable=
|
||||
#replace="${last//\//\\/}/${now//\//\\/}"
|
||||
#output:cronreload:if >1 please /etc/init.d/cron restart manual
|
||||
local testline reload
|
||||
local line="$(grep "$findstr" $CRON_FILE)"
|
||||
[ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace=""
|
||||
if [ "${line:0:1}" != "#" ]; then
|
||||
if [ $cronenable -eq 1 ]; then
|
||||
[ -z "$line" ] && line="$default" && reload="1"
|
||||
if [ -n "$reload" ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "$line" >> $CRON_FILE
|
||||
cronreload=$((cronreload+1))
|
||||
fi
|
||||
elif [ -n "$line" ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "#$line" >> $CRON_FILE
|
||||
cronreload=$((cronreload+1))
|
||||
fi
|
||||
else
|
||||
if [ $cronenable -eq 1 ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "${line:1}" >> $CRON_FILE
|
||||
cronreload=$((cronreload+1))
|
||||
elif [ -z "$reload" ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "$line" >> $CRON_FILE
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null 2>&1
|
||||
delete ucitrack.@AdGuardHome[-1]
|
||||
add ucitrack AdGuardHome
|
||||
set ucitrack.@AdGuardHome[-1].init=AdGuardHome
|
||||
commit ucitrack
|
||||
delete AdGuardHome.AdGuardHome.ucitracktest
|
||||
EOF
|
||||
|
||||
rm -f /tmp/luci-indexcache
|
||||
exit 0
|
||||
@ -1,109 +0,0 @@
|
||||
#提交就可以直接用的配置模板文件
|
||||
#a template config can be use with a apply
|
||||
bind_host: 0.0.0.0
|
||||
bind_port: 3000
|
||||
users:
|
||||
- name: root
|
||||
password: $2y$10$FfeQavihMUiXCuJhHuQwy.6EOXDvkXb/S50qI5fXizqarNT/ShhQm
|
||||
language: ""
|
||||
rlimit_nofile: 0
|
||||
dns:
|
||||
bind_host: 0.0.0.0
|
||||
port: 5553
|
||||
statistics_interval: 1
|
||||
protection_enabled: true
|
||||
filtering_enabled: true
|
||||
filters_update_interval: 24
|
||||
blocking_mode: nxdomain
|
||||
blocked_response_ttl: 10
|
||||
querylog_enabled: false
|
||||
querylog_interval: 1
|
||||
ratelimit: 0
|
||||
ratelimit_whitelist: []
|
||||
refuse_any: false
|
||||
bootstrap_dns:
|
||||
#bootstrap_dns
|
||||
all_servers: false
|
||||
allowed_clients: []
|
||||
disallowed_clients: []
|
||||
blocked_hosts: []
|
||||
parental_block_host: ""
|
||||
safebrowsing_block_host: ""
|
||||
blocked_services: []
|
||||
cache_size: 4194304
|
||||
parental_sensitivity: 13
|
||||
parental_enabled: false
|
||||
safesearch_enabled: false
|
||||
safebrowsing_enabled: false
|
||||
safebrowsing_cache_size: 1048576
|
||||
safesearch_cache_size: 1048576
|
||||
parental_cache_size: 1048576
|
||||
cache_time: 30
|
||||
rewrites: []
|
||||
upstream_dns:
|
||||
#upstream_dns
|
||||
tls:
|
||||
enabled: false
|
||||
server_name: ""
|
||||
force_https: false
|
||||
port_https: 443
|
||||
port_dns_over_tls: 853
|
||||
certificate_chain: ""
|
||||
private_key: ""
|
||||
certificate_path: ""
|
||||
private_key_path: ""
|
||||
filters:
|
||||
- enabled: true
|
||||
url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
|
||||
name: AdGuard Simplified Domain Names filter
|
||||
id: 1
|
||||
- enabled: true
|
||||
url: https://adaway.org/hosts.txt
|
||||
name: AdAway
|
||||
id: 2
|
||||
- enabled: false
|
||||
url: https://hosts-file.net/ad_servers.txt
|
||||
name: hpHosts - Ad and Tracking servers only
|
||||
id: 3
|
||||
- enabled: true
|
||||
url: https://www.malwaredomainlist.com/hostslist/hosts.txt
|
||||
name: MalwareDomainList.com Hosts List
|
||||
id: 4
|
||||
- enabled: false
|
||||
url: https://raw.githubusercontent.com/vokins/yhosts/master/data/tvbox.txt
|
||||
name: tvbox
|
||||
id: 1575018007
|
||||
- enabled: true
|
||||
url: https://hosts.nfz.moe/full/hosts
|
||||
name: neoHosts full
|
||||
id: 1575618240
|
||||
- enabled: false
|
||||
url: https://hosts.nfz.moe/basic/hosts
|
||||
name: neoHosts basic
|
||||
id: 1575618241
|
||||
- enabled: false
|
||||
url: http://sbc.io/hosts/hosts
|
||||
name: StevenBlack host basic
|
||||
id: 1575618242
|
||||
- enabled: false
|
||||
url: http://sbc.io/hosts/alternates/fakenews-gambling-porn-social/hosts
|
||||
name: StevenBlack host+fakenews + gambling + porn + social
|
||||
id: 1575618243
|
||||
- enabled: false
|
||||
url: https://cdn.jsdelivr.net/gh/privacy-protection-tools/anti-AD/anti-ad-easylist.txt
|
||||
name: anti-AD(Adblock+neohosts+yhosts+cjxlist+adhlist)
|
||||
id: 1577113202
|
||||
user_rules: []
|
||||
dhcp:
|
||||
enabled: false
|
||||
interface_name: ""
|
||||
gateway_ip: ""
|
||||
subnet_mask: ""
|
||||
range_start: ""
|
||||
range_end: ""
|
||||
lease_duration: 86400
|
||||
icmp_timeout_msec: 1000
|
||||
clients: []
|
||||
log_file: ""
|
||||
verbose: false
|
||||
schema_version: 5
|
||||
@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
checkmd5(){
|
||||
local nowmd5=$(md5sum /etc/hosts)
|
||||
nowmd5=${nowmd5%% *}
|
||||
local lastmd5=$(uci get AdGuardHome.AdGuardHome.hostsmd5 2>/dev/null)
|
||||
if [ "$nowmd5" != "$lastmd5" ]; then
|
||||
uci set AdGuardHome.AdGuardHome.hostsmd5="$nowmd5"
|
||||
uci commit AdGuardHome
|
||||
[ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload
|
||||
fi
|
||||
}
|
||||
|
||||
[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' /etc/hosts && checkmd5 "$2" && exit 0
|
||||
/usr/bin/awk 'BEGIN{
|
||||
while ((getline < "/tmp/dhcp.leases") > 0)
|
||||
{
|
||||
a[$2]=$4;
|
||||
}
|
||||
while (("ip -6 neighbor show | grep -v fe80" | getline) > 0)
|
||||
{
|
||||
if (a[$5]) {print $1" "a[$5] >"/tmp/tmphost"; }
|
||||
}
|
||||
print "#programaddend" >"/tmp/tmphost";
|
||||
}'
|
||||
grep programaddstart /etc/hosts >/dev/null 2>&1
|
||||
if [ "$?" == "0" ]; then
|
||||
sed -i '/programaddstart/,/programaddend/c\#programaddstart' /etc/hosts
|
||||
sed -i '/programaddstart/'r/tmp/tmphost /etc/hosts
|
||||
else
|
||||
echo "#programaddstart" >>/etc/hosts
|
||||
cat /tmp/tmphost >> /etc/hosts
|
||||
fi
|
||||
rm /tmp/tmphost
|
||||
checkmd5 "$2"
|
||||
@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
AdGuardHome_enable=$(uci get AdGuardHome.AdGuardHome.enabled)
|
||||
redirect=$(uci get AdGuardHome.AdGuardHome.redirect)
|
||||
|
||||
if [ $AdGuardHome_enable -eq 1 -a "$redirect" == "redirect" ]; then
|
||||
/etc/init.d/AdGuardHome do_redirect 1
|
||||
fi
|
||||
@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
logread -e AdGuardHome > /tmp/AdGuardHometmp.log
|
||||
logread -e AdGuardHome -f >> /tmp/AdGuardHometmp.log &
|
||||
pid=$!
|
||||
echo "1">/var/run/AdGuardHomesyslog
|
||||
while true
|
||||
do
|
||||
sleep 12
|
||||
watchdog=$(cat /var/run/AdGuardHomesyslog)
|
||||
if [ "$watchdog"x == "0"x ]; then
|
||||
kill $pid
|
||||
rm /tmp/AdGuardHometmp.log
|
||||
rm /var/run/AdGuardHomesyslog
|
||||
exit 0
|
||||
else
|
||||
echo "0">/var/run/AdGuardHomesyslog
|
||||
fi
|
||||
done
|
||||
@ -1,89 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
|
||||
checkmd5(){
|
||||
local nowmd5=$(md5sum /tmp/adguard.list 2>/dev/null)
|
||||
nowmd5=${nowmd5%% *}
|
||||
local lastmd5=$(uci get AdGuardHome.AdGuardHome.gfwlistmd5 2>/dev/null)
|
||||
if [ "$nowmd5" != "$lastmd5" ]; then
|
||||
uci set AdGuardHome.AdGuardHome.gfwlistmd5="$nowmd5"
|
||||
uci commit AdGuardHome
|
||||
[ "$1" == "noreload" ] || /etc/init.d/AdGuardHome reload
|
||||
fi
|
||||
}
|
||||
|
||||
configpath=$(uci get AdGuardHome.AdGuardHome.configpath 2>/dev/null)
|
||||
[ "$1" == "del" ] && sed -i '/programaddstart/,/programaddend/d' $configpath && checkmd5 "$2" && exit 0
|
||||
gfwupstream=$(uci get AdGuardHome.AdGuardHome.gfwupstream 2>/dev/null)
|
||||
if [ -z $gfwupstream ]; then
|
||||
gfwupstream="tcp://208.67.220.220:5353"
|
||||
fi
|
||||
if [ ! -f "$configpath" ]; then
|
||||
echo "please make a config first"
|
||||
exit 1
|
||||
fi
|
||||
wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O- | base64 -d > /tmp/gfwlist.txt
|
||||
cat /tmp/gfwlist.txt | awk -v upst="$gfwupstream" 'BEGIN{getline;}{
|
||||
s1=substr($0,1,1);
|
||||
if (s1=="!")
|
||||
{next;}
|
||||
if (s1=="@"){
|
||||
$0=substr($0,3);
|
||||
s1=substr($0,1,1);
|
||||
white=1;}
|
||||
else{
|
||||
white=0;
|
||||
}
|
||||
|
||||
if (s1=="|")
|
||||
{s2=substr($0,2,1);
|
||||
if (s2=="|")
|
||||
{
|
||||
$0=substr($0,3);
|
||||
split($0,d,"/");
|
||||
$0=d[1];
|
||||
}else{
|
||||
split($0,d,"/");
|
||||
$0=d[3];
|
||||
}}
|
||||
else{
|
||||
split($0,d,"/");
|
||||
$0=d[1];
|
||||
}
|
||||
star=index($0,"*");
|
||||
if (star!=0)
|
||||
{
|
||||
$0=substr($0,star+1);
|
||||
dot=index($0,".");
|
||||
if (dot!=0)
|
||||
$0=substr($0,dot+1);
|
||||
else
|
||||
next;
|
||||
s1=substr($0,1,1);
|
||||
}
|
||||
if (s1==".")
|
||||
{fin=substr($0,2);}
|
||||
else{fin=$0;}
|
||||
if (index(fin,".")==0) next;
|
||||
if (index(fin,"%")!=0) next;
|
||||
if (index(fin,":")!=0) next;
|
||||
match(fin,"^[0-9\.]+")
|
||||
if (RSTART==1 && RLENGTH==length(fin)) {print "ipset add gfwlist "fin>"/tmp/doipset.sh";next;}
|
||||
if (fin=="" || finl==fin) next;
|
||||
finl=fin;
|
||||
if (white==0)
|
||||
{print(" - '\''[/"fin"/]"upst"'\''");}
|
||||
else{
|
||||
print(" - '\''[/"fin"/]#'\''");}
|
||||
}END{print(" - '\''[/programaddend/]#'\''")}' > /tmp/adguard.list
|
||||
grep programaddstart $configpath
|
||||
if [ "$?" == "0" ]; then
|
||||
sed -i '/programaddstart/,/programaddend/c\ - '\''\[\/programaddstart\/\]#'\''' $configpath
|
||||
sed -i '/programaddstart/'r/tmp/adguard.list $configpath
|
||||
else
|
||||
sed -i '1i\ - '\''[/programaddstart/]#'\''' /tmp/adguard.list
|
||||
sed -i '/upstream_dns:/'r/tmp/adguard.list $configpath
|
||||
fi
|
||||
checkmd5 "$2"
|
||||
rm -f /tmp/gfwlist.txt /tmp/adguard.list
|
||||
@ -1,3 +0,0 @@
|
||||
https://github.com/AdguardTeam/AdGuardHome/releases/download/${latest_ver}/AdGuardHome_linux_${Arch}.tar.gz
|
||||
https://static.adguard.com/adguardhome/release/AdGuardHome_linux_${Arch}.tar.gz
|
||||
#https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_${Arch}.tar.gz
|
||||
@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
tail -n $1 "$2" > /var/run/tailtmp
|
||||
cat /var/run/tailtmp > "$2"
|
||||
rm /var/run/tailtmp
|
||||
@ -1,236 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
binpath=$(uci get AdGuardHome.AdGuardHome.binpath)
|
||||
if [ -z "$binpath" ]; then
|
||||
uci set AdGuardHome.AdGuardHome.binpath="/tmp/AdGuardHome/AdGuardHome"
|
||||
binpath="/tmp/AdGuardHome/AdGuardHome"
|
||||
fi
|
||||
mkdir -p ${binpath%/*}
|
||||
upxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null)
|
||||
|
||||
check_if_already_running(){
|
||||
running_tasks="$(ps |grep "AdGuardHome" |grep "update_core" |grep -v "grep" |awk '{print $1}' |wc -l)"
|
||||
[ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." && EXIT 2
|
||||
}
|
||||
|
||||
check_wgetcurl(){
|
||||
which curl && downloader="curl -L -k --retry 2 --connect-timeout 20 -o" && return
|
||||
which wget-ssl && downloader="wget-ssl --no-check-certificate -t 2 -T 20 -O" && return
|
||||
[ -z "$1" ] && opkg update || (echo error opkg && EXIT 1)
|
||||
[ -z "$1" ] && (opkg remove wget wget-nossl --force-depends ; opkg install wget ; check_wgetcurl 1 ;return)
|
||||
[ "$1" == "1" ] && (opkg install curl ; check_wgetcurl 2 ; return)
|
||||
echo error curl and wget && EXIT 1
|
||||
}
|
||||
|
||||
check_latest_version(){
|
||||
check_wgetcurl
|
||||
latest_ver="$($downloader - https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E 'v[0-9.]+' -o 2>/dev/null)"
|
||||
if [ -z "${latest_ver}" ]; then
|
||||
echo -e "\nFailed to check latest version, please try again later." && EXIT 1
|
||||
fi
|
||||
now_ver="$($binpath -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o)"
|
||||
if [ "${latest_ver}"x != "${now_ver}"x ] || [ "$1" == "force" ]; then
|
||||
echo -e "Local version: ${now_ver}., cloud version: ${latest_ver}."
|
||||
doupdate_core
|
||||
else
|
||||
echo -e "\nLocal version: ${now_ver}, cloud version: ${latest_ver}."
|
||||
echo -e "You're already using the latest version."
|
||||
if [ ! -z "$upxflag" ]; then
|
||||
filesize=$(ls -l $binpath | awk '{ print $5 }')
|
||||
if [ $filesize -gt 8000000 ]; then
|
||||
echo -e "start upx may take a long time"
|
||||
doupx
|
||||
mkdir -p "/tmp/AdGuardHomeupdate/AdGuardHome" >/dev/null 2>&1
|
||||
rm -fr /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}
|
||||
/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $binpath -o /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}
|
||||
rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux
|
||||
/etc/init.d/AdGuardHome stop nobackup
|
||||
rm $binpath
|
||||
mv -f /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} $binpath
|
||||
/etc/init.d/AdGuardHome start
|
||||
echo -e "finished"
|
||||
fi
|
||||
fi
|
||||
EXIT 0
|
||||
fi
|
||||
}
|
||||
|
||||
doupx(){
|
||||
Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
|
||||
case $Archt in
|
||||
"i386")
|
||||
Arch="i386"
|
||||
;;
|
||||
"i686")
|
||||
Arch="i386"
|
||||
echo -e "i686 use $Arch may have bug"
|
||||
;;
|
||||
"x86")
|
||||
Arch="amd64"
|
||||
;;
|
||||
"mipsel")
|
||||
Arch="mipsel"
|
||||
;;
|
||||
"mips64el")
|
||||
Arch="mips64el"
|
||||
Arch="mipsel"
|
||||
echo -e "mips64el use $Arch may have bug"
|
||||
;;
|
||||
"mips")
|
||||
Arch="mips"
|
||||
;;
|
||||
"mips64")
|
||||
Arch="mips64"
|
||||
Arch="mips"
|
||||
echo -e "mips64 use $Arch may have bug"
|
||||
;;
|
||||
"arm")
|
||||
Arch="arm"
|
||||
;;
|
||||
"armeb")
|
||||
Arch="armeb"
|
||||
;;
|
||||
"aarch64")
|
||||
Arch="arm64"
|
||||
;;
|
||||
"powerpc")
|
||||
Arch="powerpc"
|
||||
;;
|
||||
"powerpc64")
|
||||
Arch="powerpc64"
|
||||
;;
|
||||
*)
|
||||
echo -e "error not support $Archt if you can use offical release please issue a bug"
|
||||
EXIT 1
|
||||
;;
|
||||
esac
|
||||
upx_latest_ver="$($downloader - https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E '[0-9.]+' -o 2>/dev/null)"
|
||||
$downloader /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz "https://github.com/upx/upx/releases/download/v${upx_latest_ver}/upx-${upx_latest_ver}-${Arch}_linux.tar.xz" 2>&1
|
||||
#tar xvJf
|
||||
which xz || (opkg list | grep ^xz || opkg update && opkg install xz) || (echo "xz download fail" && EXIT 1)
|
||||
mkdir -p /tmp/upx-${upx_latest_ver}-${Arch}_linux
|
||||
xz -d -c /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz| tar -x -C "/tmp" >/dev/null 2>&1
|
||||
if [ ! -e "/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx" ]; then
|
||||
echo -e "Failed to download upx."
|
||||
EXIT 1
|
||||
fi
|
||||
rm /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz
|
||||
}
|
||||
|
||||
doupdate_core(){
|
||||
echo -e "Updating core..."
|
||||
mkdir -p "/tmp/AdGuardHomeupdate"
|
||||
rm -rf /tmp/AdGuardHomeupdate/* >/dev/null 2>&1
|
||||
Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
|
||||
case $Archt in
|
||||
"i386")
|
||||
Arch="386"
|
||||
;;
|
||||
"i686")
|
||||
Arch="386"
|
||||
;;
|
||||
"x86")
|
||||
Arch="amd64"
|
||||
;;
|
||||
"mipsel")
|
||||
Arch="mipsle"
|
||||
;;
|
||||
"mips64el")
|
||||
Arch="mips64le"
|
||||
Arch="mipsle"
|
||||
echo -e "mips64el use $Arch may have bug"
|
||||
;;
|
||||
"mips")
|
||||
Arch="mips"
|
||||
;;
|
||||
"mips64")
|
||||
Arch="mips64"
|
||||
Arch="mips"
|
||||
echo -e "mips64 use $Arch may have bug"
|
||||
;;
|
||||
"arm")
|
||||
Arch="arm"
|
||||
;;
|
||||
"aarch64")
|
||||
Arch="arm64"
|
||||
;;
|
||||
"powerpc")
|
||||
Arch="ppc"
|
||||
echo -e "error not support $Archt"
|
||||
EXIT 1
|
||||
;;
|
||||
"powerpc64")
|
||||
Arch="ppc64"
|
||||
echo -e "error not support $Archt"
|
||||
EXIT 1
|
||||
;;
|
||||
*)
|
||||
echo -e "error not support $Archt if you can use offical release please issue a bug"
|
||||
EXIT 1
|
||||
;;
|
||||
esac
|
||||
echo -e "start download"
|
||||
grep -v "^#" /usr/share/AdGuardHome/links.txt >/tmp/run/AdHlinks.txt
|
||||
while read link
|
||||
do
|
||||
eval link="$link"
|
||||
$downloader /tmp/AdGuardHomeupdate/${link##*/} "$link" 2>&1
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "download failed try another download"
|
||||
rm -f /tmp/AdGuardHomeupdate/${link##*/}
|
||||
else
|
||||
local success="1"
|
||||
break
|
||||
fi
|
||||
done < "/tmp/run/AdHlinks.txt"
|
||||
rm /tmp/run/AdHlinks.txt
|
||||
[ -z "$success" ] && echo "no download success" && EXIT 1
|
||||
if [ "${link##*.}" == "gz" ]; then
|
||||
tar -zxf "/tmp/AdGuardHomeupdate/${link##*/}" -C "/tmp/AdGuardHomeupdate/"
|
||||
if [ ! -e "/tmp/AdGuardHomeupdate/AdGuardHome" ]; then
|
||||
echo -e "Failed to download core."
|
||||
rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1
|
||||
EXIT 1
|
||||
fi
|
||||
downloadbin="/tmp/AdGuardHomeupdate/AdGuardHome/AdGuardHome"
|
||||
else
|
||||
downloadbin="/tmp/AdGuardHomeupdate/${link##*/}"
|
||||
fi
|
||||
chmod 755 $downloadbin
|
||||
echo -e "download success start copy"
|
||||
if [ -n "$upxflag" ]; then
|
||||
echo -e "start upx may take a long time"
|
||||
doupx
|
||||
/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $downloadbin
|
||||
rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux
|
||||
fi
|
||||
echo -e "start copy"
|
||||
/etc/init.d/AdGuardHome stop nobackup
|
||||
rm "$binpath"
|
||||
mv -f "$downloadbin" "$binpath"
|
||||
if [ "$?" == "1" ]; then
|
||||
echo "mv failed maybe not enough space please use upx or change bin to /tmp/AdGuardHome"
|
||||
EXIT 1
|
||||
fi
|
||||
/etc/init.d/AdGuardHome start
|
||||
rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1
|
||||
echo -e "Succeeded in updating core."
|
||||
echo -e "Local version: ${latest_ver}, cloud version: ${latest_ver}.\n"
|
||||
EXIT 0
|
||||
}
|
||||
|
||||
EXIT(){
|
||||
rm /var/run/update_core 2>/dev/null
|
||||
[ "$1" != "0" ] && touch /var/run/update_core_error
|
||||
exit $1
|
||||
}
|
||||
|
||||
main(){
|
||||
check_if_already_running
|
||||
check_latest_version $1
|
||||
}
|
||||
trap "EXIT 1" SIGTERM SIGINT
|
||||
touch /var/run/update_core
|
||||
rm /var/run/update_core_error 2>/dev/null
|
||||
main $1
|
||||
@ -1,35 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
count=0
|
||||
while :
|
||||
do
|
||||
ping -c 1 -W 1 -q www.baidu.com 1>/dev/null 2>&1
|
||||
if [ "$?" == "0" ]; then
|
||||
/etc/init.d/AdGuardHome force_reload
|
||||
break
|
||||
fi
|
||||
ping -c 1 -W 1 -q 202.108.22.5 1>/dev/null 2>&1
|
||||
if [ "$?" == "0" ]; then
|
||||
/etc/init.d/AdGuardHome force_reload
|
||||
break
|
||||
fi
|
||||
sleep 5
|
||||
ping -c 1 -W 1 -q www.google.com 1>/dev/null 2>&1
|
||||
if [ "$?" == "0" ]; then
|
||||
/etc/init.d/AdGuardHome force_reload
|
||||
break
|
||||
fi
|
||||
ping -c 1 -W 1 -q 8.8.8.8 1>/dev/null 2>&1
|
||||
if [ "$?" == "0" ]; then
|
||||
/etc/init.d/AdGuardHome force_reload
|
||||
break
|
||||
fi
|
||||
sleep 5
|
||||
count=$((count+1))
|
||||
if [ $count -gt 18 ]; then
|
||||
/etc/init.d/AdGuardHome force_reload
|
||||
break
|
||||
fi
|
||||
done
|
||||
return 0
|
||||
@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
configpath=$(uci get AdGuardHome.AdGuardHome.configpath)
|
||||
while :
|
||||
do
|
||||
sleep 10
|
||||
if [ -f "$configpath" ]; then
|
||||
/etc/init.d/AdGuardHome do_redirect 1
|
||||
break
|
||||
fi
|
||||
done
|
||||
return 0
|
||||
@ -1 +0,0 @@
|
||||
!function(n){"object"==typeof exports&&"object"==typeof module?n(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)}(function(n){"use strict";function e(e,o,i,t){if(i&&i.call){var l=i;i=null}else l=r(e,i,"rangeFinder");"number"==typeof o&&(o=n.Pos(o,0));var f=r(e,i,"minFoldSize");function d(n){var r=l(e,o);if(!r||r.to.line-r.from.line<f)return null;for(var i=e.findMarksAt(r.from),d=0;d<i.length;++d)if(i[d].__isFold&&"fold"!==t){if(!n)return null;r.cleared=!0,i[d].clear()}return r}var u=d(!0);if(r(e,i,"scanUp"))for(;!u&&o.line>e.firstLine();)o=n.Pos(o.line-1,0),u=d(!1);if(u&&!u.cleared&&"unfold"!==t){var a=function(n,e){var o=r(n,e,"widget");if("string"==typeof o){var i=document.createTextNode(o);(o=document.createElement("span")).appendChild(i),o.className="CodeMirror-foldmarker"}else o&&(o=o.cloneNode(!0));return o}(e,i);n.on(a,"mousedown",function(e){c.clear(),n.e_preventDefault(e)});var c=e.markText(u.from,u.to,{replacedWith:a,clearOnEnter:r(e,i,"clearOnEnter"),__isFold:!0});c.on("clear",function(o,r){n.signal(e,"unfold",e,o,r)}),n.signal(e,"fold",e,u.from,u.to)}}n.newFoldFunction=function(n,o){return function(r,i){e(r,i,{rangeFinder:n,widget:o})}},n.defineExtension("foldCode",function(n,o,r){e(this,n,o,r)}),n.defineExtension("isFolded",function(n){for(var e=this.findMarksAt(n),o=0;o<e.length;++o)if(e[o].__isFold)return!0}),n.commands.toggleFold=function(n){n.foldCode(n.getCursor())},n.commands.fold=function(n){n.foldCode(n.getCursor(),null,"fold")},n.commands.unfold=function(n){n.foldCode(n.getCursor(),null,"unfold")},n.commands.foldAll=function(e){e.operation(function(){for(var o=e.firstLine(),r=e.lastLine();o<=r;o++)e.foldCode(n.Pos(o,0),null,"fold")})},n.commands.unfoldAll=function(e){e.operation(function(){for(var o=e.firstLine(),r=e.lastLine();o<=r;o++)e.foldCode(n.Pos(o,0),null,"unfold")})},n.registerHelper("fold","combine",function(){var n=Array.prototype.slice.call(arguments,0);return function(e,o){for(var r=0;r<n.length;++r){var i=n[r](e,o);if(i)return i}}}),n.registerHelper("fold","auto",function(n,e){for(var o=n.getHelpers(e,"fold"),r=0;r<o.length;r++){var i=o[r](n,e);if(i)return i}});var o={rangeFinder:n.fold.auto,widget:"↔",minFoldSize:0,scanUp:!1,clearOnEnter:!0};function r(n,e,r){if(e&&void 0!==e[r])return e[r];var i=n.options.foldOptions;return i&&void 0!==i[r]?i[r]:o[r]}n.defineOption("foldOptions",null),n.defineExtension("foldOption",function(n,e){return r(this,n,e)})});
|
||||
@ -1 +0,0 @@
|
||||
.CodeMirror-foldmarker{color:blue;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"\25BE"}.CodeMirror-foldgutter-folded:after{content:"\25B8"}
|
||||
@ -1 +0,0 @@
|
||||
!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("./foldcode")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./foldcode"],t):t(CodeMirror)}(function(t){"use strict";t.defineOption("foldGutter",!1,function(o,e,r){r&&r!=t.Init&&(o.clearGutter(o.state.foldGutter.options.gutter),o.state.foldGutter=null,o.off("gutterClick",a),o.off("changes",d),o.off("viewportChange",u),o.off("fold",l),o.off("unfold",l),o.off("swapDoc",d)),e&&(o.state.foldGutter=new function(t){this.options=t,this.from=this.to=0}(function(t){!0===t&&(t={});null==t.gutter&&(t.gutter="CodeMirror-foldgutter");null==t.indicatorOpen&&(t.indicatorOpen="CodeMirror-foldgutter-open");null==t.indicatorFolded&&(t.indicatorFolded="CodeMirror-foldgutter-folded");return t}(e)),f(o),o.on("gutterClick",a),o.on("changes",d),o.on("viewportChange",u),o.on("fold",l),o.on("unfold",l),o.on("swapDoc",d))});var o=t.Pos;function e(t,e){for(var r=t.findMarks(o(e,0),o(e+1,0)),n=0;n<r.length;++n)if(r[n].__isFold){var i=r[n].find(-1);if(i&&i.line===e)return r[n]}}function r(t){if("string"==typeof t){var o=document.createElement("div");return o.className=t+" CodeMirror-guttermarker-subtle",o}return t.cloneNode(!0)}function n(t,n,f){var a=t.state.foldGutter.options,d=n-1,u=t.foldOption(a,"minFoldSize"),l=t.foldOption(a,"rangeFinder"),c="string"==typeof a.indicatorFolded&&i(a.indicatorFolded),s="string"==typeof a.indicatorOpen&&i(a.indicatorOpen);t.eachLine(n,f,function(n){++d;var i=null,f=n.gutterMarkers;if(f&&(f=f[a.gutter]),e(t,d)){if(c&&f&&c.test(f.className))return;i=r(a.indicatorFolded)}else{var p=o(d,0),m=l&&l(t,p);if(m&&m.to.line-m.from.line>=u){if(s&&f&&s.test(f.className))return;i=r(a.indicatorOpen)}}(i||f)&&t.setGutterMarker(n,a.gutter,i)})}function i(t){return new RegExp("(^|\\s)"+t+"(?:$|\\s)\\s*")}function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation(function(){n(t,o.from,o.to)}),e.from=o.from,e.to=o.to)}function a(t,r,n){var i=t.state.foldGutter;if(i){var f=i.options;if(n==f.gutter){var a=e(t,r);a?a.clear():t.foldCode(o(r,0),f)}}}function d(t){var o=t.state.foldGutter;if(o){var e=o.options;o.from=o.to=0,clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){f(t)},e.foldOnChangeTimeSpan||600)}}function u(t){var o=t.state.foldGutter;if(o){var e=o.options;clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){var e=t.getViewport();o.from==o.to||e.from-o.to>20||o.from-e.to>20?f(t):t.operation(function(){e.from<o.from&&(n(t,e.from,o.from),o.from=e.from),e.to>o.to&&(n(t,o.to,e.to),o.to=e.to)})},e.updateViewportTimeSpan||400)}}function l(t,o){var e=t.state.foldGutter;if(e){var r=o.line;r>=e.from&&r<e.to&&n(t,r,r+1)}}});
|
||||
@ -1 +0,0 @@
|
||||
!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";function n(n,t){var i=n.getLine(t),o=i.search(/\S/);return-1==o||/\bcomment\b/.test(n.getTokenTypeAt(e.Pos(t,o+1)))?-1:e.countColumn(i,null,n.getOption("tabSize"))}e.registerHelper("fold","indent",function(t,i){var o=n(t,i.line);if(!(o<0)){for(var r=null,l=i.line+1,f=t.lastLine();l<=f;++l){var u=n(t,l);if(-1==u);else{if(!(u>o))break;r=l}}return r?{from:e.Pos(i.line,t.getLine(i.line).length),to:e.Pos(r,t.getLine(r).length)}:void 0}})});
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
||||
!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(e){"use strict";e.defineMode("yaml",function(){var e=new RegExp("\\b(("+["true","false","on","off","yes","no"].join(")|(")+"))$","i");return{token:function(i,t){var r=i.peek(),n=t.escaped;if(t.escaped=!1,"#"==r&&(0==i.pos||/\s/.test(i.string.charAt(i.pos-1))))return i.skipToEnd(),"comment";if(i.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))return"string";if(t.literal&&i.indentation()>t.keyCol)return i.skipToEnd(),"string";if(t.literal&&(t.literal=!1),i.sol()){if(t.keyCol=0,t.pair=!1,t.pairStart=!1,i.match(/---/))return"def";if(i.match(/\.\.\./))return"def";if(i.match(/\s*-\s+/))return"meta"}if(i.match(/^(\{|\}|\[|\])/))return"{"==r?t.inlinePairs++:"}"==r?t.inlinePairs--:"["==r?t.inlineList++:t.inlineList--,"meta";if(t.inlineList>0&&!n&&","==r)return i.next(),"meta";if(t.inlinePairs>0&&!n&&","==r)return t.keyCol=0,t.pair=!1,t.pairStart=!1,i.next(),"meta";if(t.pairStart){if(i.match(/^\s*(\||\>)\s*/))return t.literal=!0,"meta";if(i.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i))return"variable-2";if(0==t.inlinePairs&&i.match(/^\s*-?[0-9\.\,]+\s?$/))return"number";if(t.inlinePairs>0&&i.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/))return"number";if(i.match(e))return"keyword"}return!t.pair&&i.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)?(t.pair=!0,t.keyCol=i.indentation(),"atom"):t.pair&&i.match(/^:\s*/)?(t.pairStart=!0,"meta"):(t.pairStart=!1,t.escaped="\\"==r,i.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:"#",fold:"indent"}}),e.defineMIME("text/x-yaml","yaml"),e.defineMIME("text/yaml","yaml")});
|
||||
@ -1 +0,0 @@
|
||||
.cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36 !important;color:#f8f8f2 !important;border:0}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,0.10)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:white}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-keyword{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute{color:#50fa7b}.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-variable-3,.cm-s-dracula span.cm-type{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:rgba(255,255,255,0.1)}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:white !important}
|
||||
File diff suppressed because one or more lines are too long
@ -1,13 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-airwhu
|
||||
PKG_VERSION=1.0
|
||||
PKG_RELEASE:=1
|
||||
LUCI_TITLE:=luci-app-airwhu
|
||||
LUCI_PKGARCH:=all
|
||||
LUCI_DEPENDS:=+mentohust +kmod-ipt-nat6
|
||||
LUCI_DESCRIPTION:=LuCI web-interface for Ruijie 802.1X Client with IPv6 NAT.
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@ -1,5 +0,0 @@
|
||||
module("luci.controller.airwhu", package.seeall)
|
||||
|
||||
function index()
|
||||
entry({"admin", "services", "AirWHU"}, cbi("airwhu"), _("AirWHU"), 100)
|
||||
end
|
||||
@ -1,115 +0,0 @@
|
||||
--[[
|
||||
|
||||
LuCI - Lua Configuration Interface
|
||||
LICENSE under GPLv3.
|
||||
Copyright 2017 KyleRicardo[W.B.L.E. TeAm] <shaoyz714@126.com>
|
||||
|
||||
]]
|
||||
--
|
||||
require("luci.sys")
|
||||
require("luci.tools.webadmin")
|
||||
|
||||
local IsOnAir = (luci.sys.call("pidof mentohust > /dev/null") == 0)
|
||||
if IsOnAir then
|
||||
state_msg = "<b><font color=\"green\">" .. translate("Running") .. "</font></b>"
|
||||
else
|
||||
state_msg = "<b><font color=\"red\">" .. translate("Not Running") .. "</font></b>"
|
||||
end
|
||||
|
||||
m = Map("airwhu", translate("AirWHU"), translate("Configure Ruijie 802.1X client with IPv6 NAT based on Masquerade.") .. "<br /><br />" .. translate("Status") .. " : " .. state_msg)
|
||||
|
||||
s = m:section(TypedSection, "switch", translate("Global Switch"), translate("Configure global 802.1X Authentication and IPv6-NAT on-off."))
|
||||
s.addremove = false
|
||||
s.anonymous = true
|
||||
|
||||
s:option(Flag, "enableauth", translate("Enable 802.1X Auth"), translate("Enable or disable Ruijie 802.1X authentication."))
|
||||
tmp = s:option(Flag, "startwithboot", translate("Start with boot"), translate("Start Ruijie 802.1X Authentication based on MentoHUST when the router is booting."))
|
||||
tmp:depends("enableauth","1")
|
||||
s:option(Flag, "enableipv6", translate("Enable IPv6 NAT"), translate("Enable IPv6 NAT pass-through based on ip6tables MASQUERADE."))
|
||||
|
||||
s = m:section(TypedSection, "auth", translate("Config Authentication"), translate("The options below are all of MentoHUST's arguments."))
|
||||
s.anonymous = true
|
||||
s.addremove = false
|
||||
|
||||
ur = s:option(Value, "Username", translate("Username"))
|
||||
ur.rmempty = false
|
||||
|
||||
pw = s:option(Value, "Password", translate("Password"))
|
||||
pw.password = true
|
||||
pw.rmempty = false
|
||||
|
||||
wan_dev = luci.sys.exec("uci get network.wan.ifname")
|
||||
wan_dev = string.sub(wan_dev,1,string.len(wan_dev)-1)
|
||||
ifname = s:option(ListValue, "ifname", translate("Interfaces"))
|
||||
ifname:value(wan_dev)
|
||||
|
||||
s:option(Value, "IP", translate("IP"), translate("default to localhost's IP")).default = "0.0.0.0"
|
||||
|
||||
s:option(Value, "Mask", translate("Netmask"), translate("default to localhost's netmask")).default = "255.255.255.0"
|
||||
|
||||
s:option(Value, "Gateway", translate("Gateway"), translate("default to 0.0.0.0")).default = "0.0.0.0"
|
||||
|
||||
s:option(Value, "DNS", translate("DNS"), translate("default to 0.0.0.0")).default = "0.0.0.0"
|
||||
|
||||
s:option(Value, "PingHost", translate("Ping host"), translate("default to 0.0.0.0,i.e. disable this function")).default = "0.0.0.0"
|
||||
|
||||
s:option(Value, "Timeout", translate("Authenticate timeout(s)"), translate("default to 8s")).default = "8"
|
||||
|
||||
s:option(Value, "EchoInterval", translate("Heartbeat timeout(s)"), translate("default to 30s")).default = "30"
|
||||
|
||||
s:option(Value, "RestartWait", translate("Timeout on failure(s)"), translate("default to 15s")).default = "15"
|
||||
|
||||
s:option(Value, "MaxFail", translate("Max failure times"), translate("0 means no limit,default to 8")).default = "8"
|
||||
|
||||
t = s:option(ListValue, "StartMode", translate("mulcast address"), translate("default to 1"))
|
||||
t:value("0", translate("0(standard)"))
|
||||
t:value("1", translate("1(ruijjie)"))
|
||||
t:value("2", translate("2(saier)"))
|
||||
t.default = "1"
|
||||
|
||||
t = s:option(ListValue, "DHCPMode", translate("DHCP type"), translate("default to 1"))
|
||||
t:value("0", translate("0(not in used)"))
|
||||
t:value("1", translate("1(secondary authenticate)"))
|
||||
t:value("2", translate("2(post authenticate)"))
|
||||
t:value("3", translate("3(pre authenticate)"))
|
||||
t.default = "1"
|
||||
|
||||
t = s:option(ListValue, "DaemonMode", translate("run in daemon mode"), translate("default to 3"))
|
||||
t:value("0", translate("0(no)"))
|
||||
t:value("1", translate("1(yes,turn off output)"))
|
||||
t:value("2", translate("2(yes,persevere output)"))
|
||||
t:value("3", translate("3(yes,output to file)"))
|
||||
t.default = "3"
|
||||
|
||||
s:option(Value, "ShowNotify", translate("display notification"), translate("0(no),1-20(yes),default to 0")).default = "0"
|
||||
|
||||
s:option(Value, "Version", translate("client version"), translate("default to 0.00,compatible with xrgsu")).default = "0.00"
|
||||
|
||||
tmp = s:option(Value, "DataFile", translate("customized data file"), translate("not in used by default"))
|
||||
tmp.rmempty = true
|
||||
|
||||
script = s:option(Value, "DHCPScript", translate("DHCP script"), translate("use dhclient by default"))
|
||||
script.default = "udhcpc -i "..wan_dev
|
||||
|
||||
local apply = luci.http.formvalue("cbi.apply")
|
||||
if apply then
|
||||
if luci.sys.exec("uci get airwhu.@switch[0].enableauth") then
|
||||
luci.sys.exec("/etc/init.d/mentohust restart")
|
||||
else
|
||||
luci.sys.exec("/etc/init.d/mentohust stop")
|
||||
end
|
||||
|
||||
if luci.sys.exec("uci get airwhu.@switch[0].startwithboot") then
|
||||
luci.sys.exec("/etc/init.d/mentohust enable")
|
||||
else
|
||||
luci.sys.exec("/etc/init.d/mentohust disable")
|
||||
end
|
||||
|
||||
if luci.sys.exec("uci get airwhu.@switch[0].enableipv6") then
|
||||
luci.sys.exec("sh /bin/ipv6masq.sh install")
|
||||
else
|
||||
luci.sys.exec("sh /bin/ipv6masq.sh uninstall")
|
||||
end
|
||||
end
|
||||
|
||||
return m
|
||||
@ -1,258 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: airwhu\n"
|
||||
"POT-Creation-Date: 2017-05-11 19:39+0800\n"
|
||||
"PO-Revision-Date: 2017-05-11 19:40+0800\n"
|
||||
"Last-Translator: KyleRicardo <shaoyz714@126.com>\n"
|
||||
"Language-Team: [W.B.L.E. TeAm] <shaoyz714@126.com>\n"
|
||||
"Language: en_US\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.8\n"
|
||||
"X-Poedit-Basepath: ../files\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"X-Poedit-KeywordsList: translate\n"
|
||||
"X-Poedit-SearchPath-0: .\n"
|
||||
|
||||
#: root/usr/lib/lua/luci/controller/airwhu.lua:4
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:19
|
||||
msgid "AirWHU"
|
||||
msgstr "AirWHU"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:14
|
||||
msgid "Running"
|
||||
msgstr "运行中"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:16
|
||||
msgid "Not Running"
|
||||
msgstr "未运行"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:19
|
||||
msgid "Configure Ruijie 802.1X client with IPv6 NAT based on Masquerade."
|
||||
msgstr "配置基于IPv6 Masquerade技术的锐捷802.1X认证网络。"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:19
|
||||
msgid "Status"
|
||||
msgstr "状态"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:21
|
||||
msgid "Global Switch"
|
||||
msgstr "全局开关"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:21
|
||||
msgid "Configure global 802.1X Authentication and IPv6-NAT on-off."
|
||||
msgstr "配置全局802.1X认证与IPv6 NAT开关。"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:25
|
||||
msgid "Enable 802.1X Auth"
|
||||
msgstr "开启锐捷认证"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:25
|
||||
msgid "Enable or disable Ruijie 802.1X authentication."
|
||||
msgstr "打开或关闭锐捷802.1X认证。"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:26
|
||||
msgid "Start with boot"
|
||||
msgstr "开机启动"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:26
|
||||
msgid ""
|
||||
"Start Ruijie 802.1X Authentication based on MentoHUST when the router is "
|
||||
"booting."
|
||||
msgstr "开机自动启动基于MentoHUST的锐捷802.1X认证客户端。"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:28
|
||||
msgid "Enable IPv6 NAT"
|
||||
msgstr "开启IPv6 NAT"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:28
|
||||
msgid "Enable IPv6 NAT pass-through based on ip6tables MASQUERADE."
|
||||
msgstr "开启基于ip6tables Masquerade技术的IPv6 NAT穿透。"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:30
|
||||
msgid "Config Authentication"
|
||||
msgstr "配置认证参数"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:30
|
||||
msgid "The options below are all of MentoHUST's arguments."
|
||||
msgstr "以下是全部的MentoHUST认证参数。"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:34
|
||||
msgid "Username"
|
||||
msgstr "用户名"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:36
|
||||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:41
|
||||
msgid "Interfaces"
|
||||
msgstr "网卡"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:51
|
||||
msgid "IP"
|
||||
msgstr "IP地址"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:51
|
||||
msgid "default to localhost's IP"
|
||||
msgstr "默认为localhost的IP地址"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:53
|
||||
msgid "Netmask"
|
||||
msgstr "掩码"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:53
|
||||
msgid "default to localhost's netmask"
|
||||
msgstr "默认为localhost的掩码"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:55
|
||||
msgid "Gateway"
|
||||
msgstr "网关"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:55
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:57
|
||||
msgid "default to 0.0.0.0"
|
||||
msgstr "默认为0.0.0.0"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:57
|
||||
msgid "DNS"
|
||||
msgstr "DNS服务器"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:59
|
||||
msgid "Ping host"
|
||||
msgstr "Ping主机"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:59
|
||||
msgid "default to 0.0.0.0,i.e. disable this function"
|
||||
msgstr "默认为0.0.0.0,即关闭该功能"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:61
|
||||
msgid "Authenticate timeout(s)"
|
||||
msgstr "认证超时(秒)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:61
|
||||
msgid "default to 8s"
|
||||
msgstr "默认为8秒"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:63
|
||||
msgid "Heartbeat timeout(s)"
|
||||
msgstr "心跳包超时(秒)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:63
|
||||
msgid "default to 30s"
|
||||
msgstr "默认为30秒"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:65
|
||||
msgid "Timeout on failure(s)"
|
||||
msgstr "失败等待(秒)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:65
|
||||
msgid "default to 15s"
|
||||
msgstr "默认为15秒"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:67
|
||||
msgid "Max failure times"
|
||||
msgstr "允许失败次数"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:67
|
||||
msgid "0 means no limit,default to 8"
|
||||
msgstr "0表示无限制,默认为8"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:69
|
||||
msgid "mulcast address"
|
||||
msgstr "多播地址"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:69
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:75
|
||||
msgid "default to 1"
|
||||
msgstr "默认为1"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:70
|
||||
msgid "0(standard)"
|
||||
msgstr "0(标准)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:71
|
||||
msgid "1(ruijjie)"
|
||||
msgstr "1(锐捷)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:72
|
||||
msgid "2(saier)"
|
||||
msgstr "2(赛尔)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:75
|
||||
msgid "DHCP type"
|
||||
msgstr "DHCP方式"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:76
|
||||
msgid "0(not in used)"
|
||||
msgstr "0(不使用)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:77
|
||||
msgid "1(secondary authenticate)"
|
||||
msgstr "1(二次认证)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:78
|
||||
msgid "2(post authenticate)"
|
||||
msgstr "3(认证后)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:79
|
||||
msgid "3(pre authenticate)"
|
||||
msgstr "3(认证前)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:82
|
||||
msgid "run in daemon mode"
|
||||
msgstr "后台运行模式"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:82
|
||||
msgid "default to 3"
|
||||
msgstr "默认为3"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:83
|
||||
msgid "0(no)"
|
||||
msgstr "0(不使用后台模式)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:84
|
||||
msgid "1(yes,turn off output)"
|
||||
msgstr "1(后台模式,关闭输出)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:85
|
||||
msgid "2(yes,persevere output)"
|
||||
msgstr "2(后台模式,保留输出)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:86
|
||||
msgid "3(yes,output to file)"
|
||||
msgstr "3(后台模式,输出到日志文件)"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:89
|
||||
msgid "display notification"
|
||||
msgstr "显示通知"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:89
|
||||
msgid "0(no),1-20(yes),default to 0"
|
||||
msgstr "0(不使用),1-20(使用),默认为0"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:91
|
||||
msgid "client version"
|
||||
msgstr "客户端版本号"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:91
|
||||
msgid "default to 0.00,compatible with xrgsu"
|
||||
msgstr "默认为0.00,表示兼容xrgsu"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:93
|
||||
msgid "customized data file"
|
||||
msgstr "自定义数据文件"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:93
|
||||
msgid "not in used by default"
|
||||
msgstr "默认不使用"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:96
|
||||
msgid "DHCP script"
|
||||
msgstr "DHCP脚本"
|
||||
|
||||
#: root/usr/lib/lua/luci/model/cbi/airwhu.lua:96
|
||||
msgid "use dhclient by default"
|
||||
msgstr "默认使用dhclient"
|
||||
@ -1,40 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
#Author:KyleRicardo
|
||||
#Email:shaoyz714@126.com
|
||||
|
||||
action=$1
|
||||
|
||||
if [ "$action"x = "install"x ]; then
|
||||
uci delete network.globals.ula_prefix
|
||||
|
||||
uci set network.wan6.peerdns='0'
|
||||
uci set network.wan6.dns='240c::6666'
|
||||
|
||||
uci delete network.lan.ip6assign
|
||||
uci set network.lan.ip6addr='BABE:BABE:BABE:BABE::1/64'
|
||||
uci set network.lan.ip6prefix='BABE:BABE:BABE:BABE::/64'
|
||||
|
||||
uci set dhcp.lan.ra_management='1'
|
||||
uci set dhcp.lan.ra_default='1'
|
||||
|
||||
uci set $(uci show firewall|grep Allow-ICMPv6-Forward|sed -e 's/.name[^ ]*'//).enabled='0'
|
||||
|
||||
uci commit
|
||||
|
||||
elif [ "$action"x = "uninstall"x ]; then
|
||||
uci set network.globals.ula_prefix='fdad:91b7:54bb::/48'
|
||||
|
||||
uci delete network.wan6.peerdns='0'
|
||||
uci delete network.wan6.dns='240c::6666'
|
||||
|
||||
uci set network.lan.ip6assign='60'
|
||||
uci delete network.lan.ip6addr='BABE:BABE:BABE:BABE::1/64'
|
||||
uci delete network.lan.ip6prefix='BABE:BABE:BABE:BABE::/64'
|
||||
|
||||
uci delete dhcp.lan.ra_management='1'
|
||||
uci delete dhcp.lan.ra_default='1'
|
||||
|
||||
uci delete $(uci show firewall|grep Allow-ICMPv6-Forward|sed -e 's/.name[^ ]*'//).enabled
|
||||
|
||||
uci commit
|
||||
fi
|
||||
@ -1,26 +0,0 @@
|
||||
|
||||
config switch
|
||||
option enableauth
|
||||
option startwithboot
|
||||
option enableipv6
|
||||
|
||||
config auth
|
||||
option Username
|
||||
option Password
|
||||
option ifname
|
||||
option IP
|
||||
option Mask
|
||||
option Gateway
|
||||
option DNS
|
||||
option PingHost
|
||||
option Timeout
|
||||
option EchoInterval
|
||||
option RestartWait
|
||||
option MaxFail
|
||||
option StartMode
|
||||
option DHCPMode
|
||||
option DaemonMode
|
||||
option ShowNotify
|
||||
option Version
|
||||
option DataFile
|
||||
option DHCPScript
|
||||
@ -1,54 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
#Author:KyleRicardo
|
||||
#Email:shaoyz714@126.com
|
||||
|
||||
[ "$ACTION" = ifup ] || exit 0
|
||||
|
||||
iface=wan6
|
||||
|
||||
[ -z "$iface" -o "$INTERFACE" = "$iface" ] || exit 0
|
||||
|
||||
ip -6 route add `ip -6 route show default|sed -e 's/from [^ ]* //'`
|
||||
logger -t IPv6 "Add IPv6 default route."
|
||||
|
||||
MAX_TRIES=99
|
||||
|
||||
WAN6_NAME="wan6"
|
||||
|
||||
WAN6_INTERFACE=$(uci get "network.$WAN6_NAME.ifname")
|
||||
#eth0.2 by default
|
||||
|
||||
LAN_IP6PREFIX=$(uci get network.lan.ip6prefix)
|
||||
#e.g. aaaa:bbbb:cccc:dddd::/64
|
||||
|
||||
#LAN_ULA_PREFIX=$(uci get network.globals.ula_prefix)
|
||||
#e.g. ddc2:d512:65f5::/48
|
||||
|
||||
PROBE=0
|
||||
|
||||
COUNT=1
|
||||
|
||||
while [ $PROBE -eq 0 ]
|
||||
do
|
||||
if [ $COUNT -gt $MAX_TRIES ];then
|
||||
logger -t NAT6 "No IPv6 route found (reached retry limit $MAX_TRIES times)" && exit 1
|
||||
fi
|
||||
sleep 5
|
||||
logger -t NAT6 "Probing IPv6 route ($COUNT time)"
|
||||
COUNT=$((COUNT+1))
|
||||
PROBE=$(route -A inet6 | grep -c '::/0')
|
||||
done
|
||||
|
||||
#ip6tables -t nat -I POSTROUTING -s "$LAN_ULA_PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE
|
||||
ip6tables -t nat -I POSTROUTING -s "$LAN_IP6PREFIX" -o "$WAN6_INTERFACE" -j MASQUERADE
|
||||
|
||||
#WAN6_GATEWAY=$(route -A inet6 -e | grep "$WAN6_INTERFACE" | awk '/::\/0/{print $2; exit}')
|
||||
#get gateway from routing table. !!!Caution!!! May not work !
|
||||
WAN6_GATEWAY=$(ifconfig eth0.2 | grep 'Global' | awk '{print $3}'| awk -F':' '{print $1":"$2":"$3":"$4"::1"}')
|
||||
#caculate gateway from wan ipv6
|
||||
#WAN6_GATEWAY=$(tracepath6 -n tv.byr.cn | grep ' 1: ' | awk 'NR==1 {print $2}')
|
||||
|
||||
#route -A inet6 add 2000::/3 gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE"
|
||||
route -A inet6 add default gw "$WAN6_GATEWAY" dev "$WAN6_INTERFACE"
|
||||
|
||||
logger -t NAT6 "Done with IPv6 settings"
|
||||
@ -1,47 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
#Author:KyleRicardo
|
||||
#Email:shaoyz714@126.com
|
||||
|
||||
START=65
|
||||
STOP=10
|
||||
|
||||
start()
|
||||
{
|
||||
if [ $(uci get airwhu.@switch[0].enableauth) ];then
|
||||
local Username=$(uci get airwhu.@auth[0].Username)
|
||||
local Password=$(uci get airwhu.@auth[0].Password)
|
||||
local ifname=$(uci get airwhu.@auth[0].ifname)
|
||||
local IP=$(uci get airwhu.@auth[0].IP)
|
||||
local Mask=$(uci get airwhu.@auth[0].Mask)
|
||||
local Gateway=$(uci get airwhu.@auth[0].Gateway)
|
||||
local DNS=$(uci get airwhu.@auth[0].DNS)
|
||||
local PingHost=$(uci get airwhu.@auth[0].PingHost)
|
||||
local Timeout=$(uci get airwhu.@auth[0].Timeout)
|
||||
local EchoInterval=$(uci get airwhu.@auth[0].EchoInterval)
|
||||
local RestartWait=$(uci get airwhu.@auth[0].RestartWait)
|
||||
local MaxFail=$(uci get airwhu.@auth[0].MaxFail)
|
||||
local StartMode=$(uci get airwhu.@auth[0].StartMode)
|
||||
local DHCPMode=$(uci get airwhu.@auth[0].DHCPMode)
|
||||
local DaemonMode=$(uci get airwhu.@auth[0].DaemonMode)
|
||||
local ShowNotify=$(uci get airwhu.@auth[0].ShowNotify)
|
||||
local Version=$(uci get airwhu.@auth[0].Version)
|
||||
local DataFile=$(uci get airwhu.@auth[0].DataFile)
|
||||
local DHCPScript=$(uci get airwhu.@auth[0].DHCPScript)
|
||||
mentohust -u$Username -p$Password -n$ifname -b$DaemonMode -a$StartMode -d$DaemonMode -c"$DHCPScript" -w>/dev/null 2>&1
|
||||
#Temporarily designed only for whu. To be continued...
|
||||
else
|
||||
stop
|
||||
fi
|
||||
}
|
||||
|
||||
stop()
|
||||
{
|
||||
sync
|
||||
mentohust -k >/dev/null 2>&1
|
||||
}
|
||||
|
||||
restart()
|
||||
{
|
||||
stop
|
||||
start
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=Open App Filter Module
|
||||
LUCI_PKGARCH:=all
|
||||
LUCI_DEPENDS:=+appfilter
|
||||
|
||||
PKG_NAME:=luci-app-appfilter
|
||||
PKG_VERSION:=5.0.1
|
||||
PKG_RELEASE:=1
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
File diff suppressed because one or more lines are too long
@ -1,197 +0,0 @@
|
||||
|
||||
module("luci.controller.appfilter", package.seeall)
|
||||
local utl = require "luci.util"
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/appfilter") then
|
||||
return
|
||||
end
|
||||
|
||||
local page
|
||||
--hide save button
|
||||
page = entry({"admin", "network", "appfilter"}, arcombine(cbi("appfilter/appfilter"), cbi("appfilter/dev_status", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true})), _("appfilter"), 100)
|
||||
|
||||
page.leaf = true
|
||||
page.subindex = true
|
||||
|
||||
--page.dependent = true
|
||||
|
||||
page = entry({"admin", "network", "user_status"}, call("user_status"), nil)
|
||||
page.leaf = true
|
||||
|
||||
page = entry({"admin", "network", "dev_app_status"}, call("dev_app_status"), nil)
|
||||
page.leaf = true
|
||||
|
||||
page = entry({"admin", "network", "dev_visit_list"}, call("get_dev_visit_list"), nil)
|
||||
page.leaf = true
|
||||
|
||||
page = entry({"admin", "network", "feature_upgrade"}, call("handle_feature_upgrade"), nil)
|
||||
page.leaf = true
|
||||
|
||||
page = entry({"admin", "network", "dev_visit_time"}, call("get_dev_visit_time"), nil)
|
||||
page.leaf = true
|
||||
page = entry({"admin", "network", "app_class_visit_time"}, call("get_app_class_visit_time"), nil)
|
||||
page.leaf = true
|
||||
end
|
||||
|
||||
function get_hostname_by_mac(dst_mac)
|
||||
leasefile="/tmp/dhcp.leases"
|
||||
local fd = io.open(leasefile, "r")
|
||||
if not fd then return end
|
||||
while true do
|
||||
local ln = fd:read("*l")
|
||||
if not ln then
|
||||
break
|
||||
end
|
||||
local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
|
||||
if dst_mac == mac then
|
||||
fd:close()
|
||||
return name
|
||||
end
|
||||
end
|
||||
fd:close()
|
||||
return ""
|
||||
end
|
||||
|
||||
|
||||
function handle_feature_upgrade()
|
||||
local fs = require "nixio.fs"
|
||||
local http = require "luci.http"
|
||||
local image_tmp = "/tmp/feature.cfg"
|
||||
|
||||
local fp
|
||||
http.setfilehandler(
|
||||
function(meta, chunk, eof)
|
||||
|
||||
fp = io.open(image_tmp, "w")
|
||||
|
||||
if fp and chunk then
|
||||
fp:write(chunk)
|
||||
end
|
||||
if fp and eof then
|
||||
fp:close()
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
|
||||
end
|
||||
|
||||
function get_app_name_by_id(appid)
|
||||
local class_fd = io.popen("find /tmp/appfilter/ -type f -name *.class |xargs cat |grep "..appid.."|awk '{print $2}'")
|
||||
if class_fd then
|
||||
local name = class_fd:read("*l")
|
||||
class_fd:close()
|
||||
return name
|
||||
end
|
||||
return ""
|
||||
end
|
||||
|
||||
function cmp_func(a,b)
|
||||
return a.latest_time > b.latest_time
|
||||
end
|
||||
|
||||
|
||||
function user_status()
|
||||
local json = require "luci.jsonc"
|
||||
luci.http.prepare_content("application/json")
|
||||
local fd = io.open("/proc/net/af_client","r")
|
||||
status_buf=fd:read('*a')
|
||||
fd:close()
|
||||
user_array=json.parse(status_buf)
|
||||
|
||||
local visit_obj=utl.ubus("appfilter", "visit_list", {});
|
||||
local user_array=visit_obj.dev_list
|
||||
local history={}
|
||||
for i, v in pairs(user_array) do
|
||||
visit_array=user_array[i].visit_info
|
||||
for j,s in pairs(visit_array) do
|
||||
print(user_array[i].mac, user_array[i].ip,visit_array[j].appid, visit_array[j].latest_time)
|
||||
total_time=visit_array[j].latest_time - visit_array[j].first_time;
|
||||
history[#history+1]={
|
||||
mac=user_array[i].mac,
|
||||
ip=user_array[i].ip,
|
||||
hostname=get_hostname_by_mac(user_array[i].mac),
|
||||
appid=visit_array[j].appid,
|
||||
appname=get_app_name_by_id(visit_array[j].appid),
|
||||
--total_num=visit_array[j].total_num,
|
||||
--drop_num=visit_array[j].drop_num,
|
||||
total_num=0,
|
||||
drop_num=0,
|
||||
latest_action=visit_array[j].latest_action,
|
||||
latest_time=os.date("%Y/%m/%d %H:%M:%S", visit_array[j].latest_time),
|
||||
first_time=os.date("%Y/%m/%d %H:%M:%S", visit_array[j].first_time),
|
||||
total_time=total_time
|
||||
}
|
||||
end
|
||||
end
|
||||
table.sort(history, cmp_func)
|
||||
luci.http.write_json(history);
|
||||
end
|
||||
|
||||
|
||||
function dev_app_status()
|
||||
local json = require "luci.jsonc"
|
||||
luci.http.prepare_content("application/json")
|
||||
local visit_obj=utl.ubus("appfilter", "dev_list", {});
|
||||
luci.http.write_json(visit_obj);
|
||||
end
|
||||
|
||||
|
||||
function get_dev_visit_time(mac)
|
||||
local json = require "luci.jsonc"
|
||||
luci.http.prepare_content("application/json")
|
||||
local fd = io.open("/proc/net/af_client","r")
|
||||
status_buf=fd:read('*a')
|
||||
fd:close()
|
||||
user_array=json.parse(status_buf)
|
||||
local req_obj = {}
|
||||
req_obj.mac = mac;
|
||||
local visit_obj=utl.ubus("appfilter", "dev_visit_time", req_obj);
|
||||
local user_array=visit_obj.app_list
|
||||
luci.http.write_json(user_array);
|
||||
end
|
||||
|
||||
function get_app_class_visit_time(mac)
|
||||
local json = require "luci.jsonc"
|
||||
luci.http.prepare_content("application/json")
|
||||
local req_obj = {}
|
||||
req_obj.mac = mac;
|
||||
local visit_obj=utl.ubus("appfilter", "app_class_visit_time", req_obj);
|
||||
local class_array=visit_obj.class_list
|
||||
luci.http.write_json(class_array);
|
||||
end
|
||||
|
||||
|
||||
function get_dev_visit_list(mac)
|
||||
local json = require "luci.jsonc"
|
||||
luci.http.prepare_content("application/json")
|
||||
local req_obj = {}
|
||||
req_obj.mac = mac;
|
||||
|
||||
local visit_obj=utl.ubus("appfilter", "visit_list", req_obj);
|
||||
local user_array=visit_obj.dev_list
|
||||
local history={}
|
||||
for i, v in pairs(user_array) do
|
||||
visit_array=user_array[i].visit_info
|
||||
for j,s in pairs(visit_array) do
|
||||
print(user_array[i].mac, user_array[i].ip,visit_array[j].appid, visit_array[j].latest_time)
|
||||
total_time=visit_array[j].latest_time - visit_array[j].first_time;
|
||||
history[#history+1]={
|
||||
mac=user_array[i].mac,
|
||||
ip=user_array[i].ip,
|
||||
hostname=get_hostname_by_mac(user_array[i].mac),
|
||||
appid=visit_array[j].appid,
|
||||
appname=get_app_name_by_id(visit_array[j].appid),
|
||||
total_num=0,
|
||||
drop_num=0,
|
||||
latest_action=visit_array[j].latest_action,
|
||||
latest_time=os.date("%Y/%m/%d %H:%M:%S", visit_array[j].latest_time),
|
||||
first_time=os.date("%Y/%m/%d %H:%M:%S", visit_array[j].first_time),
|
||||
total_time=total_time
|
||||
}
|
||||
end
|
||||
end
|
||||
table.sort(history, cmp_func)
|
||||
luci.http.write_json(history);
|
||||
end
|
||||
@ -1,225 +0,0 @@
|
||||
|
||||
local ds = require "luci.dispatcher"
|
||||
local nxo = require "nixio"
|
||||
local nfs = require "nixio.fs"
|
||||
local ipc = require "luci.ip"
|
||||
local sys = require "luci.sys"
|
||||
local utl = require "luci.util"
|
||||
local dsp = require "luci.dispatcher"
|
||||
local uci = require "luci.model.uci"
|
||||
local lng = require "luci.i18n"
|
||||
local jsc = require "luci.jsonc"
|
||||
local http = luci.http
|
||||
local SYS = require "luci.sys"
|
||||
local m, s
|
||||
|
||||
m = Map("appfilter",
|
||||
translate("appfilter"),
|
||||
translate(""))
|
||||
|
||||
s = m:section(TypedSection, "global", translate("Basic Settings"))
|
||||
s:option(Flag, "enable", translate("Enable App Filter"),translate(""))
|
||||
s.anonymous = true
|
||||
|
||||
local rule_count=0
|
||||
local version=""
|
||||
if nixio.fs.access("/etc/appfilter/feature.cfg") then
|
||||
rule_count=tonumber(SYS.exec("cat /etc/appfilter/feature.cfg | wc -l"))
|
||||
version=SYS.exec("cat /etc/appfilter/feature.cfg |grep \"#version\" | awk '{print $2}'")
|
||||
end
|
||||
local display_str="<strong>当前版本: </strong>"..version.."<br><strong>特征码个数:</strong> "..rule_count.."<br><strong> 下载地址:</strong><a href=\"https://destan19.github.io\">https://destan19.github.io</a>"
|
||||
s = m:section(TypedSection, "feature", translate("特征库更新"), display_str )
|
||||
|
||||
fu = s:option(FileUpload, "")
|
||||
fu.template = "cbi/oaf_upload"
|
||||
s.anonymous = true
|
||||
|
||||
um = s:option(DummyValue, "rule_data")
|
||||
|
||||
s=m:section(TypedSection,"time",translate("时间控制")) s.anonymous = true
|
||||
hv = s:option(Value, "start_time", translate("开始时间")) hv.default="00:00"
|
||||
hv.optional=false
|
||||
hv = s:option(Value, "end_time", translate("结束时间")) hv.default="23:59"
|
||||
hv.optional=false days = s:option(MultiValue, "days", "", translate(""))
|
||||
days.widget="checkbox" days.size=10
|
||||
days:value("0", "周日");
|
||||
days:value("1", "周一");
|
||||
days:value("2", "周二");
|
||||
days:value("3", "周三");
|
||||
days:value("4", "周四");
|
||||
days:value("5", "周五");
|
||||
days:value("6", "周六");
|
||||
|
||||
--um.value =rule_count .. " " .. translate("Records").. " "..version
|
||||
s = m:section(TypedSection, "appfilter", translate("App Filter Rules"))
|
||||
s.anonymous = true
|
||||
s.addremove = false
|
||||
|
||||
|
||||
local class_fd = io.popen("find /tmp/appfilter/ -type f -name '*.class'")
|
||||
if class_fd then
|
||||
while true do
|
||||
local apps
|
||||
local class
|
||||
local path = class_fd:read("*l")
|
||||
if not path then
|
||||
break
|
||||
end
|
||||
|
||||
class = path:match("([^/]+)%.class$")
|
||||
-- add a tab
|
||||
s:tab(class, translate(class))
|
||||
-- multi value option
|
||||
apps = s:taboption(class, MultiValue, class.."apps", translate(""))
|
||||
apps.rmempty=true
|
||||
--apps.delimiter=";"
|
||||
-- select
|
||||
apps.widget="checkbox"
|
||||
apps.size=10
|
||||
|
||||
local fd = io.open(path)
|
||||
if fd then
|
||||
local line
|
||||
while true do
|
||||
local cmd
|
||||
local cmd_fd
|
||||
line = fd:read("*l")
|
||||
if not line then break end
|
||||
if string.len(line) < 5 then break end
|
||||
if not string.find(line,"#") then
|
||||
cmd = "echo "..line.."|awk '{print $1}'"
|
||||
cmd_fd = io.popen(cmd)
|
||||
id = cmd_fd:read("*l");
|
||||
cmd_fd:close()
|
||||
|
||||
cmd = "echo "..line.."|awk '{print $2}'"
|
||||
cmd_fd = io.popen(cmd)
|
||||
name = cmd_fd:read("*l")
|
||||
|
||||
cmd_fd:close()
|
||||
if not id then break end
|
||||
if not name then break end
|
||||
apps:value(id, name)
|
||||
end
|
||||
end
|
||||
fd:close()
|
||||
end
|
||||
end
|
||||
class_fd:close()
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
function get_hostname_by_mac(dst_mac)
|
||||
leasefile="/tmp/dhcp.leases"
|
||||
local fd = io.open(leasefile, "r")
|
||||
if not fd then return end
|
||||
while true do
|
||||
local ln = fd:read("*l")
|
||||
if not ln then
|
||||
break
|
||||
end
|
||||
local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
|
||||
print(ln)
|
||||
if dst_mac == mac then
|
||||
fd:close()
|
||||
return name
|
||||
end
|
||||
end
|
||||
fd:close()
|
||||
return nil
|
||||
end
|
||||
function get_cmd_result(command)
|
||||
local fd
|
||||
local result
|
||||
fd = io.popen(command);
|
||||
if not fd then return "" end
|
||||
result = fd:read("*l");
|
||||
fd:close()
|
||||
return result
|
||||
end
|
||||
|
||||
s=m:section(TypedSection,"user",translate("Select users"))
|
||||
s.anonymous = true
|
||||
users = s:option(MultiValue, "users", "", translate("Select at least one user, otherwise it will take effect for all users"))
|
||||
users.widget="checkbox"
|
||||
--users.widget="select"
|
||||
users.size=1
|
||||
|
||||
local fd = io.open("/tmp/dev_list", "r")
|
||||
if not fd then return m end
|
||||
while true do
|
||||
local line = fd:read("*l")
|
||||
if not line then
|
||||
break
|
||||
end
|
||||
if not line:match("Id*") then
|
||||
local ip=get_cmd_result(string.format("echo '%s' | awk '{print $3}'", line))
|
||||
local mac=get_cmd_result(string.format("echo '%s' | awk '{print $2}'", line))
|
||||
if mac ~= nil then
|
||||
local hostname=get_hostname_by_mac(mac)
|
||||
if not hostname or hostname == "*" then
|
||||
users:value(mac, mac);
|
||||
else
|
||||
users:value(mac, hostname);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local config_users=m.uci:get_all("appfilter.user.users")
|
||||
if config_users~=nil then
|
||||
local r=utl.split(config_users, "%s+", nil, true)
|
||||
local max = table.getn(r)
|
||||
for i=1,max,1 do
|
||||
users:value(r[i], r[i]);
|
||||
end
|
||||
end
|
||||
m:section(SimpleSection).template = "admin_network/user_status"
|
||||
local dir, fd
|
||||
dir = "/tmp/upload/"
|
||||
nixio.fs.mkdir(dir)
|
||||
http.setfilehandler(
|
||||
function(meta, chunk, eof)
|
||||
if not fd then
|
||||
if not meta then return end
|
||||
if meta and chunk then fd = nixio.open(dir .. meta.file, "w") end
|
||||
if not fd then
|
||||
return
|
||||
end
|
||||
end
|
||||
if chunk and fd then
|
||||
fd:write(chunk)
|
||||
end
|
||||
if eof and fd then
|
||||
fd:close()
|
||||
local fd2 = io.open("/tmp/upload/"..meta.file)
|
||||
local line=fd2:read("*l");
|
||||
fd2:close()
|
||||
local ret=string.match(line, "#version")
|
||||
if ret ~= nil then
|
||||
local cmd="cp /tmp/upload/"..meta.file.." /etc/appfilter/feature.cfg";
|
||||
os.execute(cmd);
|
||||
os.execute("rm /tmp/appfilter -fr");
|
||||
luci.sys.exec("/etc/init.d/appfilter restart &");
|
||||
um.value = translate("更新成功,请刷新页面!")
|
||||
else
|
||||
um.value = translate("更新失败,格式错误!")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
)
|
||||
|
||||
if luci.http.formvalue("upload") then
|
||||
local f = luci.http.formvalue("ulfile")
|
||||
if #f <= 0 then
|
||||
--um.value = translate("No specify upload file.")
|
||||
end
|
||||
elseif luci.http.formvalue("download") then
|
||||
Download()
|
||||
end
|
||||
|
||||
|
||||
return m
|
||||
@ -1,24 +0,0 @@
|
||||
|
||||
local ds = require "luci.dispatcher"
|
||||
local nxo = require "nixio"
|
||||
local nfs = require "nixio.fs"
|
||||
local ipc = require "luci.ip"
|
||||
local sys = require "luci.sys"
|
||||
local utl = require "luci.util"
|
||||
local dsp = require "luci.dispatcher"
|
||||
local uci = require "luci.model.uci"
|
||||
local lng = require "luci.i18n"
|
||||
local jsc = require "luci.jsonc"
|
||||
|
||||
local m, s
|
||||
arg[1] = arg[1] or ""
|
||||
m = Map("appfilter",
|
||||
translate("上网统计("..arg[1]..")"),
|
||||
translate(""))
|
||||
|
||||
local v
|
||||
v=m:section(SimpleSection)
|
||||
v.template="admin_network/dev_status"
|
||||
v.mac=arg[1]
|
||||
m.redirect = luci.dispatcher.build_url("admin", "network", "appfilter")
|
||||
return m
|
||||
@ -1,353 +0,0 @@
|
||||
<style type="text/css">
|
||||
<%
|
||||
local dsp = require "luci.dispatcher"
|
||||
-%>
|
||||
|
||||
#display{
|
||||
display: flex;
|
||||
}
|
||||
|
||||
table.imagetable {
|
||||
font-family: verdana,arial,sans-serif;
|
||||
font-size:11px;
|
||||
color:#333333;
|
||||
border-width: 1px;
|
||||
border-color: #999999;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
<!--
|
||||
table.imagetable th {
|
||||
background:#f5f5f5
|
||||
border-width: 0px;
|
||||
padding: 5px;
|
||||
border-style: solid;
|
||||
border-color: #999999;
|
||||
}
|
||||
table.imagetable td {
|
||||
background:#ffffffff
|
||||
border-width: 0px;
|
||||
padding: 5px;
|
||||
border-style: solid;
|
||||
border-color: #999999;
|
||||
}-->
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript" src="<%=resource%>/echarts.min.js"></script>
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
window.onload =function(){
|
||||
|
||||
}
|
||||
var app_class_data;
|
||||
var app_time_data;
|
||||
var mac='<%=self.mac%>';
|
||||
function get_display_time(total_time){
|
||||
var hour=parseInt(total_time / 3600);
|
||||
var seconds=total_time % 3600;
|
||||
var min=parseInt(seconds / 60)
|
||||
var seconds2=seconds % 60;
|
||||
var total_time_str;
|
||||
|
||||
if (hour > 0)
|
||||
total_time_str=hour + "小时" + min + "分"
|
||||
else{
|
||||
if (min == 0 && seconds2 != 0)
|
||||
min = 1;
|
||||
total_time_str=min + "分"
|
||||
}
|
||||
return total_time_str;
|
||||
}
|
||||
|
||||
function display_app_visit_view(data){
|
||||
var myChart = echarts.init(document.getElementById('main2'));
|
||||
var dev_array=new Array();
|
||||
var m2R2Data=new Array()
|
||||
var total_time=0
|
||||
for(var i = 0; i < data.length; i++){
|
||||
var dev_obj = data[i];
|
||||
var m2_obj={};
|
||||
m2_obj.value=dev_obj.visit_time;
|
||||
m2_obj.legendname=dev_obj.app_id;
|
||||
|
||||
var tmp_time = get_display_time(dev_obj.visit_time);
|
||||
|
||||
m2_obj.name=dev_obj.app_id + " " + tmp_time;
|
||||
total_time+=dev_obj.visit_time
|
||||
m2R2Data.push(m2_obj);
|
||||
}
|
||||
|
||||
var total_time_str = get_display_time(total_time);
|
||||
option = {
|
||||
title: [
|
||||
{
|
||||
text: 'APP时间统计',
|
||||
textStyle: {
|
||||
fontSize: 16,
|
||||
color: "black"
|
||||
},
|
||||
left: "2%"
|
||||
},
|
||||
{
|
||||
text: '',
|
||||
subtext: total_time_str,
|
||||
textStyle:{
|
||||
fontSize:15,
|
||||
color:"black"
|
||||
},
|
||||
subtextStyle: {
|
||||
fontSize: 15,
|
||||
color: 'black'
|
||||
},
|
||||
textAlign:"center",
|
||||
x: '34.5%',
|
||||
y: '44%',
|
||||
}],
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter:function (parms){
|
||||
var total_time = get_display_time(parms.data.value);
|
||||
var str= parms.seriesName+"</br>"+
|
||||
parms.marker+""+parms.data.legendname+"</br>"+
|
||||
"时间:"+ total_time+"</br>"+
|
||||
"占比:"+ parms.percent+"%";
|
||||
return str ;
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
type:"scroll",
|
||||
orient: 'vertical',
|
||||
left:'70%',
|
||||
align:'left',
|
||||
top:'middle',
|
||||
textStyle: {
|
||||
color:'#8C8C8C'
|
||||
},
|
||||
height:250
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "访问时间",
|
||||
type:'pie',
|
||||
center: ['35%', '50%'],
|
||||
radius: ['40%', '65%'],
|
||||
clockwise: false, //饼图的扇区是否是顺时针排布
|
||||
avoidLabelOverlap: false,
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'outter',
|
||||
formatter:function (parms){
|
||||
return parms.data.legendname
|
||||
}
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
normal: {
|
||||
length:8,
|
||||
length2:7,
|
||||
smooth:true,
|
||||
}
|
||||
},
|
||||
data:m2R2Data
|
||||
}
|
||||
]
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
|
||||
function display_app_class_view(data){
|
||||
console.log("begin display.");
|
||||
var myChart = echarts.init(document.getElementById('main'));
|
||||
var dev_array=new Array();
|
||||
var m2R2Data=new Array()
|
||||
var total_time=0
|
||||
for(var i = 0; i < data.length; i++){
|
||||
console.log("begin display222.");
|
||||
|
||||
var dev_obj = data[i];
|
||||
if (dev_obj.visit_time == 0)
|
||||
continue;
|
||||
|
||||
var m2_obj={};
|
||||
m2_obj.value=dev_obj.visit_time;
|
||||
m2_obj.legendname=dev_obj.name;
|
||||
|
||||
var tmp_time = get_display_time(dev_obj.visit_time);
|
||||
|
||||
m2_obj.name=dev_obj.name + " " + tmp_time;
|
||||
total_time+=dev_obj.visit_time
|
||||
m2R2Data.push(m2_obj);
|
||||
}
|
||||
|
||||
var total_time_str = get_display_time(total_time);
|
||||
|
||||
option = {
|
||||
title: [
|
||||
{
|
||||
text: 'APP分类时间统计',
|
||||
textStyle: {
|
||||
fontSize: 16,
|
||||
color: "black"
|
||||
},
|
||||
left: "2%"
|
||||
},
|
||||
{
|
||||
text: '',
|
||||
subtext: total_time_str,
|
||||
textStyle:{
|
||||
fontSize:15,
|
||||
color:"black"
|
||||
},
|
||||
subtextStyle: {
|
||||
fontSize: 15,
|
||||
color: 'black'
|
||||
},
|
||||
textAlign:"center",
|
||||
x: '34.5%',
|
||||
y: '44%',
|
||||
}],
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter:function (parms){
|
||||
var total_time = get_display_time(parms.data.value);
|
||||
var str= parms.seriesName+"</br>"+
|
||||
parms.marker+""+parms.data.legendname+"</br>"+
|
||||
"时间:"+ total_time +"</br>"+
|
||||
"占比:"+ parms.percent+"%";
|
||||
return str ;
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
type:"scroll",
|
||||
orient: 'vertical',
|
||||
left:'70%',
|
||||
align:'left',
|
||||
top:'middle',
|
||||
textStyle: {
|
||||
color:'#8C8C8C'
|
||||
},
|
||||
height:250
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name:'访问时间',
|
||||
type:'pie',
|
||||
center: ['35%', '50%'],
|
||||
radius: ['40%', '65%'],
|
||||
clockwise: false, //饼图的扇区是否是顺时针排布
|
||||
avoidLabelOverlap: false,
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'outter',
|
||||
formatter:function (parms){
|
||||
return parms.data.legendname
|
||||
}
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
normal: {
|
||||
length:8,
|
||||
length2:7,
|
||||
smooth:true,
|
||||
}
|
||||
},
|
||||
data:m2R2Data
|
||||
}
|
||||
]
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
new XHR().get('<%=url('admin/network/app_class_visit_time')%>/' + mac, null,
|
||||
function(x, st)
|
||||
{
|
||||
display_app_class_view(st);
|
||||
}
|
||||
);
|
||||
|
||||
new XHR().get('<%=url('admin/network/dev_visit_time')%>/' + mac, null,
|
||||
function(x, st)
|
||||
{
|
||||
display_app_visit_view(st);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
new XHR().get('<%=url('admin/network/dev_visit_list')%>/' + mac, null,
|
||||
function(x, st)
|
||||
{
|
||||
var tb = document.getElementById('user_status_table');
|
||||
var str=JSON.stringify(st);
|
||||
if (st && tb)
|
||||
{
|
||||
/* clear all rows */
|
||||
while(tb.rows.length > 1)
|
||||
tb.deleteRow(1);
|
||||
for(var i = 0; i < st.length; i++ )
|
||||
{
|
||||
var action_status=""
|
||||
if(st[i].latest_action == 1)
|
||||
action_status="已过滤"
|
||||
else
|
||||
action_status="未过滤"
|
||||
var hostname=""
|
||||
if(st[i].hostname == "" || st[i].hostname == "*"){
|
||||
hostname="?";
|
||||
}
|
||||
else{
|
||||
hostname=st[i].hostname;
|
||||
}
|
||||
var tr = tb.insertRow(-1);
|
||||
//tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
|
||||
tr.insertCell(-1).innerHTML = st[i].appname;
|
||||
tr.insertCell(-1).innerHTML = hostname;
|
||||
tr.insertCell(-1).innerHTML = st[i].mac;
|
||||
tr.insertCell(-1).innerHTML = st[i].first_time;
|
||||
var hour=parseInt(st[i].total_time / 3600);
|
||||
var seconds=st[i].total_time % 3600;
|
||||
var min=parseInt(seconds / 60)
|
||||
var total_time_str;
|
||||
if (st[i].latest_action == 1)
|
||||
total_time_str="-"
|
||||
else {
|
||||
if (hour > 0)
|
||||
total_time_str=hour + "小时" + min + "分"
|
||||
else{
|
||||
if (min == 0)
|
||||
min = 1;
|
||||
total_time_str=min + "分"
|
||||
}
|
||||
}
|
||||
|
||||
tr.insertCell(-1).innerHTML = total_time_str;
|
||||
tr.insertCell(-1).innerHTML = action_status;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
//]]></script>
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<div id="display">
|
||||
<div id="main" style="width: 500px;height:300px;"></div>
|
||||
<div id="main2" style="width: 400px;height:300px;"></div>
|
||||
</div>
|
||||
<table class="imagetable" id="user_status_table">
|
||||
<tr>
|
||||
<th ><%:App%></th>
|
||||
<th ><%:主机名%></th>
|
||||
<th ><%:mac地址%></th>
|
||||
<th><%:开始时间%></th>
|
||||
<th><%:访问时长%></th>
|
||||
<th><%:过滤状态%></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8"><em><br /><%:Collecting data...%></em></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</fieldset>
|
||||
@ -1,150 +0,0 @@
|
||||
<style type="text/css">
|
||||
<%
|
||||
local dsp = require "luci.dispatcher"
|
||||
-%>
|
||||
|
||||
table.imagetable {
|
||||
font-family: verdana,arial,sans-serif;
|
||||
font-size:11px;
|
||||
color:#333333;
|
||||
border-width: 1px;
|
||||
border-color: #999999;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
<!--
|
||||
table.imagetable th {
|
||||
background:#f5f5f5
|
||||
border-width: 0px;
|
||||
padding: 5px;
|
||||
border-style: solid;
|
||||
border-color: #999999;
|
||||
}
|
||||
table.imagetable td {
|
||||
background:#ffffffff
|
||||
border-width: 0px;
|
||||
padding: 5px;
|
||||
border-style: solid;
|
||||
border-color: #999999;
|
||||
}-->
|
||||
</style>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
|
||||
/*
|
||||
XHR.poll(10, '<%=url('admin/network/user_status')%>', null,
|
||||
function(x, st)
|
||||
{
|
||||
var tb = document.getElementById('user_status_table');
|
||||
var str=JSON.stringify(st);
|
||||
if (st && tb)
|
||||
{
|
||||
while(tb.rows.length > 1)
|
||||
tb.deleteRow(1);
|
||||
for(var i = 0; i < st.length; i++ )
|
||||
{
|
||||
var action_status=""
|
||||
if(st[i].latest_action == 1)
|
||||
action_status="已过滤"
|
||||
else
|
||||
action_status="未过滤"
|
||||
var hostname=""
|
||||
if(st[i].hostname == "" || st[i].hostname == "*"){
|
||||
hostname="?";
|
||||
}
|
||||
else{
|
||||
hostname=st[i].hostname;
|
||||
}
|
||||
var tr = tb.insertRow(-1);
|
||||
//tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
|
||||
tr.insertCell(-1).innerHTML = st[i].appname;
|
||||
tr.insertCell(-1).innerHTML = hostname;
|
||||
tr.insertCell(-1).innerHTML = "<a href='<%=url('admin/network/appfilter/')%>"+st[i].mac+"'>"+st[i].mac+"</a>";
|
||||
tr.insertCell(-1).innerHTML = st[i].first_time;
|
||||
var hour=parseInt(st[i].total_time / 3600);
|
||||
var seconds=st[i].total_time % 3600;
|
||||
var min=parseInt(seconds / 60)
|
||||
var total_time_str;
|
||||
if (st[i].latest_action == 1)
|
||||
total_time_str="-"
|
||||
else {
|
||||
if (hour > 0)
|
||||
total_time_str=hour + "小时" + min + "分"
|
||||
else{
|
||||
if (min == 0)
|
||||
min = 1;
|
||||
total_time_str=min + "分"
|
||||
}
|
||||
}
|
||||
|
||||
tr.insertCell(-1).innerHTML = total_time_str;
|
||||
tr.insertCell(-1).innerHTML = action_status;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
*/
|
||||
|
||||
XHR.poll(5, '<%=url('admin/network/dev_app_status')%>', null,
|
||||
function(x, st)
|
||||
{
|
||||
var tb = document.getElementById('user_status_table');
|
||||
var dev_list_str=JSON.stringify(st);
|
||||
if (st && tb)
|
||||
{
|
||||
while(tb.rows.length > 1)
|
||||
tb.deleteRow(1);
|
||||
var devlist = st.devlist
|
||||
for(var i = 0; i < devlist.length; i++ )
|
||||
{
|
||||
var hostname=""
|
||||
if(devlist[i].hostname == "" || devlist[i].hostname == "*"){
|
||||
hostname="?";
|
||||
}
|
||||
else{
|
||||
hostname=devlist[i].hostname;
|
||||
}
|
||||
var tr = tb.insertRow(-1);
|
||||
//tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
|
||||
tr.insertCell(-1).innerHTML = hostname;
|
||||
tr.insertCell(-1).innerHTML = "<a href='<%=url('admin/network/appfilter/')%>"+devlist[i].mac+"'>"+devlist[i].mac+"</a>";
|
||||
tr.insertCell(-1).innerHTML = devlist[i].ip;
|
||||
var app_list_str="";
|
||||
for (var j = 0; j < devlist[i].applist.length; j++){
|
||||
console.log(devlist[i].applist[j].name);
|
||||
app_list_str+=devlist[i].applist[j].name;
|
||||
if (j != devlist[i].applist.length - 1)
|
||||
app_list_str+=","
|
||||
}
|
||||
tr.insertCell(-1).innerHTML = app_list_str;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
//]]></script>
|
||||
|
||||
|
||||
<fieldset class="cbi-section">
|
||||
<legend><%:终端列表%></legend>
|
||||
<table class="imagetable" id="user_status_table">
|
||||
<!--
|
||||
<tr>
|
||||
<th ><%:App%></th>
|
||||
<th ><%:主机名%></th>
|
||||
<th ><%:mac地址%></th>
|
||||
<th><%:开始时间%></th>
|
||||
<th><%:访问时长%></th>
|
||||
<th><%:过滤状态%></th>
|
||||
</tr>
|
||||
-->
|
||||
<tr>
|
||||
<th ><%:主机名%></th>
|
||||
<th ><%:mac地址%></th>
|
||||
<th ><%:ip地址%></th>
|
||||
<th><%:常用APP(TOP5)%></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8"><em><br /><%:Collecting data...%></em></td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
@ -1,5 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<label class="cbi-value" style="display:inline-block; width: 130px" for="ulfile"><%:选择本地特征库文件:%></label>
|
||||
<input class="cbi-input-file" style="width: 500px" type="file" id="ulfile" name="ulfile" />
|
||||
<input type="submit" class="cbi-button cbi-input-apply" name="upload" value="<%:Upload%>" />
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,53 +0,0 @@
|
||||
|
||||
msgid "website"
|
||||
msgstr "常用网站"
|
||||
|
||||
msgid "appfilter"
|
||||
msgstr "应用过滤"
|
||||
|
||||
msgid "game"
|
||||
msgstr "游戏"
|
||||
|
||||
msgid "web"
|
||||
msgstr "网页"
|
||||
|
||||
msgid "video"
|
||||
msgstr "视频"
|
||||
|
||||
msgid "chat"
|
||||
msgstr "聊天"
|
||||
|
||||
msgid "download"
|
||||
msgstr "下载"
|
||||
|
||||
msgid "p2p"
|
||||
msgstr "p2p"
|
||||
|
||||
msgid "music"
|
||||
msgstr "音乐"
|
||||
|
||||
msgid "shopping"
|
||||
msgstr "购物"
|
||||
|
||||
msgid "working"
|
||||
msgstr "办公"
|
||||
|
||||
msgid "employee"
|
||||
msgstr "招聘"
|
||||
|
||||
msgid "Basic Settings"
|
||||
msgstr "基本设置"
|
||||
|
||||
msgid "App Filter Rules"
|
||||
msgstr "应用过滤规则"
|
||||
|
||||
msgid "Select at least one user, otherwise it will take effect for all users"
|
||||
msgstr "至少选择一个用户,否则对所有用户生效"
|
||||
|
||||
msgid "Select users"
|
||||
msgstr "选择用户"
|
||||
|
||||
msgid "Enable App Filter"
|
||||
msgstr "开启应用过滤"
|
||||
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# replace existing mwan ucitrack entry
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
del ucitrack.@appfilter[-1]
|
||||
add ucitrack appfilter
|
||||
set ucitrack.@appfilter[-1].exec="/etc/init.d/appfilter reload"
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
# remove LuCI cache
|
||||
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
|
||||
|
||||
exit 0
|
||||
@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
set appfilter.user=user
|
||||
appfilter.feature=feature
|
||||
commit appfilter
|
||||
EOF
|
||||
exit 0
|
||||
@ -1,19 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-argon-config
|
||||
PKG_VERSION:=0.9
|
||||
PKG_RELEASE:=20210309
|
||||
|
||||
LUCI_TITLE:=LuCI page for Argon Config
|
||||
LUCI_DEPENDS:=+luci-theme-argonv3
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@ -1,12 +0,0 @@
|
||||
--[[
|
||||
luci-app-argon-config
|
||||
]]--
|
||||
|
||||
module("luci.controller.argon-config", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access('/www/luci-static/argon/css/cascade.css') then
|
||||
return
|
||||
end
|
||||
entry({"admin", "system", "argon-config"}, form("argon-config/configuration"), _("Argon Config"),90)
|
||||
end
|
||||
@ -1,223 +0,0 @@
|
||||
local nxfs = require 'nixio.fs'
|
||||
local wa = require 'luci.tools.webadmin'
|
||||
local opkg = require 'luci.model.ipkg'
|
||||
local sys = require 'luci.sys'
|
||||
local http = require 'luci.http'
|
||||
local nutil = require 'nixio.util'
|
||||
local name = 'argon'
|
||||
local uci = require 'luci.model.uci'.cursor()
|
||||
|
||||
local fstat = nxfs.statvfs(opkg.overlay_root())
|
||||
local space_total = fstat and fstat.blocks or 0
|
||||
local space_free = fstat and fstat.bfree or 0
|
||||
local space_used = space_total - space_free
|
||||
|
||||
local free_byte = space_free * fstat.frsize
|
||||
|
||||
local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity, mode
|
||||
if nxfs.access('/etc/config/argon') then
|
||||
primary = uci:get_first('argon', 'global', 'primary')
|
||||
dark_primary = uci:get_first('argon', 'global', 'dark_primary')
|
||||
blur_radius = uci:get_first('argon', 'global', 'blur')
|
||||
blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark')
|
||||
blur_opacity = uci:get_first('argon', 'global', 'transparency')
|
||||
blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark')
|
||||
mode = uci:get_first('argon', 'global', 'mode')
|
||||
bing_background = uci:get_first('argon', 'global', 'bing_background')
|
||||
end
|
||||
|
||||
function glob(...)
|
||||
local iter, code, msg = nxfs.glob(...)
|
||||
if iter then
|
||||
return nutil.consume(iter)
|
||||
else
|
||||
return nil, code, msg
|
||||
end
|
||||
end
|
||||
|
||||
local transparency_sets = {
|
||||
0,
|
||||
0.1,
|
||||
0.2,
|
||||
0.3,
|
||||
0.4,
|
||||
0.5,
|
||||
0.6,
|
||||
0.7,
|
||||
0.8,
|
||||
0.9,
|
||||
1
|
||||
}
|
||||
|
||||
-- [[ 模糊设置 ]]--
|
||||
br = SimpleForm('config', translate('Argon Config'), translate('Here you can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos.[Chrome is recommended]'))
|
||||
br.reset = false
|
||||
br.submit = false
|
||||
s = br:section(SimpleSection)
|
||||
|
||||
o = s:option(ListValue, 'bing_background', translate('Wallpaper Source'))
|
||||
o:value('0', translate('Built-in'))
|
||||
o:value('1', translate('Bing Wallpapers'))
|
||||
o.default = bing_background
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(ListValue, 'mode', translate('Theme mode'))
|
||||
o:value('normal', translate('Follow System'))
|
||||
o:value('light', translate('Force Light'))
|
||||
o:value('dark', translate('Force Dark'))
|
||||
o.default = mode
|
||||
o.rmempty = false
|
||||
o.description = translate('You can choose Theme color mode here')
|
||||
|
||||
o = s:option(Value, 'primary', translate('[Light mode] Primary Color'), translate('A HEX Color ; ( Default: #5e72e4 )'))
|
||||
o.default = primary
|
||||
o.datatype = ufloat
|
||||
o.rmempty = false
|
||||
|
||||
|
||||
|
||||
o = s:option(ListValue, 'transparency', translate('[Light mode] Transparency'), translate('0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: 0.5 )'))
|
||||
for _, v in ipairs(transparency_sets) do
|
||||
o:value(v)
|
||||
end
|
||||
o.default = blur_opacity
|
||||
o.datatype = ufloat
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, 'blur', translate('[Light mode] Frosted Glass Radius'), translate('Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )'))
|
||||
o.default = blur_radius
|
||||
o.datatype = ufloat
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, 'dark_primary', translate('[Dark mode] Primary Color'), translate('A HEX Color ; ( Default: #483d8b )'))
|
||||
o.default = dark_primary
|
||||
o.datatype = ufloat
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(ListValue, 'transparency_dark', translate('[Dark mode] Transparency'), translate('0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )'))
|
||||
for _, v in ipairs(transparency_sets) do
|
||||
o:value(v)
|
||||
end
|
||||
o.default = blur_opacity_dark
|
||||
o.datatype = ufloat
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, 'blur_dark', translate('[Dark mode] Frosted Glass Radius'), translate('Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )'))
|
||||
o.default = blur_radius_dark
|
||||
o.datatype = ufloat
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Button, 'save', translate('Save Changes'))
|
||||
o.inputstyle = 'reload'
|
||||
|
||||
function br.handle(self, state, data)
|
||||
if (state == FORM_VALID and data.blur ~= nil and data.blur_dark ~= nil and data.transparency ~= nil and data.transparency_dark ~= nil and data.mode ~= nil) then
|
||||
nxfs.writefile('/tmp/aaa', data)
|
||||
for key, value in pairs(data) do
|
||||
uci:set('argon','@global[0]',key,value)
|
||||
end
|
||||
uci:commit('argon')
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
ful = SimpleForm('upload', translate('Upload (Free: ') .. wa.byte_format(free_byte) .. ')', translate("You can upload files such as jpg,png,gif,mp4 files, To change the login page background."))
|
||||
ful.reset = false
|
||||
ful.submit = false
|
||||
|
||||
sul = ful:section(SimpleSection, '', translate("Upload file to '/www/luci-static/argon/background/'"))
|
||||
fu = sul:option(FileUpload, '')
|
||||
fu.template = 'argon-config/other_upload'
|
||||
um = sul:option(DummyValue, '', nil)
|
||||
um.template = 'argon-config/other_dvalue'
|
||||
|
||||
local dir, fd
|
||||
dir = '/www/luci-static/argon/background/'
|
||||
nxfs.mkdir(dir)
|
||||
http.setfilehandler(
|
||||
function(meta, chunk, eof)
|
||||
if not fd then
|
||||
if not meta then
|
||||
return
|
||||
end
|
||||
|
||||
if meta and chunk then
|
||||
fd = nixio.open(dir .. meta.file, 'w')
|
||||
end
|
||||
|
||||
if not fd then
|
||||
um.value = translate('Create upload file error.')
|
||||
return
|
||||
end
|
||||
end
|
||||
if chunk and fd then
|
||||
fd:write(chunk)
|
||||
end
|
||||
if eof and fd then
|
||||
fd:close()
|
||||
fd = nil
|
||||
um.value = translate('File saved to') .. ' "/www/luci-static/argon/background/' .. meta.file .. '"'
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
if http.formvalue('upload') then
|
||||
local f = http.formvalue('ulfile')
|
||||
if #f <= 0 then
|
||||
um.value = translate('No specify upload file.')
|
||||
end
|
||||
end
|
||||
|
||||
local function getSizeStr(size)
|
||||
local i = 0
|
||||
local byteUnits = {' kB', ' MB', ' GB', ' TB'}
|
||||
repeat
|
||||
size = size / 1024
|
||||
i = i + 1
|
||||
until (size <= 1024)
|
||||
return string.format('%.1f', size) .. byteUnits[i]
|
||||
end
|
||||
|
||||
local inits, attr = {}
|
||||
for i, f in ipairs(glob(dir .. '*')) do
|
||||
attr = nxfs.stat(f)
|
||||
if attr then
|
||||
inits[i] = {}
|
||||
inits[i].name = nxfs.basename(f)
|
||||
inits[i].mtime = os.date('%Y-%m-%d %H:%M:%S', attr.mtime)
|
||||
inits[i].modestr = attr.modestr
|
||||
inits[i].size = getSizeStr(attr.size)
|
||||
inits[i].remove = 0
|
||||
inits[i].install = false
|
||||
end
|
||||
end
|
||||
|
||||
form = SimpleForm('filelist', translate('Background file list'), nil)
|
||||
form.reset = false
|
||||
form.submit = false
|
||||
|
||||
tb = form:section(Table, inits)
|
||||
nm = tb:option(DummyValue, 'name', translate('File name'))
|
||||
mt = tb:option(DummyValue, 'mtime', translate('Modify time'))
|
||||
sz = tb:option(DummyValue, 'size', translate('Size'))
|
||||
btnrm = tb:option(Button, 'remove', translate('Remove'))
|
||||
btnrm.render = function(self, section, scope)
|
||||
self.inputstyle = 'remove'
|
||||
Button.render(self, section, scope)
|
||||
end
|
||||
|
||||
btnrm.write = function(self, section)
|
||||
local v = nxfs.unlink(dir .. nxfs.basename(inits[section].name))
|
||||
if v then
|
||||
table.remove(inits, section)
|
||||
end
|
||||
return v
|
||||
end
|
||||
|
||||
function IsIpkFile(name)
|
||||
name = name or ''
|
||||
local ext = string.lower(string.sub(name, -4, -1))
|
||||
return ext == '.ipk'
|
||||
end
|
||||
|
||||
return br, ful, form
|
||||
@ -1,7 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<% if self:cfgvalue(section) ~= false then %>
|
||||
<input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" style="display: <%= display %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> />
|
||||
<% else %>
|
||||
-
|
||||
<% end %>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,8 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<span style="color: red">
|
||||
<%
|
||||
local val = self:cfgvalue(section) or self.default or ""
|
||||
write(pcdata(val))
|
||||
%>
|
||||
</span>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,5 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<label class="cbi-value" style="display:inline-block; width: 130px" for="ulfile"><%:Choose local file:%></label>
|
||||
<input class="cbi-input-file" style="width: 400px" type="file" id="ulfile" name="ulfile" accept="image/png, image/jpeg, image/gif, video/mp4"/>
|
||||
<input type="submit" class="cbi-button cbi-input-apply" name="upload" value="<%:Upload%>" />
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,133 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Project-Id-Version: \n"
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: dingpengyu <jerrykuku@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: zh_CN\n"
|
||||
"X-Generator: Poedit 2.3.1\n"
|
||||
|
||||
msgid "Argon Config"
|
||||
msgstr "Argon 主题设置"
|
||||
|
||||
msgid "Here you can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos.[Chrome is recommended]"
|
||||
msgstr "在这里你可以设置argon 主题的登录页面的模糊和透明度,并管理背景图片与视频。[建议使用 Chrome]"
|
||||
|
||||
msgid "Wallpaper Source"
|
||||
msgstr "壁纸来源"
|
||||
|
||||
msgid "Built-in"
|
||||
msgstr "内建"
|
||||
|
||||
msgid "Bing Wallpapers"
|
||||
msgstr "Bing 壁纸"
|
||||
|
||||
msgid "Theme mode"
|
||||
msgstr "主题模式"
|
||||
|
||||
msgid "Follow System"
|
||||
msgstr "跟随系统"
|
||||
|
||||
msgid "Force Light"
|
||||
msgstr "强制亮色"
|
||||
|
||||
msgid "Force Dark"
|
||||
msgstr "强制暗色"
|
||||
|
||||
msgid "You can choose Theme color mode here"
|
||||
msgstr "你可以选择喜欢的主题模式"
|
||||
|
||||
msgid "[Light mode] Primary Color"
|
||||
msgstr "[亮色模式] 主色调"
|
||||
|
||||
msgid "[Dark mode] Primary Color"
|
||||
msgstr "[暗色模式] 主色调"
|
||||
|
||||
msgid "A HEX Color ; ( Default: #5e72e4 )"
|
||||
msgstr "十六进制颜色值 ( 预设为:#5e72e4 )"
|
||||
|
||||
msgid "A HEX Color ; ( Default: #483d8b )"
|
||||
msgstr "十六进制颜色值 ( 预设为:#483d8b )"
|
||||
|
||||
msgid "[Light mode] Transparency"
|
||||
msgstr "[亮色模式] 透明度"
|
||||
|
||||
msgid "[Light mode] Transparency"
|
||||
msgstr "[亮色模式] 透明度"
|
||||
|
||||
msgid "[Dark mode] Transparency"
|
||||
msgstr "[暗色模式] 透明度"
|
||||
|
||||
msgid "0 transparent - 1 opaque ; ( Suggest: transparent: 0 or translucent preset: 0.5 )"
|
||||
msgstr "0最透明 - 1不透明 ; ( 建议: 透明 0 或 半透明预设 0.5 )"
|
||||
|
||||
msgid "0 transparent - 1 opaque ; ( Suggest: Black translucent preset: 0.5 )"
|
||||
msgstr "0最透明 - 1不透明 ; ( 建议: 黑色半透明 0.5 )"
|
||||
|
||||
msgid "[Light mode] Frosted Glass Radius"
|
||||
msgstr "[亮色模式] 毛玻璃模糊半径"
|
||||
|
||||
msgid "[Dark mode] Frosted Glass Radius"
|
||||
msgstr "[暗色模式] 毛玻璃模糊半径"
|
||||
|
||||
msgid "Larger value will more blurred ; ( Suggest: clear: 1 or blur preset: 10 )"
|
||||
msgstr "值越大越模糊; ( 建议: 清透 1 或 模糊预设 10 )"
|
||||
|
||||
msgid "You can upload files such as jpg,png,gif,mp4 files, To change the login page background."
|
||||
msgstr "你可以上传jpg、png、gif或mp4文件,以创建自己喜欢的登录界面"
|
||||
|
||||
msgid "Save Changes"
|
||||
msgstr "保存更改"
|
||||
|
||||
msgid "Choose local file:"
|
||||
msgstr "选择本地文件:"
|
||||
|
||||
msgid "Couldn't open file:"
|
||||
msgstr "无法打开文件:"
|
||||
|
||||
msgid "Create upload file error."
|
||||
msgstr "创建上传文件失败。"
|
||||
|
||||
|
||||
msgid "File name"
|
||||
msgstr "文件名"
|
||||
|
||||
msgid "File saved to"
|
||||
msgstr "文件保存到"
|
||||
|
||||
msgid "FileTransfer"
|
||||
msgstr "文件传输"
|
||||
|
||||
msgid "Install"
|
||||
msgstr "安装"
|
||||
|
||||
msgid "Attributes"
|
||||
msgstr "属性"
|
||||
|
||||
msgid "Modify time"
|
||||
msgstr "修改时间"
|
||||
|
||||
msgid "No specify upload file."
|
||||
msgstr "未指定上传文件。"
|
||||
|
||||
msgid "Path on Route:"
|
||||
msgstr "路由根目录:"
|
||||
|
||||
msgid "Remove"
|
||||
msgstr "移除"
|
||||
|
||||
msgid "Size"
|
||||
msgstr "大小"
|
||||
|
||||
msgid "Upload (Free:"
|
||||
msgstr "上传 (剩余空间:"
|
||||
|
||||
msgid "Background file list"
|
||||
msgstr "背景文件列表"
|
||||
|
||||
msgid "Upload file to '/www/luci-static/argon/background/'"
|
||||
msgstr "文件将上传到'/www/luci-static/argon/background/'"
|
||||
@ -1,9 +0,0 @@
|
||||
config global
|
||||
option primary '#5e72e4'
|
||||
option dark_primary '#483d8b'
|
||||
option blur '10'
|
||||
option blur_dark '10'
|
||||
option transparency '0.5'
|
||||
option transparency_dark '0.5'
|
||||
option mode 'normal'
|
||||
option bing_background '0'
|
||||
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
sed -i 's/cbi.submit\"] = true/cbi.submit\"] = \"1\"/g' /usr/lib/lua/luci/dispatcher.lua
|
||||
|
||||
rm -f /tmp/luci-indexcache
|
||||
exit 0
|
||||
@ -1,64 +0,0 @@
|
||||
# Copyright (C) 2018-2019 Lienol
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-autoipsetadder
|
||||
PKG_VERSION:=1.0
|
||||
PKG_RELEASE:=7
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/luci-app-autoipsetadder
|
||||
SECTION:=luci
|
||||
CATEGORY:=LuCI
|
||||
SUBMENU:=3. Applications
|
||||
TITLE:=LuCI Support for autoipsetadder
|
||||
PKGARCH:=all
|
||||
DEPENDS:= +httping +curl +coreutils-stdbuf
|
||||
endef
|
||||
|
||||
define Package/luci-app-autoipsetadder/description
|
||||
LuCI support for autoipsetadder
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
endef
|
||||
|
||||
define Package/luci-app-autoipsetadder/conffiles
|
||||
/etc/config/autoipsetadder
|
||||
endef
|
||||
|
||||
define Package/luci-app-autoipsetadder/install
|
||||
$(INSTALL_DIR) $(1)/usr/lib/lua/luci
|
||||
cp -pR ./luasrc/* $(1)/usr/lib/lua/luci
|
||||
$(INSTALL_DIR) $(1)/
|
||||
cp -pR ./root/* $(1)/
|
||||
endef
|
||||
|
||||
define Package/luci-app-autoipsetadder/postinst
|
||||
#!/bin/sh
|
||||
/etc/init.d/autoipsetadder enable >/dev/null 2>&1
|
||||
/etc/init.d/autoipsetadder start
|
||||
rm -f /tmp/luci-indexcache
|
||||
rm -f /tmp/luci-modulecache/*
|
||||
exit 0
|
||||
endef
|
||||
|
||||
define Package/luci-app-autoipsetadder/prerm
|
||||
#!/bin/sh
|
||||
if [ -z "$${IPKG_INSTROOT}" ]; then
|
||||
/etc/init.d/autoipsetadder disable
|
||||
/etc/init.d/autoipsetadder stop
|
||||
fi
|
||||
exit 0
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,luci-app-autoipsetadder))
|
||||
@ -1,56 +0,0 @@
|
||||
module("luci.controller.autoipsetadder",package.seeall)
|
||||
local io = require "io"
|
||||
local fs=require"nixio.fs"
|
||||
local sys=require"luci.sys"
|
||||
local uci=require"luci.model.uci".cursor()
|
||||
function index()
|
||||
entry({"admin","services","autoipsetadder"},firstchild(),_("autoipsetadder"),30).dependent=true
|
||||
entry({"admin","services","autoipsetadder","autoipsetadder"},cbi("autoipsetadder"),_("Base Setting"),1)
|
||||
entry({"admin","services","autoipsetadder","status"},call("act_status")).leaf=true
|
||||
entry({"admin", "services", "autoipsetadder", "getlog"}, call("get_log"))
|
||||
entry({"admin", "services", "autoipsetadder", "dodellog"}, call("do_del_log"))
|
||||
entry({"admin", "services", "autoipsetadder", "debugip"}, call("do_debug_ip"))
|
||||
end
|
||||
|
||||
function act_status()
|
||||
local e={}
|
||||
e.running=luci.sys.call("pgrep -f /usr/bin/autoipsetadder/autoaddlist.sh >/dev/null")==0
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(e)
|
||||
end
|
||||
function do_del_log()
|
||||
local logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log"
|
||||
nixio.fs.writefile(logfile,"")
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write('')
|
||||
end
|
||||
function do_debug_ip()
|
||||
luci.http.prepare_content("text/plain; charset=utf-8")
|
||||
local a=sys.exec("/usr/bin/autoipsetadder/debugip.sh")
|
||||
if (a=="") then
|
||||
a="noproblem"
|
||||
end
|
||||
luci.http.write(a)
|
||||
end
|
||||
function get_log()
|
||||
local logfile,fdp
|
||||
logfile=uci:get("autoipsetadder","autoipsetadder","logfile") or "/tmp/addlist.log"
|
||||
luci.http.prepare_content("text/plain; charset=utf-8")
|
||||
if not fs.access(logfile) then
|
||||
luci.http.write("")
|
||||
return
|
||||
end
|
||||
if fs.access("/var/run/lucilogreload") then
|
||||
fdp=0
|
||||
fs.remove("/var/run/lucilogreload")
|
||||
else
|
||||
fdp=tonumber(fs.readfile("/var/run/lucilogpos")) or 0
|
||||
end
|
||||
local f=io.open(logfile, "r+")
|
||||
f:seek("set",fdp)
|
||||
local a=f:read(2048000) or ""
|
||||
fdp=f:seek()
|
||||
fs.writefile("/var/run/lucilogpos",tostring(fdp))
|
||||
f:close()
|
||||
luci.http.write(a)
|
||||
end
|
||||
@ -1,97 +0,0 @@
|
||||
require("luci.sys")
|
||||
require("luci.util")
|
||||
local fs=require"nixio.fs"
|
||||
local uci=require"luci.model.uci".cursor()
|
||||
local m,s,o
|
||||
m = Map("autoipsetadder", translate("ipsetautoadder"))
|
||||
m.description = translate("自动将联不通的域名加入ipset")
|
||||
m:section(SimpleSection).template = "autoipsetadder/status"
|
||||
|
||||
s = m:section(TypedSection, "autoipsetadder")
|
||||
s.anonymous=true
|
||||
s.addremove=false
|
||||
---- enable
|
||||
o = s:option(Flag, "enabled", translate("启用"))
|
||||
o.default = 0
|
||||
o.rmempty = false
|
||||
---- logview
|
||||
o=s:option(TextValue, "show", "日志")
|
||||
o.template = "autoipsetadder/check"
|
||||
---- logpath
|
||||
o = s:option(Value, "logfile", translate("Runtime log file"))
|
||||
o.datatype = "string"
|
||||
o.default="/tmp/addlist.log"
|
||||
o.optional = false
|
||||
o.validate=function(self, value)
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
fs.rmdir(value)
|
||||
end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
if m.message then
|
||||
m.message =m.message.."\nerror!log file is a dir"
|
||||
else
|
||||
m.message ="error!log file is a dir"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return value
|
||||
end
|
||||
---- dnsmasq log
|
||||
o = s:option(Value, "dnslogfile", translate("dnsmasq log file"))
|
||||
o.datatype = "string"
|
||||
o.optional = false
|
||||
o.default="/tmp/dnsmasq.log"
|
||||
o.validate=function(self, value)
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
fs.rmdir(value)
|
||||
end
|
||||
if fs.stat(value,"type")=="dir" then
|
||||
if m.message then
|
||||
m.message =m.message.."\nerror!log file is a dir"
|
||||
else
|
||||
m.message ="error!log file is a dir"
|
||||
end
|
||||
return nil
|
||||
end
|
||||
return value
|
||||
end
|
||||
---- crontab
|
||||
o = s:option(MultiValue, "crontab", translate("Crontab task"),translate("Please change time and args in crontab"))
|
||||
o:value("autodeldnslog",translate("Auto del dnsmasq log"))
|
||||
o:value("autotaillog",translate("Auto tail runtime log"))
|
||||
o.widget = "checkbox"
|
||||
o.default = "autodeldnslog autotaillog"
|
||||
o.rmempty= true
|
||||
|
||||
o = s:option(MultiValue, "config", translate("the way add to gfwlist"))
|
||||
o:value("nochina",translate("no china ip"))
|
||||
o:value("pingadd",translate("5ping loss1-4"))
|
||||
o:value("packetpass",translate("packet >12 pass"))
|
||||
o.widget = "checkbox"
|
||||
o.default = "nochina pingadd packetpass"
|
||||
o.rmempty=true
|
||||
---- apply
|
||||
nixio.fs.writefile("/var/run/lucilogreload","")
|
||||
function m.on_commit(map)
|
||||
local ucitracktest=uci:get("autoipsetadder","autoipsetadder","ucitracktest")
|
||||
if ucitracktest=="1" then
|
||||
return
|
||||
elseif ucitracktest=="0" then
|
||||
io.popen("/etc/init.d/autoipsetadder reload &")
|
||||
else
|
||||
if (fs.access("/var/run/AdGucitest")) then
|
||||
uci:set("autoipsetadder","autoipsetadder","ucitracktest","0")
|
||||
io.popen("/etc/init.d/autoipsetadder reload &")
|
||||
else
|
||||
fs.writefile("/var/run/AdGucitest","")
|
||||
if (ucitracktest=="2") then
|
||||
uci:set("autoipsetadder","autoipsetadder","ucitracktest","1")
|
||||
else
|
||||
uci:set("autoipsetadder","autoipsetadder","ucitracktest","2")
|
||||
end
|
||||
end
|
||||
uci:save("autoipsetadder")
|
||||
uci:commit("autoipsetadder")
|
||||
end
|
||||
end
|
||||
return m
|
||||
@ -1,62 +0,0 @@
|
||||
<%+cbi/valueheader%>
|
||||
<%uci=require"luci.model.uci".cursor()%>
|
||||
<%nixio=require"nixio"%>
|
||||
|
||||
<%if uci:get("autoipsetadder","autoipsetadder","enabled")=="1" then%>
|
||||
<textarea id="cbid.logview.1.conf" class="cbi-input-textarea" style="width: 100%;display:inline" data-update="change" rows="10" cols="60" readonly="readonly" > </textarea>
|
||||
<input type="checkbox" value="reverse" onclick=" return reverselog()" style="vertical-align:middle;height: auto;" checked><%:reverse%></input>
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="apply_update_button" value="dellog" onclick=" return apply_del_log() "/>
|
||||
|
||||
<input type="button" class="cbi-button cbi-button-apply" id="apply_update_button" value="debug" onclick=" return debug_ip() "/>
|
||||
|
||||
<textarea id="cbid.logview.2.conf" class="cbi-input-textarea" style="width: 100%;display:none" data-update="change" rows="10" cols="60" readonly="readonly" > </textarea>
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var islogreverse = true;
|
||||
function apply_del_log(){
|
||||
XHR.get('<%=url([[admin]], [[services]], [[autoipsetadder]], [[dodellog]])%>',null,function(x, data){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
lv.innerHTML="";
|
||||
}
|
||||
);
|
||||
return
|
||||
}
|
||||
function reverselog(){
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
lv.innerHTML=lv.innerHTML.split('\n').reverse().join('\n')
|
||||
if (islogreverse){
|
||||
islogreverse=false;
|
||||
}else{
|
||||
islogreverse=true;
|
||||
}
|
||||
return
|
||||
}
|
||||
function debug_ip(){
|
||||
var lv2 = document.getElementById('cbid.logview.2.conf');
|
||||
lv2.style.display="inline"
|
||||
XHR.get('<%=url([[admin]], [[services]], [[autoipsetadder]], [[debugip]])%>',null,function(x, data){
|
||||
var lv2 = document.getElementById('cbid.logview.2.conf');
|
||||
lv2.innerHTML = x.responseText;
|
||||
}
|
||||
);
|
||||
return
|
||||
}
|
||||
function poll_check(){
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[autoipsetadder]], [[getlog]])%>', null,
|
||||
function(x, data) {
|
||||
var lv = document.getElementById('cbid.logview.1.conf');
|
||||
if (x.responseText && lv) {
|
||||
if (islogreverse){
|
||||
lv.innerHTML = x.responseText.split('\n').reverse().join('\n')+lv.innerHTML;
|
||||
}else{
|
||||
lv.innerHTML += x.responseText;
|
||||
}
|
||||
}
|
||||
}
|
||||
);}
|
||||
poll_check();
|
||||
|
||||
//]]>
|
||||
</script>
|
||||
<%end%>
|
||||
<%+cbi/valuefooter%>
|
||||
@ -1,22 +0,0 @@
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[autoipsetadder]], [[status]])%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('autoipsetadder_status');
|
||||
if (data && tb) {
|
||||
if (data.running) {
|
||||
var links = '<em><b><font color=green>autoipsetadder <%:RUNNING%></font></b></em>';
|
||||
tb.innerHTML = links;
|
||||
} else {
|
||||
tb.innerHTML = '<em><b><font color=red>autoipsetadder <%:NOT RUNNING%></font></b></em>';
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]>
|
||||
</script>
|
||||
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
|
||||
<fieldset class="cbi-section">
|
||||
<p id="autoipsetadder_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
</fieldset>
|
||||
@ -1,2 +0,0 @@
|
||||
config autoipsetadder 'autoipsetadder'
|
||||
option enabled '0'
|
||||
@ -1,127 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
START=99
|
||||
STOP=01
|
||||
|
||||
extra_command "test_crontab" "test_crontab"
|
||||
|
||||
CRON_FILE=/etc/crontabs/root
|
||||
CONFIGURATION=autoipsetadder
|
||||
|
||||
set_dnsmasq_log()
|
||||
{
|
||||
sed -i '/log-facility/d' /etc/dnsmasq.conf
|
||||
sed -i '/log-queries/d' /etc/dnsmasq.conf
|
||||
uci set dhcp.@dnsmasq[0].logfacility='/tmp/dnsmasq.log'
|
||||
uci delete dhcp.@dnsmasq[0].logqueries
|
||||
echo log-queries >> /etc/dnsmasq.conf
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq reload
|
||||
}
|
||||
|
||||
stop_dnsmasq_log()
|
||||
{
|
||||
sed -i '/log-queries/d' /etc/dnsmasq.conf
|
||||
uci delete dhcp.@dnsmasq[0].logfacility
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq reload
|
||||
}
|
||||
|
||||
reload_service()
|
||||
{
|
||||
rm -f /var/run/AdGucitest 2>/dev/null
|
||||
kill $(cat /var/run/autoipsetadder.pid)
|
||||
start
|
||||
}
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$CONFIGURATION"
|
||||
}
|
||||
start_service() {
|
||||
# Reading config
|
||||
config_load "${CONFIGURATION}"
|
||||
mkdir -p /tmp/run/autoipsetadder
|
||||
local enabled
|
||||
config_get_bool enabled $CONFIGURATION enabled 0
|
||||
do_crontab
|
||||
if [ "$enabled" == "1" ]; then
|
||||
set_dnsmasq_log
|
||||
procd_open_instance
|
||||
procd_set_param respawn
|
||||
# pass config to script on start
|
||||
procd_set_param command sh /usr/bin/autoipsetadder/autoaddlist.sh
|
||||
procd_close_instance
|
||||
echo "autoipsetadder turn on"
|
||||
echo "enabled=$enabled"
|
||||
else
|
||||
stop_dnsmasq_log
|
||||
echo "autoipsetadder turn off"
|
||||
echo "enabled=$enabled"
|
||||
fi
|
||||
}
|
||||
|
||||
stop_service()
|
||||
{
|
||||
config_load "${CONFIGURATION}"
|
||||
stop_dnsmasq_log
|
||||
do_crontab
|
||||
kill $(cat /var/run/autoipsetadder.pid)
|
||||
echo "autoipsetadder turn off"
|
||||
echo "enabled="$enabled""
|
||||
}
|
||||
do_crontab(){
|
||||
config_get_bool enabled $CONFIGURATION enabled 0
|
||||
#config_get logfile $CONFIGURATION logfile "/tmp/addlist.log"
|
||||
#config_get dnslogfile $CONFIGURATION dnslogfile "/tmp/dnsmasq.log"
|
||||
config_get crontab $CONFIGURATION crontab ""
|
||||
cronreload=0
|
||||
findstr="echo qingkong > \$(uci get autoipsetadder.autoipsetadder.dnslogfile)"
|
||||
default="0 * * * * echo qingkong > \$(uci get autoipsetadder.autoipsetadder.dnslogfile)"
|
||||
#[ -n "$lastdnslogfile" ] && findstr="echo qingkong > $lastdnslogfile" && [ "$lastdnslogfile" != "$dnslogfile" ] && replace="${lastdnslogfile//\//\\/}/${dnslogfile//\//\\/}"
|
||||
[ "$enabled" == "0" ] || [ "${crontab//autodeldnslog/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
#[ "$lastdnslogfile" != "$dnslogfile" ] && uci set autoipsetadder.autoipsetadder.lastdnslogfile="$dnslogfile" && commit=1
|
||||
|
||||
findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* \$(uci get autoipsetadder.autoipsetadder.logfile)"
|
||||
default="0 0 * * * /usr/bin/autoipsetadder/tailto.sh 2000 \$(uci get autoipsetadder.autoipsetadder.logfile)"
|
||||
#[ -n "$lastlogfile" ] && findstr="/usr/bin/autoipsetadder/tailto.sh [0-9]* $lastlogfile" && [ "$lastlogfile" != "$logfile" ] && replace="${lastlogfile//\//\\/}/${logfile//\//\\/}"
|
||||
[ "$enabled" == "0" ] || [ "${crontab//autotaillog/}" == "$crontab" ] && cronenable=0 || cronenable=1
|
||||
crontab_editor
|
||||
#[ -n "$logfile" ] && [ "$lastlogfile" != "$logfile" ] && uci set autoipsetadder.autoipsetadder.lastlogfile="$logfile" && commit=1
|
||||
|
||||
[ "$cronreload" -gt 0 ] && /etc/init.d/cron restart
|
||||
#[ "$commit" -gt 0 ] && uci commit autoipsetadder
|
||||
}
|
||||
crontab_editor(){
|
||||
local testline reload
|
||||
local line="$(grep "$findstr" $CRON_FILE)"
|
||||
[ -n "$replace" ] && [ -n "$line" ] && eval testline="\${line//$replace}" && [ "$testline" != "$line" ] && line="$testline" && reload="1" && replace=""
|
||||
if [ "${line:0:1}" != "#" ]; then
|
||||
if [ $cronenable -eq 1 ]; then
|
||||
[ -z "$line" ] && line="$default" && reload="1"
|
||||
if [ -n "$reload" ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "$line" >> $CRON_FILE
|
||||
cronreload=$((cronreload+1))
|
||||
fi
|
||||
elif [ -n "$line" ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "#$line" >> $CRON_FILE
|
||||
cronreload=$((cronreload+1))
|
||||
fi
|
||||
else
|
||||
if [ $cronenable -eq 1 ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "${line:1}" >> $CRON_FILE
|
||||
cronreload=$((cronreload+1))
|
||||
elif [ -z "$reload" ]; then
|
||||
sed -i "\,$findstr,d" $CRON_FILE
|
||||
echo "$line" >> $CRON_FILE
|
||||
fi
|
||||
fi
|
||||
}
|
||||
test_crontab(){
|
||||
config_load "${CONFIGURATION}"
|
||||
do_crontab
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@autoipsetadder[-1]
|
||||
add ucitrack autoipsetadder
|
||||
set ucitrack.@autoipsetadder[-1].init=autoipsetadder
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
rm -f /tmp/luci-indexcache
|
||||
exit 0
|
||||
@ -1,164 +0,0 @@
|
||||
#!/bin/sh
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
logfile=$(uci get autoipsetadder.autoipsetadder.logfile)
|
||||
[ -z "$logfile" ] && logfile="/tmp/addlist.log"
|
||||
dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile)
|
||||
[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log"
|
||||
config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null)
|
||||
[ "${config//nochina/}" == "$config" ] && nochina="0" || nochina="1"
|
||||
[ "${config//packetpass/}" == "$config" ] && packetpass="0" || packetpass="1"
|
||||
(tail -F $dnslogfile & echo $! >/var/run/autoipsetadder.pid ) | awk -v nochina="$nochina" -v packetpass="$packetpass" -F "[, ]+" '/reply/{
|
||||
ip=$8;
|
||||
if (ip=="" || ip=="127.0.0.1"|| ip=="0.0.0.0")
|
||||
{
|
||||
next;
|
||||
}
|
||||
if (index(ip,"<CNAME>")!=0)
|
||||
{
|
||||
if (cname==1)
|
||||
{
|
||||
next;
|
||||
}
|
||||
cname=1;
|
||||
domain=$6;
|
||||
#第一次cname时锁定域名,防止解析cname对其改动
|
||||
next;
|
||||
}
|
||||
#以上获得上行是否为cname,本行不是cname执行以下内容
|
||||
#lastdomain记录上次非cname的域名,与本次域名对比
|
||||
if(lastdomain!=$6){
|
||||
for (ipindex in ipcache)
|
||||
{
|
||||
delete ipcache[ipindex];
|
||||
}
|
||||
ipcount=0;
|
||||
createpid=1;
|
||||
#上行非cname,并且不是同cname解析域名的多个ip,更新域名,清理同域名免试flag
|
||||
if (cname!=1)
|
||||
{
|
||||
domain=$6;
|
||||
testall=0;
|
||||
}}
|
||||
ipcount++;
|
||||
cname=0;
|
||||
lastdomain=$6
|
||||
#去除非ipv4
|
||||
if (index(ip,".")==0)
|
||||
{
|
||||
next;
|
||||
}
|
||||
#不重复探测ip
|
||||
if (!(ip in a))
|
||||
{
|
||||
#包数>12的同域名放过
|
||||
if (passdomain==domain)
|
||||
{
|
||||
print(ip" "domain" pass by same domain ok");
|
||||
a[ip]=domain;
|
||||
next;
|
||||
}
|
||||
if (nochina==1){
|
||||
"ipset test china "ip" 2>&1"| getline ipset;
|
||||
close("ipset test china "ip" 2>&1");
|
||||
if (index(ipset,"Warning")!=0){
|
||||
print("china "ip" pass");
|
||||
a[ip]=domain;
|
||||
next;
|
||||
}}
|
||||
"ipset test gfwlist "ip" 2>&1"| getline ipset;
|
||||
close("ipset test gfwlist "ip" 2>&1");
|
||||
if (index(ipset,"Warning")!=0){
|
||||
print("gfwlist "ip" pass");
|
||||
a[ip]=domain;
|
||||
next;
|
||||
}
|
||||
|
||||
#ip压入缓存,用于未检测到443/80的缓存
|
||||
ipcache[ipcount]=ip;
|
||||
if (testall==0){
|
||||
tryhttps=0;
|
||||
tryhttp=0;
|
||||
#探测 nf_conntrack 的443/80
|
||||
while ("grep "ip" /proc/net/nf_conntrack"| getline ret > 0)
|
||||
{
|
||||
split(ret, b," +");
|
||||
split(b[11], pagnum,"=");
|
||||
#包数>12的放过
|
||||
if (packetpass==1 && pagnum[2]>12)
|
||||
{
|
||||
print("pass by packets="pagnum[2]" "ip" "domain);
|
||||
for (ipindex in ipcache)
|
||||
{
|
||||
a[ipcache[ipindex]]=domain;
|
||||
delete ipcache[ipindex];
|
||||
}
|
||||
passdomain=domain;
|
||||
close("grep "ip" /proc/net/nf_conntrack");
|
||||
ipcount--;
|
||||
next;
|
||||
}
|
||||
if (b[8]=="dst="ip)
|
||||
{
|
||||
if (b[10]=="dport=443"){
|
||||
tryhttps=1;
|
||||
break;
|
||||
}
|
||||
else if (b[10]=="dport=80"){
|
||||
tryhttp=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
close("grep "ip" /proc/net/nf_conntrack");
|
||||
}else{
|
||||
if (testall==443)
|
||||
{
|
||||
tryhttps=1
|
||||
}else{
|
||||
tryhttp=1
|
||||
}
|
||||
}
|
||||
if (tryhttps==1)
|
||||
{ if (createpid==1)
|
||||
{
|
||||
print "">"/tmp/run/autoipsetadder/"domain
|
||||
close("/tmp/run/autoipsetadder/"domain);
|
||||
print("create"domain);
|
||||
print(ip" "domain" 443"ipcount-1);
|
||||
a[ip]=domain;
|
||||
#正在使用的ip用最大延迟,最后探测,减少打断tcp的可能
|
||||
system("/usr/bin/autoipsetadder/testip.sh "ip" "domain" 443 "ipcount-1" &");
|
||||
delete ipcache[ipcount];
|
||||
createpid=0;
|
||||
}
|
||||
#未检测到443/80同域名缓存的ip进行测试,ipindex-1为测试延迟时间
|
||||
for (ipindex in ipcache){
|
||||
print(ipcache[ipindex]" "domain" 443 "ipindex-1);
|
||||
a[ipcache[ipindex]]=domain;
|
||||
system("/usr/bin/autoipsetadder/testip.sh "ipcache[ipindex]" "domain" 443 "ipindex-1" &");
|
||||
delete ipcache[ipindex];
|
||||
}
|
||||
#后续同域名ip免nf_conntrack测试
|
||||
testall=443;
|
||||
}
|
||||
else if (tryhttp==1)
|
||||
{
|
||||
if (createpid==1)
|
||||
{
|
||||
print "">"/tmp/run/autoipsetadder/"domain
|
||||
close("/tmp/run/autoipsetadder/"domain);
|
||||
print("create"domain);
|
||||
print(ip" "domain" 80 "ipcount-1);
|
||||
a[ip]=domain;
|
||||
system("/usr/bin/autoipsetadder/testip.sh "ip" "domain" 80 "ipcount-1" &");
|
||||
delete ipcache[ipcount];
|
||||
createpid=0;
|
||||
}
|
||||
for (ipindex in ipcache){
|
||||
print(ipcache[ipindex]" "domain" 80 "ipindex-1);
|
||||
a[ipcache[ipindex]]=domain;
|
||||
system("/usr/bin/autoipsetadder/testip.sh "ipcache[ipindex]" "domain" 80 "ipindex-1" &");
|
||||
delete ipcache[ipindex];
|
||||
}
|
||||
testall=80;
|
||||
}}
|
||||
}' >> $logfile
|
||||
@ -1,56 +0,0 @@
|
||||
#!/bin/sh
|
||||
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
dlchina=$1;
|
||||
logfile=$(uci get autoipsetadder.autoipsetadder.logfile)
|
||||
[ -z "$logfile" ] && logfile="/tmp/addlist.log"
|
||||
|
||||
dnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile)
|
||||
[ -z "$logfile" ] && dnslogfile="/tmp/dnsmasq.log"
|
||||
|
||||
|
||||
ipset list gfwlist | awk -v dlchina="$dlchina" -v dnslogfile="$dnslogfile" -v logfile="$logfile" '{
|
||||
if (index($0,".")==0)
|
||||
{
|
||||
next;
|
||||
}
|
||||
if ($0=="127.0.0.1") {system("ipset d gfwlist 127.0.0.1");next;}
|
||||
"ipset test whitelist "$0" 2>&1"| getline ipset;
|
||||
close("ipset test whitelist "$0" 2>&1");
|
||||
if (index(ipset,"Warning")==0){
|
||||
white=0;
|
||||
}else{
|
||||
white=1;
|
||||
}
|
||||
"ipset test china "$0" 2>&1"| getline ipset;
|
||||
close("ipset test china "$0" 2>&1");
|
||||
if (index(ipset,"Warning")!=0){
|
||||
china=1;
|
||||
}
|
||||
else{
|
||||
china=0;
|
||||
}
|
||||
if (white==1)
|
||||
{
|
||||
if (china==0)
|
||||
{
|
||||
print("warning white ip not china"$0);
|
||||
ret=system("grep "$0" "logfile);
|
||||
if (ret!=0)
|
||||
{
|
||||
ret=system("grep "$0" "dnslogfile);
|
||||
}
|
||||
}
|
||||
}else if (china==1)
|
||||
{
|
||||
print("warning china ip not white"$0);
|
||||
ret=system("grep "$0" "logfile)
|
||||
if (ret!=0)
|
||||
{
|
||||
ret=system("grep "$0" "dnslogfile);
|
||||
}
|
||||
if (dlchina)
|
||||
{
|
||||
system("ipset del gfwlist "$0);
|
||||
}
|
||||
}
|
||||
}'
|
||||
@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
tail -n $1 "$2" > /var/run/tailtmp
|
||||
cat /var/run/tailtmp > "$2"
|
||||
rm /var/run/tailtmp
|
||||
@ -1,182 +0,0 @@
|
||||
#!/bin/sh
|
||||
config=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null)
|
||||
[ "${config//pingadd/}" == "$config" ] && pingadd="0" || pingadd="1"
|
||||
echo $* | awk -v pingadd="$pingadd" '{
|
||||
if ($4=="")
|
||||
{
|
||||
wait=0;
|
||||
}else
|
||||
{wait=$4;}
|
||||
system("sleep "wait);
|
||||
ERRNO="";
|
||||
pidfile="/tmp/run/autoipsetadder/"$2
|
||||
getline drop< pidfile;
|
||||
close(pidfile);
|
||||
if (ERRNO) {
|
||||
addlist=0;
|
||||
print("bypass"$1" "$2);
|
||||
next;}
|
||||
if ($3=="443")
|
||||
{
|
||||
cmd=("httping -c 1 -t 4 -l "$2" --divert-connect "$1);
|
||||
}
|
||||
else if ($3=="80")
|
||||
{
|
||||
cmd=("httping -c 1 -t 4 "$2" --divert-connect "$1);
|
||||
}
|
||||
addlist=0;
|
||||
slow=0;
|
||||
while ((cmd | getline ret) > 0)
|
||||
{
|
||||
if (addlist!=0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if (index(ret,"short read")!=0)
|
||||
{
|
||||
if (system("httping -q -c 1 -t 4 -l "$2" --divert-connect "$1)==0)
|
||||
{
|
||||
addlist=-1;
|
||||
break;
|
||||
}else{
|
||||
print("doname rst autoaddip "$1" "$2);
|
||||
addlist=1;
|
||||
}
|
||||
}
|
||||
else if (index(ret,"timeout")!=0)
|
||||
{
|
||||
while ((cmd | getline ret) > 0)
|
||||
{
|
||||
if (index(ret,"timeout")!=0)
|
||||
{
|
||||
print("direct so slow autoaddip "$1" "$2);
|
||||
addlist=1;
|
||||
slow=1;
|
||||
}
|
||||
}
|
||||
}else if (index(ret,"SSL handshake error: (null)")!=0)
|
||||
{
|
||||
if(system("curl -m 10 --resolve "$2":443:"$1" https://"$2" -o /dev/null 2>/dev/null")==0){
|
||||
addlist=-1;
|
||||
break;
|
||||
}
|
||||
}else if (index(ret,"Connection refused")!=0){
|
||||
print("direct Connection refused autoaddip"$1" "$2);
|
||||
addlist=1;
|
||||
}
|
||||
}
|
||||
close(cmd);
|
||||
|
||||
if (addlist!=1)
|
||||
{
|
||||
if (addlist==0){
|
||||
split(ret, c,"[ /]+");
|
||||
print(c[6]);
|
||||
if (c[6]=="failed,"){
|
||||
print("can not connect autoaddip "$1" "$2);
|
||||
addlist=1;
|
||||
}
|
||||
else if (c[6]+0>10000)
|
||||
{
|
||||
print("direct ssl so slow autoaddip "$1" "$2);
|
||||
addlist=1;
|
||||
}else{
|
||||
addlist=-1;}
|
||||
}
|
||||
if (addlist==-1 && pingadd==1)
|
||||
{
|
||||
while (("ping -c 5 -q -A "$1 | getline ret) > 0)
|
||||
{
|
||||
if (index(ret,"packet loss")!=0)
|
||||
{
|
||||
split(ret, p,"[ ]+");
|
||||
if (p[4]>0 && p[4]<5)
|
||||
{
|
||||
print("ping packet loss autoaddip "$1" "$2);
|
||||
pingloss=1;
|
||||
addlist=1;
|
||||
}else{pingloss=0;}
|
||||
break;
|
||||
}
|
||||
}
|
||||
close("ping -c 5 -q "$1);
|
||||
}
|
||||
}
|
||||
ERRNO="";
|
||||
if (pingloss!=1){
|
||||
getline drop< pidfile;
|
||||
close(pidfile);
|
||||
}
|
||||
if (ERRNO) {addlist=0;next;}
|
||||
if (addlist==1){
|
||||
system("ipset add gfwlist "$1);
|
||||
while ((cmd | getline ret) > 0)
|
||||
{
|
||||
if (addlist==1)
|
||||
{
|
||||
if (index(ret,"short read")!=0)
|
||||
{
|
||||
system("ipset del gfwlist "$1);
|
||||
print("doname proxy rst autodelip "$1" "$2);
|
||||
addlist=-2;
|
||||
}
|
||||
else if (index(ret,"SSL handshake error: (null)")!=0)
|
||||
{
|
||||
if(system("curl -m 10 --resolve "$2":443:"$1" https://"$2" -o /dev/null 2>/dev/null")==0)
|
||||
{
|
||||
addlist=2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
close(cmd);
|
||||
if (addlist==1){
|
||||
split(ret, c,"[ /]+");
|
||||
print(c[6]);
|
||||
if (c[6]=="failed,")
|
||||
{
|
||||
system("ipset del gfwlist "$1);
|
||||
print("proxy can not connect autodelip "$1" "$2);
|
||||
addlist=-2;
|
||||
}else{
|
||||
addlist=2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}END{
|
||||
if (addlist==2)
|
||||
{ if (pingloss==0){
|
||||
ERRNO="";
|
||||
getline drop< pidfile;
|
||||
if (ERRNO) {
|
||||
system("ipset del gfwlist "$1);
|
||||
print("cancel add myself "$1" "$2" due to one ip success direct");
|
||||
}else{
|
||||
print $1"\n">>pidfile;
|
||||
}
|
||||
close(pidfile);}
|
||||
}else if (addlist==-1)
|
||||
{
|
||||
print($1" "$2" direct success");
|
||||
while ((getline ret< pidfile) > 0)
|
||||
{
|
||||
if (ret!=""){
|
||||
system("ipset del gfwlist "ret);
|
||||
print("cancel add someone "ret" "$2" due to me"$1" success direct");
|
||||
}
|
||||
}
|
||||
close(pidfile);
|
||||
system("rm "pidfile" 2>/dev/null");
|
||||
print($1" del "$2);
|
||||
}else if (addlist==-2)
|
||||
{
|
||||
system("sleep 10");
|
||||
while ((getline ret< pidfile) > 0)
|
||||
{
|
||||
if (ret!=""){
|
||||
system("ipset add gfwlist "$1);
|
||||
print("add "ret" "$2" due to one ip success proxy");
|
||||
break;}
|
||||
}
|
||||
close(pidfile);
|
||||
}}'
|
||||
@ -1,22 +0,0 @@
|
||||
#
|
||||
# <https://github.com/KFERMercer/luci-app-baidupcs-web>
|
||||
#
|
||||
# Copyright (C) 2020 KFERMercer <KFER.Mercer@gmail.com>
|
||||
# Copyright (C) 2021 ImmortalWrt
|
||||
#
|
||||
# THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-baidupcs-web
|
||||
LUCI_TITLE:=LuCI support for BaiduPCS-Go
|
||||
LUCI_DEPENDS:=+baidupcs-web +wget-ssl +openssl-util
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_VERSION:=1.0
|
||||
PKG_RELEASE:=5
|
||||
PKG_MAINTAINER:=<https://github.com/KFERMercer/luci-app-baidupcs-web>
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@ -1,17 +0,0 @@
|
||||
module("luci.controller.baidupcs-web", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/baidupcs-web") then
|
||||
return
|
||||
end
|
||||
entry({"admin", "nas", "baidupcs-web"}, cbi("baidupcs-web"), _("BaiduPCS Web"), 300).dependent = true
|
||||
entry({"admin","nas","baidupcs-web","status"},call("act_status")).leaf=true
|
||||
end
|
||||
|
||||
function act_status()
|
||||
local e={}
|
||||
e.running=luci.sys.call("pgrep baidupcs-web >/dev/null")==0
|
||||
-- e.port=luci.sys.exec("uci get baidupcs-web.config.port")
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(e)
|
||||
end
|
||||
@ -1,48 +0,0 @@
|
||||
--[[
|
||||
|
||||
Copyright (C) 2020 KFERMercer <KFER.Mercer@gmail.com>
|
||||
Copyright (C) 2021 ImmortalWrt
|
||||
|
||||
THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3
|
||||
|
||||
]]--
|
||||
|
||||
m = Map("baidupcs-web")
|
||||
m.title = translate("BaiduPCS-Web")
|
||||
m.description = translate("基于BaiduPCS-Go, 可以让你高效的使用百度云")
|
||||
|
||||
m:section(SimpleSection).template = "baidupcs-web/baidupcs-web_status"
|
||||
|
||||
s = m:section(TypedSection, "baidupcs-web")
|
||||
s.addremove = false
|
||||
s.anonymous = true
|
||||
|
||||
enable = s:option(Flag, "enabled", translate("启用"))
|
||||
enable.rmempty = false
|
||||
|
||||
o = s:option(Value, "port", translate("网页端口"))
|
||||
o.datatype = "port"
|
||||
o.placeholder = "5299"
|
||||
o.default = "5299"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, "download_dir", translate("下载目录"))
|
||||
o.placeholder = "/opt/baidupcsweb-download"
|
||||
o.default = "/opt/baidupcsweb-download"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, "max_download_rate", translate("最大下载速度"))
|
||||
o.placeholder = "0"
|
||||
|
||||
o = s:option(Value, "max_upload_rate", translate("最大上传速度"))
|
||||
o.placeholder = "0"
|
||||
o.description = translate("0代表不限制, 单位为每秒的传输速率, 后缀'/s' 可省略, 如 2MB/s, 2MB, 2m, 2mb 均为一个意思")
|
||||
|
||||
o = s:option(Value, "max_download_load", translate("同时进行下载文件的最大数量"))
|
||||
o.placeholder = "1"
|
||||
o.description = translate("不要太贪心, 当心被封号")
|
||||
|
||||
o = s:option(Value, "max_parallel", translate("最大并发连接数"))
|
||||
o.placeholder = "8"
|
||||
|
||||
return m
|
||||
@ -1,38 +0,0 @@
|
||||
<!--
|
||||
Copyright (C) 2020 KFERMercer <KFER.Mercer@gmail.com>
|
||||
THIS IS FREE SOFTWARE, LICENSED UNDER GPLv3.
|
||||
-->
|
||||
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(3, '<%=url([[admin]], [[nas]], [[baidupcs-web]], [[status]])%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('baidupcs-web_status');
|
||||
|
||||
if (data && tb) {
|
||||
if (data.running) {
|
||||
var links = '<em><b><font color=green>BaiduPCS-Web <%:RUNNING%></font></b></em><input class="cbi-button mar-10" type="button" value="<%:打开管理页面%>" onclick="openClient();" />';
|
||||
tb.innerHTML = links;
|
||||
} else {
|
||||
tb.innerHTML = '<em><b><font color=red>BaiduPCS-Web <%:NOT RUNNING%></font></b></em>';
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
function openClient() {
|
||||
var curWwwPath = window.document.location.href;
|
||||
var pathName = window.document.location.pathname;
|
||||
var pos = curWwwPath.indexOf(pathName);
|
||||
var localhostPath = curWwwPath.substring(0, pos);
|
||||
var clientPort = window.document.getElementById("cbid.baidupcs-web.config.port").value
|
||||
var url = "http:" + localhostPath.substring(window.location.protocol.length) + ":" + clientPort;
|
||||
window.open(url)
|
||||
};
|
||||
//]]>
|
||||
</script>
|
||||
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
|
||||
<fieldset class="cbi-section">
|
||||
<p id="baidupcs-web_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
</fieldset>
|
||||
@ -1,2 +0,0 @@
|
||||
|
||||
config baidupcs-web 'config'
|
||||
@ -1,32 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=90
|
||||
STOP=10
|
||||
|
||||
enabled="$(uci get baidupcs-web.config.enabled)"
|
||||
port="$(uci get baidupcs-web.config.port)"
|
||||
download_dir="$(uci get baidupcs-web.config.download_dir)"
|
||||
max_download_rate="$(uci get baidupcs-web.config.max_download_rate || echo '0')"
|
||||
max_upload_rate="$(uci get baidupcs-web.config.max_upload_rate || echo '0')"
|
||||
max_download_load="$(uci get baidupcs-web.config.max_download_load || echo '1')"
|
||||
max_parallel="$(uci get baidupcs-web.config.max_parallel || echo '8')"
|
||||
|
||||
start() {
|
||||
stop
|
||||
[ "$enabled" == "1" ] || exit 0
|
||||
mkdir -p "${download_dir}"
|
||||
baidupcs-web config set \
|
||||
--savedir "${download_dir}" \
|
||||
--max_download_rate "${max_download_rate}" \
|
||||
--max_upload_rate "${max_upload_rate}" \
|
||||
--max_download_load "${max_download_load}" \
|
||||
--max_parallel "${max_parallel}" \
|
||||
--max_upload_parallel "${max_parallel}" \
|
||||
>/dev/null 2>&1
|
||||
|
||||
baidupcs-web web --port "${port}" --access >/dev/null 2>&1 &
|
||||
}
|
||||
|
||||
stop() {
|
||||
killall baidupcs-web >/dev/null 2>&1
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@baidupcs-web[-1]
|
||||
add ucitrack baidupcs-web
|
||||
set ucitrack.@baidupcs-web[-1].init=baidupcs-web
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
rm -f /tmp/luci-indexcache
|
||||
exit 0
|
||||
@ -1,22 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2020 Nate Ding
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v3.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_Title:=LuCI Support for BearDropper
|
||||
LUCI_PKGARCH=all
|
||||
|
||||
PKG_VERSION:=1.1
|
||||
PKG_RELEASE:=20200522
|
||||
|
||||
PKG_MAINTANINER:=Nate Ding <natelol@github.com>
|
||||
PKG_LICENSE:=GLPv3
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
@ -1,19 +0,0 @@
|
||||
module("luci.controller.beardropper", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/beardropper") then
|
||||
return
|
||||
end
|
||||
entry({"admin", "services", "beardropper"}, alias("admin", "services", "beardropper", "setting"),_("BearDropper"), 20).dependent = true
|
||||
entry({"admin", "services", "beardropper", "status"}, call("act_status"))
|
||||
entry({"admin", "services", "beardropper", "setting"}, cbi("beardropper/setting"), _("Setting"), 30).leaf= true
|
||||
entry({"admin", "services", "beardropper", "log"}, form("beardropper/log"),_("Log"), 40).leaf= true
|
||||
--entry:
|
||||
end
|
||||
|
||||
function act_status()
|
||||
local e={}
|
||||
e.running = luci.sys.call("pgrep -f /usr/sbin/beardropper >/dev/null")==0
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(e)
|
||||
end
|
||||
@ -1,17 +0,0 @@
|
||||
f = SimpleForm("logview")
|
||||
f.reset = false
|
||||
f.submit = false
|
||||
t = f:field(TextValue, "conf")
|
||||
t.rmempty = true
|
||||
t.rows = 20
|
||||
function t.cfgvalue()
|
||||
local logs = luci.util.execi("logread | grep authpriv | grep beardropper")
|
||||
local s = ""
|
||||
for line in logs do
|
||||
s = line .. "\n" .. s
|
||||
end
|
||||
return s
|
||||
end
|
||||
t.readonly="readonly"
|
||||
|
||||
return f
|
||||
@ -1,54 +0,0 @@
|
||||
|
||||
m = Map("beardropper", translate("BearDropper"),
|
||||
translate("luci-app-beardropper, the LuCI app built with the elegant firewall rule generation on-the-fly script bearDropper. <br /> <br /> Should you have any questions, please refer to the repo: ")..[[<a href="https://github.com/NateLol/luci-app-bearDropper" target="_blank">luci-app-beardropper</a>]]
|
||||
)
|
||||
m:chain("luci")
|
||||
|
||||
m:section(SimpleSection).template="beardropper/status"
|
||||
|
||||
s = m:section(TypedSection, "beardropper", translate(""))
|
||||
s.anonymous = true
|
||||
s.addremove = false
|
||||
|
||||
-- TABS
|
||||
s:tab("options", translate("Options"))
|
||||
s:tab("blocked", translate("Blocked IP"))
|
||||
|
||||
o = s:taboption("options", Flag, "enabled",translate("Enabled"))
|
||||
o.default = 0
|
||||
|
||||
-- OPTIONS
|
||||
o = s:taboption("options", ListValue, "defaultMode", translate("Running Mode"))
|
||||
o.default = "follow"
|
||||
o:value("follow", translate("Follow"))
|
||||
o:value("entire", translate("Entire"))
|
||||
o:value("today", translate("Today"))
|
||||
o:value("wipe", translate("Wipe"))
|
||||
|
||||
|
||||
o = s:taboption("options", Value, "attemptCount", translate("Attempt Tolerance"), translate("failure attempts from a given IP required to trigger a ban"))
|
||||
|
||||
o = s:taboption("options", Value, "attemptPeriod", translate("Attempt Cycle"), translate("time period during which attemptCount must be exceeded in order to trigger a ban <br> Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds"))
|
||||
|
||||
o = s:taboption("options", Value, "banLength", translate("Ban Period"), translate("how long a ban exist once the attempt threshold is exceeded"))
|
||||
|
||||
o = s:taboption("options", ListValue, "logLevel", translate("Log Level"))
|
||||
o.default = "1"
|
||||
o:value("0", translate("Silent"))
|
||||
o:value("1", translate("Default"))
|
||||
o:value("2", translate("Verbose"))
|
||||
o:value("3", translate("Debug"))
|
||||
|
||||
|
||||
o = s:taboption("blocked", Value, "blocked", translate("Blocked IP List"))
|
||||
o.template="cbi/tvalue"
|
||||
o.rows=40
|
||||
o.wrap="off"
|
||||
o.readonly="true"
|
||||
function o.cfgvalue(e, e)
|
||||
return luci.sys.exec("cat /tmp/beardropper.bddb | awk /'=1/'| awk -F '=' '{print $1}' | awk '{print substr($0,6)}' | awk 'gsub(/_/,\":\",$0)'")
|
||||
end
|
||||
|
||||
|
||||
|
||||
return m
|
||||
@ -1,22 +0,0 @@
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[beardropper]], [[status]])%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('beardropper_status');
|
||||
if (data && tb) {
|
||||
if (data.running) {
|
||||
var links = '<em><b><font color=green>BearDropper <%:RUNNING%></font></b></em>';
|
||||
tb.innerHTML = links;
|
||||
} else {
|
||||
tb.innerHTML = '<em><b><font color=red>BearDropper <%:NOT RUNNING%></font></b></em>';
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]>
|
||||
</script>
|
||||
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
|
||||
<fieldset class="cbi-section">
|
||||
<p id="beardropper_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
</fieldset>
|
||||
@ -1,115 +0,0 @@
|
||||
bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36
|
||||
msgid "Attempt Cycle"
|
||||
msgstr "尝试登录时间段"
|
||||
|
||||
|
||||
msgid "Setting"
|
||||
msgstr "设置"
|
||||
|
||||
msgid "Log"
|
||||
msgstr "日志"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34
|
||||
msgid "Attempt Tolerance"
|
||||
msgstr "最大尝试登录次数"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38
|
||||
msgid "Ban Period"
|
||||
msgstr "封禁IP时长"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7
|
||||
msgid "BearDropper"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20
|
||||
msgid "Blocked IP"
|
||||
msgstr "屏蔽列表"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52
|
||||
msgid "Blocked IP List"
|
||||
msgstr "已屏蔽IP列表"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20
|
||||
msgid "Collecting data..."
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45
|
||||
msgid "Debug"
|
||||
msgstr "调试"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43
|
||||
msgid "Default"
|
||||
msgstr "默认"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22
|
||||
msgid "Enabled"
|
||||
msgstr "启用"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29
|
||||
msgid "Entire"
|
||||
msgstr "已有记录"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28
|
||||
msgid "Follow"
|
||||
msgstr "后台监控"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40
|
||||
msgid "Log Level"
|
||||
msgstr "日志等级"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10
|
||||
msgid "NOT RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19
|
||||
msgid "Options"
|
||||
msgstr "选项"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7
|
||||
msgid "RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26
|
||||
msgid "Running Mode"
|
||||
msgstr "运行模式"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42
|
||||
msgid "Silent"
|
||||
msgstr "安静"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30
|
||||
msgid "Today"
|
||||
msgstr "仅今日"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44
|
||||
msgid "Verbose"
|
||||
msgstr "详细"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31
|
||||
msgid "Wipe"
|
||||
msgstr "清除所有"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34
|
||||
msgid "failure attempts from a given IP required to trigger a ban"
|
||||
msgstr "尝试登录超过设定值次数的IP将被封禁"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38
|
||||
msgid "how long a ban exist once the attempt threshold is exceeded"
|
||||
msgstr "IP将被封禁设定的时间"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8
|
||||
msgid ""
|
||||
"luci-app-beardropper, the LuCI app built with the elegant firewall rule "
|
||||
"generation on-the-fly script bearDropper. <br /> <br /> Should you have any "
|
||||
"questions, please refer to the repo:"
|
||||
msgstr ""
|
||||
"luci-app-beardropper, 是一款能够在开启公网访问之后对潜在的ssh attack进行防御"
|
||||
"的脚本. <br /> <br /> 如果你在使用中有任何问题,请到项目中提问: "
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36
|
||||
msgid ""
|
||||
"time period during which attemptCount must be exceeded in order to trigger a "
|
||||
"ban <br> Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds"
|
||||
msgstr ""
|
||||
"在设定的时间段内连续尝试失败 <br> 格式:1w2d3h4m5s代表1周2天3小时4分5秒"
|
||||
@ -1,115 +0,0 @@
|
||||
bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36
|
||||
msgid "Attempt Cycle"
|
||||
msgstr "嘗試登錄時間段"
|
||||
|
||||
|
||||
msgid "Setting"
|
||||
msgstr "設置"
|
||||
|
||||
msgid "Log"
|
||||
msgstr "日誌"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34
|
||||
msgid "Attempt Tolerance"
|
||||
msgstr "最大嘗試登錄次數"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38
|
||||
msgid "Ban Period"
|
||||
msgstr "封禁IP時長"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7
|
||||
msgid "BearDropper"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20
|
||||
msgid "Blocked IP"
|
||||
msgstr "屏蔽列表"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52
|
||||
msgid "Blocked IP List"
|
||||
msgstr "已屏蔽IP列表"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20
|
||||
msgid "Collecting data..."
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45
|
||||
msgid "Debug"
|
||||
msgstr "調試"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43
|
||||
msgid "Default"
|
||||
msgstr "默認"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22
|
||||
msgid "Enabled"
|
||||
msgstr "啟用"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29
|
||||
msgid "Entire"
|
||||
msgstr "已有記錄"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28
|
||||
msgid "Follow"
|
||||
msgstr "後臺監控"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40
|
||||
msgid "Log Level"
|
||||
msgstr "日誌等級"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10
|
||||
msgid "NOT RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19
|
||||
msgid "Options"
|
||||
msgstr "選項"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7
|
||||
msgid "RUNNING"
|
||||
msgstr ""
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26
|
||||
msgid "Running Mode"
|
||||
msgstr "運行模式"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42
|
||||
msgid "Silent"
|
||||
msgstr "安靜"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30
|
||||
msgid "Today"
|
||||
msgstr "僅今日"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44
|
||||
msgid "Verbose"
|
||||
msgstr "詳細"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31
|
||||
msgid "Wipe"
|
||||
msgstr "清除所有"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34
|
||||
msgid "failure attempts from a given IP required to trigger a ban"
|
||||
msgstr "嘗試登錄超過設定值次數的IP將被封禁"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38
|
||||
msgid "how long a ban exist once the attempt threshold is exceeded"
|
||||
msgstr "IP將被封禁設定的時間"
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8
|
||||
msgid ""
|
||||
"luci-app-beardropper, the LuCI app built with the elegant firewall rule "
|
||||
"generation on-the-fly script bearDropper. <br /> <br /> Should you have any "
|
||||
"questions, please refer to the repo:"
|
||||
msgstr ""
|
||||
"luci-app-beardropper, 是壹款能夠在開啟公網訪問之後對潛在的ssh attack進行防禦"
|
||||
"的腳本. <br /> <br /> 如果妳在使用中有任何問題,請到項目中提問: "
|
||||
|
||||
#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36
|
||||
msgid ""
|
||||
"time period during which attemptCount must be exceeded in order to trigger a "
|
||||
"ban <br> Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds"
|
||||
msgstr ""
|
||||
"在設定的時間段內連續嘗試失敗 <br> 格式:1w2d3h4m5s代表1周2天3小時4分5秒"
|
||||
@ -1,18 +0,0 @@
|
||||
config beardropper
|
||||
option attemptCount '5'
|
||||
option attemptPeriod '12h'
|
||||
option banLength '1w'
|
||||
option logFacility 'authpriv.notice'
|
||||
option fileStateType 'bddb'
|
||||
option fileStateTempPrefix '/tmp/beardropper'
|
||||
option fileStatePersistPrefix '/etc/beardropper'
|
||||
list firewallHookChain 'input_wan_rule:1'
|
||||
list firewallHookChain 'forwarding_wan_rule:1'
|
||||
option firewallTarget 'DROP'
|
||||
list logRegex 's/[`$"\'\'']//g'
|
||||
list logRegex '/has invalid shell, rejected$/d'
|
||||
list logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\[.+([0-9]+\.){3}[0-9]+/p'
|
||||
list logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\[.+:\ Exit before auth:.*/p'
|
||||
option defaultMode 'follow'
|
||||
option enabled '1'
|
||||
option logLevel '2'
|
||||
@ -1,46 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
START=98
|
||||
|
||||
PROG=/usr/sbin/beardropper
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_WRITE_PID=1
|
||||
|
||||
getKids() {
|
||||
egrep "^PPid: *$1$" /proc/[0-9]*/s*s 2>/dev/null | cut -f3 -d/ | xargs echo
|
||||
}
|
||||
|
||||
start() {
|
||||
service_start ${PROG} -m follow
|
||||
echo "beardropper started!"
|
||||
}
|
||||
|
||||
stop() {
|
||||
#PID=`cat /var/run/bearDropper.pid`
|
||||
#kill `getKids $PID`
|
||||
kill -9 `pgrep -f /usr/sbin/beardropper`
|
||||
sleep 1
|
||||
service_stop ${PROG}
|
||||
echo "beardropper exit...."
|
||||
}
|
||||
|
||||
restart() {
|
||||
enabled=$(uci get beardropper.@beardropper[0].enabled)
|
||||
pgrep -f ${PROG} >/dev/null
|
||||
if [ $? -eq 0 ];then #running
|
||||
if [ $enabled -eq 1 ]; then
|
||||
stop
|
||||
sleep 1
|
||||
echo "beardropper is restarting..."
|
||||
start
|
||||
else
|
||||
stop
|
||||
fi
|
||||
else
|
||||
if [ $enabled -eq 1 ]; then
|
||||
start
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@beardropper[-1]
|
||||
add ucitrack beardropper
|
||||
set ucitrack.@beardropper[-1].init=beardropper
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
touch /tmp/beardropper.bddb
|
||||
rm -rf /tmp/luci-*
|
||||
exit 0
|
||||
@ -1,517 +0,0 @@
|
||||
#!/bin/ash
|
||||
#
|
||||
# beardropper - dropbear log parsing ban agent for OpenWRT (Chaos Calmer rewrite of dropBrute.sh)
|
||||
# http://github.com/robzr/bearDropper -- Rob Zwissler 11/2015
|
||||
#
|
||||
# - lightweight, no dependencies, busybox ash + native OpenWRT commands
|
||||
# - uses uci for configuration, overrideable via command line arguments
|
||||
# - runs continuously in background (via init script) or periodically (via cron)
|
||||
# - uses BIND time shorthand, ex: 1w5d3h1m8s is 1 week, 5 days, 3 hours, 1 minute, 8 seconds
|
||||
# - Whitelist IP or CIDR entries (TBD) in uci config file
|
||||
# - Records state file to tmpfs and intelligently syncs to persistent storage (can disable)
|
||||
# - Persistent sync routines are optimized to avoid excessive writes (persistentStateWritePeriod)
|
||||
# - Every run occurs in one of the following modes. If not specified, interval mode (24 hours) is
|
||||
# the default when not specified (the init script specifies follow mode via command line)
|
||||
#
|
||||
# "follow" mode follows syslog to process entries as they happen; generally launched via init
|
||||
# script. Responds the fastest, runs the most efficiently, but is always in memory.
|
||||
# "interval" mode only processes entries going back the specified interval; requires
|
||||
# more processing than today mode, but responds more accurately. Use with cron.
|
||||
# "today" mode looks at log entries from the day it is being run, simple and lightweight,
|
||||
# generally run from cron periodically (same simplistic behavior as dropBrute.sh)
|
||||
# "entire" mode runs through entire contents of the syslog ring buffer
|
||||
# "wipe" mode tears down the firewall rules and removes the state files
|
||||
|
||||
# Load UCI config variable, or use default if not set
|
||||
# Args: $1 = variable name (also uci option name), $2 = default_value
|
||||
uciSection='beardropper.@[0]'
|
||||
uciLoadVar () {
|
||||
local getUci
|
||||
getUci=`uci -q get ${uciSection}."$1"` || getUci="$2"
|
||||
eval $1=\'$getUci\';
|
||||
}
|
||||
uciLoad() {
|
||||
local tFile=`mktemp` delim="
|
||||
"
|
||||
[ "$1" = -d ] && { delim="$2"; shift 2; }
|
||||
uci -q -d"$delim" get "$uciSection.$1" 2>/dev/null >$tFile
|
||||
if [ $? = 0 ] ; then
|
||||
sed -e s/^\'// -e s/\'$// <$tFile
|
||||
else
|
||||
while [ -n "$2" ]; do echo $2; shift; done
|
||||
fi
|
||||
rm -f $tFile
|
||||
}
|
||||
|
||||
# Common config variables - edit these in /etc/config/beardropper
|
||||
# or they can be overridden at runtime with command line options
|
||||
#
|
||||
uciLoadVar defaultMode entire
|
||||
uciLoadVar enabled 0
|
||||
uciLoadVar attemptCount 10
|
||||
uciLoadVar attemptPeriod 12h
|
||||
uciLoadVar banLength 1w
|
||||
uciLoadVar logLevel 1
|
||||
uciLoadVar logFacility authpriv.notice
|
||||
uciLoadVar persistentStateWritePeriod -1
|
||||
uciLoadVar fileStateType bddb
|
||||
uciLoadVar fileStateTempPrefix /tmp/beardropper
|
||||
uciLoadVar fileStatePersistPrefix /etc/beardropper
|
||||
firewallHookChains="`uciLoad -d \ firewallHookChain input_wan_rule:1 forwarding_wan_rule:1`"
|
||||
uciLoadVar firewallTarget DROP
|
||||
|
||||
# Not commonly changed, but changeable via uci or cmdline (primarily
|
||||
# to enable multiple parallel runs with different parameters)
|
||||
uciLoadVar firewallChain beardropper
|
||||
|
||||
# Advanced variables, changeable via uci only (no cmdline), it is
|
||||
# unlikely that these will need to be changed, but just in case...
|
||||
#
|
||||
uciLoadVar syslogTag "beardropper[$$]"
|
||||
# how often to attempt to expire bans when in follow mode
|
||||
uciLoadVar followModeCheckInterval 30m
|
||||
uciLoadVar cmdLogread 'logread' # for tuning, ex: "logread -l250"
|
||||
uciLoadVar cmdLogreadEba 'logread' # for "Exit before auth:" backscanning
|
||||
uciLoadVar formatLogDate '%b %e %H:%M:%S %Y' # used to convert syslog dates
|
||||
uciLoadVar formatTodayLogDateRegex '^%a %b %e ..:..:.. %Y' # filter for today mode
|
||||
|
||||
# Begin functions
|
||||
#
|
||||
# Clear bddb entries from environment
|
||||
bddbClear () {
|
||||
local bddbVar
|
||||
for bddbVar in `set | egrep '^bddb_[0-9_]*=' | cut -f1 -d= | xargs echo -n` ; do eval unset $bddbVar ; done
|
||||
bddbStateChange=1
|
||||
}
|
||||
|
||||
# Returns count of unique IP entries in environment
|
||||
bddbCount () { set | egrep '^bddb_[0-9_]*=' | wc -l ; }
|
||||
|
||||
# Loads existing bddb file into environment
|
||||
# Arg: $1 = file, $2 = type (bddb/bddbz), $3 =
|
||||
bddbLoad () {
|
||||
local loadFile="$1.$2" fileType="$2"
|
||||
if [ "$fileType" = bddb -a -f "$loadFile" ] ; then
|
||||
. "$loadFile"
|
||||
elif [ "$fileType" = bddbz -a -f "$loadFile" ] ; then
|
||||
local tmpFile="`mktemp`"
|
||||
zcat $loadFile > "$tmpFile"
|
||||
. "$tmpFile"
|
||||
rm -f "$tmpFile"
|
||||
fi
|
||||
bddbStateChange=0
|
||||
}
|
||||
|
||||
# Saves environment bddb entries to file, Arg: $1 = file to save in
|
||||
bddbSave () {
|
||||
local saveFile="$1.$2" fileType="$2"
|
||||
if [ "$fileType" = bddb ] ; then
|
||||
set | egrep '^bddb_[0-9_]*=' | sed s/\'//g > "$saveFile"
|
||||
elif [ "$fileType" = bddbz ] ; then
|
||||
set | egrep '^bddb_[0-9_]*=' | sed s/\'//g | gzip -c > "$saveFile"
|
||||
fi
|
||||
bddbStateChange=0
|
||||
}
|
||||
|
||||
# Set bddb record status=1, update ban time flag with newest
|
||||
# Args: $1=IP Address $2=timeFlag
|
||||
bddbEnableStatus () {
|
||||
local record=`echo $1 | sed -e 's/\./_/g' -e 's/^/bddb_/'`
|
||||
local newestTime=`bddbGetTimes $1 | sed 's/.* //' | xargs echo $2 | tr \ '\n' | sort -n | tail -1 `
|
||||
eval $record="1,$newestTime"
|
||||
bddbStateChange=1
|
||||
}
|
||||
|
||||
# Args: $1=IP Address
|
||||
bddbGetStatus () {
|
||||
bddbGetRecord $1 | cut -d, -f1
|
||||
}
|
||||
|
||||
# Args: $1=IP Address
|
||||
bddbGetTimes () {
|
||||
bddbGetRecord $1 | cut -d, -f2-
|
||||
}
|
||||
|
||||
# Args: $1 = IP address, $2 [$3 ...] = timestamp (seconds since epoch)
|
||||
bddbAddRecord () {
|
||||
local ip="`echo "$1" | tr . _`" ; shift
|
||||
local newEpochList="$@" status="`eval echo \\\$bddb_$ip | cut -f1 -d,`"
|
||||
local oldEpochList="`eval echo \\\$bddb_$ip | cut -f2- -d, | tr , \ `"
|
||||
local epochList=`echo $oldEpochList $newEpochList | xargs -n 1 echo | sort -un | xargs echo -n | tr \ ,`
|
||||
[ -z "$status" ] && status=0
|
||||
eval "bddb_$ip"\=\"$status,$epochList\"
|
||||
bddbStateChange=1
|
||||
}
|
||||
|
||||
# Args: $1 = IP address
|
||||
bddbRemoveRecord () {
|
||||
local ip="`echo "$1" | tr . _`"
|
||||
eval unset bddb_$ip
|
||||
bddbStateChange=1
|
||||
}
|
||||
|
||||
# Returns all IPs (not CIDR) present in records
|
||||
bddbGetAllIPs () {
|
||||
local ipRaw record
|
||||
set | egrep '^bddb_[0-9_]*=' | tr \' \ | while read record ; do
|
||||
ipRaw=`echo $record | cut -f1 -d= | sed 's/^bddb_//'`
|
||||
if [ `echo $ipRaw | tr _ \ | wc -w` -eq 4 ] ; then
|
||||
echo $ipRaw | tr _ .
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# retrieve single IP record, Args: $1=IP
|
||||
bddbGetRecord () {
|
||||
local record
|
||||
record=`echo $1 | sed -e 's/\./_/g' -e 's/^/bddb_/'`
|
||||
eval echo \$$record
|
||||
}
|
||||
|
||||
isValidBindTime () { echo "$1" | egrep -q '^[0-9]+$|^([0-9]+[wdhms]?)+$' ; }
|
||||
|
||||
# expands Bind time syntax into seconds (ex: 3w6d23h59m59s), Arg: $1=time string
|
||||
expandBindTime () {
|
||||
isValidBindTime "$1" || { logLine 0 "Error: Invalid time specified ($1)" >&2 ; exit 254 ; }
|
||||
echo $((`echo "$1" | sed -e 's/w+*/*7d+/g' -e 's/d+*/*24h+/g' -e 's/h+*/*60m+/g' -e 's/m+*/*60+/g' \
|
||||
-e s/s//g -e s/+\$//`))
|
||||
}
|
||||
|
||||
# Args: $1 = loglevel, $2 = info to log
|
||||
logLine () {
|
||||
[ $1 -gt $logLevel ] && return
|
||||
shift
|
||||
if [ "$logFacility" = "stdout" ] ; then echo "$@"
|
||||
elif [ "$logFacility" = "stderr" ] ; then echo "$@" >&2
|
||||
else logger -t "$syslogTag" -p "$logFacility" "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# extra validation, fails safe. Args: $1=log line
|
||||
getLogTime () {
|
||||
local logDateString=`echo "$1" | sed -n \
|
||||
's/^[A-Z][a-z]* \([A-Z][a-z]* *[0-9][0-9]* *[0-9][0-9]*:[0-9][0-9]:[0-9][0-9] [0-9][0-9]*\) .*$/\1/p'`
|
||||
date -d"$logDateString" -D"$formatLogDate" +%s || logLine 1 \
|
||||
"Error: logDateString($logDateString) malformed line ($1)"
|
||||
}
|
||||
|
||||
# extra validation, fails safe. Args: $1=log line
|
||||
getLogIP () {
|
||||
local logLine="$1"
|
||||
local ebaPID=`echo "$logLine" | sed -n 's/^.*authpriv.info \(dropbear\[[0-9]*\]:\) Exit before auth:.*/\1/p'`
|
||||
[ -n "$ebaPID" ] && logLine=`$cmdLogreadEba | fgrep "${ebaPID} Child connection from "`
|
||||
echo "$logLine" | sed -n 's/^.*[^0-9]\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'
|
||||
}
|
||||
|
||||
# Args: $1=IP
|
||||
unBanIP () {
|
||||
if iptables -C $firewallChain -s $ip -j "$firewallTarget" 2>/dev/null ; then
|
||||
logLine 1 "Removing ban rule for IP $ip from iptables"
|
||||
iptables -D $firewallChain -s $ip -j "$firewallTarget"
|
||||
else
|
||||
logLine 3 "unBanIP() Ban rule for $ip not present in iptables"
|
||||
fi
|
||||
}
|
||||
|
||||
# Args: $1=IP
|
||||
banIP () {
|
||||
local ip="$1" x chain position
|
||||
if ! iptables -nL $firewallChain >/dev/null 2>/dev/null ; then
|
||||
logLine 1 "Creating iptables chain $firewallChain"
|
||||
iptables -N $firewallChain
|
||||
fi
|
||||
for x in $firewallHookChains ; do
|
||||
chain="${x%:*}" ; position="${x#*:}"
|
||||
if [ $position -ge 0 ] && ! iptables -C $chain -j $firewallChain 2>/dev/null ; then
|
||||
logLine 1 "Inserting hook into iptables chain $chain"
|
||||
if [ $position = 0 ] ; then
|
||||
iptables -A $chain -j $firewallChain
|
||||
else
|
||||
iptables -I $chain $position -j $firewallChain
|
||||
fi ; fi
|
||||
done
|
||||
if ! iptables -C $firewallChain -s $ip -j "$firewallTarget" 2>/dev/null ; then
|
||||
logLine 1 "Inserting ban rule for IP $ip into iptables chain $firewallChain"
|
||||
iptables -A $firewallChain -s $ip -j "$firewallTarget"
|
||||
else
|
||||
logLine 3 "banIP() rule for $ip already present in iptables chain"
|
||||
fi
|
||||
}
|
||||
|
||||
wipeFirewall () {
|
||||
local x chain position
|
||||
for x in $firewallHookChains ; do
|
||||
chain="${x%:*}" ; position="${x#*:}"
|
||||
if [ $position -ge 0 ] ; then
|
||||
if iptables -C $chain -j $firewallChain 2>/dev/null ; then
|
||||
logLine 1 "Removing hook from iptables chain $chain"
|
||||
iptables -D $chain -j $firewallChain
|
||||
fi ; fi
|
||||
done
|
||||
if iptables -nL $firewallChain >/dev/null 2>/dev/null ; then
|
||||
logLine 1 "Flushing and removing iptables chain $firewallChain"
|
||||
iptables -F $firewallChain 2>/dev/null
|
||||
iptables -X $firewallChain 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
# review state file for expired records - we could add the bantime to
|
||||
# the rule via --comment but I can't think of a reason why that would
|
||||
# be necessary unless there is a bug in the expiration logic. The
|
||||
# state db should be more resiliant than the firewall in practice.
|
||||
#
|
||||
bddbCheckStatusAll () {
|
||||
local now=`date +%s`
|
||||
bddbGetAllIPs | while read ip ; do
|
||||
if [ `bddbGetStatus $ip` -eq 1 ] ; then
|
||||
logLine 3 "bddbCheckStatusAll($ip) testing banLength:$banLength + bddbGetTimes:`bddbGetTimes $ip` vs. now:$now"
|
||||
if [ $((banLength + `bddbGetTimes $ip`)) -lt $now ] ; then
|
||||
logLine 1 "Ban expired for $ip, removing from iptables"
|
||||
unBanIP $ip
|
||||
bddbRemoveRecord $ip
|
||||
else
|
||||
logLine 3 "bddbCheckStatusAll($ip) not expired yet"
|
||||
banIP $ip
|
||||
fi
|
||||
elif [ `bddbGetStatus $ip` -eq 0 ] ; then
|
||||
local times=`bddbGetTimes $ip | tr , \ `
|
||||
local timeCount=`echo $times | wc -w`
|
||||
local lastTime=`echo $times | cut -d\ -f$timeCount`
|
||||
if [ $((lastTime + attemptPeriod)) -lt $now ] ; then
|
||||
bddbRemoveRecord $ip
|
||||
fi ; fi
|
||||
saveState
|
||||
done
|
||||
loadState
|
||||
}
|
||||
|
||||
# Only used when status is already 0 and possibly going to 1, Args: $1=IP
|
||||
bddbEvaluateRecord () {
|
||||
local ip=$1 firstTime lastTime
|
||||
local times=`bddbGetRecord $1 | cut -d, -f2- | tr , \ `
|
||||
local timeCount=`echo $times | wc -w`
|
||||
local didBan=0
|
||||
|
||||
# 1: not enough attempts => do nothing and exit
|
||||
# 2: attempts exceed threshold in time period => ban
|
||||
# 3: attempts exceed threshold but time period is too long => trim oldest time, recalculate
|
||||
while [ $timeCount -ge $attemptCount ] ; do
|
||||
firstTime=`echo $times | cut -d\ -f1`
|
||||
lastTime=`echo $times | cut -d\ -f$timeCount`
|
||||
timeDiff=$((lastTime - firstTime))
|
||||
logLine 3 "bddbEvaluateRecord($ip) count=$timeCount timeDiff=$timeDiff/$attemptPeriod"
|
||||
if [ $timeDiff -le $attemptPeriod ] ; then
|
||||
bddbEnableStatus $ip $lastTime
|
||||
logLine 2 "bddbEvaluateRecord($ip) exceeded ban threshold, adding to iptables"
|
||||
banIP $ip
|
||||
didBan=1
|
||||
fi
|
||||
times=`echo $times | cut -d\ -f2-`
|
||||
timeCount=`echo $times | wc -w`
|
||||
done
|
||||
[ $didBan = 0 ] && logLine 2 "bddbEvaluateRecord($ip) does not exceed threshhold, skipping"
|
||||
}
|
||||
|
||||
# Reads filtered log line and evaluates for action Args: $1=log line
|
||||
processLogLine () {
|
||||
local time=`getLogTime "$1"`
|
||||
local ip=`getLogIP "$1"`
|
||||
local status="`bddbGetStatus $ip`"
|
||||
|
||||
if [ "$status" = -1 ] ; then
|
||||
logLine 2 "processLogLine($ip,$time) IP is whitelisted"
|
||||
elif [ "$status" = 1 ] ; then
|
||||
if [ "`bddbGetTimes $ip`" -ge $time ] ; then
|
||||
logLine 2 "processLogLine($ip,$time) already banned, ban timestamp already equal or newer"
|
||||
else
|
||||
logLine 2 "processLogLine($ip,$time) already banned, updating ban timestamp"
|
||||
bddbEnableStatus $ip $time
|
||||
fi
|
||||
banIP $ip
|
||||
elif [ -n "$ip" -a -n "$time" ] ; then
|
||||
bddbAddRecord $ip $time
|
||||
logLine 2 "processLogLine($ip,$time) Added record, comparing"
|
||||
bddbEvaluateRecord $ip
|
||||
else
|
||||
logLine 1 "processLogLine($ip,$time) malformed line ($1)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Args, $1=-f to force a persistent write (unless lastPersistentStateWrite=-1)
|
||||
saveState () {
|
||||
local forcePersistent=0
|
||||
[ "$1" = "-f" ] && forcePersistent=1
|
||||
|
||||
if [ $bddbStateChange -gt 0 ] ; then
|
||||
logLine 3 "saveState() saving to temp state file"
|
||||
bddbSave "$fileStateTempPrefix" "$fileStateType"
|
||||
logLine 3 "saveState() now=`date +%s` lPSW=$lastPersistentStateWrite pSWP=$persistentStateWritePeriod fP=$forcePersistent"
|
||||
fi
|
||||
if [ $persistentStateWritePeriod -gt 1 ] || [ $persistentStateWritePeriod -eq 0 -a $forcePersistent -eq 1 ] ; then
|
||||
if [ $((`date +%s` - lastPersistentStateWrite)) -ge $persistentStateWritePeriod ] || [ $forcePersistent -eq 1 ] ; then
|
||||
if [ ! -f "$fileStatePersist" ] || ! cmp -s "$fileStateTemp" "$fileStatePersist" ; then
|
||||
logLine 2 "saveState() writing to persistent state file"
|
||||
bddbSave "$fileStatePersistPrefix" "$fileStateType"
|
||||
lastPersistentStateWrite="`date +%s`"
|
||||
fi ; fi ; fi
|
||||
}
|
||||
|
||||
loadState () {
|
||||
bddbClear
|
||||
bddbLoad "$fileStatePersistPrefix" "$fileStateType"
|
||||
bddbLoad "$fileStateTempPrefix" "$fileStateType"
|
||||
logLine 2 "loadState() loaded `bddbCount` entries"
|
||||
}
|
||||
|
||||
printUsage () {
|
||||
cat <<-_EOF_
|
||||
Usage: beardropper [-m mode] [-a #] [-b #] [-c ...] [-C ...] [-f ...] [-l #] [-j ...] [-p #] [-P #] [-s ...]
|
||||
|
||||
Running Modes (-m) (def: $defaultMode)
|
||||
follow constantly monitors log
|
||||
entire processes entire log contents
|
||||
today processes log entries from same day only
|
||||
# interval mode, specify time string or seconds
|
||||
wipe wipe state files, unhook and remove firewall chain
|
||||
|
||||
Options
|
||||
-a # attempt count before banning (def: $attemptCount)
|
||||
-b # ban length once attempts hit threshold (def: $banLength)
|
||||
-c ... firewall chain to record bans (def: $firewallChain)
|
||||
-C ... firewall chains/positions to hook into (def: $firewallHookChains)
|
||||
-f ... log facility (syslog facility or stdout/stderr) (def: $logFacility)
|
||||
-j ... firewall target (def: $firewallTarget)
|
||||
-l # log level - 0=off, 1=standard, 2=verbose (def: $logLevel)
|
||||
-p # attempt period which attempt counts must happen in (def: $attemptPeriod)
|
||||
-P # persistent state file write period (def: $persistentStateWritePeriod)
|
||||
-s ... persistent state file prefix (def: $fileStatePersistPrefix)
|
||||
-t ... temporary state file prefix (def: $fileStateTempPrefix)
|
||||
|
||||
All time strings can be specified in seconds, or using BIND style
|
||||
time strings, ex: 1w2d3h5m30s is 1 week, 2 days, 3 hours, etc...
|
||||
|
||||
_EOF_
|
||||
}
|
||||
|
||||
# Begin main logic
|
||||
#
|
||||
unset logMode
|
||||
while getopts a:b:c:C:f:hj:l:m:p:P:s:t: arg ; do
|
||||
case "$arg" in
|
||||
a) attemptCount="$OPTARG" ;;
|
||||
b) banLength="$OPTARG" ;;
|
||||
c) firewallChain="$OPTARG" ;;
|
||||
C) firewallHookChains="$OPTARG" ;;
|
||||
f) logFacility="$OPTARG" ;;
|
||||
j) firewallTarget="$OPTARG" ;;
|
||||
l) logLevel="$OPTARG" ;;
|
||||
m) logMode="$OPTARG" ;;
|
||||
p) attemptPeriod="$OPTARG" ;;
|
||||
P) persistentStateWritePeriod="$OPTARG" ;;
|
||||
s) fileStatePersistPrefix="$OPTARG" ;;
|
||||
s) fileStatePersistPrefix="$OPTARG" ;;
|
||||
*) printUsage
|
||||
exit 254
|
||||
esac
|
||||
shift `expr $OPTIND - 1`
|
||||
done
|
||||
[ -z $logMode ] && logMode="$defaultMode"
|
||||
|
||||
fileStateTemp="$fileStateTempPrefix.$fileStateType"
|
||||
fileStatePersist="$fileStatePersistPrefix.$fileStateType"
|
||||
|
||||
attemptPeriod=`expandBindTime $attemptPeriod`
|
||||
banLength=`expandBindTime $banLength`
|
||||
[ $persistentStateWritePeriod != -1 ] && persistentStateWritePeriod=`expandBindTime $persistentStateWritePeriod`
|
||||
followModeCheckInterval=`expandBindTime $followModeCheckInterval`
|
||||
exitStatus=0
|
||||
|
||||
# Here we convert the logRegex list into a sed -f file
|
||||
fileRegex="/tmp/beardropper.$$.regex"
|
||||
uciLoad logRegex 's/[`$"'\\\'']//g' '/has invalid shell, rejected$/d' \
|
||||
'/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\[.+([0-9]+\.){3}[0-9]+/p' \
|
||||
'/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\[.+:\ Exit before auth:.*/p' > "$fileRegex"
|
||||
lastPersistentStateWrite="`date +%s`"
|
||||
loadState
|
||||
bddbCheckStatusAll
|
||||
|
||||
# main event loops
|
||||
|
||||
if [ "$logMode" = follow ] ; then
|
||||
logLine 1 "Running in follow mode"
|
||||
readsSinceSave=0 lastCheckAll=0 worstCaseReads=1 tmpFile="/tmp/beardropper.$$.1"
|
||||
# Verify if these do any good - try saving to a temp. Scope may make saveState useless.
|
||||
trap "rm -f "$tmpFile" "$fileRegex" ; exit " SIGINT
|
||||
[ $persistentStateWritePeriod -gt 1 ] && worstCaseReads=$((persistentStateWritePeriod / followModeCheckInterval))
|
||||
firstRun=1
|
||||
$cmdLogread -f | while read -t $followModeCheckInterval line || true ; do
|
||||
if [ $firstRun -eq 1 ] ; then
|
||||
trap "saveState -f" SIGHUP
|
||||
trap "saveState -f; exit" SIGINT
|
||||
firstRun=0
|
||||
fi
|
||||
sed -nEf "$fileRegex" > "$tmpFile" <<-_EOF_
|
||||
$line
|
||||
_EOF_
|
||||
line="`cat $tmpFile`"
|
||||
[ -n "$line" ] && processLogLine "$line"
|
||||
logLine 3 "ReadComp:$readsSinceSave/$worstCaseReads"
|
||||
if [ $((++readsSinceSave)) -ge $worstCaseReads ] ; then
|
||||
now="`date +%s`"
|
||||
if [ $((now - lastCheckAll)) -ge $followModeCheckInterval ] ; then
|
||||
bddbCheckStatusAll
|
||||
lastCheckAll="$now"
|
||||
saveState
|
||||
readsSinceSave=0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
elif [ "$logMode" = entire ] ; then
|
||||
logLine 1 "Running in entire mode"
|
||||
$cmdLogread | sed -nEf "$fileRegex" | while read line ; do
|
||||
processLogLine "$line"
|
||||
saveState
|
||||
done
|
||||
loadState
|
||||
bddbCheckStatusAll
|
||||
saveState -f
|
||||
elif [ "$logMode" = today ] ; then
|
||||
logLine 1 "Running in today mode"
|
||||
# merge the egrep into sed with -e /^$formatTodayLogDateRegex/!d
|
||||
$cmdLogread | egrep "`date +\'$formatTodayLogDateRegex\'`" | sed -nEf "$fileRegex" | while read line ; do
|
||||
processLogLine "$line"
|
||||
saveState
|
||||
done
|
||||
loadState
|
||||
bddbCheckStatusAll
|
||||
saveState -f
|
||||
elif isValidBindTime "$logMode" ; then
|
||||
logInterval=`expandBindTime $logMode`
|
||||
logLine 1 "Running in interval mode (reviewing $logInterval seconds of log entries)..."
|
||||
timeStart=$((`date +%s` - logInterval))
|
||||
$cmdLogread | sed -nEf "$fileRegex" | while read line ; do
|
||||
timeWhen=`getLogTime "$line"`
|
||||
[ $timeWhen -ge $timeStart ] && processLogLine "$line"
|
||||
saveState
|
||||
done
|
||||
loadState
|
||||
bddbCheckStatusAll
|
||||
saveState -f
|
||||
elif [ "$logMode" = wipe ] ; then
|
||||
logLine 2 "Wiping state files, unhooking and removing iptables chains"
|
||||
wipeFirewall
|
||||
if [ -f "$fileStateTemp" ] ; then
|
||||
logLine 1 "Removing non-persistent statefile ($fileStateTemp)"
|
||||
rm -f "$fileStateTemp"
|
||||
fi
|
||||
if [ -f "$fileStatePersist" ] ; then
|
||||
logLine 1 "Removing persistent statefile ($fileStatePersist)"
|
||||
rm -f "$fileStatePersist"
|
||||
fi
|
||||
else
|
||||
logLine 0 "Error: invalid log mode ($logMode)"
|
||||
exitStatus=254
|
||||
fi
|
||||
|
||||
rm -f "$fileRegex"
|
||||
exit $exitStatus
|
||||
@ -1,26 +0,0 @@
|
||||
#
|
||||
# Copyright (C) 2017 Ian Li <OpenSource@ianli.xyz>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v3.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=LuCI Support for ChinaDNS
|
||||
LUCI_DESCRIPTION:=LuCI Support for ChinaDNS.
|
||||
LUCI_DEPENDS:=+ChinaDNS +curl
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_NAME:=luci-app-chinadns
|
||||
PKG_VERSION:=2.0.1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_LICENSE:=GPLv3
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
PKG_MAINTAINER:=Ian Li <OpenSource@ianli.xyz>
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
-- Copyright (C) 2016 OpenWrt-dist
|
||||
-- Copyright (C) 2016 Jian Chang <aa65535@live.com>
|
||||
-- Licensed to the public under the GNU General Public License v3.
|
||||
|
||||
module("luci.controller.chinadns", package.seeall)
|
||||
|
||||
function index()
|
||||
if not nixio.fs.access("/etc/config/chinadns") then
|
||||
return
|
||||
end
|
||||
|
||||
entry({"admin", "services", "chinadns"}, cbi("chinadns"), _("ChinaDNS"), 70).dependent = true
|
||||
entry({"admin", "services", "chinadns", "status"},call("act_status")).leaf=true
|
||||
end
|
||||
|
||||
function act_status()
|
||||
local e={}
|
||||
e.running=luci.sys.call("ps | grep /usr/sbin/chinadns | grep -v grep >/dev/null")==0
|
||||
luci.http.prepare_content("application/json")
|
||||
luci.http.write_json(e)
|
||||
end
|
||||
@ -1,48 +0,0 @@
|
||||
-- Copyright (C) 2016 OpenWrt-dist
|
||||
-- Copyright (C) 2016 Jian Chang <aa65535@live.com>
|
||||
-- Copyright (C) 2017 Ian Li <OpenSource@ianli.xyz>
|
||||
-- Licensed to the public under the GNU General Public License v3.
|
||||
|
||||
m = Map("chinadns", translate("ChinaDNS"))
|
||||
m:section(SimpleSection).template = "chinadns/chinadns_status"
|
||||
|
||||
s = m:section(TypedSection, "chinadns", translate("General Setting"))
|
||||
s.anonymous = true
|
||||
|
||||
o = s:option(Flag, "enable", translate("Enable"))
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Flag, "yn_use_proxy",
|
||||
translate("Used a proxy or not"),
|
||||
translate("If you used a proxy like shadowsocks, please tick this option."))
|
||||
o.rmenpty = false
|
||||
|
||||
o = s:option(Value, "port", translate("Local Port"))
|
||||
o.placeholder = 5353
|
||||
o.default = 5353
|
||||
o.datatype = "port"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, "chnroute", translate("CHNRoute File"))
|
||||
o.placeholder = "/etc/chinadns_chnroute.txt"
|
||||
o.default = "/etc/chinadns_chnroute.txt"
|
||||
o.datatype = "file"
|
||||
o.rmempty = false
|
||||
|
||||
o = s:option(Value, "foreign_subnet",
|
||||
translate("Foreign Subnet"),
|
||||
translate("Just foreign subnet. The local subnet will be automatically obtained."))
|
||||
o.placeholder = "45.76.96.0"
|
||||
o.default = "45.76.96.0"
|
||||
o.datatype = "ipaddr"
|
||||
o:depends("yn_use_proxy", 0)
|
||||
|
||||
o = s:option(Value, "server",
|
||||
translate("Upstream Server"),
|
||||
translate("A DNS server with edns-client-subnet support required, fill one only!"))
|
||||
o.placeholder = "8.8.8.8"
|
||||
o.default = "8.8.8.8"
|
||||
o.datatype = "ipaddr"
|
||||
o.rmempty = false
|
||||
|
||||
return m
|
||||
@ -1,22 +0,0 @@
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
XHR.poll(3, '<%=url([[admin]], [[services]], [[chinadns]], [[status]])%>', null,
|
||||
function(x, data) {
|
||||
var tb = document.getElementById('chinadns_status');
|
||||
if (data && tb) {
|
||||
if (data.running) {
|
||||
var links = '<em><b><font color=green>ChinaDNS <%:RUNNING%></font></b></em>';
|
||||
tb.innerHTML = links;
|
||||
} else {
|
||||
tb.innerHTML = '<em><b><font color=red>ChinaDNS <%:NOT RUNNING%></font></b></em>';
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
//]]>
|
||||
</script>
|
||||
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
|
||||
<fieldset class="cbi-section">
|
||||
<p id="chinadns_status">
|
||||
<em><%:Collecting data...%></em>
|
||||
</p>
|
||||
</fieldset>
|
||||
@ -1,41 +0,0 @@
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
|
||||
|
||||
msgid "ChinaDNS"
|
||||
msgstr "ChinaDNS"
|
||||
|
||||
msgid "CHNRoute File"
|
||||
msgstr "国内路由表"
|
||||
|
||||
msgid "Enable"
|
||||
msgstr "启用"
|
||||
|
||||
msgid "Used a proxy or not"
|
||||
msgstr "是否使用了代理服务器"
|
||||
|
||||
msgid "If you used a proxy like shadowsocks, please tick this option."
|
||||
msgstr "如果您使用了类似SS的代理程序,请勾选此选项"
|
||||
|
||||
msgid "Foreign Subnet"
|
||||
msgstr "外网子网"
|
||||
|
||||
msgid "Just foreign subnet. The local subnet will be automatically obtained."
|
||||
msgstr "仅填写外网子网地址即可,本地子网地址会自动获取。"
|
||||
|
||||
msgid "General Setting"
|
||||
msgstr "基本设置"
|
||||
|
||||
msgid "Local Port"
|
||||
msgstr "本地端口"
|
||||
|
||||
msgid "NOT RUNNING"
|
||||
msgstr "未运行"
|
||||
|
||||
msgid "RUNNING"
|
||||
msgstr "运行中"
|
||||
|
||||
msgid "Upstream Server"
|
||||
msgstr "上游服务器"
|
||||
|
||||
msgid "A DNS server with edns-client-subnet support required, fill one only!"
|
||||
msgstr "需要具有edns-client-subnet支持的DNS服务器,仅限填写一个!"
|
||||
@ -1,7 +0,0 @@
|
||||
config chinadns
|
||||
option chnroute '/etc/chinadns_chnroute.txt'
|
||||
option enable '0'
|
||||
option yn_use_proxy '0'
|
||||
option port '5300'
|
||||
option server '8.8.8.8'
|
||||
option foreign_subnet '45.76.96.0'
|
||||
@ -1,25 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=99
|
||||
STOP=10
|
||||
|
||||
chnroute="$(uci get chinadns.@chinadns[0].chnroute)"
|
||||
enable="$(uci get chinadns.@chinadns[0].enable)"
|
||||
port="$(uci get chinadns.@chinadns[0].port)"
|
||||
server="$(uci get chinadns.@chinadns[0].server)"
|
||||
yn_use_proxy="$(uci get chinadns.@chinadns[0].yn_use_proxy)"
|
||||
|
||||
local_subnet="$(curl -4 -s members.3322.org/dyndns/getip | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.')0"
|
||||
[ "${yn_use_proxy}" -eq "1" ] && foreign_subnet="$(curl -4 -s ip.sb | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.')0)" || foreign_subnet="$(uci get chinadns.@chinadns[0].foreign_subnet)"
|
||||
|
||||
start()
|
||||
{
|
||||
stop
|
||||
[ "${enable}" -eq "0" ] && exit 0
|
||||
/usr/sbin/chinadns -p "${port}" -s "${server}" -c "${chnroute}" -e "${local_subnet},${foreign_subnet}" >/dev/null 2>&1 &
|
||||
}
|
||||
|
||||
stop()
|
||||
{
|
||||
kill -9 "$(ps | grep "/usr/sbin/chinadns" | grep -v grep | awk '{print $1}')" >/dev/null 2>&1
|
||||
}
|
||||
@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@chinands[-1]
|
||||
add ucitrack chinadns
|
||||
set ucitrack.@chinadns[-1].init=chinadns
|
||||
commit ucitrack
|
||||
EOF
|
||||
exit 0
|
||||
@ -1,15 +0,0 @@
|
||||
#
|
||||
#-- Copyright (C) 2018 dz <dingzhong110@gmail.com>
|
||||
#
|
||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_TITLE:=LuCI Support for cupsd
|
||||
LUCI_DEPENDS:= +cups
|
||||
PKG_VERSION:=1.2
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
# call BuildPackage - OpenWrt buildroot signature
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user