Uploaded image for project: 'ZABBIX BUGS AND ISSUES'
  1. ZABBIX BUGS AND ISSUES
  2. ZBX-19344

Asterisk Template Incorrect Detection of Active Channels per Trunk

XMLWordPrintable

    • Sprint 76 (May 2021)
    • 1

      For detection of active channels per trunk following JS code is used:

      response = Ami.request(url, 'command&command=core%20show%20channels');
      channels = response.body;
      var fields = {
       active_channels: 'active channels?',
       active_calls: 'active calls?',
       calls_processed: 'calls? processed'
      };
      

       

      So first - channels is filled with result of 'core show channels' command. After that for each trunk active channels is searched in 'channels' with:

      asterisk.pjsip.trunks.forEach(function (trunk) {
       var active_channels = channels.match(new RegExp(' PJSIP/' + trunk.ObjectName.split('/')[0], 'g'));
       trunk.active_channels = (active_channels === null) ? 0 : active_channels.length;
       });
      

       

      Problem is that 'core show channels' output channel name is limited to 20 characters (including PJSIP/):

      Action: Command
      Command: core show channels
      
      Response: Success
      Message: Command output follows
      Output: Channel Location State Application(Data)
      Output: PJSIP/1000-0000004c 141@from-internal:1 Ringing AppDial((Outgoing Line))
      Output: *PJSIP/trunk_+3754478* s@macro-dial:24 Ring Dial(PJSIP/1000/sip:[email protected]
      Output: 2 active channels
      Output: 1 active call
      Output: 48 calls processed
      

       

      But trunk name is longer than that:

      Action: PJSIPShowEndpoints
      
      Response: Success
      EventList: start
      Message: A listing of Endpoints follows, presented as EndpointList events
      
      Event: EndpointList
      ObjectType: endpoint
      *ObjectName: trunk_+375447889910*
      
      <...skip...>
      
      DeviceState: Not in use
      

       

      So, if trunk naming is 'trunk_'+ full number - Active channels is always zero.

      If we use core show channels concise

      We receive following with full channel name:

      freepbxtst*CLI> core show channels concise
      PJSIP/1000-00000052!from-internal!141!1!Ringing!AppDial!(Outgoing Line)!1000!!!3!8!!1620540014.84
      *PJSIP/trunk_+375447889917-00000051*!macro-dial!s!24!Ring!Dial!PJSIP/1000/sip:[email protected]:42034;ob,15,HhtrQ(NO_ANSWER)M(auto-blkvm)b(func-apply-sipheaders^s^1),!+375296521507!!!3!9!!1620540013.83
      

       

      Also if trunk name contains reserved characters (+ in my case) in must be escaped.

      Following patch fixes that (not tested with IAX2):

      --- asterisk.js.orig 2021-02-01 18:27:04.004398291 +0300
      +++ asterisk.js 2021-05-09 09:53:01.097621580 +0300
      
      @@ -81,6 +82,10 @@
       }
       };
      
      +function escapeRegExp(text) {
      + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
      +}
      +
       function block2Object(text) {
       var fields = [],
       dict = {};
      @@ -138,7 +143,7 @@
       }
       });
       asterisk.sip.trunks.forEach(function (trunk) {
      - var active_channels = channels.match(new RegExp(' SIP/' + trunk.ObjectName.split('/')[0], 'g'));
      + var active_channels = full_channels.match(new RegExp(escapeRegExp('SIP/' + trunk.ObjectName.split('/')[0]), 'g'));
       trunk.active_channels = (active_channels === null) ? 0 : active_channels.length;
       });
       }
      @@ -166,7 +171,7 @@
       });
       asterisk.iax.online = asterisk.iax.total - asterisk.iax.offline;
       asterisk.iax.trunks.forEach(function (trunk) {
      - var active_channels = channels.match(new RegExp('( IAX2/' + trunk.ObjectName.split('/')[0] +
      + var active_channels = full_channels.match(new RegExp('( IAX2/' + trunk.ObjectName.split('/')[0] +
       '| IAX2/' + trunk.ObjectUsername + ')', 'g'));
       trunk.active_channels = (active_channels === null) ? 0 : active_channels.length;
       });
      @@ -187,11 +192,19 @@
       });
       asterisk.pjsip.available = asterisk.pjsip.total - asterisk.pjsip.unavailable;
       asterisk.pjsip.trunks.forEach(function (trunk) {
      - var active_channels = channels.match(new RegExp(' PJSIP/' + trunk.ObjectName.split('/')[0], 'g'));
      + var active_channels = full_channels.match(new RegExp(escapeRegExp('PJSIP/' + trunk.ObjectName.split('/')[0]), 'g'));
       trunk.active_channels = (active_channels === null) ? 0 : active_channels.length;
       });
       }
      
      @@ -230,6 +243,9 @@
       calls_processed: 'calls? processed'
       };
      
      +response = Ami.request(url, 'command&command=core%20show%20channels%20concise');
      +full_channels = response.body;
      +
       Object.keys(fields).forEach(function (field) {
       var match = channels.match('(\\d+) ' + fields[field]);
       if (match !== null && typeof match[1] !== 'undefined') {
      

       

            mchudinov Maxim Chudinov (Inactive)
            barzog Oleg Gawriloff
            Team INT
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: