update 2026-05-10 09:48:30

This commit is contained in:
action committed 2026-05-10 09:48:30 +08:00
1 parent 95ac96413e
commit 0b362674f1
6244 files changed
+2992248

No files matched your search

+52
View File
@@ -0,0 +1,52 @@
#
# Copyright (C) 2010-2011 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=my-default-settings
PKG_VERSION:=2
PKG_RELEASE:=80
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=luci
CATEGORY:=LuCI
TITLE:=Default Settings
MAINTAINER:=Kiddin'
PKGARCH:=all
DEPENDS:=+luci-base
endef
define Package/$(PKG_NAME)/conffiles
/etc/config/
/etc/nginx/
endef
define Build/Prepare
chmod -R +x ./files/bin ./files/sbin ./files/etc/profile.d ./files/etc/rc.d ./files/usr/share diy/*/{*,}/base-files/{etc/init.d,usr/bin} >/dev/null || true
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(CP) ./files/* $(1)/
echo $(BOARD)$(TARGETID)
if [ -d ./diy/$(BOARD)/base-files/. ]; then \
$(CP) ./diy/$(BOARD)/base-files/* $(1)/; \
fi
if [ -d ./diy/$(TARGETID)/base-files/. ]; then \
$(CP) ./diy/$(TARGETID)/base-files/* $(1)/; \
fi; \
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n
po2lmo ./po/zh_Hans/default.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo
endef
$(eval $(call BuildPackage,$(PKG_NAME)))
@@ -0,0 +1,14 @@
if [[ "$(board_name)" == *xe300 ]]; then
uci -q add_list firewall.@zone[1].network='wwan0'
uci commit firewall
uci -q set network.wwan0=interface
uci -q set network.wwan0.proto='qmi'
uci -q set network.wwan0.device='/dev/cdc-wdm0'
uci -q set network.wwan0.apn='internet'
uci -q set network.wwan0.auth='none'
uci -q set network.wwan0.delay='10'
uci -q set network.wwan0.pdptype='IPV4V6'
uci commit network
fi
exit 0
@@ -0,0 +1,12 @@
#!/bin/sh
ETHTOOL=/usr/sbin/ethtool
$ETHTOOL -i eth0 | grep r8152 && \
[ "$ACTION" = "ifup" ] && \
$ETHTOOL -K eth0 rx off tx off
$ETHTOOL -i eth1 | grep r8152 && \
[ "$ACTION" = "ifup" ] && \
$ETHTOOL -K eth1 rx off tx off
@@ -0,0 +1,278 @@
<% local raid = {}
local devs = {}
local devinfo = {}
local colors = { "c0c0ff", "fbbd00", "e97c30", "a0e0a0", "e0c0ff" }
local mounts = nixio.fs.readfile("/proc/mounts")
local show_raid = 1
local show_disc = 1
if self then
if self.hide_raid then
show_raid = 0
end
if self.hide_disc then
show_disc = 0
end
end
function disp_size(s)
local units = { "kB", "MB", "GB", "TB" }
local i, unit
s = s / 2
for i, unit in ipairs(units) do
if (i == #units) or (s < 1024) then
return math.floor(s * 100) / 100 .. unit
end
s = s / 1024
end
end
function first_line(s)
local n = s:find("\n")
if n then
return s:sub(1, n-1)
end
return s
end
function get_fs(pname, status)
for r,raid in ipairs(raid) do
for m,member in ipairs(raid.members) do
if member.name == pname then
return "(raid member)"
end
end
end
local mounted_fs = mounts:match("\n[a-z/]*" .. pname .. " [^ ]* ([^ ]*)")
if mounted_fs then
if status == "standby" then
return "(" .. mounted_fs .. ")"
end
local df = luci.sys.exec("df /dev/" .. pname):match(" ([0-9]+)%% ")
return "(" .. mounted_fs .. " " .. df .. "%)"
end
if status == "standby" then
return
end
local blkid = luci.sys.exec(" blkid -s TYPE /dev/" .. pname):match("TYPE=\"(.*)\"")
if blkid then
return "(" .. blkid .. ")"
end
end
function get_status(raid)
for m,member in ipairs(raid.members) do
for d,dev in ipairs(devinfo) do
if member.name == dev.name then
return dev.status
end
for p,part in ipairs(dev.parts) do
if member.name == part.name then
return dev.status
end
end
end
end
end
function get_parts(dev,status,size)
local c = 1
local unused = size
local parts = {}
for part in nixio.fs.glob("/sys/block/" .. dev .."/" .. dev .. "*") do
local pname = nixio.fs.basename(part)
local psize = nixio.fs.readfile(part .. "/size")
table.insert(parts, {name=pname, size=psize, perc=math.floor(psize*100/size), fs=get_fs(pname,status), color=colors[c]})
c = c + 1
unused = unused - psize
end
if unused > 2048 then
table.insert(parts, { name="", fs=get_fs(dev,status), size=unused, color=colors[c] })
end
return parts
end
for dev in nixio.fs.glob("/sys/block/*") do
if nixio.fs.access(dev .. "/md") then
local name = nixio.fs.basename(dev)
local rlevel = first_line(nixio.fs.readfile(dev .. "/md/level"))
local ndisks = tonumber(nixio.fs.readfile(dev .. "/md/raid_disks"))
local size = tonumber(nixio.fs.readfile(dev .. "/size"))
local metav = nixio.fs.readfile(dev .. "/md/metadata_version")
local degr = tonumber(nixio.fs.readfile(dev .. "/md/degraded"))
local sync = first_line(nixio.fs.readfile(dev .. "/md/sync_action"))
local sync_speed = tonumber(nixio.fs.readfile(dev .. "/md/sync_speed"))
local sync_compl = nixio.fs.readfile(dev .. "/md/sync_completed")
local status = "active"
if sync ~= "idle" then
local progress, total = nixio.fs.readfile(dev .. "/md/sync_completed"):match("^([0-9]*)[^0-9]*([0-9]*)")
local rem = (total - progress) / sync_speed / 2
local rems = math.floor(rem % 60)
if rems < 10 then rems = "0" .. rems end
rem = math.floor(rem / 60)
local remm = math.floor(rem % 60)
if remm < 10 then remm = "0" .. remm end
local remh = math.floor(rem / 60)
local remstr = remh .. ":" .. remm .. ":" .. rems
status = sync .. " (" .. math.floor(sync_speed/1024) .. "MB/s, " .. math.floor(progress * 1000 / total) /10 .. "%, rem. " .. remstr .. ")"
elseif degr == 1 then
status = "degraded"
end
local members = {}
local c = 1
for member in nixio.fs.glob("/sys/block/" .. name .. "/md/dev-*") do
local dname = nixio.fs.basename(nixio.fs.readlink(member .. "/block"))
local dsize = disp_size(tonumber(nixio.fs.readfile(member .. "/block/size")))
local dstate = nixio.fs.readfile(member .. "/state"):gsub("_", " "):match "^%s*(.-)%s*$"
table.insert(members, { name = dname, size = dsize, state = dstate, color = colors[c] })
c = c + 1
end
table.insert(raid, {name=name, rlevel=rlevel, ndisks=ndisks, size=size, metav=metav, status=status, members=members })
end
end
if show_disc == 1 then
for dev in nixio.fs.glob("/sys/class/scsi_disk/*/device") do
local section
local model = nixio.fs.readfile(dev .. "/model")
local fw = nixio.fs.readfile(dev .. "/rev")
for bdev in nixio.fs.glob(dev .. "/block/*") do
local section
local name = nixio.fs.basename(bdev)
local size = tonumber(nixio.fs.readfile(bdev .. "/size"))
local unused = size
local status = "-"
local temp = "-"
local serial = "-"
local secsize = "-"
for _,line in ipairs(luci.util.execl("smartctl -A -i -n standby -f brief /dev/" .. name)) do
local attrib, val
if section == 1 then
attrib, val = line:match "^(.*):%s*(.*)"
elseif section == 2 then
attrib, val = line:match("^([0-9 ]*) [^ ]* * [POSRCK-]* *[0-9-]* *[0-9-]* *[0-9-]* *[0-9-]* *([0-9-]*)")
else
attrib = line:match "^=== START OF (.*) SECTION ==="
if attrib == "INFORMATION" then
section = 1
elseif attrib == "READ SMART DATA" then
section = 2
elseif status == "-" then
val = line:match "^Device is in (.*) mode"
if val then
status = val:lower()
end
end
end
if not attrib then
if section ~= 2 then section = 0 end
elseif (attrib == "Power mode is") or (attrib == "Power mode was") then
status = val:lower():match "(%S*)"
elseif attrib == "Sector Sizes" then
secsize = val:match "([0-9]*) bytes physical"
elseif attrib == "Sector Size" then
secsize = val:match "([0-9]*)"
elseif attrib == "Serial Number" then
serial = val
elseif attrib == "194" then
temp = val .. "&deg;C"
end
end
table.insert(devinfo, {name=name, model=model, fw=fw, size=size, status=status, temp=temp, serial=serial, secsize=secsize, parts=get_parts(name,status,size) })
end
end
for r,dev in ipairs(raid) do
table.insert(devinfo, {name=dev.name, model="Linux RAID", size=dev.size, status=get_status(dev), secsize=secsize, parts=get_parts(dev.name,status,dev.size) })
end
end
if show_disc == 1 then %>
<div class="cbi-section">
<h3><%:Disks%></h3>
<table class="cbi-section-table" style="white-space: nowrap">
<tr>
<th width="5%">&nbsp;</th>
<th width="30%"><%:Model%></th>
<th width="15%"><%:Serial number%></th>
<th width="10%"><%:Firmware%></th>
<th width="10%"><%:Capacity%></th>
<th width="5%"><%:Sector size%></th>
<th width="5%"><%:Temperature%></th>
<th width="20%"><%:Power state%></th>
</tr>
<% local style=true
for d,dev in ipairs(devinfo) do %>
<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
<td class="cbi-vluae-field" style="padding-bottom:0px; border-bottom-width:0px; vertical-align:middle" rowspan="4"><%=dev.name%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.model%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.serial%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.fw%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=disp_size(dev.size)%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.secsize%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.temp%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.status%></td>
</tr>
<tr style="height:0px" />
<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
<td style="padding:0px; border-top-width:0px;" colspan="7" rowspan="2">
<table style="border: 0pt; border-collapse:collapse; width:100%; padding:0px; margin:0px"><tr>
<% for _,part in pairs(dev.parts) do %>
<td style="text-align:center; padding: 0px 4px; border-radius: 3px; background-color:#<%=part.color%>" width="<%=part.perc%>%"><%=part.name%> <%=disp_size(part.size)%> <%=part.fs%></td>
<% end %>
</tr></table>
</td>
</tr>
<tr style="height:0px" />
<% style = not style
end %>
</table>
</div>
<% end
if show_raid == 1 and #raid > 0 then %>
<div class="cbi-section">
<h3><%:Raid arrays%></h3>
<table class="cbi-section-table" style="white-space:nowrap">
<tr>
<th width="5%">&nbsp;</th>
<th width="13%"><%:Level%></th>
<th width="13%"><%:# Disks%></th>
<th width="13%"><%:Capacity%></th>
<th width="13%"><%:Metadata%></th>
<th width="43%"><%:Status%></th>
</tr>
<% local style=true
for r,dev in ipairs(raid) do %>
<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
<td class="cbi-vluae-field" style="padding-bottom:0px; border-bottom-width:0px; vertical-align:middle" rowspan="4"><%=dev.name%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.rlevel%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.ndisks%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=disp_size(dev.size)%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.metav%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.status%></td>
</tr>
<tr style="height:0px" />
<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
<td style="padding-top:0px; border-top-width:0px" colspan="6" rowspan="2">
<table style="border: 0pt; border-collapse:collapse; width:100%; padding:0px; margin:0px"><tr>
<% for _,member in pairs(dev.members) do %>
<td style="text-align:center; padding: 0px 4px; border-radius: 3px; background-color:#<%=member.color%>; white-space: nowrap"><%=member.name%> <%=member.size%> (<%=member.state%>)</td>
<% end %>
</tr></table>
</td>
</tr>
<tr style="height:0px" />
<% style = not style
end %>
</table>
</div>
<% end %>
@@ -0,0 +1,228 @@
<% local raid = {}
local devs = {}
local devinfo = {}
local colors = { "c0c0ff", "fbbd00", "e97c30", "a0e0a0", "b2c005", "e0c0ff" }
local mounts = nixio.fs.readfile("/proc/mounts")
local show_raid = 1
local show_disc = 1
if self then
if self.hide_raid then
show_raid = 0
end
if self.hide_disc then
show_disc = 0
end
end
function disp_size(s)
local units = { "kB", "MB", "GB", "TB" }
local i, unit
s = s / 2
for i, unit in ipairs(units) do
if (i == #units) or (s < 1024) then
return math.floor(s * 100) / 100 .. unit
end
s = s / 1024
end
end
function first_line(s)
local n = s:find("\n")
if n then
return s:sub(1, n-1)
end
return s
end
function get_fs(pname, status)
for r,raid in ipairs(raid) do
for m,member in ipairs(raid.members) do
if member.name == pname then
return "(raid member)"
end
end
end
local mounted_fs = mounts:match("\n[a-z/]*" .. pname .. " [^ ]* ([^ ]*)")
if mounted_fs then
if status == "standby" then
return "(" .. mounted_fs .. ")"
end
local df = luci.sys.exec("df /dev/" .. pname):match(" ([0-9]+)%% ")
return "(" .. mounted_fs .. " " .. df .. "%)"
end
if status == "standby" then
return
end
local blkid = luci.sys.exec(" blkid -s TYPE /dev/" .. pname):match("TYPE=\"(.*)\"")
if blkid then
return "(" .. blkid .. ")"
end
end
function get_status(raid)
for m,member in ipairs(raid.members) do
for d,dev in ipairs(devinfo) do
if member.name == dev.name then
return dev.status
end
for p,part in ipairs(dev.parts) do
if member.name == part.name then
return dev.status
end
end
end
end
end
function get_parts(dev,status,size)
local c = 1
local unused = size
local parts = {}
for part in nixio.fs.glob("/sys/block/" .. dev .."/" .. dev .. "*") do
local pname = nixio.fs.basename(part)
local psize = nixio.fs.readfile(part .. "/size")
table.insert(parts, {name=pname, size=psize, perc=math.floor(psize*100/size), fs=get_fs(pname,status), color=colors[c]})
c = c + 1
unused = unused - psize
end
if unused > 2048 then
table.insert(parts, { name="", fs=get_fs(dev,status), size=unused, color=colors[c] })
end
return parts
end
for dev in nixio.fs.glob("/sys/block/*") do
if nixio.fs.access(dev .. "/md") then
local name = nixio.fs.basename(dev)
local rlevel = first_line(nixio.fs.readfile(dev .. "/md/level"))
local ndisks = tonumber(nixio.fs.readfile(dev .. "/md/raid_disks"))
local size = tonumber(nixio.fs.readfile(dev .. "/size"))
local metav = nixio.fs.readfile(dev .. "/md/metadata_version")
local degr = tonumber(nixio.fs.readfile(dev .. "/md/degraded"))
local sync = first_line(nixio.fs.readfile(dev .. "/md/sync_action"))
local sync_speed = tonumber(nixio.fs.readfile(dev .. "/md/sync_speed"))
local sync_compl = nixio.fs.readfile(dev .. "/md/sync_completed")
local status = "active"
if sync ~= "idle" then
local progress, total = nixio.fs.readfile(dev .. "/md/sync_completed"):match("^([0-9]*)[^0-9]*([0-9]*)")
local rem = (total - progress) / sync_speed / 2
local rems = math.floor(rem % 60)
if rems < 10 then rems = "0" .. rems end
rem = math.floor(rem / 60)
local remm = math.floor(rem % 60)
if remm < 10 then remm = "0" .. remm end
local remh = math.floor(rem / 60)
local remstr = remh .. ":" .. remm .. ":" .. rems
status = sync .. " (" .. math.floor(sync_speed/1024) .. "MB/s, " .. math.floor(progress * 1000 / total) /10 .. "%, rem. " .. remstr .. ")"
elseif degr == 1 then
status = "degraded"
end
local members = {}
local c = 1
for member in nixio.fs.glob("/sys/block/" .. name .. "/md/dev-*") do
local dname = nixio.fs.basename(nixio.fs.readlink(member .. "/block"))
local dsize = disp_size(tonumber(nixio.fs.readfile(member .. "/block/size")))
local dstate = nixio.fs.readfile(member .. "/state"):gsub("_", " "):match "^%s*(.-)%s*$"
table.insert(members, { name = dname, size = dsize, state = dstate, color = colors[c] })
c = c + 1
end
table.insert(raid, {name=name, rlevel=rlevel, ndisks=ndisks, size=size, metav=metav, status=status, members=members })
end
end
if show_disc == 1 then
for dev in nixio.fs.glob("/sys/class/nvme/*/device/nvme/*") do
local section
local model = nixio.fs.readfile(dev .. "/model")
local fw = nixio.fs.readfile(dev .. "/firmware_rev")
for bdev in nixio.fs.glob(dev .. "/nvme*") do
local section
local name = nixio.fs.basename(bdev)
local size = tonumber(nixio.fs.readfile(bdev .. "/size"))
local unused = size
local status = "-"
local temp = "-"
local serial = "-"
local secsize = "-"
for _,line in ipairs(luci.util.execl("smartctl -A -i -d nvme -n standby -f brief /dev/" .. name)) do
local attrib, val
if section == 1 then
attrib, val = line:match "^(.*):%s*(.*)"
elseif section == 2 then
attrib, val = line:match("^([0-9 ]*) [^ ]* * [POSRCK-]* *[0-9-]* *[0-9-]* *[0-9-]* *[0-9-]* *([0-9-]*)")
else
attrib = line:match "^=== START OF (.*) SECTION ==="
if attrib == "INFORMATION" then
section = 1
elseif attrib == "READ SMART DATA" then
section = 2
elseif status == "-" then
val = line:match "^Device is in (.*) mode"
if val then
status = val:lower()
end
end
end
if not attrib then
if section ~= 2 then section = 0 end
elseif (attrib == "Power mode is") or (attrib == "Power mode was") then
status = val:lower():match "(%S*)"
elseif attrib == "Serial Number" then
serial = val
elseif attrib == "194" then
temp = val .. "&deg;C"
end
end
table.insert(devinfo, {name=name, model=model, fw=fw, size=size, serial=serial, parts=get_parts(name,status,size) })
end
end
end
if show_raid == 1 and #devinfo > 0 then %>
<div class="cbi-section">
<h3><%:NVMe SSD%></h3>
<table class="cbi-section-table" style="white-space: nowrap">
<tr>
<th width="5%">&nbsp;</th>
<th width="30%"><%:Model%></th>
<th width="25%"><%:Serial number%></th>
<th width="20%"><%:Firmware%></th>
<th width="20%"><%:Capacity%></th>
<!-- <th width="10%"><%:Temperature%></th>-->
</tr>
<% local style=true
for d,dev in ipairs(devinfo) do %>
<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
<td class="cbi-vluae-field" style="padding-bottom:0px; border-bottom-width:0px; vertical-align:middle" rowspan="4"><%=dev.name%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.model%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.serial%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.fw%></td>
<td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=disp_size(dev.size)%></td>
<!-- <td class="cbi-value-field" style="padding-bottom:0px; border-bottom-width:0px" rowspan="2"><%=dev.temp%></td>-->
</tr>
<tr style="height:0px" />
<tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
<td style="padding:0px; border-top-width:0px" colspan="7" rowspan="2">
<table style="border: 0pt; border-collapse:collapse; width:100%; padding:0px; margin:0px"><tr>
<% for _,part in pairs(dev.parts) do %>
<td style="text-align:center; padding: 0px 4px; border-radius: 3px; background-color:#<%=part.color%>" width="<%=part.perc%>%"><%=part.name%> <%=disp_size(part.size)%> <%=part.fs%></td>
<% end %>
</tr></table>
</td>
</tr>
<tr style="height:0px" />
<% style = not style
end %>
</table>
</div>
<% end %>
@@ -0,0 +1,3 @@
config status
option version '0'
option base '1'
@@ -0,0 +1,6 @@
#!/bin/sh
[ "${ACTION}" = "add" ] && {
/sbin/wifi config
[[ -z "$(uci -q get base_config.@status[0].wifi)" ]] && . /sbin/mywifi &
}
@@ -0,0 +1,42 @@
server
{
listen 8877;
#listen 443 ssl http2;
server_name _lan;
index index.html index.htm index.php default.html default.htm default.php;
root /data;
# ssl_certificate /etc/acme/supes.top/fullchain.cer;
# ssl_certificate_key /etc/acme/supes.top/supes.top.key;
# ssl_session_timeout '64m';
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_prefer_server_ciphers on;
# ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
# ssl_session_cache 'shared:SSL:10m';
client_max_body_size 0;
location / {
set $dest $http_destination;
if (-d $request_filename) {
rewrite ^(.*[^/])$ $1/;
set $dest $dest/;
}
if ($request_method ~ (MOVE|COPY)) {
more_set_input_headers 'Destination: $dest';
}
if ($request_method ~ MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;
create_full_put_path on;
auth_basic "Restricted access";
auth_basic_user_file /etc/nginx/htpasswd.conf;
}
}
@@ -0,0 +1 @@
root:fU70Nx.37Ofww
@@ -0,0 +1,121 @@
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export LANG=zh_CN.UTF-8
THIS_SCRIPT="sysinfo"
MOTD_DISABLE=""
SHOW_IP_PATTERN="^[ewr].*|^br.*|^lt.*|^umts.*"
DATA_STORAGE=/userdisk/data
MEDIA_STORAGE=/userdisk/snail
# don't edit below here
function display()
{
# $1=name $2=value $3=red_limit $4=minimal_show_limit $5=unit $6=after $7=acs/desc{
# battery red color is opposite, lower number
if [[ "$1" == "Battery" ]]; then
local great="<";
else
local great=">";
fi
if [[ -n "$2" && "$2" > "0" && (( "${2%.*}" -ge "$4" )) ]]; then
printf "%-14s%s" "$1:"
if awk "BEGIN{exit ! ($2 $great $3)}"; then
echo -ne "\e[0;91m $2";
else
echo -ne "\e[0;92m $2";
fi
printf "%-1s%s\x1B[0m" "$5"
printf "%-11s%s\t" "$6"
return 1
fi
} # display
function get_ip_addresses()
{
local ips=()
for f in /sys/class/net/*; do
local intf=$(basename $f)
# match only interface names starting with e (Ethernet), br (bridge), w (wireless), r (some Ralink drivers use ra<number> format)
if [[ $intf =~ $SHOW_IP_PATTERN ]]; then
local tmp=$(ip -4 addr show dev $intf | awk '/inet/ {print $2}' | cut -d'/' -f1)
# add both name and IP - can be informative but becomes ugly with long persistent/predictable device names
#[[ -n $tmp ]] && ips+=("$intf: $tmp")
# add IP only
[[ -n $tmp ]] && ips+=("$tmp")
fi
done
echo "${ips[@]}"
} # get_ip_addresses
function storage_info()
{
# storage info
RootInfo=$(df -h /)
root_usage=$(awk '/\// {print $(NF-1)}' <<<${RootInfo} | sed 's/%//g')
root_total=$(awk '/\// {print $(NF-4)}' <<<${RootInfo})
} # storage_info
# query various systems and send some stuff to the background for overall faster execution.
# Works only with ambienttemp and batteryinfo since A20 is slow enough :)
storage_info
critical_load=$(( 1 + $(grep -c processor /proc/cpuinfo) / 2 ))
# get uptime, logged in users and load in one take
UptimeString=$(uptime | tr -d ',')
time=$(awk -F" " '{print $3" "$4}' <<<"${UptimeString}")
load="$(awk -F"average: " '{print $2}'<<<"${UptimeString}")"
case ${time} in
1:*) # 1-2 hours
time=$(awk -F" " '{print $3" 小时"}' <<<"${UptimeString}")
;;
*:*) # 2-24 hours
time=$(awk -F" " '{print $3" 小时"}' <<<"${UptimeString}")
;;
*day) # days
days=$(awk -F" " '{print $3"天"}' <<<"${UptimeString}")
time=$(awk -F" " '{print $5}' <<<"${UptimeString}")
time="$days "$(awk -F":" '{print $1"小时 "$2"分钟"}' <<<"${time}")
;;
esac
# memory and swap
mem_info=$(LC_ALL=C free -w 2>/dev/null | grep "^Mem" || LC_ALL=C free | grep "^Mem")
memory_usage=$(awk '{printf("%.0f",(($2-($4+$6))/$2) * 100)}' <<<${mem_info})
memory_total=$(awk '{printf("%d",$2/1024)}' <<<${mem_info})
swap_info=$(LC_ALL=C free -m | grep "^Swap")
swap_usage=$( (awk '/Swap/ { printf("%3.0f", $3/$2*100) }' <<<${swap_info} 2>/dev/null || echo 0) | tr -c -d '[:digit:]')
swap_total=$(awk '{print $(2)}' <<<${swap_info})
c=0
while [ ! -n "$(get_ip_addresses)" ];do
[ $c -eq 3 ] && break || let c++
sleep 1
done
ip_address="$(get_ip_addresses)"
# display info
display "系统负载" "${load%% *}" "${critical_load}" "0" "" "${load#* }"
printf "运行时间: \x1B[92m%s\x1B[0m\t\t" "$time"
echo "" # fixed newline
display "内存已用" "$memory_usage" "70" "0" " %" " of ${memory_total}MB"
display "交换内存" "$swap_usage" "10" "0" " %" " of $swap_total""Mb"
printf "IP 地址: \x1B[92m%s\x1B[0m" "$ip_address"
echo "" # fixed newline
display "系统存储" "$root_usage" "90" "1" "%" " of $root_total"
if [ -x /sbin/cpuinfo ]; then
printf "CPU 信息: \x1B[92m%s\x1B[0m\t" "$(echo `/sbin/cpuinfo | cut -d ' ' -f -4`)"
fi
echo ""
echo ""
@@ -0,0 +1,14 @@
#!/bin/sh /etc/rc.common
[[ -f "/bin/coremark" && ! -f "/etc/bench.log" && "$(uci -q get wizard.default.coremark)" == '1' ]] && {
(
sleep 5
while :; do
[ -f /var/lock/opkg.lock ] || {
/sbin/cpumark
break;
}
sleep 1
done
) &
}
@@ -0,0 +1,245 @@
#!/bin/sh
sed -i "s/op.supes.top/dl.openwrt.ai/" /etc/opkg/distfeeds.conf
[ -x /bin/bash ] && grep -q "/bin/ash" /etc/passwd && {
sed -i 's|/bin/ash|/bin/bash|g' "/etc/passwd"
ln -sf /bin/bash /bin/sh
touch /root/.bash_history
ln -sf /root/.bash_history /tmp/.busybox_ash_history
}
version=$(uci -q get base_config.@status[0].version)
hostname=$(uci -q get system.@system[0].hostname)
[ -n "${hostname}" ] || hostname="Kwrt"
if [ "$(uci -q get dhcp.@dnsmasq[0].port)" != "53" ]; then
uci -q set dhcp.@dnsmasq[0].port='53'
uci commit dhcp
fi
sed -i '/profile.d/d' /lib/upgrade/keep.d/base-files
if ! echo "$(uci -q get uhttpd.main.index_page)" | grep -q "cgi-bin/luci"; then
uci -q add_list uhttpd.main.index_page='cgi-bin/luci'
uci commit uhttpd
fi
if [ "$(uci -q get dropbear.main._direct)" != "1" ] && [ -n "$(uci -q get dropbear.main.Interface)" ]; then
uci del dropbear.main.Interface
uci commit dropbear
fi
[ -x /usr/bin/wget ] && [ ! -x /usr/bin/wget-ssl ] && \
ln -s /usr/bin/wget /usr/bin/wget-ssl
sed -i "s/git-.*-\(.*\)/git-\1/g" /usr/lib/lua/luci/version.lua
if [ -f /etc/uwsgi/vassals/luci-webui.ini ]; then
processor=$(grep -c 'processor' /proc/cpuinfo)
[ -n "$processor" ] && [ "$processor" -gt 0 ] || processor=3
sed -i "/^threads =/c\threads = $processor" /etc/uwsgi/vassals/luci-webui.ini
fi
if [ -f /etc/config/attendedsysupgrade ]; then
uci -q set attendedsysupgrade.server.url='https://openwrt.ai'
uci commit attendedsysupgrade
fi
if [ -z "$version" ] || [ "$version" -lt 1 ]; then
uci -q set luci.main.lang='auto'
uci -q set luci.main.mediaurlbase=/luci-static/argon
uci commit luci
if uci -q get system.@system[0] >/dev/null; then
uci -q set system.@system[0].zonename='Asia/Shanghai'
uci -q set system.@system[0].timezone='CST-8'
uci -q set system.@system[0].conloglevel='4'
uci -q set system.@system[0].cronloglevel='8'
uci -q set system.@system[0].ttylogin='1'
uci -q del system.ntp.server
uci -q add_list system.ntp.server='ntp.aliyun.com'
uci -q add_list system.ntp.server='0.openwrt.pool.ntp.org'
uci commit system
fi
uci -q set uhttpd.main.rfc1918_filter=0
uci -q set uhttpd.main.redirect_https=0
uci -q set uhttpd.main.script_timeout='120'
uci commit uhttpd
uci -q set upnpd.config.enabled='1'
uci commit upnpd
(echo "root"; sleep 1; echo "root") | /bin/busybox passwd root >/dev/null 2>&1 &
uci -q set firewall.@defaults[0].flow_offloading='1'
uci -q set firewall.@defaults[0].flow_offloading_hw='1'
uci commit firewall
uci -q set upnpd.config.enabled='1'
uci commit upnpd
grep -q log-facility /etc/dnsmasq.conf || \
echo "log-facility=/dev/null" >> /etc/dnsmasq.conf
#kernel_version=$(uname -r)
#if [ -f "/lib/modules/$kernel_version/xt_FULLCONENAT.ko" ] || [ -f "/lib/modules/$kernel_version/nft_fullcone.ko" ]; then
# uci -q set firewall.@defaults[0].fullcone='1'
# uci commit firewall
#fi
uci -q set fstab.@global[0].anon_mount=1
uci commit fstab
uci -q set network.globals.packet_steering=1
uci -q set network.@device[0].promisc=1
uci commit network
uci -q set dhcp.@dnsmasq[0].dns_redirect='1'
uci -q set dhcp.@dnsmasq[0].allservers='1'
uci -q del dhcp.@dnsmasq[0].noresolv
uci -q set dhcp.@dnsmasq[0].cachesize='1500'
uci -q set dhcp.@dnsmasq[0].min_ttl='3600'
uci -q set dhcp.lan.force='1'
uci -q set dhcp.lan.ra='hybrid'
uci -q set dhcp.lan.ndp='hybrid'
uci -q set dhcp.lan.dhcpv6='hybrid'
uci commit dhcp
uci -q set nft-qos.default.limit_enable='0'
uci commit nft-qos
fi
# kB
memtotal=$(grep MemTotal /proc/meminfo | awk '{print $2}')
if [ "$memtotal" -ge 1048576 ]; then
# > 1024M
cachesize=10000
dnsforwardmax=10000
nf_conntrack_max=262144
elif [ "$memtotal" -ge 524288 ]; then
# <= 1024M
cachesize=10000
dnsforwardmax=10000
nf_conntrack_max=131072
elif [ "$memtotal" -ge 262144 ]; then
# <= 512M
cachesize=8192
dnsforwardmax=8192
nf_conntrack_max=65536
elif [ "$memtotal" -ge 131072 ]; then
# <= 256M
cachesize=4096
dnsforwardmax=4096
nf_conntrack_max=65536
elif [ "$memtotal" -ge 65536 ]; then
# <= 128M
cachesize=2048
dnsforwardmax=2048
nf_conntrack_max=32768
else
# < 64M
cachesize=1024
dnsforwardmax=1024
nf_conntrack_max=16384
fi
if [ -z "$version" ] || [ "$version" -lt 1 ]; then
uci -q get dhcp.@dnsmasq[0] || uci -q add dhcp dnsmasq
uci -q set dhcp.@dnsmasq[0].cachesize="$cachesize"
uci -q set dhcp.@dnsmasq[0].dnsforwardmax="$dnsforwardmax"
uci -q set dhcp.@dnsmasq[0].localservice='0'
uci -q set dhcp.@dnsmasq[0].localise_queries='1'
uci -q set dhcp.@dnsmasq[0].rebind_protection='0'
uci -q set dhcp.@dnsmasq[0].rebind_localhost='1'
uci commit dhcp
uci -q set system.@system[0].zram_comp_algo='zstd'
uci -q set system.@system[0].zram_size_mb="$((memtotal / 1024 / 3))"
uci commit system
# sysctl overwrite
SYSCTL_LOCAL=/etc/sysctl.d/50-local.conf
mkdir -p /etc/sysctl.d
> "$SYSCTL_LOCAL"
echo "net.nf_conntrack_max=$nf_conntrack_max" >> "$SYSCTL_LOCAL"
echo "net.core.rmem_max=$nf_conntrack_max" >> "$SYSCTL_LOCAL"
if [ -n "$(command -v nginx)" ]; then
uci add wizard shortcuts
uci set wizard.@shortcuts[-1].shortcut='pw'
uci set wizard.@shortcuts[-1].to_url='http://10.0.0.1/cgi-bin/luci/admin/services/passwall'
uci set wizard.@shortcuts[-1].comments='passwall'
uci commit wizard
uci -q set nginx._sc_pw=server
uci -q set nginx._sc_pw.server_name="pw"
uci -q add_list nginx._sc_pw.listen="80"
uci -q add_list nginx._sc_pw.listen="443"
uci -q set nginx._sc_pw.return="302 http://10.0.0.1/cgi-bin/luci/admin/services/passwall"
uci -q set dhcp._sc_pw=domain
uci -q set dhcp._sc_pw.name="pw"
uci -q set dhcp._sc_pw.ip="10.0.0.1"
uci -q set dhcp._sc_pw.comments="PassWall"
uci commit dhcp
fi
if [ -z "$(uci -q get dhcp._ta)" ]; then
uci -q set dhcp._ta=domain
uci -q set dhcp._ta.name="time.android.com"
uci -q set dhcp._ta.ip="203.107.6.88"
uci -q set dhcp._ta.comments="time.android"
uci commit dhcp
fi
version=1
fi
if [ -z "$(uci -q get dhcp.default_server)" ]; then
uci -q set dhcp.default_server=domain
uci -q set dhcp.default_server.name='kwrt'
uci -q set dhcp.default_server.ip='10.0.0.1'
uci -q set dhcp.default_server.comments='后台地址'
uci commit dhcp
fi
if [ -n "$(command -v nginx)" ]; then
if [ -z "$(uci -q get nginx.default_server)" ]; then
uci -q set nginx.default_server=server
uci -q set nginx.default_server.server_name='kwrt'
uci -q add_list nginx.default_server.listen='80 default_server'
uci -q add_list nginx.default_server.listen='[::]:80 default_server'
uci -q add_list nginx.default_server.include='conf.d/*.locations'
uci -q set nginx.default_server.access_log='off; # logd openwrt'
uci commit nginx
fi
grep -q "uwsgi_read_timeout" /etc/nginx/conf.d/luci.locations 2>/dev/null || {
sed -i "s/include uwsgi_params;/include uwsgi_params;\n\t\tuwsgi_read_timeout 300s;/" /etc/nginx/conf.d/luci.locations
sed -i '/ubus_parallel_req/a\ ubus_script_timeout 600;' /etc/nginx/conf.d/luci.locations
}
sed -i \
-e "s/client_max_body_size 128M/client_max_body_size 3072M/" \
-e "s/large_client_header_buffers 2 1k/large_client_header_buffers 4 512k/" \
/etc/nginx/uci.conf.template
grep -q "client_body_buffer_size" /etc/nginx/uci.conf.template || \
sed -i "/large_client_header_buffers/a\ client_body_buffer_size 128K;" /etc/nginx/uci.conf.template
fi
rm -rf /tmp/luci-*
uci -q set base_config.@status[0].version="$version"
uci commit base_config
grep -q "cgi-timeout" /etc/uwsgi/vassals/luci-*.ini 2>/dev/null || sed -i '$a cgi-timeout = 500' /etc/uwsgi/vassals/luci-*.ini
sed -i "s/limit-as = 1000/limit-as = 5000/g" /etc/uwsgi/vassals/luci-webui.ini
modprobe xt_FULLCONENAT || {
if ! iptables -L -t nat 2>/dev/null | grep -q "FULLCONENAT"; then
uci -q set firewall.@defaults[0].fullcone='0'
uci commit firewall
fi
}
+3
View File
@@ -0,0 +1,3 @@
#!/bin/ash
/bin/coremark | grep "CoreMark 1.0" | cut -d "/" -f 1 | cut -d "." -f -2 | sed -e 's/CoreMark 1.0\(.*\)/(CpuMark\1 Scores)/g' | tee /etc/bench.log
+55
View File
@@ -0,0 +1,55 @@
#!/bin/sh
board_name() {
[ -e /tmp/sysinfo/board_name ] && cat /tmp/sysinfo/board_name || echo "generic"
}
wifi_setup_radio(){
local radio=$1
htmode="$(uci -q get wireless.${radio}.htmode)"
if uci -q get wireless.${radio} >/dev/null; then
uci -q del wireless.${radio}.disabled
uci -q set wireless.${radio}.country='CN'
if [ "$(uci -q get wireless.${radio}.band)" = "5g" ]; then
uci -q set wireless.default_${radio}.ssid="${SSID}_5G"
if [[ "$DISTRIB_TARGET" == *ipq60xx ]]; then
uci set wireless.${radio}.htmode='HE80'
fi
elif [ "$(uci -q get wireless.${radio}.band)" = "2g" ]; then
uci -q set wireless.default_${radio}.ssid="${SSID}_2.4G"
fi
uci -q set wireless.default_${radio}.device="${radio}"
SSID_PASSWD="${SSID_PASSWD:-$(uci -q get wireless.default_${radio}.key)}"
if [ "${SSID_PASSWD}" ]; then
uci -q set wireless.default_${radio}.encryption='psk2'
uci -q set wireless.default_${radio}.key="${SSID_PASSWD}"
else
uci -q set wireless.default_${radio}.encryption='none'
fi
fi
}
for i in $(seq 1 10); do
[[ "$(uci -q get base_config.@status[0].inited)" == 1 && "$(cat /etc/config/wireless)" ]] && break
[ "$(cat /etc/config/wireless)" ] || /sbin/wifi config
sleep 1s
done
if [[ "$(cat /etc/config/wireless)" ]]; then
. /etc/openwrt_release
SSID="$(uci -q get wizard.default.wifi_ssid || uci -q get system.@system[0].hostname || echo Kwrt)"
SSID_PASSWD="$(uci -q get wizard.default.wifi_key)"
sed -i '/option disabled/d' /etc/config/wireless
[ "$(uci -q get wireless.radio1.band)" == "5g" ] && uci -q set wireless.radio0.band="2g"
widx=0
while uci rename wireless.@wifi-iface[$widx]=default_radio$widx >/dev/null 2>&1; do widx=$((widx+1)); done
for radio in radio0 radio1 radio2 radio3; do
wifi_setup_radio ${radio}
done
uci commit wireless
uci -q set base_config.@status[0].wifi=1
uci commit base_config
/sbin/wifi reload
fi
+68
View File
@@ -0,0 +1,68 @@
#!/bin/ash
# 默认使用关机命令
ACTION="poweroff"
# 获取shutdown参数
# Qemu-GA 默认调用 -h -P +0的方式
while [ -n "$1" ]; do
case "$1" in
-r)
ACTION="reboot"
shift
;;
-k)
ACTION="warning"
shift
;;
-h|-H)
ACTION="halt"
shift
;;
-n)
ACTION="poweroff"
shift
;;
-c)
echo "Cancel shutdown, but not support the Openwrt!" > /dev/kmsg
ACTION="stop"
shift
;;
-p|-P)
ACTION="poweroff"
shift
;;
-*)
shift
;;
*)
break
;;
esac
done
if [ $# == 0 ]; then
echo "Shutting down without any params" > /dev/kmsg
/sbin/poweroff
elif [ "$ACTION" = "poweroff" ]; then
/sbin/poweroff;
elif [ "$ACTION" = "reboot" ]; then
/sbin/reboot
elif [ "$ACTION" = "warning" ]; then
echo "关机警告">/dev/kmsg
/sbin/poweroff;
elif [ "$ACTION" = "halt" ]; then
/sbin/halt
fi
@@ -0,0 +1,14 @@
<% if luci.sys.exec("echo -n `uci -q get base_config.@status[0].links`") ~= "0" then %>
<script>
var links = document.createElement('div');
links.innerHTML ='<table class="table"><tr class="tr"><td class="td left"><a href="https://openwrt.ai/" target="_blank">固件下载与定制</a></td><td class="td left" width="25%"><a href="https://openwrt.ai/fadian/" target="_blank" style="color:orangered">赞助</a></td><td class="td left" width="25%"><a href="https://t.me/opwrt" target="_blank">TG频道</a></td><td class="td left" width="25%"><a href="https://github.com/kiddin9/OpenWrt_x86-r2s-r4s" target="_blank">源码与反馈</a></td></tr></table>';
setTimeout(function(){
var telegram = document.querySelectorAll(".cbi-section")[0];
telegram.appendChild(links);
}, 1500);
setTimeout(function(){
var telegram = document.querySelectorAll(".cbi-section")[0];
telegram.appendChild(links);
}, 2400);
</script>
<%end%>
@@ -0,0 +1,45 @@
'use strict';
'require rpc';
var callCPUFreeInfo = rpc.declare({
object: 'luci',
method: 'getCPUUsage'
});
function progressbar(value, max) {
var vn = parseInt(value) || 0,
mn = parseInt(max) || 100,
pc = Math.floor((100 / mn) * vn);
return E('div', {
'class': 'cbi-progressbar',
'title': '%s%% / %s%%'.format(vn, mn, pc)
}, E('div', { 'style': 'width:%.2f%%'.format(pc) }));
}
return L.Class.extend({
title: _('CPU'),
load: function() {
return L.resolveDefault(callCPUFreeInfo(), {});
},
render: function(info) {
var fields = [
_('Used'), (info.cpuusage) ? info.cpuusage : 0, 100
];
var table = E('table', { 'class': 'table cpu' });
for (var i = 0; i < fields.length; i += 3) {
table.appendChild(E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]),
E('td', { 'class': 'td left' }, [
(fields[i + 1] != null) ? progressbar(fields[i + 1], fields[i + 2], true) : '?'
])
]));
}
return table;
}
});
+209
View File
@@ -0,0 +1,209 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2021-04-12 14:21+0000\n"
"Language: zh_Hans\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.5-dev\n"
msgid "Processor"
msgstr "处理器"
msgid "Architecture"
msgstr "架构"
msgid "CPU Temperature"
msgstr "CPU 温度"
msgid "Temperature"
msgstr "温度"
msgid "CPU Info"
msgstr "CPU 信息"
msgid "CPU Model"
msgstr "处理器型号"
msgid "CPU frequency"
msgstr "CPU 频率"
msgid "RAM frequency"
msgstr "RAM 频率"
msgid "Flash Size"
msgstr "闪存大小"
msgid "Free Memory"
msgstr "释放内存"
msgid "RUNNING"
msgstr "运行中"
msgid "NOT RUNNING"
msgstr "未运行"
msgid "ZRam Settings"
msgstr "ZRam 设置"
msgid "ZRam Compression Algorithm"
msgstr "ZRam 压缩算法"
msgid "ZRam Compression Streams"
msgstr "ZRam 压缩数据流线程数"
msgid "ZRam Size"
msgstr "ZRam 大小"
msgid "Size of the ZRam device in megabytes"
msgstr "划分给 ZRam 分区的内存大小(MB),推荐留空由系统自动管理"
msgid "Number of parallel threads used for compression"
msgstr "用于压缩内存数据的CPU并发线程数"
msgid "Swap"
msgstr "虚拟内存"
msgid "Swap used"
msgstr "已用交换区"
msgid "Force 40MHz mode"
msgstr "强制 40MHz 频宽"
msgid ""
"Always use 40MHz channels even if the secondary channel overlaps. Using this "
"option does not comply with IEEE 802.11n-2009!"
msgstr "强制启用 40MHz 频宽并忽略辅助信道重叠。此选项可能不兼容某些无线硬件导致无法启用!"
msgid "Disassociate On Low Acknowledgement"
msgstr "弱信号剔除"
msgid "Allow AP mode to disconnect STAs based on low ACK condition"
msgstr "允许 AP 模式基于低 ACK 条件判断剔除弱信号的客户端"
msgid "Running Status"
msgstr "运行状况"
msgid "Online Users"
msgstr "在线用户数"
msgid "DNS Redirect"
msgstr "DNS 重定向"
msgid "Redirect client DNS to dnsmasq"
msgstr "重定向客户端DNS到dnsmasq"
msgid "Enable 256-QAM"
msgstr "启用 256-QAM"
msgid "802.11n 2.4Ghz Only"
msgstr "只适合 802.11n 2.4Ghz"
msgid "Enables The 802.11k standard provides information to discover the best available access point"
msgstr "启用 802.11k 自动寻找发现最佳可用接入点的信息"
msgid "Enable neighbor report via radio measurements"
msgstr "启用无线电测量邻居报告"
msgid "Enable beacon report via radio measurements"
msgstr "启用无线电测量信标报告"
msgid "Enables 802.11v allows client devices to exchange information about the network topology,tating overall improvement of the wireless network."
msgstr "启用 802.11v 将允许客户端设备交换有关网络拓扑的信息,从而全面改善无线网络漫游"
msgid "extended sleep mode for stations"
msgstr "扩展无线休眠节能模式"
msgid "BSS Transition Management"
msgstr "BSS 传输管理"
msgid "UTC time at which the TSF timer is 0"
msgstr "TSF计时器为0的UTC时间"
msgid "Time advertisement"
msgstr "广播同步时间"
msgid "time zone"
msgstr "时区"
msgid "Local time zone as specified in 8.3 of IEEE Std 1003.1-2004"
msgstr "本地时区采用 IEEE Std 1003.1-2004 的 8.3 格式(例如 UTC8)"
msgid "Custom Redirect Domain"
msgstr "自定义挟持域名"
msgid "Define a custom domain name and the corresponding PTR record"
msgstr "自定义域名对应的IP地址(需要客户端DNS指向本路由)"
msgid "Domain Name"
msgstr "域名(不带 HTTP(S)://)"
msgid "Comments"
msgstr "备注"
msgid "Packet Steering"
msgstr "数据包引导"
msgid "Enable packet steering across all CPUs. May help or hinder network speed."
msgstr "启用所有CPU的数据包控制。 可能有助于或阻碍网络速度。"
msgid "Disable IPv6 DNS forwards"
msgstr "禁止解析 IPv6 DNS 记录"
msgid "Filter IPv6(AAAA) DNS Query Name Resolve"
msgstr "过滤掉 IPv6(AAAA) ,只返回 IPv4 DNS 域名记录"
msgid "Minimum TTL to send to clients"
msgstr "客户端缓存的最小 DNS TTL"
msgid "Modify DNS entries minimum TTL (max is 86400, 0 is no modify)"
msgstr "修改发送到客户端的域名记录的 TTL 时间 (最大 86400, 0 表示不修改)"
msgid "FullCone NAT"
msgstr "全锥形 NAT"
msgid "Using FullCone NAT can improve gaming performance effectively"
msgstr "使用全锥形 NAT 可以有效提升游戏体验"
msgid "Used space"
msgstr "已用空间"
msgid "Upgrade all…"
msgstr "更新所有软件包 (谨慎)"
msgid "Expose WAN"
msgstr "暴露至公网"
msgid "Ports to Expose"
msgstr "需要暴露至公网的端口"
msgid "Danger! Proceed at your own risk."
msgstr "危险! 风险自担."
msgid "Multiple ports can be, separated by spaces, format: 80 81 82"
msgstr "可多端口,空格隔开,格式:80 81 82"
msgid "Expose SSH"
msgstr "暴露SSH至公网"
msgid "Expose Backend"
msgstr "暴露后台管理至公网"
msgid "Enable FullCone NAT"
msgstr "开启 FullCone NAT"
msgid "Enable FullCone NAT6"
msgstr "开启 FullCone NAT6"
msgid "Ethernet Information"
msgstr "网口信息"
msgid "Force redirect all local DNS queries to DNSMasq, a.k.a. DNS Hijacking."
msgstr "强制将所有本地 DNS 查询重定向到 DNSMasq,即 DNS 劫持。"
msgid "Auto Share"
msgstr "自动共享"
msgid "Auto share local disk which connected"
msgstr "自动匿名共享路由器所连接的硬盘"
+178
View File
@@ -0,0 +1,178 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2021-04-12 14:21+0000\n"
"Language: zh_Hant\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.5-dev\n"
msgid "Processor"
msgstr "處理器"
msgid "Architecture"
msgstr "架構"
msgid "CPU Temperature"
msgstr "CPU 溫度"
msgid "CPU Info"
msgstr "CPU 資訊"
msgid "CPU Model"
msgstr "處理器型號"
msgid "CPU frequency"
msgstr "CPU 頻率"
msgid "RAM frequency"
msgstr "RAM 頻率"
msgid "Flash Size"
msgstr "閃存大小"
msgid "Free Memory"
msgstr "釋放記憶體"
msgid "RUNNING"
msgstr "運行中"
msgid "NOT RUNNING"
msgstr "未運行"
msgid "ZRam Settings"
msgstr "ZRam 設置"
msgid "ZRam Compression Algorithm"
msgstr "ZRam 壓縮算法"
msgid "ZRam Compression Streams"
msgstr "ZRam 壓縮數據流線程數"
msgid "ZRam Size"
msgstr "ZRam 大小"
msgid "Size of the ZRam device in megabytes"
msgstr "劃分給 ZRam 分區的內存大小(MB),推薦留空由系統自動管理"
msgid "Number of parallel threads used for compression"
msgstr "用於壓縮內存數據的CPU並發線程數"
msgid "Swap"
msgstr "(虛擬記憶體)交換區"
msgid "Swap used"
msgstr "已啟用交換區"
msgid "Force 40MHz mode"
msgstr "強制 40MHz 頻寬"
msgid ""
"Always use 40MHz channels even if the secondary channel overlaps. Using this "
"option does not comply with IEEE 802.11n-2009!"
msgstr "強制啟用 40MHz 頻寬並忽略輔助信道重疊。此選項可能不兼容某些無線硬件導致無法啟用!"
msgid "Disassociate On Low Acknowledgement"
msgstr "弱信號剔除"
msgid "Allow AP mode to disconnect STAs based on low ACK condition"
msgstr "允許 AP 模式基於低 ACK 條件判斷剔除弱信號的客戶端"
msgid "Running Status"
msgstr "運行狀況"
msgid "Online Users"
msgstr "在線用戶數"
msgid "DNS Redirect"
msgstr "DNS 重定向"
msgid "Redirect client DNS to dnsmasq"
msgstr "重定向客戶端DNS到dnsmasq"
msgid "Enable 256-QAM"
msgstr "啟用 256-QAM"
msgid "802.11n 2.4Ghz Only"
msgstr "只適合 802.11n 2.4Ghz"
msgid "Enables The 802.11k standard provides information to discover the best available access point"
msgstr "啟用 802.11k 自動尋找發現最佳可用接入點的資訊"
msgid "Enable neighbor report via radio measurements"
msgstr "啟用無線電測量鄰居報告"
msgid "Enable beacon report via radio measurements"
msgstr "啟用無線電測量信標報告"
msgid "Enables 802.11v allows client devices to exchange information about the network topology,tating overall improvement of the wireless network."
msgstr "啟用 802.11v 將允許客戶端設備交換有關網絡拓撲的資訊,從而全面改善無線網絡漫遊"
msgid "extended sleep mode for stations"
msgstr "擴展無線休眠節能模式"
msgid "BSS Transition Management"
msgstr "BSS 傳輸管理"
msgid "UTC time at which the TSF timer is 0"
msgstr "TSF計時器為0的UTC時間"
msgid "Time advertisement"
msgstr "廣播同步時間"
msgid "time zone"
msgstr "時區"
msgid "Local time zone as specified in 8.3 of IEEE Std 1003.1-2004"
msgstr "本地時區採用 IEEE Std 1003.1-2004 的 8.3 格式(例如 UTC8)"
msgid "Custom Redirect Domain"
msgstr "自定義域名轉址"
msgid "Define a custom domain name and the corresponding PTR record"
msgstr "自定義域名對應的IP地址(需要客戶端DNS指向本路由)"
msgid "Domain Name"
msgstr "域名(不帶 HTTP(S)://)"
msgid "Comments"
msgstr "備註"
msgid "Packet Steering"
msgstr "數據包引導"
msgid "Enable packet steering across all CPUs. May help or hinder network speed."
msgstr "啟用所有CPU的數據包控制。 可能有助於或阻礙網路速度。"
msgid "Disable IPv6 DNS forwards"
msgstr "禁止解析 IPv6 DNS 記錄"
msgid "Filter IPv6(AAAA) DNS Query Name Resolve"
msgstr "過濾掉 IPv6(AAAA) ,只返回 IPv4 DNS 域名記錄"
msgid "Minimum TTL to send to clients"
msgstr "客戶端緩存的最小 DNS TTL"
msgid "Modify DNS entries minimum TTL (max is 86400, 0 is no modify)"
msgstr "修改發送到客戶端的域名記錄的 TTL 時間 (最大 86400, 0 表示不修改)"
msgid "FullCone NAT"
msgstr "完全錐形 NAT"
msgid "Using FullCone NAT can improve gaming performance effectively"
msgstr "使用完全錐形 NAT 可以有效提升遊戲體驗"
msgid "Used space"
msgstr "已用空間"
msgid "Upgrade all…"
msgstr "更新所有軟件包 (謹慎)"
msgid "Temperature"
msgstr "溫度"
msgid "Ethernet Information"
msgstr "乙太網路資訊"
msgid "Force redirect all local DNS queries to DNSMasq, a.k.a. DNS Hijacking."
msgstr "強制將所有本地 DNS 查詢轉址到 DNSMasq,即 DNS 劫持。"