balena-cli
Version:
The official balena Command Line Interface
123 lines (120 loc) • 6 kB
JavaScript
;
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