update 2026-08-25 00:29:42
No files matched your search
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 319 KiB |
|
Before Width: | Height: | Size: 389 KiB |
|
After Width: | Height: | Size: 640 KiB |
|
After Width: | Height: | Size: 550 KiB |
|
After Width: | Height: | Size: 547 KiB |
|
After Width: | Height: | Size: 659 KiB |
|
After Width: | Height: | Size: 650 KiB |
@@ -25,25 +25,25 @@ o:value("https://wifi.vivo.com.cn/generate_204", "VIVO (CN)")
|
|||||||
o.default = o.keylist[3]
|
o.default = o.keylist[3]
|
||||||
|
|
||||||
if true then
|
if true then
|
||||||
m:appendTemplate("/node_list/node_list")
|
m:appendTemplate("/node_list/node_list")
|
||||||
|
|
||||||
if luci.http.formvalue("cbi.submit") == "1" then
|
if luci.http.formvalue("cbi.submit") == "1" then
|
||||||
local group_order = {}
|
local group_order = {}
|
||||||
group_order = luci.http.formvaluetable("group.order")
|
group_order = luci.http.formvaluetable("group.order")
|
||||||
if group_order then
|
if group_order then
|
||||||
for k, v in pairs(group_order) do
|
for k, v in pairs(group_order) do
|
||||||
if v and v~= "" then
|
if v and v~= "" then
|
||||||
local new_order = {}
|
local new_order = {}
|
||||||
string.gsub(v, "[^" .. " " .. "]+", function(w)
|
string.gsub(v, "[^" .. " " .. "]+", function(w)
|
||||||
new_order[#new_order + 1] = w
|
new_order[#new_order + 1] = w
|
||||||
end)
|
end)
|
||||||
for idx, name in ipairs(new_order) do
|
for idx, name in ipairs(new_order) do
|
||||||
m.uci:reorder(m.config, name, idx - 1)
|
m.uci:reorder(m.config, name, idx - 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return api.return_map(m)
|
return api.return_map(m)
|
||||||
@@ -117,9 +117,9 @@ end
|
|||||||
o = s:option(DummyValue, "_update", translate("Manual subscription All"))
|
o = s:option(DummyValue, "_update", translate("Manual subscription All"))
|
||||||
o.rawhtml = true
|
o.rawhtml = true
|
||||||
o.cfgvalue = function(self, section)
|
o.cfgvalue = function(self, section)
|
||||||
return string.format([[
|
return string.format([[
|
||||||
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribeAll()" value="%s" />]],
|
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribeAll()" value="%s" />]],
|
||||||
translate("Manual subscription All"))
|
translate("Manual subscription All"))
|
||||||
end
|
end
|
||||||
|
|
||||||
s = m:section(TypedSection, "subscribe_list", "", "<font color='red'>" .. translate("When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.") .. "</font>")
|
s = m:section(TypedSection, "subscribe_list", "", "<font color='red'>" .. translate("When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.") .. "</font>")
|
||||||
@@ -215,9 +215,9 @@ end
|
|||||||
o = s:option(DummyValue, "_update", translate("Manual subscription"))
|
o = s:option(DummyValue, "_update", translate("Manual subscription"))
|
||||||
o.rawhtml = true
|
o.rawhtml = true
|
||||||
o.cfgvalue = function(self, section)
|
o.cfgvalue = function(self, section)
|
||||||
return string.format([[
|
return string.format([[
|
||||||
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribe('%s')" value="%s" />]],
|
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribe('%s')" value="%s" />]],
|
||||||
section, translate("Manual subscription"))
|
section, translate("Manual subscription"))
|
||||||
end
|
end
|
||||||
|
|
||||||
m:appendTemplate("/cbi/sortable", {sectiontype = s.sectiontype})
|
m:appendTemplate("/cbi/sortable", {sectiontype = s.sectiontype})
|
||||||
|
|||||||
@@ -161,6 +161,7 @@ local function start()
|
|||||||
end)
|
end)
|
||||||
if firewall_num > 0 then
|
if firewall_num > 0 then
|
||||||
api.uci_save(uci, "firewall", true, true)
|
api.uci_save(uci, "firewall", true, true)
|
||||||
|
cmd("/etc/init.d/firewall reload >/dev/null 2>&1")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -176,6 +177,7 @@ local function stop()
|
|||||||
end)
|
end)
|
||||||
if num > 0 then
|
if num > 0 then
|
||||||
api.uci_save(uci, "firewall", true, true)
|
api.uci_save(uci, "firewall", true, true)
|
||||||
|
cmd("/etc/init.d/firewall reload >/dev/null 2>&1")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
cmd(string.format("rm -rf %s %s", CONFIG_PATH, LOG_APP_FILE))
|
cmd(string.format("rm -rf %s %s", CONFIG_PATH, LOG_APP_FILE))
|
||||||
|
|||||||
@@ -916,12 +916,12 @@ function gen_config(var)
|
|||||||
if xray_settings.fragment == "1" then
|
if xray_settings.fragment == "1" then
|
||||||
local lengths, delays = {}, {}
|
local lengths, delays = {}, {}
|
||||||
api.trim(xray_settings.fragment_lengths):gsub("[^,]+", function(w)
|
api.trim(xray_settings.fragment_lengths):gsub("[^,]+", function(w)
|
||||||
w = w:gsub("%s+", "")
|
w = w:gsub("%s+", "")
|
||||||
if w ~= "" then lengths[#lengths+1] = w end
|
if w ~= "" then lengths[#lengths+1] = w end
|
||||||
end)
|
end)
|
||||||
api.trim(xray_settings.fragment_delays):gsub("[^,]+", function(w)
|
api.trim(xray_settings.fragment_delays):gsub("[^,]+", function(w)
|
||||||
w = w:gsub("%s+", "")
|
w = w:gsub("%s+", "")
|
||||||
if w ~= "" then delays[#delays+1] = w end
|
if w ~= "" then delays[#delays+1] = w end
|
||||||
end)
|
end)
|
||||||
fragment_table = {
|
fragment_table = {
|
||||||
type = "fragment",
|
type = "fragment",
|
||||||
|
|||||||
@@ -534,7 +534,7 @@
|
|||||||
//自定义框
|
//自定义框
|
||||||
function v_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput) {
|
function v_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput) {
|
||||||
let inputValue = customInput.value.trim();
|
let inputValue = customInput.value.trim();
|
||||||
if (!inputValue) {
|
if (!inputValue) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const existingItems = listContainer.querySelectorAll('li[data-key="' + inputValue + '"]');
|
const existingItems = listContainer.querySelectorAll('li[data-key="' + inputValue + '"]');
|
||||||
|
|||||||
@@ -3,42 +3,42 @@ local map = self.map
|
|||||||
local api = map.api
|
local api = map.api
|
||||||
-%>
|
-%>
|
||||||
<style>
|
<style>
|
||||||
.dns-con {
|
.dns-con {
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
.faq-title {
|
.faq-title {
|
||||||
color: var(--primary);
|
color: var(--primary);
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.reset-title {
|
.reset-title {
|
||||||
color: var(--primary);
|
color: var(--primary);
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
margin-bottom: 0.3rem;
|
margin-bottom: 0.3rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: 1.2rem;
|
margin-top: 1.2rem;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
.dns-item {
|
.dns-item {
|
||||||
margin-bottom: 0.8rem;
|
margin-bottom: 0.8rem;
|
||||||
line-height:1.2rem;
|
line-height:1.2rem;
|
||||||
}
|
}
|
||||||
.dns-list {
|
.dns-list {
|
||||||
text-indent:1rem;
|
text-indent:1rem;
|
||||||
line-height: 1.2rem;
|
line-height: 1.2rem;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="dns-con">
|
<div class="dns-con">
|
||||||
<div id="faq_dns">
|
<div id="faq_dns">
|
||||||
<ul>
|
<ul>
|
||||||
<b class="faq-title"><%:DNS related issues:%></b>
|
<b class="faq-title"><%:DNS related issues:%></b>
|
||||||
<li class="dns-item">1. <span><%:Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.%></span></li>
|
<li class="dns-item">1. <span><%:Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.%></span></li>
|
||||||
<li class="dns-item">2. <span><%:If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):%></span>
|
<li class="dns-item">2. <span><%:If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):%></span>
|
||||||
<ul><li class="dns-list"> ◦ <span><%:For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.%></span></li>
|
<ul><li class="dns-list"> ◦ <span><%:For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.%></span></li>
|
||||||
<li class="dns-list"> ◦ <span><%:For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.%></span></li>
|
<li class="dns-list"> ◦ <span><%:For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.%></span></li>
|
||||||
<li class="dns-list"> ◦ <span><%:For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.%></span></li>
|
<li class="dns-list"> ◦ <span><%:For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.%></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dns-item">3. <span><%:Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.%></span></li>
|
<li class="dns-item">3. <span><%:Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.%></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -58,7 +58,7 @@ local api = map.api
|
|||||||
}
|
}
|
||||||
|
|
||||||
var dom = document.getElementById("faq_reset");
|
var dom = document.getElementById("faq_reset");
|
||||||
if (dom) {
|
if (dom) {
|
||||||
var li = "";
|
var li = "";
|
||||||
li += "<a href='#' class='reset-title' onclick='hide()'>" + "<%: Hide in main menu:%>"+ "</a>" + "<br />" + "<%: Browser access: %>" + "<a href='#' onclick='hide()'>" + hide_url + "</a>" + "<br />";
|
li += "<a href='#' class='reset-title' onclick='hide()'>" + "<%: Hide in main menu:%>"+ "</a>" + "<br />" + "<%: Browser access: %>" + "<a href='#' onclick='hide()'>" + hide_url + "</a>" + "<br />";
|
||||||
li += "<a href='#' class='reset-title'>" + "<%: Show in main menu:%>"+ "</a>" + "<br />" +"<%: Browser access: %>" + "<a href='#'>" + show_url + "</a>" + "<br />";
|
li += "<a href='#' class='reset-title'>" + "<%: Show in main menu:%>"+ "</a>" + "<br />" +"<%: Browser access: %>" + "<a href='#'>" + show_url + "</a>" + "<br />";
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ table td, .table .td {
|
|||||||
z-index: 99;
|
z-index: 99;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background: white;
|
background: white;
|
||||||
box-shadow: darkgrey 10px 10px 30px 5px;
|
box-shadow: darkgrey 10px 10px 30px 5px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
}
|
}
|
||||||
@@ -55,8 +55,8 @@ table td, .table .td {
|
|||||||
.ping a,
|
.ping a,
|
||||||
.ping_value a,
|
.ping_value a,
|
||||||
.tcping_value a {
|
.tcping_value a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ table th, .table .th {
|
|||||||
|
|
||||||
table td, .table .td {
|
table td, .table .td {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
/* white-space: nowrap; */
|
/* white-space: nowrap; */
|
||||||
word-break: keep-all;
|
word-break: keep-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
.td.cbi-section-actions {
|
.td.cbi-section-actions {
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ local api = map.api
|
|||||||
if (!value) {
|
if (!value) {
|
||||||
alert("<%:Please enter query content!%>");
|
alert("<%:Please enter query content!%>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lookup_btn.disabled = true;
|
lookup_btn.disabled = true;
|
||||||
extract_btn.disabled = true;
|
extract_btn.disabled = true;
|
||||||
btn.value = '<%:Querying%>';
|
btn.value = '<%:Querying%>';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -e "/etc/config/ucitrack" ]; then
|
if [ -e "/etc/config/ucitrack" ]; then
|
||||||
uci -q batch <<-EOF
|
uci -q batch <<-EOF
|
||||||
delete ucitrack.@passwall[-1]
|
delete ucitrack.@passwall[-1]
|
||||||
add ucitrack passwall
|
add ucitrack passwall
|
||||||
set ucitrack.@passwall[-1].init=passwall
|
set ucitrack.@passwall[-1].init=passwall
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -e "/etc/config/ucitrack" ]; then
|
if [ -e "/etc/config/ucitrack" ]; then
|
||||||
uci -q batch <<-EOF
|
uci -q batch <<-EOF
|
||||||
delete ucitrack.@passwall_server[-1]
|
delete ucitrack.@passwall_server[-1]
|
||||||
add ucitrack passwall_server
|
add ucitrack passwall_server
|
||||||
set ucitrack.@passwall_server[-1].init=passwall_server
|
set ucitrack.@passwall_server[-1].init=passwall_server
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ local geo_dir = (api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/
|
|||||||
local geosite_path = geo_dir .. "/geosite.dat"
|
local geosite_path = geo_dir .. "/geosite.dat"
|
||||||
local geoip_path = geo_dir .. "/geoip.dat"
|
local geoip_path = geo_dir .. "/geoip.dat"
|
||||||
if fs.access(geosite_path) and fs.access(geoip_path) then
|
if fs.access(geosite_path) and fs.access(geoip_path) then
|
||||||
f = SimpleForm(api.c_config)
|
f = SimpleForm(api.c_config)
|
||||||
f.reset = false
|
f.reset = false
|
||||||
f.submit = false
|
f.submit = false
|
||||||
|
|
||||||
local obj = Template(api.appname .. "/rule/geoview")
|
local obj = Template(api.appname .. "/rule/geoview")
|
||||||
obj.api = api
|
obj.api = api
|
||||||
f:append(obj)
|
f:append(obj)
|
||||||
end
|
end
|
||||||
|
|
||||||
return f
|
return f
|
||||||
@@ -25,25 +25,25 @@ o:value("https://wifi.vivo.com.cn/generate_204", "VIVO (CN)")
|
|||||||
o.default = o.keylist[3]
|
o.default = o.keylist[3]
|
||||||
|
|
||||||
if true then
|
if true then
|
||||||
m:appendTemplate("/node_list/node_list")
|
m:appendTemplate("/node_list/node_list")
|
||||||
|
|
||||||
if luci.http.formvalue("cbi.submit") == "1" then
|
if luci.http.formvalue("cbi.submit") == "1" then
|
||||||
local group_order = {}
|
local group_order = {}
|
||||||
group_order = luci.http.formvaluetable("group.order")
|
group_order = luci.http.formvaluetable("group.order")
|
||||||
if group_order then
|
if group_order then
|
||||||
for k, v in pairs(group_order) do
|
for k, v in pairs(group_order) do
|
||||||
if v and v~= "" then
|
if v and v~= "" then
|
||||||
local new_order = {}
|
local new_order = {}
|
||||||
string.gsub(v, "[^" .. " " .. "]+", function(w)
|
string.gsub(v, "[^" .. " " .. "]+", function(w)
|
||||||
new_order[#new_order + 1] = w
|
new_order[#new_order + 1] = w
|
||||||
end)
|
end)
|
||||||
for idx, name in ipairs(new_order) do
|
for idx, name in ipairs(new_order) do
|
||||||
m.uci:reorder(m.config, name, idx - 1)
|
m.uci:reorder(m.config, name, idx - 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return api.return_map(m)
|
return api.return_map(m)
|
||||||
@@ -112,8 +112,8 @@ end
|
|||||||
o = s:option(DummyValue, "_update", translate("Manual subscription All"))
|
o = s:option(DummyValue, "_update", translate("Manual subscription All"))
|
||||||
o.rawhtml = true
|
o.rawhtml = true
|
||||||
o.cfgvalue = function(self, section)
|
o.cfgvalue = function(self, section)
|
||||||
return string.format([[
|
return string.format([[
|
||||||
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribeAll()" value="%s" />]],
|
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribeAll()" value="%s" />]],
|
||||||
translate("Manual subscription All"))
|
translate("Manual subscription All"))
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -210,8 +210,8 @@ end
|
|||||||
o = s:option(DummyValue, "_update", translate("Manual subscription"))
|
o = s:option(DummyValue, "_update", translate("Manual subscription"))
|
||||||
o.rawhtml = true
|
o.rawhtml = true
|
||||||
o.cfgvalue = function(self, section)
|
o.cfgvalue = function(self, section)
|
||||||
return string.format([[
|
return string.format([[
|
||||||
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribe('%s')" value="%s" />]],
|
<input type="button" class="btn cbi-button cbi-button-apply" onclick="ManualSubscribe('%s')" value="%s" />]],
|
||||||
section, translate("Manual subscription"))
|
section, translate("Manual subscription"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ for filename in api.fs.dir(types_dir) do
|
|||||||
table.insert(type_table, filename)
|
table.insert(type_table, filename)
|
||||||
end
|
end
|
||||||
table.sort(type_table, function(a, b)
|
table.sort(type_table, function(a, b)
|
||||||
return a < b
|
return a < b
|
||||||
end)
|
end)
|
||||||
|
|
||||||
for index, value in ipairs(type_table) do
|
for index, value in ipairs(type_table) do
|
||||||
|
|||||||
@@ -464,14 +464,14 @@ datatypes.json = is_json
|
|||||||
|
|
||||||
function is_timehhmm(str)
|
function is_timehhmm(str)
|
||||||
local hour, minute = string.match(str, "^(%d?%d):(%d%d)$")
|
local hour, minute = string.match(str, "^(%d?%d):(%d%d)$")
|
||||||
if hour and minute then
|
if hour and minute then
|
||||||
hour = tonumber(hour)
|
hour = tonumber(hour)
|
||||||
minute = tonumber(minute)
|
minute = tonumber(minute)
|
||||||
if hour >= 0 and hour <= 23 and minute >= 0 and minute <= 59 then
|
if hour >= 0 and hour <= 23 and minute >= 0 and minute <= 59 then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
datatypes.timehhmm = is_timehhmm
|
datatypes.timehhmm = is_timehhmm
|
||||||
|
|
||||||
|
|||||||
@@ -922,12 +922,12 @@ function gen_config(var)
|
|||||||
if xray_settings.fragment == "1" then
|
if xray_settings.fragment == "1" then
|
||||||
local lengths, delays = {}, {}
|
local lengths, delays = {}, {}
|
||||||
api.trim(xray_settings.fragment_lengths):gsub("[^,]+", function(w)
|
api.trim(xray_settings.fragment_lengths):gsub("[^,]+", function(w)
|
||||||
w = w:gsub("%s+", "")
|
w = w:gsub("%s+", "")
|
||||||
if w ~= "" then lengths[#lengths+1] = w end
|
if w ~= "" then lengths[#lengths+1] = w end
|
||||||
end)
|
end)
|
||||||
api.trim(xray_settings.fragment_delays):gsub("[^,]+", function(w)
|
api.trim(xray_settings.fragment_delays):gsub("[^,]+", function(w)
|
||||||
w = w:gsub("%s+", "")
|
w = w:gsub("%s+", "")
|
||||||
if w ~= "" then delays[#delays+1] = w end
|
if w ~= "" then delays[#delays+1] = w end
|
||||||
end)
|
end)
|
||||||
fragment_table = {
|
fragment_table = {
|
||||||
type = "fragment",
|
type = "fragment",
|
||||||
|
|||||||
@@ -534,7 +534,7 @@
|
|||||||
//自定义框
|
//自定义框
|
||||||
function v_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput) {
|
function v_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput) {
|
||||||
let inputValue = customInput.value.trim();
|
let inputValue = customInput.value.trim();
|
||||||
if (!inputValue) {
|
if (!inputValue) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const existingItems = listContainer.querySelectorAll('li[data-key="' + inputValue + '"]');
|
const existingItems = listContainer.querySelectorAll('li[data-key="' + inputValue + '"]');
|
||||||
|
|||||||
@@ -3,28 +3,28 @@ local map = self.map
|
|||||||
local api = map.api
|
local api = map.api
|
||||||
-%>
|
-%>
|
||||||
<style>
|
<style>
|
||||||
.dns-con {
|
.dns-con {
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
.faq-title {
|
.faq-title {
|
||||||
color: var(--primary);
|
color: var(--primary);
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.reset-title {
|
.reset-title {
|
||||||
color: var(--primary);
|
color: var(--primary);
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
margin-bottom: 0.3rem;
|
margin-bottom: 0.3rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: 1.2rem;
|
margin-top: 1.2rem;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
.dns-item {
|
.dns-item {
|
||||||
margin-bottom: 0.8rem;
|
margin-bottom: 0.8rem;
|
||||||
line-height:1.2rem;
|
line-height:1.2rem;
|
||||||
}
|
}
|
||||||
.dns-list {
|
.dns-list {
|
||||||
text-indent:1rem;
|
text-indent:1rem;
|
||||||
line-height: 1.2rem;
|
line-height: 1.2rem;
|
||||||
}
|
}
|
||||||
@@ -32,13 +32,13 @@ local api = map.api
|
|||||||
<div class="dns-con">
|
<div class="dns-con">
|
||||||
<div id="faq_dns">
|
<div id="faq_dns">
|
||||||
<ul>
|
<ul>
|
||||||
<b class="faq-title"><%:DNS related issues:%></b>
|
<b class="faq-title"><%:DNS related issues:%></b>
|
||||||
<li class="dns-item">1. <span><%:Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.%></span></li>
|
<li class="dns-item">1. <span><%:Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.%></span></li>
|
||||||
<li class="dns-item">2. <span><%:If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):%></span>
|
<li class="dns-item">2. <span><%:If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):%></span>
|
||||||
<ul><li class="dns-list"> ◦ <span><%:For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.%></span></li>
|
<ul><li class="dns-list"> ◦ <span><%:For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.%></span></li>
|
||||||
<li class="dns-list"> ◦ <span><%:For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.%></span></li>
|
<li class="dns-list"> ◦ <span><%:For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.%></span></li>
|
||||||
<li class="dns-list"> ◦ <span><%:For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.%></span></li>
|
<li class="dns-list"> ◦ <span><%:For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.%></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dns-item">3. <span><%:Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.%></span></li>
|
<li class="dns-item">3. <span><%:Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.%></span></li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -58,7 +58,7 @@ local api = map.api
|
|||||||
}
|
}
|
||||||
|
|
||||||
var dom = document.getElementById("faq_reset");
|
var dom = document.getElementById("faq_reset");
|
||||||
if (dom) {
|
if (dom) {
|
||||||
var li = "";
|
var li = "";
|
||||||
li += "<a href='#' class='reset-title' onclick='hide()'>" + "<%: Hide in main menu:%>"+ "</a>" + "<br />" + "<%: Browser access: %>" + "<a href='#' onclick='hide()'>" + hide_url + "</a>" + "<br />";
|
li += "<a href='#' class='reset-title' onclick='hide()'>" + "<%: Hide in main menu:%>"+ "</a>" + "<br />" + "<%: Browser access: %>" + "<a href='#' onclick='hide()'>" + hide_url + "</a>" + "<br />";
|
||||||
li += "<a href='#' class='reset-title'>" + "<%: Show in main menu:%>"+ "</a>" + "<br />" +"<%: Browser access: %>" + "<a href='#'>" + show_url + "</a>" + "<br />";
|
li += "<a href='#' class='reset-title'>" + "<%: Show in main menu:%>"+ "</a>" + "<br />" +"<%: Browser access: %>" + "<a href='#'>" + show_url + "</a>" + "<br />";
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ table th, .table .th {
|
|||||||
|
|
||||||
table td, .table .td {
|
table td, .table .td {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
/* white-space: nowrap; */
|
/* white-space: nowrap; */
|
||||||
word-break: keep-all;
|
word-break: keep-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
#set_node_div {
|
#set_node_div {
|
||||||
@@ -41,7 +41,7 @@ table td, .table .td {
|
|||||||
z-index: 99;
|
z-index: 99;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background: white;
|
background: white;
|
||||||
box-shadow: darkgrey 10px 10px 30px 5px;
|
box-shadow: darkgrey 10px 10px 30px 5px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
}
|
}
|
||||||
@@ -53,8 +53,8 @@ table td, .table .td {
|
|||||||
.ping a,
|
.ping a,
|
||||||
.ping_value a,
|
.ping_value a,
|
||||||
.tcping_value a {
|
.tcping_value a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ local api = self.api
|
|||||||
if (!value) {
|
if (!value) {
|
||||||
alert("<%:Please enter query content!%>");
|
alert("<%:Please enter query content!%>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lookup_btn.disabled = true;
|
lookup_btn.disabled = true;
|
||||||
extract_btn.disabled = true;
|
extract_btn.disabled = true;
|
||||||
btn.value = '<%:Querying%>';
|
btn.value = '<%:Querying%>';
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ table th, .table .th {
|
|||||||
|
|
||||||
table td, .table .td {
|
table td, .table .td {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
/* white-space: nowrap; */
|
/* white-space: nowrap; */
|
||||||
word-break: keep-all;
|
word-break: keep-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
.td.cbi-section-actions {
|
.td.cbi-section-actions {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -e "/etc/config/ucitrack" ]; then
|
if [ -e "/etc/config/ucitrack" ]; then
|
||||||
uci -q batch <<-EOF
|
uci -q batch <<-EOF
|
||||||
delete ucitrack.@passwall2[-1]
|
delete ucitrack.@passwall2[-1]
|
||||||
add ucitrack passwall2
|
add ucitrack passwall2
|
||||||
set ucitrack.@passwall2[-1].init=passwall2
|
set ucitrack.@passwall2[-1].init=passwall2
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -e "/etc/config/ucitrack" ]; then
|
if [ -e "/etc/config/ucitrack" ]; then
|
||||||
uci -q batch <<-EOF
|
uci -q batch <<-EOF
|
||||||
delete ucitrack.@passwall2_server[-1]
|
delete ucitrack.@passwall2_server[-1]
|
||||||
add ucitrack passwall2_server
|
add ucitrack passwall2_server
|
||||||
set ucitrack.@passwall2_server[-1].init=passwall2_server
|
set ucitrack.@passwall2_server[-1].init=passwall2_server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
if #arg > 0 then
|
if #arg > 0 then
|
||||||
local api = require "luci.passwall2.api"
|
local api = require "luci.passwall2.api"
|
||||||
local str = arg[1]
|
local str = arg[1]
|
||||||
table.remove(arg, 1)
|
table.remove(arg, 1)
|
||||||
print(api.i18n.translatef(str, unpack(arg)))
|
print(api.i18n.translatef(str, unpack(arg)))
|
||||||
end
|
end
|
||||||
@@ -891,7 +891,7 @@ add_firewall_rule() {
|
|||||||
|
|
||||||
del_firewall_rule() {
|
del_firewall_rule() {
|
||||||
for nft in "dstnat" "srcnat" "nat_output" "mangle_prerouting" "mangle_output"; do
|
for nft in "dstnat" "srcnat" "nat_output" "mangle_prerouting" "mangle_output"; do
|
||||||
local handles=$(nft -a list chain $NFTABLE_NAME ${nft} 2>/dev/null | grep -E "PSW2_" | awk -F '# handle ' '{print$2}')
|
local handles=$(nft -a list chain $NFTABLE_NAME ${nft} 2>/dev/null | grep -E "PSW2_" | awk -F '# handle ' '{print$2}')
|
||||||
for handle in $handles; do
|
for handle in $handles; do
|
||||||
nft delete rule $NFTABLE_NAME ${nft} handle ${handle} 2>/dev/null
|
nft delete rule $NFTABLE_NAME ${nft} handle ${handle} 2>/dev/null
|
||||||
done
|
done
|
||||||
|
|||||||