diff --git a/Makefile b/Makefile index abd5304..8cd04ac 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ LUCI_TITLE:=LuCI for Tailscale LUCI_DEPENDS:=+tailscale +jsonfilter +ucode LUCI_PKGARCH:=all -PKG_VERSION:=1.0.5 +PKG_VERSION:=1.0.6 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/htdocs/luci-static/resources/view/tailscale/log.js b/htdocs/luci-static/resources/view/tailscale/log.js new file mode 100644 index 0000000..6ffbe9c --- /dev/null +++ b/htdocs/luci-static/resources/view/tailscale/log.js @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: GPL-3.0-only + * + * Copyright (C) 2024 asvow + */ +'use strict'; +'require fs'; +'require poll'; +'require ui'; +'require view'; + +return view.extend({ + logs: [], + reverseLogs: false, + + load: function () { + var self = this; + /* Thanks to @animegasan */ + poll.add(function() { + return fs.exec('/sbin/logread', ['-e', 'tailscale']) + .then(function (res) { + if (res.code === 0) { + var statusMappings = { + 'daemon.err': { status: 'StdErr', startIndex: 9 }, + 'daemon.notice': { status: 'Info', startIndex: 10 } + }; + self.logs = res.stdout.split('\n').map(function(log) { + var logParts = log.split(' '); + if (logParts.length >= 6) { + var formattedTime = logParts[1] + ' ' + logParts[2] + ' - ' + logParts[3]; + var status = logParts[5]; + var mapping = statusMappings[status] || { status: status, startIndex: 9 }; + status = mapping.status; + var startIndex = mapping.startIndex; + var message = logParts.slice(startIndex).join(' '); + return formattedTime + ' [ ' + status + ' ] - ' + message; + } else { + return ''; + } + }).filter(Boolean); + self.updateLogView(); + } else { + throw new Error(res.stdout + ' ' + res.stderr); + } + }) + }); + }, + + updateLogView: function() { + var view = document.getElementById('syslog'); + var logs = this.logs; + if (logs.length === 0) { + view.textContent = _('No logs available'); + return; + } + if (this.reverseLogs) { + logs = logs.slice().reverse(); + } + view.textContent = logs.join('\n'); + }, + + render: function () { + var self = this; + var button = E('button', { + 'class': 'cbi-button cbi-button-neutral', + click: function() { + self.reverseLogs = !self.reverseLogs; + self.updateLogView(); + } + }, _('Toggle Log Order')); + var logArea = E('div', { 'id': 'syslog', 'style': 'white-space: pre;' }); + return E('div', {}, [ button, logArea ]); + }, + + handleSaveApply: null, + handleSave: null, + handleReset: null +}); diff --git a/po/templates/tailscale.pot b/po/templates/tailscale.pot index e82c054..812cf17 100644 --- a/po/templates/tailscale.pot +++ b/po/templates/tailscale.pot @@ -1,10 +1,6 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167 -msgid "Use site-to-site layer 3 networking to connect two subnets on your Tailscale network with each other." -msgstr "" - #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:159 msgid "Accept DNS" msgstr "" @@ -126,6 +122,10 @@ msgstr "" msgid "Logout and Unbind" msgstr "" +#: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30 +msgid "Logs" +msgstr "" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:94 msgid "MTU" msgstr "" @@ -147,6 +147,10 @@ msgstr "" msgid "No interface online." msgstr "" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/log.js:52 +msgid "No logs available" +msgstr "" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:163 msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network." msgstr "" @@ -200,6 +204,10 @@ msgstr "" msgid "The working directory contains config files, audit logs, and runtime info." msgstr "" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/log.js:69 +msgid "Toggle Log Order" +msgstr "" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:98 msgid "Total Download" msgstr "" @@ -220,6 +228,10 @@ msgstr "" msgid "Use %s to deploy a private server." msgstr "" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167 +msgid "Use site-to-site layer 3 networking to connect two subnets on your Tailscale network with each other." +msgstr "" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 msgid "WAN access Tailscale" msgstr "" diff --git a/po/zh_Hans/tailscale.po b/po/zh_Hans/tailscale.po index 905aa7c..b90fdd5 100644 --- a/po/zh_Hans/tailscale.po +++ b/po/zh_Hans/tailscale.po @@ -7,10 +7,6 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167 -msgid "Use site-to-site layer 3 networking to connect two subnets on your Tailscale network with each other." -msgstr "使用站点到站点的三层网络连接 Tailscale 中的两个子网。" - #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:159 msgid "Accept DNS" msgstr "允许DNS" @@ -132,6 +128,10 @@ msgstr "已绑定用户" msgid "Logout and Unbind" msgstr "注销登录并解除绑定" +#: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30 +msgid "Logs" +msgstr "日志" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:94 msgid "MTU" msgstr "MTU" @@ -153,6 +153,10 @@ msgstr "网络接口信息" msgid "No interface online." msgstr "无在线接口。" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/log.js:52 +msgid "No logs available" +msgstr "日志不存在" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:163 msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network." msgstr "作为 Tailscale 广域网出口节点。" @@ -206,6 +210,10 @@ msgstr "Tailscale 是一个跨平台且易于使用的虚拟局域网 VPN。" msgid "The working directory contains config files, audit logs, and runtime info." msgstr "工作目录包含配置文件、审计日志和运行时信息。" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/log.js:69 +msgid "Toggle Log Order" +msgstr "切换日志排序" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:98 msgid "Total Download" msgstr "总下载量" @@ -226,6 +234,10 @@ msgstr "无法获取接口信息:%s。" msgid "Use %s to deploy a private server." msgstr "使用 %s 部署私有服务器" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167 +msgid "Use site-to-site layer 3 networking to connect two subnets on your Tailscale network with each other." +msgstr "使用站点到站点的三层网络连接 Tailscale 中的两个子网。" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 msgid "WAN access Tailscale" msgstr "本地广域网访问虚拟局域网" diff --git a/po/zh_Hant/tailscale.po b/po/zh_Hant/tailscale.po index c0d6dc1..1603e5c 100644 --- a/po/zh_Hant/tailscale.po +++ b/po/zh_Hant/tailscale.po @@ -7,10 +7,6 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167 -msgid "Use site-to-site layer 3 networking to connect two subnets on your Tailscale network with each other." -msgstr "使用站點到站點的三層網路連線 Tailscale 中的兩個子網。" - #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:159 msgid "Accept DNS" msgstr "允許DNS" @@ -132,6 +128,10 @@ msgstr "已綁定用戶" msgid "Logout and Unbind" msgstr "註銷登錄並解除綁定" +#: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30 +msgid "Logs" +msgstr "日誌" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:94 msgid "MTU" msgstr "MTU" @@ -153,6 +153,10 @@ msgstr "網絡接口信息" msgid "No interface online." msgstr "無在線接口。" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/log.js:52 +msgid "No logs available" +msgstr "日誌不存在" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:163 msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network." msgstr "作為 Tailscale 廣域網出口節點。" @@ -206,6 +210,10 @@ msgstr "Tailscale 是一個跨平臺且易於使用的虛擬局域網 VPN。" msgid "The working directory contains config files, audit logs, and runtime info." msgstr "工作目錄包含配置文件、審計日誌和運行時信息。" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/log.js:69 +msgid "Toggle Log Order" +msgstr "切換日誌排序" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:98 msgid "Total Download" msgstr "總下載量" @@ -226,6 +234,10 @@ msgstr "無法獲取接口信息:%s。" msgid "Use %s to deploy a private server." msgstr "使用 %s 部署私有服務器" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:167 +msgid "Use site-to-site layer 3 networking to connect two subnets on your Tailscale network with each other." +msgstr "使用站點到站點的三層網路連線 Tailscale 中的兩個子網。" + #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 msgid "WAN access Tailscale" msgstr "本地廣域網訪問虛擬局域網" diff --git a/root/usr/share/luci/menu.d/luci-app-tailscale.json b/root/usr/share/luci/menu.d/luci-app-tailscale.json index 4a1f06f..fc2a780 100644 --- a/root/usr/share/luci/menu.d/luci-app-tailscale.json +++ b/root/usr/share/luci/menu.d/luci-app-tailscale.json @@ -25,5 +25,13 @@ "type": "view", "path": "tailscale/interface" } + }, + "admin/services/tailscale/log": { + "title": "Logs", + "order": 30, + "action": { + "type": "view", + "path": "tailscale/log" + } } } diff --git a/root/usr/share/rpcd/acl.d/luci-app-tailscale.json b/root/usr/share/rpcd/acl.d/luci-app-tailscale.json index 1690b4c..5e2981b 100644 --- a/root/usr/share/rpcd/acl.d/luci-app-tailscale.json +++ b/root/usr/share/rpcd/acl.d/luci-app-tailscale.json @@ -4,6 +4,7 @@ "read": { "file": { "/sbin/ifconfig": [ "exec" ], + "/sbin/logread": [ "exec" ], "/usr/sbin/tailscale": [ "exec" ] }, "ubus": {