using System.Diagnostics; using System.IO; using System.Net.Http; using System.Text.Json.Nodes; namespace PamhagenSysCtrl.Helpers { public static class UpdateService { public static async Task<(string Version, string Url, long Size)?> GetLatestInstallerUrl(string feedUrl) { try { using var client = new HttpClient() { Timeout = TimeSpan.FromSeconds(5), }; client.DefaultRequestHeaders.UserAgent.Clear(); client.DefaultRequestHeaders.UserAgent.ParseAdd($"PamhagenSysCtrl/{App.Version} ({Environment.MachineName}, {Environment.OSVersion})"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new("application/json")); using var res = await client.GetAsync(feedUrl); if (!res.IsSuccessStatusCode) return null; var json = JsonNode.Parse(await res.Content.ReadAsStringAsync()); var latest = json!["data"]!.AsArray()[^1]!; return ((string)latest["version"]!, (string)latest["url"]!, (long)latest["size"]!); } catch { return null; } } public static async Task DownloadInstaller(string url, string filename, IProgress? progress = null, CancellationToken cancellationToken = default) { try { using var client = new HttpClient() { Timeout = TimeSpan.FromSeconds(5), }; client.DefaultRequestHeaders.UserAgent.Clear(); client.DefaultRequestHeaders.UserAgent.ParseAdd($"PamhagenSysCtrl/{App.Version} ({Environment.MachineName}, {Environment.OSVersion})"); client.DefaultRequestHeaders.Accept.Clear(); using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellationToken); response.EnsureSuccessStatusCode(); var contentLength = response.Content.Headers.ContentLength; await using (var destination = new FileStream(filename, FileMode.Create)) { await using var source = await response.Content.ReadAsStreamAsync(cancellationToken); var buffer = new byte[81920]; long downloaded = 0; int read; while ((read = await source.ReadAsync(buffer, cancellationToken)) != 0) { await destination.WriteAsync(buffer.AsMemory(0, read), cancellationToken); downloaded += read; if (contentLength.HasValue) { progress?.Report((double)downloaded / contentLength.Value); } } } progress?.Report(1); } catch { File.Delete(filename); throw; } } public static void StartInstaller(string fileName) { var startInfo = new ProcessStartInfo { FileName = "msiexec.exe", UseShellExecute = true, Verb = "runas", }; startInfo.ArgumentList.Add("/i"); startInfo.ArgumentList.Add(Path.GetFullPath(fileName)); if (Process.Start(startInfo) == null) { throw new InvalidOperationException("Der Installer konnte nicht gestartet werden."); } } } }