UNPKG

balena-cli

Version:

The official balena Command Line Interface

138 lines 5.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDeviceAndMaybeAppFromUUID = exports.getDeviceAndAppFromUUID = exports.serviceIdToName = void 0; exports.downloadOSImage = downloadOSImage; exports.getOsVersions = getOsVersions; exports.formatOsVersion = formatOsVersion; const _ = require("lodash"); const lazy_1 = require("./lazy"); const errors_1 = require("../errors"); exports.serviceIdToName = _.memoize(async (sdk, serviceId) => { const serviceName = await sdk.pine.get({ resource: 'service', id: serviceId, options: { $select: 'service_name', }, }); if (serviceName != null) { return serviceName.service_name; } return; }, (_sdk, id) => id.toString()); exports.getDeviceAndAppFromUUID = _.memoize(async (sdk, deviceUUID, selectDeviceFields, selectAppFields) => { const [device, app] = await (0, exports.getDeviceAndMaybeAppFromUUID)(sdk, deviceUUID, selectDeviceFields, selectAppFields); if (app == null) { throw new errors_1.ExpectedError((0, lazy_1.stripIndent) ` Unable to access the fleet that device ${deviceUUID} belongs to. Hint: check whether the fleet owner withdrew access to it. `); } return [device, app]; }, (_sdk, deviceUUID) => deviceUUID); exports.getDeviceAndMaybeAppFromUUID = _.memoize(async (sdk, deviceUUID, selectDeviceFields, selectAppFields) => { const pineOpts = { $expand: selectAppFields ? { belongs_to__application: { $select: selectAppFields } } : 'belongs_to__application', }; if (selectDeviceFields) { pineOpts.$select = selectDeviceFields; } const device = await sdk.models.device.get(deviceUUID, pineOpts); const apps = device.belongs_to__application; if (_.isEmpty(apps) || _.isEmpty(apps[0])) { return [device, undefined]; } return [device, apps[0]]; }, (_sdk, deviceUUID) => deviceUUID); async function downloadOSImage(deviceType, outputPath, OSVersion) { console.info(`Getting device operating system for ${deviceType}`); if (!OSVersion) { console.warn('OS version not specified: using latest released version'); } OSVersion = OSVersion ? await resolveOSVersion(deviceType, OSVersion) : 'default'; process.env.ZLIB_FLUSH = 'Z_NO_FLUSH'; const { getStream } = await Promise.resolve().then(() => require('./image-manager')); const stream = await getStream(deviceType, OSVersion); const displayVersion = await new Promise((resolve, reject) => { stream.on('error', reject); stream.on('balena-image-manager:resolved-version', resolve); }); const visuals = (0, lazy_1.getVisuals)(); const bar = new visuals.Progress(`Downloading balenaOS version ${displayVersion}`); const spinner = new visuals.Spinner(`Downloading balenaOS version ${displayVersion} (size unknown)`); stream.on('progress', (state) => { if (state != null) { return bar.update(state); } else { return spinner.start(); } }); stream.on('end', () => { spinner.stop(); }); let output; if (stream.mime === 'application/zip') { const unzip = await Promise.resolve().then(() => require('node-unzip-2')); output = unzip.Extract({ path: outputPath }); } else { const fs = await Promise.resolve().then(() => require('fs')); output = fs.createWriteStream(outputPath); } const { pipeline } = await Promise.resolve().then(() => require('node:stream/promises')); await pipeline(stream, output); console.info(`balenaOS image version ${displayVersion} downloaded successfully`); return outputPath; } async function resolveOSVersion(deviceType, version) { if (['menu', 'menu-esr'].includes(version)) { return await selectOSVersionFromMenu(deviceType, version === 'menu-esr', false); } const { normalizeOsVersion } = await Promise.resolve().then(() => require('./normalization')); version = normalizeOsVersion(version); return version; } async function selectOSVersionFromMenu(deviceType, esr, includeDraft) { var _a; const vs = await getOsVersions(deviceType, esr, includeDraft); const choices = vs.map((v) => ({ value: v.raw_version, name: formatOsVersion(v), })); return (0, lazy_1.getCliForm)().ask({ message: 'Select the OS version:', type: 'list', choices, default: (_a = vs[0]) === null || _a === void 0 ? void 0 : _a.raw_version, }); } async function getOsVersions(deviceType, esr, includeDraft) { const sdk = (0, lazy_1.getBalenaSdk)(); let slug = deviceType; let versions = await sdk.models.os.getAvailableOsVersions(slug, { includeDraft }); if (!versions.length) { slug = (await sdk.models.deviceType.get(slug, { $select: 'slug' })).slug; if (slug !== deviceType) { versions = await sdk.models.os.getAvailableOsVersions(slug, { includeDraft, }); } } versions = versions.filter((v) => v.osType === (esr ? 'esr' : 'default')); if (!versions.length) { const vType = esr ? 'ESR versions' : 'versions'; throw new errors_1.ExpectedError(`Error: No balenaOS ${vType} found for device type '${deviceType}'.`); } return versions; } function formatOsVersion(osVersion) { return osVersion.line ? `v${osVersion.raw_version} (${osVersion.line})` : `v${osVersion.raw_version}`; } //# sourceMappingURL=cloud.js.map