132 lines
4.8 KiB
C#
132 lines
4.8 KiB
C#
using System.Diagnostics.CodeAnalysis;
|
|
using System.Reactive.Concurrency;
|
|
using System.Reactive.Linq;
|
|
using System.Reactive.Threading.Tasks;
|
|
using CliWrap;
|
|
using CliWrap.Buffered;
|
|
using InnovEnergy.App.RemoteSupportConsole;
|
|
using InnovEnergy.Lib.Utils;
|
|
using InnovEnergy.Lib.Victron.VictronVRM;
|
|
using SQLite;
|
|
using static System.Text.Json.JsonSerializer;
|
|
using Installation = InnovEnergy.App.VrmGrabber.DataTypes.Installation;
|
|
|
|
|
|
namespace InnovEnergy.App.VrmGrabber.Database;
|
|
|
|
public class InstallationDetails
|
|
{
|
|
public InstallationDetails(String ip, IReadOnlyList<Detail> details)
|
|
{
|
|
Details = details;
|
|
Ip = ip;
|
|
}
|
|
|
|
public IReadOnlyList<Detail>? Details { get; set; }
|
|
public String Ip { get; set; }
|
|
}
|
|
|
|
public static partial class Db
|
|
{
|
|
public static Dictionary<Lib.Victron.VictronVRM.Installation, InstallationDetails> InstallationsAndDetails;
|
|
|
|
public static async Task UpdateDetailsAndInstallations()
|
|
{
|
|
InstallationsAndDetails = new Dictionary<Lib.Victron.VictronVRM.Installation, InstallationDetails>();
|
|
while (true)
|
|
{
|
|
await UpdateInstallationsAndDetailsFromVrm(0);
|
|
}
|
|
}
|
|
|
|
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "<Pending>")]
|
|
private static async Task<Dictionary<Lib.Victron.VictronVRM.Installation, InstallationDetails>> UpdateInstallationsAndDetailsFromVrm(Int32 _)
|
|
{
|
|
var fileContent = await File.ReadAllTextAsync("./token.json");
|
|
|
|
var acc = Deserialize<AccToken>(fileContent);
|
|
var user = VrmAccount.Token(acc!.idUser, acc.token);
|
|
var installations = await user.GetInstallations();
|
|
var returnDictionary = new Dictionary<Lib.Victron.VictronVRM.Installation, InstallationDetails>();
|
|
foreach (var installation in installations)
|
|
{
|
|
Console.WriteLine(installation.Name);
|
|
var details = await GetInstallationDetails(installation);
|
|
returnDictionary.Add(installation, details);
|
|
}
|
|
|
|
return returnDictionary;
|
|
}
|
|
|
|
private static async Task<InstallationDetails> GetInstallationDetails(Lib.Victron.VictronVRM.Installation i)
|
|
{
|
|
await Task.Delay(1000);
|
|
try
|
|
{
|
|
var details = await i.GetDetails();
|
|
|
|
var ip = await VpnInfo.LookUpIp(i.Identifier, details.MachineSerial()) ?? "Unknown";
|
|
|
|
if(ip != "Unknown")
|
|
await UpdateInstallationName(i, ip);
|
|
|
|
return new InstallationDetails(ip,details);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e);
|
|
}
|
|
|
|
return new InstallationDetails("Unknown", Array.Empty<Detail>());
|
|
}
|
|
|
|
private static async Task UpdateInstallationName(Lib.Victron.VictronVRM.Installation installation, String ip)
|
|
{
|
|
var oldNameInFileRequest = await Cli.Wrap("ssh")
|
|
.WithArguments($@"root@{ip}")
|
|
.AppendArgument("-o StrictHostKeyChecking=accept-new")
|
|
.AppendArgument("cat /data/innovenergy/openvpn/installation-name")
|
|
.WithValidation(CommandResultValidation.None).ExecuteBufferedAsync();
|
|
|
|
var oldNameInFileWithoutNewLine = oldNameInFileRequest.StandardOutput.TrimEnd();
|
|
|
|
if (oldNameInFileRequest.ExitCode == 0 && oldNameInFileWithoutNewLine != installation.Name)
|
|
{
|
|
var overwriteNameCommand = Cli.Wrap("ssh")
|
|
.WithArguments($@"root@{ip}")
|
|
.AppendArgument($"echo '{installation.Name}' > /data/innovenergy/openvpn/installation-name");
|
|
|
|
var overwriteNameResponse = await overwriteNameCommand
|
|
.WithValidation(CommandResultValidation.None).ExecuteBufferedAsync();
|
|
|
|
if (overwriteNameResponse.ExitCode != 0)
|
|
{
|
|
Console.WriteLine(overwriteNameResponse.StandardError);
|
|
Console.WriteLine("Renaming did not work");
|
|
}
|
|
else
|
|
{
|
|
var rebootAfterRename = await Cli.Wrap("ssh")
|
|
.WithArguments($@"root@{ip}")
|
|
.AppendArgument("reboot")
|
|
.WithValidation(CommandResultValidation.None).ExecuteBufferedAsync();
|
|
|
|
if (rebootAfterRename.ExitCode != 0)
|
|
{
|
|
Console.WriteLine(overwriteNameResponse.StandardError);
|
|
Console.WriteLine("Rebooting did not work");
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine($"Renamed and rebooted {installation.Name}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class AccToken
|
|
{
|
|
public UInt64 idUser { get; init;}
|
|
public String token { get; init;}
|
|
} |