@balena/open-balena-api 46.0.22 → 46.0.23
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.
|
@@ -1,2 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare const downloadImageConfig: import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, {
|
|
2
|
+
[x: string]: unknown;
|
|
3
|
+
version?: string | null | undefined;
|
|
4
|
+
fileType?: string | null | undefined;
|
|
5
|
+
appId?: string | number | null | undefined;
|
|
6
|
+
releaseId?: string | number | null | undefined;
|
|
7
|
+
hostname?: string | null | undefined;
|
|
8
|
+
deviceType?: string | null | undefined;
|
|
9
|
+
imageType?: string | null | undefined;
|
|
10
|
+
developmentMode?: string | boolean | undefined;
|
|
11
|
+
appUpdatePollInterval?: string | number | undefined;
|
|
12
|
+
network?: string | undefined;
|
|
13
|
+
wifiSsid?: string | undefined;
|
|
14
|
+
wifiKey?: string | undefined;
|
|
15
|
+
ip?: string | undefined;
|
|
16
|
+
gateway?: string | undefined;
|
|
17
|
+
netmask?: string | undefined;
|
|
18
|
+
secureboot?: string | boolean | undefined;
|
|
19
|
+
provisioningKeyName?: string | null | undefined;
|
|
20
|
+
provisioningKeyDescription?: string | null | undefined;
|
|
21
|
+
provisioningKeyExpiryDate?: string | null | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
[x: string]: unknown;
|
|
24
|
+
version?: string | undefined;
|
|
25
|
+
fileType?: string | undefined;
|
|
26
|
+
appId?: string | undefined;
|
|
27
|
+
releaseId?: string | undefined;
|
|
28
|
+
hostname?: string | undefined;
|
|
29
|
+
deviceType?: string | undefined;
|
|
30
|
+
imageType?: string | undefined;
|
|
31
|
+
developmentMode?: string | undefined;
|
|
32
|
+
appUpdatePollInterval?: string | undefined;
|
|
33
|
+
network?: string | undefined;
|
|
34
|
+
wifiSsid?: string | undefined;
|
|
35
|
+
wifiKey?: string | undefined;
|
|
36
|
+
ip?: string | undefined;
|
|
37
|
+
gateway?: string | undefined;
|
|
38
|
+
netmask?: string | undefined;
|
|
39
|
+
secureboot?: string | undefined;
|
|
40
|
+
provisioningKeyName?: string | undefined;
|
|
41
|
+
provisioningKeyDescription?: string | undefined;
|
|
42
|
+
provisioningKeyExpiryDate?: string | undefined;
|
|
43
|
+
}, Record<string, any>>;
|
|
@@ -4,6 +4,7 @@ import { generateConfig } from './device-config.js';
|
|
|
4
4
|
import { getDeviceTypeJsonBySlug } from '../device-types/device-types.js';
|
|
5
5
|
import { checkInt } from '../../lib/utils.js';
|
|
6
6
|
import { getApiKeyOptsFromRequest } from '../api-keys/lib.js';
|
|
7
|
+
import { createValidatedRequestHandler, z, } from '../../infra/validation/index.js';
|
|
7
8
|
const { UnauthorizedError, NotFoundError, BadRequestError } = errors;
|
|
8
9
|
const { api } = sbvrUtils;
|
|
9
10
|
const getApp = async (appId, req) => {
|
|
@@ -26,7 +27,54 @@ const getApp = async (appId, req) => {
|
|
|
26
27
|
}
|
|
27
28
|
return app;
|
|
28
29
|
};
|
|
29
|
-
export const downloadImageConfig =
|
|
30
|
+
export const downloadImageConfig = createValidatedRequestHandler({
|
|
31
|
+
// TODO: this should be stricter with which properties are required/not actually optional
|
|
32
|
+
// The `looseObject` is because different device types can have options specific to them and so we cannot provide a complete set here..
|
|
33
|
+
query: z.looseObject({
|
|
34
|
+
version: z.string().optional(),
|
|
35
|
+
fileType: z.string().optional(),
|
|
36
|
+
appId: z.string().optional(),
|
|
37
|
+
releaseId: z.string().optional(),
|
|
38
|
+
hostname: z.string().optional(),
|
|
39
|
+
deviceType: z.string().optional(),
|
|
40
|
+
imageType: z.string().optional(),
|
|
41
|
+
developmentMode: z.string().optional(),
|
|
42
|
+
appUpdatePollInterval: z.string().optional(),
|
|
43
|
+
network: z.string().optional(),
|
|
44
|
+
wifiSsid: z.string().optional(),
|
|
45
|
+
wifiKey: z.string().optional(),
|
|
46
|
+
ip: z.string().optional(),
|
|
47
|
+
gateway: z.string().optional(),
|
|
48
|
+
netmask: z.string().optional(),
|
|
49
|
+
secureboot: z.string().optional(),
|
|
50
|
+
provisioningKeyName: z.string().optional(),
|
|
51
|
+
provisioningKeyDescription: z.string().optional(),
|
|
52
|
+
provisioningKeyExpiryDate: z.string().optional(),
|
|
53
|
+
}),
|
|
54
|
+
// TODO: this should be stricter with which properties are required/not actually optional
|
|
55
|
+
// The `looseObject` is because different device types can have options specific to them and so we cannot provide a complete set here..
|
|
56
|
+
body: z.looseObject({
|
|
57
|
+
version: z.string().nullish(),
|
|
58
|
+
fileType: z.string().nullish(),
|
|
59
|
+
appId: z.string().or(z.number()).nullish(),
|
|
60
|
+
releaseId: z.string().or(z.number()).nullish(),
|
|
61
|
+
hostname: z.string().nullish(),
|
|
62
|
+
deviceType: z.string().nullish(),
|
|
63
|
+
imageType: z.string().nullish(),
|
|
64
|
+
developmentMode: z.string().or(z.boolean()).optional(),
|
|
65
|
+
appUpdatePollInterval: z.string().or(z.number()).optional(),
|
|
66
|
+
network: z.string().optional(),
|
|
67
|
+
wifiSsid: z.string().optional(),
|
|
68
|
+
wifiKey: z.string().optional(),
|
|
69
|
+
ip: z.string().optional(),
|
|
70
|
+
gateway: z.string().optional(),
|
|
71
|
+
netmask: z.string().optional(),
|
|
72
|
+
secureboot: z.string().or(z.boolean()).optional(),
|
|
73
|
+
provisioningKeyName: z.string().nullish(),
|
|
74
|
+
provisioningKeyDescription: z.string().nullish(),
|
|
75
|
+
provisioningKeyExpiryDate: z.string().nullish(),
|
|
76
|
+
}),
|
|
77
|
+
}, async (req, res) => {
|
|
30
78
|
try {
|
|
31
79
|
// Combining both req.body and req.query given both GET and POST support
|
|
32
80
|
// Ref: https://github.com/balena-io/balena-api/blob/master/src/routes/applications.ts#L95
|
|
@@ -48,13 +96,16 @@ export const downloadImageConfig = async (req, res) => {
|
|
|
48
96
|
throw new BadRequestError('Device type must be a string if provided');
|
|
49
97
|
}
|
|
50
98
|
const provisioningKeyOptions = getApiKeyOptsFromRequest(req.body, 'provisioningKey');
|
|
51
|
-
provisioningKeyOptions.name ??=
|
|
99
|
+
provisioningKeyOptions.name ??=
|
|
100
|
+
'Automatically generated provisioning key';
|
|
52
101
|
provisioningKeyOptions.description ??=
|
|
53
102
|
'Automatically generated for a config file generation';
|
|
54
103
|
const resinApi = api.resin.clone({ passthrough: { req } });
|
|
55
104
|
const app = await getApp(appId, req);
|
|
56
105
|
const deviceTypeJson = await getDeviceTypeJsonBySlug(resinApi, deviceTypeSlug ?? app.is_for__device_type[0].slug);
|
|
57
|
-
const config = await generateConfig(
|
|
106
|
+
const config = await generateConfig(
|
|
107
|
+
// TODO: This can be removed when `generateConfig` no longer checks both body/query on the req
|
|
108
|
+
req, app, provisioningKeyOptions, deviceTypeJson, osVersion);
|
|
58
109
|
res.json(config);
|
|
59
110
|
}
|
|
60
111
|
catch (err) {
|
|
@@ -62,11 +113,12 @@ export const downloadImageConfig = async (req, res) => {
|
|
|
62
113
|
if (errorToReturn instanceof UnauthorizedError) {
|
|
63
114
|
errorToReturn = new NotFoundError(errorToReturn);
|
|
64
115
|
}
|
|
116
|
+
// We need to cast here because the `req.query` typing has `unknown` as keys which is incompatible
|
|
65
117
|
if (handleHttpErrors(req, res, errorToReturn)) {
|
|
66
118
|
return;
|
|
67
119
|
}
|
|
68
120
|
captureException(errorToReturn, 'Error generating config');
|
|
69
121
|
res.status(500).send(translateError(errorToReturn));
|
|
70
122
|
}
|
|
71
|
-
};
|
|
123
|
+
});
|
|
72
124
|
//# sourceMappingURL=download.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/features/device-config/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAoB,MAAM,gBAAgB,CAAC;AAErE,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACd,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/features/device-config/download.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/device-config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAgB,EAAE,EAAE;IACzC,GAAG,CAAC,GAAG,CACN,kBAAkB,EAClB,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/device-config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAgB,EAAE,EAAE;IACzC,GAAG,CAAC,GAAG,CACN,kBAAkB,EAClB,UAAU,CAAC,sBAAwC,EACnD,mBAAmB,CACnB,CAAC;IACF,GAAG,CAAC,IAAI,CACP,kBAAkB,EAClB,UAAU,CAAC,sBAAwC,EACnD,mBAAmB,CACnB,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/open-balena-api",
|
|
3
3
|
"description": "Internet of things, Made Simple",
|
|
4
|
-
"version": "46.0.
|
|
4
|
+
"version": "46.0.23",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -185,6 +185,6 @@
|
|
|
185
185
|
"import": "@swc-node/register/esm-register"
|
|
186
186
|
},
|
|
187
187
|
"versionist": {
|
|
188
|
-
"publishedAt": "2026-05-19T19:
|
|
188
|
+
"publishedAt": "2026-05-19T19:26:38.742Z"
|
|
189
189
|
}
|
|
190
190
|
}
|