@fastybird/smart-panel-backend 0.4.0-alpha.1 → 0.4.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.module.js +0 -17
- package/dist/app.module.js.map +1 -1
- package/dist/common/filters/not-found-exception.filter.d.ts +4 -0
- package/dist/common/filters/not-found-exception.filter.js +22 -1
- package/dist/common/filters/not-found-exception.filter.js.map +1 -1
- package/dist/common/services/app-instance-holder.service.d.ts +1 -2
- package/dist/common/services/app-instance-holder.service.js.map +1 -1
- package/dist/common/utils/config.utils.d.ts +0 -1
- package/dist/common/utils/config.utils.js +1 -11
- package/dist/common/utils/config.utils.js.map +1 -1
- package/dist/main.js +15 -5
- package/dist/main.js.map +1 -1
- package/dist/migrations/1000000000000-InitialSetup.js +8 -0
- package/dist/migrations/1000000000000-InitialSetup.js.map +1 -1
- package/dist/modules/buddy/buddy.module.js +2 -1
- package/dist/modules/buddy/buddy.module.js.map +1 -1
- package/dist/modules/buddy/buddy.utils.d.ts +8 -0
- package/dist/modules/buddy/buddy.utils.js +49 -0
- package/dist/modules/buddy/buddy.utils.js.map +1 -1
- package/dist/modules/buddy/controllers/buddy-suggestions.controller.js +2 -2
- package/dist/modules/buddy/controllers/buddy-suggestions.controller.js.map +1 -1
- package/dist/modules/buddy/entities/buddy-conversation.entity.js +3 -3
- package/dist/modules/buddy/entities/buddy-conversation.entity.js.map +1 -1
- package/dist/modules/buddy/entities/buddy-message.entity.js +2 -2
- package/dist/modules/buddy/entities/buddy-message.entity.js.map +1 -1
- package/dist/modules/buddy/entities/buddy-suggestion.entity.d.ts +19 -0
- package/dist/modules/buddy/entities/buddy-suggestion.entity.js +93 -0
- package/dist/modules/buddy/entities/buddy-suggestion.entity.js.map +1 -0
- package/dist/modules/buddy/platforms/llm-provider.platform.d.ts +6 -0
- package/dist/modules/buddy/platforms/openai-sdk.utils.d.ts +2 -1
- package/dist/modules/buddy/platforms/openai-sdk.utils.js +12 -1
- package/dist/modules/buddy/platforms/openai-sdk.utils.js.map +1 -1
- package/dist/modules/buddy/services/buddy-conversation.service.js +23 -8
- package/dist/modules/buddy/services/buddy-conversation.service.js.map +1 -1
- package/dist/modules/buddy/services/heartbeat.service.js +1 -1
- package/dist/modules/buddy/services/heartbeat.service.js.map +1 -1
- package/dist/modules/buddy/services/llm-provider.service.js +2 -10
- package/dist/modules/buddy/services/llm-provider.service.js.map +1 -1
- package/dist/modules/buddy/services/module-reset.service.d.ts +3 -1
- package/dist/modules/buddy/services/module-reset.service.js +6 -1
- package/dist/modules/buddy/services/module-reset.service.js.map +1 -1
- package/dist/modules/buddy/services/pattern-detector.service.d.ts +4 -1
- package/dist/modules/buddy/services/pattern-detector.service.js +10 -3
- package/dist/modules/buddy/services/pattern-detector.service.js.map +1 -1
- package/dist/modules/buddy/services/scene-suggestion-evaluator.service.d.ts +4 -1
- package/dist/modules/buddy/services/scene-suggestion-evaluator.service.js +10 -4
- package/dist/modules/buddy/services/scene-suggestion-evaluator.service.js.map +1 -1
- package/dist/modules/buddy/services/stt-provider.service.js +2 -10
- package/dist/modules/buddy/services/stt-provider.service.js.map +1 -1
- package/dist/modules/buddy/services/suggestion-engine.service.d.ts +19 -13
- package/dist/modules/buddy/services/suggestion-engine.service.js +170 -103
- package/dist/modules/buddy/services/suggestion-engine.service.js.map +1 -1
- package/dist/modules/buddy/services/tts-provider.service.js +2 -10
- package/dist/modules/buddy/services/tts-provider.service.js.map +1 -1
- package/dist/modules/extensions/controllers/actions.controller.d.ts +9 -4
- package/dist/modules/extensions/controllers/actions.controller.js +63 -10
- package/dist/modules/extensions/controllers/actions.controller.js.map +1 -1
- package/dist/modules/extensions/extensions.module.js +3 -1
- package/dist/modules/extensions/extensions.module.js.map +1 -1
- package/dist/modules/extensions/extensions.openapi.d.ts +3 -3
- package/dist/modules/extensions/extensions.openapi.js +2 -0
- package/dist/modules/extensions/extensions.openapi.js.map +1 -1
- package/dist/modules/extensions/models/action.model.d.ts +13 -0
- package/dist/modules/extensions/models/action.model.js +87 -1
- package/dist/modules/extensions/models/action.model.js.map +1 -1
- package/dist/modules/extensions/models/actions-response.model.d.ts +4 -1
- package/dist/modules/extensions/models/actions-response.model.js +19 -1
- package/dist/modules/extensions/models/actions-response.model.js.map +1 -1
- package/dist/modules/extensions/services/action-audit.service.d.ts +21 -0
- package/dist/modules/extensions/services/action-audit.service.js +49 -0
- package/dist/modules/extensions/services/action-audit.service.js.map +1 -0
- package/dist/modules/extensions/services/extension-action-registry.service.d.ts +6 -1
- package/dist/modules/extensions/services/extension-action-registry.service.js +22 -3
- package/dist/modules/extensions/services/extension-action-registry.service.js.map +1 -1
- package/dist/modules/extensions/services/extension-action.interface.d.ts +3 -0
- package/dist/modules/extensions/services/extension-action.interface.js +3 -1
- package/dist/modules/extensions/services/extension-action.interface.js.map +1 -1
- package/dist/modules/swagger/commands/serve-swagger.command.d.ts +14 -0
- package/dist/modules/swagger/commands/serve-swagger.command.js +60 -0
- package/dist/modules/swagger/commands/serve-swagger.command.js.map +1 -0
- package/dist/modules/swagger/swagger.module.js +2 -0
- package/dist/modules/swagger/swagger.module.js.map +1 -1
- package/dist/modules/system/scripts/update-worker.sh +42 -32
- package/dist/modules/system/services/system-command.service.d.ts +7 -1
- package/dist/modules/system/services/system-command.service.js +24 -4
- package/dist/modules/system/services/system-command.service.js.map +1 -1
- package/dist/modules/system/services/update-executor.service.d.ts +4 -0
- package/dist/modules/system/services/update-executor.service.js +83 -0
- package/dist/modules/system/services/update-executor.service.js.map +1 -1
- package/dist/modules/system/system.constants.d.ts +2 -0
- package/dist/modules/system/system.constants.js +2 -0
- package/dist/modules/system/system.constants.js.map +1 -1
- package/dist/modules/system/system.module.js +6 -3
- package/dist/modules/system/system.module.js.map +1 -1
- package/dist/modules/users/controllers/users.controller.js +9 -0
- package/dist/modules/users/controllers/users.controller.js.map +1 -1
- package/dist/modules/users/dto/update-user.dto.d.ts +1 -0
- package/dist/modules/users/dto/update-user.dto.js +14 -1
- package/dist/modules/users/dto/update-user.dto.js.map +1 -1
- package/dist/modules/users/services/users.service.d.ts +1 -0
- package/dist/modules/users/services/users.service.js +10 -0
- package/dist/modules/users/services/users.service.js.map +1 -1
- package/dist/modules/websocket/gateway/websocket.gateway.js +5 -2
- package/dist/modules/websocket/gateway/websocket.gateway.js.map +1 -1
- package/dist/modules/websocket/services/command-event-registry.service.d.ts +3 -1
- package/dist/modules/websocket/services/command-event-registry.service.js +5 -4
- package/dist/modules/websocket/services/command-event-registry.service.js.map +1 -1
- package/dist/plugins/buddy-openai/platforms/openai.provider.js +1 -0
- package/dist/plugins/buddy-openai/platforms/openai.provider.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +5 -0
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.d.ts +1 -0
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js +6 -4
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +2 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
- package/dist/plugins/simulator/services/simulator-actions.service.js +3 -0
- package/dist/plugins/simulator/services/simulator-actions.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ServeSwaggerCommand = void 0;
|
|
13
|
+
const nest_commander_1 = require("nest-commander");
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const app_constants_1 = require("../../../app.constants");
|
|
16
|
+
const app_instance_holder_service_1 = require("../../../common/services/app-instance-holder.service");
|
|
17
|
+
const swagger_document_service_1 = require("../services/swagger-document.service");
|
|
18
|
+
let ServeSwaggerCommand = class ServeSwaggerCommand extends nest_commander_1.CommandRunner {
|
|
19
|
+
constructor(swaggerService, appHolder) {
|
|
20
|
+
super();
|
|
21
|
+
this.swaggerService = swaggerService;
|
|
22
|
+
this.appHolder = appHolder;
|
|
23
|
+
}
|
|
24
|
+
async run(_passedParams, options) {
|
|
25
|
+
const app = this.appHolder.getApp();
|
|
26
|
+
const port = options?.port ?? parseInt(process.env.FB_BACKEND_PORT || '3000', 10);
|
|
27
|
+
console.log('\x1b[36m📖 Starting Swagger UI server...\x1b[0m\n');
|
|
28
|
+
this.swaggerService.setup(app);
|
|
29
|
+
await app.listen(port, '0.0.0.0');
|
|
30
|
+
console.log(`\x1b[32m✅ Swagger UI available at http://localhost:${port}/${app_constants_1.API_PREFIX}/docs\x1b[0m`);
|
|
31
|
+
console.log('\x1b[90mPress Ctrl+C to stop\x1b[0m\n');
|
|
32
|
+
await new Promise((resolve) => {
|
|
33
|
+
process.on('SIGINT', resolve);
|
|
34
|
+
process.on('SIGTERM', resolve);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
parsePort(val) {
|
|
38
|
+
return parseInt(val, 10);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.ServeSwaggerCommand = ServeSwaggerCommand;
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, nest_commander_1.Option)({
|
|
44
|
+
flags: '-p, --port <port>',
|
|
45
|
+
description: 'Port to run the Swagger UI server on (default: FB_BACKEND_PORT or 3000)',
|
|
46
|
+
}),
|
|
47
|
+
__metadata("design:type", Function),
|
|
48
|
+
__metadata("design:paramtypes", [String]),
|
|
49
|
+
__metadata("design:returntype", Number)
|
|
50
|
+
], ServeSwaggerCommand.prototype, "parsePort", null);
|
|
51
|
+
exports.ServeSwaggerCommand = ServeSwaggerCommand = __decorate([
|
|
52
|
+
(0, nest_commander_1.Command)({
|
|
53
|
+
name: 'swagger:serve',
|
|
54
|
+
description: 'Start a standalone Swagger UI server for API documentation',
|
|
55
|
+
}),
|
|
56
|
+
(0, common_1.Injectable)(),
|
|
57
|
+
__metadata("design:paramtypes", [swagger_document_service_1.SwaggerDocumentService,
|
|
58
|
+
app_instance_holder_service_1.AppInstanceHolder])
|
|
59
|
+
], ServeSwaggerCommand);
|
|
60
|
+
//# sourceMappingURL=serve-swagger.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-swagger.command.js","sourceRoot":"","sources":["../../../../src/modules/swagger/commands/serve-swagger.command.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAgE;AAEhE,2CAA4C;AAE5C,0DAAoD;AACpD,sGAAyF;AACzF,mFAA8E;AAWvE,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,8BAAa;IACrD,YACkB,cAAsC,EACtC,SAA4B;QAE7C,KAAK,EAAE,CAAC;QAHS,mBAAc,GAAd,cAAc,CAAwB;QACtC,cAAS,GAAT,SAAS,CAAmB;IAG9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,aAAuB,EAAE,OAA6B;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QAElF,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAEjE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,sDAAsD,IAAI,IAAI,0BAAU,cAAc,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QAIrD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IAMD,SAAS,CAAC,GAAW;QACpB,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;CACD,CAAA;AApCY,kDAAmB;AAiC/B;IAJC,IAAA,uBAAM,EAAC;QACP,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,yEAAyE;KACtF,CAAC;;;;oDAGD;8BAnCW,mBAAmB;IAL/B,IAAA,wBAAO,EAAC;QACR,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,4DAA4D;KACzE,CAAC;IACD,IAAA,mBAAU,GAAE;qCAGsB,iDAAsB;QAC3B,+CAAiB;GAHlC,mBAAmB,CAoC/B"}
|
|
@@ -10,6 +10,7 @@ exports.SwaggerModule = void 0;
|
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const app_instance_holder_service_1 = require("../../common/services/app-instance-holder.service");
|
|
12
12
|
const generate_openapi_command_1 = require("./commands/generate-openapi.command");
|
|
13
|
+
const serve_swagger_command_1 = require("./commands/serve-swagger.command");
|
|
13
14
|
const extended_discriminator_service_1 = require("./services/extended-discriminator.service");
|
|
14
15
|
const swagger_document_service_1 = require("./services/swagger-document.service");
|
|
15
16
|
const swagger_models_registry_service_1 = require("./services/swagger-models-registry.service");
|
|
@@ -25,6 +26,7 @@ exports.SwaggerModule = SwaggerModule = __decorate([
|
|
|
25
26
|
extended_discriminator_service_1.ExtendedDiscriminatorService,
|
|
26
27
|
app_instance_holder_service_1.AppInstanceHolder,
|
|
27
28
|
generate_openapi_command_1.GenerateOpenapiCommand,
|
|
29
|
+
serve_swagger_command_1.ServeSwaggerCommand,
|
|
28
30
|
],
|
|
29
31
|
exports: [swagger_document_service_1.SwaggerDocumentService, swagger_models_registry_service_1.SwaggerModelsRegistryService, extended_discriminator_service_1.ExtendedDiscriminatorService, app_instance_holder_service_1.AppInstanceHolder],
|
|
30
32
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger.module.js","sourceRoot":"","sources":["../../../src/modules/swagger/swagger.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAEhD,mGAAsF;AAEtF,kFAA6E;AAC7E,8FAAyF;AACzF,kFAA6E;AAC7E,gGAA0F;
|
|
1
|
+
{"version":3,"file":"swagger.module.js","sourceRoot":"","sources":["../../../src/modules/swagger/swagger.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAEhD,mGAAsF;AAEtF,kFAA6E;AAC7E,4EAAuE;AACvE,8FAAyF;AACzF,kFAA6E;AAC7E,gGAA0F;AAcnF,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IAZzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACP,SAAS,EAAE;YACV,iDAAsB;YACtB,8DAA4B;YAC5B,6DAA4B;YAC5B,+CAAiB;YACjB,iDAAsB;YACtB,2CAAmB;SACnB;QACD,OAAO,EAAE,CAAC,iDAAsB,EAAE,8DAA4B,EAAE,6DAA4B,EAAE,+CAAiB,CAAC;KAChH,CAAC;GACW,aAAa,CAAG"}
|
|
@@ -60,15 +60,27 @@ trap cleanup EXIT
|
|
|
60
60
|
# Image-based update (Raspbian image installs)
|
|
61
61
|
# ──────────────────────────────────────────────────────────────
|
|
62
62
|
if [ "$INSTALL_TYPE" = "image" ]; then
|
|
63
|
-
# Verify passwordless sudo is available (required for systemctl, chown, ln)
|
|
64
|
-
if ! sudo -n true 2>/dev/null; then
|
|
65
|
-
update_status "failed" "failed" "Passwordless sudo is not available for this user"
|
|
66
|
-
exit 1
|
|
67
|
-
fi
|
|
68
63
|
# Strip leading 'v' prefix if present to avoid double-prefixed dirs like vv1.0.0
|
|
69
64
|
CLEAN_VERSION="${VERSION#v}"
|
|
70
65
|
NEW_VERSION_DIR="${IMAGE_BASE_DIR}/v${CLEAN_VERSION}"
|
|
71
66
|
CURRENT_LINK="${IMAGE_BASE_DIR}/current"
|
|
67
|
+
|
|
68
|
+
# Verify passwordless sudo is available for all required commands.
|
|
69
|
+
# Without -n, sudo may hang waiting for a password on a detached process.
|
|
70
|
+
SUDO_CMDS=(
|
|
71
|
+
"/usr/bin/true"
|
|
72
|
+
"/usr/bin/systemctl stop smart-panel"
|
|
73
|
+
"/usr/bin/systemctl start smart-panel"
|
|
74
|
+
"/usr/bin/chown -R smart-panel:smart-panel ${NEW_VERSION_DIR}"
|
|
75
|
+
"/usr/bin/ln -sfn ${NEW_VERSION_DIR} ${CURRENT_LINK}"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
for cmd in "${SUDO_CMDS[@]}"; do
|
|
79
|
+
if ! sudo -n -l $cmd >/dev/null 2>&1; then
|
|
80
|
+
update_status "failed" "failed" "Passwordless sudo not available for: $cmd"
|
|
81
|
+
exit 1
|
|
82
|
+
fi
|
|
83
|
+
done
|
|
72
84
|
PREVIOUS_TARGET=""
|
|
73
85
|
|
|
74
86
|
# Save the current version for rollback
|
|
@@ -122,26 +134,24 @@ if [ "$INSTALL_TYPE" = "image" ]; then
|
|
|
122
134
|
exit 1
|
|
123
135
|
}
|
|
124
136
|
|
|
125
|
-
# ──
|
|
137
|
+
# ── Verify dependencies ──
|
|
126
138
|
cd "$NEW_VERSION_DIR"
|
|
127
139
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
# ── Rebuild native modules ──
|
|
135
|
-
if [ -x "${IMAGE_BASE_DIR}/rebuild-native.sh" ]; then
|
|
136
|
-
"${IMAGE_BASE_DIR}/rebuild-native.sh" "${NEW_VERSION_DIR}" 2>&1 || {
|
|
140
|
+
# The release tarball includes pre-built node_modules with native modules
|
|
141
|
+
# compiled for ARM64 by the CI arm-runner. Only install as fallback if
|
|
142
|
+
# node_modules is missing (e.g. manually extracted tarball without deps).
|
|
143
|
+
if [ ! -d "node_modules" ]; then
|
|
144
|
+
npm install --omit=dev 2>&1 || {
|
|
137
145
|
rm -rf "$NEW_VERSION_DIR"
|
|
138
|
-
update_status "failed" "failed" "
|
|
146
|
+
update_status "failed" "failed" "npm install failed"
|
|
139
147
|
exit 1
|
|
140
148
|
}
|
|
141
149
|
fi
|
|
142
150
|
|
|
143
151
|
# Set ownership
|
|
144
|
-
sudo
|
|
152
|
+
# All sudo calls use -n (non-interactive) to fail fast instead of
|
|
153
|
+
# hanging on password prompt when running as a detached process.
|
|
154
|
+
sudo -n chown -R smart-panel:smart-panel "$NEW_VERSION_DIR" || {
|
|
145
155
|
rm -rf "$NEW_VERSION_DIR"
|
|
146
156
|
update_status "failed" "failed" "Failed to set ownership on ${NEW_VERSION_DIR}"
|
|
147
157
|
exit 1
|
|
@@ -149,15 +159,15 @@ if [ "$INSTALL_TYPE" = "image" ]; then
|
|
|
149
159
|
|
|
150
160
|
# ── Stop service ──
|
|
151
161
|
update_status "stopping" "stopping"
|
|
152
|
-
sudo systemctl stop smart-panel 2>/dev/null || true
|
|
162
|
+
sudo -n systemctl stop smart-panel 2>/dev/null || true
|
|
153
163
|
|
|
154
164
|
# ── Switch symlink (atomic on same filesystem) ──
|
|
155
|
-
sudo ln -sfn "$NEW_VERSION_DIR" "$CURRENT_LINK" || {
|
|
165
|
+
sudo -n ln -sfn "$NEW_VERSION_DIR" "$CURRENT_LINK" || {
|
|
156
166
|
# Revert on failure
|
|
157
167
|
if [ -n "$PREVIOUS_TARGET" ]; then
|
|
158
|
-
sudo ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"
|
|
168
|
+
sudo -n ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"
|
|
159
169
|
fi
|
|
160
|
-
sudo systemctl start smart-panel 2>/dev/null || true
|
|
170
|
+
sudo -n systemctl start smart-panel 2>/dev/null || true
|
|
161
171
|
update_status "failed" "failed" "Failed to switch version symlink"
|
|
162
172
|
exit 1
|
|
163
173
|
}
|
|
@@ -178,10 +188,10 @@ if [ "$INSTALL_TYPE" = "image" ]; then
|
|
|
178
188
|
) 2>&1 || {
|
|
179
189
|
# Migration failed — revert symlink if possible
|
|
180
190
|
update_status "stopping" "stopping"
|
|
181
|
-
sudo systemctl stop smart-panel 2>/dev/null || true
|
|
191
|
+
sudo -n systemctl stop smart-panel 2>/dev/null || true
|
|
182
192
|
|
|
183
193
|
if [ -n "$PREVIOUS_TARGET" ]; then
|
|
184
|
-
if sudo ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"; then
|
|
194
|
+
if sudo -n ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"; then
|
|
185
195
|
rm -rf "$NEW_VERSION_DIR"
|
|
186
196
|
update_status "failed" "failed" "Database migration failed — reverted to previous version"
|
|
187
197
|
else
|
|
@@ -193,18 +203,18 @@ if [ "$INSTALL_TYPE" = "image" ]; then
|
|
|
193
203
|
update_status "failed" "failed" "Database migration failed — no previous version to revert to"
|
|
194
204
|
fi
|
|
195
205
|
|
|
196
|
-
sudo systemctl start smart-panel 2>/dev/null || true
|
|
206
|
+
sudo -n systemctl start smart-panel 2>/dev/null || true
|
|
197
207
|
exit 1
|
|
198
208
|
}
|
|
199
209
|
fi
|
|
200
210
|
|
|
201
211
|
# ── Start service ──
|
|
202
212
|
update_status "starting" "starting"
|
|
203
|
-
sudo systemctl start smart-panel 2>&1 || {
|
|
213
|
+
sudo -n systemctl start smart-panel 2>&1 || {
|
|
204
214
|
# Try to revert if start fails
|
|
205
215
|
if [ -n "$PREVIOUS_TARGET" ]; then
|
|
206
|
-
sudo ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"
|
|
207
|
-
sudo systemctl start smart-panel 2>/dev/null || true
|
|
216
|
+
sudo -n ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"
|
|
217
|
+
sudo -n systemctl start smart-panel 2>/dev/null || true
|
|
208
218
|
fi
|
|
209
219
|
update_status "failed" "failed" "Failed to start service after update"
|
|
210
220
|
exit 1
|
|
@@ -243,7 +253,7 @@ update_status "downloading" "downloading"
|
|
|
243
253
|
|
|
244
254
|
# Stop the service
|
|
245
255
|
update_status "stopping" "stopping"
|
|
246
|
-
sudo systemctl stop smart-panel 2>/dev/null || true
|
|
256
|
+
sudo -n systemctl stop smart-panel 2>/dev/null || true
|
|
247
257
|
|
|
248
258
|
# Install the update
|
|
249
259
|
update_status "installing" "installing"
|
|
@@ -251,13 +261,13 @@ update_status "installing" "installing"
|
|
|
251
261
|
if [ "$VERSION" = "latest" ]; then
|
|
252
262
|
npm update -g @fastybird/smart-panel 2>&1 || {
|
|
253
263
|
update_status "failed" "failed" "npm update failed"
|
|
254
|
-
sudo systemctl start smart-panel 2>/dev/null || true
|
|
264
|
+
sudo -n systemctl start smart-panel 2>/dev/null || true
|
|
255
265
|
exit 1
|
|
256
266
|
}
|
|
257
267
|
else
|
|
258
268
|
npm install -g "@fastybird/smart-panel@$VERSION" 2>&1 || {
|
|
259
269
|
update_status "failed" "failed" "npm install failed for version $VERSION"
|
|
260
|
-
sudo systemctl start smart-panel 2>/dev/null || true
|
|
270
|
+
sudo -n systemctl start smart-panel 2>/dev/null || true
|
|
261
271
|
exit 1
|
|
262
272
|
}
|
|
263
273
|
fi
|
|
@@ -273,14 +283,14 @@ if [ -f "$(npm root -g)/@fastybird/smart-panel/dataSource.js" ]; then
|
|
|
273
283
|
migration:run \
|
|
274
284
|
-d "$(npm root -g)/@fastybird/smart-panel/dataSource.js" 2>&1 || {
|
|
275
285
|
update_status "failed" "failed" "Database migration failed"
|
|
276
|
-
sudo systemctl start smart-panel 2>/dev/null || true
|
|
286
|
+
sudo -n systemctl start smart-panel 2>/dev/null || true
|
|
277
287
|
exit 1
|
|
278
288
|
}
|
|
279
289
|
fi
|
|
280
290
|
|
|
281
291
|
# Start the service
|
|
282
292
|
update_status "starting" "starting"
|
|
283
|
-
sudo systemctl start smart-panel 2>&1 || {
|
|
293
|
+
sudo -n systemctl start smart-panel 2>&1 || {
|
|
284
294
|
update_status "failed" "failed" "Failed to start service after update"
|
|
285
295
|
exit 1
|
|
286
296
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { OnModuleInit } from '@nestjs/common';
|
|
2
2
|
import { ModuleRef } from '@nestjs/core';
|
|
3
3
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
4
|
+
import { AppInstanceHolder } from '../../../common/services/app-instance-holder.service';
|
|
4
5
|
import { TokensService } from '../../auth/services/tokens.service';
|
|
5
6
|
import { PluginServiceManagerService } from '../../extensions/services/plugin-service-manager.service';
|
|
6
7
|
import { PlatformService } from '../../platform/services/platform.service';
|
|
@@ -13,10 +14,11 @@ export declare class SystemCommandService implements OnModuleInit {
|
|
|
13
14
|
private readonly platformService;
|
|
14
15
|
private readonly tokensService;
|
|
15
16
|
private readonly eventEmitter;
|
|
17
|
+
private readonly appInstanceHolder;
|
|
16
18
|
private readonly logger;
|
|
17
19
|
private displaysService;
|
|
18
20
|
private permitJoinService;
|
|
19
|
-
constructor(moduleRef: ModuleRef, factoryResetRegistry: FactoryResetRegistryService, pluginServiceManager: PluginServiceManagerService, platformService: PlatformService, tokensService: TokensService, eventEmitter: EventEmitter2);
|
|
21
|
+
constructor(moduleRef: ModuleRef, factoryResetRegistry: FactoryResetRegistryService, pluginServiceManager: PluginServiceManagerService, platformService: PlatformService, tokensService: TokensService, eventEmitter: EventEmitter2, appInstanceHolder: AppInstanceHolder);
|
|
20
22
|
onModuleInit(): void;
|
|
21
23
|
reboot(user: ClientUserDto): Promise<{
|
|
22
24
|
success: boolean;
|
|
@@ -26,6 +28,10 @@ export declare class SystemCommandService implements OnModuleInit {
|
|
|
26
28
|
success: boolean;
|
|
27
29
|
reason?: string;
|
|
28
30
|
}>;
|
|
31
|
+
restartService(user: ClientUserDto): Promise<{
|
|
32
|
+
success: boolean;
|
|
33
|
+
reason?: string;
|
|
34
|
+
}>;
|
|
29
35
|
factoryReset(user: ClientUserDto): Promise<{
|
|
30
36
|
success: boolean;
|
|
31
37
|
reason?: string;
|
|
@@ -14,6 +14,7 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const core_1 = require("@nestjs/core");
|
|
15
15
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
16
16
|
const logger_1 = require("../../../common/logger");
|
|
17
|
+
const app_instance_holder_service_1 = require("../../../common/services/app-instance-holder.service");
|
|
17
18
|
const auth_constants_1 = require("../../auth/auth.constants");
|
|
18
19
|
const tokens_service_1 = require("../../auth/services/tokens.service");
|
|
19
20
|
const displays_constants_1 = require("../../displays/displays.constants");
|
|
@@ -25,13 +26,14 @@ const platform_service_1 = require("../../platform/services/platform.service");
|
|
|
25
26
|
const system_constants_1 = require("../system.constants");
|
|
26
27
|
const factory_reset_registry_service_1 = require("./factory-reset-registry.service");
|
|
27
28
|
let SystemCommandService = class SystemCommandService {
|
|
28
|
-
constructor(moduleRef, factoryResetRegistry, pluginServiceManager, platformService, tokensService, eventEmitter) {
|
|
29
|
+
constructor(moduleRef, factoryResetRegistry, pluginServiceManager, platformService, tokensService, eventEmitter, appInstanceHolder) {
|
|
29
30
|
this.moduleRef = moduleRef;
|
|
30
31
|
this.factoryResetRegistry = factoryResetRegistry;
|
|
31
32
|
this.pluginServiceManager = pluginServiceManager;
|
|
32
33
|
this.platformService = platformService;
|
|
33
34
|
this.tokensService = tokensService;
|
|
34
35
|
this.eventEmitter = eventEmitter;
|
|
36
|
+
this.appInstanceHolder = appInstanceHolder;
|
|
35
37
|
this.logger = (0, logger_1.createExtensionLogger)(system_constants_1.SYSTEM_MODULE_NAME, 'SystemCommandService');
|
|
36
38
|
}
|
|
37
39
|
onModuleInit() {
|
|
@@ -58,7 +60,7 @@ let SystemCommandService = class SystemCommandService {
|
|
|
58
60
|
this.eventEmitter.emit(system_constants_1.EventType.SYSTEM_REBOOT, {
|
|
59
61
|
triggered_by: user.id,
|
|
60
62
|
status: 'err',
|
|
61
|
-
reason: '
|
|
63
|
+
reason: 'not supported',
|
|
62
64
|
});
|
|
63
65
|
return {
|
|
64
66
|
success: false,
|
|
@@ -96,7 +98,7 @@ let SystemCommandService = class SystemCommandService {
|
|
|
96
98
|
this.eventEmitter.emit(system_constants_1.EventType.SYSTEM_POWER_OFF, {
|
|
97
99
|
triggered_by: user.id,
|
|
98
100
|
status: 'err',
|
|
99
|
-
reason: '
|
|
101
|
+
reason: 'not supported',
|
|
100
102
|
});
|
|
101
103
|
return {
|
|
102
104
|
success: false,
|
|
@@ -114,6 +116,23 @@ let SystemCommandService = class SystemCommandService {
|
|
|
114
116
|
};
|
|
115
117
|
}
|
|
116
118
|
}
|
|
119
|
+
async restartService(user) {
|
|
120
|
+
this.logger.log('[SYSTEM] Service restart requested — performing graceful shutdown');
|
|
121
|
+
try {
|
|
122
|
+
this.eventEmitter.emit(system_constants_1.EventType.SYSTEM_SERVICE_RESTART, {
|
|
123
|
+
triggered_by: user.id,
|
|
124
|
+
status: 'processing',
|
|
125
|
+
});
|
|
126
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
127
|
+
const app = this.appInstanceHolder.getApp();
|
|
128
|
+
await app.close();
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.logger.warn(`Error during graceful shutdown: ${error.message}`);
|
|
132
|
+
}
|
|
133
|
+
process.exit(0);
|
|
134
|
+
return { success: true };
|
|
135
|
+
}
|
|
117
136
|
async factoryReset(user) {
|
|
118
137
|
try {
|
|
119
138
|
this.eventEmitter.emit(system_constants_1.EventType.SYSTEM_FACTORY_RESET, {
|
|
@@ -194,6 +213,7 @@ exports.SystemCommandService = SystemCommandService = __decorate([
|
|
|
194
213
|
plugin_service_manager_service_1.PluginServiceManagerService,
|
|
195
214
|
platform_service_1.PlatformService,
|
|
196
215
|
tokens_service_1.TokensService,
|
|
197
|
-
event_emitter_1.EventEmitter2
|
|
216
|
+
event_emitter_1.EventEmitter2,
|
|
217
|
+
app_instance_holder_service_1.AppInstanceHolder])
|
|
198
218
|
], SystemCommandService);
|
|
199
219
|
//# sourceMappingURL=system-command.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-command.service.js","sourceRoot":"","sources":["../../../../src/modules/system/services/system-command.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,uCAAyC;AACzC,yDAAsD;AAEtD,mDAA+D;AAC/D,8DAA2D;AAC3D,uEAAmE;AACnE,0EAAmE;AACnE,+EAA2E;AAC3E,qFAAgF;AAChF,6GAAuG;AACvG,4EAAmF;AACnF,+EAA2E;AAE3E,0DAAoE;AAEpE,qFAA+E;AAGxE,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAMhC,YACkB,SAAoB,EACpB,oBAAiD,EACjD,oBAAiD,EACjD,eAAgC,EAChC,aAA4B,EAC5B,YAA2B;
|
|
1
|
+
{"version":3,"file":"system-command.service.js","sourceRoot":"","sources":["../../../../src/modules/system/services/system-command.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,13 @@ export interface UpdateProgressFile {
|
|
|
12
12
|
export declare class UpdateExecutorService implements OnModuleInit {
|
|
13
13
|
private readonly updateService;
|
|
14
14
|
private readonly logger;
|
|
15
|
+
private statusPollTimer;
|
|
16
|
+
private progressHighWaterMark;
|
|
15
17
|
constructor(updateService: UpdateService);
|
|
16
18
|
onModuleInit(): void;
|
|
17
19
|
private checkPendingUpdateStatus;
|
|
18
20
|
startUpdate(targetVersion: string): Promise<void>;
|
|
21
|
+
private startStatusPolling;
|
|
22
|
+
private stopStatusPolling;
|
|
19
23
|
private writeStatusFile;
|
|
20
24
|
}
|
|
@@ -51,10 +51,22 @@ const system_constants_1 = require("../system.constants");
|
|
|
51
51
|
const update_service_1 = require("./update.service");
|
|
52
52
|
const STATUS_FILE = '/var/lib/smart-panel/update-status.json';
|
|
53
53
|
const UPDATE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
54
|
+
const STATUS_POLL_INTERVAL_MS = 3_000;
|
|
55
|
+
const STATUS_POLL_MAX_MS = UPDATE_TIMEOUT_MS + 30_000;
|
|
56
|
+
const PHASE_PROGRESS = {
|
|
57
|
+
downloading: 20,
|
|
58
|
+
installing: 45,
|
|
59
|
+
stopping: 45,
|
|
60
|
+
migrating: 65,
|
|
61
|
+
starting: 85,
|
|
62
|
+
complete: 100,
|
|
63
|
+
};
|
|
54
64
|
let UpdateExecutorService = class UpdateExecutorService {
|
|
55
65
|
constructor(updateService) {
|
|
56
66
|
this.updateService = updateService;
|
|
57
67
|
this.logger = (0, logger_1.createExtensionLogger)(system_constants_1.SYSTEM_MODULE_NAME, 'UpdateExecutorService');
|
|
68
|
+
this.statusPollTimer = null;
|
|
69
|
+
this.progressHighWaterMark = 0;
|
|
58
70
|
}
|
|
59
71
|
onModuleInit() {
|
|
60
72
|
this.checkPendingUpdateStatus();
|
|
@@ -195,6 +207,7 @@ let UpdateExecutorService = class UpdateExecutorService {
|
|
|
195
207
|
});
|
|
196
208
|
child.unref();
|
|
197
209
|
this.logger.log(`Update worker spawned for version ${targetVersion} (PID: ${child.pid}, type: ${installType})`);
|
|
210
|
+
this.startStatusPolling();
|
|
198
211
|
}
|
|
199
212
|
catch (error) {
|
|
200
213
|
const err = error;
|
|
@@ -216,6 +229,76 @@ let UpdateExecutorService = class UpdateExecutorService {
|
|
|
216
229
|
throw error;
|
|
217
230
|
}
|
|
218
231
|
}
|
|
232
|
+
startStatusPolling() {
|
|
233
|
+
this.stopStatusPolling();
|
|
234
|
+
this.progressHighWaterMark = 10;
|
|
235
|
+
const startedAt = Date.now();
|
|
236
|
+
this.statusPollTimer = setInterval(() => {
|
|
237
|
+
if (Date.now() - startedAt > STATUS_POLL_MAX_MS) {
|
|
238
|
+
this.logger.error('Update status polling timed out');
|
|
239
|
+
this.updateService.setStatus({
|
|
240
|
+
status: system_constants_1.UpdateStatusType.FAILED,
|
|
241
|
+
phase: system_constants_1.UpdatePhase.FAILED,
|
|
242
|
+
progressPercent: null,
|
|
243
|
+
message: null,
|
|
244
|
+
error: 'Update timed out — no completion signal received',
|
|
245
|
+
});
|
|
246
|
+
this.updateService.releaseUpdateLock();
|
|
247
|
+
this.stopStatusPolling();
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (!(0, fs_1.existsSync)(STATUS_FILE)) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
const raw = (0, fs_1.readFileSync)(STATUS_FILE, 'utf-8');
|
|
255
|
+
const fileStatus = JSON.parse(raw);
|
|
256
|
+
if (fileStatus.status === system_constants_1.UpdateStatusType.FAILED) {
|
|
257
|
+
this.logger.error(`Update worker failed: ${fileStatus.error ?? 'unknown error'}`);
|
|
258
|
+
this.updateService.setStatus({
|
|
259
|
+
status: system_constants_1.UpdateStatusType.FAILED,
|
|
260
|
+
phase: system_constants_1.UpdatePhase.FAILED,
|
|
261
|
+
progressPercent: null,
|
|
262
|
+
message: null,
|
|
263
|
+
error: fileStatus.error ?? 'Update failed with unknown error',
|
|
264
|
+
});
|
|
265
|
+
this.updateService.releaseUpdateLock();
|
|
266
|
+
this.stopStatusPolling();
|
|
267
|
+
}
|
|
268
|
+
else if (fileStatus.status === system_constants_1.UpdateStatusType.COMPLETE) {
|
|
269
|
+
this.updateService.setStatus({
|
|
270
|
+
status: system_constants_1.UpdateStatusType.COMPLETE,
|
|
271
|
+
phase: system_constants_1.UpdatePhase.COMPLETE,
|
|
272
|
+
progressPercent: 100,
|
|
273
|
+
message: `Successfully updated to ${fileStatus.targetVersion}`,
|
|
274
|
+
error: null,
|
|
275
|
+
});
|
|
276
|
+
this.updateService.releaseUpdateLock();
|
|
277
|
+
this.stopStatusPolling();
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
const rawProgress = PHASE_PROGRESS[fileStatus.phase] ?? 10;
|
|
281
|
+
const progress = Math.max(this.progressHighWaterMark, rawProgress);
|
|
282
|
+
this.progressHighWaterMark = progress;
|
|
283
|
+
this.updateService.setStatus({
|
|
284
|
+
status: fileStatus.status ?? system_constants_1.UpdateStatusType.DOWNLOADING,
|
|
285
|
+
phase: fileStatus.phase ?? system_constants_1.UpdatePhase.DOWNLOADING,
|
|
286
|
+
progressPercent: progress,
|
|
287
|
+
message: `Update in progress: ${fileStatus.phase}...`,
|
|
288
|
+
error: null,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
}
|
|
294
|
+
}, STATUS_POLL_INTERVAL_MS);
|
|
295
|
+
}
|
|
296
|
+
stopStatusPolling() {
|
|
297
|
+
if (this.statusPollTimer) {
|
|
298
|
+
clearInterval(this.statusPollTimer);
|
|
299
|
+
this.statusPollTimer = null;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
219
302
|
writeStatusFile(status) {
|
|
220
303
|
try {
|
|
221
304
|
const dir = (0, path_1.dirname)(STATUS_FILE);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-executor.service.js","sourceRoot":"","sources":["../../../../src/modules/system/services/update-executor.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAAgG;AAChG,+BAAqC;AAErC,2CAA0D;AAE1D,mDAA+D;AAC/D,0DAAwF;AAExF,qDAAiD;AAWjD,MAAM,WAAW,GAAG,yCAAyC,CAAC;AAC9D,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"update-executor.service.js","sourceRoot":"","sources":["../../../../src/modules/system/services/update-executor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,9 +11,11 @@ export declare enum EventType {
|
|
|
11
11
|
SYSTEM_REBOOT = "SystemModule.System.Reboot",
|
|
12
12
|
SYSTEM_POWER_OFF = "SystemModule.System.PowerOff",
|
|
13
13
|
SYSTEM_FACTORY_RESET = "SystemModule.System.FactoryReset",
|
|
14
|
+
SYSTEM_SERVICE_RESTART = "SystemModule.System.ServiceRestart",
|
|
14
15
|
SYSTEM_REBOOT_SET = "SystemModule.System.Reboot.Set",
|
|
15
16
|
SYSTEM_POWER_OFF_SET = "SystemModule.System.PowerOff.Set",
|
|
16
17
|
SYSTEM_FACTORY_RESET_SET = "SystemModule.System.FactoryReset.Set",
|
|
18
|
+
SYSTEM_SERVICE_RESTART_SET = "SystemModule.System.ServiceRestart.Set",
|
|
17
19
|
DISPLAY_REBOOT = "SystemModule.Display.Reboot",
|
|
18
20
|
DISPLAY_POWER_OFF = "SystemModule.Display.PowerOff",
|
|
19
21
|
DISPLAY_FACTORY_RESET = "SystemModule.Display.FactoryReset",
|
|
@@ -16,9 +16,11 @@ var EventType;
|
|
|
16
16
|
EventType["SYSTEM_REBOOT"] = "SystemModule.System.Reboot";
|
|
17
17
|
EventType["SYSTEM_POWER_OFF"] = "SystemModule.System.PowerOff";
|
|
18
18
|
EventType["SYSTEM_FACTORY_RESET"] = "SystemModule.System.FactoryReset";
|
|
19
|
+
EventType["SYSTEM_SERVICE_RESTART"] = "SystemModule.System.ServiceRestart";
|
|
19
20
|
EventType["SYSTEM_REBOOT_SET"] = "SystemModule.System.Reboot.Set";
|
|
20
21
|
EventType["SYSTEM_POWER_OFF_SET"] = "SystemModule.System.PowerOff.Set";
|
|
21
22
|
EventType["SYSTEM_FACTORY_RESET_SET"] = "SystemModule.System.FactoryReset.Set";
|
|
23
|
+
EventType["SYSTEM_SERVICE_RESTART_SET"] = "SystemModule.System.ServiceRestart.Set";
|
|
22
24
|
EventType["DISPLAY_REBOOT"] = "SystemModule.Display.Reboot";
|
|
23
25
|
EventType["DISPLAY_POWER_OFF"] = "SystemModule.Display.PowerOff";
|
|
24
26
|
EventType["DISPLAY_FACTORY_RESET"] = "SystemModule.Display.FactoryReset";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.constants.js","sourceRoot":"","sources":["../../../src/modules/system/system.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,QAAQ,CAAC;AAEhC,QAAA,kBAAkB,GAAG,eAAe,CAAC;AAErC,QAAA,0BAA0B,GAAG,eAAe,CAAC;AAE7C,QAAA,iCAAiC,GAC7C,wHAAwH,CAAC;AAE1H,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC3B,qFAAiE,CAAA;IACjE,mFAA+D,CAAA;AAChE,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,IAAY,
|
|
1
|
+
{"version":3,"file":"system.constants.js","sourceRoot":"","sources":["../../../src/modules/system/system.constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ const stats_module_1 = require("../stats/stats.module");
|
|
|
26
26
|
const storage_module_1 = require("../storage/storage.module");
|
|
27
27
|
const api_tag_decorator_1 = require("../swagger/decorators/api-tag.decorator");
|
|
28
28
|
const swagger_models_registry_service_1 = require("../swagger/services/swagger-models-registry.service");
|
|
29
|
+
const users_constants_1 = require("../users/users.constants");
|
|
29
30
|
const users_module_1 = require("../users/users.module");
|
|
30
31
|
const command_event_registry_service_1 = require("../websocket/services/command-event-registry.service");
|
|
31
32
|
const websocket_module_1 = require("../websocket/websocket.module");
|
|
@@ -67,9 +68,11 @@ let SystemModule = class SystemModule {
|
|
|
67
68
|
class: config_model_1.SystemConfigModel,
|
|
68
69
|
configDto: update_config_dto_1.UpdateSystemConfigDto,
|
|
69
70
|
});
|
|
70
|
-
|
|
71
|
-
this.eventRegistry.register(system_constants_1.EventType.
|
|
72
|
-
this.eventRegistry.register(system_constants_1.EventType.
|
|
71
|
+
const adminRoles = [users_constants_1.UserRole.ADMIN, users_constants_1.UserRole.OWNER];
|
|
72
|
+
this.eventRegistry.register(system_constants_1.EventType.SYSTEM_REBOOT_SET, system_constants_1.EventHandlerName.INTERNAL_PLATFORM_ACTION, async (user, _payload) => this.systemCommandService.reboot(user), adminRoles);
|
|
73
|
+
this.eventRegistry.register(system_constants_1.EventType.SYSTEM_POWER_OFF_SET, system_constants_1.EventHandlerName.INTERNAL_PLATFORM_ACTION, async (user, _payload) => this.systemCommandService.powerOff(user), adminRoles);
|
|
74
|
+
this.eventRegistry.register(system_constants_1.EventType.SYSTEM_SERVICE_RESTART_SET, system_constants_1.EventHandlerName.INTERNAL_PLATFORM_ACTION, async (user, _payload) => this.systemCommandService.restartService(user), adminRoles);
|
|
75
|
+
this.eventRegistry.register(system_constants_1.EventType.SYSTEM_FACTORY_RESET_SET, system_constants_1.EventHandlerName.INTERNAL_PLATFORM_ACTION, async (user, _payload) => this.systemCommandService.factoryReset(user), adminRoles);
|
|
73
76
|
this.eventRegistry.register(system_constants_1.EventType.DISPLAY_REBOOT_SET, system_constants_1.EventHandlerName.INTERNAL_DISPLAY_ACTION, (user, _payload) => Promise.resolve(this.displayCommandService.displayReboot(user)));
|
|
74
77
|
this.eventRegistry.register(system_constants_1.EventType.DISPLAY_POWER_OFF_SET, system_constants_1.EventHandlerName.INTERNAL_DISPLAY_ACTION, (user, _payload) => Promise.resolve(this.displayCommandService.displayPowerOff(user)));
|
|
75
78
|
this.eventRegistry.register(system_constants_1.EventType.DISPLAY_FACTORY_RESET_SET, system_constants_1.EventHandlerName.INTERNAL_DISPLAY_ACTION, async (user, _payload) => this.displayCommandService.displayFactoryReset(user));
|