'use strict';
'require view';
'require poll';
'require rpc';
'require fs';
'require uci';
var enableLog = true;
var pollIntervalSecs = 5;
var context = {
server: "unknown",
httpsRedirectEnabled: false,
serversCount: 0,
curlInstalled: false
};
var expectServiceObject = {
"nginx": {
"instances": {
"instance1": {}
}
}
};
function log(content){
if (enableLog){
return console.log("luci-app-nginx.main: " + content);
};
};
function toDict(string, kvSpliter){
var dict = {};
string.split(/\r?\n|\r/g).forEach(
function (line, index, array){
if (line.includes(kvSpliter)){
var kv = line.split(kvSpliter, 2);
dict[kv[0].toLowerCase()] = kv[1];
};
}
);
return dict;
};
function filterServiceFunction(data, args, extraArgs){
log("filterFunction: data is " + JSON.stringify(data));
log("filterFunction: args is " + JSON.stringify(args));
log("filterFunction: extraArgs is " + extraArgs);
if (
(args.name == "nginx") &&
(typeof data?.instances?.instance1?.running == "boolean")
){
if (data.instances.instance1.running){
return "running";
}
else {
return "stopped";
};
};
return "unknown";
};
var getServiceStatus = rpc.declare({
object: "service",
method: "list",
params: ["name"],
expect: expectServiceObject,
filter: filterServiceFunction
});
async function updateStatusContent(){
var result = await getServiceStatus("nginx");
log("updateStatusContent: trying to update nginx status to " + result);
var statusContent = document.getElementById("nginx-status-content");
log("updateStatusContent: found div#nginx-status-content: " + statusContent);
if (statusContent){
switch (result){
case "running":
statusContent.textContent = _("Running");
statusContent.style.color = "green";
break;
case "stopped":
statusContent.textContent = _("Stopped");
statusContent.style.color = "red";
break;
default:
statusContent.textContent = _("Unknown");
statusContent.style.color = "orange";
break;
};
};
};
return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null,
load: async function (){
var curlExec = "/usr/bin/curl";
var curlStatus = await fs.stat(curlExec);
log("curlStatus is " + JSON.stringify(curlStatus));
context.curlInstalled = ((curlStatus.type == "file") && (curlStatus.mode == 33261));
log("load: context.curlInstalled is " + context.curlInstalled);
if (context.curlInstalled){
var curlResult = await fs.exec_direct(curlExec, ["-I", "-s", "http://" + location.host]);
log("load: curlResult is " + curlResult);
var headers = toDict(curlResult, ": ");
log("load: headers is " + JSON.stringify(headers));
var locationInHeaders = headers["location"];
if (locationInHeaders){
if (locationInHeaders.startsWith("https://" + location.host)){
context.httpsRedirectEnabled = true;
};
};
var serverInHeaders = headers["server"];
if (serverInHeaders){
context.server = serverInHeaders;
};
};
await uci.load("nginx");
context.serversCount = uci.sections("nginx", "server").length;
uci.unload();
},
render: function (loadResults){
log("render: loadResults is " + loadResults);
var statusTitle = E("div", {"id":"nginx-status-title"}, _("Nginx status:"));
statusTitle.style.display = "inline-block";
var statusContent = E("div", {"id": "nginx-status-content"}, _("Unknown"));
statusContent.style.color = "orange";
statusContent.style.display = "inline-block";
statusContent.style.marginLeft = "10px";
var serviceControlLinkTitle = E(
"div",
{"id": "nginx-service-control"},
"%s -> %s".format(_("System"), _("Startup"))
);
serviceControlLinkTitle.style.display = "inline-block";
var serviceControlLink = E(
"a",
{"href": location.href.replace(location.pathname, "/cgi-bin/luci/admin/system/startup")}
);
serviceControlLink.appendChild(serviceControlLinkTitle);;
serviceControlLink.style.marginLeft = "25px";
var statusElement = E("div",{"id": "nginx-status"});
statusElement.appendChild(statusTitle);
statusElement.appendChild(statusContent);
statusElement.appendChild(serviceControlLink);
statusElement.style.marginTop = "25px";
var luciServerTitle = E("div", _("LuCI on Nginx:"));
luciServerTitle.style.display = "inline-block";
var luciServerStatus;
if (context.curlInstalled){
luciServerStatus = E("div", _(context.server.startsWith("nginx")?"Yes":"No"));
luciServerStatus.style.color = context.server.startsWith("nginx")?"green":"red";
} else {
luciServerStatus = E("div", _("Install <code>curl</code> for this info."));
luciServerStatus.style.color = "orange";
};
luciServerStatus.style.display = "inline-block";
luciServerStatus.style.marginLeft = "10px";
var luciServerLinkTitle = E(
"div",
{"id": "nginx-luci-link"},
"%s -> %s -> %s".format(_("Services"), _("Nginx"), _("Servers"))
);
luciServerLinkTitle.style.display = "inline-block";
var luciServerLink = E(
"a",
{"href": location.href.replace(location.pathname, "/cgi-bin/luci/admin/services/nginx/servers")}
)
luciServerLink.appendChild(luciServerLinkTitle);
luciServerLink.style.marginLeft = "25px";
var luciServerElement = E("div", {"id": "nginx-luci-status"});
luciServerElement.appendChild(luciServerTitle);
luciServerElement.appendChild(luciServerStatus);
luciServerElement.appendChild(luciServerLink);
luciServerElement.style.marginTop = "25px";
var httpsRedirectTitle = E("div", _("Https Redirect Enabled:"));
httpsRedirectTitle.style.display = "inline-block";
var httpsRedirectStatus;
if (context.curlInstalled){
httpsRedirectStatus = E("div", _(context.httpsRedirectEnabled?"Yes":"No"));
httpsRedirectStatus.style.color = context.httpsRedirectEnabled?"green":"red";
} else {
httpsRedirectStatus = E("div", _("Install <code>curl</code> for this info."));
httpsRedirectStatus.style.color = "orange";
};
httpsRedirectStatus.style.display = "inline-block";
httpsRedirectStatus.style.marginLeft = "10px";
var httpsRedirectElement = E("div", {"id": "nginx-https-redirect"});
httpsRedirectElement.appendChild(httpsRedirectTitle);
httpsRedirectElement.appendChild(httpsRedirectStatus);
httpsRedirectElement.style.marginTop = "25px";
var serversCountTitle = E("div", _("Running Servers Count:"));
serversCountTitle.style.display = "inline-block";
var serversCountStatus = E("div", "%d".format(context.serversCount));
serversCountStatus.style.display = "inline-block";
serversCountStatus.style.marginLeft = "10px";
var serversCountElement = E("div", {"id": "nginx-servers-count"});
serversCountElement.appendChild(serversCountTitle);
serversCountElement.appendChild(serversCountStatus);
serversCountElement.style.marginTop = "25px";
poll.add(updateStatusContent, pollIntervalSecs);
return E([
statusElement, luciServerElement, httpsRedirectElement, serversCountElement
]);
}
});