@fastybird/smart-panel-backend 1.1.0-alpha.14 → 1.1.0-alpha.16

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.
Files changed (91) hide show
  1. package/dist/app.module.js +1 -0
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/dataSource.js +1 -0
  4. package/dist/dataSource.js.map +1 -1
  5. package/dist/modules/system/scripts/update-worker.sh +360 -59
  6. package/dist/modules/system/services/update-executor.service.d.ts +9 -0
  7. package/dist/modules/system/services/update-executor.service.js +170 -25
  8. package/dist/modules/system/services/update-executor.service.js.map +1 -1
  9. package/dist/plugins/devices-home-assistant/devices-home-assistant.openapi.d.ts +2 -2
  10. package/dist/plugins/devices-home-assistant/devices-home-assistant.plugin.d.ts +6 -1
  11. package/dist/plugins/devices-home-assistant/devices-home-assistant.plugin.js +16 -1
  12. package/dist/plugins/devices-home-assistant/devices-home-assistant.plugin.js.map +1 -1
  13. package/dist/plugins/devices-home-assistant/dto/mapping-preview.dto.d.ts +1 -0
  14. package/dist/plugins/devices-home-assistant/dto/mapping-preview.dto.js +11 -0
  15. package/dist/plugins/devices-home-assistant/dto/mapping-preview.dto.js.map +1 -1
  16. package/dist/plugins/devices-home-assistant/mappers/button.entity.mapper.service.d.ts +19 -0
  17. package/dist/plugins/devices-home-assistant/mappers/button.entity.mapper.service.js +51 -0
  18. package/dist/plugins/devices-home-assistant/mappers/button.entity.mapper.service.js.map +1 -0
  19. package/dist/plugins/devices-home-assistant/mappings/definitions/entity-mappings.yaml +56 -7
  20. package/dist/plugins/devices-home-assistant/models/mapping-preview.model.d.ts +1 -0
  21. package/dist/plugins/devices-home-assistant/models/mapping-preview.model.js +11 -0
  22. package/dist/plugins/devices-home-assistant/models/mapping-preview.model.js.map +1 -1
  23. package/dist/plugins/devices-home-assistant/services/device-adoption.service.js +17 -0
  24. package/dist/plugins/devices-home-assistant/services/device-adoption.service.js.map +1 -1
  25. package/dist/plugins/devices-home-assistant/services/home-assistant-raw-event.service.d.ts +27 -0
  26. package/dist/plugins/devices-home-assistant/services/home-assistant-raw-event.service.js +271 -0
  27. package/dist/plugins/devices-home-assistant/services/home-assistant-raw-event.service.js.map +1 -0
  28. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.d.ts +2 -2
  29. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js +31 -13
  30. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js.map +1 -1
  31. package/dist/plugins/devices-home-assistant/services/mapping-preview.service.js +24 -4
  32. package/dist/plugins/devices-home-assistant/services/mapping-preview.service.js.map +1 -1
  33. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.d.ts +4 -1
  34. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js +82 -2
  35. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js.map +1 -1
  36. package/dist/plugins/devices-home-assistant/services/wizard.service.js +1 -0
  37. package/dist/plugins/devices-home-assistant/services/wizard.service.js.map +1 -1
  38. package/dist/plugins/devices-home-assistant/utils/ha-event.utils.d.ts +2 -0
  39. package/dist/plugins/devices-home-assistant/utils/ha-event.utils.js +50 -0
  40. package/dist/plugins/devices-home-assistant/utils/ha-event.utils.js.map +1 -0
  41. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.d.ts +2 -0
  42. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js +22 -0
  43. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js.map +1 -1
  44. package/dist/plugins/devices-homekit/mappers/button.mapper.d.ts +15 -0
  45. package/dist/plugins/devices-homekit/mappers/button.mapper.js +143 -0
  46. package/dist/plugins/devices-homekit/mappers/button.mapper.js.map +1 -0
  47. package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.d.ts +8 -0
  48. package/dist/plugins/devices-homekit/services/homekit-mapper-registry.service.d.ts +5 -1
  49. package/dist/plugins/devices-homekit/services/homekit-mapper-registry.service.js +42 -0
  50. package/dist/plugins/devices-homekit/services/homekit-mapper-registry.service.js.map +1 -1
  51. package/dist/plugins/devices-homey/mappings/definitions/channels.yaml +50 -0
  52. package/dist/plugins/devices-homey/mappings/definitions/devices.yaml +18 -0
  53. package/dist/plugins/devices-homey/mappings/definitions/properties.yaml +55 -0
  54. package/dist/plugins/devices-homey/mappings/device-support.js +10 -0
  55. package/dist/plugins/devices-homey/mappings/device-support.js.map +1 -1
  56. package/dist/plugins/devices-homey/mappings/mapping-loader.service.d.ts +1 -0
  57. package/dist/plugins/devices-homey/mappings/mapping-loader.service.js +66 -8
  58. package/dist/plugins/devices-homey/mappings/mapping-loader.service.js.map +1 -1
  59. package/dist/plugins/devices-homey/models/inventory.model.d.ts +2 -1
  60. package/dist/plugins/devices-homey/models/inventory.model.js +1 -0
  61. package/dist/plugins/devices-homey/models/inventory.model.js.map +1 -1
  62. package/dist/plugins/devices-homey/models/mapping-preview.model.d.ts +1 -0
  63. package/dist/plugins/devices-homey/models/mapping-preview.model.js +1 -0
  64. package/dist/plugins/devices-homey/models/mapping-preview.model.js.map +1 -1
  65. package/dist/plugins/devices-homey/services/homey-mapping-preview.service.js +7 -0
  66. package/dist/plugins/devices-homey/services/homey-mapping-preview.service.js.map +1 -1
  67. package/dist/plugins/devices-homey/services/homey-synchronizer.service.d.ts +3 -1
  68. package/dist/plugins/devices-homey/services/homey-synchronizer.service.js +37 -6
  69. package/dist/plugins/devices-homey/services/homey-synchronizer.service.js.map +1 -1
  70. package/dist/plugins/devices-reterminal/services/reterminal-button.service.d.ts +7 -3
  71. package/dist/plugins/devices-reterminal/services/reterminal-button.service.js +63 -17
  72. package/dist/plugins/devices-reterminal/services/reterminal-button.service.js.map +1 -1
  73. package/dist/plugins/devices-third-party/controllers/third-party-inputs.controller.d.ts +17 -0
  74. package/dist/plugins/devices-third-party/controllers/third-party-inputs.controller.js +205 -0
  75. package/dist/plugins/devices-third-party/controllers/third-party-inputs.controller.js.map +1 -0
  76. package/dist/plugins/devices-third-party/devices-third-party.openapi.d.ts +1 -1
  77. package/dist/plugins/devices-third-party/devices-third-party.plugin.js +2 -1
  78. package/dist/plugins/devices-third-party/devices-third-party.plugin.js.map +1 -1
  79. package/dist/plugins/devices-third-party/dto/report-input-occurrence-response.dto.d.ts +5 -0
  80. package/dist/plugins/devices-third-party/dto/report-input-occurrence-response.dto.js +50 -0
  81. package/dist/plugins/devices-third-party/dto/report-input-occurrence-response.dto.js.map +1 -0
  82. package/dist/plugins/devices-third-party/dto/report-input-occurrence.dto.d.ts +8 -0
  83. package/dist/plugins/devices-third-party/dto/report-input-occurrence.dto.js +81 -0
  84. package/dist/plugins/devices-third-party/dto/report-input-occurrence.dto.js.map +1 -0
  85. package/dist/plugins/devices-third-party/platforms/third-party-device.platform.js +19 -4
  86. package/dist/plugins/devices-third-party/platforms/third-party-device.platform.js.map +1 -1
  87. package/dist/plugins/devices-virtual/listeners/virtual-projection.listener.d.ts +2 -0
  88. package/dist/plugins/devices-virtual/listeners/virtual-projection.listener.js +57 -0
  89. package/dist/plugins/devices-virtual/listeners/virtual-projection.listener.js.map +1 -1
  90. package/dist/tsconfig.build.tsbuildinfo +1 -1
  91. package/package.json +2 -2
