--- a/luci-app-passwall/root/etc/init.d/passwall
+++ b/luci-app-passwall/root/etc/init.d/passwall
@@ -3,10 +3,11 @@
START=99
STOP=15
-ROOT="${IPKG_INSTROOT:-}"
-. "$ROOT/usr/share/passwall/utils.sh"
-APP_FILE=${APP_PATH}/app.sh
-LOCK_FILE=${LOCK_PATH}/${CONFIG}.lock
+if [ -z "$IPKG_INSTROOT" ] && [ -f /usr/share/passwall/utils.sh ]; then
+ . /usr/share/passwall/utils.sh
+ APP_FILE=${APP_PATH}/app.sh
+ LOCK_FILE=${LOCK_PATH}/${CONFIG}.lock
+fi
set_lock() {
mkdir -p "$LOCK_PATH" || return 1
--- a/luci-app-passwall/Makefile
+++ b/luci-app-passwall/Makefile
@@ -35,7 +35,25 @@ LUCI_PKGARCH:=all
LUCI_DEPENDS:=+coreutils +coreutils-base64 +coreutils-nohup +coreutils-timeout +curl \
+chinadns-ng +dns2socks +dnsmasq-full +ip-full \
+libuci-lua +lua +luci-compat +luci-lib-jsonc \
- +microsocks +resolveip +tcping +lyaml
+ +microsocks +resolveip +tcping +lyaml \
+ +ipt2socks \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Geoview:geoview \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy:haproxy \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria:hysteria \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client:shadowsocks-rust-sslocal \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server:shadowsocks-rust-ssserver \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-local \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-redir \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server:shadowsocksr-libev-ssr-server \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs:simple-obfs-client \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_SingBox:sing-box \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Geodata:v2ray-geoip \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Geodata:v2ray-geosite \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin:v2ray-plugin \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:unzip \
+ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray_Plugin:xray-plugin
define Package/$(PKG_NAME)/config
menu "Configuration"
@@ -66,12 +84,11 @@ config PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy
config PACKAGE_$(PKG_NAME)_INCLUDE_Geoview
bool "Include Geoview"
select PACKAGE_geoview
- default y if aarch64||arm||i386||x86_64
+ default y if aarch64||i386||x86_64
config PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy
bool "Include Haproxy"
- select PACKAGE_haproxy
- default y if aarch64||arm||i386||x86_64
+ default y if aarch64||i386||x86_64
config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria
bool "Include Hysteria"
@@ -87,8 +104,7 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy
config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client
bool "Include Shadowsocks Rust Client"
depends on !i386
- select PACKAGE_shadowsocks-rust-sslocal
- default y if aarch64||x86_64
+ default y if x86_64
config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server
bool "Include Shadowsocks Rust Server"
@@ -98,8 +114,6 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server
config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client
bool "Include ShadowsocksR Libev Client"
- select PACKAGE_shadowsocksr-libev-ssr-local
- select PACKAGE_shadowsocksr-libev-ssr-redir
default y
config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server
@@ -115,13 +129,12 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS
config PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs
bool "Include Simple-Obfs (Shadowsocks Plugin)"
- select PACKAGE_simple-obfs-client
default y
config PACKAGE_$(PKG_NAME)_INCLUDE_SingBox
bool "Include Sing-Box"
select PACKAGE_sing-box
- default y if aarch64||arm||i386||x86_64
+ default y
config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Geodata
bool "Include V2ray_Geodata"
@@ -131,14 +144,11 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Geodata
config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin
bool "Include V2ray-Plugin (Shadowsocks Plugin)"
- select PACKAGE_v2ray-plugin
- default y if aarch64||arm||i386||x86_64
+ default y if i386||x86_64
config PACKAGE_$(PKG_NAME)_INCLUDE_Xray
bool "Include Xray"
- select PACKAGE_xray-core
- select PACKAGE_unzip
- default y if aarch64||arm||i386||x86_64
+ default n
config PACKAGE_$(PKG_NAME)_INCLUDE_Xray_Plugin
bool "Include Xray-Plugin (Shadowsocks Plugin)"
--- a/luci-app-passwall/luasrc/controller/passwall.lua
+++ b/luci-app-passwall/luasrc/controller/passwall.lua
@@ -26,6 +26,8 @@ function index()
entry({"admin", "services", appname}).dependent = true
entry({"admin", "services", appname, "show"}, call("show_menu")).leaf = true
entry({"admin", "services", appname, "hide"}, call("hide_menu")).leaf = true
+ entry({"admin", "services", appname, "ip"}, call('check_ip')).leaf = true
+ entry({"admin", "services", appname, "adblock_refresh"}, call('adblock_refresh')).leaf = true
local e
if api.uci_get_c("@global[0]", "hide_from_luci") ~= "1" then
e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), _("Pass Wall"), -1)
@@ -211,6 +213,81 @@ function clear_log()
luci.sys.call("echo '' > /tmp/log/passwall.log")
end
+function adblock_refresh()
+ local icount = 0
+
+ local status = luci.sys.call("/usr/share/passwall/adblock.sh >/dev/null 2>&1")
+ if status == 0 then
+ icount = tonumber(luci.sys.exec("wc -l < /usr/share/passwall/rules/block_host"))
+ if icount>0 then
+ retstring = tostring(math.ceil(icount))
+ else
+ retstring = "-1"
+ end
+ elseif status == 2 then
+ retstring = "0"
+ else
+ retstring = "-1"
+ end
+ luci.http.prepare_content("application/json")
+ luci.http.write_json({ret=retstring})
+end
+
+function check_site(host, port)
+ local nixio = require "nixio"
+ local socket = nixio.socket("inet", "stream")
+ socket:setopt("socket", "rcvtimeo", 2)
+ socket:setopt("socket", "sndtimeo", 2)
+ local ret = socket:connect(host, port)
+ socket:close()
+ return ret
+end
+
+function get_ip_geo_info()
+ local result = luci.sys.exec('curl --retry 3 -m 10 -LfsA "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36" http://ip-api.com/json/')
+ local json = require "luci.jsonc"
+ local info = json.parse(result)
+
+ return {
+ flag = string.lower(info.countryCode) or "un",
+ country = get_country_name(info.countryCode) or "Unknown",
+ ip = info.query,
+ isp = info.isp
+ }
+end
+
+function get_country_name(countryCode)
+ local country_names = {
+ US = "美国", CN = "中国", JP = "日本", GB = "英国", DE = "德国",
+ FR = "法国", BR = "巴西", IT = "意大利", RU = "俄罗斯", CA = "加拿大",
+ KR = "韩国", ES = "西班牙", AU = "澳大利亚", MX = "墨西哥", ID = "印度尼西亚",
+ NL = "荷兰", TR = "土耳其", CH = "瑞士", SA = "沙特阿拉伯", SE = "瑞典",
+ PL = "波兰", BE = "比利时", AR = "阿根廷", NO = "挪威", AT = "奥地利",
+ TW = "台湾", ZA = "南非", TH = "泰国", DK = "丹麦", MY = "马来西亚",
+ PH = "菲律宾", SG = "新加坡", IE = "爱尔兰", HK = "香港", FI = "芬兰",
+ CL = "智利", PT = "葡萄牙", GR = "希腊", IL = "以色列", NZ = "新西兰",
+ CZ = "捷克", RO = "罗马尼亚", VN = "越南", UA = "乌克兰", HU = "匈牙利",
+ AE = "阿联酋", CO = "哥伦比亚", IN = "印度", EG = "埃及", PE = "秘鲁", TW = "台湾"
+ }
+ return country_names[countryCode]
+end
+
+function check_ip()
+ local e = {}
+ local port = 80
+ local geo_info = get_ip_geo_info(ip)
+ e.ip = geo_info.ip
+ e.flag = geo_info.flag
+ e.country = geo_info.country
+ e.isp = geo_info.isp
+ e.baidu = check_site('www.baidu.com', port)
+ e.taobao = check_site('www.taobao.com', port)
+ e.google = check_site('www.google.com', port)
+ e.youtube = check_site('www.youtube.com', port)
+ luci.http.prepare_content('application/json')
+ luci.http.write_json(e)
+end
+
function index_status()
local e = {}
e.dns_mode_status = luci.sys.call("netstat -apn | grep ':15353 ' >/dev/null") == 0
--- a/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua
+++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua
@@ -547,6 +547,46 @@ function o.cfgvalue(self, section)
api.url("flush_set") .. "?redirect=1&reload=1", set_title)
end
+o = s:taboption("DNS", Flag, "adblock", translate("Enable adblock"))
+o.rmempty = false
+
+local UD="" rule_count="0"
+if nixio.fs.access("/usr/share/passwall/rules/block_host") then
+UD = os.date("%Y-%m-%d %H:%M", nixio.fs.stat("/usr/share/passwall/rules/block_host").ctime)
+rule_count = tonumber(luci.sys.exec("wc -l < /usr/share/passwall/rules/block_host"))
+end
+o = s:taboption("DNS", DummyValue, "refresh_data", translate("Subscribe Rules Data"))
+o.rawhtml = true
+o.template = m:template_path("/global/adblock_refresh")
+o.value = rule_count.." "..translate("Records")
+o.description = string.format(""..translate("Last Update Checked")..": %s
",UD)
+o:depends("adblock",1)
+
+o = s:taboption("DNS", DynamicList, "ad_url", translate("Adblock Rules Subscribe"))
+o:value("https://cdn.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblockdomainlite.txt", translate("AdBlock DNS Filters"))
+o:value("https://cdn.jsdelivr.net/gh/privacy-protection-tools/anti-AD@master/anti-ad-domains.txt", translate("anti-AD"))
+o.default = "https://cdn.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblockdomainlite.txt"
+o.description = translate("Support Domain / Dnsmasq / AdGuardHome / Hosts format list")
+o.rmempty = false
+o:depends("adblock",1)
+
+o = s:taboption("DNS", DynamicList, "white_list", translate("Adblock white list"))
+o.rmempty = false
+o:depends("adblock",1)
+function o.validate(self, value)
+ local vlist = (type(value) == "table") and value or { value }
+
+ for _, v in ipairs(vlist) do
+ if v and v ~= "" and not (
+ #v < 254 and v:match("^[a-zA-Z0-9][a-zA-Z0-9%-%.]*[a-zA-Z0-9]$") and v:match("%.")
+ ) then
+ return nil, translate("Invalid domain name") .. ": " .. v
+ end
+ end
+
+ return value
+end
+
s:tab("Proxy", translate("Mode"))
o = s:taboption("Proxy", Flag, "use_direct_list", translatef("Use %s", translate("Direct List")))
@@ -825,7 +825,7 @@ for k, v in pairs(nodes_table) do
end
m:appendTemplate("/global/footer")
-
+m:appendTemplate("/global/status_bottom")
m:appendTemplate("/cbi/sortable", {sectiontype = s2.sectiontype})
return api.return_map(m)
new file mode 100644
index 000000000000..a00fff9c79b3
--- /dev/null
+++ b/luci-app-passwall/luasrc/view/passwall/global/status_bottom.htm
@@ -0,0 +1,125 @@
+
+