2022-07-20 05:03:47 +00:00
|
|
|
const shell = require("shelljs");
|
|
|
|
|
const fsPromises = require("fs/promises");
|
|
|
|
|
const Constants = require("./constants");
|
|
|
|
|
const childProcess = require("child_process");
|
2021-09-01 05:32:08 +00:00
|
|
|
|
|
|
|
|
function showHelp() {
|
2022-07-20 05:03:47 +00:00
|
|
|
console.log(
|
|
|
|
|
"\nUsage: appsmith <command> to interact with appsmith utils tool"
|
|
|
|
|
);
|
|
|
|
|
console.log("\nOptions:\r");
|
|
|
|
|
console.log("\tex, export_db\t\tExport interal database.\r");
|
|
|
|
|
console.log("\tim, import_db\t\tImport interal database.\r");
|
|
|
|
|
console.log("\tmi, migrate\t\tMigrate new server.\r");
|
|
|
|
|
console.log("\tcrs, check_replica_set\tCheck replica set mongoDB.\r");
|
|
|
|
|
console.log("\tbackup\t\t\tTake a backup of Appsmith instance.\r");
|
|
|
|
|
console.log("\trestore\t\t\tRestore Appsmith instance from a backup.\r");
|
|
|
|
|
console.log("\testimate_billing\tEstimate billing based on past usage.\r");
|
|
|
|
|
console.log("\t--help\t\t\t" + "Show help.");
|
2021-09-01 05:32:08 +00:00
|
|
|
}
|
2022-06-09 03:44:18 +00:00
|
|
|
|
|
|
|
|
function stop(apps) {
|
2022-07-20 05:03:47 +00:00
|
|
|
const appsStr = apps.join(" ");
|
|
|
|
|
console.log("Stopping " + appsStr);
|
|
|
|
|
shell.exec("/usr/bin/supervisorctl stop " + appsStr);
|
|
|
|
|
console.log("Stopped " + appsStr);
|
2022-06-09 03:44:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function start(apps) {
|
2022-07-20 05:03:47 +00:00
|
|
|
const appsStr = apps.join(" ");
|
|
|
|
|
console.log("Starting " + appsStr);
|
|
|
|
|
shell.exec("/usr/bin/supervisorctl start " + appsStr);
|
|
|
|
|
console.log("Started " + appsStr);
|
2022-06-09 03:44:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function execCommand(cmd, options) {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
let isPromiseDone = false;
|
|
|
|
|
|
|
|
|
|
const p = childProcess.spawn(cmd[0], cmd.slice(1), {
|
2022-07-20 05:03:47 +00:00
|
|
|
stdio: "inherit",
|
2022-06-09 03:44:18 +00:00
|
|
|
...options,
|
|
|
|
|
});
|
|
|
|
|
|
2022-07-20 05:03:47 +00:00
|
|
|
p.on("exit", (code) => {
|
2022-06-09 03:44:18 +00:00
|
|
|
if (isPromiseDone) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
isPromiseDone = true;
|
|
|
|
|
if (code === 0) {
|
|
|
|
|
resolve();
|
|
|
|
|
} else {
|
|
|
|
|
reject();
|
|
|
|
|
}
|
2022-07-20 05:03:47 +00:00
|
|
|
});
|
2022-06-09 03:44:18 +00:00
|
|
|
|
2022-07-20 05:03:47 +00:00
|
|
|
p.on("error", (err) => {
|
2022-06-09 03:44:18 +00:00
|
|
|
if (isPromiseDone) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
isPromiseDone = true;
|
2023-01-03 06:44:21 +00:00
|
|
|
console.error("Error running command", err);
|
2022-06-09 03:44:18 +00:00
|
|
|
reject();
|
2022-07-20 05:03:47 +00:00
|
|
|
});
|
|
|
|
|
});
|
2022-06-09 03:44:18 +00:00
|
|
|
}
|
|
|
|
|
|
2022-07-20 05:03:47 +00:00
|
|
|
async function listLocalBackupFiles() {
|
|
|
|
|
// Ascending order
|
2022-07-07 05:49:25 +00:00
|
|
|
const backupFiles = [];
|
2022-07-20 05:03:47 +00:00
|
|
|
await fsPromises
|
|
|
|
|
.readdir(Constants.BACKUP_PATH)
|
|
|
|
|
.then((filenames) => {
|
|
|
|
|
for (let filename of filenames) {
|
|
|
|
|
if (filename.match(/^appsmith-backup-.*\.tar\.gz$/)) {
|
|
|
|
|
backupFiles.push(filename);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => {
|
|
|
|
|
console.log(err);
|
|
|
|
|
});
|
2022-07-07 05:49:25 +00:00
|
|
|
return backupFiles;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-28 12:15:28 +00:00
|
|
|
|
|
|
|
|
async function updateLastBackupErrorMailSentInMilliSec(ts) {
|
|
|
|
|
await fsPromises.mkdir(Constants.BACKUP_PATH, { recursive: true });
|
|
|
|
|
await fsPromises.writeFile(Constants.LAST_ERROR_MAIL_TS, ts.toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function getLastBackupErrorMailSentInMilliSec() {
|
|
|
|
|
try {
|
|
|
|
|
const ts = await fsPromises.readFile(Constants.LAST_ERROR_MAIL_TS);
|
|
|
|
|
return parseInt(ts, 10);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-03 06:44:21 +00:00
|
|
|
async function getCurrentAppsmithVersion() {
|
|
|
|
|
const content = await fsPromises.readFile('/opt/appsmith/rts/version.js', { encoding: 'utf8' });
|
|
|
|
|
return content.match(/\bexports\.VERSION\s*=\s*["']([^"]+)["']/)[1];
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-09 03:44:18 +00:00
|
|
|
module.exports = {
|
|
|
|
|
showHelp,
|
|
|
|
|
start,
|
|
|
|
|
stop,
|
|
|
|
|
execCommand,
|
2022-07-07 05:49:25 +00:00
|
|
|
listLocalBackupFiles,
|
2022-07-28 12:15:28 +00:00
|
|
|
updateLastBackupErrorMailSentInMilliSec,
|
|
|
|
|
getLastBackupErrorMailSentInMilliSec,
|
2023-01-03 06:44:21 +00:00
|
|
|
getCurrentAppsmithVersion
|
2022-06-09 03:44:18 +00:00
|
|
|
};
|