diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/ActionUtilities.ts | 6 | ||||
-rw-r--r-- | src/server/DashSession.ts | 60 | ||||
-rw-r--r-- | src/server/Search.ts | 8 |
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[]) { |