balena-cli
Version:
The official balena Command Line Interface
138 lines • 5.6 kB
JavaScript
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
;