@homebridge-plugins/homebridge-updater 3.0.7
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/LICENSE +25 -0
- package/README.md +117 -0
- package/config.schema.json +257 -0
- package/dist/Platform.HAP.d.ts +16 -0
- package/dist/Platform.HAP.d.ts.map +1 -0
- package/dist/Platform.HAP.js +77 -0
- package/dist/Platform.HAP.js.map +1 -0
- package/dist/Platform.Matter.d.ts +7 -0
- package/dist/Platform.Matter.d.ts.map +1 -0
- package/dist/Platform.Matter.js +21 -0
- package/dist/Platform.Matter.js.map +1 -0
- package/dist/configMigration.d.ts +4 -0
- package/dist/configMigration.d.ts.map +1 -0
- package/dist/configMigration.js +45 -0
- package/dist/configMigration.js.map +1 -0
- package/dist/configMigration.test.d.ts +2 -0
- package/dist/configMigration.test.d.ts.map +1 -0
- package/dist/configMigration.test.js +23 -0
- package/dist/configMigration.test.js.map +1 -0
- package/dist/configTypes.d.ts +24 -0
- package/dist/configTypes.d.ts.map +1 -0
- package/dist/configTypes.js +2 -0
- package/dist/configTypes.js.map +1 -0
- package/dist/configTypes.test.d.ts +2 -0
- package/dist/configTypes.test.d.ts.map +1 -0
- package/dist/configTypes.test.js +108 -0
- package/dist/configTypes.test.js.map +1 -0
- package/dist/failureSensor.d.ts +17 -0
- package/dist/failureSensor.d.ts.map +1 -0
- package/dist/failureSensor.js +36 -0
- package/dist/failureSensor.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +230 -0
- package/dist/homebridge-ui/server.d.ts +2 -0
- package/dist/homebridge-ui/server.d.ts.map +1 -0
- package/dist/homebridge-ui/server.js +47 -0
- package/dist/homebridge-ui/server.js.map +1 -0
- package/dist/ignore-plugins.test.d.ts +2 -0
- package/dist/ignore-plugins.test.d.ts.map +1 -0
- package/dist/ignore-plugins.test.js +121 -0
- package/dist/ignore-plugins.test.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +8 -0
- package/dist/index.test.js.map +1 -0
- package/dist/schema.test.d.ts +2 -0
- package/dist/schema.test.d.ts.map +1 -0
- package/dist/schema.test.js +109 -0
- package/dist/schema.test.js.map +1 -0
- package/dist/sensorBase.d.ts +39 -0
- package/dist/sensorBase.d.ts.map +1 -0
- package/dist/sensorBase.js +309 -0
- package/dist/sensorBase.js.map +1 -0
- package/dist/settings.d.ts +11 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +11 -0
- package/dist/settings.js.map +1 -0
- package/dist/ui-api.d.ts +40 -0
- package/dist/ui-api.d.ts.map +1 -0
- package/dist/ui-api.js +522 -0
- package/dist/ui-api.js.map +1 -0
- package/dist/updateCheckCore.d.ts +46 -0
- package/dist/updateCheckCore.d.ts.map +1 -0
- package/dist/updateCheckCore.js +433 -0
- package/dist/updateCheckCore.js.map +1 -0
- package/dist/updateSensor.d.ts +21 -0
- package/dist/updateSensor.d.ts.map +1 -0
- package/dist/updateSensor.js +75 -0
- package/dist/updateSensor.js.map +1 -0
- package/dist/updateSensor.test.d.ts +2 -0
- package/dist/updateSensor.test.d.ts.map +1 -0
- package/dist/updateSensor.test.js +133 -0
- package/dist/updateSensor.test.js.map +1 -0
- package/dist/utils.d.ts +22 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +75 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +126 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +96 -0
package/dist/ui-api.js
ADDED
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/* eslint-disable style/brace-style */
|
|
2
|
+
/* eslint-disable style/operator-linebreak */
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import https from 'node:https';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import process from 'node:process';
|
|
8
|
+
import { request as httpRequest } from 'node:http';
|
|
9
|
+
import { request as httpsRequest } from 'node:https';
|
|
10
|
+
import CacheableLookup from 'cacheable-lookup';
|
|
11
|
+
import jwt from 'jsonwebtoken';
|
|
12
|
+
class ApiPluginEndpoints {
|
|
13
|
+
static getHomebridgeVersion = '/api/status/homebridge-version';
|
|
14
|
+
static getPluginList = '/api/plugins';
|
|
15
|
+
static getIgnoredPluginList = '/api/config-editor/ui/plugins/hide-updates-for';
|
|
16
|
+
static pluginConfig(pluginName) {
|
|
17
|
+
return `/api/config-editor/plugin/${encodeURIComponent(pluginName)}`;
|
|
18
|
+
}
|
|
19
|
+
static saveConfig = '/api/config-editor';
|
|
20
|
+
}
|
|
21
|
+
export class UiApi {
|
|
22
|
+
log;
|
|
23
|
+
secrets;
|
|
24
|
+
baseUrl;
|
|
25
|
+
httpsAgent;
|
|
26
|
+
token;
|
|
27
|
+
dockerUrl;
|
|
28
|
+
cacheable;
|
|
29
|
+
hbStoragePath;
|
|
30
|
+
constructor(hbStoragePath, log) {
|
|
31
|
+
this.log = log;
|
|
32
|
+
this.hbStoragePath = hbStoragePath;
|
|
33
|
+
const MAX_TTL_SEC = 86400; // limit TTL to 24 hours
|
|
34
|
+
this.cacheable = new CacheableLookup({ maxTtl: MAX_TTL_SEC });
|
|
35
|
+
const configPath = path.resolve(hbStoragePath, 'config.json');
|
|
36
|
+
const hbConfig = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
37
|
+
const config = hbConfig.platforms.find((config) => config.platform === 'config' || config.platform === 'homebridge-config-ui-x.config');
|
|
38
|
+
if (config) {
|
|
39
|
+
const secretPath = path.resolve(hbStoragePath, '.uix-secrets');
|
|
40
|
+
this.secrets = JSON.parse(readFileSync(secretPath, 'utf8'));
|
|
41
|
+
const ssl = !!config.ssl?.key || !!config.ssl?.pfx;
|
|
42
|
+
const protocol = ssl ? 'https://' : 'http://';
|
|
43
|
+
const host = config.host ?? 'localhost';
|
|
44
|
+
const port = config.port ?? 8581;
|
|
45
|
+
this.baseUrl = `${protocol + host}:${port.toString()}`;
|
|
46
|
+
const dockerProtocol = 'https://';
|
|
47
|
+
const dockerHost = 'hub.docker.com';
|
|
48
|
+
this.dockerUrl = `${dockerProtocol + dockerHost}`;
|
|
49
|
+
if (ssl) {
|
|
50
|
+
this.httpsAgent = new https.Agent({ rejectUnauthorized: false }); // don't reject self-signed certs
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
isConfigured() {
|
|
55
|
+
return this.secrets !== undefined;
|
|
56
|
+
}
|
|
57
|
+
async getHomebridge() {
|
|
58
|
+
if (this.isConfigured()) {
|
|
59
|
+
const result = await this.makeCall(ApiPluginEndpoints.getHomebridgeVersion);
|
|
60
|
+
if (result.length > 0) {
|
|
61
|
+
return result[0];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
name: '',
|
|
66
|
+
installedVersion: '',
|
|
67
|
+
latestVersion: '',
|
|
68
|
+
updateAvailable: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async getPlugins() {
|
|
72
|
+
if (this.isConfigured()) {
|
|
73
|
+
return await this.makeCall(ApiPluginEndpoints.getPluginList);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async getIgnoredPlugins() {
|
|
80
|
+
if (this.isConfigured()) {
|
|
81
|
+
try {
|
|
82
|
+
const result = await this.makeCall(ApiPluginEndpoints.getIgnoredPluginList);
|
|
83
|
+
// Validate the response format
|
|
84
|
+
if (!Array.isArray(result)) {
|
|
85
|
+
this.log.warn(`Unexpected response format from ignored plugins API: ${typeof result}, expected array`);
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
const ignoredPlugins = result;
|
|
89
|
+
this.log.debug(`API returned ${ignoredPlugins.length} ignored plugins: ${ignoredPlugins.join(', ')}`);
|
|
90
|
+
return ignoredPlugins;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
// Check if it's a 404 error (API endpoint doesn't exist)
|
|
94
|
+
if (error?.response?.status === 404) {
|
|
95
|
+
this.log.warn('Ignored plugins API endpoint not found - requires homebridge-config-ui-x v5.6.2-beta.2 or later');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.log.warn(`Failed to retrieve ignored plugins list from /config-editor/ui/plugins/hide-updates-for: ${error}`);
|
|
99
|
+
}
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.log.debug('homebridge-config-ui-x not configured, cannot retrieve ignored plugins list');
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async getPluginConfig(pluginName) {
|
|
109
|
+
if (!this.isConfigured()) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const apiPath = ApiPluginEndpoints.pluginConfig(pluginName);
|
|
113
|
+
const response = await this.nativeRequestWithRetry('GET', this.baseUrl + apiPath, {
|
|
114
|
+
headers: {
|
|
115
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
116
|
+
},
|
|
117
|
+
agent: this.httpsAgent,
|
|
118
|
+
lookup: this.cacheable.lookup,
|
|
119
|
+
});
|
|
120
|
+
if (Array.isArray(response)) {
|
|
121
|
+
return response;
|
|
122
|
+
}
|
|
123
|
+
if (response && typeof response === 'object') {
|
|
124
|
+
const pluginConfig = response.pluginConfig;
|
|
125
|
+
if (Array.isArray(pluginConfig)) {
|
|
126
|
+
return pluginConfig;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
async updatePluginConfig(pluginName, pluginConfig) {
|
|
132
|
+
if (!this.isConfigured()) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const apiPath = ApiPluginEndpoints.pluginConfig(pluginName);
|
|
136
|
+
await this.nativeRequestWithRetry('PUT', this.baseUrl + apiPath, {
|
|
137
|
+
headers: {
|
|
138
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
139
|
+
},
|
|
140
|
+
body: pluginConfig,
|
|
141
|
+
agent: this.httpsAgent,
|
|
142
|
+
lookup: this.cacheable.lookup,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async savePluginConfig(pluginName) {
|
|
146
|
+
if (!this.isConfigured()) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await this.nativeRequestWithRetry('POST', this.baseUrl + ApiPluginEndpoints.saveConfig, {
|
|
150
|
+
headers: {
|
|
151
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
152
|
+
},
|
|
153
|
+
body: {
|
|
154
|
+
plugin: pluginName,
|
|
155
|
+
},
|
|
156
|
+
agent: this.httpsAgent,
|
|
157
|
+
lookup: this.cacheable.lookup,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
async getDocker() {
|
|
161
|
+
const currentDockerVersion = process.env.DOCKER_HOMEBRIDGE_VERSION;
|
|
162
|
+
let dockerInfo = {
|
|
163
|
+
name: '',
|
|
164
|
+
installedVersion: '',
|
|
165
|
+
latestVersion: '',
|
|
166
|
+
updateAvailable: false,
|
|
167
|
+
};
|
|
168
|
+
if (this.isConfigured() && currentDockerVersion !== undefined) {
|
|
169
|
+
const json = await this.makeDockerCall('/v2/repositories/homebridge/homebridge/tags/?page_size=30&page=1&ordering=last_updated');
|
|
170
|
+
const images = json.results;
|
|
171
|
+
// If the currently installed version is not returned in the list of Docker versions (too old or deleted),
|
|
172
|
+
// then use a last-updated date Jan 1, 1970
|
|
173
|
+
const installedImage = images.filter(image => image.name === currentDockerVersion)[0] ?? undefined;
|
|
174
|
+
const installedImageDate = Date.parse(installedImage ? installedImage.last_updated : '1970-01-01T00:00:00.000000Z');
|
|
175
|
+
// Filter for version names YYYY-MM-DD (no alphas or betas)
|
|
176
|
+
const regex = /^\d{4}-\d{2}-\d{2}$/gm;
|
|
177
|
+
const availableImages = images.filter(image => image.name.match(regex) &&
|
|
178
|
+
(Date.parse(image.last_updated) > installedImageDate));
|
|
179
|
+
if (availableImages.length > 0) {
|
|
180
|
+
dockerInfo = {
|
|
181
|
+
name: 'Docker image',
|
|
182
|
+
installedVersion: currentDockerVersion,
|
|
183
|
+
latestVersion: availableImages[0].name,
|
|
184
|
+
updateAvailable: true,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return dockerInfo;
|
|
189
|
+
}
|
|
190
|
+
async updateHomebridge(targetVersion) {
|
|
191
|
+
this.log.info(`Attempting to update Homebridge${targetVersion ? ` to ${targetVersion}` : ' to latest version'}`);
|
|
192
|
+
try {
|
|
193
|
+
const args = ['install', '-g', `homebridge${targetVersion ? `@${targetVersion}` : '@latest'}`];
|
|
194
|
+
const result = await this.runNpmCommand(args);
|
|
195
|
+
this.log.info(`Homebridge update command completed successfully (${result})`);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
this.log.error(`Failed to update Homebridge: ${error}`);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async updatePlugin(pluginName, targetVersion) {
|
|
204
|
+
this.log.info(`Attempting to update plugin ${pluginName}${targetVersion ? ` to ${targetVersion}` : ' to latest version'}`);
|
|
205
|
+
try {
|
|
206
|
+
const args = ['install', '-g', `${pluginName}${targetVersion ? `@${targetVersion}` : '@latest'}`];
|
|
207
|
+
const result = await this.runNpmCommand(args);
|
|
208
|
+
this.log.info(`Plugin ${pluginName} update command completed successfully (${result})`);
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
this.log.error(`Failed to update plugin ${pluginName}: ${error}`);
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async updateNpm(targetVersion) {
|
|
217
|
+
this.log.info(`Attempting to update npm${targetVersion ? ` to ${targetVersion}` : ' to latest version'}`);
|
|
218
|
+
try {
|
|
219
|
+
const args = ['install', '-g', `npm${targetVersion ? `@${targetVersion}` : '@latest'}`];
|
|
220
|
+
const result = await this.runNpmCommand(args);
|
|
221
|
+
this.log.info(`npm update command completed successfully (${result})`);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
this.log.error(`Failed to update npm: ${error}`);
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async runNpmCommand(args) {
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
try {
|
|
232
|
+
const npm = spawn('npm', args, {
|
|
233
|
+
env: process.env,
|
|
234
|
+
});
|
|
235
|
+
let stdout = '';
|
|
236
|
+
let stderr = '';
|
|
237
|
+
// eslint-disable-next-line node/prefer-global/buffer
|
|
238
|
+
npm.stdout.on('data', (chunk) => {
|
|
239
|
+
stdout += chunk.toString();
|
|
240
|
+
});
|
|
241
|
+
// eslint-disable-next-line node/prefer-global/buffer
|
|
242
|
+
npm.stderr.on('data', (chunk) => {
|
|
243
|
+
stderr += chunk.toString();
|
|
244
|
+
});
|
|
245
|
+
npm.on('close', (code) => {
|
|
246
|
+
if (code === 0) {
|
|
247
|
+
resolve(stdout);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
reject(new Error(`npm command failed with code ${code}: ${stderr}`));
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
npm.on('error', (error) => {
|
|
254
|
+
reject(error);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
catch (ex) {
|
|
258
|
+
reject(ex);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
async createBackup() {
|
|
263
|
+
this.log.info('Creating backup before performing updates');
|
|
264
|
+
try {
|
|
265
|
+
if (this.isConfigured()) {
|
|
266
|
+
// Try different possible backup API endpoints
|
|
267
|
+
const backupEndpoints = [
|
|
268
|
+
'/api/backup/create',
|
|
269
|
+
'/api/backups/create',
|
|
270
|
+
'/api/backup',
|
|
271
|
+
'/api/server/backup',
|
|
272
|
+
];
|
|
273
|
+
for (const endpoint of backupEndpoints) {
|
|
274
|
+
try {
|
|
275
|
+
await this.makeBackupCall(endpoint);
|
|
276
|
+
this.log.info(`Backup created successfully via UI API (${endpoint})`);
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
this.log.debug(`Backup endpoint ${endpoint} failed: ${error}`);
|
|
281
|
+
// Continue to next endpoint
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
this.log.warn('All backup endpoints failed - backup creation unavailable');
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
this.log.warn('UI API not configured - backup creation skipped');
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
this.log.warn(`Failed to create backup: ${error}`);
|
|
294
|
+
this.log.warn('Continuing with updates despite backup failure - ensure you have manual backups in place');
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async restartHomebridge() {
|
|
299
|
+
this.log.info('Attempting to restart Homebridge to apply updates');
|
|
300
|
+
try {
|
|
301
|
+
if (this.isConfigured()) {
|
|
302
|
+
// Try different restart endpoints with fallback strategy
|
|
303
|
+
const restartEndpoints = [
|
|
304
|
+
'/api/server/restart',
|
|
305
|
+
'/api/platform-tools/docker/restart-container',
|
|
306
|
+
'/api/platform-tools/linux/restart-host',
|
|
307
|
+
];
|
|
308
|
+
for (const endpoint of restartEndpoints) {
|
|
309
|
+
try {
|
|
310
|
+
await this.makeRestartCall(endpoint);
|
|
311
|
+
this.log.info(`Homebridge restart initiated via UI API (${endpoint})`);
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
this.log.warn(`Restart endpoint ${endpoint} failed: ${error}`);
|
|
316
|
+
// Continue to next endpoint
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
this.log.warn('All restart endpoints failed - UI API restart unavailable');
|
|
320
|
+
// Fallback: exit process to trigger restart by process manager
|
|
321
|
+
this.log.info('Falling back to process exit for restart');
|
|
322
|
+
setTimeout(() => {
|
|
323
|
+
process.exit(0);
|
|
324
|
+
}, 5000); // 5 second delay to allow log message to be written
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
// Fallback: exit process to trigger restart by process manager
|
|
329
|
+
this.log.info('UI API not available, triggering process exit for restart');
|
|
330
|
+
setTimeout(() => {
|
|
331
|
+
process.exit(0);
|
|
332
|
+
}, 5000); // 5 second delay to allow log message to be written
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
this.log.error(`Failed to restart Homebridge: ${error}`);
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
async makeRestartCall(apiPath) {
|
|
342
|
+
const methods = ['PUT', 'POST'];
|
|
343
|
+
let lastError;
|
|
344
|
+
for (const method of methods) {
|
|
345
|
+
try {
|
|
346
|
+
const response = await this.nativeRequestWithRetry(method, this.baseUrl + apiPath, {
|
|
347
|
+
headers: {
|
|
348
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
349
|
+
},
|
|
350
|
+
body: {},
|
|
351
|
+
agent: this.httpsAgent,
|
|
352
|
+
lookup: this.cacheable.lookup,
|
|
353
|
+
});
|
|
354
|
+
this.log.debug(`Restart endpoint ${apiPath} (${method}) returned: ${JSON.stringify(response)}`);
|
|
355
|
+
return response;
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
lastError = error;
|
|
359
|
+
this.log.debug(`Restart endpoint ${apiPath} failed with ${method}: ${error}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
throw lastError;
|
|
363
|
+
}
|
|
364
|
+
async makeBackupCall(apiPath) {
|
|
365
|
+
return this.nativeRequestWithRetry('POST', this.baseUrl + apiPath, {
|
|
366
|
+
headers: {
|
|
367
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
368
|
+
},
|
|
369
|
+
body: {},
|
|
370
|
+
agent: this.httpsAgent,
|
|
371
|
+
lookup: this.cacheable.lookup,
|
|
372
|
+
timeout: 60000,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
async makeDockerCall(apiPath) {
|
|
376
|
+
try {
|
|
377
|
+
return await this.nativeRequestWithRetry('GET', this.dockerUrl + apiPath, {
|
|
378
|
+
agent: this.httpsAgent,
|
|
379
|
+
lookup: this.cacheable.lookup,
|
|
380
|
+
timeout: 60000,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
if (error.code === 'ETIMEOUT') {
|
|
385
|
+
this.log.error(`Timeout error connecting to ${this.dockerUrl}`);
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
this.log.error(`${error.code} error connecting to ${this.dockerUrl}`);
|
|
389
|
+
}
|
|
390
|
+
return { count: 0, results: [] };
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async makeCall(apiPath) {
|
|
394
|
+
try {
|
|
395
|
+
const data = await this.nativeRequestWithRetry('GET', this.baseUrl + apiPath, {
|
|
396
|
+
headers: {
|
|
397
|
+
Authorization: `Bearer ${this.getToken()}`,
|
|
398
|
+
},
|
|
399
|
+
agent: this.httpsAgent,
|
|
400
|
+
lookup: this.cacheable.lookup,
|
|
401
|
+
});
|
|
402
|
+
this.log.debug(`${this.baseUrl + apiPath}: ${JSON.stringify(data)}`);
|
|
403
|
+
if (!Array.isArray(data)) {
|
|
404
|
+
return [data];
|
|
405
|
+
}
|
|
406
|
+
return data;
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
this.log.error(`${error.code} error connecting to ${this.baseUrl + apiPath}`);
|
|
410
|
+
if (error.code === 'ERR_BAD_REQUEST' && error.status === 404 && apiPath === ApiPluginEndpoints.getIgnoredPluginList) {
|
|
411
|
+
this.log.debug(`Error: ${JSON.stringify(error, undefined, 2)}`);
|
|
412
|
+
this.log.warn(`This feature requires a newer version of Homebridge UI. Please update to the latest version.`);
|
|
413
|
+
}
|
|
414
|
+
return [];
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
async nativeRequestWithRetry(method, urlString, options = {}, retries = 3, backoff = 1000) {
|
|
418
|
+
let attempt = 0;
|
|
419
|
+
let lastError;
|
|
420
|
+
while (attempt < retries) {
|
|
421
|
+
try {
|
|
422
|
+
return await this.nativeRequest(method, urlString, options);
|
|
423
|
+
}
|
|
424
|
+
catch (err) {
|
|
425
|
+
lastError = err;
|
|
426
|
+
attempt++;
|
|
427
|
+
if (attempt < retries) {
|
|
428
|
+
await new Promise(res => setTimeout(res, backoff * attempt));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
throw lastError;
|
|
433
|
+
}
|
|
434
|
+
nativeRequest(method, urlString, options = {}) {
|
|
435
|
+
return new Promise((resolve, reject) => {
|
|
436
|
+
try {
|
|
437
|
+
const urlObj = new URL(urlString);
|
|
438
|
+
const isHttps = urlObj.protocol === 'https:';
|
|
439
|
+
const hasJsonBodyMethod = method === 'POST' || method === 'PUT' || method === 'PATCH';
|
|
440
|
+
const requestBody = hasJsonBodyMethod
|
|
441
|
+
? JSON.stringify(options.body ?? {})
|
|
442
|
+
: undefined;
|
|
443
|
+
const headers = {
|
|
444
|
+
...(options.headers || {}),
|
|
445
|
+
};
|
|
446
|
+
if (requestBody) {
|
|
447
|
+
// UI API endpoints expect JSON content negotiation for action routes.
|
|
448
|
+
if (!headers['Content-Type']) {
|
|
449
|
+
headers['Content-Type'] = 'application/json';
|
|
450
|
+
}
|
|
451
|
+
if (!headers.Accept) {
|
|
452
|
+
headers.Accept = 'application/json';
|
|
453
|
+
}
|
|
454
|
+
headers['Content-Length'] = String(Buffer.byteLength(requestBody));
|
|
455
|
+
}
|
|
456
|
+
const reqOptions = {
|
|
457
|
+
method,
|
|
458
|
+
hostname: urlObj.hostname,
|
|
459
|
+
port: urlObj.port || (isHttps ? 443 : 80),
|
|
460
|
+
path: urlObj.pathname + urlObj.search,
|
|
461
|
+
headers,
|
|
462
|
+
agent: options.agent,
|
|
463
|
+
timeout: options.timeout || 30000,
|
|
464
|
+
lookup: options.lookup,
|
|
465
|
+
};
|
|
466
|
+
const req = (isHttps ? httpsRequest : httpRequest)(reqOptions, (res) => {
|
|
467
|
+
let data = '';
|
|
468
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
469
|
+
res.on('end', () => {
|
|
470
|
+
try {
|
|
471
|
+
// Check for HTTP error status codes
|
|
472
|
+
if (!res.statusCode || res.statusCode < 200 || res.statusCode >= 300) {
|
|
473
|
+
const statusCode = res.statusCode || 'unknown';
|
|
474
|
+
reject(new Error(`HTTP ${statusCode}: ${data || 'no response body'}`));
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
const contentType = res.headers['content-type'] || '';
|
|
478
|
+
if (contentType.includes('application/json')) {
|
|
479
|
+
resolve(JSON.parse(data));
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
resolve(data);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
catch (err) {
|
|
486
|
+
reject(err);
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
req.on('error', (err) => reject(err));
|
|
491
|
+
req.on('timeout', () => {
|
|
492
|
+
req.destroy();
|
|
493
|
+
reject(new Error('ETIMEOUT'));
|
|
494
|
+
});
|
|
495
|
+
if (requestBody) {
|
|
496
|
+
req.write(requestBody);
|
|
497
|
+
}
|
|
498
|
+
req.end();
|
|
499
|
+
}
|
|
500
|
+
catch (err) {
|
|
501
|
+
reject(err);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
getToken() {
|
|
506
|
+
if (this.token) {
|
|
507
|
+
return this.token;
|
|
508
|
+
}
|
|
509
|
+
const user = {
|
|
510
|
+
username: '@homebridge-plugins/homebridge-updater',
|
|
511
|
+
name: '@homebridge-plugins/homebridge-updater',
|
|
512
|
+
admin: true,
|
|
513
|
+
instanceId: 'xxxxxxx',
|
|
514
|
+
};
|
|
515
|
+
this.token = jwt.sign(user, this.secrets.secretKey, { expiresIn: '1m' });
|
|
516
|
+
setTimeout(() => {
|
|
517
|
+
this.token = undefined;
|
|
518
|
+
}, 30 * 1000);
|
|
519
|
+
return this.token;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=ui-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-api.js","sourceRoot":"","sources":["../src/ui-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Logging, PlatformConfig } from 'homebridge';
|
|
2
|
+
import type { PluginUpdatePlatformConfig } from './configTypes.js';
|
|
3
|
+
import { UiApi } from './ui-api.js';
|
|
4
|
+
export declare class UpdateCheckCore {
|
|
5
|
+
readonly checkNode: boolean;
|
|
6
|
+
readonly checkNpm: boolean;
|
|
7
|
+
nodeUpdates: string[];
|
|
8
|
+
npmUpdates: string[];
|
|
9
|
+
readonly log: Logging;
|
|
10
|
+
readonly config: PluginUpdatePlatformConfig;
|
|
11
|
+
readonly uiApi: UiApi;
|
|
12
|
+
readonly respectDisabledPlugins: boolean;
|
|
13
|
+
readonly checkHB: boolean;
|
|
14
|
+
readonly checkHBUI: boolean;
|
|
15
|
+
readonly checkPlugins: boolean;
|
|
16
|
+
readonly checkDocker: boolean;
|
|
17
|
+
readonly isDocker: boolean;
|
|
18
|
+
readonly initialCheckDelay: number;
|
|
19
|
+
hbUpdates: string[];
|
|
20
|
+
hbUIUpdates: string[];
|
|
21
|
+
pluginUpdates: string[];
|
|
22
|
+
dockerUpdates: string[];
|
|
23
|
+
firstDailyRun: boolean;
|
|
24
|
+
private lastAutoUpdateFailed;
|
|
25
|
+
constructor(log: Logging, config: PlatformConfig, storagePath: string, isDocker: boolean);
|
|
26
|
+
checkUi(): Promise<number>;
|
|
27
|
+
getLastAutoUpdateFailed(): boolean;
|
|
28
|
+
private handleConfiguredAutoUpdates;
|
|
29
|
+
private applyAutoUpdate;
|
|
30
|
+
private getLocalNpmVersion;
|
|
31
|
+
private getLatestNpmVersion;
|
|
32
|
+
private compareSemver;
|
|
33
|
+
private firstDailyRunResetCronJob?;
|
|
34
|
+
private updatesCronJob?;
|
|
35
|
+
/**
|
|
36
|
+
* Start scheduled update checks and daily reset using cron jobs.
|
|
37
|
+
* @param onCheck Callback to run after each update check (e.g., set sensor/cluster value)
|
|
38
|
+
* @param timezone Optional timezone string (defaults to system timezone)
|
|
39
|
+
*/
|
|
40
|
+
startScheduledChecks(onCheck: (updates: number) => void, timezone?: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* Stop all scheduled cron jobs (if running)
|
|
43
|
+
*/
|
|
44
|
+
stopScheduledChecks(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=updateCheckCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateCheckCore.d.ts","sourceRoot":"","sources":["../src/updateCheckCore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,KAAK,EAAmB,MAAM,aAAa,CAAC;AAGrD,qBAAa,eAAe;IAC1B,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAM;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAM;IACjC,SAAgB,GAAG,EAAE,OAAO,CAAC;IAC7B,SAAgB,MAAM,EAAE,0BAA0B,CAAC;IACnD,SAAgB,KAAK,EAAE,KAAK,CAAC;IAC7B,SAAgB,sBAAsB,EAAE,OAAO,CAAC;IAChD,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,SAAS,EAAE,OAAO,CAAC;IACnC,SAAgB,YAAY,EAAE,OAAO,CAAC;IACtC,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAClC,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAM;IACzB,WAAW,EAAE,MAAM,EAAE,CAAM;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAM;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAM;IAC7B,aAAa,EAAE,OAAO,CAAQ;IACrC,OAAO,CAAC,oBAAoB,CAAS;gBAEzB,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IAelF,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA2NzB,uBAAuB,IAAI,OAAO;YAI3B,2BAA2B;YAgE3B,eAAe;IAa7B,OAAO,CAAC,kBAAkB;YASZ,mBAAmB;IAwBjC,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,yBAAyB,CAAC,CAAO;IACzC,OAAO,CAAC,cAAc,CAAC,CAAO;IAC9B;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAqCjF;;OAEG;IACH,mBAAmB,IAAI,IAAI;CAI5B"}
|