#!/usr/bin/env -S node -r esm "use strict"; import path from "path"; import fs from "fs"; process.chdir(path.resolve(path.dirname(fs.realpathSync(__filename)), "..")); import * as config from "../lib/config"; import * as logger from "../lib/logger"; import * as cluster from "../lib/cluster"; import * as server from "../lib/server"; import { listener } from "../lib/fs"; import * as db from "../lib/db"; import * as cache from "../lib/cache"; import { version as VERSION } from "../package.json"; 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, listener); }); }); }