78 lines
3.5 KiB
C#
78 lines
3.5 KiB
C#
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<double>? 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.");
|
|
}
|
|
}
|
|
}
|
|
}
|