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 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-01
7
+ ## 23.0.0 - 2025-09-03
8
8
 
9
- * Drop the 'balena os build-config' command in favor of `balena config generate' [Thodoris Greasidis]
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 config;
73
+ let configJson;
74
74
  if (device) {
75
- config = await generateDeviceConfig(device, options.deviceApiKey || options['generate-device-api-key'] || undefined, answers);
75
+ configJson = await generateDeviceConfig(device, options.deviceApiKey, answers);
76
76
  }
77
77
  else if (application) {
78
78
  answers.deviceType = deviceType;
79
- config = await generateApplicationConfig(application, answers);
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(config));
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(config));
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":"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"}
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: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
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(path: string, uuid: string, options: FlagsDef): Promise<void>;
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
- const application = options.fleet
22
- ? await getApplication(balena, options.fleet, {
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.uuid, options);
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 (_a) {
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(path, uuid, options) {
63
- const configureCommand = ['os', 'configure', path, '--device', uuid];
64
- if (options.config) {
65
- configureCommand.push('--config', options.config);
66
- }
67
- else if (options.advanced) {
68
- configureCommand.push('--advanced');
69
- }
70
- if (options['provisioning-key-name']) {
71
- configureCommand.push('--provisioning-key-name', options['provisioning-key-name']);
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
- if (options['provisioning-key-expiry-date']) {
74
- configureCommand.push('--provisioning-key-expiry-date', options['provisioning-key-expiry-date']);
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 --config config.json --yes',
124
- '$ balena device init --fleet myFleet --os-version 2.83.21+rev1.prod --drive /dev/disk5 --config config.json --yes',
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":"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"}
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 validateOptions(options);
14
+ await validateArgsAndOptions(params, options);
14
15
  const devInit = await Promise.resolve().then(() => require('balena-device-init'));
15
- const { promises: fs } = await Promise.resolve().then(() => require('fs'));
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 = (await getApplication(balena, options.fleet, {
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(options, app);
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
- const deviceTypeManifest = await helpers.getManifest(params.image, deviceTypeSlug);
42
- let configJson;
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(options.dev, osVersion);
59
+ await validateDevOptionAndWarn(developmentMode, osVersion);
51
60
  const { validateSecureBootOptionAndWarn } = await Promise.resolve().then(() => require('../../utils/config'));
52
- await validateSecureBootOptionAndWarn(options.secureBoot, deviceTypeSlug, osVersion);
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 = options.dev;
59
- answers.secureBoot = options.secureBoot;
60
- answers.provisioningKeyName = options['provisioning-key-name'];
61
- answers.provisioningKeyExpiryDate = options['provisioning-key-expiry-date'];
62
- if (_.isEmpty(configJson)) {
63
- if (device) {
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
- if (options['initial-device-name'] &&
71
- options['initial-device-name'] !== '') {
72
- configJson.initialDeviceName = options['initial-device-name'];
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 || {}, answers));
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 --fleet MyFleet --version 2.12.7',
131
- '$ balena os configure ../path/rpi3.img -f MyFinFleet --device-type raspberrypi3',
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
- exclusive: ['provisioning-key-name', 'provisioning-key-expiry-date'],
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 validateOptions(options) {
197
- if (!options.device && !options.fleet) {
198
- throw new errors_1.ExpectedError("Either the '--device' or the '--fleet' option must be provided");
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(options, app) {
214
- if (options['device-type']) {
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, options['device-type']))) {
217
- throw new errors_1.ExpectedError(`Device type ${options['device-type']} is incompatible with fleet ${options.fleet}`);
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 (!_.isEmpty(configJson)) {
246
+ if (configJson != null) {
233
247
  answerSources.push(configJson);
234
248
  }
235
249
  if (!options.advanced) {