#!/usr/bin/env node "use strict"; const path = require("path"); const fs = require("fs"); process.chdir(path.resolve(path.dirname(fs.realpathSync(__filename)), "..")); const config = require("../lib/config"); const logger = require("../lib/logger"); const cluster = require("../lib/cluster"); const server = require("../lib/server"); const _fs = require("../lib/fs"); const db = require("../lib/db"); const cache = require("../lib/cache"); const VERSION = require("../package.json").version; logger.init("fs", VERSION); const SERVICE_ADDRESS = config.get("FS_INTERFACE"); const SERVICE_PORT = config.get("FS_PORT"); function exitWorkerGracefully() { db.disconnect(); cache.disconnect(); cluster.worker.disconnect(); } function exitWorkerUngracefully() { process.exit(1); } if (!cluster.worker) { const WORKER_COUNT = config.get("FS_WORKER_PROCESSES"); logger.info({ message: `genieacs-fs starting`, pid: process.pid, version: VERSION }); cluster.start(WORKER_COUNT, SERVICE_PORT, SERVICE_ADDRESS); process.on("SIGINT", () => { logger.info({ message: "Received signal SIGINT, exiting", pid: process.pid }); cluster.stop(); }); process.on("SIGTERM", () => { logger.info({ message: "Received signal SIGTERM, exiting", pid: process.pid }); cluster.stop(); }); } else { let ssl; if (config.get("FS_SSL")) { ssl = { key: path.resolve(config.get("CONFIG_DIR"), "fs.key"), cert: path.resolve(config.get("CONFIG_DIR"), "fs.crt"), ca: path.resolve(config.get("CONFIG_DIR"), "fs.ca-bundle") }; } process.on("uncaughtException", err => { if (err.code === "ERR_IPC_DISCONNECTED") return; logger.error({ message: "Uncaught exception", exception: err, pid: process.pid }); server .stop() .then(exitWorkerGracefully) .catch(exitWorkerUngracefully); }); process.on("SIGINT", () => { server .stop() .then(exitWorkerGracefully) .catch(exitWorkerUngracefully); }); process.on("SIGTERM", () => { server .stop() .then(exitWorkerGracefully) .catch(exitWorkerUngracefully); }); db.connect(err => { if (err) throw err; cache.connect(err => { if (err) throw err; server.start( SERVICE_PORT, SERVICE_ADDRESS, ssl, _fs.listener, _fs.onConnection ); }); }); }