<?php

require_once ('/usr/share/php/ESL.php');



function rebootPhone($ext, $domain) {

$sock = new ESLconnection('localhost','8021','ClueCon');

$res = $sock->sendRecv("api sofia profile internal flush_inbound_reg $ext@$domain reboot");

$ret = $res->getBody();

$sock->disconnect();

return ($ret);

}



function saySomething($uuid) {

$esl = new ESLconnection('localhost','8021','ClueCon');

$event = $esl->events('plain', 'ALL');
//$event = $esl->filter("Unique-ID",$uuid);

$myuuid = $esl->api("create_uuid")->getBody();

sleep (1);

//$foo = $esl->setEventLock(1);

$res = $esl->execute("play_and_get_digits","4 11 1 5000 # ivr/ivr-please_enter_the_phone_number.wav ivr/ivr-that_was_an_invalid_entry.wav target_num \d+", $uuid);

$job_uuid = $res->getHeader("Job-UUID");


//$foo = $uuid . ' target_num';

echo $status . " , " . $myuuid;

$stay_connected = 1;
while ( $stay_connected ) {
    $e = $esl->recvEventTimed(200);
    if ( $e ) {
        $ev_name = $e->getHeader("Event-Name");
        # Should we check for the $job_uuid to match the background job ?                      
        //if ( $ev_name == 'BACKGROUND_JOB' ) {
        //    if ( $e->getHeader("Job-UUID") == $uuid ) {
        //        $call_result = $e->getBody();
        //        echo "Result of call to $target was $call_result\n\n";
        //    }
        //} else 
	echo $ev_name;
	if ( $ev_name == 'EXECUTE_COMPLETE' ) {
            //my $digit = $e->getHeader("DTMF-Digit");
           // print "Received DTMF digit: $digit\n";
            //if ( $digit =~ m/\D/ ) {a
             //   print "Exiting...\n";
		//if ( $e->getHeader("Job-UUID") == $job_uuid ) {
                $stay_connected = 0;
		//}
            //}
        } else {
      # Some other event                                                                       
        }
    } else {
    # do other things while waiting for events
	sleep (1);
    }
}

$esl->api("uuid_kill",$uuid);

$event=$esl->sendRecv("api uuid_getvar $uuid target_num");


$ret = $event->getBody();

$esl->disconnect();

//echo $ret;

return ($ret);

}



function ldapEscape($s, $d = FALSE, $i = NULL)
        {
                        /****************************\
                 *      |   str $s - Subject string  |
                 *      |  bool $d - DN mode         |
                 *      | mixed $i - Chars to ignore |
                 *      \****************************/
                $m = ($d) ? array(
                        1 => '\\',
                        ',',
                        '=',
                        '+',
                        '<',
                        '>',
                        ';',
                        '"',
                        '#'
                ) : array(
                        1 => '\\',
                        '*',
                        '(',
                        ')',
                        chr(0)
                );
                if (is_string($i) && ($l = strlen($s))) {
                        for ($n = 0; $n < $l; $n++) {
                                if ($k = array_search(substr($s, $n, 1), $m)) {
                                        unset($m[$k]);
                                }
                        }
                } else if (is_array($i)) {
                        foreach ($i as $c) {
                                if ($k = array_search($c, $m)) {
                                        unset($m[$k]);
                                }
                        }
                }
                $q = array();
                foreach ($m as $k => $c) {
                        $q[$k] = '\\' . str_pad(dechex(ord($c)), 2, '0', STR_PAD_LEFT);
                }
                return str_replace($m, $q, $s);
}


function getFromLDAP($sExtension)
        {
                $sEMail           = null;
                $sTelephoneNumber = null;
                $sCN              = null;
                $sLDAPBase        = 'ou=Moople,ou=Blobs,dc=foo,dc=net';
                // connecting to ldap
                $conn             = ldap_connect('ldap://lmc.prb.net', 389);
                if ($conn) {
                        // binding to ldap
                        //$lOldError = error_reporting(E_ERROR ^ E_WARNING);
                        $lOldError = error_reporting(E_ERROR);
                        $bind      = ldap_bind($conn);
                        error_reporting($lOldError);
                        if ($bind) {
                                // we've successfully logged in!
                                $asAttrs    = array(
                                        'mail',
                                        'telephoneNumber',
                                        'cn'
                                );
                                $sLDAPQuery = 'telephoneNumber=' . ldapEscape($sExtension, false);
                                $r          = @ldap_search($conn, $sLDAPBase, $sLDAPQuery, $asAttrs);
                                if ($r) {
                                        $aResult = @ldap_first_entry($conn, $r);
                                        if ($aResult != false) {
                                                $aTelephoneNumber = @ldap_get_values($conn, $aResult, 'telephoneNumber');
                                                if ($aTelephoneNumber["count"]) {
                                                        $aCN    = @ldap_get_values($conn, $aResult, 'cn');
                                                        $sCN    = $aCN[0];
                                                        $aEMail = @ldap_get_values($conn, $aResult, 'mail');
                                                        if ($aEMail["count"]) {
                                                                $sEMail = $aEMail[0];
                                                        } else {
                                                                $sEMail = '';
                                                        }
                                                }
                                        }
                                }
                        }
                }
                ldap_close($conn);
                return array(
                        $sEMail,
                        $sCN
                );
        }