@@ -202,6 +202,7 @@ let AppModule = AppModule_1 = class AppModule {
202
202
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
203
203
  subscribers: [__dirname + '/**/*.subscriber{.ts,.js}'],
204
204
  migrations: [__dirname + '/migrations/*{.ts,.js}'],
205
+ migrationsTransactionMode: 'each',
205
206
  synchronize: (0, config_utils_1.getEnvValue)(configService, 'FB_DB_SYNC', false),
206
207
  migrationsRun: (0, config_utils_1.getEnvValue)(configService, 'FB_DB_MIGRATIONS_RUN', false),
207
208
  logging: (0, config_utils_1.getEnvValue)(configService, 'FB_DB_LOGGING', false),
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,7 @@ const AppDataSource = new typeorm_1.DataSource({
51
51
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
52
52
  subscribers: [__dirname + '/**/*.subscriber{.ts,.js}'],
53
53
  migrations: [__dirname + '/migrations/*{.ts,.js}'],
54
+ migrationsTransactionMode: 'each',
54
55
  synchronize: process.env.FB_DB_SYNC === 'true',
55
56
  logging: process.env.FB_DB_LOGGING === 'true',
56
57
  });
@@ -1 +1 @@
1
- {"version":3,"file":"dataSource.js","sourceRoot":"","sources":["../src/dataSource.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,2CAA6B;AAC7B,qCAAqC;AAErC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AAElG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;IAChC,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,oBAAU,CAAC;IACpC,IAAI,EAAE,QAAQ;IACd,QAAQ,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAC9B,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACzG,QAAQ,EAAE,CAAC,SAAS,GAAG,uBAAuB,CAAC;IAC/C,WAAW,EAAE,CAAC,SAAS,GAAG,2BAA2B,CAAC;IACtD,UAAU,EAAE,CAAC,SAAS,GAAG,wBAAwB,CAAC;IAClD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM;IAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM;CAC7C,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC"}
1
+ {"version":3,"file":"dataSource.js","sourceRoot":"","sources":["../src/dataSource.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,2CAA6B;AAC7B,qCAAqC;AAErC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AAElG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;IAChC,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,oBAAU,CAAC;IACpC,IAAI,EAAE,QAAQ;IACd,QAAQ,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAC9B,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACzG,QAAQ,EAAE,CAAC,SAAS,GAAG,uBAAuB,CAAC;IAC/C,WAAW,EAAE,CAAC,SAAS,GAAG,2BAA2B,CAAC;IACtD,UAAU,EAAE,CAAC,SAAS,GAAG,wBAAwB,CAAC;IAClD,yBAAyB,EAAE,MAAM;IACjC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM;IAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM;CAC7C,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC"}
@@ -7,6 +7,232 @@ INSTALL_TYPE="${INSTALL_TYPE:-npm}"
7
7
  IMAGE_BASE_DIR="${IMAGE_BASE_DIR:-/opt/smart-panel}"
8
8
  DOWNLOAD_URL="${DOWNLOAD_URL:-}"
9
9
 
10
+ # The attempt record and lock live beside the public status file, never inside a versioned image
11
+ # directory. This lets the record survive a backend restart, target-directory cleanup or a
12
+ # failed migration, while keeping it outside the release tarball and private to the service user.
13
+ ATTEMPT_DIR="${ATTEMPT_DIR:-$(dirname "$STATUS_FILE")/update-attempt}"
14
+ ATTEMPT_FILE="${ATTEMPT_DIR}/attempt.json"
15
+ ATTEMPT_LOCK="${ATTEMPT_DIR}/lock"
16
+ ATTEMPT_ID=""
17
+ MIGRATION_ENTERED="false"
18
+ FINALIZED="false"
19
+ MIGRATION_LOG=""
20
+ CURRENT_PHASE="preparing"
21
+ SERVICE_NAME="smart-panel"
22
+ QUIESCENCE_TIMEOUT_SECONDS="${QUIESCENCE_TIMEOUT_SECONDS:-30}"
23
+ START_TIMEOUT_SECONDS="${START_TIMEOUT_SECONDS:-60}"
24
+ HEALTH_URL="${HEALTH_URL:-}"
25
+
26
+ json_escape() {
27
+ printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/[[:cntrl:]]//g'
28
+ }
29
+
30
+ write_attempt() {
31
+ local state="$1"
32
+ local phase="$2"
33
+ local error="${3:-}"
34
+ local recovery_required="${4:-false}"
35
+ local migration_entered="${5:-$MIGRATION_ENTERED}"
36
+ local tmp_file="${ATTEMPT_FILE}.tmp.$$"
37
+ CURRENT_PHASE="$phase"
38
+
39
+ mkdir -p "$ATTEMPT_DIR"
40
+ chmod 700 "$ATTEMPT_DIR"
41
+
42
+ {
43
+ printf '{\n'
44
+ printf '\t"attemptId": "%s",\n' "$(json_escape "$ATTEMPT_ID")"
45
+ printf '\t"ownerPid": %s,\n' "$$"
46
+ printf '\t"targetVersion": "%s",\n' "$(json_escape "$VERSION")"
47
+ printf '\t"state": "%s",\n' "$(json_escape "$state")"
48
+ printf '\t"phase": "%s",\n' "$(json_escape "$phase")"
49
+ printf '\t"migrationEntered": %s,\n' "$migration_entered"
50
+ printf '\t"recoveryRequired": %s,\n' "$recovery_required"
51
+ printf '\t"migrationLog": "%s",\n' "$(json_escape "$MIGRATION_LOG")"
52
+ printf '\t"updatedAt": "%s",\n' "$(date -Iseconds)"
53
+ printf '\t"error": "%s"\n' "$(json_escape "$error")"
54
+ printf '}\n'
55
+ } > "$tmp_file"
56
+
57
+ chmod 600 "$tmp_file"
58
+ mv -f "$tmp_file" "$ATTEMPT_FILE"
59
+ }
60
+
61
+ attempt_is_unresolved() {
62
+ if [ -f "$ATTEMPT_FILE" ] && grep -q '"state": "complete"' "$ATTEMPT_FILE"; then
63
+ # A crash after the durable completion record but before rmdir must not strand a clean
64
+ # attempt forever; completion is the evidence that makes this lock removable.
65
+ rmdir "$ATTEMPT_LOCK" 2>/dev/null || true
66
+
67
+ return 1
68
+ fi
69
+
70
+ if [ -d "$ATTEMPT_LOCK" ]; then
71
+ return 0
72
+ fi
73
+
74
+ if [ ! -f "$ATTEMPT_FILE" ]; then
75
+ return 1
76
+ fi
77
+
78
+ grep -q '"state": "active"' "$ATTEMPT_FILE" || grep -q '"recoveryRequired": true' "$ATTEMPT_FILE"
79
+ }
80
+
81
+ acquire_attempt() {
82
+ mkdir -p "$ATTEMPT_DIR"
83
+ chmod 700 "$ATTEMPT_DIR"
84
+
85
+ if attempt_is_unresolved; then
86
+ return 1
87
+ fi
88
+
89
+ # mkdir is the portable atomic OS-level lock used by the legacy launcher. An orphaned lock is
90
+ # deliberately retained; an expired timestamp cannot prove that a migration did not commit.
91
+ if ! mkdir "$ATTEMPT_LOCK" 2>/dev/null; then
92
+ return 1
93
+ fi
94
+ chmod 700 "$ATTEMPT_LOCK"
95
+
96
+ ATTEMPT_ID="$(date +%s)-$$"
97
+ write_attempt "active" "preparing" "" "false" "false"
98
+ }
99
+
100
+ release_attempt() {
101
+ if [ -n "$ATTEMPT_ID" ]; then
102
+ write_attempt "complete" "complete" "" "false" "$MIGRATION_ENTERED"
103
+ fi
104
+
105
+ rmdir "$ATTEMPT_LOCK" 2>/dev/null || true
106
+ }
107
+
108
+ hold_attempt() {
109
+ local phase="$1"
110
+ local error="$2"
111
+
112
+ write_attempt "recovery_required" "$phase" "$error" "true" "$MIGRATION_ENTERED"
113
+ }
114
+
115
+ finish_before_migration() {
116
+ local phase="$1"
117
+ local error="$2"
118
+
119
+ if [ -n "${TMP_TARBALL:-}" ]; then
120
+ rm -f "$TMP_TARBALL" 2>/dev/null || true
121
+ fi
122
+
123
+ write_attempt "failed_preflight" "$phase" "$error" "false" "false"
124
+ rmdir "$ATTEMPT_LOCK" 2>/dev/null || true
125
+ }
126
+
127
+ phase_requires_hold() {
128
+ case "$CURRENT_PHASE" in
129
+ stopping|quiesced|switching) return 0 ;;
130
+ *) return 1 ;;
131
+ esac
132
+ }
133
+
134
+ fail_before_migration() {
135
+ local phase="$1"
136
+ local error="$2"
137
+
138
+ if [ -n "$ATTEMPT_ID" ]; then
139
+ finish_before_migration "$phase" "$error"
140
+ fi
141
+
142
+ update_status "failed" "failed" "$error"
143
+ FINALIZED="true"
144
+ exit 1
145
+ }
146
+
147
+ restore_before_migration() {
148
+ local previous_target="$1"
149
+ local current_link="$2"
150
+ local new_version_dir="$3"
151
+ local resolved_previous resolved_current
152
+
153
+ [ -n "$previous_target" ] || return 1
154
+ sudo -n ln -sfn "$previous_target" "$current_link" || return 1
155
+
156
+ resolved_previous="$(realpath "$previous_target" 2>/dev/null || true)"
157
+ resolved_current="$(realpath "$current_link" 2>/dev/null || true)"
158
+ [ -n "$resolved_previous" ] && [ "$resolved_previous" = "$resolved_current" ] || return 1
159
+
160
+ rm -rf "$new_version_dir" || return 1
161
+ sudo -n systemctl start "$SERVICE_NAME" 2>/dev/null || return 1
162
+ wait_for_started_service
163
+ }
164
+
165
+ service_property() {
166
+ local property="$1"
167
+
168
+ systemctl show "$SERVICE_NAME" --property="$property" --value
169
+ }
170
+
171
+ service_quiesced() {
172
+ local active_state main_pid control_pid control_group cgroup_procs
173
+
174
+ active_state="$(service_property ActiveState 2>/dev/null)" || return 2
175
+ main_pid="$(service_property MainPID 2>/dev/null)" || return 2
176
+ control_pid="$(service_property ControlPID 2>/dev/null)" || return 2
177
+ control_group="$(service_property ControlGroup 2>/dev/null)" || return 2
178
+
179
+ case "$active_state" in
180
+ inactive|failed) ;;
181
+ *) return 1 ;;
182
+ esac
183
+
184
+ [ "$main_pid" = "0" ] || return 1
185
+ [ "$control_pid" = "0" ] || return 1
186
+
187
+ cgroup_procs="${SERVICE_CGROUP_PROCS_FILE:-/sys/fs/cgroup${control_group}/cgroup.procs}"
188
+ [ -r "$cgroup_procs" ] || return 2
189
+ if grep -q '[0-9]' "$cgroup_procs"; then
190
+ return 1
191
+ fi
192
+
193
+ return 0
194
+ }
195
+
196
+ wait_for_quiescence() {
197
+ local deadline=$((SECONDS + QUIESCENCE_TIMEOUT_SECONDS))
198
+ local result
199
+
200
+ while [ "$SECONDS" -le "$deadline" ]; do
201
+ if service_quiesced; then
202
+ return 0
203
+ fi
204
+
205
+ result=$?
206
+ if [ "$result" -eq 2 ]; then
207
+ return 2
208
+ fi
209
+
210
+ sleep 1
211
+ done
212
+
213
+ return 1
214
+ }
215
+
216
+ wait_for_started_service() {
217
+ local deadline=$((SECONDS + START_TIMEOUT_SECONDS))
218
+ local state main_pid
219
+
220
+ while [ "$SECONDS" -le "$deadline" ]; do
221
+ state="$(service_property ActiveState 2>/dev/null || true)"
222
+ main_pid="$(service_property MainPID 2>/dev/null || true)"
223
+
224
+ if [ "$state" = "active" ] && [ "$main_pid" != "0" ] && [ -n "$main_pid" ]; then
225
+ if [ -z "$HEALTH_URL" ] || curl -fsS --max-time 5 "$HEALTH_URL" >/dev/null 2>&1; then
226
+ return 0
227
+ fi
228
+ fi
229
+
230
+ sleep 1
231
+ done
232
+
233
+ return 1
234
+ }
235
+
10
236
  # Capture once — used for all status writes so timeout detection works correctly
