#!/usr/bin/php -q
<?php
include('HTTP/Request.php'); // requires php5-pear-http_request
include('tableExtractor.class.php');
// (c) 2008 Olaf Winkler ([email protected])
// Preisabfrage zu Rufnummer bei übergebenem BM-Provider
// Ergebnis: Preis unter Berücksichtigung von Freedays und wahlfähige Rufnummer
//Variablendeklarationen
// argv[1] zu tarifierende Rufnummer
// argv[2] mit Freedays (1=ja, 0=nein)
// argv[3] Domäne des BM-Clones
// Beispiel: bmpreis.php 001540123456 1 voipcheap.com -> Ergebnis 0|001540123456
$myiac='00'; // eigener Code für internationale Anrufe
$mynac='0'; // eigener Code für nationale Ferngespräche
$mycc=49; // eigener Ländercode
$myndc=30; // eigene Vorwahl ohne 0
$dbhost="localhost"; // MYSQL-Host
$dbuser="asterisk"; // MYSQL-User
$dbpass="asterisk"; // MYSQL Passwort
$dbschema="asterisk"; // MYSQL DB
// Ende der Variablendeklaration
// Beginn Code
function usage($prob) {
echo "bmpreis.php 2008 by Olaf Winkler <[email protected])\n\n";
switch ($prob) {
case 0: echo "Fehlerhafte Anzahl Parameter\n";
break;
case 1: echo "Fehlerhafte Rufnummer, nur Ziffern und + erlaubt\n";
break;
case 2: echo "Fehlerhafter Freedays-Parameter, nur 0 (ohne Freedays) oder 1 (mit Freedays) erlaubt\n";
break;
case 3: echo "Fehlerhafte betamax-Domäne. Angabe immer in Form der Domäne, also z.B.: voipcheap.com oder nonoh.net\n";
break;
}
echo "Aufruf: bmpreis.php <Rufnummer> <Freedays> <domain>\n";
echo "Beispiel: bmpreis.php 001540123456 1 voipcheap.com\n";
exit(0);
}
function error($line,$file,$str,$mysql_err="") {
$str = "Fehler in Zeile ".$line." in ".$file.": ".$str;
if($mysql_err) $str .= " - MySQL meldet: ".$mysql_err;
print $str."\n";
connmysql(1);
exit;
}
function connmysql($mode,$host="",$user="",$pass="",$schema="") {
global $db, $dbhost, $dbuser, $dbpass, $dbschema;
if ($mode == 0 ) {
// connect to mysql
$db = @mysql_pconnect($host,$user,$pass) or error(__LINE__,__FILE__,"Verbindung zur Datenbank fehlgeschlagen: ".$user."@".$host);
mysql_query('SET CHARACTER SET utf8;');
mysql_select_db($schema,$db) or error(__LINE__,__FILE__,"Konnte Datenbank nicht auswählen: ".$schema);
} else {
mysql_close($db);
unset($db);unset($dbhost);unset($dbuser);unset($dbpass);unset($dbschema);
}
}
function betamax_number($anum) {
global $myiac,$mynac,$mycc,$myndc;
$result='';
if ( preg_match('/^\+/',"$anum") ) {
# International +-Format
$result=preg_replace('/^\+/','00',$anum);
} elseif ( preg_match('/^'.$myiac.'/',$anum) ) {
# international IAC-Format
$result=preg_replace('/^'.$myiac.'/','00',$anum);
} elseif ( preg_match('/^'.$mynac.'/',$anum) ) {
# national calls long diatance
$result=preg_replace('/^'.$mynac.'/','00'.$mycc,$anum);
} else {
# local call
$result = '00'.$mycc.$myndc.$anum;
}
return $result;
}
function check_params($argv,$argc) {
if ($argc != 4) {
usage(0);
}
if (preg_replace('/[0-9+]/','',$argv[1]) != '') {
usage(1);
} else {
$number=betamax_number($argv[1]);
}
if (( $argv[2] != 0 ) && ( $argv[2] != 1 )) {
usage(2);
}
if (! (preg_match('/^[0-9a-zA-Z]*\.[a-zA-Z]{3}$/',$argv[3]))) {
usage(3);
} else {
$url='http://www.'.$argv[3].'/en/calling-rates.html';
}
return array($number,$argv[2],$url);
}
function get_zones($number) {
global $db;
$found=false;
for ($j=10;$j>=4;$j--) {
$check=substr($number,0,$j);
$result = mysql_query("select zone,alt_zone from bm_zones where exten='".$check."'") or error(__LINE__,__FILE__,"Konnte nicht nach Rufnummer suchen",mysql_error());
if(mysql_num_rows($result) != 0) {
$z1 = mysql_result($result,0,0);
$z2 = mysql_result($result,0,1);
$found=true;
break;
}
}
if ($found) {
if ($z1 == "not reachable") {
return array('','');
} else {
return array($z1,$z2);
}
} else {
return array('','');
}
}
function get_rate($number,$mode,$url,$zone,$zonec,$anchor="id=\"ratestableL\"",$site=0){
global $foundrate;
if ($site == 0) {
$body = &new HTTP_Request($url);
$body->sendRequest();
$site=$body->getResponseBody();
}
$tx = new tableExtractor;
$tx->source=$site;
$tx->anchor=$anchor;
$tx->anchorWithin=true;
$tx->headerRow=false;
$tx->stripTags=true;
$ta=$tx->extractTable();
$foundrate=false;
foreach ($ta as $dest) {
if ( preg_match('/[\(\[]/',$dest[1])) {
$rate=0;
$zon=strtolower(preg_replace('/\ \ /',' ',preg_replace('/\ SuperDeal.*/i','',preg_replace('/\&\;/','&',preg_replace('/\(/',' (',$dest[1])))));
if ( ($zon == $zone) || ($zon == $zonec) ) {
$rate=$dest[2];
if (preg_match('/FREE.*/i',$rate)) {
$rate=0;
if ($mode == '0' ) {
// check rate without freedays
$rate=get_rate($number,2,str_replace('calling-rates.html','freetrial.html',$url),$zone,$zonec);
if ($rate == "0" ) { $rate=get_rate($number,2,str_replace('calling-rates.html','freetrial.html',$url),$zone,$zonec,"id=\"ratestableR\"",$site);}
}
}
$foundrate=true;
break;
}
}
}
if ($mode != 2) {$rate=$rate*100;}
return $rate;
}
#Check params
list($number,$mode,$url)=check_params($argv,$argc);
#Connectierung
connmysql(0,$dbhost,$dbuser,$dbpass,$dbschema);
#Programlogik
$foundrate=false;
list($zone,$zonec)=get_zones($number);
if ( $zone != '' ) {
$rate=get_rate($number,$mode,$url,$zone,$zonec);
if ($foundrate) {
print $number." -> ".$zone." Kosten: ".$rate." EURC/min\n";
} else {
print $number." -> ist über diesen Anbieter nicht erreichbar\n";
}
} else {
print $number." -> ist über diesen Anbieter nicht erreichbar\n";
}
#Disconnects
connmysql(1);
#End
exit(0);
?>