Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

luci-app-cloudflared: add Tunnels status page #6887

Merged
merged 5 commits into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion applications/luci-app-cloudflared/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ LUCI_DEPENDS:=+cloudflared
LUCI_DESCRIPTION:=LuCI support for Cloudflare Zero Trust Tunnels

PKG_MAINTAINER:=Hilman Maulana <hilman0.0maulana@gmail.com>, Sergey Ponomarev <stokito@gmail.com>
PKG_VERSION:=1.0
PKG_VERSION:=1.1
stokito marked this conversation as resolved.
Show resolved Hide resolved
PKG_LICENSE:=Apache-2.0

include ../../luci.mk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@

'use strict';
'require form';
'require poll';
'require rpc';
'require uci';
'require view';

var callServiceList = rpc.declare({
Expand All @@ -27,26 +25,15 @@ function getServiceStatus() {
});
}

function renderStatus(isRunning) {
var spanTemp = '<label class="cbi-value-title">Status</label><div class="cbi-value-field"><em><span style="color:%s">%s</span></em></div>';
var renderHTML;
if (isRunning) {
renderHTML = String.format(spanTemp, 'green', _('Running'));
} else {
renderHTML = String.format(spanTemp, 'red', _('Not Running'));
}

return renderHTML;
}

return view.extend({
load: function () {
return Promise.all([
uci.load('cloudflared')
getServiceStatus()
]);
},

render: function (data) {
let isRunning = data[0];
var m, s, o;

m = new form.Map('cloudflared', _('Cloudflare Zero Trust Tunnel'),
Expand All @@ -59,18 +46,15 @@ return view.extend({

s = m.section(form.NamedSection, 'config', 'cloudflared');

o = s.option(form.DummyValue, 'service_status', _('Status'));
o.load = function () {
poll.add(function () {
return L.resolveDefault(getServiceStatus()).then(function (res) {
var view = document.getElementById('cbi-cloudflared-config-service_status');
if (view) {
view.innerHTML = renderStatus(res);
}
});
});
o = s.option(form.DummyValue, '_status', _('Status'));
o.rawhtml = true;
o.cfgvalue = function(section_id) {
var span = '<b><span style="color:%s">%s</span></b>';
var renderHTML = isRunning ?
String.format(span, 'green', _('Running')) :
String.format(span, 'red', _('Not Running'));
return renderHTML;
};
o.value = _('Collecting data...');

o = s.option(form.Flag, 'enabled', _('Enable'));
o.rmempty = false;
Expand Down Expand Up @@ -105,7 +89,7 @@ return view.extend({
o.value('us', _('United States'));
o.optional = true;

o = s.option(form.ListValue, 'loglevel', _('Debug level'));
o = s.option(form.ListValue, 'loglevel', _('Logging level'));
o.value('fatal', _('Fatal'));
o.value('error', _('Error'));
o.value('warn', _('Warning'));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/* 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';
stokito marked this conversation as resolved.
Show resolved Hide resolved
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),
]);
}
});
87 changes: 51 additions & 36 deletions applications/luci-app-cloudflared/po/ar/cloudflared.po
Original file line number Diff line number Diff line change
Expand Up @@ -12,48 +12,45 @@ msgstr ""
msgid "All"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:77
msgid "Certificate of Origin"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:53
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:40
msgid ""
"Cloudflare Zero Trust Security services help you get maximum security both "
"from outside and within the network."
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:52
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:39
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:3
msgid "Cloudflared"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:73
msgid "Collecting data..."
msgid "Cloudflare Zero Trust Tunnel"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:85
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:69
msgid "Config file path"
msgstr ""

#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:14
msgid "Configuration"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
#: 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:41
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/config.js:113
msgid "Debug"
#: 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:108
msgid "Debug level"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:97
msgid "Debug"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:96
Expand All @@ -64,16 +61,16 @@ msgstr ""
msgid "Download Log"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:75
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:59
msgid "Enable"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:110
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:92
msgid "Error"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:109
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:93
msgid "Fatal"
msgstr ""

Expand All @@ -85,71 +82,89 @@ msgstr ""
msgid "Grant access to Cloudflared configuration"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:112
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:96
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:90
msgid "Info"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:85
#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:30
msgid "Log"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/log.js:94
msgid "Log Direction:"
msgstr ""

#: applications/luci-app-cloudflared/root/usr/share/luci/menu.d/luci-app-cloudflared.json:22
msgid "Logs"
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:92
msgid "Logging level"
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
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:55
msgid "Not Running"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
msgid "Obtain a certificate <a %s>here</a>."
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:102
#: 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:86
msgid "Region"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:34
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:54
msgid "Running"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:56
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:86
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:43
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:70
msgid "See <a %s>documentation</a>."
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:49
msgid "Status"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:94
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
msgid ""
"The account certificate for your zones authorizing the client to serve as an "
"Origin for that zone"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:103
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:87
msgid "The region to which connections are established."
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:79
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:63
msgid "The tunnel token is shown in the dashboard once you create a tunnel."
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:78
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:62
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 ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:105
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:89
msgid "United States"
msgstr ""

Expand All @@ -161,6 +176,6 @@ msgstr ""
msgid "Warn"
msgstr ""

#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:111
#: applications/luci-app-cloudflared/htdocs/luci-static/resources/view/cloudflared/config.js:95
msgid "Warning"
msgstr ""
Loading