#!/usr/bin/php
<?php

$C_IP="0.0.0.0";
$C_PATH="/etc/asterisk/";
$C_ASTERISK="/usr/sbin/asterisk";
$C_SERVER1="http://44.143.70.4/voip/";
$C_SERVER2="http://44.143.78.15/voip/";
$C_SERVER3="http://44.143.40.20/voip/";
$C_MANAGERUSER="user";
$C_MANAGERPASS="pass";

error_reporting(E_ALL ^ E_NOTICE);  

$vl_reload = 0;
$vp_db = Array();

function readdb($vl_db)
{
        global $vp_db;
        foreach(explode("\r\n",$vl_db) AS $vl_dbline)
        {
                if(strlen($vl_dbline)>=4 AND strpos($vl_dbline,"END")===false)
                {
                        $vl_dbline = str_getcsv($vl_dbline);
                        $vp_db[$vl_dbline[0]][0]=$vl_dbline[0];
                        if($vl_dbline[1]!=="") { $vp_db[$vl_dbline[0]][1]=$vl_dbline[1]; }
                        if($vl_dbline[2]!=="") { $vp_db[$vl_dbline[0]][2]=$vl_dbline[2]; }
                        if($vl_dbline[3]!=="") { $vp_db[$vl_dbline[0]][3]=$vl_dbline[3]; }
                        if($vl_dbline[4]!=="") { $vp_db[$vl_dbline[0]][4]=$vl_dbline[4]; }
			if(isset($vl_dbline[6]) AND strtotime($vl_dbline[6]) > strtotime($vp_db[$vl_dbline[0]][6]))
                        {
                                $vp_db[$vl_dbline[0]][5]=$vl_dbline[5];
                                $vp_db[$vl_dbline[0]][6]=$vl_dbline[6];
			}
                }
        }
}

$vl_db = file_get_contents($C_PATH."db.csv");
readdb($vl_db);

$vl_curl=curl_init();
curl_setopt($vl_curl,CURLOPT_RETURNTRANSFER, true);
curl_setopt($vl_curl,CURLOPT_TIMEOUT,5);

if($C_SERVER3!=="")
{
	$vl_url=$C_SERVER3."/db.php";
	curl_setopt($vl_curl,CURLOPT_URL,$vl_url);
	$vl_db = curl_exec($vl_curl);
	if(strpos($vl_db,"END")!==FALSE)
	{
		readdb($vl_db);
		$vl_serveronline[3]=1;
	}
}

if($C_SERVER2!=="")
{
	$vl_url=$C_SERVER2."/db.php";
	curl_setopt($vl_curl,CURLOPT_URL,$vl_url);
	$vl_db = curl_exec($vl_curl);
        if(strpos($vl_db,"END")!==FALSE)
        {
                readdb($vl_db);
		$vl_serveronline[2]=1;
        }
}

if($C_SERVER1!=="")
{
        $vl_url=$C_SERVER1."/db.php";
        curl_setopt($vl_curl,CURLOPT_URL,$vl_url);
	$vl_db = curl_exec($vl_curl);
        if(strpos($vl_db,"END")!==FALSE)
        {
                readdb($vl_db);
		$vl_serveronline[1]=1;
        }
}

$vl_output="";
$vl_socket = fsockopen("127.0.0.1","5038");
fputs($vl_socket, "Action: Login\r\n");
fputs($vl_socket, "UserName: ".$C_MANAGERUSER."\r\n");
fputs($vl_socket, "Secret: ".$C_MANAGERPASS."\r\n");
fputs($vl_socket, "Events: off\r\n\r\n");

fputs($vl_socket, "Action: sippeers\r\n\r\n");

fputs($vl_socket, "Action: Logoff\r\n\r\n");

while (!feof($vl_socket)) {
       $vl_output .= fread($vl_socket, 8192);
}

$vl_input = explode("\r\n\r\n",$vl_output);
foreach($vl_input AS $vl_block)
{
	$vl_lines = explode("\r\n",$vl_block);
	if(isset($vl_temp)) { unset($vl_temp); }
	foreach($vl_lines AS $vl_line)
	{
		if(substr($vl_line,0,6)=="Event:")
		{
			$vl_temp['event']=substr($vl_line,7);
		}
		if(substr($vl_line,0,11)=="ObjectName:")
		{
			$vl_temp['objectname']=substr($vl_line,12);
		}
		if(substr($vl_line,0,7)=="Status:")
		{
			$vl_temp['status']=substr($vl_line,8);
		}
	}
	if(isset($vl_temp['event']) AND $vl_temp['event']=="PeerEntry")
	{
		$vl_peers[$vl_temp['objectname']]=$vl_temp;
	}
}

