mirror of
https://github.com/jambonz/sbc-sip-sidecar.git
synced 2025-12-19 04:27:46 +00:00
Merge pull request #49 from paulotelles/feature/centralize-envs
Centralize environment variables
This commit is contained in:
64
app.js
64
app.js
@@ -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
55
lib/config.js
Normal 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
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
@@ -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() => {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user