🐤 Sync 2026-07-30 00:01:42

This commit is contained in:
github-actions[bot] 2026-07-30 00:01:42 +08:00
parent 93288fe344
commit c7db60401c
34 changed files with 472 additions and 290 deletions

View File

@ -6,8 +6,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=headscale
PKG_VERSION:=0.29.2
PKG_RELEASE:=6
PKG_VERSION:=0.29.3
PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/juanfont/headscale/tar.gz/v$(PKG_VERSION)?

View File

@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-log-viewer
PKG_VERSION:=1.5.0
PKG_RELEASE:=3
PKG_RELEASE:=4
LUCI_TITLE:=Advanced syslog and kernel log (tail, search, etc)
LUCI_DEPENDS:=+ucode +ucode-mod-fs
LUCI_PKGARCH:=all

View File

@ -11,29 +11,29 @@ Supported LuCI themes: luci-theme-bootstrap, luci-theme-material, luci-theme-ope
**OpenWrt >= 25.12:**
wget --no-check-certificate -O /tmp/luci-app-log-viewer-1.5.0-r3.apk https://github.com/gSpotx2f/packages-openwrt/raw/master/25.12/luci-app-log-viewer-1.5.0-r3.apk
apk --allow-untrusted add /tmp/luci-app-log-viewer-1.5.0-r3.apk
rm /tmp/luci-app-log-viewer-1.5.0-r3.apk
wget --no-check-certificate -O /tmp/luci-app-log-viewer-1.5.0-r4.apk https://github.com/gSpotx2f/packages-openwrt/raw/master/25.12/luci-app-log-viewer-1.5.0-r4.apk
apk --allow-untrusted add /tmp/luci-app-log-viewer-1.5.0-r4.apk
rm /tmp/luci-app-log-viewer-1.5.0-r4.apk
service rpcd restart
i18n-ru:
wget --no-check-certificate -O /tmp/luci-i18n-log-viewer-ru-1.5.0-r3.apk https://github.com/gSpotx2f/packages-openwrt/raw/master/25.12/luci-i18n-log-viewer-ru-1.5.0-r3.apk
apk --allow-untrusted add /tmp/luci-i18n-log-viewer-ru-1.5.0-r3.apk
rm /tmp/luci-i18n-log-viewer-ru-1.5.0-r3.apk
wget --no-check-certificate -O /tmp/luci-i18n-log-viewer-ru-1.5.0-r4.apk https://github.com/gSpotx2f/packages-openwrt/raw/master/25.12/luci-i18n-log-viewer-ru-1.5.0-r4.apk
apk --allow-untrusted add /tmp/luci-i18n-log-viewer-ru-1.5.0-r4.apk
rm /tmp/luci-i18n-log-viewer-ru-1.5.0-r4.apk
**OpenWrt <= 24.10:**
wget --no-check-certificate -O /tmp/luci-app-log-viewer_1.5.0-r3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/24.10/luci-app-log-viewer_1.5.0-r3_all.ipk
opkg install /tmp/luci-app-log-viewer_1.5.0-r3_all.ipk
rm /tmp/luci-app-log-viewer_1.5.0-r3_all.ipk
wget --no-check-certificate -O /tmp/luci-app-log-viewer_1.5.0-r4_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/24.10/luci-app-log-viewer_1.5.0-r4_all.ipk
opkg install /tmp/luci-app-log-viewer_1.5.0-r4_all.ipk
rm /tmp/luci-app-log-viewer_1.5.0-r4_all.ipk
service rpcd restart
i18n-ru:
wget --no-check-certificate -O /tmp/luci-i18n-log-viewer-ru_1.5.0-r3_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/24.10/luci-i18n-log-viewer-ru_1.5.0-r3_all.ipk
opkg install /tmp/luci-i18n-log-viewer-ru_1.5.0-r3_all.ipk
rm /tmp/luci-i18n-log-viewer-ru_1.5.0-r3_all.ipk
wget --no-check-certificate -O /tmp/luci-i18n-log-viewer-ru_1.5.0-r4_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/24.10/luci-i18n-log-viewer-ru_1.5.0-r4_all.ipk
opkg install /tmp/luci-i18n-log-viewer-ru_1.5.0-r4_all.ipk
rm /tmp/luci-i18n-log-viewer-ru_1.5.0-r4_all.ipk
## Screenshots:

View File

