first commit

This commit is contained in:
2026-03-02 20:53:28 +01:00
commit d27c205106
63 changed files with 4593 additions and 0 deletions

24
Commands/AuroraCommand.cs Normal file
View File

@@ -0,0 +1,24 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class AuroraCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
log.Step($"Starting Aurora refresh (SID: {sid})...");
await ServiceFactory.CreateAuroraService(log)
.RunAsync(config.Aurora, config.Hana, sid);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

24
Commands/BackupCommand.cs Normal file
View File

@@ -0,0 +1,24 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class BackupCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
log.Step($"Starting backup (SID: {sid})...");
await ServiceFactory.CreateBackupService(log)
.RunAsync(config.Backup, config.Hana, sid);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

22
Commands/CleanCommand.cs Normal file
View File

@@ -0,0 +1,22 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class CleanCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var config = ConfigService.Load();
log.Step("Starting cleanup...");
await new CleanerService(log).RunAsync(config.Cleaner);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

40
Commands/CronCommand.cs Normal file
View File

@@ -0,0 +1,40 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
using HanaToolbox.Tui;
namespace HanaToolbox.Commands;
public static class CronCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
// cron setup → TUI
if (cli.SubCommand == "setup")
{
try
{
var config = ConfigService.Load();
var tui = new CronSetupTui();
config = tui.Run(config);
ConfigService.Save(config);
log.Always("Cron settings saved to /etc/hanatoolbox/hanatoolbox.json");
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
// cron → orchestrator (called by system cron every minute)
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
await ServiceFactory.CreateCronOrchestrator(log).RunAsync(config, sid);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

35
Commands/ExportCommand.cs Normal file
View File

@@ -0,0 +1,35 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class ExportCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
var schema = cli.Pos(0);
var path = cli.Pos(1);
if (string.IsNullOrWhiteSpace(schema) || string.IsNullOrWhiteSpace(path))
{
Console.Error.WriteLine("Usage: hanatoolbox export <schema> <path> [-c] [-t N]");
return 1;
}
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
var svc = ServiceFactory.CreateBackupService(log);
var locator = ServiceFactory.CreateLocator(log);
var hdbsql = locator.LocateHdbsql(config.Hana.HdbsqlPath, sid, config.Hana.InstanceNumber);
var threads = cli.Threads > 0 ? cli.Threads : Math.Max(1, Environment.ProcessorCount / 2);
await svc.ExportSchemaAsync(hdbsql, config.Backup.UserKey, schema, path, threads, cli.Compress, sid, CancellationToken.None);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

View File

@@ -0,0 +1,30 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
using HanaToolbox.Tui;
namespace HanaToolbox.Commands;
public static class FirewallCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var config = ConfigService.Load();
var runner = ServiceFactory.CreateRunner(log);
var fwService = new FirewallService(runner, log);
var tui = new FirewallTui(fwService, log);
var updated = await tui.RunAsync(config.Firewall);
if (updated != null)
{
config.Firewall = updated;
ConfigService.Save(config);
}
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

36
Commands/ImportCommand.cs Normal file
View File

@@ -0,0 +1,36 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class ImportCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
var schema = cli.Pos(0);
var path = cli.Pos(1);
if (string.IsNullOrWhiteSpace(schema) || string.IsNullOrWhiteSpace(path))
{
Console.Error.WriteLine("Usage: hanatoolbox import <schema> <path> [-c] [-t N] [--replace]");
return 1;
}
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
var svc = ServiceFactory.CreateBackupService(log);
var locator = ServiceFactory.CreateLocator(log);
var hdbsql = locator.LocateHdbsql(config.Hana.HdbsqlPath, sid, config.Hana.InstanceNumber);
var threads = cli.Threads > 0 ? cli.Threads : Math.Max(1, Environment.ProcessorCount / 2);
await svc.ImportSchemaAsync(hdbsql, config.Backup.UserKey, schema, path,
threads, cli.Compress, cli.Replace, newSchema: null, sid, CancellationToken.None);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

View File

@@ -0,0 +1,39 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class ImportRenameCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
var schema = cli.Pos(0);
var newName = cli.Pos(1);
var path = cli.Pos(2);
if (string.IsNullOrWhiteSpace(schema) || string.IsNullOrWhiteSpace(newName)
|| string.IsNullOrWhiteSpace(path))
{
Console.Error.WriteLine(
"Usage: hanatoolbox import-rename <schema> <new-schema> <path> [-c] [-t N] [--replace]");
return 1;
}
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
var svc = ServiceFactory.CreateBackupService(log);
var locator = ServiceFactory.CreateLocator(log);
var hdbsql = locator.LocateHdbsql(config.Hana.HdbsqlPath, sid, config.Hana.InstanceNumber);
var threads = cli.Threads > 0 ? cli.Threads : Math.Max(1, Environment.ProcessorCount / 2);
await svc.ImportSchemaAsync(hdbsql, config.Backup.UserKey, schema, path,
threads, cli.Compress, cli.Replace, newName, sid, CancellationToken.None);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

View File

@@ -0,0 +1,28 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
using HanaToolbox.Tui;
namespace HanaToolbox.Commands;
public static class KeyManagerCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
var runner = ServiceFactory.CreateRunner(log);
var switcher = new SuUserSwitcher(runner);
var locator = new HdbClientLocator(runner);
var keySvc = new KeyManagerService(switcher, locator, log);
var tui = new KeyManagerTui(keySvc, locator, log);
await tui.RunAsync(config.Hana, sid);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

View File

@@ -0,0 +1,24 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
namespace HanaToolbox.Commands;
public static class MonitorCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var config = ConfigService.Load();
var sid = string.IsNullOrWhiteSpace(cli.Sid) ? config.Hana.Sid : cli.Sid;
log.Step("Running monitor check...");
await ServiceFactory.CreateMonitorService(log)
.RunAsync(config.Monitor, config.Hana, sid);
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}

View File

@@ -0,0 +1,30 @@
using HanaToolbox.Cli;
using HanaToolbox.Config;
using HanaToolbox.Logging;
using HanaToolbox.Services;
using HanaToolbox.Tui;
namespace HanaToolbox.Commands;
public static class OnboardCommand
{
public static async Task<int> RunAsync(CliArgs cli)
{
var log = new AppLogger(cli.Verbose);
try
{
var runner = ServiceFactory.CreateRunner(log);
var switcher = new SuUserSwitcher(runner);
var locator = new HdbClientLocator(runner);
var keySvc = new KeyManagerService(switcher, locator, log);
var keyTui = new KeyManagerTui(keySvc, locator, log);
var fwSvc = new FirewallService(runner, log);
var fwTui = new FirewallTui(fwSvc, log);
var cronTui = new CronSetupTui();
var tui = new OnboardTui(keyTui, cronTui, fwTui, log);
await tui.RunAsync();
return 0;
}
catch (Exception ex) { log.Error(ex.Message); return 1; }
}
}