78 lines
2.7 KiB
C#
78 lines
2.7 KiB
C#
using System.CommandLine;
|
|
using System.CommandLine.Parsing;
|
|
using ScadaLink.Commons.Messages.Management;
|
|
|
|
namespace ScadaLink.CLI.Commands;
|
|
|
|
internal static class CommandHelpers
|
|
{
|
|
internal static AuthenticatedUser PlaceholderUser { get; } =
|
|
new("cli-user", "CLI User", ["Admin", "Design", "Deployment"], Array.Empty<string>());
|
|
|
|
internal static string NewCorrelationId() => Guid.NewGuid().ToString("N");
|
|
|
|
internal static async Task<int> ExecuteCommandAsync(
|
|
ParseResult result,
|
|
Option<string> contactPointsOption,
|
|
Option<string> formatOption,
|
|
object command)
|
|
{
|
|
var contactPointsRaw = result.GetValue(contactPointsOption);
|
|
var format = result.GetValue(formatOption) ?? "json";
|
|
|
|
if (string.IsNullOrWhiteSpace(contactPointsRaw))
|
|
{
|
|
var config = CliConfig.Load();
|
|
if (config.ContactPoints.Count > 0)
|
|
contactPointsRaw = string.Join(",", config.ContactPoints);
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(contactPointsRaw))
|
|
{
|
|
OutputFormatter.WriteError("No contact points specified. Use --contact-points or set SCADALINK_CONTACT_POINTS.", "NO_CONTACT_POINTS");
|
|
return 1;
|
|
}
|
|
|
|
var contactPoints = contactPointsRaw.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
|
|
|
await using var connection = new ClusterConnection();
|
|
await connection.ConnectAsync(contactPoints, TimeSpan.FromSeconds(10));
|
|
|
|
var envelope = new ManagementEnvelope(PlaceholderUser, command, NewCorrelationId());
|
|
var response = await connection.AskManagementAsync(envelope, TimeSpan.FromSeconds(30));
|
|
|
|
return HandleResponse(response, format);
|
|
}
|
|
|
|
internal static int HandleResponse(object response, string format)
|
|
{
|
|
switch (response)
|
|
{
|
|
case ManagementSuccess success:
|
|
if (format == "table")
|
|
WriteAsTable(success.Data);
|
|
else
|
|
OutputFormatter.WriteJson(success.Data);
|
|
return 0;
|
|
|
|
case ManagementError error:
|
|
OutputFormatter.WriteError(error.Error, error.ErrorCode);
|
|
return 1;
|
|
|
|
case ManagementUnauthorized unauth:
|
|
OutputFormatter.WriteError(unauth.Message, "UNAUTHORIZED");
|
|
return 2;
|
|
|
|
default:
|
|
OutputFormatter.WriteError($"Unexpected response type: {response.GetType().Name}", "UNEXPECTED_RESPONSE");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
private static void WriteAsTable(object? data)
|
|
{
|
|
// For table format, delegate to JSON if data shape is unknown
|
|
OutputFormatter.WriteJson(data);
|
|
}
|
|
}
|