Daemon to log AMI events

Hi folks,

I’m trying to make php daemon that logs answered calls to DB and when the call finished to delete them. I guess I’m reaching some timeouts. My script exits around 23 o’clock (when the PBX is idle). I’m making some checks about the DB timeout, how to be sure that the script will not disconnect from AMI? The source:

<?php
require_once ('/var/lib/asterisk/agi-bin/phpagi/phpagi-asmanager.php');
$manager_ip = "127.0.0.1";
$username = "myuser";
$secret = "mysecret";
$dbhost = "127.0.0.1";
$dbname = "asterisk";
$dbuser = "mydbuser";
$dbpass = "mydbpass";
$dbtable = "current_calls";
$logfile = "/tmp/manager.log";

$dbcon = connect_to_db(); // initial connection

$manager = new AGI_AsteriskManager();
$con = $manager->connect($manager_ip,$username,$secret);
$manager->add_event_handler('bridge','dump_to_db'); //insert all answered calls
$manager->add_event_handler('hangup','dump_to_db'); // delete the corresponding anwered calls
$manager->Events("on");

function connect_to_db() {
	global $dbhost, $dbuser, $dbpass, $dbname;
	
	$dbcon = mysql_pconnect($dbhost,$dbuser,$dbpass);
	if (!$dbcon) {
		logger(mysql_error());
		exit();
	}
	$dbsel = mysql_select_db($dbname);
	if (!$dbsel) {
		logger(mysql_error());
		exit();
	}
	
	return $dbcon;
}

function dump_to_db($ecode, $data, $server, $port) {
	global $dbcon, $dbtable;
	
	check_db($dbcon); // check if we lost the connection and create if necessary 
	
	logger(print_r($data,true));
	
	$event = $data['Event'];
	if ($event == "Bridge") {
		if (($data['Bridgestate'] != "Link") || ($data['Bridgetype'] != "core")) {
			return;
		}
		
		$channel1 = mysql_real_escape_string($data['Channel1']);
		$channel2 = mysql_real_escape_string($data['Channel2']);
		$uniqueid1 = mysql_real_escape_string($data['Uniqueid1']);
		$uniqueid2 = mysql_real_escape_string($data['Uniqueid2']);
		$callerid1 = preg_replace('/[^0-9+]/','',$data['CallerID1']);
		$callerid2 = preg_replace('/[^0-9+]/','',$data['CallerID2']);
		//$callerid1 = mysql_real_escape_string($data['CallerID1']);
		//$callerid2 = mysql_real_escape_string($data['CallerID2']);
		

		$sql = "INSERT INTO `$dbtable` (";
		$sql .= "`channel1`,";
		$sql .= "`channel2`,";
		$sql .= "`uniqueid1`,";
		$sql .= "`uniqueid2`,";
		$sql .= "`callerid1`,";
		$sql .= "`callerid2`";
		
		$sql .= ") VALUES (";
		$sql .= "'$channel1',";
		$sql .= "'$channel2',";
		$sql .= "'$uniqueid1',";
		$sql .= "'$uniqueid2',";
		$sql .= "'$callerid1',";
		$sql .= "'$callerid2')";
		logger($sql);
		$result = mysql_query($sql);
		if (!$result) {
			logger(mysql_error());
			exit();
		}
	} elseif ($event == "Hangup") {
		$channel = mysql_real_escape_string($data['Channel']);
		$uniqueid = mysql_real_escape_string($data['Uniqueid']);
		$callerid = preg_replace('/[^0-9]/','',$data['CallerIDNum']);
		//$callerid = mysql_real_escape_string($data['CallerIDNum']);
		

		$sql = "DELETE FROM `$dbtable` WHERE (`channel1` = '$channel' OR `channel2` = '$channel')";
		$sql .= " AND (`uniqueid1` = '$uniqueid' OR `uniqueid2` = '$uniqueid')";
		$sql .= " AND (`callerid1` = '$callerid' OR `callerid2` = '$callerid')";
		$result = mysql_query($sql);
		if (!$result) {
			logger(mysql_error());
			exit();
		}
	
	} else {
		// we handle Bridge and Hangup for now..
		return;
	}
}

function check_db($dbcon) {
	
	$status = mysql_ping($dbcon);
	if (!$status) {
		mysql_close($dbcon);
		$dbcon = connect_to_mysql();
	}
	
	return $dbcon;
}

function logger($message) {
	global $logfile;
	
	if (!empty($logfile)) {
		$handle = fopen($logfile,"a");
		$data = date("[Y-m-d H:i:s] ");
		fwrite($handle,"$data$message");
		fwrite($handle,"\n");
		fclose($handle);
	}
}
?>

OK, I’ve done it myself…

