+ System Controller

+ Mail MOdel
+ Config Updates
This commit is contained in:
kato 2021-08-21 02:26:59 +03:00
parent 8cfe5cdefe
commit 0f4c72a32f
5 changed files with 125 additions and 13 deletions

View File

@ -2,7 +2,8 @@
"options": { "options": {
"parallel_nodes": 2, "parallel_nodes": 2,
"parallel_node_tasks": 5, "parallel_node_tasks": 5,
"separate_into_tables": false "separate_into_tables": false,
"mysql_dump_settings": "--no-comments"
}, },
"smtp": { "smtp": {

View File

@ -1,4 +1,7 @@
import { SystemControl } from "./models/SystemController";
(global as any).logger = new SystemControl();
/** /**
* The main function to run the program with * The main function to run the program with

View File

@ -1,7 +1,7 @@
/** /**
* A Collection of settings * A Collection of settings
*/ */
interface ConfigOptions { export interface ConfigOptions {
/** /**
* The number of nodes that will be ran in parallel, * The number of nodes that will be ran in parallel,
* if the number of nodes is smaller than the parallels, * if the number of nodes is smaller than the parallels,
@ -20,12 +20,17 @@ interface ConfigOptions {
* to only export tables. * to only export tables.
*/ */
separate_into_tables: boolean, separate_into_tables: boolean,
/**
* A string of CLI options for the mysql dump command
*/
mysql_dump_settings: string,
} }
/** /**
* Basic configuration interface for the mailer * Basic configuration interface for the mailer
*/ */
interface SMTPConfig { export interface SMTPConfig {
/** /**
* The email address to globally use for sending * The email address to globally use for sending
* out email from. * out email from.
@ -46,14 +51,14 @@ interface SMTPConfig {
/** /**
* The port to send to, common ports are 465 ( ssl ), 587 for TLS * The port to send to, common ports are 465 ( ssl ), 587 for TLS
*/ */
port : string, port : number,
/** /**
* Secure Connection * Secure Connection
*/ */
ssl : boolean, ssl : boolean,
} }
interface NodeConnectionMail { export interface NodeConnectionMail {
/** /**
* Enable or disable email sending * Enable or disable email sending
*/ */
@ -68,7 +73,7 @@ interface NodeConnectionMail {
email_cc: Array<string>, email_cc: Array<string>,
} }
interface DatabaseFilter { export interface DatabaseFilter {
/** /**
* A filter where anything inside of it is going to be ignored * A filter where anything inside of it is going to be ignored
*/ */
@ -82,7 +87,7 @@ interface DatabaseFilter {
/** /**
* A Node Connection for the database backup * A Node Connection for the database backup
*/ */
interface NodeConnection { export interface NodeConnection {
/** /**
* The name for the connection to be identified by * The name for the connection to be identified by
*/ */
@ -117,7 +122,7 @@ interface NodeConnection {
databases?: DatabaseFilter databases?: DatabaseFilter
} }
interface ConfigObject { export interface ConfigObject {
/** /**
* A list of global settings for the behaviour * A list of global settings for the behaviour
* of the exporter * of the exporter

View File

@ -1,4 +1,4 @@
import {getConfig} from "../helper/config"; import {getConfig, NodeConnectionMail} from "../helper/config";
import nodemailer from "nodemailer"; import nodemailer from "nodemailer";
const config = getConfig(); const config = getConfig();
@ -12,6 +12,8 @@ function getTransporter() : nodemailer.Transporter {
// Generate the transporter // Generate the transporter
const transporter = nodemailer.createTransport({ const transporter = nodemailer.createTransport({
host: config?.smtp.host, host: config?.smtp.host,
port: config?.smtp.port,
secure: config?.smtp.ssl,
auth: { auth: {
user: config?.smtp.username, user: config?.smtp.username,
pass: config?.smtp.password, pass: config?.smtp.password,
@ -22,15 +24,24 @@ function getTransporter() : nodemailer.Transporter {
return transporter; return transporter;
} }
export async function sendMail(mailContent: string, toAddress: string, ccAddresses?: Array<string>) { /**
* Send out an email with the config details.
*/
export async function sendMail(mailContent: string, toAddress: string, nodeConfig: NodeConnectionMail, ccAddresses?: Array<string>) {
// Get the transporter // Get the transporter
const transporter = getTransporter(); const transporter = getTransporter();
// Generate the mail options
const mailOptions : nodemailer.SendMailOptions = {
from: config?.smtp.email_from,
to: nodeConfig.email_to,
cc: nodeConfig.email_cc,
html: mailContent,
}
await new Promise((_r, _e) => { await new Promise((_r, _e) => {
transporter.sendMail({ transporter.sendMail(mailOptions, (err, info) => {
}, (err, info) => {
}) })
}) })

View File

@ -0,0 +1,92 @@
function formatDate(d : Date) : string {
let day = (String(d.getDate() + 1)).padStart(2, "0")
let month = (String(d.getMonth())).padStart(2, "0");
let year = (String(d.getFullYear()));
let hour = (String(d.getHours())).padStart(2, "0");
let minute = (String(d.getMinutes())).padStart(2, "0");
// Return the formatted datye
return `${day}/${month}/${year} ${hour}:${minute}`;
}
class logMessage {
ts: Date;
origin: string;
message: string;
constructor( message: string, origin: string = "Unknown", ts?: Date ) {
// Initialize the date as the current date
if ( !ts ) ts = new Date();
// Initialize the log message's data
this.ts = ts;
this.origin = origin;
this.message = message;
}
/**
* Get the log as a string
* @returns A string representation fo the log message
*/
toString() : string {
// Get the formatted date
let dateFormatted = formatDate(this.ts);
// return the formatted message
return `[${dateFormatted}][${this.origin}]: ${this.message}`;
}
}
class Logger {
// An array of logs to represent in an email
logData : Array<logMessage>;
constructor() {
// Initialize an array of logs
this.logData = [];
}
sendEmailLog() : void{
}
}
export class SystemControl {
// The main logger of the system
log: Logger;
constructor() {
// Create an instance of the logger
this.log = new Logger();
}
/**
* Send out a panic message and end the process
* @param message The panic message
*/
async panic(message: string) : Promise<void> {
// Send out the error message
console.error(message);
// End the process
this.endProcess();
}
async endProcess(exitCode : number = 100): Promise<void> {
// Exit the process
process.exit(exitCode);
}
}