using System.Web;
using HandlebarsDotNet;
using InnovEnergy.App.RemoteSupportConsole;
using InnovEnergy.App.VrmGrabber.Database;
using InnovEnergy.Lib.Victron.VictronVRM;
using Microsoft.AspNetCore.Mvc;
using FILE=System.IO.File;
namespace InnovEnergy.App.VrmGrabber;
public record Install(
String Name,
String Ip,
UInt64 Vrm,
String Identifier,
String Serial,
String EscapedName,
String Online
);
[Controller]
public class Controller : ControllerBase
{
[HttpGet]
[Route("/")]
[Produces("text/html")]
public ActionResult Index()
{
var instList = Db.InstallationsAndDetails.Keys.ToList();
if (instList.Count == 0) return new ContentResult
{
ContentType = "text/html",
Content = "
Please wait page is still loading
"
};
String source = @"
{{#inst}}
{{> installations}}
{{/inst}}
";
String partialSource =
@"| {{Name}} |
{{online}} {{Ip}} |
VRM |
Grafana |
{{Identifier}} |
{{Serial}} |
";
Handlebars.RegisterTemplate("installations", partialSource);
var template = Handlebars.Compile(source);
var insts = instList.Select(i =>
{
var ip = Ip(i);
return new Install(i.Name, ip[0], i.IdSite, i.Identifier, Serial(i), HttpUtility.UrlEncode(i.Name), ip[1]);
});
var data = new
{
inst = insts
};
var result = template(data);
return new ContentResult
{
ContentType = "text/html",
Content = result
};
}
private String[] Ip(Installation installation)
{
var online = "❌";
var lookup = Db.InstallationsAndDetails[installation].Ip;
if (lookup == "Unknown")
{
var serial = Serial(installation);
if (serial != "Unknown" && FILE.Exists($@"/etc/openvpn/server/Salino/ccd/{serial}"))
lookup = FILE.ReadAllText($@"/etc/openvpn/server/Salino/ccd/{serial}").Split(' ')[1];
}
else
{
online = "✅";
}
return new [] {lookup,online};
}
public static String Serial(Installation installation)
{
return Db.InstallationsAndDetails[installation].Details.MachineSerial() ?? "Unknown";
}
// [HttpGet(nameof(GetInstallation))]
// [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")]
// public Object GetInstallation(UInt64 serialNumber)
// {
// var instList = Db.InstallationsAndDetails.Values.ToList();
// foreach (var detailList in instList.Select((value, index) => new { Value = value, Index = index}))
// {
// if (detailList.Value.All(detail => detail.Json["idSite"]?.GetValue() != serialNumber)) continue;
// var retour = Db.InstallationsAndDetails.Keys.ToList()[detailList.Index].Json;
// retour["details"] = JsonSerializer.Deserialize(JsonSerializer.Serialize(detailList.Value.Select(d => d.Json).ToArray()));
// return retour;
// }
//
// return new NotFoundResult();
// }
}
// installation Name, ip (link uf gui), idSite (vrm link), identifier , machineserial (HQ...)