Initial commit: IT Nexus Web-App
This commit is contained in:
123
agent-cs/Services/CommandExecutor.cs
Normal file
123
agent-cs/Services/CommandExecutor.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
using ITNexusAgent.Models;
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
using System.Net.Http;
|
||||
|
||||
namespace ITNexusAgent.Services;
|
||||
|
||||
public class CommandExecutor(ApiService api, string hostname, string dataDir, string exePath)
|
||||
{
|
||||
private readonly ApiService _api = api;
|
||||
private readonly string _hostname = hostname;
|
||||
private readonly string _dataDir = dataDir;
|
||||
private readonly string _exePath = exePath;
|
||||
|
||||
private static void RunSchtasks(string args) =>
|
||||
Process.Start(new ProcessStartInfo("schtasks.exe", args) { CreateNoWindow = true })?.WaitForExit();
|
||||
|
||||
public async Task ExecuteAsync(PatchCommand cmd)
|
||||
{
|
||||
string result;
|
||||
try
|
||||
{
|
||||
result = cmd.Command switch
|
||||
{
|
||||
"check_updates" => await CheckUpdates(),
|
||||
"install_updates" => await InstallUpdates(),
|
||||
"reboot" => await Reboot(cmd.Id),
|
||||
"upgrade_win11" => await UpgradeWin11(),
|
||||
"update_agent" => await UpdateAgent(),
|
||||
_ => $"Unbekannter Command: {cmd.Command}"
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result = $"Fehler: {ex.Message}";
|
||||
}
|
||||
|
||||
if (cmd.Command != "reboot")
|
||||
{
|
||||
await _api.ReportCommandResultAsync(new CommandResult
|
||||
{
|
||||
CommandId = cmd.Id,
|
||||
Status = "done",
|
||||
Result = result
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private Task<string> CheckUpdates()
|
||||
{
|
||||
Process.Start(new ProcessStartInfo("UsoClient.exe", "StartScan") { CreateNoWindow = true });
|
||||
Thread.Sleep(5000);
|
||||
return Task.FromResult("Update-Scan gestartet");
|
||||
}
|
||||
|
||||
private Task<string> InstallUpdates()
|
||||
{
|
||||
Process.Start(new ProcessStartInfo("UsoClient.exe", "StartDownload") { CreateNoWindow = true });
|
||||
Thread.Sleep(3000);
|
||||
Process.Start(new ProcessStartInfo("UsoClient.exe", "StartInstall") { CreateNoWindow = true });
|
||||
return Task.FromResult("Update-Installation gestartet");
|
||||
}
|
||||
|
||||
private async Task<string> Reboot(int cmdId)
|
||||
{
|
||||
await _api.ReportCommandResultAsync(new CommandResult
|
||||
{
|
||||
CommandId = cmdId,
|
||||
Status = "done",
|
||||
Result = "Neustart wird in 60 Sekunden durchgeführt"
|
||||
});
|
||||
Process.Start("shutdown.exe", "/r /t 60 /c \"IT Nexus Patch Management - Geplanter Neustart\"");
|
||||
return "";
|
||||
}
|
||||
|
||||
private Task<string> UpgradeWin11()
|
||||
{
|
||||
var exePath = Path.Combine(_dataDir, "Win11Upgrade.exe");
|
||||
using var client = new HttpClient();
|
||||
var bytes = client.GetByteArrayAsync("https://go.microsoft.com/fwlink/?linkid=2171764").Result;
|
||||
if (bytes.Length < 1024 * 1024) return Task.FromResult("Download fehlgeschlagen");
|
||||
File.WriteAllBytes(exePath, bytes);
|
||||
|
||||
var fullUser = NotificationService.GetLoggedOnUser();
|
||||
if (!string.IsNullOrEmpty(fullUser))
|
||||
{
|
||||
RunSchtasks("/delete /tn \"IT Nexus Win11 Upgrade\" /f");
|
||||
RunSchtasks($"/create /tn \"IT Nexus Win11 Upgrade\" /tr \"\\\"{exePath}\\\" /skipeula /auto upgrade\" /sc ONCE /st {DateTime.Now.AddSeconds(20):HH:mm} /ru \"{fullUser}\" /it /rl HIGHEST /f");
|
||||
}
|
||||
else
|
||||
{
|
||||
Process.Start(new ProcessStartInfo(exePath, "/quietinstall /skipeula /auto upgrade")
|
||||
{ CreateNoWindow = true });
|
||||
}
|
||||
return Task.FromResult("running");
|
||||
}
|
||||
|
||||
private async Task<string> UpdateAgent()
|
||||
{
|
||||
var bytes = await _api.DownloadSetupAsync();
|
||||
if (bytes.Length < 512 * 1024) return "Download fehlgeschlagen - Installer zu klein";
|
||||
|
||||
var setupPath = Path.Combine(_dataDir, "IT-Nexus-Agent-Setup-Update.exe");
|
||||
var batchPath = Path.Combine(_dataDir, "update.cmd");
|
||||
|
||||
await File.WriteAllBytesAsync(setupPath, bytes);
|
||||
|
||||
// Batch: wartet kurz, führt Installer silent aus, löscht sich selbst
|
||||
var batch = $"""
|
||||
@echo off
|
||||
timeout /t 5 /nobreak > nul
|
||||
"{setupPath}" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
|
||||
del "{setupPath}" > nul
|
||||
del "%~f0"
|
||||
""";
|
||||
|
||||
await File.WriteAllTextAsync(batchPath, batch, System.Text.Encoding.ASCII);
|
||||
Process.Start(new ProcessStartInfo("cmd.exe", $"/c \"{batchPath}\"")
|
||||
{ CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden });
|
||||
|
||||
return "Update-Installer gestartet";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user