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...)