From c120443657af3104106a356bba976f3a0ff89e06 Mon Sep 17 00:00:00 2001 From: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> Date: Sun, 27 Apr 2025 23:57:58 +0100 Subject: [PATCH] Add checks for updated version on disk --- packages/controller/controller.ts | 2 ++ packages/controller/src/Controller.ts | 12 ++++++++++++ packages/host/host.ts | 3 ++- packages/host/src/Host.ts | 12 ++++++++++++ packages/lib/src/config/definitions.ts | 14 ++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/controller/controller.ts b/packages/controller/controller.ts index 6587e01d..97149a0c 100644 --- a/packages/controller/controller.ts +++ b/packages/controller/controller.ts @@ -354,6 +354,8 @@ async function initialize(): Promise { } } + controllerConfig.set("controller.version", version); // Allows tracking last loaded version + if (!controllerConfig.get("controller.auth_secret")) { logger.info("Generating new controller authentication secret"); let asyncRandomBytes = util.promisify(crypto.randomBytes); diff --git a/packages/controller/src/Controller.ts b/packages/controller/src/Controller.ts index 9c6b2f6c..f500d16b 100644 --- a/packages/controller/src/Controller.ts +++ b/packages/controller/src/Controller.ts @@ -523,6 +523,18 @@ export default class Controller { } requests.push(hostConnection.send(new lib.SystemInfoRequest())); } + if (!this.config.restartRequired) { + // If a restart isn't already required, then test if a new version is installed + try { + const runningVersion = this.config.get("controller.version"); + const packageJson = await fs.readJSON(path.join(__dirname, "..", "package.json")); + if (runningVersion !== packageJson.version) { + this.config.restartRequired = true; + } + } catch (err: any) { + logger.warn(`Failed to read package json:\n${err.stack ?? err.message}`); + } + } requests.push(lib.gatherSystemInfo("controller", this.canRestart, this.config.restartRequired)); const newMetrics = await Promise.all(requests); for (const metric of newMetrics) { diff --git a/packages/host/host.ts b/packages/host/host.ts index 0247e9aa..38d7fb0b 100755 --- a/packages/host/host.ts +++ b/packages/host/host.ts @@ -176,13 +176,14 @@ async function startHost() { } } + hostConfig.set("host.version", version); // Allows tracking last loaded version + if (command === "config") { await lib.handleConfigCommand(args, hostConfig, args.config); return; } // If we get here the command was run - await fs.ensureDir(hostConfig.get("host.instances_directory")); await fs.ensureDir(hostConfig.get("host.mods_directory")); await fs.ensureDir("modules"); diff --git a/packages/host/src/Host.ts b/packages/host/src/Host.ts index 2b11e696..552eed19 100644 --- a/packages/host/src/Host.ts +++ b/packages/host/src/Host.ts @@ -798,6 +798,18 @@ export default class Host extends lib.Link { } async handleSystemInfoRequest() { + if (!this.config.restartRequired) { + // If a restart isn't already required, then test if a new version is installed + try { + const runningVersion = this.config.get("host.version"); + const packageJson = await fs.readJSON(path.join(__dirname, "..", "package.json")); + if (runningVersion !== packageJson.version) { + this.config.restartRequired = true; + } + } catch (err: any) { + logger.warn(`Failed to read package json:\n${err.stack ?? err.message}`); + } + } return lib.gatherSystemInfo(this.config.get("host.id"), this.canRestart, this.config.restartRequired); } diff --git a/packages/lib/src/config/definitions.ts b/packages/lib/src/config/definitions.ts index b49e2a0a..b05123f1 100644 --- a/packages/lib/src/config/definitions.ts +++ b/packages/lib/src/config/definitions.ts @@ -4,6 +4,7 @@ import type { PluginNodeEnvInfo, PluginWebpackEnvInfo } from "../plugin"; import { Static } from "@sinclair/typebox"; export interface ControllerConfigFields { + "controller.version": string; "controller.name": string; "controller.mods_directory": string; "controller.database_directory": string; @@ -46,6 +47,12 @@ export class ControllerConfig extends classes.Config { } static fieldDefinitions: classes.ConfigDefs = { + "controller.version": { + type: "string", + initialValue: "", // Set on start + readonly: ["controller"], + hidden: true, + }, "controller.name": { title: "Name", description: "Name of the cluster.", @@ -215,6 +222,7 @@ export class ControllerConfig extends classes.Config { } export interface HostConfigFields { + "host.version": string; "host.name": string; "host.id": number; "host.factorio_directory": string; @@ -237,6 +245,12 @@ export interface HostConfigFields { export class HostConfig extends classes.Config { declare static fromJSON: (json: classes.ConfigSchema, location: classes.ConfigLocation) => HostConfig; static fieldDefinitions: classes.ConfigDefs = { + "host.version": { + type: "string", + initialValue: "", // Set on start + readonly: ["host"], + hidden: true, + }, "host.name": { description: "Name of the host", type: "string",