--- 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 @@ + +
+
+
+
+ 获取中... +
+
+
+ + + + +
+
+
+
+
+ + --- a/luci-app-passwall/root/usr/share/passwall/0_default_config +++ b/luci-app-passwall/root/usr/share/passwall/0_default_config @@ -31,7 +31,7 @@ config global_haproxy config global_delay option start_daemon '1' - option start_delay '60' + option start_delay '30' config global_forwarding option tcp_no_redir_ports 'disable' --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -1037,6 +1037,14 @@ stop_crontab() { #echolog "清除定时执行命令。" } +start_adblock() { + [ "$(config_t_get global adblock 0)" != "1" ] && { + [ -s $RULES_PATH/my_block_host ] && ln -sf $RULES_PATH/my_block_host $RULES_PATH/block_host || > $RULES_PATH/block_host + return + } + "$APP_PATH/adblock.sh" > /dev/null 2>&1 & +} + start_dns() { echolog "DNS域名解析:" @@ -1636,6 +1644,7 @@ start() { export ENABLE_DEPRECATED_GEOIP=true export SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN=1 ulimit -n 65535 + start_adblock start_haproxy start_socks nftflag=0 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua @@ -152,7 +152,7 @@ o.validate = function(self, value) end ---- Block Hosts -local block_host = path .. "block_host" +local block_host = path .. "my_block_host" o = s:taboption("block_list", TextValue, "block_host", "", "" .. translate("These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.") .. "") o.rows = 15 o.wrap = "off" --- a/luci-app-passwall/po/zh-cn/passwall.po +++ b/luci-app-passwall/po/zh-cn/passwall.po @@ -1,6 +1,48 @@ msgid "Pass Wall" msgstr "PassWall" +msgid "Enable adblock" +msgstr "启用广告屏蔽" + +msgid "Records" +msgstr "条记录" + +msgid "Refresh..." +msgstr "正在更新,请稍候.." + +msgid "No new data!" +msgstr "已经是最新数据,无需更新" + +msgid "Refresh Error!" +msgstr "更新失败!" + +msgid "Refresh OK!" +msgstr "更新成功~" + +msgid "Total Records:" +msgstr "新的总规则数:" + +msgid "Refresh Data" +msgstr "更新订阅规则" + +msgid "Last Update Checked" +msgstr "上一次规则更新时间" + +msgid "Subscribe Rules Data" +msgstr "去广告规则" + +msgid "Support Domain / Dnsmasq / AdGuardHome / Hosts format list" +msgstr "支持 域名/Dnsmasq/AdGuardHome/Hosts 格式的过滤列表" + +msgid "Adblock Rules Subscribe" +msgstr "广告过滤列表URL" + +msgid "Adblock white list" +msgstr "广告过滤白名单" + +msgid "Invalid domain name" +msgstr "无效域名" + msgid "Auto" msgstr "自动"