<?php
require_once '/var/lib/asterisk/agi-bin/phpagi/phpagi-asmanager.php';
$manager_ip = "127.0.0.1";
$username = "shmaize";
$secret = "mysecret";
$dbhost = "127.0.0.1";
$dbname = "asterisk";
$dbuser = "asterisk";
$dbpass = "mypass";
$dbtable = "current_calls";
$logfile = "/tmp/manager.log";
$reconnect = TRUE;

$dbcon = connect_to_db(); // initial connection


$manager = new AGI_AsteriskManager();
$con = $manager->connect($manager_ip,$username,$secret);
if (!$con) {
	logger("Can't connect to manager!");
}

$manager->add_event_handler('bridge','dump_to_db'); //insert all answered calls
$manager->add_event_handler('hangup','dump_to_db'); // delete the corresponding anwered calls

$response = $manager->wait_response(TRUE);
while (!$response) {
	if ($reconnect) {
		sleep("1");
		$con = $manager->connect($manager_ip,$username,$secret);
		while (!$con) {
			sleep("1");
			$con = $manager->connect($manager_ip,$username,$secret);
		}
		$response = $manager->wait_response(TRUE);
	} else {
		exit();
	}
}

function connect_to_db() {
	global $dbhost, $dbuser, $dbpass, $dbname;
	
	$dbcon = mysql_pconnect($dbhost,$dbuser,$dbpass);
	if (!$dbcon) {
		logger(mysql_error());
		exit();
	}
	$dbsel = mysql_select_db($dbname);
	if (!$dbsel) {
		logger(mysql_error());
		exit();
	}
	
	return $dbcon;
}

function dump_to_db($ecode, $data, $server, $port) {
	global $dbcon, $dbtable;
	
	check_db($dbcon); // check if we lost the connection and create if necessary 
	

	//logger(print_r($data,true));
	
	$event = $data['Event'];
	if ($event == "Bridge") {
		if (($data['Bridgestate'] != "Link") || ($data['Bridgetype'] != "core")) {
			return;
		}
		
		$channel1 = mysql_real_escape_string($data['Channel1']);
		$channel2 = mysql_real_escape_string($data['Channel2']);
		$uniqueid1 = mysql_real_escape_string($data['Uniqueid1']);
		$uniqueid2 = mysql_real_escape_string($data['Uniqueid2']);
		$callerid1 = preg_replace('/[^0-9+]/','',$data['CallerID1']);
		$callerid2 = preg_replace('/[^0-9+]/','',$data['CallerID2']);
		//$callerid1 = mysql_real_escape_string($data['CallerID1']);
		//$callerid2 = mysql_real_escape_string($data['CallerID2']);
		

		$sql = "INSERT INTO `$dbtable` (";
		$sql .= "`channel1`,";
		$sql .= "`channel2`,";
		$sql .= "`uniqueid1`,";
		$sql .= "`uniqueid2`,";
		$sql .= "`callerid1`,";
		$sql .= "`callerid2`";
		
		$sql .= ") VALUES (";
		$sql .= "'$channel1',";
		$sql .= "'$channel2',";
		$sql .= "'$uniqueid1',";
		$sql .= "'$uniqueid2',";
		$sql .= "'$callerid1',";
		$sql .= "'$callerid2')";
		logger($sql);
		$result = mysql_query($sql);
		if (!$result) {
			logger(mysql_error());
			exit();
		}
	} elseif ($event == "Hangup") {
		$channel = mysql_real_escape_string($data['Channel']);
		$uniqueid = mysql_real_escape_string($data['Uniqueid']);
		$callerid = preg_replace('/[^0-9]/','',$data['CallerIDNum']);
		//$callerid = mysql_real_escape_string($data['CallerIDNum']);
		

		$sql = "DELETE FROM `$dbtable` WHERE (`channel1` = '$channel' OR `channel2` = '$channel')";
		$sql .= " AND (`uniqueid1` = '$uniqueid' OR `uniqueid2` = '$uniqueid')";
		$sql .= " AND (`callerid1` = '$callerid' OR `callerid2` = '$callerid')";
		$result = mysql_query($sql);
		if (!$result) {
			logger(mysql_error());
			exit();
		}
	
	} else {
		// we handle Bridge and Hangup for now..
		return;
	}
}

function check_db($dbcon) {
	
	$status = mysql_ping($dbcon);
	if (!$status) {
		mysql_close($dbcon);
		$dbcon = connect_to_db();
	}
	
	return $dbcon;
}

function logger($message) {
	global $logfile;
	
	if (!empty($logfile)) {
		$handle = fopen($logfile,"a");
		$data = date("[Y-m-d H:i:s] ");
		fwrite($handle,"$data$message");
		fwrite($handle,"\n");
		fclose($handle);
	}
}
?>