UNPKG

balena-cli

Version:

The official balena Command Line Interface

123 lines (120 loc) 6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@oclif/core"); const cf = require("../../utils/common-flags"); const lazy_1 = require("../../utils/lazy"); const errors_1 = require("../../errors"); const pine_1 = require("../../utils/pine"); class DeviceOsUpdateCmd extends core_1.Command { async run() { var _a; const { args: params, flags: options } = await this.parse(DeviceOsUpdateCmd); const sdk = (0, lazy_1.getBalenaSdk)(); const { uuid, is_of__device_type, os_version, os_variant } = (await sdk.models.device.get(params.uuid, { $select: ['uuid', 'os_version', 'os_variant'], $expand: { is_of__device_type: { $select: 'slug', }, }, })); const currentOsVersion = sdk.models.device.getOsVersion({ os_version, os_variant, }); if (!currentOsVersion) { throw new errors_1.ExpectedError('The current os version of the device is not available'); } let includeDraft = options['include-draft']; if (!includeDraft && options.version != null) { const bSemver = await Promise.resolve().then(() => require('balena-semver')); const parsedVersion = bSemver.parse(options.version); includeDraft = parsedVersion != null && parsedVersion.prerelease.length > 0; } const hupVersionInfo = await sdk.models.os.getSupportedOsUpdateVersions(is_of__device_type[0].slug, currentOsVersion, { includeDraft, }); if (hupVersionInfo.versions.length === 0) { throw new errors_1.ExpectedError('There are no available Host OS update targets for this device'); } let targetOsVersion = options.version; if (targetOsVersion != null) { const { normalizeOsVersion } = await Promise.resolve().then(() => require('../../utils/normalization')); targetOsVersion = normalizeOsVersion(targetOsVersion); if (!hupVersionInfo.versions.includes(targetOsVersion)) { throw new errors_1.ExpectedError(`The provided version ${targetOsVersion} is not in the Host OS update targets for this device`); } } else { const choices = await Promise.all(hupVersionInfo.versions.map(async (version) => { var _a; const takeoverRequired = (await sdk.models.os.getOsUpdateType((_a = (0, pine_1.getExpandedProp)(is_of__device_type, 'slug')) !== null && _a !== void 0 ? _a : '', currentOsVersion, version)) === 'takeover'; return { name: `${version}${hupVersionInfo.recommended === version ? ' (recommended)' : ''}${takeoverRequired ? ' ADVANCED UPDATE: Requires disk re-partitioning with no rollback option' : ''}`, value: version, }; })); targetOsVersion = await (0, lazy_1.getCliForm)().ask({ message: 'Target OS version', type: 'list', choices, }); } const takeoverRequired = (await sdk.models.os.getOsUpdateType((_a = (0, pine_1.getExpandedProp)(is_of__device_type, 'slug')) !== null && _a !== void 0 ? _a : '', currentOsVersion, targetOsVersion)) === 'takeover'; const patterns = await Promise.resolve().then(() => require('../../utils/patterns')); if (takeoverRequired) { await patterns.confirm(options.yes || false, (0, lazy_1.stripIndent) `Before you proceed, note that this update process is different from a regular HostOS Update: DATA LOSS: This update requires disk re-partitioning, which will erase all data stored on the device. NO ROLLBACK: Unlike our HostOS update mechanism, this process does not allow reverting to a previous version in case of failure. Make sure to back up all important data before continuing. For more details, check our documentation: https://docs.balena.io/reference/OS/updates/update-process/ `); } await patterns.confirm(options.yes || false, 'Host OS updates require a device restart when they complete. Are you sure you want to proceed?'); await sdk.models.device .startOsUpdate(uuid, targetOsVersion, { runDetached: true, }) .then(() => { console.log(`The balena OS update has started. You can keep track of the progress via the dashboard.\n` + `To open the dashboard page related to a device via the CLI, you can use \`balena device UUID --view\``); }) .catch((error) => { console.error(`Failed to start OS update for device ${uuid}:`, error); }); } } DeviceOsUpdateCmd.description = (0, lazy_1.stripIndent) ` Start a Host OS update for a device. Start a Host OS update for a device. Note this command will ask for confirmation interactively. This can be avoided by passing the \`--yes\` option. Requires balenaCloud; will not work with openBalena or standalone balenaOS. `; DeviceOsUpdateCmd.examples = [ '$ balena device os-update 23c73a1', '$ balena device os-update 23c73a1 --version 2.101.7', '$ balena device os-update 23c73a1 --version 2.31.0+rev1.prod', '$ balena device os-update 23c73a1 --include-draft', ]; DeviceOsUpdateCmd.args = { uuid: core_1.Args.string({ description: 'the uuid of the device to update', required: true, }), }; DeviceOsUpdateCmd.flags = { version: core_1.Flags.string({ description: 'a balenaOS version', exclusive: ['include-draft'], }), 'include-draft': core_1.Flags.boolean({ description: 'include pre-release balenaOS versions', default: false, exclusive: ['version'], }), yes: cf.yes, }; DeviceOsUpdateCmd.authenticated = true; exports.default = DeviceOsUpdateCmd; //# sourceMappingURL=os-update.js.map