yate/share/scripts/detector.php

197 lines
5.1 KiB
PHP
Executable File

#!/usr/bin/php -q
<?php
/**
* detector.php
* This file is part of the YATE Project http://YATE.null.ro
*
* Yet Another Telephony Engine - a fully featured software PBX and IVR
* Copyright (C) 2011-2014 Null Team
*
* This software is distributed under multiple licenses;
* see the COPYING file in the main directory for licensing
* information for this specific distribution.
*
* This use of this software may be subject to additional restrictions.
* See the LEGAL file in the main directory for details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/* Script to automatically initiate fax receiving
To test add in extmodule.conf
[scripts]
detector.php=
*/
require_once("libyate.php");
$detHelp = " detect [on|off|chanid]\r\n";
// set to true in the next line to work from startup
$detect = false;
function onCommand($l,&$retval)
{
global $detect;
if ($l == "detect") {
$retval = $detect ? "active" : "inactive";
$retval = "Fax detection on new calls is $retval\r\n";
return true;
}
if (strpos($l,"detect ") === 0) {
$d = substr($l,7);
if ($d == "on") {
$detect = true;
$retval = "Detection activated on all new calls\r\n";
return true;
}
if ($d == "off") {
$detect = false;
$retval = "Detection on new calls disabled\r\n";
return true;
}
$m = new Yate("chan.masquerade");
$m->id = ""; // don't notify about message result
$m->params["message"] = "chan.record";
$m->params["id"] = $d;
$m->params["call"] = "tone/";
$m->Dispatch();
$retval = "Starting detection on $d\r\n";
return true;
}
return false;
}
function oneCompletion(&$ret,$str,$part)
{
if (($part != "") && (strpos($str,$part) !== 0))
return;
if ($ret != "")
$ret .= "\t";
$ret .= $str;
}
function onComplete(&$ev,$l,$w)
{
if ($l == "")
oneCompletion($ev->retval,"detect",$w);
else if ($l == "help")
oneCompletion($ev->retval,"detect",$w);
else if ($l == "detect") {
oneCompletion($ev->retval,"on",$w);
oneCompletion($ev->retval,"off",$w);
$ev->params["complete"] = "channels";
}
}
function onHelp($l,&$retval)
{
global $detHelp;
if ($l) {
if ($l == "detect") {
$retval = "${detHelp}Activate, deactivate or query status of fax detection\r\n";
return true;
}
return false;
}
$retval .= $detHelp;
return false;
}
function onExecute($id,$ev)
{
if (!$id)
return;
if (strpos($id,"fax/") === 0)
return;
if (strpos($ev->GetValue("callto"),"fax/") === 0)
return;
$num = $ev->GetValue("billid") . "_" .$ev->GetValue("caller") . "-" . $ev->GetValue("called");
$m = new Yate("chan.masquerade");
$m->id = ""; // don't notify about message result
$m->params["message"] = "chan.attach";
$m->params["id"] = $id;
$m->params["sniffer"] = "tone/*";
$m->params["fax_divert"] = "fax/receive/spool/$num.tif";
$m->Dispatch();
Yate::Output("Starting detection on $id");
}
function onFax($id)
{
Yate::Output("Fax call detected on $id");
$m = new Yate("chan.masquerade");
$m->id = ""; // don't notify about message result
$m->params["message"] = "call.execute";
$m->params["id"] = $id;
// FIXME: generate an unique name for each call
$m->params["callto"] = "fax/receive/spool/fax-rx.tif";
$m->params["reason"] = "fax";
$m->Dispatch();
}
/* Always the first action to do */
Yate::Init();
Yate::SetLocal("trackparam","detector.php");
Yate::Install("engine.command",85);
Yate::Install("engine.help",125);
Yate::Install("call.execute",25);
Yate::Install("call.fax",25);
/* Create and dispatch an initial test message */
/* The main loop. We pick events and handle them */
for (;;) {
$ev=Yate::GetEvent();
/* If Yate disconnected us then exit cleanly */
if ($ev === false)
break;
/* Empty events are normal in non-blocking operation.
This is an opportunity to do idle tasks and check timers */
if ($ev === true) {
continue;
}
/* If we reached here we should have a valid object */
switch ($ev->type) {
case "incoming":
switch ($ev->name) {
case "engine.command":
if ($ev->GetValue("line"))
$ev->handled = onCommand($ev->GetValue("line"),$ev->retval);
else
onComplete($ev,$ev->GetValue("partline"),$ev->GetValue("partword"));
break;
case "engine.help":
$ev->handled = onHelp($ev->GetValue("line"),$ev->retval);
break;
case "call.execute":
if ($detect && $ev->GetValue("callto"))
onExecute($ev->GetValue("id"),$ev);
break;
case "call.fax":
onFax($ev->GetValue("id"));
break;
}
$ev->Acknowledge();
break;
case "answer":
Yate::Debug("PHP Answered: " . $ev->name . " id: " . $ev->id);
break;
case "installed":
Yate::Debug("PHP Installed: " . $ev->name);
break;
case "uninstalled":
Yate::Debug("PHP Uninstalled: " . $ev->name);
break;
default:
Yate::Output("PHP Event: " . $ev->type);
}
}
Yate::Output("PHP: bye!");
/* vi: set ts=8 sw=4 sts=4 noet: */
?>