69 lines
1.9 KiB
C#
69 lines
1.9 KiB
C#
using ReleaseUpdater.Common;
|
|
|
|
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 */ }
|
|
}
|
|
} |