From af02753cef168274a4248c768eedc015c78a45d9 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Tue, 23 May 2023 12:04:02 -0700 Subject: [PATCH] server/core: support built in server updates --- plugins/core/package-lock.json | 4 +-- plugins/core/package.json | 2 +- plugins/core/ui/src/components/Drawer.vue | 29 +++++++++++++------ .../components/builtin/SettingsComponent.vue | 21 ++++++++++---- server/package-lock.json | 4 +-- server/package.json | 2 +- server/src/runtime.ts | 7 +++-- server/src/scrypted-server-main.ts | 2 +- server/src/services/service-control.ts | 4 +++ 9 files changed, 51 insertions(+), 24 deletions(-) diff --git a/plugins/core/package-lock.json b/plugins/core/package-lock.json index 7eac8a55e..27d67f0d5 100644 --- a/plugins/core/package-lock.json +++ b/plugins/core/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/core", - "version": "0.1.128", + "version": "0.1.129", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/core", - "version": "0.1.128", + "version": "0.1.129", "license": "Apache-2.0", "dependencies": { "@scrypted/common": "file:../../common", diff --git a/plugins/core/package.json b/plugins/core/package.json index bbd9a2567..e2e844d4b 100644 --- a/plugins/core/package.json +++ b/plugins/core/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/core", - "version": "0.1.128", + "version": "0.1.129", "description": "Scrypted Core plugin. Provides the UI, websocket, and engine.io APIs.", "author": "Scrypted", "license": "Apache-2.0", diff --git a/plugins/core/ui/src/components/Drawer.vue b/plugins/core/ui/src/components/Drawer.vue index 2e302af60..dafb2b17b 100644 --- a/plugins/core/ui/src/components/Drawer.vue +++ b/plugins/core/ui/src/components/Drawer.vue @@ -149,20 +149,31 @@ export default { getComponentViewPath, async checkUpdateAvailable() { await this.$connectingScrypted; - const info = await this.$scrypted.systemManager.getComponent("info"); - const version = await info.getVersion(); - this.currentVersion = version; - const { updateAvailable } = await checkUpdate( - "@scrypted/server", - version + const serviceControl = await this.$scrypted.systemManager.getComponent( + "service-control" ); - this.updateAvailable = updateAvailable; - if (updateAvailable) { + try { + this.updateAvailable = await serviceControl.getUpdateAvailable(); + } + catch (e) { + // old scrypted servers dont support this call, or it may be unimplemented + // in which case fall back and determine what the install type is. + const info = await this.$scrypted.systemManager.getComponent("info"); + const version = await info.getVersion(); + this.currentVersion = version; + const { updateAvailable } = await checkUpdate( + "@scrypted/server", + version + ); + this.updateAvailable = updateAvailable; + } + + if (this.updateAvailable) { const logger = this.$scrypted.deviceManager.getDeviceLogger(); const u = new URL(window.location) u.hash = "#/component/settings"; logger.clearAlerts(); - logger.a(`Scrypted Server update available: ${updateAvailable}. ${u}`); + logger.a(`Scrypted Server update available: ${this.updateAvailable}. ${u}`); } }, filterComponents: function (category) { diff --git a/plugins/core/ui/src/components/builtin/SettingsComponent.vue b/plugins/core/ui/src/components/builtin/SettingsComponent.vue index 4f2e78f9d..0c101aa77 100644 --- a/plugins/core/ui/src/components/builtin/SettingsComponent.vue +++ b/plugins/core/ui/src/components/builtin/SettingsComponent.vue @@ -130,17 +130,28 @@ export default { const info = await this.$scrypted.systemManager.getComponent("info"); const version = await info.getVersion(); this.currentVersion = version; - const { updateAvailable } = await checkUpdate( - "@scrypted/server", - version + + const serviceControl = await this.$scrypted.systemManager.getComponent( + "service-control" ); - this.updateAvailable = updateAvailable; + try { + this.updateAvailable = await serviceControl.getUpdateAvailable(); + } + catch (e) { + // old scrypted servers dont support this call, or it may be unimplemented + // in which case fall back and determine what the install type is. + const { updateAvailable } = await checkUpdate( + "@scrypted/server", + version + ); + this.updateAvailable = updateAvailable; + } }, async loadEnv() { const info = await this.$scrypted.systemManager.getComponent("info"); const env = await info.getScryptedEnv(); this.showRestart = !!env.SCRYPTED_CAN_RESTART; - this.canUpdate = !!env.SCRYPTED_NPM_SERVE || !!env.SCRYPTED_WEBHOOK_UPDATE; + this.canUpdate = !!env.SCRYPTED_NPM_SERVE || !!env.SCRYPTED_WEBHOOK_UPDATE || !!env.SCRYPTED_CAN_UPDATE; }, async doRestart() { this.restartStatus = "Restarting..."; diff --git a/server/package-lock.json b/server/package-lock.json index f92ddc79d..97dbfecb1 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/server", - "version": "0.24.0", + "version": "0.29.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/server", - "version": "0.24.0", + "version": "0.29.0", "license": "ISC", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.10", diff --git a/server/package.json b/server/package.json index 9c85ed5aa..c68d40221 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/server", - "version": "0.24.0", + "version": "0.29.0", "description": "", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.10", diff --git a/server/src/runtime.ts b/server/src/runtime.ts index dd65f4e2d..24fa98856 100644 --- a/server/src/runtime.ts +++ b/server/src/runtime.ts @@ -83,11 +83,12 @@ export class ScryptedRuntime extends PluginHttp { }, }); pluginComponent = new PluginComponent(this); - servieControl = new ServiceControl(this); + serviceControl = new ServiceControl(this); alerts = new Alerts(this); corsControl = new CORSControl(this); addressSettings = new AddressSettings(this); usersService = new UsersService(this); + info = new Info(); pluginHosts = new Map(); constructor(public mainFilename: string, datastore: Level, insecure: http.Server, secure: https.Server, app: express.Application) { @@ -332,11 +333,11 @@ export class ScryptedRuntime extends PluginHttp { case 'SCRYPTED_SECURE_PORT': return SCRYPTED_SECURE_PORT; case 'info': - return new Info(); + return this.info; case 'plugins': return this.pluginComponent; case 'service-control': - return this.servieControl; + return this.serviceControl; case 'logger': return this.logger; case 'alerts': diff --git a/server/src/scrypted-server-main.ts b/server/src/scrypted-server-main.ts index ee1fe1282..6dc1d8c1e 100644 --- a/server/src/scrypted-server-main.ts +++ b/server/src/scrypted-server-main.ts @@ -325,7 +325,7 @@ async function start(mainFilename: string, options?: { for (const address of getHostAddresses(true, true)) { console.log(`Scrypted Server (Remote) : https://${address}:${SCRYPTED_SECURE_PORT}/`); } - console.log(`Version: : ${await new Info().getVersion()}`); + console.log(`Version: : ${await scrypted.info.getVersion()}`); console.log('#######################################################'); console.log('Scrypted insecure http service port:', SCRYPTED_INSECURE_PORT); console.log('Ports can be changed with environment variables.') diff --git a/server/src/services/service-control.ts b/server/src/services/service-control.ts index 89acfaf14..28a81f96c 100644 --- a/server/src/services/service-control.ts +++ b/server/src/services/service-control.ts @@ -15,6 +15,10 @@ export class ServiceControl { process.exit(); } + async getUpdateAvailable(): Promise { + throw new Error('getUpdateAvailable is not implemented. Updates will come out of band through Docker or npm.'); + } + async update() { const webhookUpdate = process.env.SCRYPTED_WEBHOOK_UPDATE; if (webhookUpdate) {