#!/usr/bin/php-cgi
<?php
header("Access-Control-Allow-Origin: *");

/*****************************************************************************
VOIP 

AUTHOR: JOSE MARI REYES

HISTORY

	10-11-2017		INITIAL VERSION
	10-18-2017		UPDATED WITH SOME OPTIONAL FIELDS
	04/02/2018		FIX SETVOBAL KEY PARAMETER,  when + is sent, it is received as space, converting it again to + 	

USAGE:

	FIIELDS:
	========
			
			PBX
			---
				enable	<required>
				listen_interfaces [optional default is 0.0.0.0]
				listen_port [5060]
			
			FXS
			---
				paymode
			
			VOBAL
			-----
						
				enabled		<required>
				key 		<required>
				mac 		[optional default is local mac address]
				secret		[optional]
				uid			[optional]
				did			[optional]
				
			
			EXTENSION
			----------
				
				id             --extension id--
				password
				description
				ring
				callerid
				sms
				paymode
				
					
			
	GET PBX SETTING
	---------------
	
		http://10.1.5.1/cgi-bin/voip?getpbx
		
		RETURN:
		
			listen_interfaces='0.0.0.0'
			enabled='0'		
			
	SET PBX SETTING
	---------------
	
		http://10.1.5.1/cgi-bin/voip?setpbx&enabled=1&listen_interfaces=0.0.0.0&listen_port=5060		
		
		*If listen_interfaces is not supplied the default is 0.0.0.0 
		
		RETURN 
				1		success
				-10		missing enabled
				-11		missing listen_interfaces
				-12		missing listen_port			
	
	GET FXS SETTING
	----------------
	
		http://10.1.5.1/cgi-bin/voip?getfxs
		
		RETURN:
		
			paymode='prepaid'
			
	SET FXS SETTING
	---------------
		
		http://10.1.5.1/cgi-bin/voip?setfxs&paymode=postpaid
		
		RETURN:
		
				1		success
				-20		missing paymode field
	
	
	GET VOBAL SETTING
	-----------------					
	
		http://10.1.5.1/cgi-bin/voip?getvobal
		
		RETURN:
		
			enabled='1'
			mac='000b52762389'
			secret='h6Akh7pYHxWK'
			uid='21358'
			did='12135821358'
			key='U2FsdGVkX18GEuepH2v8ToDFIDJP6hmbX9GuAb93UslvSglxsV0P1fCvloI1oybNzmELVSR1VHo87vQMjFn59Q=='
			
			
			
	SET VOBAL SETTING
	-----------------
	http://10.1.5.1/cgi-bin/voip?setvobal&enabled=0&mac=000b52762389&secret=h6Akh7pYHxWK&uid=21358&did=12135821358&key=U2FsdGVkX18GEuepH2v8ToDFIDJP6hmbX9GuAb93UslvSglxsV0P1fCvloI1oybNzmELVSR1VHo87vQMjFn59Q==
	
		NOYE: 
			mac address field is optional.  if not supplied the API will fetch the machine MAC address
			secret, uid, did  fields is optional if not supplied it wont touch the one defined in the config file
			
			
		RETURN
		
			1		success
			-31   		missing enabled
			-32		missing mac
			-33		missing secret
			-34		missing did
			-35		missing key
	
	
		
	
	
	
	GET EXTENSION
	-------------
	
		http://10.1.5.1/cgi-bin/voip?getextension		
	
		RETURN:
		
			[0]=extension
			[0].id='201'
			[0].password='1234'
			[0].description='Captain line'
			[0].ring='1'
			[0].callerid='201'
			[0].sms='1'
			[0].paymode='postpaid'
			[1]=extension
			[1].id='202'
			[1].password='1234'
			[1].description='Crew line 1'
			[1].callerid='202'
			[1].ring='0'
			[1].sms='0'
			[1].paymode='prepaid'


		*NOTE:  In the above return.. there are 4 extension defined, from index 0 to 1.. their respective ids as follows: 201, 202
					
					
	ADD NEW EXTENSION
	-----------------
	
		http://10.1.5.1/cgi-bin/voip?addextension&id=1101&password=12345&description=test+ext&ring=1&callerid=201&sms=1&paymode=prepaid
	
		RETURN:
		
			1		success
		
			(common to all extension function)
			-40		missing id
			-41		missing password
			-42		missing description
			-43		missing callerid
			-44		missing ring
			-45		missing sms
			-46		missing paymode
	
	EDIT EXTENSION
	--------------
	
	
		http://10.1.5.1/cgi-bin/voip?editextension&id=1101&password=1234&description=test+ext&ring=1&callerid=201&sms=1&paymode=postpaid
		
		RETURN:
		
			1		success
			-1		id not found
			
	DELETE EXTENSION
	----------------
	
		http://10.1.5.1/cgi-bin/voip?delextension&id=1101
	
			RETURN:
		
			1		success
			-1		id not found
	
			
******************************************************************************/


