balena-cli 23.0.0-build-v23-4de7d90a69128020c5e15684e9d29d4ea720b0de-1 → 23.0.0-build-v23-4c42177a46d425f43523cd95b008c627c2e4c31a-1
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/CHANGELOG.md +34 -2
- package/build/commands/config/generate.d.ts +1 -0
- package/build/commands/config/generate.js +16 -7
- package/build/commands/config/generate.js.map +1 -1
- package/build/commands/device/init.d.ts +39 -3
- package/build/commands/device/init.js +70 -28
- package/build/commands/device/init.js.map +1 -1
- package/build/commands/os/configure.js +60 -46
- package/build/commands/os/configure.js.map +1 -1
- package/build/commands/release/index.js +20 -4
- package/build/commands/release/index.js.map +1 -1
- package/build/commands/release/list.js +22 -4
- package/build/commands/release/list.js.map +1 -1
- package/build/utils/common-flags.d.ts +16 -14
- package/build/utils/common-flags.js +27 -1
- package/build/utils/common-flags.js.map +1 -1
- package/build/utils/config.d.ts +7 -1
- package/build/utils/config.js +37 -22
- package/build/utils/config.js.map +1 -1
- package/build/utils/validation.d.ts +1 -0
- package/build/utils/validation.js +16 -0
- package/build/utils/validation.js.map +1 -1
- package/npm-shrinkwrap.json +143 -124
- package/oclif.manifest.json +223 -195
- package/package.json +4 -4
- package/src/commands/config/generate.ts +25 -8
- package/src/commands/device/init.ts +99 -34
- package/src/commands/os/configure.ts +82 -62
- package/src/commands/release/index.ts +26 -8
- package/src/commands/release/list.ts +32 -5
- package/src/utils/common-flags.ts +42 -0
- package/src/utils/config.ts +62 -35
- package/src/utils/validation.ts +15 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,11 +4,43 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
-
## 23.0.0 - 2025-09-
|
|
7
|
+
## 23.0.0 - 2025-09-03
|
|
8
8
|
|
|
9
|
-
*
|
|
9
|
+
* device init: Make --config incompatible with all other flags other than --drive --version & --yes [Thodoris Greasidis]
|
|
10
|
+
* device init: Validate that the provided config file paths exist [Thodoris Greasidis]
|
|
11
|
+
* os configure: Make --config incompatible with all other flags other than --system-connection [Thodoris Greasidis]
|
|
10
12
|
* os configure, os initialize: Fail when a device-type.json can't be detected in the provided image [Thodoris Greasidis]
|
|
11
13
|
* os configure: Drop the --version flag & fail when the image version can't be detected [Thodoris Greasidis]
|
|
14
|
+
* Drop the 'balena os build-config' command in favor of `balena config generate' [Thodoris Greasidis]
|
|
15
|
+
* release: Include the build_log in the --json results [Thodoris Greasidis]
|
|
16
|
+
* release: Replace the semver field with raw_vesrion [Thodoris Greasidis]
|
|
17
|
+
* release list: Replace the semver field with raw_vesrion [Thodoris Greasidis]
|
|
18
|
+
* Drop support for node <22.18.0 [Thodoris Greasidis]
|
|
19
|
+
|
|
20
|
+
## 22.4.1 - 2025-09-02
|
|
21
|
+
|
|
22
|
+
* tests/ssh: Avoid an `as any` cast [Thodoris Greasidis]
|
|
23
|
+
|
|
24
|
+
## 22.4.0 - 2025-09-02
|
|
25
|
+
|
|
26
|
+
* config generate: Add support for the --initial-device-name flag [Thodoris Greasidis]
|
|
27
|
+
|
|
28
|
+
## 22.3.4 - 2025-09-02
|
|
29
|
+
|
|
30
|
+
* config generate: Deprecate the '--generate-device-api-key' flag [Thodoris Greasidis]
|
|
31
|
+
|
|
32
|
+
## 22.3.3 - 2025-09-02
|
|
33
|
+
|
|
34
|
+
* Deprecate 'balena os build-config' in favor of 'balena config generate' [Thodoris Greasidis]
|
|
35
|
+
|
|
36
|
+
## 22.3.2 - 2025-09-02
|
|
37
|
+
|
|
38
|
+
* os configure: Validate that the provided image & config file paths exist [Thodoris Greasidis]
|
|
39
|
+
|
|
40
|
+
## 22.3.1 - 2025-09-02
|
|
41
|
+
|
|
42
|
+
* os configure: Update the examples to use fleet slugs [Thodoris Greasidis]
|
|
43
|
+
* os configure: Deprecate the --version flag [Thodoris Greasidis]
|
|
12
44
|
|
|
13
45
|
## 22.3.0 - 2025-08-29
|
|
14
46
|
|
|
@@ -88,6 +88,7 @@ export default class ConfigGenerateCmd extends Command {
|
|
|
88
88
|
wifiSsid: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
89
89
|
wifiKey: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
90
90
|
appUpdatePollInterval: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
91
|
+
'initial-device-name': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
91
92
|
'provisioning-key-name': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
92
93
|
'provisioning-key-expiry-date': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
93
94
|
};
|
|
@@ -70,20 +70,27 @@ class ConfigGenerateCmd extends core_1.Command {
|
|
|
70
70
|
answers.provisioningKeyName = options['provisioning-key-name'];
|
|
71
71
|
answers.provisioningKeyExpiryDate = options['provisioning-key-expiry-date'];
|
|
72
72
|
const { generateDeviceConfig, generateApplicationConfig } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
73
|
-
let
|
|
73
|
+
let configJson;
|
|
74
74
|
if (device) {
|
|
75
|
-
|
|
75
|
+
configJson = await generateDeviceConfig(device, options.deviceApiKey, answers);
|
|
76
76
|
}
|
|
77
77
|
else if (application) {
|
|
78
78
|
answers.deviceType = deviceType;
|
|
79
|
-
|
|
79
|
+
configJson = await generateApplicationConfig(application, answers);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
throw new Error('Error: Either application or device must be set, but neither are set.');
|
|
83
|
+
}
|
|
84
|
+
if (options['initial-device-name'] != null &&
|
|
85
|
+
options['initial-device-name'] !== '') {
|
|
86
|
+
configJson.initialDeviceName = options['initial-device-name'];
|
|
80
87
|
}
|
|
81
88
|
if (options.output != null) {
|
|
82
89
|
const fs = await Promise.resolve().then(() => require('fs'));
|
|
83
|
-
await fs.promises.writeFile(options.output, JSON.stringify(
|
|
90
|
+
await fs.promises.writeFile(options.output, JSON.stringify(configJson));
|
|
84
91
|
}
|
|
85
92
|
const prettyjson = await Promise.resolve().then(() => require('prettyjson'));
|
|
86
|
-
console.log(prettyjson.render(
|
|
93
|
+
console.log(prettyjson.render(configJson));
|
|
87
94
|
}
|
|
88
95
|
async validateOptions(options) {
|
|
89
96
|
const { ExpectedError } = await Promise.resolve().then(() => require('../../errors'));
|
|
@@ -120,7 +127,6 @@ ConfigGenerateCmd.description = (0, lazy_1.stripIndent) `
|
|
|
120
127
|
`;
|
|
121
128
|
ConfigGenerateCmd.examples = [
|
|
122
129
|
'$ balena config generate --device 7cf02a6 --version 2.12.7',
|
|
123
|
-
'$ balena config generate --device 7cf02a6 --version 2.12.7 --generate-device-api-key',
|
|
124
130
|
'$ balena config generate --device 7cf02a6 --version 2.12.7 --deviceApiKey <existingDeviceKey>',
|
|
125
131
|
'$ balena config generate --device 7cf02a6 --version 2.12.7 --output config.json',
|
|
126
132
|
'$ balena config generate --fleet myorg/fleet --version 2.12.7 --dev',
|
|
@@ -153,7 +159,7 @@ ConfigGenerateCmd.flags = {
|
|
|
153
159
|
description: "device type slug (run 'balena device-type list' for possible values)",
|
|
154
160
|
}),
|
|
155
161
|
'generate-device-api-key': core_1.Flags.boolean({
|
|
156
|
-
description: 'generate a fresh device key for the device',
|
|
162
|
+
description: 'generate a fresh device key for the device. No-op and deprecated since a key is always auto-generated unless --deviceApiKey is provided.',
|
|
157
163
|
}),
|
|
158
164
|
output: core_1.Flags.string({
|
|
159
165
|
description: 'path of output file',
|
|
@@ -172,6 +178,9 @@ ConfigGenerateCmd.flags = {
|
|
|
172
178
|
appUpdatePollInterval: core_1.Flags.string({
|
|
173
179
|
description: 'supervisor cloud polling interval in minutes (e.g. for device variables)',
|
|
174
180
|
}),
|
|
181
|
+
'initial-device-name': core_1.Flags.string({
|
|
182
|
+
description: 'This option will set the device name when the device provisions',
|
|
183
|
+
}),
|
|
175
184
|
'provisioning-key-name': core_1.Flags.string({
|
|
176
185
|
description: 'custom key name assigned to generated provisioning api key',
|
|
177
186
|
exclusive: ['device'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/commands/config/generate.ts"],"names":[],"mappings":";;AAiBA,sCAA6C;AAE7C,+CAA+C;AAC/C,2CAAyE;AACzE,mDAI8B;AAG9B,MAAM,qBAAqB,GAAG;IAC7B,OAAO,EAAE,MAAM;IACf,OAAO,EAAE;QACR,mBAAmB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;KACxC;CACQ,CAAC;AAEX,MAAqB,iBAAkB,SAAQ,cAAO;IAAtD;;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/commands/config/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from '@oclif/core';
|
|
2
|
+
import type { ImgConfig } from '../../utils/config';
|
|
2
3
|
interface FlagsDef {
|
|
3
4
|
fleet?: string;
|
|
4
5
|
yes: boolean;
|
|
@@ -13,18 +14,53 @@ export default class DeviceInitCmd extends Command {
|
|
|
13
14
|
static description: string;
|
|
14
15
|
static examples: string[];
|
|
15
16
|
static flags: {
|
|
16
|
-
fleet:
|
|
17
|
+
fleet: {
|
|
18
|
+
exclusive: string[];
|
|
19
|
+
name: string;
|
|
20
|
+
char?: import("@oclif/core/lib/interfaces").AlphabetLowercase | import("@oclif/core/lib/interfaces").AlphabetUppercase;
|
|
21
|
+
summary?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
helpLabel?: string;
|
|
24
|
+
helpGroup?: string;
|
|
25
|
+
env?: string;
|
|
26
|
+
hidden?: boolean;
|
|
27
|
+
required?: boolean;
|
|
28
|
+
dependsOn?: string[];
|
|
29
|
+
exactlyOne?: string[];
|
|
30
|
+
relationships?: import("@oclif/core/lib/interfaces/parser").Relationship[];
|
|
31
|
+
deprecated?: true | import("@oclif/core/lib/interfaces").Deprecation;
|
|
32
|
+
aliases?: string[];
|
|
33
|
+
charAliases?: (import("@oclif/core/lib/interfaces").AlphabetLowercase | import("@oclif/core/lib/interfaces").AlphabetUppercase)[];
|
|
34
|
+
deprecateAliases?: boolean;
|
|
35
|
+
noCacheDefault?: boolean;
|
|
36
|
+
atLeastOne?: string[];
|
|
37
|
+
type: "option";
|
|
38
|
+
helpValue?: string | string[];
|
|
39
|
+
options?: readonly string[];
|
|
40
|
+
multiple?: boolean;
|
|
41
|
+
multipleNonGreedy?: boolean;
|
|
42
|
+
delimiter?: ",";
|
|
43
|
+
allowStdin?: boolean | "only";
|
|
44
|
+
parse: import("@oclif/core/lib/interfaces/parser").FlagParser<string | undefined, string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
45
|
+
defaultHelp?: import("@oclif/core/lib/interfaces/parser").FlagDefaultHelp<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
46
|
+
input: string[];
|
|
47
|
+
default?: import("@oclif/core/lib/interfaces/parser").FlagDefault<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
48
|
+
};
|
|
49
|
+
config: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
17
50
|
yes: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
18
51
|
advanced: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
19
52
|
'os-version': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
20
53
|
drive: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
21
|
-
config: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
22
54
|
'provisioning-key-name': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
23
55
|
'provisioning-key-expiry-date': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
24
56
|
};
|
|
25
57
|
static authenticated: boolean;
|
|
26
58
|
run(): Promise<string>;
|
|
27
|
-
configureOsImage(
|
|
59
|
+
configureOsImage(osImagePath: string, device: {
|
|
60
|
+
id: number;
|
|
61
|
+
uuid: string;
|
|
62
|
+
api_key: string;
|
|
63
|
+
}, options: FlagsDef, configJson: ImgConfig | undefined, logger: import('../../utils/logger')): Promise<void>;
|
|
28
64
|
writeOsImage(path: string, deviceType: string, options: FlagsDef): Promise<void>;
|
|
29
65
|
}
|
|
30
66
|
export {};
|
|
@@ -5,9 +5,21 @@ const cf = require("../../utils/common-flags");
|
|
|
5
5
|
const lazy_1 = require("../../utils/lazy");
|
|
6
6
|
const messages_1 = require("../../utils/messages");
|
|
7
7
|
const helpers_1 = require("../../utils/helpers");
|
|
8
|
+
async function validateArgsAndOptions(options) {
|
|
9
|
+
if (!options.fleet && !options.config) {
|
|
10
|
+
const { ExpectedError } = await Promise.resolve().then(() => require('../../errors'));
|
|
11
|
+
throw new ExpectedError("Either the '--fleet' or the '--config' option must be provided");
|
|
12
|
+
}
|
|
13
|
+
const { validateFilePath } = await Promise.resolve().then(() => require('../../utils/validation'));
|
|
14
|
+
if (options.config != null) {
|
|
15
|
+
await validateFilePath(options.config);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
8
18
|
class DeviceInitCmd extends core_1.Command {
|
|
9
19
|
async run() {
|
|
20
|
+
var _a;
|
|
10
21
|
const { flags: options } = await this.parse(DeviceInitCmd);
|
|
22
|
+
await validateArgsAndOptions(options);
|
|
11
23
|
const { promisify } = await Promise.resolve().then(() => require('util'));
|
|
12
24
|
const rimraf = promisify(await Promise.resolve().then(() => require('rimraf')));
|
|
13
25
|
const tmp = await Promise.resolve().then(() => require('tmp'));
|
|
@@ -18,8 +30,15 @@ class DeviceInitCmd extends core_1.Command {
|
|
|
18
30
|
const Logger = await Promise.resolve().then(() => require('../../utils/logger'));
|
|
19
31
|
const logger = Logger.getLogger();
|
|
20
32
|
const balena = (0, lazy_1.getBalenaSdk)();
|
|
21
|
-
|
|
22
|
-
|
|
33
|
+
let fleetSlugOrId = options.fleet;
|
|
34
|
+
let configJson;
|
|
35
|
+
if (options.config != null) {
|
|
36
|
+
const { readAndValidateConfigJson } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
37
|
+
configJson = await readAndValidateConfigJson(options.config);
|
|
38
|
+
fleetSlugOrId = configJson.applicationId;
|
|
39
|
+
}
|
|
40
|
+
const application = fleetSlugOrId
|
|
41
|
+
? await getApplication(balena, fleetSlugOrId, {
|
|
23
42
|
$select: ['id', 'slug'],
|
|
24
43
|
$expand: {
|
|
25
44
|
is_for__device_type: {
|
|
@@ -30,16 +49,15 @@ class DeviceInitCmd extends core_1.Command {
|
|
|
30
49
|
: await (await Promise.resolve().then(() => require('../../utils/patterns'))).selectApplication();
|
|
31
50
|
const deviceUuid = balena.models.device.generateUniqueKey();
|
|
32
51
|
console.info(`Registering to ${application.slug}: ${deviceUuid}`);
|
|
33
|
-
await balena.models.device.register(application.id, deviceUuid);
|
|
34
|
-
const device = await balena.models.device.get(deviceUuid);
|
|
52
|
+
const device = await balena.models.device.register(application.id, deviceUuid);
|
|
35
53
|
const tmpPath = (await tmpNameAsync());
|
|
36
54
|
try {
|
|
37
55
|
logger.logDebug(`Downloading OS image...`);
|
|
38
56
|
const osVersion = options['os-version'] || 'default';
|
|
39
|
-
const deviceType = application.is_for__device_type[0].slug;
|
|
57
|
+
const deviceType = (_a = configJson === null || configJson === void 0 ? void 0 : configJson.deviceType) !== null && _a !== void 0 ? _a : application.is_for__device_type[0].slug;
|
|
40
58
|
await downloadOSImage(deviceType, tmpPath, osVersion);
|
|
41
59
|
logger.logDebug(`Configuring OS image...`);
|
|
42
|
-
await this.configureOsImage(tmpPath, device
|
|
60
|
+
await this.configureOsImage(tmpPath, device, options, configJson, logger);
|
|
43
61
|
logger.logDebug(`Writing OS image...`);
|
|
44
62
|
await this.writeOsImage(tmpPath, deviceType, options);
|
|
45
63
|
}
|
|
@@ -48,7 +66,7 @@ class DeviceInitCmd extends core_1.Command {
|
|
|
48
66
|
logger.logDebug(`Process failed, removing device ${device.uuid}`);
|
|
49
67
|
await balena.models.device.remove(device.uuid);
|
|
50
68
|
}
|
|
51
|
-
catch (
|
|
69
|
+
catch (_b) {
|
|
52
70
|
}
|
|
53
71
|
throw e;
|
|
54
72
|
}
|
|
@@ -59,21 +77,43 @@ class DeviceInitCmd extends core_1.Command {
|
|
|
59
77
|
console.log('Done');
|
|
60
78
|
return device.uuid;
|
|
61
79
|
}
|
|
62
|
-
async configureOsImage(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
async configureOsImage(osImagePath, device, options, configJson, logger) {
|
|
81
|
+
let tmpConfigJsonPath;
|
|
82
|
+
const { promisify } = await Promise.resolve().then(() => require('util'));
|
|
83
|
+
const rimraf = promisify(await Promise.resolve().then(() => require('rimraf')));
|
|
84
|
+
try {
|
|
85
|
+
const configureCommand = ['os', 'configure', osImagePath];
|
|
86
|
+
if (configJson != null) {
|
|
87
|
+
const { populateDeviceConfig } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
88
|
+
populateDeviceConfig(configJson, device, device.api_key);
|
|
89
|
+
const tmp = await Promise.resolve().then(() => require('tmp'));
|
|
90
|
+
const tmpNameAsync = promisify(tmp.tmpName);
|
|
91
|
+
tmp.setGracefulCleanup();
|
|
92
|
+
tmpConfigJsonPath = (await tmpNameAsync());
|
|
93
|
+
const fs = await Promise.resolve().then(() => require('fs/promises'));
|
|
94
|
+
await fs.writeFile(tmpConfigJsonPath, JSON.stringify(configJson));
|
|
95
|
+
configureCommand.push('--config', tmpConfigJsonPath);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
configureCommand.push('--device', device.uuid);
|
|
99
|
+
if (options.advanced) {
|
|
100
|
+
configureCommand.push('--advanced');
|
|
101
|
+
}
|
|
102
|
+
if (options['provisioning-key-name']) {
|
|
103
|
+
configureCommand.push('--provisioning-key-name', options['provisioning-key-name']);
|
|
104
|
+
}
|
|
105
|
+
if (options['provisioning-key-expiry-date']) {
|
|
106
|
+
configureCommand.push('--provisioning-key-expiry-date', options['provisioning-key-expiry-date']);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
await (0, helpers_1.runCommand)(configureCommand);
|
|
72
110
|
}
|
|
73
|
-
|
|
74
|
-
|
|
111
|
+
finally {
|
|
112
|
+
if (tmpConfigJsonPath != null) {
|
|
113
|
+
logger.logDebug(`Removing temporary config.json...`);
|
|
114
|
+
await rimraf(tmpConfigJsonPath);
|
|
115
|
+
}
|
|
75
116
|
}
|
|
76
|
-
await (0, helpers_1.runCommand)(configureCommand);
|
|
77
117
|
}
|
|
78
118
|
async writeOsImage(path, deviceType, options) {
|
|
79
119
|
const osInitCommand = ['os', 'initialize', path, '--type', deviceType];
|
|
@@ -120,11 +160,16 @@ DeviceInitCmd.description = (0, lazy_1.stripIndent) `
|
|
|
120
160
|
DeviceInitCmd.examples = [
|
|
121
161
|
'$ balena device init',
|
|
122
162
|
'$ balena device init -f myorg/myfleet',
|
|
123
|
-
'$ balena device init --fleet myFleet --os-version 2.101.7 --drive /dev/disk5
|
|
124
|
-
'$ balena device init --fleet myFleet --os-version 2.83.21+rev1.prod --drive /dev/disk5
|
|
163
|
+
'$ balena device init --fleet myFleet --os-version 2.101.7 --drive /dev/disk5',
|
|
164
|
+
'$ balena device init --fleet myFleet --os-version 2.83.21+rev1.prod --drive /dev/disk5',
|
|
165
|
+
'$ balena device init --config config.json --os-version 2.101.7 --drive /dev/disk5 --yes',
|
|
125
166
|
];
|
|
126
|
-
DeviceInitCmd.flags = {
|
|
127
|
-
fleet: cf.fleet,
|
|
167
|
+
DeviceInitCmd.flags = cf.setupCustomFlagOptions({
|
|
168
|
+
fleet: { ...cf.fleet, exclusive: ['config'] },
|
|
169
|
+
config: core_1.Flags.string({
|
|
170
|
+
description: 'path to the config JSON file, see `balena config generate`',
|
|
171
|
+
$compatibleOnlyWith: ['os-version', 'drive', 'yes'],
|
|
172
|
+
}),
|
|
128
173
|
yes: cf.yes,
|
|
129
174
|
advanced: core_1.Flags.boolean({
|
|
130
175
|
char: 'v',
|
|
@@ -140,16 +185,13 @@ DeviceInitCmd.flags = {
|
|
|
140
185
|
`,
|
|
141
186
|
}),
|
|
142
187
|
drive: cf.drive,
|
|
143
|
-
config: core_1.Flags.string({
|
|
144
|
-
description: 'path to the config JSON file, see `balena config generate`',
|
|
145
|
-
}),
|
|
146
188
|
'provisioning-key-name': core_1.Flags.string({
|
|
147
189
|
description: 'custom key name assigned to generated provisioning api key',
|
|
148
190
|
}),
|
|
149
191
|
'provisioning-key-expiry-date': core_1.Flags.string({
|
|
150
192
|
description: 'expiry date assigned to generated provisioning api key (format: YYYY-MM-DD)',
|
|
151
193
|
}),
|
|
152
|
-
};
|
|
194
|
+
});
|
|
153
195
|
DeviceInitCmd.authenticated = true;
|
|
154
196
|
exports.default = DeviceInitCmd;
|
|
155
197
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/device/init.ts"],"names":[],"mappings":";;AAiBA,sCAA6C;AAC7C,+CAA+C;AAC/C,2CAA6D;AAC7D,mDAAyD;AACzD,iDAAiD;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/device/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,17 +9,28 @@ const messages_1 = require("../../utils/messages");
|
|
|
9
9
|
const CONNECTIONS_FOLDER = '/system-connections';
|
|
10
10
|
class OsConfigureCmd extends core_1.Command {
|
|
11
11
|
async run() {
|
|
12
|
+
var _a;
|
|
12
13
|
const { args: params, flags: options } = await this.parse(OsConfigureCmd);
|
|
13
|
-
await
|
|
14
|
+
await validateArgsAndOptions(params, options);
|
|
14
15
|
const devInit = await Promise.resolve().then(() => require('balena-device-init'));
|
|
15
|
-
const {
|
|
16
|
-
const { generateDeviceConfig, generateApplicationConfig } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
16
|
+
const { generateDeviceConfig, generateApplicationConfig, readAndValidateConfigJson, } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
17
17
|
const helpers = await Promise.resolve().then(() => require('../../utils/helpers'));
|
|
18
18
|
const { getApplication } = await Promise.resolve().then(() => require('../../utils/sdk'));
|
|
19
19
|
let app;
|
|
20
20
|
let device;
|
|
21
|
-
let deviceTypeSlug;
|
|
21
|
+
let deviceTypeSlug = options['device-type'];
|
|
22
|
+
let fleetSlugOrId = options.fleet;
|
|
23
|
+
let secureBoot = options.secureBoot;
|
|
24
|
+
let developmentMode = options.dev;
|
|
22
25
|
const balena = (0, lazy_1.getBalenaSdk)();
|
|
26
|
+
let configJson;
|
|
27
|
+
if (options.config != null) {
|
|
28
|
+
configJson = await readAndValidateConfigJson(options.config);
|
|
29
|
+
fleetSlugOrId = configJson.applicationId;
|
|
30
|
+
deviceTypeSlug = configJson.deviceType;
|
|
31
|
+
secureBoot = ((_a = configJson.installer) === null || _a === void 0 ? void 0 : _a.secureboot) === true;
|
|
32
|
+
developmentMode = configJson.developmentMode === true;
|
|
33
|
+
}
|
|
23
34
|
if (options.device) {
|
|
24
35
|
device = (await balena.models.device.get(options.device, {
|
|
25
36
|
$expand: {
|
|
@@ -28,54 +39,52 @@ class OsConfigureCmd extends core_1.Command {
|
|
|
28
39
|
}));
|
|
29
40
|
deviceTypeSlug = device.is_of__device_type[0].slug;
|
|
30
41
|
}
|
|
31
|
-
else {
|
|
32
|
-
app =
|
|
42
|
+
else if (fleetSlugOrId != null) {
|
|
43
|
+
app = await getApplication(balena, fleetSlugOrId, {
|
|
44
|
+
$select: 'slug',
|
|
33
45
|
$expand: {
|
|
34
46
|
is_for__device_type: { $select: 'slug' },
|
|
35
47
|
},
|
|
36
|
-
})
|
|
37
|
-
await checkDeviceTypeCompatibility(
|
|
38
|
-
deviceTypeSlug =
|
|
39
|
-
options['device-type'] || app.is_for__device_type[0].slug;
|
|
48
|
+
});
|
|
49
|
+
await checkDeviceTypeCompatibility(deviceTypeSlug, app);
|
|
50
|
+
deviceTypeSlug !== null && deviceTypeSlug !== void 0 ? deviceTypeSlug : (deviceTypeSlug = app.is_for__device_type[0].slug);
|
|
40
51
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (options.config) {
|
|
44
|
-
const rawConfig = await fs.readFile(options.config, 'utf8');
|
|
45
|
-
configJson = JSON.parse(rawConfig);
|
|
52
|
+
else {
|
|
53
|
+
throw new Error('Unreachable: neither a device nor a fleet were specified or resolved by the config json');
|
|
46
54
|
}
|
|
55
|
+
const deviceTypeManifest = await helpers.getManifest(params.image, deviceTypeSlug);
|
|
47
56
|
const { normalizeOsVersion } = await Promise.resolve().then(() => require('../../utils/normalization'));
|
|
48
57
|
const osVersion = normalizeOsVersion(await getOsVersionFromImage(params.image, deviceTypeManifest, devInit));
|
|
49
58
|
const { validateDevOptionAndWarn } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
50
|
-
await validateDevOptionAndWarn(
|
|
59
|
+
await validateDevOptionAndWarn(developmentMode, osVersion);
|
|
51
60
|
const { validateSecureBootOptionAndWarn } = await Promise.resolve().then(() => require('../../utils/config'));
|
|
52
|
-
await validateSecureBootOptionAndWarn(
|
|
61
|
+
await validateSecureBootOptionAndWarn(secureBoot, deviceTypeSlug, osVersion);
|
|
53
62
|
const answers = await askQuestionsForDeviceType(deviceTypeManifest, options, configJson);
|
|
54
|
-
if (options.fleet) {
|
|
55
|
-
answers.deviceType = deviceTypeSlug;
|
|
56
|
-
}
|
|
57
63
|
answers.version = osVersion;
|
|
58
|
-
answers.developmentMode =
|
|
59
|
-
answers.secureBoot =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
answers.developmentMode = developmentMode;
|
|
65
|
+
answers.secureBoot = secureBoot;
|
|
66
|
+
if (configJson == null) {
|
|
67
|
+
answers.provisioningKeyName = options['provisioning-key-name'];
|
|
68
|
+
answers.provisioningKeyExpiryDate =
|
|
69
|
+
options['provisioning-key-expiry-date'];
|
|
70
|
+
if (device != null) {
|
|
64
71
|
configJson = await generateDeviceConfig(device, undefined, answers);
|
|
65
72
|
}
|
|
66
73
|
else {
|
|
74
|
+
answers.deviceType = deviceTypeSlug;
|
|
67
75
|
configJson = await generateApplicationConfig(app, answers);
|
|
68
76
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
if (options['initial-device-name'] != null &&
|
|
78
|
+
options['initial-device-name'] !== '') {
|
|
79
|
+
configJson.initialDeviceName = options['initial-device-name'];
|
|
80
|
+
}
|
|
73
81
|
}
|
|
74
82
|
console.info('Configuring operating system image');
|
|
75
83
|
const image = params.image;
|
|
76
|
-
await helpers.osProgressHandler(await devInit.configure(image, deviceTypeManifest, configJson
|
|
84
|
+
await helpers.osProgressHandler(await devInit.configure(image, deviceTypeManifest, configJson, answers));
|
|
77
85
|
if (options['system-connection']) {
|
|
78
86
|
const path = await Promise.resolve().then(() => require('path'));
|
|
87
|
+
const fs = await Promise.resolve().then(() => require('fs/promises'));
|
|
79
88
|
const files = await Promise.all(options['system-connection'].map(async (filePath) => {
|
|
80
89
|
const content = await fs.readFile(filePath, 'utf8');
|
|
81
90
|
const name = path.basename(filePath);
|
|
@@ -127,9 +136,8 @@ OsConfigureCmd.description = (0, lazy_1.stripIndent) `
|
|
|
127
136
|
OsConfigureCmd.examples = [
|
|
128
137
|
'$ balena os configure ../path/rpi3.img --device 7cf02a6',
|
|
129
138
|
'$ balena os configure ../path/rpi3.img --fleet myorg/myfleet',
|
|
130
|
-
'$ balena os configure ../path/rpi3.img
|
|
131
|
-
'$ balena os configure ../path/rpi3.img
|
|
132
|
-
'$ balena os configure ../path/rpi3.img -f MyFinFleet --device-type raspberrypi3 --config myWifiConfig.json',
|
|
139
|
+
'$ balena os configure ../path/rpi3.img -f myorg/myfleet --device-type raspberrypi3',
|
|
140
|
+
'$ balena os configure ../path/rpi3.img --config myWifiConfig.json',
|
|
133
141
|
];
|
|
134
142
|
OsConfigureCmd.args = {
|
|
135
143
|
image: core_1.Args.string({
|
|
@@ -137,15 +145,15 @@ OsConfigureCmd.args = {
|
|
|
137
145
|
description: 'path to a balenaOS image file, e.g. "rpi3.img"',
|
|
138
146
|
}),
|
|
139
147
|
};
|
|
140
|
-
OsConfigureCmd.flags = {
|
|
148
|
+
OsConfigureCmd.flags = cf.setupCustomFlagOptions({
|
|
141
149
|
advanced: core_1.Flags.boolean({
|
|
142
150
|
char: 'v',
|
|
143
151
|
description: 'ask advanced configuration questions (when in interactive mode)',
|
|
144
152
|
}),
|
|
145
|
-
fleet: { ...cf.fleet, exclusive: ['device'] },
|
|
153
|
+
fleet: { ...cf.fleet, exclusive: ['device', 'config'] },
|
|
146
154
|
config: core_1.Flags.string({
|
|
147
155
|
description: 'path to a pre-generated config.json file to be injected in the OS image',
|
|
148
|
-
|
|
156
|
+
$compatibleOnlyWith: ['system-connection'],
|
|
149
157
|
}),
|
|
150
158
|
'config-app-update-poll-interval': core_1.Flags.integer({
|
|
151
159
|
description: 'supervisor cloud polling interval in minutes (e.g. for variable updates)',
|
|
@@ -166,6 +174,7 @@ OsConfigureCmd.flags = {
|
|
|
166
174
|
...cf.device,
|
|
167
175
|
exclusive: [
|
|
168
176
|
'fleet',
|
|
177
|
+
'config',
|
|
169
178
|
'provisioning-key-name',
|
|
170
179
|
'provisioning-key-expiry-date',
|
|
171
180
|
],
|
|
@@ -190,16 +199,21 @@ OsConfigureCmd.flags = {
|
|
|
190
199
|
description: 'expiry date assigned to generated provisioning api key (format: YYYY-MM-DD)',
|
|
191
200
|
exclusive: ['config', 'device'],
|
|
192
201
|
}),
|
|
193
|
-
};
|
|
202
|
+
});
|
|
194
203
|
OsConfigureCmd.authenticated = true;
|
|
195
204
|
exports.default = OsConfigureCmd;
|
|
196
|
-
async function
|
|
197
|
-
if (!options.device && !options.fleet) {
|
|
198
|
-
throw new errors_1.ExpectedError("
|
|
205
|
+
async function validateArgsAndOptions(args, options) {
|
|
206
|
+
if (!options.device && !options.fleet && !options.config) {
|
|
207
|
+
throw new errors_1.ExpectedError("One of the '--device', '--fleet' or '--config' options must be provided");
|
|
199
208
|
}
|
|
200
209
|
if (!options.fleet && options['device-type']) {
|
|
201
210
|
throw new errors_1.ExpectedError("The '--device-type' option can only be used in conjunction with the '--fleet' option");
|
|
202
211
|
}
|
|
212
|
+
const { validateFilePath } = await Promise.resolve().then(() => require('../../utils/validation'));
|
|
213
|
+
await validateFilePath(args.image);
|
|
214
|
+
if (options.config != null) {
|
|
215
|
+
await validateFilePath(options.config);
|
|
216
|
+
}
|
|
203
217
|
const { checkLoggedIn } = await Promise.resolve().then(() => require('../../utils/patterns'));
|
|
204
218
|
await checkLoggedIn();
|
|
205
219
|
}
|
|
@@ -210,11 +224,11 @@ async function getOsVersionFromImage(imagePath, deviceTypeManifest, devInit) {
|
|
|
210
224
|
}
|
|
211
225
|
return osVersion;
|
|
212
226
|
}
|
|
213
|
-
async function checkDeviceTypeCompatibility(
|
|
214
|
-
if (
|
|
227
|
+
async function checkDeviceTypeCompatibility(deviceType, app) {
|
|
228
|
+
if (deviceType) {
|
|
215
229
|
const helpers = await Promise.resolve().then(() => require('../../utils/helpers'));
|
|
216
|
-
if (!(await helpers.areDeviceTypesCompatible(app.is_for__device_type[0].slug,
|
|
217
|
-
throw new errors_1.ExpectedError(`Device type ${
|
|
230
|
+
if (!(await helpers.areDeviceTypesCompatible(app.is_for__device_type[0].slug, deviceType))) {
|
|
231
|
+
throw new errors_1.ExpectedError(`Device type ${deviceType} is incompatible with fleet ${app.is_for__device_type[0].slug}`);
|
|
218
232
|
}
|
|
219
233
|
}
|
|
220
234
|
}
|
|
@@ -229,7 +243,7 @@ async function askQuestionsForDeviceType(deviceType, options, configJson) {
|
|
|
229
243
|
const defaultAnswers = {};
|
|
230
244
|
const questions = deviceType.options;
|
|
231
245
|
let extraOpts;
|
|
232
|
-
if (
|
|
246
|
+
if (configJson != null) {
|
|
233
247
|
answerSources.push(configJson);
|
|
234
248
|
}
|
|
235
249
|
if (!options.advanced) {
|