Skip to content

Commit

Permalink
Added Startup Server Feedbadck and Port In Use Detection
Browse files Browse the repository at this point in the history
  • Loading branch information
crhultay committed Feb 24, 2025
1 parent d0158cb commit 1481df1
Show file tree
Hide file tree
Showing 16 changed files with 356 additions and 24 deletions.
31 changes: 18 additions & 13 deletions core/bbs.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const SysLogKeys = require('./system_log.js');
const UserLogNames = require('./user_log_name');

// deps
const COLOUR_CODES = require('./constants/ansi/colour_codes').COLOUR_CODES;
const async = require('async');
const util = require('util');
const _ = require('lodash');
Expand Down Expand Up @@ -53,6 +54,8 @@ function printVersionAndExit() {
}

function main() {
console.info(`${COLOUR_CODES.GREEN}Starting up...${COLOUR_CODES.WHITE}\n`);

let errorDisplayed = false;

async.waterfall(
Expand Down Expand Up @@ -86,17 +89,17 @@ function main() {
//
if (err) {
errorDisplayed = true;
console.error(`Configuration error: ${err.message}`); // eslint-disable-line no-console
console.error(`${COLOUR_CODES.RED}Configuration error: ${err.message}${COLOUR_CODES.WHITE}`); // eslint-disable-line no-console

if ('ENOENT' === err.code) {
console.error("\nConfiguration file does not exist: '{configFile}'\n\nIf this is a new installation please run './oputil.js config new' from the enigma-bbs directory");
console.error(`\n${COLOUR_CODES.BRIGHT_RED}Configuration file does not exist: '{configFile}'\n\nIf this is a new installation please run './oputil.js config new' from the enigma-bbs directory${COLOUR_CODES.WHITE}`);
}

if (err.hint) {
console.error(`Hint: ${err.hint}`);
console.error(`${COLOUR_CODES.YELLOW}Hint: ${COLOUR_CODES.WHITE}${err.hint}`);
}
if (err.configPath) {
console.error(`Note: ${err.configPath}`);
console.error(`${COLOUR_CODES.YELLOW}Note: ${COLOUR_CODES.WHITE}${err.configPath}`);
}
}
return callback(err);
Expand All @@ -105,7 +108,7 @@ function main() {
function initSystem(callback) {
initialize(function init(err) {
if (err) {
console.error('Error initializing: ' + util.inspect(err));
console.error(`${COLOUR_CODES.BRIGHT_RED}Error initializing: ${COLOUR_CODES.WHITE}${util.inspect(err)}`);
}
return callback(err);
});
Expand All @@ -118,17 +121,17 @@ function main() {
paths.join(__dirname, '../misc/startup_banner.asc'),
'utf8',
(err, banner) => {
console.info(FULL_COPYRIGHT);
console.info('\n' + FULL_COPYRIGHT);
if (!err) {
console.info(banner);
}
console.info('System started!');
console.info(`${COLOUR_CODES.BRIGHT_GREEN}System started!${COLOUR_CODES.WHITE}`);
}
);
}

if (err && !errorDisplayed) {
console.error('Error initializing: ' + util.inspect(err));
console.error(`${COLOUR_CODES.BRIGHT_RED}Error initializing: ${COLOUR_CODES.WHITE}${util.inspect(err)}`);
return process.exit(1);
}
}
Expand All @@ -137,7 +140,7 @@ function main() {

function shutdownSystem() {
const msg = 'Process interrupted. Shutting down...';
console.info(msg);
console.info(`${COLOUR_CODES.RED}${msg}${COLOUR_CODES.WHITE}`);
logger.log.info(msg);

async.series(
Expand Down Expand Up @@ -183,7 +186,7 @@ function shutdownSystem() {
},
],
() => {
console.info('Goodbye!');
console.info(`${COLOUR_CODES.YELLOW}Goodbye!${COLOUR_CODES.WHITE}`);
return process.exit();
}
);
Expand All @@ -200,10 +203,12 @@ function initialize(cb) {
mkdirs(Config.paths[pathKey], function dirCreated(err) {
if (err) {
console.error(
COLOUR_CODES.RED +
'Could not create path: ' +
Config.paths[pathKey] +
': ' +
err.toString()
Config.paths[pathKey] +
': ' +
err.toString() +
COLOUR_CODES.WHITE
);
}
return next(err);
Expand Down
21 changes: 21 additions & 0 deletions core/constants/ansi/colour_codes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@


export const COLOUR_CODES = {
WHITE: "\u001b[37m",
BLACK: "\u001b[30m",
BLUE: "\u001b[34m",
CYAN: "\u001b[36m",
GREEN: "\u001b[32m",
MAGENTA: "\u001b[35m",
RED: "\u001b[31m",
YELLOW: "\u001b[33m",
GREY: "\u001b[90m",
BRIGHT_BLACK: "\u001b[90m",
BRIGHT_RED: "\u001b[91m",
BRIGHT_GREEN: "\u001b[92m",
BRIGHT_YELLOW: "\u001b[93m",
BRIGHT_BLUE: "\u001b[94m",
BRIGHT_MAGENTA: "\u001b[95m",
BRIGHT_CYAN: "\u001b[96m",
BRIGHT_WHITE: "\u001b[97m",
}
6 changes: 6 additions & 0 deletions core/constants/ansi/reset_codes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export const RESET_CODES = {
BOLD: 22,
ITALIC: 23,
UNDERLINE: 24,
INVERSE: 27
}
6 changes: 6 additions & 0 deletions core/constants/ansi/style_codes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export const STYLE_CODES = {
BOLD: 1,
ITALIC: 3,
UNDERLINE: 4,
INVERSE: 7
}
2 changes: 2 additions & 0 deletions core/constants/ansi/syntax_codes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const PREFIX = "\u001b[";
export const SUFFIX = "m";
24 changes: 23 additions & 1 deletion core/servers/chat/mrc_multiplexer.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ const SysProps = require('../../system_property.js');
const StatLog = require('../../stat_log.js');

// deps
const COLOUR_CODES = require('../../constants/ansi/colour_codes').COLOUR_CODES;
const net = require('net');
const _ = require('lodash');
const os = require('os');
const tcpPortUsed = require('tcp-port-used');

// MRC
const clientVersion = '1.3.1';
Expand Down Expand Up @@ -95,10 +97,30 @@ exports.getModule = class MrcModule extends ServerModule {
Errors.Invalid(`Invalid port: ${config.chatServers.mrc.multiplexerPort}`)
);
}

const address = "0.0.0.0";

tcpPortUsed
.check(port, address)
.then(function(inUse) {
if (inUse) {
console.error(`${COLOUR_CODES.BRIGHT_RED}CHAT SERVER: ${COLOUR_CODES.RED}${ModuleInfo.name} Cannot Start! Port is in use: ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

return cb(Errors.Invalid(`Port is in use: ${port} at address ${address}`))
}
},
function(err) {
return cb(err);
}
);

console.info(`${COLOUR_CODES.BRIGHT_GREEN}CHAT SERVER: ${COLOUR_CODES.GREEN}${ModuleInfo.name} Listening on Port ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

Log.info(
{ server: ModuleInfo.name, port: config.chatServers.mrc.multiplexerPort },
{ server: ModuleInfo.name, port: port, address: address },
'MRC multiplexer starting up'
);

return this.server.listen(port, cb);
}

Expand Down
27 changes: 26 additions & 1 deletion core/servers/content/gopher.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ const { wordWrapText } = require('../../word_wrap.js');
const { stripMciColorCodes } = require('../../color_codes.js');

// deps
const COLOUR_CODES = require('../../constants/ansi/colour_codes').COLOUR_CODES;
const net = require('net');
const _ = require('lodash');
const fs = require('graceful-fs');
const paths = require('path');
const moment = require('moment');
const tcpPortUsed = require('tcp-port-used');

const ModuleInfo = (exports.moduleInfo = {
name: 'Gopher',
Expand Down Expand Up @@ -131,7 +133,30 @@ exports.getModule = class GopherModule extends ServerModule {
);
}

return this.server.listen(port, config.contentServers.gopher.address, cb);
const address = config.contentServers.gopher.address;

tcpPortUsed
.check(port, address)
.then(function(inUse) {
if (inUse) {
console.error(`${COLOUR_CODES.BRIGHT_RED}CONTENT SERVER: ${COLOUR_CODES.RED}${ModuleInfo.name} Cannot Start! Port is in use: ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

return cb(Errors.UnexpectedState(`Port is in use: ${port} at address ${address}`))
}
},
function(err) {
return cb(err);
}
);

console.info(`${COLOUR_CODES.BRIGHT_GREEN}CONTENT SERVER: ${COLOUR_CODES.GREEN}Gopher Listening on Port ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

Log.info(
{ server: ModuleInfo.name, port: port, address: address },
'Gopher starting up'
);

return this.server.listen(port, address, cb);
}

get enabled() {
Expand Down
27 changes: 27 additions & 0 deletions core/servers/content/nntp.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ const { stripMciColorCodes } = require('../../color_codes.js');
const ACS = require('../../acs');

// deps
const COLOUR_CODES = require('../../constants/ansi/colour_codes').COLOUR_CODES;
const NNTPServerBase = require('nntp-server');
const _ = require('lodash');
const fs = require('fs-extra');
Expand All @@ -36,6 +37,7 @@ const asyncWaterfall = require('async/waterfall');
const LRU = require('lru-cache');
const sqlite3 = require('sqlite3');
const paths = require('path');
const tcpPortUsed = require('tcp-port-used');

//
// Network News Transfer Protocol (NNTP)
Expand Down Expand Up @@ -1412,6 +1414,29 @@ exports.getModule = class NNTPServerModule extends ServerModule {
const server = this[`${service}Server`];
if (server) {
const port = config.contentServers.nntp[service].port;
const address = config.contentServers.nntp[service].address;

tcpPortUsed
.check(port, address)
.then(function(inUse) {
if (inUse) {
console.error(`${COLOUR_CODES.BRIGHT_RED}CONTENT SERVER: ${COLOUR_CODES.RED}${ModuleInfo.name} Cannot Start! Port is in use: ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

return cb(Errors.Invalid(`Port is in use: ${port} at address ${address}`))
}
},
function(err) {
return cb(err);
}
);

console.info(`${COLOUR_CODES.BRIGHT_GREEN}CONTENT SERVER: ${COLOUR_CODES.GREEN}${service} Listening on Port ${COLOUR_CODES.BRIGHT_WHITE}${port}${COLOUR_CODES.WHITE}`)

Log.info(
{ server: service, port: port, address: address },
'NNTP starting up'
);

server
.listen(this.listenURI(port, service))
.catch(e => {
Expand All @@ -1424,6 +1449,8 @@ exports.getModule = class NNTPServerModule extends ServerModule {
.then(() => {
return nextService(null);
});


} else {
return nextService(null);
}
Expand Down
27 changes: 26 additions & 1 deletion core/servers/content/web.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const Config = require('../../config.js').get;
const { Errors } = require('../../enig_error.js');

// deps
const COLOUR_CODES = require('../../constants/ansi/colour_codes').COLOUR_CODES;
const http = require('http');
const https = require('https');
const _ = require('lodash');
Expand All @@ -16,6 +17,7 @@ const paths = require('path');
const mimeTypes = require('mime-types');
const forEachSeries = require('async/forEachSeries');
const findSeries = require('async/findSeries');
const tcpPortUsed = require('tcp-port-used');

const ModuleInfo = (exports.moduleInfo = {
name: 'Web',
Expand Down Expand Up @@ -161,9 +163,32 @@ exports.getModule = class WebServerModule extends ServerModule {
);
}

const address = config.contentServers.web[service].address;

tcpPortUsed
.check(port, address)
.then(function(inUse) {
if (inUse) {
console.error(`${COLOUR_CODES.BRIGHT_RED}CONTENT SERVER: ${COLOUR_CODES.RED}${ModuleInfo.name} Cannot Start! Port is in use: ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

return cb(Errors.Invalid(`Port is in use: ${port} at address ${address}`))
}
},
function(err) {
return cb(err);
}
);

console.info(`${COLOUR_CODES.BRIGHT_GREEN}CONTENT SERVER: ${COLOUR_CODES.GREEN}${service} Listening on Port ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

Log.info(
{ server: ModuleInfo.name, port: port, address: address },
`WebServer ${service} starting up`
);

this[name].listen(
port,
config.contentServers.web[service].address,
address,
err => {
return nextService(err);
}
Expand Down
27 changes: 26 additions & 1 deletion core/servers/login/ssh.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@ const User = require('../../user.js');
const UserProps = require('../../user_property.js');

// deps
const COLOUR_CODES = require('../../constants/ansi/colour_codes').COLOUR_CODES;
const ssh2 = require('ssh2');
const fs = require('graceful-fs');
const util = require('util');
const _ = require('lodash');
const assert = require('assert');
const tcpPortUsed = require('tcp-port-used');

const ModuleInfo = (exports.moduleInfo = {
name: 'SSH',
Expand Down Expand Up @@ -417,8 +419,31 @@ exports.getModule = class SSHServerModule extends LoginServerModule {
return cb(Errors.Invalid(`Invalid port: ${config.loginServers.ssh.port}`));
}

this.server.listen(port, config.loginServers.ssh.address, err => {
const address = config.loginServers.ssh.address;

tcpPortUsed
.check(port, address)
.then(function(inUse) {
if (inUse) {
console.error(`${COLOUR_CODES.BRIGHT_RED}LOGIN SERVER: ${COLOUR_CODES.RED}${ModuleInfo.name} Cannot Start! Port is in use: ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

return cb(Errors.Invalid(`Port is in use: ${port} at address ${address}`))
}
},
function(err) {
return cb(err);
}
);

Log.info(
{ server: ModuleInfo.name, port: port, address: address },
'SSH starting up'
);

this.server.listen(port, address, err => {
if (!err) {
console.info(`${COLOUR_CODES.BRIGHT_GREEN}LOGIN SERVER: ${COLOUR_CODES.GREEN}${ModuleInfo.name} Listening on Port ${COLOUR_CODES.BRIGHT_WHITE}${port} at address ${address}${COLOUR_CODES.WHITE}`)

Log.info(
{ server: ModuleInfo.name, port: port },
'Listening for connections'
Expand Down
Loading

0 comments on commit 1481df1

Please sign in to comment.