Files
ReleaseUpdater/Updater/Core/UpdaterApp.cs

67 lines
1.9 KiB
C#

namespace Updater.Core;
/// <summary>
/// Управляет потоком обновлений: извлечение, установка, перезапуск.
/// </summary>
public sealed class UpdaterApp
{
private readonly ILogger _log;
private readonly IExtractor _extractor;
private readonly IInstaller _installer;
private readonly IProcessManager _proc;
public UpdaterApp(ILogger log, IExtractor extractor, IInstaller installer, IProcessManager proc)
{
_log = log;
_extractor = extractor;
_installer = installer;
_proc = proc;
}
/// <summary>Запускает рабочий процесс обновления.</summary>
public int Run(Options opts)
{
var tempExtractDir = Path.Combine(Path.GetTempPath(), $"upd_extract_{Guid.NewGuid():N}");
Directory.CreateDirectory(tempExtractDir);
try
{
_extractor.Extract(opts.ZipPath, tempExtractDir);
}
catch (Exception ex)
{
_log.Error($"Extraction failed: {ex.Message}");
Cleanup(tempExtractDir);
return ExitCodes.ExtractFailed;
}
try
{
_installer.Install(tempExtractDir, opts.InstallPath);
}
catch (Exception ex)
{
_log.Error($"Install failed: {ex.Message}");
Cleanup(tempExtractDir);
return ExitCodes.InstallFailed;
}
Cleanup(tempExtractDir);
try
{
_proc.StartApp(opts.InstallPath, opts.AppExe, opts.RestartDelayMs);
return ExitCodes.Ok;
}
catch (Exception ex)
{
_log.Error($"Restart failed: {ex.Message}");
return ExitCodes.RestartFailed;
}
}
private static void Cleanup(string dir)
{
try { Directory.Delete(dir, true); } catch { /* ignore */ }
}
}