$vl_file="";
foreach($vl_peers AS $vl_peer)
{
        if(substr($vl_peer['status'],0,2)==="OK")
        {
		if(isset($vl_serveronline[1])) 
		{ 
	                $vl_url=$C_SERVER1."/setdest.php?number=".$vl_peer['objectname']."&ip=".$C_IP;
	                curl_setopt($vl_curl,CURLOPT_URL,$vl_url);
	                curl_exec($vl_curl);
		}
		if(isset($vl_serveronline[2]))
                {
                        $vl_url=$C_SERVER2."/setdest.php?number=".$vl_peer['objectname']."&ip=".$C_IP;
                        curl_setopt($vl_curl,CURLOPT_URL,$vl_url);
                        curl_exec($vl_curl);
                }
		if(isset($vl_serveronline[3]))
                {
                        $vl_url=$C_SERVER3."/setdest.php?number=".$vl_peer['objectname']."&ip=".$C_IP;
                        curl_setopt($vl_curl,CURLOPT_URL,$vl_url);
                        curl_exec($vl_curl);
                }
                $vl_file .= "exten => ".$vl_peer['objectname'].",1,Macro(call-sipphone,\${EXTEN})\r\n";
        }
}
curl_close($vl_curl);

$vl_oldfile = file_get_contents($C_PATH."/hamnet_dialplan.conf");
if($vl_oldfile!=$vl_file)
{
        file_put_contents($C_PATH."/hamnet_dialplan.conf", $vl_file);
        $vl_reload=1;
}

$vl_file="";
$vl_file2="";
foreach($vp_db AS $vl_account)
{
	if(strlen($vl_account[1])>2)
	{
		$vl_file .= "[".$vl_account[0]."]\r\n";
	        $vl_file .= "type=peer\r\n";
	        $vl_file .= "username=".$vl_account[0]."\r\n";
	        $vl_file .= "accountcode=".$vl_account[0]."\r\n";
	        $vl_file .= "secret=".$vl_account[1]."\r\n";
		$vl_file .= "host=dynamic\r\n";
		$vl_file .= "context=outgoing_".$vl_account[2].$vl_account[3]."\r\n";
		$vl_file .= "qualify=yes\r\n";
	        $vl_file .= "\r\n";
		$vl_outgoing[$vl_account[2].$vl_account[3]][1]=$vl_account[2];
                $vl_outgoing[$vl_account[2].$vl_account[3]][2]=$vl_account[3];
	}
	if(strlen($vl_account[5])>5 AND $vl_account[5]!==$C_IP)
	{ 
		$vl_file2 .= "exten => _".$vl_account[0].",1,dial(SIP/\${EXTEN}@".$vl_account[5].")\r\n";
	} 
}
$vl_oldfile = file_get_contents($C_PATH."/hamnet_sip.conf");
if($vl_oldfile!=$vl_file)
{
        file_put_contents($C_PATH."/hamnet_sip.conf", $vl_file);
        $vl_reload=1;
}

$vl_oldfile = file_get_contents($C_PATH."/hamnet_destination.conf");
if($vl_oldfile!=$vl_file2)
{
        file_put_contents($C_PATH."/hamnet_destination.conf", $vl_file2);
        $vl_reload=1;
}

$vl_file="";
foreach($vl_outgoing AS $vl_key => $vl_line)
{
        $vl_file .= '[outgoing_'.$vl_key.']'."\r\n";
        $vl_file .= 'include => extensions'."\r\n";
        $vl_file .= 'exten => _[1-9].,1,Goto(dialplan,'.$vl_line[1].$vl_line[2].'${EXTEN},1)'."\r\n";
        $vl_file .= 'exten => _0[1-9].,1,Goto(dialplan,'.$vl_line[1].'${EXTEN:1},1)'."\r\n";
        $vl_file .= 'exten => _00.,1,Goto(dialplan,${EXTEN:2},1)'."\r\n";
        $vl_file .= "\r\n";
}
$vl_oldfile = file_get_contents($C_PATH."/hamnet_outgoing.conf");
if($vl_oldfile!=$vl_file)
{
        file_put_contents($C_PATH."/hamnet_outgoing.conf", $vl_file);
        $vl_reload=1;
}

$vl_file="";
foreach($vp_db AS $vl_db)
{
	$vl_file .= '"'.$vl_db[0].'","'.$vl_db[1].'","'.$vl_db[2].'","'.$vl_db[3].'","'.$vl_db[4].'","'.$vl_db[5].'","'.$vl_db[6].'"'."\r\n";
}
$vl_oldfile = file_get_contents($C_PATH."/db.csv");
if($vl_oldfile!=$vl_file)
{
        file_put_contents($C_PATH."/db.csv", $vl_file);
}

// RELOAD
if($vl_reload==1)
{
        system($C_ASTERISK." -r -x 'core reload'");
}
?>