@ -6,6 +6,7 @@
"file": {
"/sbin/logread*": [ "exec" ],
"/usr/sbin/logread*": [ "exec" ],
"/usr/libexec/logread-ubox*": [ "exec" ],
"/bin/dmesg -r": [ "exec" ],
"/var/log/messages": [ "read" ],
"/var/log/secure": [ "read" ],

View File

@ -6,7 +6,8 @@
"file": {
"/sbin/logread*": [ "exec" ],
"/usr/sbin/logread*": [ "exec" ],
"/bin/dmesg -r": [ "exec" ]
"/bin/dmesg -r": [ "exec" ],
"/usr/libexec/logread-ubox*": [ "exec" ]
},
"ubus": {
"system": [ "info" ],

View File

@ -6,8 +6,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openlist2
PKG_VERSION:=1.0.2
PKG_RELEASE:=4
PKG_VERSION:=1.0.3
PKG_RELEASE:=5
LUCI_TITLE:=LuCI support for openlist
LUCI_DEPENDS:=+openlist2

View File

@ -215,6 +215,7 @@ return view.extend({
s.tab('s3', _('Object Storage'));
s.tab('ftp', _('FTP'));
s.tab('sftp', _('SFTP'));
s.tab('mcp', _('MCP'));
// init
o = s.taboption('basic', form.Flag, 'enabled', _('Enabled'));
@ -646,6 +647,11 @@ return view.extend({
o.default = 5222;
o.rmempty = false;
// mcp
o = s.taboption('mcp', form.Flag, 'mcp', _('Enabled MCP'),
_('Enable MCP (Model Context Protocol) server.'));
o.rmempty = false;
return m.render();
}
});

View File

@ -116,6 +116,10 @@ msgstr ""
msgid "SFTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218
msgid "MCP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220
msgid "Enabled"
msgstr ""
@ -608,6 +612,14 @@ msgstr ""
msgid "SFTP Port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:651
msgid "Enabled MCP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:652
msgid "Enable MCP (Model Context Protocol) server."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:20
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:29
msgid "No log data."

View File

@ -117,6 +117,10 @@ msgstr "FTP"
msgid "SFTP"
msgstr "SFTP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218
msgid "MCP"
msgstr "MCP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220
msgid "Enabled"
msgstr "启用"
@ -614,6 +618,14 @@ msgstr "启用 SFTP"
msgid "SFTP Port"
msgstr "SFTP 端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:651
msgid "Enabled MCP"
msgstr "启用 MCP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:652
msgid "Enable MCP (Model Context Protocol) server."
msgstr "启用 MCP模型上下文协议服务器。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:20
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:29
msgid "No log data."

View File

@ -117,6 +117,10 @@ msgstr "FTP"
msgid "SFTP"
msgstr "SFTP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218
msgid "MCP"
msgstr "MCP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220
msgid "Enabled"
msgstr "啟用"
@ -616,6 +620,14 @@ msgstr "啟用 SFTP"
msgid "SFTP Port"
msgstr "SFTP 埠"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:651
msgid "Enabled MCP"
msgstr "啟用 MCP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:652
msgid "Enable MCP (Model Context Protocol) server."
msgstr "啟用 MCP模型上下文協定伺服器。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:20
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:29
msgid "No log data."

View File

@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.7.24
PKG_RELEASE:=195
PKG_RELEASE:=196
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \

View File

@ -592,10 +592,6 @@ if singbox_tags:find("with_utls") then
o:depends({ [_n("reality")] = true })
end
o = s:option(Flag, _n("anytls_disable_reuse"), translate("Disable TLS Reuse"))
o.default = 0
o:depends({ [_n("protocol")] = "anytls" })
o = s:option(ListValue, _n("transport"), translate("Transport"))
o:value("tcp", "TCP")
o:value("http", "HTTP")

View File

@ -613,7 +613,6 @@ function gen_outbound(flag, node, tag, proxy_table)
idle_session_check_interval = "30s",
idle_session_timeout = "30s",
min_idle_session = 5,
disable_reuse = (node.anytls_disable_reuse == "1") and true or nil,
tls = tls
}
end

View File

@ -2198,6 +2198,3 @@ msgstr "Gecko 包大小(最大)"
msgid "valid time (hh:mm)"
msgstr "有效时间hh:mm"
msgid "Disable TLS Reuse"
msgstr "禁用 TLS 连接复用"

View File

@ -478,8 +478,6 @@ local function encode_anytls(node)
table.insert(p, "insecure=" .. (o.tls.insecure and "1" or "0"))
end
if node["disable-reuse"] then table.insert(p, "disable_reuse=1") end
if #p > 0 then
link = link .. "?" .. table.concat(p, "&")
end

View File

@ -1580,7 +1580,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
end
result.port = port
result.tls_allowInsecure = params.allowinsecure or params.insecure
result.anytls_disable_reuse = params.disable_reuse
end
elseif szType == 'naive+https' or szType == 'naive+quic' then
if has_singbox then

View File

@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
LUCI_NAME:=luci-app-tinyfilemanager
PKG_VERSION:=2.6
PKG_RELEASE:=3
PKG_RELEASE:=4
LUCI_TITLE:=LuCI Tiny File Manager
LUCI_DEPENDS:=+php8 +php8-cgi +php8-fastcgi +php8-fpm +php8-mod-session +php8-mod-ctype +php8-mod-fileinfo +php8-mod-zip +php8-mod-iconv +php8-mod-mbstring +coreutils-stat +zoneinfo-asia +bash +curl +tar +inotifywait
@ -22,7 +22,7 @@ define Package/$(LUCI_NAME)/conffiles
/etc/config/tinyfilemanager
endef
define Package/$(LUCI_NAME)/postinst
define Package/$(LUCI_NAME)/preinst
#!/bin/sh
mkdir -p "$${IPKG_INSTROOT}/www/tinyfilemanager" 2>/dev/null
[ ! -d "$${IPKG_INSTROOT}/www/tinyfilemanager/rootfs" ] && ln -s / "$${IPKG_INSTROOT}/www/tinyfilemanager/rootfs"
@ -35,9 +35,6 @@ sed -Ei "s|^(memory_limit) *=.*$$|\1 = $$memory_limit|; \
s|^(upload_max_filesize) *=.*$$|\1 = $$single_size_limit|; \
s|^(max_file_uploads) *=.*$$|\1 = $$otime_uploads_limit|" \
"$${IPKG_INSTROOT}/etc/php.ini"
# unpack
tar -C "$${IPKG_INSTROOT}/www/tinyfilemanager" -xzf "$${IPKG_INSTROOT}/www/tinyfilemanager/index.tgz"
rm -f "$${IPKG_INSTROOT}/www/tinyfilemanager/index.tgz"
endef
define Package/$(LUCI_NAME)/prerm

View File

@ -60,6 +60,21 @@ return view.extend({
o.retain = true;
o.depends('use_auth', '1');
o = s.option(form.ListValue, 'autologin_user', _('Auto login user'),
_('Automatically login/logout of the specified user based on LuCI credentials.'));
o.load = function(section_id) {
delete this.keylist;
delete this.vallist;
const users = uci.get(this.config, section_id, 'auth_users');
this.value('', _('none'));
for (const userpw of users)
this.value(userpw.split(':')[0]);
return this.super('load', section_id);
}
o.depends('use_auth', '1');
o = s.option(form.Flag, 'global_readonly', _('Global Readonly'));
o.default = o.disabled;
o.rmempty = false;

View File

@ -10,8 +10,10 @@ return view.extend({
},
render() {
const sid = L.env.sessionid || '';
const url = window.location.protocol + '//' + window.location.hostname + '/tinyfilemanager/' + `?luci_sid=${sid}`;
return E('iframe', {
src: window.location.protocol + '//' + window.location.hostname + '/tinyfilemanager/',
src: url,
style: 'width: 100%; min-height: 100vh; border: none; border-radius: 3px;'
});
}

View File

@ -1,197 +1,206 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:150
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:151
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:63
msgid "Auto login user"
msgstr ""
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:64
msgid ""
"Automatically login/logout of the specified user based on LuCI credentials."
msgstr ""
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:161
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:162
msgid "Check update"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:30
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:30
msgid "Config"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:80
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:93
msgid "D-M-YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:79
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:92
msgid "D.M.YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:81
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:94
msgid "D/M/YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:77
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:90
msgid "DD-MM-YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:76
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:89
msgid "DD.MM.YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:78
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:91
msgid "DD/MM/YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:75
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:88
msgid "Date format"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:118
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:129
msgid "Disable"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:44
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:42
msgid "Enable Authentication"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:130
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:141
msgid "Enable proxy for updater"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:111
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:121
msgid "Exclude Files/Folders"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:105
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:118
msgid "Favicon path"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:65
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:78
msgid "Global Readonly"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:119
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:130
msgid "Google Docs"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/rpcd/acl.d/luci-app-tinyfilemanager.json:3
#: root/usr/share/rpcd/acl.d/luci-app-tinyfilemanager.json:3
msgid "Grant access to tinyfilemanager procedures"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:93
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:106
msgid "H:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:92
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:105
msgid "HH:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:69
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:82
msgid "Home path"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:47
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:45
msgid "Login user name and passwd hash"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:124
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:135
msgid "Max upload size (MBytes)"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:120
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:131
msgid "Microsoft Web Apps"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:3
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:3
msgid "NAS"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:116
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:127
msgid "Online Docs viewer"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:133
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:144
msgid "Proxy Protocol"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:143
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:154
msgid "Proxy Server"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:57
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:55
msgid "Readonly users"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:163
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:171
msgid "Releases list"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:34
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:35
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:34
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:35
msgid "Reload"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:117
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:128
msgid "Requires running on open network"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:101
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:114
msgid "Show seconds in time"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:95
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:108
msgid "TT h:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:94
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:107
msgid "TT hh:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:91
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:104
msgid "Time format"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:170
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:11
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:22
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:178
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:11
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:22
msgid "Tiny File Manager"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:42
msgid "To enable SSL support, you may need to install <b>%s</b><br/>"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:170
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:171
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:178
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:179
msgid "Uprgade"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:86
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:99
msgid "YYYY-M-D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:83
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:96
msgid "YYYY-MM-DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:85
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:98
msgid "YYYY.M.D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:82
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:95
msgid "YYYY.MM.DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:87
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:100
msgid "YYYY/M/D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:84
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:97
msgid "YYYY/MM/DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:48
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:46
msgid ""
"You can generate new passwd in <b>File Manager -> Admin -> Help -> Generate "
"new</b> or <a href=\"%s\" target=\"_blank\"><b>Here</b></a>."
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:97
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:110
msgid "h:mm:ss TT"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:96
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:109
msgid "hh:mm:ss TT"
msgstr ""
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:70
msgid "none"
msgstr ""

View File

@ -12,199 +12,211 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.12.1-dev\n"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:150
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:151
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:63
msgid "Auto login user"
msgstr "自动登入用户"
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:64
msgid ""
"Automatically login/logout of the specified user based on LuCI credentials."
msgstr "根据 LuCI 凭据自动登入/登出指定用户。"
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:161
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:162
msgid "Check update"
msgstr "检查更新"
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:30
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:30
msgid "Config"
msgstr "配置"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:80
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:93
msgid "D-M-YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:79
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:92
msgid "D.M.YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:81
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:94
msgid "D/M/YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:77
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:90
msgid "DD-MM-YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:76
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:89
msgid "DD.MM.YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:78
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:91
msgid "DD/MM/YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:75
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:88
msgid "Date format"
msgstr "日期格式"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:118
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:129
msgid "Disable"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:44
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:42
msgid "Enable Authentication"
msgstr "启用用户验证"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:130
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:141
msgid "Enable proxy for updater"
msgstr "为更新器启用代理"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:111
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:121
msgid "Exclude Files/Folders"
msgstr "排除 文件/目录"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:105
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:118
msgid "Favicon path"
msgstr "Favicon 路径"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:65
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:78
msgid "Global Readonly"
msgstr "全局只读"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:119
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:130
msgid "Google Docs"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/rpcd/acl.d/luci-app-tinyfilemanager.json:3
#: root/usr/share/rpcd/acl.d/luci-app-tinyfilemanager.json:3
msgid "Grant access to tinyfilemanager procedures"
msgstr "授予访问 LuCI 应用 tinyfilemanager 的权限"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:93
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:106
msgid "H:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:92
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:105
msgid "HH:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:69
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:82
msgid "Home path"
msgstr "家目录"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:47
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:45
msgid "Login user name and passwd hash"
msgstr "登入用户名和密码哈希"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:124
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:135
msgid "Max upload size (MBytes)"
msgstr "上传大小限制 (MBytes)"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:120
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:131
msgid "Microsoft Web Apps"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:3
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:3
msgid "NAS"
msgstr "存储"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:116
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:127
msgid "Online Docs viewer"
msgstr "在线文档预览器"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:133
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:144
msgid "Proxy Protocol"
msgstr "代理协议"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:143
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:154
msgid "Proxy Server"
msgstr "代理服务器"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:57
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:55
msgid "Readonly users"
msgstr "只读用户组"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:163
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:171
msgid "Releases list"
msgstr "发布版列表"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:34
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:35
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:34
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:35
msgid "Reload"
msgstr "重载"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:117
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:128
msgid "Requires running on open network"
msgstr "需要运行在开放网络"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:101
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:114
msgid "Show seconds in time"
msgstr "显示秒"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:95
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:108
msgid "TT h:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:94
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:107
msgid "TT hh:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:91
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:104
msgid "Time format"
msgstr "时间格式"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:170
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:11
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:22
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:178
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:11
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:22
msgid "Tiny File Manager"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:42
msgid "To enable SSL support, you may need to install <b>%s</b><br/>"
msgstr "要启用 SSL 支持可能需先安装 <b>%s</b><br/>"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:170
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:171
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:178
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:179
msgid "Uprgade"
msgstr "升级"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:86
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:99
msgid "YYYY-M-D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:83
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:96
msgid "YYYY-MM-DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:85
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:98
msgid "YYYY.M.D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:82
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:95
msgid "YYYY.MM.DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:87
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:100
msgid "YYYY/M/D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:84
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:97
msgid "YYYY/MM/DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:48
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:46
msgid ""
"You can generate new passwd in <b>File Manager -> Admin -> Help -> Generate "
"new</b> or <a href=\"%s\" target=\"_blank\"><b>Here</b></a>."
msgstr ""
"你可以在 <b>文件管理器 -> Admin -> 帮助 -> 生成新的</b> or <a href=\"%s\" target=\"_blank\"><b>"
"这里</b></a>。"
"你可以在 <b>文件管理器 -> Admin -> 帮助 -> 生成新的</b> or <a href=\"%s\" "
"target=\"_blank\"><b>这里</b></a>。"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:97
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:110
msgid "h:mm:ss TT"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:96
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:109
msgid "hh:mm:ss TT"
msgstr ""
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:70
msgid "none"
msgstr ""
#~ msgid "To enable SSL support, you may need to install <b>%s</b><br/>"
#~ msgstr "要启用 SSL 支持可能需先安装 <b>%s</b><br/>"

View File

@ -12,199 +12,211 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.12.1-dev\n"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:150
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:151
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:63
msgid "Auto login user"
msgstr "自動登入用戶"
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:64
msgid ""
"Automatically login/logout of the specified user based on LuCI credentials."
msgstr "根據 LuCI 憑證自動登入/登出指定用戶。"
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:161
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:162
msgid "Check update"
msgstr "檢查更新"
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:30
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:30
msgid "Config"
msgstr "組態"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:80
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:93
msgid "D-M-YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:79
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:92
msgid "D.M.YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:81
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:94
msgid "D/M/YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:77
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:90
msgid "DD-MM-YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:76
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:89
msgid "DD.MM.YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:78
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:91
msgid "DD/MM/YYYY"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:75
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:88
msgid "Date format"
msgstr "日期格式"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:118
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:129
msgid "Disable"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:44
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:42
msgid "Enable Authentication"
msgstr "啟用用戶認證"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:130
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:141
msgid "Enable proxy for updater"
msgstr "為更新器啟用代理"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:111
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:121
msgid "Exclude Files/Folders"
msgstr "排除 文件/目錄"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:105
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:118
msgid "Favicon path"
msgstr "Favicon 路徑"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:65
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:78
msgid "Global Readonly"
msgstr "全局只讀"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:119
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:130
msgid "Google Docs"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/rpcd/acl.d/luci-app-tinyfilemanager.json:3
#: root/usr/share/rpcd/acl.d/luci-app-tinyfilemanager.json:3
msgid "Grant access to tinyfilemanager procedures"
msgstr "授予訪問 LuCI 應用 tinyfilemanager 的權限"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:93
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:106
msgid "H:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:92
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:105
msgid "HH:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:69
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:82
msgid "Home path"
msgstr "家目錄"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:47
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:45
msgid "Login user name and passwd hash"
msgstr "登入用戶名和密碼雜湊"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:124
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:135
msgid "Max upload size (MBytes)"
msgstr "上傳大小限制 (MBytes)"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:120
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:131
msgid "Microsoft Web Apps"
msgstr ""
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:3
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:3
msgid "NAS"
msgstr "存儲"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:116
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:127
msgid "Online Docs viewer"
msgstr "在線文檔預覽器"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:133
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:144
msgid "Proxy Protocol"
msgstr "代理協議"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:143
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:154
msgid "Proxy Server"
msgstr "代理伺服器"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:57
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:55
msgid "Readonly users"
msgstr "只讀用戶組"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:163
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:171
msgid "Releases list"
msgstr "發佈版本列表"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:34
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:35
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:34
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:35
msgid "Reload"
msgstr "重載"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:117
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:128
msgid "Requires running on open network"
msgstr "需要運行在開放網路"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:101
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:114
msgid "Show seconds in time"
msgstr "顯示秒"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:95
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:108
msgid "TT h:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:94
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:107
msgid "TT hh:mm:ss"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:91
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:104
msgid "Time format"
msgstr "時間格式"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:170
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:11
#: applications/luci-app-tinyfilemanager/root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:22
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:178
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:11
#: root/usr/share/luci/menu.d/luci-app-tinyfilemanager.json:22
msgid "Tiny File Manager"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:42
msgid "To enable SSL support, you may need to install <b>%s</b><br/>"
msgstr "要啟用 SSL 支援可能需先安裝 <b>%s</b><br/>"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:170
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:171
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:178
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:179
msgid "Uprgade"
msgstr "升級"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:86
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:99
msgid "YYYY-M-D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:83
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:96
msgid "YYYY-MM-DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:85
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:98
msgid "YYYY.M.D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:82
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:95
msgid "YYYY.MM.DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:87
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:100
msgid "YYYY/M/D"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:84
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:97
msgid "YYYY/MM/DD"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:48
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:46
msgid ""
"You can generate new passwd in <b>File Manager -> Admin -> Help -> Generate "
"new</b> or <a href=\"%s\" target=\"_blank\"><b>Here</b></a>."
msgstr ""
"你可以在 <b>檔案管理器 -> Admin -> 幫助 -> 建立新的</b> or <a href=\"%s\" target=\"_blank\"><b>"
"這裡</b></a>。"
"你可以在 <b>檔案管理器 -> Admin -> 幫助 -> 建立新的</b> or <a href=\"%s\" "
"target=\"_blank\"><b>這裡</b></a>。"
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:97
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:110
msgid "h:mm:ss TT"
msgstr ""
#: applications/luci-app-tinyfilemanager/htdocs/luci-static/resources/view/tinyfilemanager/config.js:96
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:109
msgid "hh:mm:ss TT"
msgstr ""
#: htdocs/luci-static/resources/view/tinyfilemanager/config.js:70
msgid "none"
msgstr ""
#~ msgid "To enable SSL support, you may need to install <b>%s</b><br/>"
#~ msgstr "要啟用 SSL 支援可能需先安裝 <b>%s</b><br/>"

View File

@ -32,6 +32,7 @@ validate_section() {
'use_auth:bool:0' \
'auth_users:list(string)' \
'readonly_users:list(string)' \
'autologin_user:string' \
'global_readonly:bool:0' \
'root_path:directory' \
'date_format:or("d.m.o", "d-m-o", "d/m/o", "j.n.o", "j-n-o", "j/n/o", "o.m.d", "o-m-d", "o/m/d", "o.n.j", "o-n-j", "o/n/j"):d.m.o' \
@ -50,6 +51,7 @@ init_config() {
s|// --- EDIT BELOW CONFIGURATION CAREFULLY ---|\<?php\n$defconf|; \
s|// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL ---|?\>|; \
/\/\/ if User has the external config file, try to use it to override the default config above/,/^}/d; \
/^define(/d; \
p \
}" "$WORKDIR/index.php" > "$1"
@ -72,6 +74,7 @@ apply_config() {
[ -n "$defconf" ] && sed -Ei "s|^\\\$CONFIG\s*=.*|\$CONFIG = '$defconf'\;|" "$_conf"
[ "$use_auth" -eq "1" ] && sed -Ei "s|(^\\\$use_auth =)(.+)|\1 true;|" "$_conf" || sed -Ei "s|(^\\\$use_auth =)(.+)|\1 false;|" "$_conf"
[ -n "$autologin_user" ] && sed -Ei "s|\?>|\$luci_autologin_user = '$autologin_user';\ninclude '/usr/share/tinyfilemanager/auto-login-base-luci.php';\n\n?>|" "$_conf"
[ "$global_readonly" -eq "1" ] && sed -Ei "s|(^\\\$global_readonly =)(.+)|\1 true;|" "$_conf" || sed -Ei "s|(^\\\$global_readonly =)(.+)|\1 false;|" "$_conf"
sed -Ei "/^\\\$auth_users /,/\);/{/^ /d}" "$_conf" && sed -Ei "/^\\\$auth_users /a\ $auth_users" "$_conf"
sed -Ei "/^\\\$readonly_users /,/\);/{/^ /d}" "$_conf" && sed -Ei "/^\\\$readonly_users /a\ $readonly_users" "$_conf"

View File

@ -1,5 +1,9 @@
#!/bin/sh
# unpack
tar -C /www/tinyfilemanager -xzf /www/tinyfilemanager/index.tgz
rm -f /www/tinyfilemanager/index.tgz
# uhttpd
uci -q get uhttpd.main.index_page|grep -i 'index.php' >/dev/null || uci add_list uhttpd.main.index_page='index.php'
uci -q get uhttpd.main.interpreter|grep -i '.php=/usr/bin/php-cgi' >/dev/null || uci add_list uhttpd.main.interpreter='.php=/usr/bin/php-cgi'

View File

@ -0,0 +1,49 @@
<?php
// Validates LuCI session via ubus on every request.
// Auto-login when accessed from LuCI menu (luci_sid passed in URL).
// Forces logout when LuCI session expires.
if (!defined('FM_SESSION_ID')) define('FM_SESSION_ID', 'filemanager');
session_name('filemanager');
session_start();
function luci_validate_sid($sid) {
if (empty($sid) || !preg_match('/^[a-f0-9]{32}$/', $sid)) return false;
$out = shell_exec('ubus call session get \'{"ubus_rpc_session":"' . $sid . '"}\' 2>/dev/null');
return $out && strpos($out, '"username"') !== false;
}
// Step 1: luci_sid in URL → validate and auto-login
if (!empty($_GET['luci_sid'])) {
$sid = preg_replace('/[^a-f0-9]/', '', $_GET['luci_sid']);
if (luci_validate_sid($sid)) {
$_SESSION['filemanager']['logged'] = $luci_autologin_user;
$_SESSION['filemanager']['luci_sid'] = $sid;
session_write_close();
header('Location: /tinyfilemanager/');
exit;
} else {
unset($_SESSION['filemanager']['logged']);
unset($_SESSION['filemanager']['luci_sid']);
session_write_close();
http_response_code(403);
die('LuCI session invalid or expired.');
}
}
// Step 2: On every request, re-validate stored LuCI session
if (!empty($_SESSION['filemanager']['logged'])) {
$sid = $_SESSION['filemanager']['luci_sid'] ?? '';
if (!luci_validate_sid($sid)) {
// LuCI session expired → force logout
unset($_SESSION['filemanager']['logged']);
unset($_SESSION['filemanager']['luci_sid']);
session_write_close();
header('Location: /tinyfilemanager/');
exit;
}
}
session_write_close();
?>

View File

@ -21,10 +21,12 @@
styling from _layout.css still applies.
Chosen design (user-picked variant "彩色级别词", Vercel/Axiom style):
fixed-width time · level · source columns so messages start flush; the
level is a short uppercase word colored per severity (facility lives in
its tooltip), source neutral, err-and-above rows tinted, whole lines with
sideways scrolling (the stock textarea's wrap="off" model). Fields are
min-width time · level · source columns so messages start flush while
every token renders verbatim year, timezone, colons, ctime padding all
kept, nothing truncated so a copied row is byte-identical to the source
line; the level token is colored per severity, source neutral,
err-and-above rows tinted, whole lines with sideways scrolling (the stock
textarea's wrap="off" model). Fields are
inline-blocks inside inline flow (not grid/flex) so the real spaces
between them survive into copied text.
*/
@ -43,6 +45,9 @@
@apply font-mono text-xs leading-relaxed;
/* Whole lines, sideways scroll (the stock textarea's wrap="off" model). */
@apply overflow-x-auto;
/* Focusable (tabIndex in the companion JS) so select-all stays inside the
log; only keyboard focus draws the ring a click into the log must not. */
@apply focus-visible:ring-focus-ring outline-none focus-visible:ring-2;
& .log-row {
/* max-content width so hover/tint backgrounds span the scrolled width. */
@ -61,17 +66,20 @@
& .log-time {
@apply text-text-subtle;
@apply md:inline-block md:w-[15ch] md:overflow-hidden md:align-bottom md:whitespace-nowrap;
/* ctime stamps are a fixed 24ch; RPC datestrs run longer but uniform. */
@apply md:inline-block md:min-w-[24ch] md:align-bottom;
}
& .log-sev {
@apply font-semibold tracking-wide uppercase;
@apply md:inline-block md:w-[7ch] md:overflow-hidden md:align-bottom md:whitespace-nowrap;
/* "authpriv.notice:" is 16ch — the longest real fac.sev token. */
@apply font-semibold;
@apply md:inline-block md:min-w-[16ch] md:align-bottom;
}
& .log-tag {
@apply text-text-muted;
@apply md:inline-block md:max-w-[18ch] md:overflow-hidden md:align-bottom md:text-ellipsis md:whitespace-nowrap;
/* min-width, not a clamp: long tags extend rather than truncate. */
@apply md:inline-block md:min-w-[18ch] md:align-bottom;
}
& .lv-info .log-sev {

View File

@ -70,61 +70,56 @@
return m ? { tag: m[1], msg: m[2] } : { tag: "", msg: rest };
}
// Compress "Jul 24, 2026, 10:59:50 PM UTC"-style stamps (master's RPC path
// formats with the *browser* locale). Only en-style patterns are recognized;
// anything else is shown untouched rather than guessed at.
function shortenTime(datestr) {
const m = datestr.match(
/^(\w{3}) (\d{1,2}), \d{4}, (\d{1,2}):(\d{2}):(\d{2})\s*(AM|PM)?/,
);
if (!m) return datestr;
let h = parseInt(m[3], 10);
if (m[6] === "PM" && h < 12) h += 12;
if (m[6] === "AM" && h === 12) h = 0;
const hh = (h < 10 ? "0" : "") + h;
return `${m[1]} ${m[2].padStart(2, "0")} ${hh}:${m[4]}:${m[5]}`;
}
/* System log line, two shapes:
A (master RPC): [<locale datestr>] fac.sev: tag[pid]: msg
B (classic logread, Www Mmm dd hh:mm:ss yyyy fac.sev tag[pid]: msg
23.05 + 24.10 syslog-wrapper + master's RPC-failure fallback) */
23.05 + 24.10 syslog-wrapper + master's RPC-failure fallback)
Every captured token is kept verbatim year, timezone, 12-hour clock,
ctime's padded day, the colons so rejoining the rendered fields with
single spaces reproduces the source line byte for byte. The enhancement
aligns and colors; it never rewrites. */
function parseSyslogLine(line) {
let m = line.match(/^\[(.+?)\]\s+(\w+)\.(\w+):\s+([\s\S]*)$/);
if (m && FACILITIES.has(m[2]) && SEVERITIES.has(m[3]))
return {
time: shortenTime(m[1]),
fullTime: m[1],
time: `[${m[1]}]`,
fac: m[2],
sev: m[3],
sevTok: `${m[2]}.${m[3]}:`,
...splitTag(m[4]),
};
m = line.match(
/^\w{3} (\w{3}) +(\d{1,2}) (\d{2}:\d{2}:\d{2}) (\d{4}) (\w+)\.(\w+) ([\s\S]*)$/,
/^(\w{3} \w{3} +\d{1,2} \d{2}:\d{2}:\d{2} \d{4}) (\w+)\.(\w+) ([\s\S]*)$/,
);
if (m && FACILITIES.has(m[5]) && SEVERITIES.has(m[6]))
if (m && FACILITIES.has(m[2]) && SEVERITIES.has(m[3]))
return {
time: `${m[1]} ${m[2].padStart(2, "0")} ${m[3]}`,
fullTime: line.slice(0, line.indexOf(` ${m[5]}.${m[6]} `)),
fac: m[5],
sev: m[6],
...splitTag(m[7]),
time: m[1],
fac: m[2],
sev: m[3],
sevTok: `${m[2]}.${m[3]}`,
...splitTag(m[4]),
};
return null;
}
/* Kernel log line: `[ 73412.882110] msg`. No severity survives into the
text on any LuCI version (both eras strip/drop the <N> prefix), so dmesg
gets time/tag/typography only no level colors, no keyword guessing. */
text on any LuCI version (master runs `dmesg -r` and strips the <N>
prefix after filtering on it; the classic pages never had it), and kernel
messages have no uniform tag grammar drivers print "name addr.dev
port:", bare text, indented continuations which is why upstream renders
dmesg as plain unstyled text. A partial tag split styled only some lines
and ate only their colons, so the message stays verbatim: time dimming
and typography only. */
function parseDmesgLine(line) {
const m = line.match(/^\[\s*(\d+\.\d+)\]\s?([\s\S]*)$/);
const m = line.match(/^(\[\s*\d+\.\d+\])\s?([\s\S]*)$/);
if (!m) return null;
return {
time: `[${m[1]}]`,
fullTime: "",
time: m[1],
fac: "",
sev: "",
...splitTag(m[2]),
sevTok: "",
tag: "",
msg: m[2],
};
}
@ -140,7 +135,6 @@
parseSyslogLine,
parseDmesgLine,
splitTag,
shortenTime,
evaluate,
PARSE_GATE,
};
@ -175,18 +169,16 @@
const p = entry.parsed;
row.className = "log-row" + (p.sev ? ` lv-${SEV_CLASS[p.sev]}` : "");
// Real space text nodes between plain inline spans: the row wraps like
// terminal output and selection copies clean text. The level is the short
// severity word (CSS uppercases and colors it; facility lives in its
// tooltip); the source keeps its full name in a tooltip for when the
// aligned column truncates it.
row.appendChild(span("log-time", p.time, p.fullTime));
if (p.sev) {
// terminal output, and because every field renders verbatim (punctuation
// included) a copied row is byte-identical to the source line.
row.appendChild(span("log-time", p.time));
if (p.sevTok) {
row.appendChild(document.createTextNode(" "));
row.appendChild(span("log-sev", p.sev, `${p.fac}.${p.sev}`));
row.appendChild(span("log-sev", p.sevTok));
}
if (p.tag) {
row.appendChild(document.createTextNode(" "));
row.appendChild(span("log-tag", p.tag, p.tag));
row.appendChild(span("log-tag", p.tag + ":"));
}
row.appendChild(document.createTextNode(" "));
row.appendChild(span("log-msg", p.msg));
@ -209,6 +201,21 @@
if (!viewer) {
viewer = document.createElement("div");
viewer.className = "syslog-view";
// The stock textarea contained Ctrl+A for free — a focused form control
// is its own selection context. A plain div is not (the standard switch,
// user-select:contain, ships in no browser), so reproduce it: clicking
// the log focuses the viewer, and select-all inside it stays inside it.
viewer.tabIndex = 0;
viewer.addEventListener("keydown", function (e) {
if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "a") {
e.preventDefault();
const sel = window.getSelection();
sel.removeAllRanges();
const range = document.createRange();
range.selectNodeContents(viewer);
sel.addRange(range);
}
});
textarea.insertAdjacentElement("afterend", viewer);
container.classList.add("log-enhanced");
}
@ -227,8 +234,18 @@
if (viewer && selectionInside(viewer)) return;
lastValue = value;
const { rows, ratio } = evaluate(value, parseLine);
if (ratio >= PARSE_GATE) render(textarea, container, rows);
else teardown(container);
if (ratio >= PARSE_GATE) {
// Tail-follow: a reader already pinned to the bottom stays pinned as new
// lines arrive; any other scroll position is never touched. The content
// area scrolls the window (main uses min-h, no inner scroller), and the
// `viewer &&` guard keeps the first paint from jumping — same as stock.
const follow =
viewer &&
window.innerHeight + window.scrollY >=
document.documentElement.scrollHeight - 40;
render(textarea, container, rows);
if (follow) window.scrollTo(0, document.documentElement.scrollHeight);
} else teardown(container);
}
// Content updates: LuCI's poll rewrites .value, which fires nothing — a

View File

@ -18,29 +18,29 @@ new Function("module", "exports", "document", "window", source)(
undefined,
undefined,
);
const { parseSyslogLine, parseDmesgLine, shortenTime, evaluate, PARSE_GATE } =
mod.exports;
const { parseSyslogLine, parseDmesgLine, evaluate, PARSE_GATE } = mod.exports;
test("classic logread format (23.05 syslog, 24.10 syslog-wrapper) parses", () => {
const r = parseSyslogLine(
"Sat Jul 26 03:14:15 2026 daemon.info dnsmasq-dhcp[1]: DHCPACK(br-lan) 192.168.1.140",
);
assert.deepEqual(
{ time: r.time, fac: r.fac, sev: r.sev, tag: r.tag },
{ time: r.time, fac: r.fac, sev: r.sev, sevTok: r.sevTok, tag: r.tag },
{
time: "Jul 26 03:14:15",
time: "Sat Jul 26 03:14:15 2026",
fac: "daemon",
sev: "info",
sevTok: "daemon.info",
tag: "dnsmasq-dhcp[1]",
},
);
assert.equal(r.msg, "DHCPACK(br-lan) 192.168.1.140");
// ctime() pads single-digit days with a space.
// ctime() pads single-digit days with a space — kept verbatim.
const padded = parseSyslogLine(
"Sun Jul 6 09:05:07 2026 daemon.warn odhcpd[2029]: No default route present",
);
assert.equal(padded.time, "Jul 06 09:05:07");
assert.equal(padded.time, "Sun Jul 6 09:05:07 2026");
// Kernel lines routed through logread; hostapd logs without a pid.
assert.equal(
@ -58,18 +58,19 @@ test("classic logread format (23.05 syslog, 24.10 syslog-wrapper) parses", () =>
});
test("master RPC bracket format parses across browser locales", () => {
// The datestr renders verbatim, brackets and timezone included — the
// stamp is UTC-formatted upstream and hiding the zone read as local time.
const en = parseSyslogLine(
"[Jul 24, 2026, 10:59:50 PM UTC] daemon.info: dnsmasq-dhcp[1]: DHCPREQUEST(br-lan) 192.168.1.140",
);
assert.equal(en.time, "Jul 24 22:59:50");
assert.equal(en.fullTime, "Jul 24, 2026, 10:59:50 PM UTC");
assert.equal(en.time, "[Jul 24, 2026, 10:59:50 PM UTC]");
assert.equal(en.sevTok, "daemon.info:");
// timeStyle "full" spells the zone out; still en-shaped, still shortened.
assert.equal(
parseSyslogLine(
"[Jul 24, 2026, 10:59:50 PM Coordinated Universal Time] daemon.warn: odhcpd[2029]: No default route present",
).time,
"Jul 24 22:59:50",
"[Jul 24, 2026, 10:59:50 PM Coordinated Universal Time]",
);
// Non-en datestrs parse fine and display untouched — never guessed at.
@ -77,7 +78,26 @@ test("master RPC bracket format parses across browser locales", () => {
"[2026年7月24日 GMT 22:59:50] daemon.err: odhcpd[2029]: Failed to send RA",
);
assert.equal(zh.sev, "err");
assert.equal(zh.time, "2026年7月24日 GMT 22:59:50");
assert.equal(zh.time, "[2026年7月24日 GMT 22:59:50]");
});
test("rendered tokens rejoin into the source line byte for byte", () => {
const lines = [
"[Jul 24, 2026, 10:59:50 PM UTC] daemon.info: dnsmasq-dhcp[1]: DHCPREQUEST(br-lan) 192.168.1.140",
"[Jul 25, 2026, 4:30:55 PM UTC] kern.info: [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x51af8014]",
"Sun Jul 6 09:05:07 2026 daemon.warn odhcpd[2029]: No default route present",
"Sat Jul 26 03:14:16 2026 kern.info kernel: [73412.882110] br-lan: port 3(lan3) entered forwarding state",
];
for (const line of lines) {
const p = parseSyslogLine(line);
const parts = [p.time, p.sevTok];
if (p.tag) parts.push(p.tag + ":");
parts.push(p.msg);
assert.equal(parts.join(" "), line, line);
}
const dm = "[ 12.345678] br-lan: port 3(lan3) entered forwarding state";
const d = parseDmesgLine(dm);
assert.equal([d.time, d.msg].join(" "), dm);
});
test("severity comes from the field, never from message content", () => {
@ -105,15 +125,19 @@ test("unknown facility/severity and foreign formats are rejected", () => {
assert.equal(parseSyslogLine(""), null);
});
test("dmesg lines: uptime stamp and safe tag split, no severity", () => {
test("dmesg lines: uptime stamp only, message verbatim, no severity", () => {
// Kernel lines have no uniform tag grammar (upstream renders them as plain
// text for the same reason) — a partial split styled only some lines and
// ate only their colons, so no tag is ever extracted and the message keeps
// its punctuation untouched.
const r = parseDmesgLine(
"[ 12.345678] br-lan: port 3(lan3) entered forwarding state",
);
assert.equal(r.time, "[12.345678]");
assert.equal(r.tag, "br-lan");
assert.equal(r.time, "[ 12.345678]");
assert.equal(r.tag, "");
assert.equal(r.sev, "");
assert.equal(r.msg, "br-lan: port 3(lan3) entered forwarding state");
// A device path with spaces must not be mistaken for a tag.
const pci = parseDmesgLine(
"[75821.004518] mt7921e 0000:01:00.0: Message 00000010 timeout",
);
@ -123,15 +147,6 @@ test("dmesg lines: uptime stamp and safe tag split, no severity", () => {
assert.equal(parseDmesgLine("no bracket prefix here"), null);
});
test("shortenTime handles 12-hour edges and leaves unknown shapes alone", () => {
assert.equal(shortenTime("Jul 24, 2026, 12:05:01 AM UTC"), "Jul 24 00:05:01");
assert.equal(shortenTime("Jul 24, 2026, 12:15:09 PM UTC"), "Jul 24 12:15:09");
assert.equal(
shortenTime("2026年7月24日 GMT 22:59:50"),
"2026年7月24日 GMT 22:59:50",
);
});
test("parse gate: mixed content falls back, empty value stays calm", () => {
const good = "Sat Jul 26 03:14:15 2026 daemon.info dnsmasq[1]: ok";
const bad = "Jul 26 10:00:00 OpenWrt dnsmasq[123]: syslog-ng style";

View File

@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Aurora Theme (A modern browser theme built with Vite and Tailwind CSS)
LUCI_DEPENDS:=+luci-base
PKG_VERSION:=1.1.8
PKG_RELEASE:=60
PKG_VERSION:=1.1.10
PKG_RELEASE:=61
PKG_LICENSE:=Apache-2.0
LUCI_MINIFY_CSS:=

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";!function(){const e=new Set(["kern","user","mail","daemon","auth","syslog","lpr","news","uucp","cron","authpriv","ftp","ntp","security","console","local0","local1","local2","local3","local4","local5","local6","local7","unknown"]),t=new Set(["emerg","alert","crit","err","warn","notice","info","debug"]),n={emerg:"crit",alert:"crit",crit:"crit",err:"err",warn:"warn",notice:"notice",info:"info",debug:"debug"};function o(e){const t=e.match(/^([A-Za-z0-9_.\/-]+(?:\[\d+\])?):\s+([\s\S]*)$/);return t?{tag:t[1],msg:t[2]}:{tag:"",msg:e}}function s(e){const t=e.match(/^(\w{3}) (\d{1,2}), \d{4}, (\d{1,2}):(\d{2}):(\d{2})\s*(AM|PM)?/);if(!t)return e;let n=parseInt(t[3],10);"PM"===t[6]&&n<12&&(n+=12),"AM"===t[6]&&12===n&&(n=0);const o=(n<10?"0":"")+n;return`${t[1]} ${t[2].padStart(2,"0")} ${o}:${t[4]}:${t[5]}`}function c(n){let c=n.match(/^\[(.+?)\]\s+(\w+)\.(\w+):\s+([\s\S]*)$/);return c&&e.has(c[2])&&t.has(c[3])?{time:s(c[1]),fullTime:c[1],fac:c[2],sev:c[3],...o(c[4])}:(c=n.match(/^\w{3} (\w{3}) +(\d{1,2}) (\d{2}:\d{2}:\d{2}) (\d{4}) (\w+)\.(\w+) ([\s\S]*)$/),c&&e.has(c[5])&&t.has(c[6])?{time:`${c[1]} ${c[2].padStart(2,"0")} ${c[3]}`,fullTime:n.slice(0,n.indexOf(` ${c[5]}.${c[6]} `)),fac:c[5],sev:c[6],...o(c[7])}:null)}function l(e){const t=e.match(/^\[\s*(\d+\.\d+)\]\s?([\s\S]*)$/);return t?{time:`[${t[1]}]`,fullTime:"",fac:"",sev:"",...o(t[2])}:null}function a(e,t){const n=(e?e.split(/\n/):[]).map(e=>({line:e,parsed:t(e)})),o=n.reduce((e,t)=>e+(t.parsed?1:0),0);return{rows:n,ratio:n.length?o/n.length:1}}if("undefined"!=typeof module&&module.exports&&(module.exports={parseSyslogLine:c,parseDmesgLine:l,splitTag:o,shortenTime:s,evaluate:a,PARSE_GATE:.8}),"undefined"==typeof document)return;const r=document.body?.dataset?.page||"",d=/(^|-)dmesg(-|$)/.test(r)?l:c;let i=null,u=null;function m(e,t,n){const o=document.createElement("span");return o.className=e,o.textContent=t,n&&(o.title=n),o}function g(e){const t=document.createElement("div");if(!e.parsed)return t.className="log-row",t.textContent=e.line,t;const o=e.parsed;return t.className="log-row"+(o.sev?` lv-${n[o.sev]}`:""),t.appendChild(m("log-time",o.time,o.fullTime)),o.sev&&(t.appendChild(document.createTextNode(" ")),t.appendChild(m("log-sev",o.sev,`${o.fac}.${o.sev}`))),o.tag&&(t.appendChild(document.createTextNode(" ")),t.appendChild(m("log-tag",o.tag,o.tag))),t.appendChild(document.createTextNode(" ")),t.appendChild(m("log-msg",o.msg)),t}function f(){const e=document.getElementById("syslog"),t=document.getElementById("content_syslog");if(!e||!t)return;const n=e.value;if(n===u)return;if(i&&function(e){const t=window.getSelection&&window.getSelection();return!(!t||t.isCollapsed)&&(e.contains(t.anchorNode)||e.contains(t.focusNode))}(i))return;u=n;const{rows:o,ratio:s}=a(n,d);s>=.8?function(e,t,n){i||(i=document.createElement("div"),i.className="syslog-view",e.insertAdjacentElement("afterend",i),t.classList.add("log-enhanced"));const o=document.createDocumentFragment();for(const e of n)o.appendChild(g(e));i.replaceChildren(o)}(e,t,o):function(e){i&&i.remove(),i=null,e.classList.remove("log-enhanced")}(t)}if(setInterval(f,1e3),document.getElementById("syslog"))f();else{const e=new MutationObserver(function(){document.getElementById("syslog")&&(e.disconnect(),f())});e.observe(document.documentElement,{childList:!0,subtree:!0})}}();
"use strict";!function(){const e=new Set(["kern","user","mail","daemon","auth","syslog","lpr","news","uucp","cron","authpriv","ftp","ntp","security","console","local0","local1","local2","local3","local4","local5","local6","local7","unknown"]),t=new Set(["emerg","alert","crit","err","warn","notice","info","debug"]),n={emerg:"crit",alert:"crit",crit:"crit",err:"err",warn:"warn",notice:"notice",info:"info",debug:"debug"};function o(e){const t=e.match(/^([A-Za-z0-9_.\/-]+(?:\[\d+\])?):\s+([\s\S]*)$/);return t?{tag:t[1],msg:t[2]}:{tag:"",msg:e}}function s(n){let s=n.match(/^\[(.+?)\]\s+(\w+)\.(\w+):\s+([\s\S]*)$/);return s&&e.has(s[2])&&t.has(s[3])?{time:`[${s[1]}]`,fac:s[2],sev:s[3],sevTok:`${s[2]}.${s[3]}:`,...o(s[4])}:(s=n.match(/^(\w{3} \w{3} +\d{1,2} \d{2}:\d{2}:\d{2} \d{4}) (\w+)\.(\w+) ([\s\S]*)$/),s&&e.has(s[2])&&t.has(s[3])?{time:s[1],fac:s[2],sev:s[3],sevTok:`${s[2]}.${s[3]}`,...o(s[4])}:null)}function c(e){const t=e.match(/^(\[\s*\d+\.\d+\])\s?([\s\S]*)$/);return t?{time:t[1],fac:"",sev:"",sevTok:"",tag:"",msg:t[2]}:null}function l(e,t){const n=(e?e.split(/\n/):[]).map(e=>({line:e,parsed:t(e)})),o=n.reduce((e,t)=>e+(t.parsed?1:0),0);return{rows:n,ratio:n.length?o/n.length:1}}if("undefined"!=typeof module&&module.exports&&(module.exports={parseSyslogLine:s,parseDmesgLine:c,splitTag:o,evaluate:l,PARSE_GATE:.8}),"undefined"==typeof document)return;const a=document.body?.dataset?.page||"",d=/(^|-)dmesg(-|$)/.test(a)?c:s;let r=null,i=null;function u(e,t,n){const o=document.createElement("span");return o.className=e,o.textContent=t,n&&(o.title=n),o}function m(e){const t=document.createElement("div");if(!e.parsed)return t.className="log-row",t.textContent=e.line,t;const o=e.parsed;return t.className="log-row"+(o.sev?` lv-${n[o.sev]}`:""),t.appendChild(u("log-time",o.time)),o.sevTok&&(t.appendChild(document.createTextNode(" ")),t.appendChild(u("log-sev",o.sevTok))),o.tag&&(t.appendChild(document.createTextNode(" ")),t.appendChild(u("log-tag",o.tag+":"))),t.appendChild(document.createTextNode(" ")),t.appendChild(u("log-msg",o.msg)),t}function g(){const e=document.getElementById("syslog"),t=document.getElementById("content_syslog");if(!e||!t)return;const n=e.value;if(n===i)return;if(r&&function(e){const t=window.getSelection&&window.getSelection();return!(!t||t.isCollapsed)&&(e.contains(t.anchorNode)||e.contains(t.focusNode))}(r))return;i=n;const{rows:o,ratio:s}=l(n,d);if(s>=.8){const n=r&&window.innerHeight+window.scrollY>=document.documentElement.scrollHeight-40;!function(e,t,n){r||(r=document.createElement("div"),r.className="syslog-view",r.tabIndex=0,r.addEventListener("keydown",function(e){if((e.ctrlKey||e.metaKey)&&"a"===e.key.toLowerCase()){e.preventDefault();const t=window.getSelection();t.removeAllRanges();const n=document.createRange();n.selectNodeContents(r),t.addRange(n)}}),e.insertAdjacentElement("afterend",r),t.classList.add("log-enhanced"));const o=document.createDocumentFragment();for(const e of n)o.appendChild(m(e));r.replaceChildren(o)}(e,t,o),n&&window.scrollTo(0,document.documentElement.scrollHeight)}else!function(e){r&&r.remove(),r=null,e.classList.remove("log-enhanced")}(t)}if(setInterval(g,1e3),document.getElementById("syslog"))g();else{const e=new MutationObserver(function(){document.getElementById("syslog")&&(e.disconnect(),g())});e.observe(document.documentElement,{childList:!0,subtree:!0})}}();

View File

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=openlist2
PKG_VERSION:=4.2.4
PKG_WEB_VERSION:=4.2.4
PKG_RELEASE:=11
PKG_RELEASE:=12
PKG_SOURCE:=openlist-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/OpenListTeam/OpenList/tar.gz/v$(PKG_VERSION)?
@ -28,7 +28,7 @@ define Download/openlist-frontend
HASH:=skip
endef
PKG_BUILD_DEPENDS:=golang/host fuse
PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
PKG_BUILD_FLAGS:=no-mips16
@ -42,8 +42,9 @@ GO_PKG_LDFLAGS:= \
-X '$(GO_PKG)/internal/conf.GitCommit=tarball/$(shell echo $(PKG_HASH) | cut -c 1-7)' \
-X '$(GO_PKG)/internal/conf.Version=v$(PKG_VERSION) (OpenWrt $(ARCH_PACKAGES))' \
-X '$(GO_PKG)/internal/conf.WebVersion=v$(PKG_WEB_VERSION)'
GO_PKG_EXCLUDES:=internal/fuse
ifneq ($(CONFIG_ARCH_64BIT),y)
GO_PKG_EXCLUDES:=drivers/lark
GO_PKG_EXCLUDES+=drivers/lark
endif
include $(INCLUDE_DIR)/package.mk
@ -75,10 +76,6 @@ ifeq ($(ARCH),arm)
endif
endif
ifneq ($(CONFIG_USE_MUSL),)
TARGET_CFLAGS += -D_LARGEFILE64_SOURCE
endif
define Build/Prepare
$(call Build/Prepare/Default)
mkdir -p $(PKG_BUILD_DIR)/public/dist

View File

@ -76,3 +76,4 @@ config openlist2
option enable_pasv_conn_ip_check '1'
option sftp '0'
option sftp_port '5222'
option mcp '0'

View File

@ -184,6 +184,9 @@ get_config() {
config_get sftp "$1" sftp 0
config_get sftp_port "$1" sftp_port 5222
# mcp
config_get mcp "$1" mcp 0
# init jwt_secret
if [ -z "$jwt_secret" ]; then
jwt_secret=$(tr -cd "a-zA-Z0-9" < "/dev/urandom" | head -c16)
@ -419,6 +422,11 @@ start_service() {
json_add_string "listen" ":$sftp_port"
json_close_object
# mcp
json_add_object "mcp"
json_add_boolean "enable" "$mcp"
json_close_object
json_add_string "last_launched_version" "$last_launched_version"
json_add_string "proxy_address" "$proxy_address"