11
237
  STARTED_AT="$(date -Iseconds)"
12
238
 
@@ -45,7 +271,13 @@ update_status() {
45
271
  cleanup() {
46
272
  local exit_code=$?
47
273
 
48
- if [ $exit_code -ne 0 ]; then
274
+ if [ "$exit_code" -ne 0 ] && [ "$FINALIZED" != "true" ]; then
275
+ if [ -n "$ATTEMPT_ID" ] && { [ "$MIGRATION_ENTERED" = "true" ] || phase_requires_hold; }; then
276
+ hold_attempt "interrupted" "Update worker exited with code $exit_code during a state-changing phase"
277
+ elif [ -n "$ATTEMPT_ID" ]; then
278
+ finish_before_migration "failed" "Update process exited with code $exit_code"
279
+ fi
280
+
49
281
  # Only write a generic failure if a specific error wasn't already recorded
50
282
  if [ -f "$STATUS_FILE" ] && grep -q '"status": "failed"' "$STATUS_FILE" 2>/dev/null; then
51
283
  return
@@ -56,6 +288,27 @@ cleanup() {
56
288
 
57
289
  trap cleanup EXIT
58
290
 
291
+ handle_signal() {
292
+ local signal_name="$1"
293
+ local signal_code="$2"
294
+
295
+ if [ -n "$ATTEMPT_ID" ]; then
296
+ if [ "$MIGRATION_ENTERED" = "true" ] || phase_requires_hold; then
297
+ hold_attempt "interrupted" "Update worker received SIG${signal_name} after migration entry"
298
+ else
299
+ finish_before_migration "interrupted" "Update worker received SIG${signal_name} before migration entry"
300
+ fi
301
+ fi
302
+
303
+ update_status "failed" "failed" "Update worker received SIG${signal_name}"
304
+ FINALIZED="true"
305
+ exit "$signal_code"
306
+ }
307
+
308
+ trap 'handle_signal TERM 143' TERM
309
+ trap 'handle_signal INT 130' INT
310
+ trap 'handle_signal HUP 129' HUP
311
+
59
312
  # ──────────────────────────────────────────────────────────────
60
313
  # Image-based update (Raspbian image installs)
61
314
  # ──────────────────────────────────────────────────────────────
@@ -65,6 +318,12 @@ if [ "$INSTALL_TYPE" = "image" ]; then
65
318
  NEW_VERSION_DIR="${IMAGE_BASE_DIR}/v${CLEAN_VERSION}"
66
319
  CURRENT_LINK="${IMAGE_BASE_DIR}/current"
67
320
 
321
+ if ! acquire_attempt; then
322
+ update_status "failed" "failed" "An unresolved update attempt already owns the updater"
323
+ FINALIZED="true"
324
+ exit 1
325
+ fi
326
+
68
327
  # Verify passwordless sudo is available for all required commands.
69
328
  # Without -n, sudo may hang waiting for a password on a detached process.
70
329
  SUDO_CMDS=(
@@ -77,8 +336,7 @@ if [ "$INSTALL_TYPE" = "image" ]; then
77
336
 
78
337
  for cmd in "${SUDO_CMDS[@]}"; do
79
338
  if ! sudo -n -l $cmd >/dev/null 2>&1; then
80
- update_status "failed" "failed" "Passwordless sudo not available for: $cmd"
81
- exit 1
339
+ fail_before_migration "preflight" "Passwordless sudo not available for: $cmd"
82
340
  fi
83
341
  done
84
342
  PREVIOUS_TARGET=""
@@ -86,6 +344,10 @@ if [ "$INSTALL_TYPE" = "image" ]; then
86
344
  # Save the current version for rollback
87
345
  if [ -L "$CURRENT_LINK" ]; then
88
346
  PREVIOUS_TARGET=$(readlink "$CURRENT_LINK")
347
+ case "$PREVIOUS_TARGET" in
348
+ /*) ;;
349
+ *) PREVIOUS_TARGET="${IMAGE_BASE_DIR}/${PREVIOUS_TARGET}" ;;
350
+ esac
89
351
  fi
90
352
 
91
353
  # Guard: refuse to overwrite the currently running version
@@ -94,23 +356,20 @@ if [ "$INSTALL_TYPE" = "image" ]; then
94
356
  RESOLVED_NEW=$(cd "$IMAGE_BASE_DIR" && realpath "$NEW_VERSION_DIR" 2>/dev/null || true)
95
357
 
96
358
  if [ -n "$PREVIOUS_TARGET" ] && [ -n "$RESOLVED_PREV" ] && [ -n "$RESOLVED_NEW" ] && [ "$RESOLVED_PREV" = "$RESOLVED_NEW" ]; then
97
- update_status "failed" "failed" "Target version v${CLEAN_VERSION} is already the active version"
98
- exit 1
359
+ fail_before_migration "preflight" "Target version v${CLEAN_VERSION} is already the active version"
99
360
  fi
100
361
 
101
362
  # ── Download ──
102
363
  update_status "downloading" "downloading"
103
364
 
104
365
  if [ -z "$DOWNLOAD_URL" ]; then
105
- update_status "failed" "failed" "No download URL provided for image update"
106
- exit 1
366
+ fail_before_migration "downloading" "No download URL provided for image update"
107
367
  fi
108
368
 
109
369
  TMP_TARBALL="/tmp/smart-panel-backend-v${CLEAN_VERSION}.tar.gz"
110
370
 
111
371
  curl -fSL -o "$TMP_TARBALL" "$DOWNLOAD_URL" 2>&1 || {
112
- update_status "failed" "failed" "Download failed from ${DOWNLOAD_URL}"
113
- exit 1
372
+ fail_before_migration "downloading" "Download failed from ${DOWNLOAD_URL}"
114
373
  }
115
374
 
116
375
  # ── Extract ──
@@ -121,8 +380,7 @@ if [ "$INSTALL_TYPE" = "image" ]; then
121
380
  tar -xzf "$TMP_TARBALL" -C "$NEW_VERSION_DIR" 2>&1 || {
122
381
  rm -rf "$NEW_VERSION_DIR"
123
382
  rm -f "$TMP_TARBALL"
124
- update_status "failed" "failed" "Failed to extract update archive"
125
- exit 1
383
+ fail_before_migration "installing" "Failed to extract update archive"
126
384
  }
127
385
 
128
386
  rm -f "$TMP_TARBALL"
@@ -130,8 +388,7 @@ if [ "$INSTALL_TYPE" = "image" ]; then
130
388
  # Create the image-install marker in the new version
131
389
  touch "${NEW_VERSION_DIR}/.image-install" || {
132
390
  rm -rf "$NEW_VERSION_DIR"
133
- update_status "failed" "failed" "Failed to create image-install marker"
134
- exit 1
391
+ fail_before_migration "installing" "Failed to create image-install marker"
135
392
  }
136
393
 
137
394
  # ── Verify dependencies ──
@@ -143,8 +400,7 @@ if [ "$INSTALL_TYPE" = "image" ]; then
143
400
  if [ ! -d "node_modules" ]; then
144
401
  npm install --omit=dev 2>&1 || {
145
402
  rm -rf "$NEW_VERSION_DIR"
146
- update_status "failed" "failed" "npm install failed"
147
- exit 1
403
+ fail_before_migration "installing" "npm install failed"
148
404
  }
149
405
  fi
150
406
 
@@ -153,72 +409,115 @@ if [ "$INSTALL_TYPE" = "image" ]; then
153
409
  # hanging on password prompt when running as a detached process.
154
410
  sudo -n chown -R smart-panel:smart-panel "$NEW_VERSION_DIR" || {
155
411
  rm -rf "$NEW_VERSION_DIR"
156
- update_status "failed" "failed" "Failed to set ownership on ${NEW_VERSION_DIR}"
157
- exit 1
412
+ fail_before_migration "installing" "Failed to set ownership on ${NEW_VERSION_DIR}"
158
413
  }
159
414
 
160
415
  # ── Stop service ──
161
416
  update_status "stopping" "stopping"
162
- sudo -n systemctl stop smart-panel 2>/dev/null || true
417
+ write_attempt "active" "stopping" "" "false" "$MIGRATION_ENTERED"
418
+ if ! sudo -n systemctl stop "$SERVICE_NAME" 2>/dev/null; then
419
+ hold_attempt "stopping" "Service stop failed; writer quiescence is unknown"
420
+ update_status "failed" "failed" "Could not stop ${SERVICE_NAME}; update is held for recovery"
421
+ FINALIZED="true"
422
+ exit 1
423
+ fi
424
+
425
+ if ! wait_for_quiescence; then
426
+ hold_attempt "stopping" "Service did not reach verified quiescence before migration"
427
+ update_status "failed" "failed" "Service quiescence could not be verified; update is held for recovery"
428
+ FINALIZED="true"
429
+ exit 1
430
+ fi
431
+
432
+ write_attempt "active" "quiesced" "" "false" "$MIGRATION_ENTERED"
163
433
 
164
434
  # ── Switch symlink (atomic on same filesystem) ──
165
435
  sudo -n ln -sfn "$NEW_VERSION_DIR" "$CURRENT_LINK" || {
166
- # Revert on failure
167
- if [ -n "$PREVIOUS_TARGET" ]; then
168
- sudo -n ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"
436
+ # Revert only when the old link, target cleanup and old-service health are all verified.
437
+ if restore_before_migration "$PREVIOUS_TARGET" "$CURRENT_LINK" "$NEW_VERSION_DIR"; then
438
+ fail_before_migration "switching" "Failed to switch version symlink"
169
439
  fi
170
- sudo -n systemctl start smart-panel 2>/dev/null || true
171
- update_status "failed" "failed" "Failed to switch version symlink"
440
+
441
+ hold_attempt "switching" "Failed to switch version symlink and recovery start was not verified"
442
+ update_status "failed" "failed" "Failed to switch version symlink; update is held for recovery"
443
+ FINALIZED="true"
172
444
  exit 1
173
445
  }
174
446
 
175
447
  # ── Run database migrations ──
176
448
  update_status "migrating" "migrating"
177
-
178
449
  ENV_FILE="/etc/smart-panel/environment"
179
450
 
180
- if [ -f "${NEW_VERSION_DIR}/dist/dataSource.js" ]; then
181
- (
182
- set -a
183
- # shellcheck source=/dev/null
184
- [ -f "$ENV_FILE" ] && . "$ENV_FILE"
185
- set +a
186
- cd "$NEW_VERSION_DIR"
187
- node node_modules/typeorm/cli.js migration:run -d dist/dataSource.js
188
- ) 2>&1 || {
189
- # Migration failed — revert symlink if possible
190
- update_status "stopping" "stopping"
191
- sudo -n systemctl stop smart-panel 2>/dev/null || true
192
-
193
- if [ -n "$PREVIOUS_TARGET" ]; then
194
- if sudo -n ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"; then
195
- rm -rf "$NEW_VERSION_DIR"
196
- update_status "failed" "failed" "Database migration failed — reverted to previous version"
197
- else
198
- # Symlink revert failed — keep new version so system stays bootable
199
- update_status "failed" "failed" "Database migration failed — symlink revert also failed"
200
- fi
201
- else
202
- # No previous version — keep current in place so system stays bootable
203
- update_status "failed" "failed" "Database migration failed — no previous version to revert to"
204
- fi
451
+ if [ ! -f "${NEW_VERSION_DIR}/dist/dataSource.js" ]; then
452
+ hold_attempt "migrating" "Target data source is missing; update is held for recovery"
453
+ update_status "failed" "failed" "Target data source is missing; update is held for recovery"
454
+ FINALIZED="true"
455
+ exit 1
456
+ fi
457
+
458
+ MIGRATION_ENTERED="true"
459
+ if ! write_attempt "active" "migrating" "" "false" "true"; then
460
+ hold_attempt "migrating" "Could not persist migration-entry checkpoint"
461
+ update_status "failed" "failed" "Could not persist migration-entry checkpoint; update is held for recovery"
462
+ FINALIZED="true"
463
+ exit 1
464
+ fi
205
465
 
206
- sudo -n systemctl start smart-panel 2>/dev/null || true
207
- exit 1
466
+ MIGRATION_LOG="${ATTEMPT_DIR}/${ATTEMPT_ID}.migration.log"
467
+ : > "$MIGRATION_LOG"
468
+ chmod 600 "$MIGRATION_LOG"
469
+ write_attempt "active" "migrating" "" "false" "true"
470
+
471
+ set +e
472
+ (
473
+ set -a
474
+ # shellcheck source=/dev/null
475
+ [ -f "$ENV_FILE" ] && . "$ENV_FILE"
476
+ set +a
477
+ cd "$NEW_VERSION_DIR"
478
+ node node_modules/typeorm/cli.js migration:run -d dist/dataSource.js
479
+ ) 2>&1 | awk -v output="$MIGRATION_LOG" '
480
+ BEGIN { limit = 65536; bytes = 0 }
481
+ {
482
+ if (bytes < limit) {
483
+ line = $0 ORS;
484
+ remaining = limit - bytes;
485
+ if (length(line) > remaining) line = substr(line, 1, remaining);
486
+ printf "%s", line >> output;
487
+ bytes += length(line);
488
+ }
208
489
  }
490
+ '
491
+ pipeline_status=("${PIPESTATUS[@]}")
492
+ migration_exit_code="${pipeline_status[0]}"
493
+ capture_exit_code="${pipeline_status[1]}"
494
+ set -e
495
+
496
+ if [ "$capture_exit_code" -ne 0 ]; then
497
+ hold_attempt "migration_capture_failed" "Could not retain bounded migration diagnostics"
498
+ update_status "failed" "failed" "Migration diagnostics could not be retained; update is held for recovery"
499
+ FINALIZED="true"
500
+ exit 1
501
+ fi
502
+
503
+ if [ "$migration_exit_code" -eq 0 ]; then
504
+ write_attempt "active" "migrated" "" "false" "true"
505
+ else
506
+ hold_attempt "migration_failed" "Database migration failed with exit code ${migration_exit_code}"
507
+ update_status "failed" "failed" "Database migration failed; update is held for recovery"
508
+ FINALIZED="true"
509
+ exit "$migration_exit_code"
209
510
  fi
210
511
 
211
512
  # ── Start service ──
212
513
  update_status "starting" "starting"
213
- sudo -n systemctl start smart-panel 2>&1 || {
214
- # Try to revert if start fails
215
- if [ -n "$PREVIOUS_TARGET" ]; then
216
- sudo -n ln -sfn "$PREVIOUS_TARGET" "$CURRENT_LINK"
217
- sudo -n systemctl start smart-panel 2>/dev/null || true
218
- fi
219
- update_status "failed" "failed" "Failed to start service after update"
514
+ write_attempt "active" "starting" "" "false" "true"
515
+ if ! sudo -n systemctl start "$SERVICE_NAME" 2>&1 || ! wait_for_started_service; then
516
+ hold_attempt "start_failed" "Target service did not reach verified health after migration"
517
+ update_status "failed" "failed" "Target service failed to start or become healthy; update is held for recovery"
518
+ FINALIZED="true"
220
519
  exit 1
221
- }
520
+ fi
222
521
 
223
522
  # ── Cleanup old versions (keep max 2 previous) ──
224
523
  cd "$IMAGE_BASE_DIR"
@@ -239,7 +538,9 @@ if [ "$INSTALL_TYPE" = "image" ]; then
239
538
  fi
240
539
 
241
540
  # ── Mark complete ──
541
+ release_attempt
242
542
  update_status "complete" "complete"
543
+ FINALIZED="true"
243
544
  trap - EXIT
244
545
  exit 0
245
546
  fi
@@ -19,7 +19,16 @@ export declare class UpdateExecutorService implements OnModuleInit {
19
19
  private progressHighWaterMark;
20
20
  constructor(updateService: UpdateService, privilegedWorker: PrivilegedWorkerService, notifications: NotificationsService);
21
21
  onModuleInit(): Promise<void>;
22
+ private readAttempt;
23
+ private isAttemptUnresolved;
24
+ private isAttemptOwnerAlive;
25
+ private readStatusFile;
26
+ private waitForAttemptSettlement;
27
+ private reconcileCompletedAttempt;
28
+ private reconcileLiveAttempt;
22
29
  private checkPendingUpdateStatus;
30
+ private processPendingStatus;
31
+ private cleanupPendingStatus;
23
32
  startUpdate(targetVersion: string): Promise<void>;
24
33
  private watchUpdateJob;
25
34
  private writeStatusFile;