--- /dev/null
+/* This is free software, licensed under the Apache License, Version 2.0
+ *
+ * Copyright (C) 2024 Sergey Ponomarev <stokito@gmail.com>
+ */
+
+'use strict';
+'require view';
+'require fs';
+
+function listTunnels() {
+ let command = '/usr/bin/cloudflared';
+ let commandArgs = ['tunnel', 'list', '-o', 'json'];
+ return fs.exec(command, commandArgs).then(function (res) {
+ if (res.code === 0) {
+ return JSON.parse(res.stdout);
+ } else {
+ throw new Error(res.stdout + ' ' + res.stderr);
+ }
+ });
+}
+
+
+return view.extend({
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null,
+
+ load: function () {
+ return Promise.all([
+ listTunnels()
+ ]);
+ },
+
+ render: function (data) {
+ var tunnels = data[0];
+
+ var tunnelsElList = [];
+ for (var tunnel of tunnels) {
+ var connectionsSection = [];
+ if (tunnel.connections.length > 0) {
+ var connectionsElList = [];
+ for (let connection of tunnel.connections) {
+ var dateOpenedAt = new Date(connection.opened_at).toLocaleString();
+ connectionsElList.push(
+ E('tr', [
+ E('td', connection.id),
+ E('td', connection.origin_ip),
+ E('td', dateOpenedAt),
+ E('td', connection.colo_name)
+ ])
+ );
+ }
+
+ connectionsSection = [
+ E('h5', _('Connections')),
+ E('table', {'class': 'table cbi-section-table'}, [
+ E('thead', [
+ E('tr', {'class': 'tr table-titles'}, [
+ E('th', {'class': 'th'}, 'ID'),
+ E('th', {'class': 'th'}, _('Origin IP')),
+ E('th', {'class': 'th'}, _('Opened At')),
+ E('th', {'class': 'th'}, _('Data center')),
+ ]),
+ ]),
+ E('tbody', connectionsElList)
+ ])
+ ];
+ } else {
+ connectionsSection = [E('em', _('No connections'))];
+ }
+
+ var tunnelEl = E('div', [
+ E('h4', tunnel.name),
+ E('span', 'ID '),
+ E('span', tunnel.id),
+ E('div', connectionsSection)
+ ]
+ );
+ tunnelsElList.push(tunnelEl);
+ }
+ return E([], [
+ E('h2', {'class': 'section-title'}, _('Tunnels')),
+ E('div', {'id': 'tunnels'}, tunnelsElList),
+ ]);
+ }
+});
\ No newline at end of file
msgid "Configuration"
msgstr ""
+#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:55
+msgid "Connections"
+msgstr ""
+
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid ""
"Create and manage your network on the <a %s>Cloudflare Zero Trust</a> "
"dashboard."
msgstr ""
+#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:62
+msgid "Data center"
+msgstr ""
+
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:113
msgid "Debug"
msgstr ""
msgid "Log Direction:"
msgstr ""
-#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
+#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Logs"
msgstr ""
+#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:69
+msgid "No connections"
+msgstr ""
+
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:36
msgid "Not Running"
msgstr ""
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""
+#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:61
+msgid "Opened At"
+msgstr ""
+
+#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:60
+msgid "Origin IP"
+msgstr ""
+
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:102
msgid "Region"
msgstr ""
msgid "Token"
msgstr ""
+#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/tunnels.js:82
+#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
+msgid "Tunnels"
+msgstr ""
+
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:33
msgid "Unable to read the interface info from /var/log/cloudflared.log."
msgstr ""