Merge pull request #49 from paulotelles/feature/centralize-envs

Centralize environment variables
This commit is contained in:
Dave Horton
2023-12-26 08:18:28 -05:00
committed by GitHub
6 changed files with 126 additions and 37 deletions

64
app.js
View File

@@ -1,20 +1,38 @@
const assert = require('assert');
assert.ok(process.env.JAMBONES_MYSQL_HOST &&
process.env.JAMBONES_MYSQL_USER &&
process.env.JAMBONES_MYSQL_PASSWORD &&
process.env.JAMBONES_MYSQL_DATABASE, 'missing JAMBONES_MYSQL_XXX env vars');
if (process.env.JAMBONES_REDIS_SENTINELS) {
assert.ok(process.env.JAMBONES_REDIS_SENTINEL_MASTER_NAME,
const {
JAMBONES_MYSQL_HOST,
JAMBONES_MYSQL_USER,
JAMBONES_MYSQL_PASSWORD,
JAMBONES_MYSQL_DATABASE,
JAMBONES_REDIS_SENTINEL_MASTER_NAME,
JAMBONES_REDIS_SENTINELS,
JAMBONES_REDIS_HOST,
DRACHTIO_HOST,
DRACHTIO_PORT,
DRACHTIO_SECRET,
JAMBONES_TIME_SERIES_HOST,
JAMBONES_LOGLEVEL,
JAMBONES_MYSQL_PORT,
JAMBONES_MYSQL_CONNECTION_LIMIT,
NODE_ENV,
SBC_PUBLIC_ADDRESS_KEEP_ALIVE_IN_MILISECOND
} = require('./lib/config');
assert.ok(JAMBONES_MYSQL_HOST &&
JAMBONES_MYSQL_USER &&
JAMBONES_MYSQL_PASSWORD &&
JAMBONES_MYSQL_DATABASE, 'missing JAMBONES_MYSQL_XXX env vars');
if (JAMBONES_REDIS_SENTINELS) {
assert.ok(JAMBONES_REDIS_SENTINEL_MASTER_NAME,
'missing JAMBONES_REDIS_SENTINEL_MASTER_NAME env var, JAMBONES_REDIS_SENTINEL_PASSWORD env var is optional');
} else {
assert.ok(process.env.JAMBONES_REDIS_HOST, 'missing JAMBONES_REDIS_HOST env var');
assert.ok(JAMBONES_REDIS_HOST, 'missing JAMBONES_REDIS_HOST env var');
}
assert.ok(process.env.DRACHTIO_HOST, 'missing DRACHTIO_HOST env var');
assert.ok(process.env.DRACHTIO_PORT, 'missing DRACHTIO_PORT env var');
assert.ok(process.env.DRACHTIO_SECRET, 'missing DRACHTIO_SECRET env var');
assert.ok(process.env.JAMBONES_TIME_SERIES_HOST, 'missing JAMBONES_TIME_SERIES_HOST env var');
assert.ok(DRACHTIO_HOST, 'missing DRACHTIO_HOST env var');
assert.ok(DRACHTIO_PORT, 'missing DRACHTIO_PORT env var');
assert.ok(DRACHTIO_SECRET, 'missing DRACHTIO_SECRET env var');
assert.ok(JAMBONES_TIME_SERIES_HOST, 'missing JAMBONES_TIME_SERIES_HOST env var');
const logger = require('pino')({ level: process.env.JAMBONES_LOGLEVEL || 'info' });
const logger = require('pino')({ level: JAMBONES_LOGLEVEL || 'info' });
const Srf = require('drachtio-srf');
const srf = new Srf();
const StatsCollector = require('@jambonz/stats-collector');
@@ -36,20 +54,20 @@ const {
updateVoipCarriersRegisterStatus,
lookupClientByAccountAndUsername
} = require('@jambonz/db-helpers')({
host: process.env.JAMBONES_MYSQL_HOST,
user: process.env.JAMBONES_MYSQL_USER,
port: process.env.JAMBONES_MYSQL_PORT || 3306,
password: process.env.JAMBONES_MYSQL_PASSWORD,
database: process.env.JAMBONES_MYSQL_DATABASE,
connectionLimit: process.env.JAMBONES_MYSQL_CONNECTION_LIMIT || 10
host: JAMBONES_MYSQL_HOST,
user: JAMBONES_MYSQL_USER,
port: JAMBONES_MYSQL_PORT || 3306,
password: JAMBONES_MYSQL_PASSWORD,
database: JAMBONES_MYSQL_DATABASE,
connectionLimit: JAMBONES_MYSQL_CONNECTION_LIMIT || 10
}, logger);
const {
writeAlerts,
AlertType
} = require('@jambonz/time-series')(logger, {
host: process.env.JAMBONES_TIME_SERIES_HOST,
host: JAMBONES_TIME_SERIES_HOST,
commitSize: 50,
commitInterval: 'test' === process.env.NODE_ENV ? 7 : 20
commitInterval: 'test' === NODE_ENV ? 7 : 20
});
const {
@@ -63,7 +81,7 @@ const {
retrieveSet
} = require('@jambonz/realtimedb-helpers')({}, logger);
const interval = process.env.SBC_PUBLIC_ADDRESS_KEEP_ALIVE_IN_MILISECOND || 900000; // Default 15 minutes
const interval = SBC_PUBLIC_ADDRESS_KEEP_ALIVE_IN_MILISECOND || 900000; // Default 15 minutes
srf.locals = {
...srf.locals,
@@ -90,7 +108,7 @@ srf.locals = {
AlertType
};
srf.connect({ host: process.env.DRACHTIO_HOST, port: process.env.DRACHTIO_PORT, secret: process.env.DRACHTIO_SECRET });
srf.connect({ host: DRACHTIO_HOST, port: DRACHTIO_PORT, secret: DRACHTIO_SECRET });
srf.on('connect', (err, hp) => {
if (err) return logger.error({ err }, 'Error connecting to drachtio server');
logger.info(`connected to drachtio listening on ${hp}`);
@@ -154,7 +172,7 @@ srf.on('connect', (err, hp) => {
require('./lib/sip-trunk-register')(logger, srf);
});
if (process.env.NODE_ENV === 'test') {
if (NODE_ENV === 'test') {
srf.on('error', (err) => {
logger.info(err, 'Error connecting to drachtio');
});

55
lib/config.js Normal file
View File

@@ -0,0 +1,55 @@
/* MYSQL */
const JAMBONES_MYSQL_HOST = process.env.JAMBONES_MYSQL_HOST;
const JAMBONES_MYSQL_USER = process.env.JAMBONES_MYSQL_USER;
const JAMBONES_MYSQL_PORT = process.env.JAMBONES_MYSQL_PORT;
const JAMBONES_MYSQL_PASSWORD = process.env.JAMBONES_MYSQL_PASSWORD;
const JAMBONES_MYSQL_DATABASE = process.env.JAMBONES_MYSQL_DATABASE;
const JAMBONES_MYSQL_CONNECTION_LIMIT = process.env.JAMBONES_MYSQL_CONNECTION_LIMIT;
/* Redis */
const JAMBONES_REDIS_SENTINELS = process.env.JAMBONES_REDIS_SENTINELS;
const JAMBONES_REDIS_SENTINEL_MASTER_NAME = process.env.JAMBONES_REDIS_SENTINEL_MASTER_NAME;
const JAMBONES_REDIS_HOST = process.env.JAMBONES_REDIS_HOST;
const JAMBONES_REDIS_PORT = process.env.JAMBONES_REDIS_PORT;
/* DRACHTIO */
const DRACHTIO_HOST = process.env.DRACHTIO_HOST;
const DRACHTIO_PORT = process.env.DRACHTIO_PORT;
const DRACHTIO_SECRET = process.env.DRACHTIO_SECRET;
/* Application */
const JAMBONES_TIME_SERIES_HOST = process.env.JAMBONES_TIME_SERIES_HOST;
const JAMBONES_LOGLEVEL = process.env.JAMBONES_LOGLEVEL;
const NODE_ENV = process.env.NODE_ENV;
const SBC_PUBLIC_ADDRESS_KEEP_ALIVE_IN_MILISECOND = process.env.SBC_PUBLIC_ADDRESS_KEEP_ALIVE_IN_MILISECOND;
const JAMBONES_HOSTING = process.env.JAMBONES_HOSTING;
const EXPIRES_INTERVAL = process.env.EXPIRES_INTERVAL;
const CHECK_EXPIRES_INTERVAL = process.env.CHECK_EXPIRES_INTERVAL;
const JAMBONES_CLUSTER_ID = process.env.JAMBONES_CLUSTER_ID ;
const JAMBONES_REGBOT_CONTACT_USE_IP = process.env.JAMBONES_REGBOT_CONTACT_USE_IP;
module.exports = {
JAMBONES_MYSQL_HOST,
JAMBONES_MYSQL_USER,
JAMBONES_MYSQL_PORT,
JAMBONES_MYSQL_PASSWORD,
JAMBONES_MYSQL_DATABASE,
JAMBONES_MYSQL_CONNECTION_LIMIT,
JAMBONES_REDIS_SENTINELS,
JAMBONES_REDIS_SENTINEL_MASTER_NAME,
JAMBONES_REDIS_HOST,
JAMBONES_REDIS_PORT,
DRACHTIO_HOST,
DRACHTIO_PORT,
DRACHTIO_SECRET,
JAMBONES_TIME_SERIES_HOST,
JAMBONES_LOGLEVEL,
NODE_ENV,
SBC_PUBLIC_ADDRESS_KEEP_ALIVE_IN_MILISECOND,
JAMBONES_HOSTING,
EXPIRES_INTERVAL,
CHECK_EXPIRES_INTERVAL,
JAMBONES_CLUSTER_ID,
JAMBONES_REGBOT_CONTACT_USE_IP
};

View File

@@ -1,6 +1,7 @@
const parseUri = require('drachtio-srf').parseUri;
const debug = require('debug')('jambonz:sbc-registrar');
const {NAT_EXPIRES} = require('./utils');
const { JAMBONES_HOSTING } = require('./config');
const initLocals = (req, res, next) => {
req.locals = req.locals || {};
@@ -77,13 +78,13 @@ const checkAccountLimits = async(req, res, next) => {
};
debug(account, `checkAccountLimits: retrieved account for realm: ${realm}`);
}
else if (process.env.JAMBONES_HOSTING) {
else if (JAMBONES_HOSTING) {
logger.debug(`checkAccountLimits: unknown sip realm ${realm}`);
logger.info(`checkAccountLimits: rejecting register for unknown sip realm: ${realm}`);
return res.send(403);
}
if ('unregister' === req.registration.type || !process.env.JAMBONES_HOSTING) return next();
if ('unregister' === req.registration.type || !JAMBONES_HOSTING) return next();
/* only check limits on the jambonz hosted platform */
const {account_sid} = account;

View File

@@ -1,4 +1,9 @@
const debug = require('debug')('jambonz:sbc-options-handler');
const {
EXPIRES_INTERVAL,
CHECK_EXPIRES_INTERVAL,
JAMBONES_CLUSTER_ID,
} = require('./config');
const fsServers = new Map();
const fsServiceUrls = new Map();
const rtpServers = new Map();
@@ -6,14 +11,14 @@ const rtpServers = new Map();
module.exports = ({srf, logger}) => {
const {stats, addToSet, removeFromSet, isMemberOfSet, retrieveSet} = srf.locals;
const setNameFs = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:active-fs`;
const setNameRtp = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:active-rtp`;
const setNameFsSeriveUrl = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:fs-service-url`;
const setNameFs = `${(JAMBONES_CLUSTER_ID || 'default')}:active-fs`;
const setNameRtp = `${(JAMBONES_CLUSTER_ID || 'default')}:active-rtp`;
const setNameFsSeriveUrl = `${(JAMBONES_CLUSTER_ID || 'default')}:fs-service-url`;
/* check for expired servers every so often */
setInterval(async() => {
const now = Date.now();
const expires = process.env.EXPIRES_INTERVAL || 60000;
const expires = EXPIRES_INTERVAL || 60000;
for (const [key, value] of fsServers) {
const duration = now - value;
if (duration > expires) {
@@ -44,7 +49,7 @@ module.exports = ({srf, logger}) => {
logger.info({members}, `expired member ${key} from ${setNameRtp} we now have ${countOfMembers}`);
}
}
}, process.env.CHECK_EXPIRES_INTERVAL || 20000);
}, CHECK_EXPIRES_INTERVAL || 20000);
/* retrieve the initial list of servers, if any, so we can watch them as well */
const _init = async() => {

View File

@@ -1,10 +1,14 @@
const debug = require('debug')('jambonz:sbc-registrar');
const {
JAMBONES_CLUSTER_ID,
JAMBONES_REGBOT_CONTACT_USE_IP
} = require('./config');
const assert = require('assert');
const short = require('short-uuid');
const DEFAULT_EXPIRES = 3600;
const MAX_INITIAL_DELAY = 15;
const REGBOT_STATUS_CHECK_INTERVAL = 60;
const regbotKey = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:regbot-token`;
const regbotKey = `${(JAMBONES_CLUSTER_ID || 'default')}:regbot-token`;
const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
let initialized = false;
@@ -38,7 +42,7 @@ class Regbot {
this.sip_realm = opts.sip_realm || opts.ipv4;
this.ipv4 = opts.ipv4;
this.port = opts.port;
this.use_public_ip_in_contact = opts.use_public_ip_in_contact || process.env.JAMBONES_REGBOT_CONTACT_USE_IP;
this.use_public_ip_in_contact = opts.use_public_ip_in_contact || JAMBONES_REGBOT_CONTACT_USE_IP;
this.fromUser = opts.from_user || this.username;
const fromDomain = opts.from_domain || this.sip_realm;

View File

@@ -1,17 +1,23 @@
const test = require('tape');
const {
JAMBONES_REDIS_HOST,
JAMBONES_REDIS_PORT,
JAMBONES_LOGLEVEL,
JAMBONES_CLUSTER_ID,
} = require('./config');
const clearModule = require('clear-module');
const exec = require('child_process').exec;
const opts = Object.assign({
timestamp: () => { return `, "time": "${new Date().toISOString()}"`; }
}, { level: process.env.JAMBONES_LOGLEVEL || 'info' });
}, { level:JAMBONES_LOGLEVEL || 'info' });
const logger = require('pino')(opts);
const {
addToSet,
removeFromSet } = require('@jambonz/realtimedb-helpers')({
host: process.env.JAMBONES_REDIS_HOST || 'localhost',
port: process.env.JAMBONES_REDIS_PORT || 6379
host: JAMBONES_REDIS_HOST || 'localhost',
port: JAMBONES_REDIS_PORT || 6379
}, logger);
const setName = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:active-sip`;
const setName = `${(JAMBONES_CLUSTER_ID || 'default')}:active-sip`;
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
@@ -124,7 +130,7 @@ test('trunk register with sbc public IP address', (t) => {
clearModule.all();
const { srf } = require('../app');
t.timeoutAfter(60000);
process.env.JAMBONES_REGBOT_CONTACT_USE_IP = true;
JAMBONES_REGBOT_CONTACT_USE_IP = true;
addToSet(setName, "172.39.0.10:5060");
connect(srf)