GenerateSshConfigCommand.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Microsoft.Extensions.DependencyInjection;
  2. using RackPeek.Domain.UseCases.SSH;
  3. using Spectre.Console;
  4. using Spectre.Console.Cli;
  5. namespace Shared.Rcl.Commands.Exporters;
  6. public sealed class GenerateSshConfigCommand(IServiceProvider provider)
  7. : AsyncCommand<GenerateSshConfigSettings> {
  8. public override async Task<int> ExecuteAsync(
  9. CommandContext context,
  10. GenerateSshConfigSettings settings,
  11. CancellationToken cancellationToken) {
  12. using IServiceScope scope = provider.CreateScope();
  13. SshConfigExportUseCase useCase = scope.ServiceProvider
  14. .GetRequiredService<SshConfigExportUseCase>();
  15. var options = new SshExportOptions {
  16. IncludeTags = ParseCsv(settings.IncludeTags),
  17. DefaultUser = settings.DefaultUser,
  18. DefaultPort = settings.DefaultPort,
  19. DefaultIdentityFile = settings.DefaultIdentityFile
  20. };
  21. SshExportResult? result = await useCase.ExecuteAsync(options);
  22. if (result is null) {
  23. AnsiConsole.MarkupLine("[red]SSH export returned null.[/]");
  24. return -1;
  25. }
  26. if (result.Warnings.Any()) {
  27. AnsiConsole.MarkupLine("[yellow]Warnings:[/]");
  28. foreach (var warning in result.Warnings)
  29. AnsiConsole.MarkupLine($"[yellow]- {Markup.Escape(warning)}[/]");
  30. AnsiConsole.WriteLine();
  31. }
  32. if (!string.IsNullOrWhiteSpace(settings.OutputPath)) {
  33. await File.WriteAllTextAsync(
  34. settings.OutputPath,
  35. result.ConfigText,
  36. cancellationToken);
  37. AnsiConsole.MarkupLine(
  38. $"[green]SSH config written to:[/] {Markup.Escape(settings.OutputPath)}");
  39. }
  40. else {
  41. AnsiConsole.MarkupLine("[green]Generated SSH Config:[/]");
  42. AnsiConsole.WriteLine();
  43. AnsiConsole.Write(result.ConfigText);
  44. }
  45. return 0;
  46. }
  47. private static IReadOnlyList<string> ParseCsv(string? raw) {
  48. if (string.IsNullOrWhiteSpace(raw))
  49. return [];
  50. return raw.Split(',', StringSplitOptions.RemoveEmptyEntries)
  51. .Select(x => x.Trim())
  52. .Where(x => !string.IsNullOrWhiteSpace(x))
  53. .ToArray();
  54. }
  55. }