@iotize/cli
Version:
IoTize command line interface
234 lines • 11.3 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const rest_1 = require("@iotize/firmware-update-provider.js/rest");
const cli_firmware_update_provider_1 = require("../../../../lib/firmware-update-provider/cli-firmware-update-provider");
const clime_1 = require("clime");
const fs_1 = require("fs");
const ui_1 = require("src/lib/ui");
const ui_2 = require("src/ui");
const file_exists_1 = require("../../../../cli/validators/file-exists");
const inversify_config_1 = require("../../../../inversify.config");
const types_1 = require("../../../../types");
const device_1 = require("../../../options/device");
class TapFirmwareUpdateOptions extends device_1.DeviceOptions {
}
__decorate([
clime_1.option({
description: 'Version',
required: false
// default: 'latest'
}),
__metadata("design:type", String)
], TapFirmwareUpdateOptions.prototype, "version", void 0);
__decorate([
clime_1.option({
description: 'Firmware flavor to use',
required: false
}),
__metadata("design:type", String)
], TapFirmwareUpdateOptions.prototype, "flavor", void 0);
__decorate([
clime_1.option({
description: 'Force (do not ask for confirmation)',
toggle: true,
default: false
}),
__metadata("design:type", Boolean)
], TapFirmwareUpdateOptions.prototype, "force", void 0);
__decorate([
clime_1.option({
description: 'Chunk size of single packet part',
flag: 's'
}),
__metadata("design:type", Number)
], TapFirmwareUpdateOptions.prototype, "chunkSize", void 0);
__decorate([
clime_1.option({
description: 'Firmware update file (.zip or .izsp)',
flag: 'f',
required: false,
validator: new file_exists_1.FileExists()
}),
__metadata("design:type", String)
], TapFirmwareUpdateOptions.prototype, "file", void 0);
__decorate([
clime_1.option({
description: 'Perform a factory reset before applying update',
toggle: true,
default: false
}),
__metadata("design:type", Boolean)
], TapFirmwareUpdateOptions.prototype, "factoryReset", void 0);
__decorate([
clime_1.option({
description: 'Only perform Tap update. Usefull for products like TapNPass that have a two steps update.',
toggle: true
}),
__metadata("design:type", Boolean)
], TapFirmwareUpdateOptions.prototype, "tapOnly", void 0);
__decorate([
clime_1.option({
description: 'Firmware update server endpoint',
default: global.getConfig('default.firmwareUpdateServer') ||
'https://api.firmware-update.iotize.com/',
flag: 'e'
}),
__metadata("design:type", String)
], TapFirmwareUpdateOptions.prototype, "serverEndpoint", void 0);
exports.TapFirmwareUpdateOptions = TapFirmwareUpdateOptions;
function getFirmwareFromOptions(options, tapCredentials, provider) {
return __awaiter(this, void 0, void 0, function* () {
if (!options.flavor) {
const flavors = yield provider.listAvailableFlavors(tapCredentials.serialNumber);
if (flavors.length > 1) {
options.flavor = yield ui_1.input.selectOne(`Which firmware flavor ? `, flavors, tapCredentials.modelName);
}
}
if (!options.version) {
const versions = yield provider.listAvailableVersions(tapCredentials.serialNumber);
if (versions.length === 0) {
throw new Error(`No firmware update version available for ${tapCredentials.serialNumber}`);
}
options.version = yield ui_1.input.selectOne(`Which firmware version ? `, versions.map(version => {
return {
name: `${version.version}`,
value: version.version
};
}), versions[versions.length - 1].version);
}
if (options.version === 'latest') {
try {
options.version = yield provider.getLatestVersion(tapCredentials.serialNumber);
}
catch (err) {
ui_2.display.warn(`Cannot get version corresponding to "latest". ${err.message}`, err);
}
}
return yield provider.getForDevice(tapCredentials.serialNumber, options.version, options.flavor);
});
}
exports.getFirmwareFromOptions = getFirmwareFromOptions;
let default_1 = class default_1 extends clime_1.Command {
execute(options) {
return __awaiter(this, void 0, void 0, function* () {
// switch (options.firmwareUpdateProvider) {
// case FirmwareUpdateProviderType.s3:
// container.rebind(TYPES.FirmwareUpdateProvider).toDynamicValue(() => {
// return container.get(TYPES.S3FirmwareUpdateProvider);
// });
// break;
// case FirmwareUpdateProviderType.server:
// container.rebind(TYPES.FirmwareUpdateProvider).toDynamicValue(() => {
// return container.get(TYPES.RestFirmwareUpdateProvider);
// });
// break;
// }
const firmwareUpdateServerEndpoint = options.serverEndpoint;
const provider = cli_firmware_update_provider_1.createTapFirmwareUpdateProviderFromAxios({
baseURL: firmwareUpdateServerEndpoint,
timeout: 10000
});
ui_2.display.infonl(`Firmware update server: ${firmwareUpdateServerEndpoint}`);
const tap = yield options.getDevice(true, false, true);
// await tap.encryption(true, true);
const tapCredentials = {
serialNumber: (yield tap.service.device.getSerialNumber()).body(),
modelName: (yield tap.service.device.getModelName()).body()
// key: (await tap.service.interface.getCloudPassword()).body()!,
};
const tapnlinkUpdater = inversify_config_1.container.get(types_1.TYPES.TapNLinkUpdater);
try {
ui_2.display.infonl(`Serial number: ${tapCredentials.serialNumber}`);
const currentVersion = (yield tap.service.device.getFirmwareVersion()).body();
ui_2.display.infonl(`Current firmware version: ${currentVersion}`);
let firmwareUpdateInfo;
if (options.file) {
ui_2.display.infonl(`Using tapnlink firmware update file: ${options.file}`);
if (options.file.endsWith('.izsp')) {
firmwareUpdateInfo = {
tapnlink: Uint8Array.from(fs_1.readFileSync(options.file))
};
}
else {
if (!options.file.endsWith('.zip')) {
ui_2.display.warn('Firmware update file does not have a valid extension. It should either be .izsp or .zip.');
}
firmwareUpdateInfo = yield new rest_1.TapFirwmareUpdateConverter().decode(Uint8Array.from(fs_1.readFileSync(options.file)));
}
}
else {
firmwareUpdateInfo = yield getFirmwareFromOptions(options, tapCredentials, provider);
}
if (options.tapOnly) {
ui_2.display.warn(`\
You've added --tap-only option. Be carefull it may result in and invalid setup for your TapNPass.`);
delete firmwareUpdateInfo.adp;
}
if (options.version && options.flavor === tapCredentials.modelName) {
if (currentVersion.startsWith(`${options.version} `)) {
ui_2.display.warn(`Tap firmware version is already version ${options.version}`);
if (!options.force &&
!(yield ui_1.input.confirm(`Do you want to continue ?`))) {
throw new Error(`Update cancelled by user`);
}
}
else if (currentVersion >= options.version) {
if (!options.force &&
!(yield ui_1.input.confirm(`Are you sure to downgrade Tap version from "${currentVersion}" to "${options.version}" ?`))) {
throw new Error(`Update cancelled by user`);
}
}
}
yield tapnlinkUpdater.update(tap, firmwareUpdateInfo, {
chunkSize: options.chunkSize,
factoryReset: options.factoryReset,
force: options.force,
version: options.version
});
this._onUpdateSuccessful();
}
catch (err) {
if (!err) {
err = new Error(`Unknown error`);
}
ui_2.display.error(`Applying update failed: ${err.message}`, err);
process.exit(1);
}
});
}
_onUpdateSuccessful() {
ui_2.display.success(`Update done!`);
process.exit(0);
}
};
__decorate([
clime_1.metadata,
__metadata("design:type", Function),
__metadata("design:paramtypes", [TapFirmwareUpdateOptions]),
__metadata("design:returntype", Promise)
], default_1.prototype, "execute", null);
default_1 = __decorate([
clime_1.command({
description: 'Tap firmware update'
})
], default_1);
exports.default = default_1;
//# sourceMappingURL=update.js.map