mirror of
https://github.com/jambonz/sbc-sip-sidecar.git
synced 2026-10-04 02:04:20 +00:00
centralize envs
This commit is contained in:
@@ -1,20 +1,38 @@
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
assert.ok(process.env.JAMBONES_MYSQL_HOST &&
|
const {
|
||||||
process.env.JAMBONES_MYSQL_USER &&
|
JAMBONES_MYSQL_HOST,
|
||||||
process.env.JAMBONES_MYSQL_PASSWORD &&
|
JAMBONES_MYSQL_USER,
|
||||||
process.env.JAMBONES_MYSQL_DATABASE, 'missing JAMBONES_MYSQL_XXX env vars');
|
JAMBONES_MYSQL_PASSWORD,
|
||||||
if (process.env.JAMBONES_REDIS_SENTINELS) {
|
JAMBONES_MYSQL_DATABASE,
|
||||||
assert.ok(process.env.JAMBONES_REDIS_SENTINEL_MASTER_NAME,
|
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');
|
'missing JAMBONES_REDIS_SENTINEL_MASTER_NAME env var, JAMBONES_REDIS_SENTINEL_PASSWORD env var is optional');
|
||||||
} else {
|
} 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(DRACHTIO_HOST, 'missing DRACHTIO_HOST env var');
|
||||||
assert.ok(process.env.DRACHTIO_PORT, 'missing DRACHTIO_PORT env var');
|
assert.ok(DRACHTIO_PORT, 'missing DRACHTIO_PORT env var');
|
||||||
assert.ok(process.env.DRACHTIO_SECRET, 'missing DRACHTIO_SECRET env var');
|
assert.ok(DRACHTIO_SECRET, 'missing DRACHTIO_SECRET env var');
|
||||||
assert.ok(process.env.JAMBONES_TIME_SERIES_HOST, 'missing JAMBONES_TIME_SERIES_HOST 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 = require('drachtio-srf');
|
||||||
const srf = new Srf();
|
const srf = new Srf();
|
||||||
const StatsCollector = require('@jambonz/stats-collector');
|
const StatsCollector = require('@jambonz/stats-collector');
|
||||||
@@ -36,20 +54,20 @@ const {
|
|||||||
updateVoipCarriersRegisterStatus,
|
updateVoipCarriersRegisterStatus,
|
||||||
lookupClientByAccountAndUsername
|
lookupClientByAccountAndUsername
|
||||||
} = require('@jambonz/db-helpers')({
|
} = require('@jambonz/db-helpers')({
|
||||||
host: process.env.JAMBONES_MYSQL_HOST,
|
host: JAMBONES_MYSQL_HOST,
|
||||||
user: process.env.JAMBONES_MYSQL_USER,
|
user: JAMBONES_MYSQL_USER,
|
||||||
port: process.env.JAMBONES_MYSQL_PORT || 3306,
|
port: JAMBONES_MYSQL_PORT || 3306,
|
||||||
password: process.env.JAMBONES_MYSQL_PASSWORD,
|
password: JAMBONES_MYSQL_PASSWORD,
|
||||||
database: process.env.JAMBONES_MYSQL_DATABASE,
|
database: JAMBONES_MYSQL_DATABASE,
|
||||||
connectionLimit: process.env.JAMBONES_MYSQL_CONNECTION_LIMIT || 10
|
connectionLimit: JAMBONES_MYSQL_CONNECTION_LIMIT || 10
|
||||||
}, logger);
|
}, logger);
|
||||||
const {
|
const {
|
||||||
writeAlerts,
|
writeAlerts,
|
||||||
AlertType
|
AlertType
|
||||||
} = require('@jambonz/time-series')(logger, {
|
} = require('@jambonz/time-series')(logger, {
|
||||||
host: process.env.JAMBONES_TIME_SERIES_HOST,
|
host: JAMBONES_TIME_SERIES_HOST,
|
||||||
commitSize: 50,
|
commitSize: 50,
|
||||||
commitInterval: 'test' === process.env.NODE_ENV ? 7 : 20
|
commitInterval: 'test' === NODE_ENV ? 7 : 20
|
||||||
});
|
});
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -63,7 +81,7 @@ const {
|
|||||||
retrieveSet
|
retrieveSet
|
||||||
} = require('@jambonz/realtimedb-helpers')({}, logger);
|
} = 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 = {
|
||||||
...srf.locals,
|
...srf.locals,
|
||||||
@@ -90,7 +108,7 @@ srf.locals = {
|
|||||||
AlertType
|
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) => {
|
srf.on('connect', (err, hp) => {
|
||||||
if (err) return logger.error({ err }, 'Error connecting to drachtio server');
|
if (err) return logger.error({ err }, 'Error connecting to drachtio server');
|
||||||
logger.info(`connected to drachtio listening on ${hp}`);
|
logger.info(`connected to drachtio listening on ${hp}`);
|
||||||
@@ -154,7 +172,7 @@ srf.on('connect', (err, hp) => {
|
|||||||
require('./lib/sip-trunk-register')(logger, srf);
|
require('./lib/sip-trunk-register')(logger, srf);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'test') {
|
if (NODE_ENV === 'test') {
|
||||||
srf.on('error', (err) => {
|
srf.on('error', (err) => {
|
||||||
logger.info(err, 'Error connecting to drachtio');
|
logger.info(err, 'Error connecting to drachtio');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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
|
||||||
|
};
|
||||||
+3
-2
@@ -1,6 +1,7 @@
|
|||||||
const parseUri = require('drachtio-srf').parseUri;
|
const parseUri = require('drachtio-srf').parseUri;
|
||||||
const debug = require('debug')('jambonz:sbc-registrar');
|
const debug = require('debug')('jambonz:sbc-registrar');
|
||||||
const {NAT_EXPIRES} = require('./utils');
|
const {NAT_EXPIRES} = require('./utils');
|
||||||
|
const { JAMBONES_HOSTING } = require('./config');
|
||||||
|
|
||||||
const initLocals = (req, res, next) => {
|
const initLocals = (req, res, next) => {
|
||||||
req.locals = req.locals || {};
|
req.locals = req.locals || {};
|
||||||
@@ -77,13 +78,13 @@ const checkAccountLimits = async(req, res, next) => {
|
|||||||
};
|
};
|
||||||
debug(account, `checkAccountLimits: retrieved account for realm: ${realm}`);
|
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.debug(`checkAccountLimits: unknown sip realm ${realm}`);
|
||||||
logger.info(`checkAccountLimits: rejecting register for unknown sip realm: ${realm}`);
|
logger.info(`checkAccountLimits: rejecting register for unknown sip realm: ${realm}`);
|
||||||
return res.send(403);
|
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 */
|
/* only check limits on the jambonz hosted platform */
|
||||||
const {account_sid} = account;
|
const {account_sid} = account;
|
||||||
|
|||||||
+10
-5
@@ -1,4 +1,9 @@
|
|||||||
const debug = require('debug')('jambonz:sbc-options-handler');
|
const debug = require('debug')('jambonz:sbc-options-handler');
|
||||||
|
const {
|
||||||
|
EXPIRES_INTERVAL,
|
||||||
|
CHECK_EXPIRES_INTERVAL,
|
||||||
|
JAMBONES_CLUSTER_ID,
|
||||||
|
} = require('./config');
|
||||||
const fsServers = new Map();
|
const fsServers = new Map();
|
||||||
const fsServiceUrls = new Map();
|
const fsServiceUrls = new Map();
|
||||||
const rtpServers = new Map();
|
const rtpServers = new Map();
|
||||||
@@ -6,14 +11,14 @@ const rtpServers = new Map();
|
|||||||
module.exports = ({srf, logger}) => {
|
module.exports = ({srf, logger}) => {
|
||||||
const {stats, addToSet, removeFromSet, isMemberOfSet, retrieveSet} = srf.locals;
|
const {stats, addToSet, removeFromSet, isMemberOfSet, retrieveSet} = srf.locals;
|
||||||
|
|
||||||
const setNameFs = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:active-fs`;
|
const setNameFs = `${(JAMBONES_CLUSTER_ID || 'default')}:active-fs`;
|
||||||
const setNameRtp = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:active-rtp`;
|
const setNameRtp = `${(JAMBONES_CLUSTER_ID || 'default')}:active-rtp`;
|
||||||
const setNameFsSeriveUrl = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:fs-service-url`;
|
const setNameFsSeriveUrl = `${(JAMBONES_CLUSTER_ID || 'default')}:fs-service-url`;
|
||||||
|
|
||||||
/* check for expired servers every so often */
|
/* check for expired servers every so often */
|
||||||
setInterval(async() => {
|
setInterval(async() => {
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
const expires = process.env.EXPIRES_INTERVAL || 60000;
|
const expires = EXPIRES_INTERVAL || 60000;
|
||||||
for (const [key, value] of fsServers) {
|
for (const [key, value] of fsServers) {
|
||||||
const duration = now - value;
|
const duration = now - value;
|
||||||
if (duration > expires) {
|
if (duration > expires) {
|
||||||
@@ -44,7 +49,7 @@ module.exports = ({srf, logger}) => {
|
|||||||
logger.info({members}, `expired member ${key} from ${setNameRtp} we now have ${countOfMembers}`);
|
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 */
|
/* retrieve the initial list of servers, if any, so we can watch them as well */
|
||||||
const _init = async() => {
|
const _init = async() => {
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
const debug = require('debug')('jambonz:sbc-registrar');
|
const debug = require('debug')('jambonz:sbc-registrar');
|
||||||
|
const {
|
||||||
|
JAMBONES_CLUSTER_ID,
|
||||||
|
JAMBONES_REGBOT_CONTACT_USE_IP
|
||||||
|
} = require('./config');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const short = require('short-uuid');
|
const short = require('short-uuid');
|
||||||
const DEFAULT_EXPIRES = 3600;
|
const DEFAULT_EXPIRES = 3600;
|
||||||
const MAX_INITIAL_DELAY = 15;
|
const MAX_INITIAL_DELAY = 15;
|
||||||
const REGBOT_STATUS_CHECK_INTERVAL = 60;
|
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));
|
const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
let initialized = false;
|
let initialized = false;
|
||||||
|
|
||||||
@@ -38,7 +42,7 @@ class Regbot {
|
|||||||
this.sip_realm = opts.sip_realm || opts.ipv4;
|
this.sip_realm = opts.sip_realm || opts.ipv4;
|
||||||
this.ipv4 = opts.ipv4;
|
this.ipv4 = opts.ipv4;
|
||||||
this.port = opts.port;
|
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;
|
this.fromUser = opts.from_user || this.username;
|
||||||
const fromDomain = opts.from_domain || this.sip_realm;
|
const fromDomain = opts.from_domain || this.sip_realm;
|
||||||
|
|||||||
+11
-5
@@ -1,17 +1,23 @@
|
|||||||
const test = require('tape');
|
const test = require('tape');
|
||||||
|
const {
|
||||||
|
JAMBONES_REDIS_HOST,
|
||||||
|
JAMBONES_REDIS_PORT,
|
||||||
|
JAMBONES_LOGLEVEL,
|
||||||
|
JAMBONES_CLUSTER_ID,
|
||||||
|
} = require('./config');
|
||||||
const clearModule = require('clear-module');
|
const clearModule = require('clear-module');
|
||||||
const exec = require('child_process').exec;
|
const exec = require('child_process').exec;
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
timestamp: () => { return `, "time": "${new Date().toISOString()}"`; }
|
timestamp: () => { return `, "time": "${new Date().toISOString()}"`; }
|
||||||
}, { level: process.env.JAMBONES_LOGLEVEL || 'info' });
|
}, { level:JAMBONES_LOGLEVEL || 'info' });
|
||||||
const logger = require('pino')(opts);
|
const logger = require('pino')(opts);
|
||||||
const {
|
const {
|
||||||
addToSet,
|
addToSet,
|
||||||
removeFromSet } = require('@jambonz/realtimedb-helpers')({
|
removeFromSet } = require('@jambonz/realtimedb-helpers')({
|
||||||
host: process.env.JAMBONES_REDIS_HOST || 'localhost',
|
host: JAMBONES_REDIS_HOST || 'localhost',
|
||||||
port: process.env.JAMBONES_REDIS_PORT || 6379
|
port: JAMBONES_REDIS_PORT || 6379
|
||||||
}, logger);
|
}, logger);
|
||||||
const setName = `${(process.env.JAMBONES_CLUSTER_ID || 'default')}:active-sip`;
|
const setName = `${(JAMBONES_CLUSTER_ID || 'default')}:active-sip`;
|
||||||
|
|
||||||
process.on('unhandledRejection', (reason, p) => {
|
process.on('unhandledRejection', (reason, p) => {
|
||||||
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
||||||
@@ -124,7 +130,7 @@ test('trunk register with sbc public IP address', (t) => {
|
|||||||
clearModule.all();
|
clearModule.all();
|
||||||
const { srf } = require('../app');
|
const { srf } = require('../app');
|
||||||
t.timeoutAfter(60000);
|
t.timeoutAfter(60000);
|
||||||
process.env.JAMBONES_REGBOT_CONTACT_USE_IP = true;
|
JAMBONES_REGBOT_CONTACT_USE_IP = true;
|
||||||
addToSet(setName, "172.39.0.10:5060");
|
addToSet(setName, "172.39.0.10:5060");
|
||||||
|
|
||||||
connect(srf)
|
connect(srf)
|
||||||
|
|||||||
Reference in New Issue
Block a user