diff --git a/htdocs/luci-static/resources/view/tailscale/base.js b/htdocs/luci-static/resources/view/tailscale/base.js
index 11d74e9..918fb6f 100644
--- a/htdocs/luci-static/resources/view/tailscale/base.js
+++ b/htdocs/luci-static/resources/view/tailscale/base.js
@@ -31,9 +31,15 @@ function getServiceStatus() {
function getLoginStatus() {
return fs.exec("/usr/sbin/tailscale", ["status", "--json"]).then(function(res) {
var status = JSON.parse(res.stdout);
- return status.BackendState;
+ if (!status.AuthURL && status.BackendState == "NeedsLogin") {
+ fs.exec("/usr/sbin/tailscale", ["login"]);
+ }
+ return {
+ backendState: status.BackendState,
+ authURL: status.AuthURL
+ };
}).catch(function(error) {
- return undefined;
+ return { backendState: undefined, authURL: undefined };
});
}
@@ -49,13 +55,17 @@ function renderStatus(isRunning) {
return renderHTML;
}
-function renderLogin(loginStatus) {
+function renderLogin(loginStatus, authURL) {
var spanTemp = '%s';
var renderHTML;
- if (loginStatus === undefined) {
+ if (loginStatus.backendState == undefined) {
renderHTML = String.format(spanTemp, 'orange', _('NOT RUNNING'));
} else {
- renderHTML = String.format(spanTemp, loginStatus === "NeedsLogin" ? 'red' : 'green', loginStatus === "NeedsLogin" ? _('Needs Login') : _('Logged IN'));
+ if (loginStatus.backendState == "NeedsLogin") {
+ renderHTML = String.format('%s', authURL, _('Needs Login'));
+ } else {
+ renderHTML = String.format(spanTemp, 'green', _('Logged IN'));
+ }
}
return renderHTML;
@@ -95,7 +105,7 @@ return view.extend({
o.renderWidget = function(section_id, option_id) {
poll.add(function() {
return L.resolveDefault(getLoginStatus()).then(function(res) {
- document.getElementById('login_status_div').innerHTML = renderLogin(res);
+ document.getElementById('login_status_div').innerHTML = renderLogin(res, res.authURL);
});
});