diff --git a/luci-app-passwall/luasrc/controller/passwall.lua.orig b/luci-app-passwall/luasrc/controller/passwall.lua.orig deleted file mode 100644 index bfb8f7961..000000000 --- a/luci-app-passwall/luasrc/controller/passwall.lua.orig +++ /dev/null @@ -1,445 +0,0 @@ --- Copyright (C) 2018-2020 L-WRT Team --- Copyright (C) 2021-2023 xiaorouji - -module("luci.controller.passwall", package.seeall) -local api = require "luci.passwall.api" -local appname = "passwall" -local ucic = luci.model.uci.cursor() -local http = require "luci.http" -local util = require "luci.util" -local i18n = require "luci.i18n" - -function index() - appname = "passwall" - entry({"admin", "services", appname}).dependent = true - entry({"admin", "services", appname, "reset_config"}, call("reset_config")).leaf = true - entry({"admin", "services", appname, "show"}, call("show_menu")).leaf = true - entry({"admin", "services", appname, "hide"}, call("hide_menu")).leaf = true - if not nixio.fs.access("/etc/config/passwall") then return end - if nixio.fs.access("/etc/config/passwall_show") then - e = entry({"admin", "services", appname}, alias("admin", "services", appname, "settings"), _("Pass Wall"), -1) - e.dependent = true - e.acl_depends = { "luci-app-passwall" } - end - --[[ Client ]] - entry({"admin", "services", appname, "settings"}, cbi(appname .. "/client/global"), _("Basic Settings"), 1).dependent = true - entry({"admin", "services", appname, "node_list"}, cbi(appname .. "/client/node_list"), _("Node List"), 2).dependent = true - entry({"admin", "services", appname, "node_subscribe"}, cbi(appname .. "/client/node_subscribe"), _("Node Subscribe"), 3).dependent = true - entry({"admin", "services", appname, "other"}, cbi(appname .. "/client/other", {autoapply = true}), _("Other Settings"), 92).leaf = true - if nixio.fs.access("/usr/sbin/haproxy") then - entry({"admin", "services", appname, "haproxy"}, cbi(appname .. "/client/haproxy"), _("Load Balancing"), 93).leaf = true - end - entry({"admin", "services", appname, "app_update"}, cbi(appname .. "/client/app_update"), _("App Update"), 95).leaf = true - entry({"admin", "services", appname, "rule"}, cbi(appname .. "/client/rule"), _("Rule Manage"), 96).leaf = true - entry({"admin", "services", appname, "rule_list"}, cbi(appname .. "/client/rule_list"), _("Rule List"), 97).leaf = true - entry({"admin", "services", appname, "node_subscribe_config"}, cbi(appname .. "/client/node_subscribe_config")).leaf = true - entry({"admin", "services", appname, "node_config"}, cbi(appname .. "/client/node_config")).leaf = true - entry({"admin", "services", appname, "shunt_rules"}, cbi(appname .. "/client/shunt_rules")).leaf = true - entry({"admin", "services", appname, "socks_config"}, cbi(appname .. "/client/socks_config")).leaf = true - entry({"admin", "services", appname, "acl"}, cbi(appname .. "/client/acl"), _("Access control"), 98).leaf = true - entry({"admin", "services", appname, "acl_config"}, cbi(appname .. "/client/acl_config")).leaf = true - entry({"admin", "services", appname, "log"}, form(appname .. "/client/log"), _("Watch Logs"), 999).leaf = true - - --[[ Server ]] - entry({"admin", "services", appname, "server"}, cbi(appname .. "/server/index"), _("Server-Side"), 99).leaf = true - entry({"admin", "services", appname, "server_user"}, cbi(appname .. "/server/user")).leaf = true - - --[[ API ]] - entry({"admin", "services", appname, "server_user_status"}, call("server_user_status")).leaf = true - entry({"admin", "services", appname, "server_user_log"}, call("server_user_log")).leaf = true - entry({"admin", "services", appname, "server_get_log"}, call("server_get_log")).leaf = true - entry({"admin", "services", appname, "server_clear_log"}, call("server_clear_log")).leaf = true - entry({"admin", "services", appname, "link_add_node"}, call("link_add_node")).leaf = true - entry({"admin", "services", appname, "socks_autoswitch_add_node"}, call("socks_autoswitch_add_node")).leaf = true - entry({"admin", "services", appname, "socks_autoswitch_remove_node"}, call("socks_autoswitch_remove_node")).leaf = true - entry({"admin", "services", appname, "get_now_use_node"}, call("get_now_use_node")).leaf = true - entry({"admin", "services", appname, "get_redir_log"}, call("get_redir_log")).leaf = true - entry({"admin", "services", appname, "get_socks_log"}, call("get_socks_log")).leaf = true - entry({"admin", "services", appname, "get_log"}, call("get_log")).leaf = true - entry({"admin", "services", appname, "clear_log"}, call("clear_log")).leaf = true - entry({"admin", "services", appname, "index_status"}, call("index_status")).leaf = true - entry({"admin", "services", appname, "haproxy_status"}, call("haproxy_status")).leaf = true - entry({"admin", "services", appname, "socks_status"}, call("socks_status")).leaf = true - entry({"admin", "services", appname, "connect_status"}, call("connect_status")).leaf = true - entry({"admin", "services", appname, "ping_node"}, call("ping_node")).leaf = true - entry({"admin", "services", appname, "urltest_node"}, call("urltest_node")).leaf = true - entry({"admin", "services", appname, "set_node"}, call("set_node")).leaf = true - entry({"admin", "services", appname, "copy_node"}, call("copy_node")).leaf = true - entry({"admin", "services", appname, "clear_all_nodes"}, call("clear_all_nodes")).leaf = true - entry({"admin", "services", appname, "delete_select_nodes"}, call("delete_select_nodes")).leaf = true - entry({"admin", "services", appname, "update_rules"}, call("update_rules")).leaf = true - - --[[Components update]] - entry({"admin", "services", appname, "check_passwall"}, call("app_check")).leaf = true - local coms = require "luci.passwall.com" - local com - for com, _ in pairs(coms) do - entry({"admin", "services", appname, "check_" .. com}, call("com_check", com)).leaf = true - entry({"admin", "services", appname, "update_" .. com}, call("com_update", com)).leaf = true - end -end - -local function http_write_json(content) - http.prepare_content("application/json") - http.write_json(content or {code = 1}) -end - -function reset_config() - luci.sys.call('/etc/init.d/passwall stop') - luci.sys.call('[ -f "/usr/share/passwall/0_default_config" ] && cp -f /usr/share/passwall/0_default_config /etc/config/passwall') - luci.http.redirect(api.url()) -end - -function show_menu() - luci.sys.call("touch /etc/config/passwall_show") - luci.sys.call("rm -rf /tmp/luci-*") - luci.sys.call("/etc/init.d/rpcd restart >/dev/null") - luci.http.redirect(api.url()) -end - -function hide_menu() - luci.sys.call("rm -rf /etc/config/passwall_show") - luci.sys.call("rm -rf /tmp/luci-*") - luci.sys.call("/etc/init.d/rpcd restart >/dev/null") - luci.http.redirect(luci.dispatcher.build_url("admin", "status", "overview")) -end - -function link_add_node() - local lfile = "/tmp/links.conf" - local link = luci.http.formvalue("link") - luci.sys.call('echo \'' .. link .. '\' > ' .. lfile) - luci.sys.call("lua /usr/share/passwall/subscribe.lua add log") -end - -function socks_autoswitch_add_node() - local id = luci.http.formvalue("id") - local key = luci.http.formvalue("key") - if id and id ~= "" and key and key ~= "" then - local new_list = ucic:get(appname, id, "autoswitch_backup_node") or {} - for i = #new_list, 1, -1 do - if (ucic:get(appname, new_list[i], "remarks") or ""):find(key) then - table.remove(new_list, i) - end - end - for k, e in ipairs(api.get_valid_nodes()) do - if e.node_type == "normal" and e["remark"]:find(key) then - table.insert(new_list, e.id) - end - end - ucic:set_list(appname, id, "autoswitch_backup_node", new_list) - ucic:commit(appname) - end - luci.http.redirect(api.url("socks_config", id)) -end - -function socks_autoswitch_remove_node() - local id = luci.http.formvalue("id") - local key = luci.http.formvalue("key") - if id and id ~= "" and key and key ~= "" then - local new_list = ucic:get(appname, id, "autoswitch_backup_node") or {} - for i = #new_list, 1, -1 do - if (ucic:get(appname, new_list[i], "remarks") or ""):find(key) then - table.remove(new_list, i) - end - end - ucic:set_list(appname, id, "autoswitch_backup_node", new_list) - ucic:commit(appname) - end - luci.http.redirect(api.url("socks_config", id)) -end - -function get_now_use_node() - local path = "/tmp/etc/passwall/acl/default" - local e = {} - local data, code, msg = nixio.fs.readfile(path .. "/TCP.id") - if data then - e["TCP"] = util.trim(data) - end - local data, code, msg = nixio.fs.readfile(path .. "/UDP.id") - if data then - e["UDP"] = util.trim(data) - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function get_redir_log() - local name = luci.http.formvalue("name") - local proto = luci.http.formvalue("proto") - local path = "/tmp/etc/passwall/acl/" .. name - proto = proto:upper() - if proto == "UDP" and (ucic:get(appname, "@global[0]", "udp_node") or "nil") == "tcp" and not nixio.fs.access(path .. "/" .. proto .. ".log") then - proto = "TCP" - end - if nixio.fs.access(path .. "/" .. proto .. ".log") then - local content = luci.sys.exec("cat ".. path .. "/" .. proto .. ".log") - content = content:gsub("\n", "
") - luci.http.write(content) - else - luci.http.write(string.format("", i18n.translate("Not enabled log"))) - end -end - -function get_socks_log() - local name = luci.http.formvalue("name") - local path = "/tmp/etc/passwall/SOCKS_" .. name .. ".log" - if nixio.fs.access(path) then - local content = luci.sys.exec("cat ".. path) - content = content:gsub("\n", "
") - luci.http.write(content) - else - luci.http.write(string.format("", i18n.translate("Not enabled log"))) - end -end - -function get_log() - -- luci.sys.exec("[ -f /tmp/log/passwall.log ] && sed '1!G;h;$!d' /tmp/log/passwall.log > /tmp/log/passwall_show.log") - luci.http.write(luci.sys.exec("[ -f '/tmp/log/passwall.log' ] && cat /tmp/log/passwall.log")) -end - -function clear_log() - luci.sys.call("echo '' > /tmp/log/passwall.log") -end - -function index_status() - local e = {} - e.dns_mode_status = luci.sys.call("netstat -apn | grep ':15353 ' >/dev/null") == 0 - e.haproxy_status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v grep | grep '%s/bin/' | grep haproxy >/dev/null", appname)) == 0 - e["tcp_node_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep 'default' | grep 'TCP' >/dev/null") == 0 - - if (ucic:get(appname, "@global[0]", "udp_node") or "nil") == "tcp" then - e["udp_node_status"] = e["tcp_node_status"] - else - e["udp_node_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep 'default' | grep 'UDP' >/dev/null") == 0 - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function haproxy_status() - local e = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v grep | grep '%s/bin/' | grep haproxy >/dev/null", appname)) == 0 - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function socks_status() - local e = {} - local index = luci.http.formvalue("index") - local id = luci.http.formvalue("id") - e.index = index - e.socks_status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep -v '_acl_' | grep '%s' | grep 'SOCKS_' > /dev/null", id)) == 0 - local use_http = ucic:get(appname, id, "http_port") or 0 - e.use_http = 0 - if tonumber(use_http) > 0 then - e.use_http = 1 - e.http_status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep -v '_acl_' | grep '%s' | grep -E 'HTTP_|HTTP2SOCKS' > /dev/null", id)) == 0 - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function connect_status() - local e = {} - e.use_time = "" - local url = luci.http.formvalue("url") - local result = luci.sys.exec('curl --connect-timeout 3 -o /dev/null -I -sk -w "%{http_code}:%{time_appconnect}" ' .. url) - local code = tonumber(luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $1}'") or "0") - if code ~= 0 then - local use_time = luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $2}'") - if use_time:find("%.") then - e.use_time = string.format("%.2f", use_time * 1000) - else - e.use_time = string.format("%.2f", use_time / 1000) - end - e.ping_type = "curl" - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function ping_node() - local index = luci.http.formvalue("index") - local address = luci.http.formvalue("address") - local port = luci.http.formvalue("port") - local type = luci.http.formvalue("type") or "icmp" - local e = {} - e.index = index - if type == "tcping" and luci.sys.exec("echo -n $(command -v tcping)") ~= "" then - if api.is_ipv6(address) then - address = api.get_ipv6_only(address) - end - e.ping = luci.sys.exec(string.format("echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null", port, address)) - else - e.ping = luci.sys.exec("echo -n $(ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null" % address) - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function urltest_node() - local index = luci.http.formvalue("index") - local id = luci.http.formvalue("id") - local e = {} - e.index = index - local result = luci.sys.exec(string.format("/usr/share/passwall/test.sh url_test_node %s %s", id, "urltest_node")) - local code = tonumber(luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $1}'") or "0") - if code ~= 0 then - local use_time = luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $2}'") - if use_time:find("%.") then - e.use_time = string.format("%.2f", use_time * 1000) - else - e.use_time = string.format("%.2f", use_time / 1000) - end - end - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end - -function set_node() - local protocol = luci.http.formvalue("protocol") - local section = luci.http.formvalue("section") - ucic:set(appname, "@global[0]", protocol .. "_node", section) - ucic:commit(appname) - luci.sys.call("/etc/init.d/passwall restart > /dev/null 2>&1 &") - luci.http.redirect(api.url("log")) -end - -function copy_node() - local section = luci.http.formvalue("section") - local uuid = api.gen_short_uuid() - ucic:section(appname, "nodes", uuid) - for k, v in pairs(ucic:get_all(appname, section)) do - local filter = k:find("%.") - if filter and filter == 1 then - else - xpcall(function() - ucic:set(appname, uuid, k, v) - end, - function(e) - end) - end - end - ucic:delete(appname, uuid, "add_from") - ucic:set(appname, uuid, "add_mode", 1) - ucic:commit(appname) - luci.http.redirect(api.url("node_config", uuid)) -end - -function clear_all_nodes() - ucic:set(appname, '@global[0]', "enabled", "0") - ucic:set(appname, '@global[0]', "tcp_node", "nil") - ucic:set(appname, '@global[0]', "udp_node", "nil") - ucic:foreach(appname, "socks", function(t) - ucic:delete(appname, t[".name"]) - ucic:set_list(appname, t[".name"], "autoswitch_backup_node", {}) - end) - ucic:foreach(appname, "haproxy_config", function(t) - ucic:delete(appname, t[".name"]) - end) - ucic:foreach(appname, "acl_rule", function(t) - ucic:set(appname, t[".name"], "tcp_node", "default") - ucic:set(appname, t[".name"], "udp_node", "default") - end) - ucic:foreach(appname, "nodes", function(node) - ucic:delete(appname, node['.name']) - end) - - ucic:commit(appname) - luci.sys.call("/etc/init.d/" .. appname .. " stop") -end - -function delete_select_nodes() - local ids = luci.http.formvalue("ids") - string.gsub(ids, '[^' .. "," .. ']+', function(w) - if (ucic:get(appname, "@global[0]", "tcp_node") or "nil") == w then - ucic:set(appname, '@global[0]', "tcp_node", "nil") - end - if (ucic:get(appname, "@global[0]", "udp_node") or "nil") == w then - ucic:set(appname, '@global[0]', "udp_node", "nil") - end - ucic:foreach(appname, "socks", function(t) - if t["node"] == w then - ucic:delete(appname, t[".name"]) - end - local auto_switch_node_list = ucic:get(appname, t[".name"], "autoswitch_backup_node") or {} - for i = #auto_switch_node_list, 1, -1 do - if w == auto_switch_node_list[i] then - table.remove(auto_switch_node_list, i) - end - end - ucic:set_list(appname, t[".name"], "autoswitch_backup_node", auto_switch_node_list) - end) - ucic:foreach(appname, "haproxy_config", function(t) - if t["lbss"] == w then - ucic:delete(appname, t[".name"]) - end - end) - ucic:foreach(appname, "acl_rule", function(t) - if t["tcp_node"] == w then - ucic:set(appname, t[".name"], "tcp_node", "default") - end - if t["udp_node"] == w then - ucic:set(appname, t[".name"], "udp_node", "default") - end - end) - ucic:delete(appname, w) - end) - ucic:commit(appname) - luci.sys.call("/etc/init.d/" .. appname .. " restart > /dev/null 2>&1 &") -end - -function update_rules() - local update = luci.http.formvalue("update") - luci.sys.call("lua /usr/share/passwall/rule_update.lua log '" .. update .. "' > /dev/null 2>&1 &") - http_write_json() -end - -function server_user_status() - local e = {} - e.index = luci.http.formvalue("index") - e.status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/bin/' | grep -i '%s' >/dev/null", appname .. "_server", luci.http.formvalue("id"))) == 0 - http_write_json(e) -end - -function server_user_log() - local id = luci.http.formvalue("id") - if nixio.fs.access("/tmp/etc/passwall_server/" .. id .. ".log") then - local content = luci.sys.exec("cat /tmp/etc/passwall_server/" .. id .. ".log") - content = content:gsub("\n", "
") - luci.http.write(content) - else - luci.http.write(string.format("", i18n.translate("Not enabled log"))) - end -end - -function server_get_log() - luci.http.write(luci.sys.exec("[ -f '/tmp/log/passwall_server.log' ] && cat /tmp/log/passwall_server.log")) -end - -function server_clear_log() - luci.sys.call("echo '' > /tmp/log/passwall_server.log") -end - -function app_check() - local json = api.to_check_self() - http_write_json(json) -end - -function com_check(comname) - local json = api.to_check("",comname) - http_write_json(json) -end - -function com_update(comname) - local json = nil - local task = http.formvalue("task") - if task == "extract" then - json = api.to_extract(comname, http.formvalue("file"), http.formvalue("subfix")) - elseif task == "move" then - json = api.to_move(comname, http.formvalue("file")) - else - json = api.to_download(comname, http.formvalue("url"), http.formvalue("size")) - end - - http_write_json(json) -end diff --git a/luci-app-passwall/root/etc/uci-defaults/luci-passwall b/luci-app-passwall/root/etc/uci-defaults/luci-passwall index 8dedac31e..2a5a32404 100755 --- a/luci-app-passwall/root/etc/uci-defaults/luci-passwall +++ b/luci-app-passwall/root/etc/uci-defaults/luci-passwall @@ -31,7 +31,6 @@ uci -q batch <<-EOF >/dev/null commit uhttpd EOF - touch /etc/config/passwall_show >/dev/null 2>&1 [ ! -s "/etc/config/passwall" ] && cp -f /usr/share/passwall/0_default_config /etc/config/passwall diff --git a/luci-app-passwall/root/etc/uci-defaults/luci-passwall.orig b/luci-app-passwall/root/etc/uci-defaults/luci-passwall.orig deleted file mode 100755 index 2a5a32404..000000000 --- a/luci-app-passwall/root/etc/uci-defaults/luci-passwall.orig +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -uci -q batch <<-EOF >/dev/null - set dhcp.@dnsmasq[0].localuse=1 - commit dhcp - [ -e "/etc/config/ucitrack" ] && { - delete ucitrack.@passwall[-1] - add ucitrack passwall - set ucitrack.@passwall[-1].init=passwall - commit ucitrack - } - delete firewall.passwall - set firewall.passwall=include - set firewall.passwall.type=script - set firewall.passwall.path=/var/etc/passwall.include - set firewall.passwall.reload=1 - commit firewall - [ -e "/etc/config/ucitrack" ] && { - delete ucitrack.@passwall_server[-1] - add ucitrack passwall_server - set ucitrack.@passwall_server[-1].init=passwall_server - commit ucitrack - } - delete firewall.passwall_server - set firewall.passwall_server=include - set firewall.passwall_server.type=script - set firewall.passwall_server.path=/var/etc/passwall_server.include - set firewall.passwall_server.reload=1 - commit firewall - set uhttpd.main.max_requests=50 - commit uhttpd -EOF - -touch /etc/config/passwall_show >/dev/null 2>&1 -[ ! -s "/etc/config/passwall" ] && cp -f /usr/share/passwall/0_default_config /etc/config/passwall - -chmod +x /usr/share/passwall/*.sh - -rm -f /tmp/luci-indexcache -rm -rf /tmp/luci-modulecache/ -killall -HUP rpcd 2>/dev/null - -exit 0 diff --git a/luci-app-passwall/root/usr/share/passwall/0_default_config.orig b/luci-app-passwall/root/usr/share/passwall/0_default_config.orig deleted file mode 100644 index b9ad81e5f..000000000 --- a/luci-app-passwall/root/usr/share/passwall/0_default_config.orig +++ /dev/null @@ -1,212 +0,0 @@ - -config global - option enabled '0' - option socks_enabled '0' - option tcp_node 'nil' - option udp_node 'nil' - option tcp_node_socks_port '1070' - option filter_proxy_ipv6 '1' - option dns_mode 'dns2tcp' - option remote_dns '1.1.1.1' - option use_default_dns 'direct' - option chinadns_ng '1' - option chinadns_ng_default_tag 'none' - option use_direct_list '1' - option use_proxy_list '1' - option use_block_list '1' - option use_gfw_list '1' - option chn_list 'direct' - option tcp_proxy_mode 'proxy' - option udp_proxy_mode 'proxy' - option localhost_proxy '1' - option client_proxy '1' - option acl_enable '0' - option log_tcp '1' - option log_udp '1' - option loglevel 'error' - option trojan_loglevel '4' - -config global_haproxy - option balancing_enable '0' - -config global_delay - option auto_on '0' - option start_daemon '1' - option start_delay '60' - -config global_forwarding - option tcp_no_redir_ports 'disable' - option udp_no_redir_ports 'disable' - option tcp_proxy_drop_ports 'disable' - option udp_proxy_drop_ports '443' - option tcp_redir_ports '22,25,53,143,465,587,853,993,995,80,443' - option udp_redir_ports '1:65535' - option accept_icmp '0' - option use_nft '0' - option tcp_proxy_way 'redirect' - option ipv6_tproxy '0' - -config global_xray - option sniffing '1' - option route_only '0' - -config global_singbox - option sniff_override_destination '0' - option geoip_path '/usr/share/singbox/geoip.db' - option geoip_url 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.db' - option geosite_path '/usr/share/singbox/geosite.db' - option geosite_url 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.db' - -config global_other - option auto_detection_time 'tcping' - option show_node_info '0' - -config global_rules - option auto_update '0' - option chnlist_update '1' - option chnroute_update '1' - option chnroute6_update '1' - option gfwlist_update '1' - option geosite_update '0' - option geoip_update '0' - list gfwlist_url 'https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt' - list chnroute_url 'https://ispip.clang.cn/all_cn.txt' - list chnroute_url 'https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt' - list chnroute6_url 'https://ispip.clang.cn/all_cn_ipv6.txt' - list chnroute6_url 'https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china6.txt' - list chnlist_url 'https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf' - list chnlist_url 'https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf' - option v2ray_location_asset '/usr/share/v2ray/' - -config global_app - option singbox_file '/usr/bin/sing-box' - option xray_file '/usr/bin/xray' - option hysteria_file '/usr/bin/hysteria' - option chinadns_ng '/usr/bin/chinadns-ng' - -config global_subscribe - option filter_keyword_mode '1' - list filter_discard_list '过期时间' - list filter_discard_list '剩余流量' - list filter_discard_list 'QQ群' - list filter_discard_list '官网' - -config nodes 'myshunt' - option remarks '分流总节点' - option type 'Xray' - option protocol '_shunt' - option DirectGame '_direct' - option ProxyGame '_default' - option Proxy '_default' - option Netflix '_default' - option OpenAI '_default' - option Direct '_direct' - option default_node 'nil' - option domainStrategy 'IPOnDemand' - -config shunt_rules 'DirectGame' - option remarks 'DirectGame' - option domain_list 'api.steampowered.com -regexp:\.cm.steampowered.com$ -regexp:\.steamserver.net$ -geosite:category-games@cn' - option ip_list '103.10.124.0/24 -103.10.125.0/24 -103.28.54.0/24 -146.66.152.0/24 -146.66.155.0/24 -153.254.86.0/24 -155.133.224.0/23 -155.133.226.0/24 -155.133.227.0/24 -155.133.230.0/24 -155.133.232.0/24 -155.133.233.0/24 -155.133.234.0/24 -155.133.236.0/23 -155.133.238.0/24 -155.133.239.0/24 -155.133.240.0/23 -155.133.245.0/24 -155.133.246.0/24 -155.133.248.0/24 -155.133.249.0/24 -155.133.250.0/24 -155.133.251.0/24 -155.133.252.0/24 -155.133.253.0/24 -155.133.254.0/24 -155.133.255.0/24 -162.254.192.0/24 -162.254.193.0/24 -162.254.194.0/23 -162.254.195.0/24 -162.254.196.0/24 -162.254.197.0/24 -162.254.198.0/24 -162.254.199.0/24 -185.25.182.0/24 -185.25.183.0/24 -190.217.33.0/24 -192.69.96.0/22 -205.185.194.0/24 -205.196.6.0/24 -208.64.200.0/24 -208.64.201.0/24 -208.64.202.0/24 -208.64.203.0/24 -208.78.164.0/22' - -config shunt_rules 'ProxyGame' - option remarks 'ProxyGame' - option domain_list 'geosite:category-games -domain:store.steampowered.com' - -config shunt_rules 'OpenAI' - option remarks 'OpenAI' - option domain_list 'geosite:openai' - -config shunt_rules 'Proxy' - option remarks 'Proxy' - option domain_list 'geosite:geolocation-!cn' - option ip_list '149.154.160.0/20 -91.108.4.0/22 -91.108.56.0/24 -109.239.140.0/24 -67.198.55.0/24 -8.8.4.4 -8.8.8.8 -208.67.222.222 -208.67.220.220 -1.1.1.1 -1.1.1.2 -1.0.0.1 -9.9.9.9 -149.112.112.112 -2001:67c:4e8::/48 -2001:b28:f23c::/48 -2001:b28:f23d::/48 -2001:b28:f23f::/48 -2001:b28:f242::/48 -2001:4860:4860::8888 -2001:4860:4860::8844 -2606:4700:4700::1111 -2606:4700:4700::1001' - -config shunt_rules 'Netflix' - option remarks 'Netflix' - option domain_list 'geosite:netflix' - -config shunt_rules 'Direct' - option remarks 'Direct' - option domain_list 'geosite:cn' - option ip_list '223.5.5.5/32 -223.6.6.6/32 -119.29.29.29/32 -180.76.76.76/32 -114.114.114.114/32 -114.114.115.115/32 -1.12.12.12/32 -120.53.53.53/32 -geoip:cn -geoip:private'