aboutsummaryrefslogtreecommitdiff
path: root/src/server/DashSession.ts
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2020-01-09 22:34:14 -0500
committerSam Wilkins <samwilkins333@gmail.com>2020-01-09 22:34:14 -0500
commit47f405aae0b4cf13ed24f4c5a699ea63877573ea (patch)
treec28148004c1d39b6146479fc0fb1351190ec4ae9 /src/server/DashSession.ts
parent78971c5c761f10e64aea74f1fc05580f384e171f (diff)
remote authorized session actions
Diffstat (limited to 'src/server/DashSession.ts')
-rw-r--r--src/server/DashSession.ts83
1 files changed, 44 insertions, 39 deletions
diff --git a/src/server/DashSession.ts b/src/server/DashSession.ts
index e03487a61..c893f4b64 100644
--- a/src/server/DashSession.ts
+++ b/src/server/DashSession.ts
@@ -19,7 +19,7 @@ export class DashSessionAgent extends Session.AppliedSessionAgent {
private readonly notificationRecipients = ["samuel_wilkins@brown.edu"];
private readonly signature = "-Dash Server Session Manager";
-
+ private readonly releaseDesktop = pathFromRoot("../../Desktop");
protected async launchMonitor() {
const monitor = Session.Monitor.Create({
@@ -67,44 +67,10 @@ export class DashSessionAgent extends Session.AppliedSessionAgent {
}
}
});
- const releaseDesktop = pathFromRoot("../../Desktop");
- const backup = () => monitor.exec("backup.bat", { cwd: releaseDesktop });
- monitor.addReplCommand("backup", [], backup);
- monitor.addReplCommand("debug", [/active|passive/, /\S+\@\S+/], async args => {
- const [mode, recipient] = args;
- if (mode === "active") {
- await backup();
- }
- monitor.mainLog("backup complete");
- const backupsDirectory = `${releaseDesktop}/backups`;
- const compressedDirectory = `${releaseDesktop}/compressed`;
- if (!existsSync(compressedDirectory)) {
- mkdirSync(compressedDirectory);
- }
- const target = readdirSync(backupsDirectory).map(filename => ({
- modifiedTime: statSync(`${backupsDirectory}/${filename}`).mtimeMs,
- filename
- })).sort((a, b) => b.modifiedTime - a.modifiedTime)[0].filename;
- monitor.mainLog(`targeting ${target}...`);
- const zipName = `${target}.zip`;
- const zipPath = `${compressedDirectory}/${zipName}`;
- const output = createWriteStream(zipPath);
- const zip = Archiver('zip');
- zip.pipe(output);
- zip.directory(`${backupsDirectory}/${target}/Dash`, false);
- await zip.finalize();
- monitor.mainLog(`zip finalized with size ${statSync(zipPath).size} bytes, saved to ${zipPath}`);
- let instructions = readFileSync(resolve(__dirname, "./remote_debug_instructions.txt"), { encoding: "utf8" });
- instructions = instructions.replace(/__zipname__/, zipName).replace(/__target__/, target).replace(/__signature__/, this.signature);
- const error = await Email.dispatch(recipient, `Compressed backup of ${target}...`, instructions, [
- {
- filename: zipName,
- path: zipPath
- }
- ]);
- monitor.mainLog(`${error === null ? green("successfully dispatched") : red("failed to dispatch")} ${zipName} to ${cyan(recipient)}`);
- error && monitor.mainLog(red(error.message));
- });
+ monitor.addReplCommand("backup", [], this.backup);
+ monitor.addReplCommand("debug", [/active|passive/, /\S+\@\S+/], async ([mode, recipient]) => this.dispatchZippedDebugBackup(mode, recipient));
+ monitor.addServerMessageListener("backup", this.backup);
+ monitor.addServerMessageListener("debug", ({ args: { mode, recipient } }) => this.dispatchZippedDebugBackup(mode, recipient));
return monitor;
}
@@ -120,4 +86,43 @@ export class DashSessionAgent extends Session.AppliedSessionAgent {
return worker;
}
+ public async backup() {
+ return this.sessionMonitor.exec("backup.bat", { cwd: this.releaseDesktop });
+ }
+
+ public async dispatchZippedDebugBackup(mode: string, recipient: string) {
+ if (mode === "active") {
+ await this.backup();
+ }
+ this.sessionMonitor.mainLog("backup complete");
+ const backupsDirectory = `${this.releaseDesktop}/backups`;
+ const compressedDirectory = `${this.releaseDesktop}/compressed`;
+ if (!existsSync(compressedDirectory)) {
+ mkdirSync(compressedDirectory);
+ }
+ const target = readdirSync(backupsDirectory).map(filename => ({
+ modifiedTime: statSync(`${backupsDirectory}/${filename}`).mtimeMs,
+ filename
+ })).sort((a, b) => b.modifiedTime - a.modifiedTime)[0].filename;
+ this.sessionMonitor.mainLog(`targeting ${target}...`);
+ const zipName = `${target}.zip`;
+ const zipPath = `${compressedDirectory}/${zipName}`;
+ const output = createWriteStream(zipPath);
+ const zip = Archiver('zip');
+ zip.pipe(output);
+ zip.directory(`${backupsDirectory}/${target}/Dash`, false);
+ await zip.finalize();
+ this.sessionMonitor.mainLog(`zip finalized with size ${statSync(zipPath).size} bytes, saved to ${zipPath}`);
+ let instructions = readFileSync(resolve(__dirname, "./remote_debug_instructions.txt"), { encoding: "utf8" });
+ instructions = instructions.replace(/__zipname__/, zipName).replace(/__target__/, target).replace(/__signature__/, this.signature);
+ const error = await Email.dispatch(recipient, `Compressed backup of ${target}...`, instructions, [
+ {
+ filename: zipName,
+ path: zipPath
+ }
+ ]);
+ this.sessionMonitor.mainLog(`${error === null ? green("successfully dispatched") : red("failed to dispatch")} ${zipName} to ${cyan(recipient)}`);
+ error && this.sessionMonitor.mainLog(red(error.message));
+ }
+
} \ No newline at end of file