particle-cli
Version:
Simple Node commandline application for working with your Particle devices and using the Particle Cloud
124 lines (112 loc) • 3.93 kB
JavaScript
const CLICommandBase = require('./base');
const QdlFlasher = require('../lib/qdl');
const path = require('path');
const fs = require('fs-extra');
const os = require('os');
const {
addLogHeaders,
getEDLDevice,
addLogFooter,
prepareFlashFiles
} = require('../lib/tachyon-utils');
const settings = require('../../settings');
const PARTITIONS_TO_BACKUP = ['nvdata1', 'nvdata2', 'fsc', 'fsg', 'modemst1', 'modemst2'];
module.exports = class BackupRestoreTachyonCommand extends CLICommandBase {
constructor({ ui } = {}) {
super();
this.ui = ui || this.ui;
this._baseDir = settings.ensureFolder();
this._logsDir = path.join(this._baseDir, 'logs');
}
async backup({ 'output-dir': outputDir = process.cwd(), 'log-dir': logDir = this._logsDir } = {}) {
const device = await getEDLDevice({ ui: this.ui });
const outputDirExist = await fs.exists(outputDir);
const logDirExist = await fs.exists(logDir);
if (!outputDirExist) {
await fs.ensureDir(outputDir);
}
if (logDirExist) {
await fs.ensureDir(logDir);
}
const startTime = new Date();
const outputLog = path.join(logDir, `tachyon_${device.id}_backup_${Date.now()}.log`);
this.ui.stdout.write(`Backing up NV data from device ${device.id}...${os.EOL}`);
this.ui.stdout.write(`Logs will be saved to ${outputLog}${os.EOL}`);
addLogHeaders({ outputLog, startTime, deviceId: device.id, commandName: 'Tachyon backup' });
try {
const { firehosePath, xmlFile } = await prepareFlashFiles({
logFile: outputLog,
ui: this.ui,
partitionsList: PARTITIONS_TO_BACKUP,
dir: outputDir,
device,
operation: 'read'
});
const files = [
firehosePath, // must be first
xmlFile,
];
const qdl = new QdlFlasher({
outputLogFile: outputLog,
files: files,
ui: this.ui,
currTask: 'Backup',
skipReset: true,
serialNumber: device.serialNumber
});
await qdl.run();
this.ui.stdout.write(`Backing up NV data from device ${device.id} complete!${os.EOL}`);
} catch (error) {
this.ui.stdout.write(`An error ocurred while trying to backing up your tachyon ${os.EOL}`);
this.ui.stdout.write(`Error: ${error.message} ${os.EOL}`);
this.ui.stdout.write(`Verify your logs ${outputLog} for more information ${os.EOL}`);
} finally {
addLogFooter({ outputLog, startTime, endTime: new Date() });
}
}
async restore({
'input-dir': inputDir = process.cwd(),
'log-dir': logDir = this._logsDir,
} = {}) {
const device = await getEDLDevice({ ui: this.ui });
if (!await fs.exists(logDir)) {
await fs.mkdir(logDir, { recursive: true });
}
const startTime = new Date();
const outputLog = path.join(logDir, `tachyon_${device.id}_restore_${Date.now()}.log`);
this.ui.stdout.write(`Restoring NV data to device ${device.id}...${os.EOL}`);
this.ui.stdout.write(`Logs will be saved to ${outputLog}${os.EOL}`);
addLogHeaders({ outputLog, startTime, deviceId: device.id, commandName: 'Tachyon restore' });
try {
const { firehosePath, xmlFile } = await prepareFlashFiles({
logFile: outputLog,
ui: this.ui,
partitionsList: PARTITIONS_TO_BACKUP,
dir: inputDir,
device,
operation: 'program',
checkFiles: true
});
const files = [
firehosePath, // must be first
xmlFile,
];
const qdl = new QdlFlasher({
outputLogFile: outputLog,
files: files,
ui: this.ui,
currTask: 'Restore',
skipReset: true,
serialNumber: device.serialNumber,
});
await qdl.run();
this.ui.stdout.write(`Restoring NV data to device ${device.id} complete!${os.EOL}`);
} catch (error) {
this.ui.stdout.write(`An error ocurred while trying to restore up your tachyon ${os.EOL}`);
this.ui.stdout.write(`Error: ${error.message} ${os.EOL}`);
this.ui.stdout.write(`Verify your logs ${outputLog} for more information ${os.EOL}`);
} finally {
addLogFooter({ outputLog, startTime, endTime: new Date() });
}
}
};