import * as fs from "fs"; /** * A Collection of settings */ export interface ConfigOptions { /** * The number of nodes that will be ran in parallel, * if the number of nodes is smaller than the parallels, * it will simply divide them evenly and ignore extra parallels */ parallel_nodes: number, /** * The amount of tasks that a node parallel can run at once, * these basically are mysql_dump processes. */ parallel_node_tasks: number, /** * This option should be set to ON if you would like the dumps * to only export tables. */ separate_into_tables: boolean, /** * A string of CLI options for the mysql dump command */ mysql_dump_settings: string, } /** * Basic configuration interface for the mailer */ export interface SMTPConfig { /** * The email address to globally use for sending * out email from. */ email_from : string, /** * Email username login details */ username : string, /** * Email password login details */ password : string, /** * The SMTP host of the email */ host : string, /** * The port to send to, common ports are 465 ( ssl ), 587 for TLS */ port : number, /** * Secure Connection */ ssl : boolean, } export interface NodeConnectionMail { /** * Enable or disable email sending */ enabled : boolean, /** * The main user to send out the email to */ email_to: string, /** * A list of email addresses to CC into the email */ email_cc: Array, } export interface DatabaseFilter { /** * A filter where anything inside of it is going to be ignored */ blacklist?: null | Array, /** * A filter where anything out of it will be ignored */ whitelist?: null | Array, } /** * A Node Connection for the database backup */ export interface NodeConnection { /** * The name for the connection to be identified by */ name : string, /** * Send out console debug messages */ debug : string, /** * Keep a log file for this connection independently */ log : boolean, /** * Mail configuration details */ mail? : NodeConnectionMail | null, /** * Ip Address of the database */ hostname : string, /** * The username for the database connection */ username : string, /** * The password to connect to the database with */ password : string, /** * The port for the database connection */ port : number, /** * The database filter, this can contain a blacklist or a whitelist. */ databases?: DatabaseFilter } export interface ConfigObject { /** * A list of global settings for the behaviour * of the exporter */ options: ConfigOptions, /** * SMTP details for sending out email notifications * for real-time updates on erros, health, and backups. */ smtp: SMTPConfig, /** * An array of Node connections that we should backup */ nodes: Array } /** * Get the name of the config file */ export function getConfigFileName() : string { return "config.json"; } /** * The config file can really be in 2 places, in the project or above it, so we're going to take a peak in both cases. */ function findConfigFile() : string { const fileName : string = getConfigFileName(); // Look in the same folder if ( fs.existsSync(fileName) ) { return fileName; } // Check outside if ( fs.existsSync(fileName) ) { return `../${fileName}`; } // Throw an error because the file does not exist. throw new Error("Failed to find the config file, please create a `config.json` file and complete it similar to the provided example file `config.example.json`"); } /** * Read the config file from the files of the project * @returns The configuration object of the project */ export function getConfig() : ConfigObject { // Check for the location of the config file const fileName : string = findConfigFile(); // Initialize the config data object let configData : ConfigObject; // Load in the configuration data from the json file const rawFileData : string = fs.readFileSync(fileName, `utf-8`); // Parse the data configData = JSON.parse(rawFileData); if ( !!configData ) { return configData; } // Throw an error because it has been a failure throw new Error("Failed to load the configuration file."); }