galleon
Version:
A badass SMTP mail server built on Node to make your life simpler.
56 lines (48 loc) • 2.11 kB
JavaScript
var pm2 = require('pm2');
var _ = require('lodash');
var path = require('path');
// Thanks to https://gist.github.com/timoxley/1689041
var isPortTaken = function (port, fn) {
var net = require('net')
var tester = net.createServer()
.once('error', function (err) {
if (err.code != 'EADDRINUSE') return fn(err)
fn(null, false)
})
.once('listening', function () {
tester.once('close', function () { fn(null, true) })
.close()
})
.listen(port)
}
module.exports = function () {
// Connect or launch PM2
pm2.connect(function (error) {
if (error) throw error;
pm2.list(function (error, list) {
if (error) throw error;
if (_.findWhere(list, { name: 'galleon-instance' })) {
console.error("Instance already exists!".red, "\nTRY", "galleon restart".magenta);
process.exit(0);
}
isPortTaken(25, function (error, available) {
if (error || !available) {
console.log("PORT 25 is not available", "\nTRY", "authbind --deep galleon start".magenta, "\nFind More info about authbind -> https://github.com/schahriar/Galleon/blob/master/tutorials/AUTHBIND.md")
process.exit(0);
}
// Start a script on the current folder
/* BADPATCH -- There are significant issues with providing PM2 with a local script (https://github.com/schahriar/Galleon/issues/2). Start.JS should implement fallback methods and use a launch script inside the .galleon folder by default. */
pm2.start(path.resolve(__dirname, '../galleon.js'), { name: 'galleon-instance', force: true, scriptArgs: process.argv, nodeArgs: "--max_old_space_size=300" }, function (err, proc) {
if (err) return new Error(err);
// Get all processes running
pm2.list(function (err, process_list) {
console.log("Process Started".green);
console.log("Type".cyan + " galleon status ".bold + "to show process status".cyan);
// Disconnect to PM2
pm2.disconnect(function () { process.exit(0) });
});
});
})
})
})
}