echo "<pre>";


    
	if (isset($_REQUEST['getpbx']))
	{
		echo get_pbx();
	}
	
	if (isset($_REQUEST['setpbx']))
	{
	 	$enabled = $_REQUEST['enabled'];
		if (strlen($enabled) < 1) { echo "-10"; exit; }
		
		if (isset($_REQUEST['listen_interfaces'])) 
		{	
			$listen = $_REQUEST['listen_interfaces'];
			if (strlen($listen) < 1) { echo "-11"; exit; }
		}
		else
			$listen = "0.0.0.0";
		
		$port = $_REQUEST['listen_port'];
                if (strlen($port) < 1) { echo "-12"; exit; }
	
		set_pbx($enabled, $listen, $port);
		echo "1";
	}
	

	if (isset($_REQUEST['getfxs']))
	{
		echo get_fxs();
	}

	if (isset($_REQUEST['setfxs']))
	{
	 	$paymode = $_REQUEST['paymode'];
		if (strlen($paymode) < 1) { echo -20; exit; }
		
		set_fxs($paymode);
		echo '1';
	}
	
	
	if (isset($_REQUEST['getvobal']))
	{
		echo get_vobal();
	}
	
	if (isset($_REQUEST['setvobal']))
	{
	 	$enable = $_REQUEST['enabled'];
		if (strlen($enable) < 1) { echo -30; exit; }
		
		$key = $_REQUEST['key'];
		if (strlen($key) < 1) { echo -35; exit; }
		
		if (isset($_REQUEST['mac']))
		{
			$mac = $_REQUEST['mac'];
			if (strlen($mac) < 1) { echo -31; exit; }
		}
		else
			$mac = "";
		
		if (isset($_REQUEST['secret']))
		{	
			$secret = $_REQUEST['secret'];
			if (strlen($secret) < 1) { echo -32; exit; }
		}
		else
			$secret = "";
		
		if (isset($_REQUEST['uid']))
		{	
			$uid = $_REQUEST['uid'];
			if (strlen($uid) < 1) { echo -33; exit; }
		}
		else
			$uid = "";
		
		if (isset($_REQUEST['did']))
		{	
			$did = $_REQUEST['did'];
			if (strlen($did) < 1) { echo -34; exit; }
		}
		else
			$did = "";
	
		$key = str_replace(' ', '+', $key);	
		set_vobal($enable, $mac, $secret,  $uid, $did, $key);
                exec("/etc/init.d/asterisk restart 1>/dev/null 2>&1");
	        sleep(2);
                exec("/etc/init.d/vobal restart 1>/dev/null 2>&1");
	        echo '1';	
	}
	
	
	if (isset($_REQUEST['getextension']))
	{
		echo get_extension();
	}
	
	
	
	if (isset($_REQUEST['addextension']))
	{
	 	$id = $_REQUEST['id'];
		if (strlen($id) < 1) { echo -40; exit; }
	
	 	$password = $_REQUEST['password'];
		if (strlen($password) < 1) { echo -41; exit; }
	
	 	$description = $_REQUEST['description'];
		if (strlen($description) < 1) { echo -42; exit; }
	
	 	$callerid = $_REQUEST['callerid'];
		if (strlen($callerid) < 1) { echo -43; exit; }
	
	 	$ring = $_REQUEST['ring'];
		if (strlen($ring) < 1) { echo -44; exit; }
	
	 	$sms = $_REQUEST['sms'];
		if (strlen($sms) < 1) { echo -45; exit; }
	
		$paymode = $_REQUEST['paymode'];
                if (strlen($paymode) < 1) { echo -46; exit; }
	
		add_extension($id, $password, $description, $callerid, $ring, $sms, $paymode);
		echo '1';	
	}


	if (isset($_REQUEST['delextension']))
	{
	 	$id = $_REQUEST['id'];
		if (strlen($id) < 1) { echo -40; exit; }
	
		$r = del_extension($id);
		
		if ($r == false) echo '-1'; else echo '1';
	}
	
	
	if (isset($_REQUEST['editextension']))
	{
	 	
		$id = $_REQUEST['id'];
		if (strlen($id) < 1) { echo -40; exit; }
	
	 	$password = $_REQUEST['password'];
		if (strlen($password) < 1) { echo -41; exit; }
	
	 	$description = $_REQUEST['description'];
		if (strlen($description) < 1) { echo -42; exit; }
	
	 	$callerid = $_REQUEST['callerid'];
		if (strlen($callerid) < 1) { echo -43; exit; }
	
	 	$ring = $_REQUEST['ring'];
		if (strlen($ring) < 1) { echo -44; exit; }
	
	 	$sms = $_REQUEST['sms'];
		if (strlen($sms) < 1) { echo -45; exit; }
		
		$paymode = $_REQUEST['paymode'];
                if (strlen($paymode) < 1) { echo -45; exit; }

		$r = edit_extension($id, $password, $description, $callerid, $ring, $sms, $paymode);
		if ($r == false) echo '-1'; else echo '1';
	}
	