function provSnom ($mac, $ext, $name) {

echo '<?xml version="1.0" encoding="utf-8"?>
<settings>
<phone-settings e="2">
<language perm="">English</language>
<redirect_event perm="">none</redirect_event>
<dhcp perm="">on</dhcp>
<vlan_id perm="">0</vlan_id>
<ip_frag_enable perm="">on</ip_frag_enable> 
<utc_offset perm="">0</utc_offset>
<ntp_server perm="">192.168.54.254</ntp_server>
<http_user perm="">admin</http_user>
<http_pass perm="">knackers</http_pass>
<dst perm="">3600 03.05.07 02:00:00 10.05.07 03:00:00</dst>
<timezone perm="">GBR-0</timezone>
<user_phone perm="">off</user_phone>
<admin_mode_password perm="">4567</admin_mode_password>
<tone_scheme perm="">GBR</tone_scheme>
<logon_wizard perm="">on</logon_wizard>
<publish_presence perm="">on</publish_presence>
<call_waiting perm="">visual</call_waiting>
<callpickup_dialoginfo perm="">on</callpickup_dialoginfo>
<date_us_format perm="">off</date_us_format>
<time_24_format perm="">on</time_24_format>
<ldap_server perm="">mrl.epb.not</ldap_server>
<ldap_base perm="">ou=People,ou=Accounts,dc=ifa,dc=net</ldap_base>
<peer_to_peer_cc perm="">off</peer_to_peer_cc>
<dkey_snom perm="">keyevent F_DIRECTORY_SEARCH</dkey_snom>
<dkey_retrieve perm="">speed *98</dkey_retrieve>
<show_xml_pickup perm="">off</show_xml_pickup>
<firmware_version perm="">snom370-SIP 7.3.30</firmware_version>
<ldap_lookup_ringing perm="">off</ldap_lookup_ringing>
<ldap_search_filter perm="">(&amp;(telephoneNumber=*)(sn=%))</ldap_search_filter>
<ldap_number_filter perm="">(&amp;(telephoneNumber=%)(sn=*))</ldap_number_filter>
<ldap_name_attributes perm="">cn sn</ldap_name_attributes>
<ldap_number_attributes perm="">telephoneNumber</ldap_number_attributes>
<ldap_display_name perm="">%cn</ldap_display_name>
<use_hidden_tags perm="">off</use_hidden_tags>
<show_name_dialog perm="">on</show_name_dialog>
<uboot_version perm="">1.1.3-u</uboot_version>
<user_realname idx="1" perm="">' . $name . '</user_realname>
<user_name idx="1" perm="">' . $ext . '</user_name>
<user_host idx="1" perm="">192.168.20.245</user_host>
<user_pname idx="1" perm="">' . $ext . '</user_pname>
<user_pass idx="1" perm="">1234</user_pass>
<user_mailbox idx="1" perm="">' . $ext . '</user_mailbox>
<user_srtp idx="1" perm="">off</user_srtp>
<user_xml_screen_url idx="1" perm="">http://proxy.ifa.net/idle.xml</user_xml_screen_url>
<user_ringer idx="1" perm="">Ringer6</user_ringer>
<codec1_name idx="1" perm="">9</codec1_name>
<codec3_name idx="1" perm="">0</codec3_name>
<codec4_name idx="1" perm="">4</codec4_name>
<codec5_name idx="1" perm="">18</codec5_name>
<codec6_name idx="1" perm="">3</codec6_name>
<codec7_name idx="1" perm="">99</codec7_name>
<user_savp idx="1" perm="">optional</user_savp>
<user_publish_presence_bootup idx="1" perm="">on</user_publish_presence_bootup>
</phone-settings>
<functionKeys e="2">
<fkey idx="0" context="active" perm="">none</fkey>
<fkey idx="1" context="active" perm="">none</fkey>
<fkey idx="2" context="active" perm="">none</fkey>
<fkey idx="3" context="active" perm="">none</fkey>
<fkey idx="4" context="active" perm="">none</fkey>
<fkey idx="5" context="active" perm="">none</fkey>
<fkey idx="6" context="1" perm="">none</fkey>
<fkey idx="7" context="1" perm="">none</fkey>
<fkey idx="8" context="1" perm="">none</fkey>
<fkey idx="9" context="1" perm="">none</fkey>
<fkey idx="10" context="1" perm="">none</fkey>
<fkey idx="11" context="1" perm="">none</fkey>
</functionKeys>
<tbook e="2">
</tbook>
</settings>
';
}




