aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/ActionUtilities.ts6
-rw-r--r--src/server/DashSession.ts60
-rw-r--r--src/server/Search.ts8
3 files changed, 61 insertions, 13 deletions
diff --git a/src/server/ActionUtilities.ts b/src/server/ActionUtilities.ts
index a93566fb1..f0bfbc525 100644
--- a/src/server/ActionUtilities.ts
+++ b/src/server/ActionUtilities.ts
@@ -6,6 +6,7 @@ import * as rimraf from "rimraf";
import { yellow, Color } from 'colors';
import * as nodemailer from "nodemailer";
import { MailOptions } from "nodemailer/lib/json-transport";
+import Mail = require('nodemailer/lib/mailer');
const projectRoot = path.resolve(__dirname, "../../");
export function pathFromRoot(relative?: string) {
@@ -137,12 +138,13 @@ export namespace Email {
return failures.length ? failures : undefined;
}
- export async function dispatch(recipient: string, subject: string, content: string): Promise<Error | null> {
+ export async function dispatch(recipient: string, subject: string, content: string, attachments?: Mail.Attachment[]): Promise<Error | null> {
const mailOptions = {
to: recipient,
from: 'brownptcdash@gmail.com',
subject,
- text: `Hello ${recipient.split("@")[0]},\n\n${content}`
+ text: `Hello ${recipient.split("@")[0]},\n\n${content}`,
+ attachments
} as MailOptions;
return new Promise<Error | null>(resolve => {
smtpTransport.sendMail(mailOptions, resolve);
diff --git a/src/server/DashSession.ts b/src/server/DashSession.ts
index 1c70ae1dc..3299b739b 100644
--- a/src/server/DashSession.ts
+++ b/src/server/DashSession.ts
@@ -1,11 +1,13 @@
import { Session } from "./Session/session";
-import { Email } from "./ActionUtilities";
+import { Email, pathFromRoot } from "./ActionUtilities";
import { red, yellow, green } from "colors";
import { get } from "request-promise";
import { Utils } from "../Utils";
import { WebSocket } from "./Websocket/Websocket";
import { MessageStore } from "./Message";
import { launchServer, onWindows } from ".";
+import { existsSync, mkdirSync, readdirSync, statSync, createWriteStream } from "fs";
+import * as Archiver from "archiver";
/**
* If we're the monitor (master) thread, we should launch the monitor logic for the session.
@@ -48,15 +50,55 @@ export class DashSessionAgent extends Session.AppliedSessionAgent {
}
});
monitor.addReplCommand("pull", [], () => monitor.exec("git pull"));
- monitor.addReplCommand("solr", [/start|stop/], async args => {
- const command = `${onWindows ? "solr.cmd" : "solr"} ${args[0] === "start" ? "start" : "stop -p 8983"}`;
- await monitor.exec(command, { cwd: "./solr-8.3.1/bin" });
- try {
- await get("http://localhost:8983");
- monitor.mainLog(green("successfully connected to 8983 after running solr initialization"));
- } catch {
- monitor.mainLog(red("unable to connect at 8983 after running solr initialization"));
+ monitor.addReplCommand("solr", [/start|stop|index/], async args => {
+ const action = args[0];
+ if (action === "index") {
+ monitor.exec("npx ts-node ./updateSearch.ts", { cwd: pathFromRoot("./src/server") });
+ } else {
+ const command = `${onWindows ? "solr.cmd" : "solr"} ${args[0] === "start" ? "start" : "stop -p 8983"}`;
+ await monitor.exec(command, { cwd: "./solr-8.3.1/bin" });
+ try {
+ await get("http://localhost:8983");
+ monitor.mainLog(green("successfully connected to 8983 after running solr initialization"));
+ } catch {
+ monitor.mainLog(red("unable to connect at 8983 after running solr initialization"));
+ }
+ }
+ });
+ 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, saved to ${zipPath}`);
+ const error = await Email.dispatch(recipient, `Compressed backup of ${target}...`, "mongorestore, etc.", [
+ {
+ filename: zipName,
+ path: zipPath
+ }
+ ]);
+ monitor.mainLog(`${error ? "successfully dispatched" : "failed to dispatch"} ${zipName} to ${recipient}`);
});
return monitor;
}
diff --git a/src/server/Search.ts b/src/server/Search.ts
index 2b59c14b1..21064e520 100644
--- a/src/server/Search.ts
+++ b/src/server/Search.ts
@@ -1,4 +1,5 @@
import * as rp from 'request-promise';
+import { red } from 'colors';
const pathTo = (relative: string) => `http://localhost:8983/solr/dash/${relative}`;
@@ -43,7 +44,7 @@ export namespace Search {
export async function clear() {
try {
- return rp.post(pathTo("update"), {
+ await rp.post(pathTo("update"), {
body: {
delete: {
query: "*:*"
@@ -51,7 +52,10 @@ export namespace Search {
},
json: true
});
- } catch { }
+ } catch (e) {
+ console.log(red("Unable to clear search..."));
+ console.log(red(e.message));
+ }
}
export async function deleteDocuments(docs: string[]) {