//************* PBX ****************************

function get_pbx()
{
	$cmd = " uci show pbx | grep '@pbx'";
	$v = shell_exec($cmd);	

	//$v = "pbx.@pbx[0]=pbx
//pbx.@pbx[0].enabled='0'
//pbx.@pbx[0].listen_interfaces='0.0.0.0'";
			
	$v = str_replace("pbx.@pbx[0].", "", $v);
	$v = str_replace("pbx.@pbx[0]=pbx", "", $v);	

	if ( strpos($v,"listen_interfaces") === false ) {
	    $v = $v . "listen_interfaces='0.0.0.0'\n";
	}
	
	return $v;
}


function set_pbx($enabled, $listen_interfaces, $listen_port)
{

	$cmd = "uci set pbx.@pbx[0].enabled='$enabled'";
	exec($cmd);
	exec("uci commit");

	$cmd = "uci set pbx.@pbx[0].listen_interfaces='$listen_interfaces'";
	exec($cmd);
	exec("uci commit");

	$cmd = "uci set pbx.@pbx[0].listen_port='$listen_port'";
        exec($cmd);
        exec("uci commit");

}

//*********** FXS *****************************
function get_fxs()
{

	$cmd = "uci show pbx | grep '@fxs'";
	$v = shell_exec($cmd);	
	
//$v = "pbx.@fxs[0]=fxs
//pbx.@fxs[0].paymode='prepaid'";
	
	$v = str_replace("pbx.@fxs[0].", "", $v);
	$v = str_replace("pbx.@fxs[0]=fxs", "", $v);	
	
	if ( strpos($v, "paymode") === false ) {
	   $v = $v . "paymode='prepaid\n";
        }
	return $v;

}


function set_fxs($paymode)
{
	$cmd = "uci set pbx.@fxs[0].paymode='$paymode'";
	exec($cmd);
	exec("uci commit");

}

//************** VOBAL *************************

function get_vobal()
{
	$cmd = "uci show pbx | grep '@vobal'";
	$v = shell_exec($cmd);	

//$v = "pbx.@vobal[0]=vobal
//pbx.@vobal[0].enabled='1'
//pbx.@vobal[0].mac='000b52762389'
//pbx.@vobal[0].secret='h6Akh7pYHxWK'
//pbx.@vobal[0].uid='21358'
//pbx.@vobal[0].did='12135821358'
//pbx.@vobal[0].key='U2FsdGVkX18GEuepH2v8ToDFIDJP6hmbX9GuAb93UslvSglxsV0P1fCvloI1oybNzmELVSR1VHo87vQMjFn59Q=='";

	$v = str_replace("pbx.@vobal[0].", "", $v);
	$v = str_replace("pbx.@vobal[0]=vobal", "", $v);	
	
	return $v;
}


function set_vobal($enable, $mac, $secret,  $uid, $did, $key)
{

	$cmd  = "uci set pbx.@vobal[0].enabled='$enable'\n"; 
	exec($cmd);
	
	$cmd  = "uci set pbx.@vobal[0].key='$key'\n"; 
	exec($cmd);
	
	
	if (strlen($mac) < 1) $mac = get_mac_addr();
	$cmd  = "uci set pbx.@vobal[0].mac='$mac'\n"; 
	exec($cmd);
	
	
	
	if (strlen($secret) > 0)
	{
		$cmd  = "uci set pbx.@vobal[0].secret='$secret'\n"; 
		exec($cmd);
	}
	
	if (strlen($uid) > 0)
	{
		$cmd  = "uci set pbx.@vobal[0].uid='$uid'\n"; 
		exec($cmd);
	}
	
	if (strlen($did) > 0)
	{
		$cmd  = "uci set pbx.@vobal[0].did='$did'\n"; 
		exec($cmd);
	}
	
	
	exec("uci commit");
	
}


