Implement update

This commit is contained in:
Louis Lam 2023-02-21 02:50:25 +08:00
parent 4642f9be0a
commit 22902139d2
2 changed files with 67 additions and 12 deletions

View file

@ -27,11 +27,12 @@ namespace UptimeKuma {
label.Text = "Reading latest version..."; label.Text = "Reading latest version...";
// Read json from https://uptime.kuma.pet/version // Read json from https://uptime.kuma.pet/version
var versionObj = JsonConvert.DeserializeObject<Version>(new WebClient().DownloadString("https://uptime.kuma.pet/version")); var versionJson = new WebClient().DownloadString("https://uptime.kuma.pet/version");
var versionObj = JsonConvert.DeserializeObject<Version>(versionJson);
var nodeVersion = versionObj.nodejs; var nodeVersion = versionObj.nodejs;
var uptimeKumaVersion = versionObj.latest; var uptimeKumaVersion = versionObj.latest;
var hasUpdateFile = File.Exists("update");
if (!Directory.Exists("node")) { if (!Directory.Exists("node")) {
downloadQueue.Enqueue(new DownloadItem { downloadQueue.Enqueue(new DownloadItem {
@ -41,12 +42,30 @@ namespace UptimeKuma {
}); });
} }
if (!Directory.Exists("node")) { if (!Directory.Exists("core") || hasUpdateFile) {
// It is update, rename the core folder to core.old
if (Directory.Exists("core")) {
// Remove the old core.old folder
if (Directory.Exists("core.old")) {
Directory.Delete("core.old", true);
}
Directory.Move("core", "core.old");
}
downloadQueue.Enqueue(new DownloadItem { downloadQueue.Enqueue(new DownloadItem {
URL = $"https://github.com/louislam/uptime-kuma/archive/refs/tags/{uptimeKumaVersion}.zip", URL = $"https://github.com/louislam/uptime-kuma/archive/refs/tags/{uptimeKumaVersion}.zip",
Filename = "core.zip", Filename = "core.zip",
TargetFolder = "core" TargetFolder = "core"
}); });
File.WriteAllText("version.json", versionJson);
// Delete the update file
if (hasUpdateFile) {
File.Delete("update");
}
} }
DownloadNextFile(); DownloadNextFile();
@ -75,9 +94,12 @@ namespace UptimeKuma {
void npmSetup() { void npmSetup() {
labelData.Text = ""; labelData.Text = "";
var npm = "..\\node\\npm.cmd";
var cmd = $"{npm} ci --production & {npm} run download-dist & exit";
var startInfo = new ProcessStartInfo { var startInfo = new ProcessStartInfo {
FileName = "cmd.exe", FileName = "cmd.exe",
Arguments = "run setup", Arguments = $"/k \"{cmd}\"",
RedirectStandardOutput = false, RedirectStandardOutput = false,
RedirectStandardError = false, RedirectStandardError = false,
RedirectStandardInput = true, RedirectStandardInput = true,
@ -89,11 +111,11 @@ namespace UptimeKuma {
var process = new Process(); var process = new Process();
process.StartInfo = startInfo; process.StartInfo = startInfo;
process.EnableRaisingEvents = true; process.EnableRaisingEvents = true;
process.Exited += (object _, EventArgs e) => { process.Exited += (_, e) => {
progressBar.Value = 100; progressBar.Value = 100;
if (process.ExitCode == 0) { if (process.ExitCode == 0) {
Task.Delay(2000).ContinueWith((task) => { Task.Delay(2000).ContinueWith(_ => {
Application.Restart(); Application.Restart();
}); });
label.Text = "Done"; label.Text = "Done";
@ -105,10 +127,7 @@ namespace UptimeKuma {
process.Start(); process.Start();
label.Text = "Installing dependencies and download dist files"; label.Text = "Installing dependencies and download dist files";
progressBar.Value = 50; progressBar.Value = 50;
process.WaitForExit();
process.StandardInput.WriteLine("\"../node/npm\" ci --production");
process.StandardInput.WriteLine("\"../node/npm\" run download-dist");
process.StandardInput.WriteLine("exit");
} }
void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {

View file

@ -4,11 +4,13 @@ using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Microsoft.Win32; using Microsoft.Win32;
using Newtonsoft.Json;
using UptimeKuma.Properties; using UptimeKuma.Properties;
namespace UptimeKuma { namespace UptimeKuma {
@ -56,7 +58,9 @@ namespace UptimeKuma {
trayIcon.MouseDoubleClick += new MouseEventHandler(Open); trayIcon.MouseDoubleClick += new MouseEventHandler(Open);
trayIcon.Visible = true; trayIcon.Visible = true;
if (Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules") && Directory.Exists("core/dist")) { var hasUpdateFile = File.Exists("update");
if (!hasUpdateFile && Directory.Exists("core") && Directory.Exists("node") && Directory.Exists("core/node_modules") && Directory.Exists("core/dist")) {
// Go go go // Go go go
StartProcess(); StartProcess();
} else { } else {
@ -110,6 +114,10 @@ namespace UptimeKuma {
} }
} }
void StopProcess() {
process?.Kill();
}
void Open(object sender, EventArgs e) { void Open(object sender, EventArgs e) {
Process.Start("http://localhost:3001"); Process.Start("http://localhost:3001");
} }
@ -119,7 +127,35 @@ namespace UptimeKuma {
} }
void CheckForUpdate(object sender, EventArgs e) { void CheckForUpdate(object sender, EventArgs e) {
Process.Start("https://github.com/louislam/uptime-kuma/releases"); var needUpdate = false;
// Check version.json exists
if (File.Exists("version.json")) {
// Load version.json and compare with the latest version from GitHub
var currentVersionObj = JsonConvert.DeserializeObject<Version>(File.ReadAllText("version.json"));
var versionJson = new WebClient().DownloadString("https://uptime.kuma.pet/version");
var latestVersionObj = JsonConvert.DeserializeObject<Version>(versionJson);
// Compare version, if the latest version is newer, then update
if (new System.Version(latestVersionObj.latest).CompareTo(new System.Version(currentVersionObj.latest)) > 0) {
var result = MessageBox.Show("A new version is available. Do you want to update?", "Update", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes) {
// Create a empty file `update`, so the app will download the core files again at startup
File.Create("update").Close();
trayIcon.Visible = false;
process?.Kill();
// Restart the app, it will download the core files again at startup
Application.Restart();
}
} else {
MessageBox.Show("You are using the latest version.");
}
}
} }
void VisitGitHub(object sender, EventArgs e) void VisitGitHub(object sender, EventArgs e)