Write options ping failure alert once (#88)

* updated realtimedb-helper to 0.8.13

* Do not write an alert for every failure if OPTIONS ping failure alrert is already written
https://github.com/jambonz/sbc-sip-sidecar/issues/87
This commit is contained in:
rammohan-y
2025-03-27 16:45:47 +05:30
committed by GitHub
parent ee2d1879eb
commit 2cabf29e6f
2 changed files with 53 additions and 20 deletions
+32 -19
View File
@@ -1,4 +1,4 @@
const { addSipGatewayToBlacklist } = require('./utils'); const { addSipGatewayToBlacklist, removeSipGatewayFromBlacklist, isSipGatewayBlacklisted } = require('./utils');
const send_options_gateways = []; const send_options_gateways = [];
const send_options_bots = []; const send_options_bots = [];
@@ -12,6 +12,7 @@ class OptionsBot {
this.port = gateway.port; this.port = gateway.port;
this.protocol = gateway.protocol; this.protocol = gateway.protocol;
this.expiry = (process.env.SEND_OPTIONS_PING_INTERVAL || 60); this.expiry = (process.env.SEND_OPTIONS_PING_INTERVAL || 60);
this.blacklist_expiry = (process.env.OPTIONS_PING_TTL || 300);
const useSipsScheme = gateway.protocol.includes('tls') && gateway.use_sips_scheme; const useSipsScheme = gateway.protocol.includes('tls') && gateway.use_sips_scheme;
const isIPv4 = /[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/.test(gateway.ipv4); const isIPv4 = /[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/.test(gateway.ipv4);
@@ -34,29 +35,41 @@ class OptionsBot {
req.on('response', async(res) => { req.on('response', async(res) => {
if (res.status !== 200) { if (res.status !== 200) {
this.logger.info(`Received Options response ${res.status} for ${this.uri}`); this.logger.info(`Received Options response ${res.status} for ${this.uri}`);
await addSipGatewayToBlacklist(realtimeDbHelpers.client, logger, this.sip_gateway_sid, this.expiry); // Check if the SIP gateway is not already blacklisted
const carrier = await lookupCarrierBySid(this.voip_carrier_sid); if (!await isSipGatewayBlacklisted(realtimeDbHelpers.client, logger, this.sip_gateway_sid)) {
if (carrier) { // Add the gateway to the blacklist since it failed the OPTIONS ping
writeAlerts({ await addSipGatewayToBlacklist(realtimeDbHelpers.client, logger, this.sip_gateway_sid,
account_sid: carrier.account_sid, this.blacklist_expiry);
service_provider_sid: carrier.service_provider_sid, const carrier = await lookupCarrierBySid(this.voip_carrier_sid);
// eslint-disable-next-line max-len if (carrier) {
message: `Options ping ${this.ipv4}${this.port ? `:${this.port}` : ''};transport=${this.protocol} unsuccessfully, received: ${res.status}` writeAlerts({
}); account_sid: carrier.account_sid,
service_provider_sid: carrier.service_provider_sid,
// eslint-disable-next-line max-len
message: `Options ping ${this.ipv4}${this.port ? `:${this.port}` : ''};transport=${this.protocol} unsuccessfully, received: ${res.status}`
});
}
}
} else {
// If the gateway is blacklisted, remove it from the blacklist as we have successfully pinged it
if (await isSipGatewayBlacklisted(realtimeDbHelpers.client, logger, this.sip_gateway_sid)) {
await removeSipGatewayFromBlacklist(realtimeDbHelpers.client, logger, this.sip_gateway_sid);
} }
} }
}); });
} catch (err) { } catch (err) {
this.logger.error({ err }, `Error Options ping to ${this.uri}`); this.logger.error({ err }, `Error Options ping to ${this.uri}`);
await addSipGatewayToBlacklist(realtimeDbHelpers.client, logger, this.sip_gateway_sid, this.expiry); if (!await isSipGatewayBlacklisted(realtimeDbHelpers.client, logger, this.sip_gateway_sid)) {
const carrier = await lookupCarrierBySid(this.voip_carrier_sid); await addSipGatewayToBlacklist(realtimeDbHelpers.client, logger, this.sip_gateway_sid, this.blacklist_expiry);
if (carrier) { const carrier = await lookupCarrierBySid(this.voip_carrier_sid);
writeAlerts({ if (carrier) {
account_sid: carrier.account_sid, writeAlerts({
service_provider_sid: carrier.service_provider_sid, account_sid: carrier.account_sid,
// eslint-disable-next-line max-len service_provider_sid: carrier.service_provider_sid,
message: `Options ping ${this.ipv4}${this.port ? `:${this.port}` : ''};transport=${this.protocol} unsuccessfully, error: ${err}` // eslint-disable-next-line max-len
}); message: `Options ping ${this.ipv4}${this.port ? `:${this.port}` : ''};transport=${this.protocol} unsuccessfully, error: ${err}`
});
}
} }
} }
} }
+21 -1
View File
@@ -20,13 +20,31 @@ function makeBlacklistGatewayKey(key) {
async function addSipGatewayToBlacklist(client, logger, sip_gateway_sid, expired) { async function addSipGatewayToBlacklist(client, logger, sip_gateway_sid, expired) {
try { try {
await client.setex(makeBlacklistGatewayKey(sip_gateway_sid), expired, ''); await client.setex(makeBlacklistGatewayKey(sip_gateway_sid), expired, '1');
logger.info(`addSipGatewayToBlacklist: added ${sip_gateway_sid} to blacklist`); logger.info(`addSipGatewayToBlacklist: added ${sip_gateway_sid} to blacklist`);
} catch (err) { } catch (err) {
logger.error({err}, `addSipGatewayToBlacklist: Error add ${sip_gateway_sid} to blacklist`); logger.error({err}, `addSipGatewayToBlacklist: Error add ${sip_gateway_sid} to blacklist`);
} }
} }
async function removeSipGatewayFromBlacklist(client, logger, sip_gateway_sid) {
try {
await client.del(makeBlacklistGatewayKey(sip_gateway_sid));
logger.info(`removeSipGatewayFromBlacklist: removed ${sip_gateway_sid} from blacklist`);
} catch (err) {
logger.error({err}, `removeSipGatewayFromBlacklist: Error removing ${sip_gateway_sid} from blacklist`);
}
}
async function isSipGatewayBlacklisted(client, logger, sip_gateway_sid) {
try {
const exists = await client.get(makeBlacklistGatewayKey(sip_gateway_sid));
return exists === '1';
} catch (err) {
logger.error({err}, `isSipGatewayBlacklisted: Error checking if ${sip_gateway_sid} is blacklisted`);
return false;
}
}
/* Regex pattern to match valid IPv4 addresses (0.0.0.0 to 255.255.255.255) */ /* Regex pattern to match valid IPv4 addresses (0.0.0.0 to 255.255.255.255) */
const ipv4Pattern = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; const ipv4Pattern = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
@@ -58,6 +76,8 @@ module.exports = {
isUacBehindNat, isUacBehindNat,
getSipProtocol, getSipProtocol,
addSipGatewayToBlacklist, addSipGatewayToBlacklist,
removeSipGatewayFromBlacklist,
isSipGatewayBlacklisted,
NAT_EXPIRES: 30, NAT_EXPIRES: 30,
isValidIPv4, isValidIPv4,
isValidDomainOrIP, isValidDomainOrIP,