#!/usr/bin/php -q
<?php
/**********************************************************************************************************************/
/* */
/* CallMonitor helper Script - liest Call Events von einer FritzBox */
/* Script Version: 1.0.2 vom 01.12.2015 */
/* Script Autor: obelix76, [email protected] */
/* */
/* syntax: path/to/script <Fritzbox-IP> <Fritzbox-Monitorport> */
/* */
/* Script als root über z.B. Cron starten und in regelmäßigen Abständen prüfen ob es noch läuft, ggfs. neu starten */
/* */
/**********************************************************************************************************************/
$FRITZBOX=$argv[1];
$FRITZPORT=$argv[2];
$DOLOOKUPS="true"; //führe Reverse Lookups durch
$DOTELLOWS="false"; //führe Scoreprüfung bei Tellows durch; Benötigt kostenpflichtige Partner-ID
//und API-Key in der Funktion tellows($nummer) !!!
$ORTSNETZ_self="Musterstadt"; //Für "Ortsnetzauflösung" wenn Ruf ohne Vorwahl reinkommt
//===============================================================================
function debugprint($variable){
print_r($variable."\n");
}
function zeitformat($Sekundenzahl)
{
$Sekundenzahl = abs($Sekundenzahl); // Ganzzahlwert bilden
return sprintf("%02d:%02d:%02d", ($Sekundenzahl/60/60)%24,($Sekundenzahl/60)%60,$Sekundenzahl%60);
}
function tellows($nummer){
$PARTNER = "Partner-ID";
$APIKEY = "API-KEY";
$URL = "http://www.tellows.de/basic/num/".$nummer."?xml=1&partner=".$PARTNER."&apikey=".$APIKEY;
$result = "";
if ($DOTELLOWS){
if ($nummer <> 0){
//nur abfragen, wenn eine Rufnummer mitgeliefert wird
$xml = simplexml_load_file($URL);
$result.="Score ".$xml->score;
}
return($result);
}
else{
return("Tellows Score Modul deaktiviert!");
}
}
function reverse_lookup($nummer){
$check = substr(trim($nummer),0,1);
$nummer = urlencode($nummer);
$url="http://www.dastelefonbuch.de/Rückwärtssuche/".$nummer;
$webseite = @file_get_contents($url, true);
if ($webseite === false){
//Nichts vom Telefonbuchanbieter bekommen...
//versuche, Rufnummer über lokales Telefonbuch aufzulösen
$phonebook=file('/home/pi/callmonitor/phonebook.csv');
foreach ($phonebook as $entry){
if (strpos($entry, urldecode($nummer)) !== false){
$results[]=$entry;
}
}
if (isset($results)){
$tmp=explode(";",$results[0]);
$nummer=str_replace(array("\r\n", "\r", "\n"), '', $tmp[1]);;
}
else{
//Rufnummer auch nicht im phonebook gefunden - versuche das Ortsnetz zu ermitteln und zurückzuliefern
//das ganze Gerödel nur machen, wenn das erste Zeichen der übergebenen Rufnummer eine "0" ist
if ($check=="0"){
$ovz=file('/home/pi/callmonitor/onk.txt');
for ($i = 6; $i>0; $i--){
$such=substr(urldecode($nummer), 0, $i);
foreach ($ovz as $entry){
if (strpos($entry, $such) !== false){
$results[]=$entry;
}
if (isset($results)){
break;
}
}
if (isset($results)){
break;
}
}
if (isset($results)){
$ortsnetz = explode(";",$results[0]);
$nummer = "Rufnummer unbekannt, Ortsnetz ist ".$ortsnetz[1];
$nummer = str_replace(array("\r\n", "\r", "\n"), '', $nummer);;
}
else{
//ONK gefunden - Textmeldung zurückliefern
$nummer = "Rufnummer unbekannt, Ortsnetz konnte nicht ermittelt werden";
}
}
else{
$nummer = "Rufnummer unbekannt, Ortsnetz ist $ORTSNETZ_self";
}
}
}
else{
//Parsing für "dastelefonbuch.de" - funktionierte zum Datum 20151201
$webseite=explode("<div class=\"vcard\">", $webseite);
$webseite=explode("<div class=\"contact clearfix\">", $webseite[1]);
$data_name=explode("<span itemprop=\"name\">", $webseite[0]);
$data_name=explode("</span>", $data_name[1]);
$nummer = $data_name[0];
$data_streetloc=explode("<address>", $webseite[0]);
$data_streetloc=explode("</address>", $data_streetloc[1]);
$data_street=explode("<span itemprop=\"streetAddress\">", $data_streetloc[0]);
$data_street=explode("<span itemprop=\"postalCode\">", $data_street[1]);
$data_str=explode("</span>", $data_street[0]);
$nummer.= ", ".trim($data_str[0])." ".trim($data_str[1]);
$data_plz=explode("</span>", $data_street[1]);
$nummer.= " ".trim(str_replace('</span>', '', $data_plz[0]));
$data_loc=explode("<span itemprop=\"addressLocality\">", $data_street[1]);
$data_loc=explode("</a>", $data_loc[1]);
$nummer.= " ".trim(str_replace('</span>', '', $data_loc[0]));
}
return($nummer);
}
//Start des Hauptteils des Scriptes
$client=stream_socket_client("tcp://$FRITZBOX:$FRITZPORT", $errno, $errorMessage);
if ($client === false) {
throw new UnexpectedValueException("Failed to connect: $errorMessage");
}
while(!feof($client)){
$line=fgets($client);
if (strstr($line, ";RING;")){ //Behandlung eingehender Rufe
$CALLDATA=explode(";",$line);
$NAME="";
$NR=$CALLDATA[3];
if ($DOLOOKUPS){
$NAME=reverse_lookup($NR);
}
if ($DOTELLOWS){
$TELLOWS=tellows($NR);
}
system("echo \"===new caller===\" | nc <IP> <Port>");
system("echo \"Anrufzeit: $CALLDATA[0]\" | nc <IP> <Port>");
system("echo \"Anrufer : $CALLDATA[3]\" | nc <IP> <Port>");
system("echo \"Anrufer : $NAME\" | nc <IP> <Port>");
system("echo \"Rufziel : $CALLDATA[4]\" | nc <IP> <Port>");
system("echo \"Provider : $CALLDATA[5]\" | nc <IP> <Port>");
system("echo \"Tellows : $TELLOWS\" | nc <IP> <Port>");
$wgetstring="wget -O /dev/null \"http://root:dbox2@dbox2ip/control/message?popup=Eingehender%20Anruf%0A%0AAnrufer%3A%20".$CALLDATA[3]."%0AAnrufer%3A%20".$NAME."%0Aan%20%20%20%20%20%20%20%20%3A%20".$CALLDATA[4]."\" >/dev/null 2>&1 &";
system($wgetstring);
system('logger -p 7 \"Tellows : '.$TELLOWS.'\"');
system('logger -p 7 \"Provider : '.$CALLDATA[5].'\"');
system('logger -p 7 \"Rufziel : '.$CALLDATA[4].'\"');
system('logger -p 7 \"Anrufer : '.$NAME.'\"');
system('logger -p 7 \"Anrufer : '.$CALLDATA[3].'\"');
system('logger -p 7 \"Anrufzeit: '.$CALLDATA[0].'\"');
system('logger -p 7 \"===new caller===\"');
}
if (strstr($line, ";CALL;")){ //Behandlung ausgehender Rufe
$CALLDATA=explode(";",$line);
$NAME="";
$NR=$CALLDATA[5];
if ($DOLOOKUPS){
$NAME=reverse_lookup($NR);
}
$ARGS='logger -p 7 \"Neuer ausgehender Ruf - Nebenstelle '.$CALLDATA[3].', Abgangsrufnummer: '.$CALLDATA[4].', Ziel: '.$CALLDATA[5].' ';
if (!($NAME == $NR)){
$ARGS=$ARGS.$NAME.'\"';
}
system($ARGS);
system("echo \"***new outgoing call***\" | nc <IP> <Port>");
system("echo \"Anrufzeit: $CALLDATA[0]\" | nc <IP> <Port>");
system("echo \"Ziel : $CALLDATA[5]\" | nc <IP> <Port>");
system("echo \"Ziel : $NAME\" | nc <IP> <Port>");
system("echo \"von : $CALLDATA[4]\" | nc <IP> <Port>");
system("echo \"Nebenst. : $CALLDATA[3]\" | nc <IP> <Port>");
}
if (strstr($line, ";CONNECT;")){ //Behandlung zustandegekommene Verbindung
$CALLDATA=explode(";", $line);
$ARGS='logger -p 7 \"Verbindung hergestellt: Nebenstelle '.$CALLDATA[3].', Rufnummer: '.$CALLDATA[4].', Call-ID: '.$CALLDATA[2].'\"';
system($ARGS);
}
if (strstr($line, ";DISCONNECT;")){//Behandlung beendete Verbindung
$CALLDATA=explode(";", $line);
$ARGS='logger -p 7 \"Verbindung beendet: ConnectionID '.$CALLDATA[2].', Dauer: '.zeitformat($CALLDATA[3]).' h\"';
system($ARGS);
}
}
fclose($client);
?>