obniz-cli
Version:
[日本語はこちら](./README-ja.md)
192 lines (188 loc) • 7.87 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const { URL } = require("url");
const chalk_1 = __importDefault(require("chalk"));
const defaults_1 = __importDefault(require("../../defaults"));
const os_1 = __importDefault(require("../../libs/obnizio/os"));
const device_1 = __importDefault(require("../obnizio/device"));
const Storage = __importStar(require("../storage"));
const _flash_1 = __importDefault(require("./_flash"));
const config_1 = __importStar(require("./config"));
const prepare_1 = __importDefault(require("./serial/prepare"));
const inquirer_1 = __importDefault(require("inquirer"));
const ora_1 = __importDefault(require("ora"));
exports.default = {
help: `Flash obnizOS and configure it
[serial setting]
-p --port serial port path to flash.If not specified, the port list will be displayed.
-b --baud flashing baud rate. default to ${defaults_1.default.BAUD}
[flashing setting]
-h --hardware hardware to be flashed. default to ${defaults_1.default.HARDWARE}
-v --version obnizOS version to be flashed. default to latest one.
[obnizCloud device setting]
-r --region device config region
--description device config description
-c --config configuration file path. If specified obniz-cli proceed settings following file like setting wifi SSID/Password.
--token Token of api key which use instead of user signin.
[operation]
--operation operation name for setting.
--indication indication name for setting.
`,
async execute(args) {
// If device related configration exist
// It is not allowed. because device will be created from me.
if (args.d || args.devicekey || args.i || args.id) {
throw new Error(`You can't pass devicekey/id arguments. Because flash-create will create new device.`);
}
// login check
const token = args.token || Storage.get("token");
if (!token) {
throw new Error(`You must singin before create device`);
}
// validate first
await config_1.validate(args);
// SerialPortSetting
const obj = await prepare_1.default(args);
obj.stdout = (text) => {
// process.stdout.write(text);
};
// recovery data.
const recoveryDeviceString = Storage.get("recovery-device");
let device;
if (recoveryDeviceString) {
const readedDevice = JSON.parse(recoveryDeviceString);
const use = await askUseRecovery(readedDevice);
if (use) {
device = readedDevice;
}
else {
Storage.set("recovery-device", null);
}
}
let qrData = null;
// IF manufacturer
if (args.bindtoken) {
qrData = await askSerialToken(device);
}
// No more asking
let hardware;
let version;
let spinner;
spinner = ora_1.default("obnizOS:").start();
// hardware
hardware = args.h || args.hardware || defaults_1.default.HARDWARE;
obj.hardware = hardware;
// version
version = args.v || args.version;
if (!version) {
spinner.text = `obnizOS: Connecting obnizCloud to Public Latest Version of hardware=${chalk_1.default.green(hardware)}`;
version = await os_1.default.latestPublic(hardware);
spinner.succeed(`obnizOS: [using default] hardware=${chalk_1.default.green(hardware)} version=${chalk_1.default.green(`${version}(Public Latest Version)`)}`);
}
else {
spinner.succeed(`obnizOS: decided hardware=${chalk_1.default.green(hardware)} version=${chalk_1.default.green(version)}`);
}
obj.version = version;
await _flash_1.default(obj);
if (device) {
spinner = ora_1.default("obnizCloud:").start();
spinner.succeed(`obnizCloud: using recovery device obnizID=${chalk_1.default.green(device.id)} description=${chalk_1.default.green(device.description)} region=${chalk_1.default.green(device.region)}`);
}
else {
spinner = ora_1.default("obnizCloud: creating device on obnizCloud...").start();
try {
// Device Creation Setting
const region = args.r || args.region || "jp";
const description = args.description || "";
// registrate
const requestObj = {
region,
description,
hardware,
};
if (qrData) {
requestObj.serialdata = `${qrData.serialcode}/${qrData.token}`;
}
device = await device_1.default.create(token, requestObj);
Storage.set("recovery-device", JSON.stringify(device));
spinner.succeed(`obnizCloud: created device on obnizCloud obnizID=${chalk_1.default.green(device.id)} description=${chalk_1.default.green(device.description)} region=${chalk_1.default.green(device.region)}`);
}
catch (e) {
spinner.fail(`obnizCloud: ${e}`);
throw e;
}
}
try {
// Configure it
args.p = undefined;
args.port = obj.portname; // 万が一この期間にシリアルポートが新たに追加されるとずれる可能性があるので
args.devicekey = device.devicekey;
await config_1.default.execute(args);
Storage.set("recovery-device", null);
}
catch (e) {
chalk_1.default.yellow(`obnizID ${device.id} device key and information was sotred in recovery file`);
throw e;
}
},
};
async function askUseRecovery(device) {
const answer = await inquirer_1.default.prompt([
{
type: "list",
name: "yesno",
message: `Would you like to use recovery device ${device.id} [ ${device.description} ] rather than create one more device? It was failed one last time.`,
choices: [
{
name: `Yes. I'm going to use recovery.`,
value: `yes`,
},
{
name: `No. Discard it and create new obnizID on obnizCloud`,
value: `no`,
},
],
default: "yes",
},
]);
return answer.yesno === "yes";
}
async function askSerialToken(device) {
const answer = await inquirer_1.default.prompt([
{
type: "input",
name: "serialtoken",
message: `Scan QR Code. Waiting...`,
},
]);
const spinner = ora_1.default("Serial: Binding...").start();
try {
const url = new URL(answer.serialtoken);
const paths = url.pathname.split("/");
if (paths.length !== 4 || paths[1] !== "sn") {
throw new Error(`Invalid Serial Code`);
}
const serialcode = paths[2];
const token = paths[3];
spinner.succeed(`Serial: SerialCode=${chalk_1.default.green(serialcode)} Token=${chalk_1.default.green(token)}`);
return {
serialcode,
token,
};
}
catch (e) {
spinner.fail(`Invalid SerialCode`);
throw e;
}
}
//# sourceMappingURL=flashcreate.js.map