in the past was looking for similar task : monitor peers registration status.
ended up with a php PAMI script, running on asterisk server and listening to the events, then writes event to the mysql database for reporting and drawing charts with peer presence on a time line ( Used to track working time of the call center operators )
First - configured AMI access ( asterisk/manager.conf) ,
next - created mysql table ‘realstatus’ :
±--------------±-------------±
| Field | Type |
±--------------±-------------±
| id | int(11) |
| ts | timestamp |
| sip_name | varchar(100) |
| event_type | varchar(100) |
| event_data | varchar(100) |
| event_details | varchar(100) |
| session_time | int(11) |
±--------------±-------------±
Script, which attaches to the AMI interface and keep listening events:
<?php
ini_set('display_errors', 1);
error_reporting(1);
use PAMI\Client\Impl\ClientImpl as PamiClient;
use PAMI\Message\Event\EventMessage;
use PAMI\Listener\IEventListener;
use PAMI\Message\Event\ExtensionStatusEvent;
use PAMI\Message\Event\NewstateEvent;
use PAMI\Message\Event\StatusCompleteEvent;
use PAMI\Message\Event\StatusEvent;
require_once("vendor/autoload.php");
$pamiClientOptions = array(
'log4php.properties' => __DIR__ . '/log4php.properties',
'host' => 'localhost',
'scheme' => 'tcp://',
'port' => 5038,
'username' => 'pbx-manager-dev',
'secret' => 'p_ssw0rd',
'connect_timeout' => 100,
'read_timeout' => 10000
);
$pamiClient = new PamiClient($pamiClientOptions);
$mysqli = new mysqli("localhost","asteriskuser","asterpass","asterisk");
if($mysqli -> connect_errno)
die( "Failed to connect to MySQL: " . $mysqli -> connect_error );
// Open the connection
$pamiClient->open();
$pamiClient->registerEventListener(
function (EventMessage $event) {
GLOBAL $conf;
$last_event = $event->getKeys();
$event_type = $last_event["event"];
// echo 'Got:' . $event_type . "\n";
preg_match("/SIP\/(.*)\-/", $last_event['channel'] , $m );
$PEER = $m[1];
switch (true) {
case $event_type == 'PeerStatus' :
catchStatus($last_event,$PEER);
break;
case $event_type == 'Registry':
// Peer registration
// var_dump($last_event);
break;
case $event_type == 'DialState':
//DialState($last_event,$PEER);
break;
case $event_type == 'Newchannel':
//NewChannelEvent( $last_event, $PEER);
break;
case $event_type == 'DialEnd' :
//CallEndEvent($last_event,$PEER);
default:
# code...
break;
}
}
);
$running = true;
while($running) {
try {
$pamiClient->process();
} catch (Exception $e) {
echo $e->getMessage();
exit; // To be restarted
}
sleep(1);
}
$pamiClient->close();
function catchStatus($event,$PEER){
global $mysqli;
echo '[' . date("M j G:i:s Y") . "] " . $event['event'] . ': ' . $event['peer'] . ' : ' . $event['peerstatus'] . ' ' . $event['cause'] ;
$mysqli->query("INSERT INTO realstatus(sip_name, event_type, event_data )
VALUES('{$event['peer']}',
'{$event['event']}',
'{$event['peerstatus']}'
)") or die("Failed to insert Data:" . $mysqli->error );
$reg = mysqli_fetch_object( $mysqli->query("SELECT SEC_TO_TIME(session_time) as duration FROM realstatus WHERE id = ". $mysqli->insert_id) );
$tot = mysqli_fetch_object( $mysqli->query("SELECT SEC_TO_TIME(sum(ifnull(session_time,0))) as total FROM realstatus WHERE sip_name ='{$event['peer']}' AND datediff(ts,now()) = 0 GROUP BY sip_name" ) );
echo " [ Calculated: " . $reg->duration . ' Total today:' . $tot->total . ' ] ';
echo "\r\n";
}
function NewChannelEvent($event,$PEER){
GLOBAL $conf;
echo " New call for $PEER {$event['channel']} \r\n";
}
function CallEndEvent($event, $PEER){
GLOBAL $conf;
GLOBAL $counters;
// print_r($event);
echo " Call end for $PEER {$event['channel']} \r\n";
}
function CallStartEvent($event, $PEER){
GLOBAL $conf;
GLOBAL $counters;
//print_r($event);
echo " Call Start: $PEER {$event['channel']} \r\n";
}
function DialState($event){
//print_r($event);
$signals = array(
180 => 'RINGING',
183 => 'PROGRESS'
);
$signals_txt = array ( 'RINGING' => 180,
'PROGRESS' => 183 );
echo " DIAL STATUS: {$PEER} {$event['dialstatus']} {$signals_txt[$event['dialstatus']]} for {$event['destchannel']} \r\n";
}
To get this script running even after asterisk restart, on system boot, I’ve made initd script:
/etc/init.d/peerstatusd
#! /bin/sh
#/etc/init.d/$PROG
#
PROG=peerstatusd
SCRIPT='online.php'
LOG=/dev/null
#LOG=/var/log/peerstatus.log
# Some things that run always
touch /var/lock/
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting $PROG "
$(while true
do
sleep 1
echo " Starting $PROG .."
cd /var/www/html/ && while true; do php online.php; done >> $LOG 2>&1 || echo "Failed to start $PROG"
done) &
;;
stop)
echo "Stopping script $SCRIPT"
PID=`ps ax -o pid,cmd|grep "php ${SCRIPT}" | grep -v grep |awk '{print($1)}'`
[ "${PID}s" != "s" ] && kill -9 $PID && echo "Stopped ${SCRIPT} PID: ${PID}"
killall -9 $PROG
;;
*)
echo "Usage: /etc/init.d/$PROG {start|stop}"
exit 1
;;
esac
exit 0
enabled it by :
chkconfig peerstatusd on
logs and table records:
Mar 30 9:19:18 2020] PeerStatus: SIP/777 : Registered [ Calculated: 00:00:03 Total today:24:06:45 ]
[Mar 30 9:19:21 2020] PeerStatus: SIP/777 : Registered [ Calculated: 00:00:03 Total today:24:06:48 ]
[Mar 30 9:19:24 2020] PeerStatus: SIP/777 : Registered [ Calculated: 00:00:03 Total today:24:06:51 ]
[Mar 30 9:19:27 2020] PeerStatus: SIP/777 : Registered [ Calculated: 00:00:03 Total today:24:06:54 ]
[Mar 30 9:19:30 2020] PeerStatus: SIP/777 : Registered [ Calculated: 00:00:03 Total today:24:06:57 ]
[Mar 30 9:19:31 2020] PeerStatus: SIP/501 : Registered [ Calculated: 00:00:18 Total today:24:07:07 ]
[Mar 30 9:19:33 2020] PeerStatus: SIP/777 : Registered [ Calculated: 00:00:03 Total today:24:07:00 ]
[Mar 30 9:19:36 2020] PeerStatus: SIP/777 : Registered Killed
it shows recent registry session, and total for today in the report.
If some one interested , will answer private messages with more details