function get_mac_addr()
{
	return trim(shell_exec("ifconfig eth0.3 | awk '/HWaddr/ { print $5 }'"));
}

/***************** EXTENSION *******************/

function get_extension_idx($id)
{
	$cmd = "uci show pbx | grep '\<id\>'";
	$v = shell_exec($cmd);
//	$v = "pbx.@extension[0].id='201'
//pbx.@extension[1].id='202'
//pbx.@extension[2].id='203'
//pbx.@extension[3].id='204'";
	
	
	$v = str_replace("pbx.@extension[", "", $v);
	$v = str_replace("].id", "", $v);
	$v = str_replace("'", "", $v);
	$v = explode("\n", $v);
	
	for ($i = 0; $i < count($v); $i++)
	{
		if (strpos($v[$i], $id) !== false)
		{
			$tmp = explode("=", $v[$i]);
			return $tmp[0];
		}
	}

	return "";
}


function get_extension()
{
	$cmd = "uci show pbx | grep '\<extension\>'";
	$v = shell_exec($cmd);
//	$v = "pbx.@extension[0]=extension
//pbx.@extension[0].id='201'
//pbx.@extension[0].password='1234'
//pbx.@extension[0].description='Captain line'
//pbx.@extension[0].ring='1'
//pbx.@extension[0].callerid='201'
//pbx.@extension[0].sms='1'
//pbx.@extension[1]=extension
//pbx.@extension[1].id='202'
//pbx.@extension[1].password='1234'
//pbx.@extension[1].description='Crew line 1'
//pbx.@extension[1].callerid='202'
//pbx.@extension[1].ring='0'
//pbx.@extension[1].sms='0'
//pbx.@extension[2]=extension
//pbx.@extension[2].password='1234'
//pbx.@extension[2].description='Crew line 2'
//pbx.@extension[2].callerid='203'
//pbx.@extension[2].id='203'
//pbx.@extension[2].ring='0'
//pbx.@extension[2].sms='0'
//pbx.@extension[3]=extension
//pbx.@extension[3].ring='0'
//pbx.@extension[3].password='1234'
//pbx.@extension[3].description='Crew line 3'
//pbx.@extension[3].callerid='204'
//pbx.@extension[3].sms='0'
//pbx.@extension[3].id='204'";

	$v = str_replace("pbx.@extension", "", $v);
	//$v = str_replace("=extension", "", $v);
    
	return $v;
}


function del_extension($id)
{
	$idx = get_extension_idx($id);
	if (strlen($idx) < 1) return false;

	$cmd = "uci delete pbx.@extension[$idx]";
	exec($cmd);
	exec("uci commit");
	return true;	
}



function edit_extension($id, $password, $description, $callerid, $ring, $sms, $paymode)
{
	$idx = get_extension_idx($id);
	if (strlen($idx) < 1) return false;
	
	$cmd = "uci set pbx.@extension[$idx].password='$password'";
	exec($cmd);
	
	$cmd = "uci set pbx.@extension[$idx].description='$description'";
	exec($cmd);
	
	$cmd = "uci set pbx.@extension[$idx].callerid='$callerid'";
	exec($cmd);
	
	$cmd = "uci set pbx.@extension[$idx].ring='$ring'";
	exec($cmd);
	
	$cmd = "uci set pbx.@extension[$idx].sms='$sms'";
	exec($cmd);

	$cmd = "uci set pbx.@extension[$idx].paymode='$paymode'";
        exec($cmd);
	
	exec("uci commit");
	return true;
}


function add_extension($id, $password, $description, $callerid, $ring, $sms, $paymode)
{
	$cmd = "uci add pbx extension";
	$ext = trim(shell_exec($cmd));
	
	$cmd = "uci set pbx.$ext.id='$id'";
	exec($cmd);
	
	$cmd = "uci set pbx.$ext.password='$password'";
	exec($cmd);
	
	$cmd = "uci set pbx.$ext.description='$description'";
	exec($cmd);
	
	$cmd = "uci set pbx.$ext.callerid='$callerid'";
	exec($cmd);
	
	$cmd = "uci set pbx.$ext.ring='$ring'";
	exec($cmd);
	
	$cmd = "uci set pbx.$ext.sms='$sms'";
	exec($cmd);

	$cmd = "uci set pbx.$ext.paymode='$paymode'";
        exec($cmd);
	
	exec("uci commit");
	
}


?>
 

 