function provPolycom ($mac, $ext, $name, $filename) {

if ($filename == '.') {

echo '<?xml version="1.0" standalone="yes"?>
<APPLICATION APP_FILE_PATH="sip.ld" CONFIG_FILES="' . $mac . '-settings.cfg, local-phone1.cfg, local-sip.cfg, phone1.cfg, sip.cfg" MISC_FILES="" LOG_FILE_DIRECTORY="" OVERRIDES_DIRECTORY="" CONTACTS_DIRECTORY="" LICENSE_DIRECTORY="">
</APPLICATION>
';
}

else if ($filename == '-settings.') {

echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <reginfo>
    <reg reg.1.displayName="' . $name . '" reg.1.address="' . $ext .'" reg.1.label="' . $name . '" reg.1.type="private" reg.1.auth.userId="' . $ext . '" reg.1.auth.password="1234"/>
  </reginfo>
';

}

}




function provPolycomSettings ($mac, $ext) {

}







//MAIN PROGRAM

//polycom will make a request for two dymamic files, <mac>.cfg and <mac>-settings.cfg, and a load of static ones, can we roll them up?


class MyDB extends SQLite3
{
    function __construct()
    {
        $this->open('../db/provision.db');
    }
}

$db = new MyDB();

//if action is defined this is from the FS dialplan

if (array_key_exists('action', $_REQUEST)) {
	$action = $_REQUEST['action'];
	$exten = $_REQUEST['exten'];
	
	if ($action == 'logout') {
		//delete all entries for the exten
		$query = "DELETE FROM provision WHERE exten='$exten'";
		$db->exec($query);
		rebootPhone($exten, "192.168.54.145");
	}

	if ($action == 'login') { 
		$mac = $_REQUEST['mac'];
		//is this phone logged in elsewhere?
		$query = "SELECT exten FROM provision WHERE exten='$exten'";
		$res = $db->querySingle($query);
		if ($res) {
			$query = "DELETE FROM provision WHERE exten='$exten'";
			$db->exec($query);
			rebootPhone($exten, "192.168.54.145");
		}	
		//now insert new ext of the request var "$exten", as long as it matches a valid extension (initially from regex, later from LDAP)
		$query = "DELETE FROM provision WHERE mac='$mac'";
		$db->exec($query);
		$query = "INSERT INTO provision VALUES ('$mac','$exten')";
		$db->exec($query);
		rebootPhone($mac, "192.168.54.145");
	
	}

	if ($action == 'login-mult') {
                $mac = $_REQUEST['mac'];
                //now insert new ext of the request var "$exten", as long as it matches a valid extension (initially from regex, later from LDAP)
                $query = "DELETE FROM provision WHERE mac='$mac'";
                $db->exec($query);
                $query = "INSERT INTO provision VALUES ('$mac','$exten')";
                $db->exec($query);
                rebootPhone($mac, "192.168.54.145");

        }
	
	if ($action == 'test') {
		$res = saySomething($_REQUEST['uuid']);
		echo $res;
	}

	//reboot phone
	//$res=rebootPhone($exten, "192.168.54.145");
	//echo $res;	

//endif
} else {


//else this is from the phone

//so far this only will work with Snom

	$name = 'Dial 667 then number to login';
	$mac = $_REQUEST['mac'];
	$manuf = $_REQUEST['manuf'];
	//if (mac is in in the db)
	$query = "SELECT exten FROM provision WHERE mac='$mac'";
	$res = $db->querySingle($query);
	if ( $res ) {
		//look up extension no
		$exten=$res;
		if ($exten != $mac) {
			$ldapquery = preg_replace("/^11/","",$exten,1);
			$aLDAPres = getFromLDAP($ldapquery);
			$name = $aLDAPres[1];
		}
		//call provision mac=mac, exten=from sql
		switch($manuf) {
			case "snom":
				provSnom($mac,$exten,$name);
			case "polycom":
				$filename = $_REQUEST['filename'];
				provPolycom($mac,$exten,$name,$filename);
			}
	} else {
		//if (mac is not in the db)
		//insert mac=mac addr, ext=mac addr
		$query = "INSERT INTO provision VALUES ('$mac','$mac')";
		$db->exec($query);
		//provision
		switch($manuf) {
                        case "snom":
                                provSnom($mac,$mac,$name);
                        case "polycom":
                                $filename = $_REQUEST['filename'];
                                provPolycom($mac,$mac,$name,$filename);
                        }
	//endif
	}

}





?>
