diff --git a/app/call_centers/call_center_queue_delete.php b/app/call_centers/call_center_queue_delete.php index edcf624951..bad7ad96cc 100644 --- a/app/call_centers/call_center_queue_delete.php +++ b/app/call_centers/call_center_queue_delete.php @@ -86,7 +86,7 @@ if (strlen($id) > 0) { //clear the cache $cache = new cache; - $cache->delete("memcache delete dialplan:".$_SESSION["context"]); + $cache->delete("dialplan:".$_SESSION["context"]); //synchronize configuration save_dialplan_xml(); diff --git a/app/call_centers/call_center_queue_edit.php b/app/call_centers/call_center_queue_edit.php index 77ab53a661..05f82c1580 100644 --- a/app/call_centers/call_center_queue_edit.php +++ b/app/call_centers/call_center_queue_edit.php @@ -329,7 +329,7 @@ if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { //clear the cache $cache = new cache; - $cache->delete("memcache delete dialplan:".$_SESSION["context"]); + $cache->delete("dialplan:".$_SESSION["context"]); //set the update message $_SESSION["message"] = $text['message-update']; diff --git a/app/call_flows/call_flow_edit.php b/app/call_flows/call_flow_edit.php index 254601b5d8..1380c69912 100644 --- a/app/call_flows/call_flow_edit.php +++ b/app/call_flows/call_flow_edit.php @@ -337,7 +337,7 @@ if (count($_POST) > 0 && strlen($_POST["persistformvar"]) == 0) { //clear the cache $cache = new cache; - $cache->delete("memcache delete dialplan:".$call_flow_context); + $cache->delete("dialplan:".$call_flow_context); //set the message if ($action == "add") { diff --git a/app/calls/call_edit.php b/app/calls/call_edit.php index 85e26d0ad9..b9b149b954 100644 --- a/app/calls/call_edit.php +++ b/app/calls/call_edit.php @@ -379,7 +379,10 @@ if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { //clear the cache $cache = new cache; - $cache->delete("memcache delete directory:".$extension."@".$_SESSION['domain_name']); + $cache->delete("directory:".$extension."@".$_SESSION['domain_name']); + if(strlen($number_alias) > 0){ + $cache->delete("directory:".$number_alias."@".$_SESSION['domain_name']); + } //redirect the user $_SESSION["message"] = $text['confirm-update']; diff --git a/app/calls/resources/classes/call_forward.php b/app/calls/resources/classes/call_forward.php index 9b7fe294f7..74688572ed 100644 --- a/app/calls/resources/classes/call_forward.php +++ b/app/calls/resources/classes/call_forward.php @@ -35,6 +35,7 @@ include "root.php"; public $domain_name; public $extension_uuid; private $extension; + private $number_alias; public $forward_all_destination; public $forward_all_enabled; private $dial_string; @@ -58,6 +59,7 @@ include "root.php"; if (count($result) > 0) { foreach ($result as &$row) { $this->extension = $row["extension"]; + $this->number_alias = $row["number_alias"]; $this->accountcode = $row["accountcode"]; $this->toll_allow = $row["toll_allow"]; $this->outbound_caller_id_name = $row["outbound_caller_id_name"]; @@ -155,10 +157,10 @@ include "root.php"; unset($sql); //delete extension from memcache - $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); - if ($fp) { - $switch_cmd = "memcache delete directory:".$this->extension."@".$this->domain_name; - $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $cache = new cache; + $cache->delete("directory:".$this->extension."@".$this->domain_name); + if(strlen($this->number_alias) > 0){ + $cache->delete("directory:".$this->number_alias."@".$this->domain_name); } } //function diff --git a/app/dialplan/resources/switch/conf/dialplan/050_user_record.xml b/app/dialplan/resources/switch/conf/dialplan/050_user_record.xml index 034bf464e3..801857d1d0 100644 --- a/app/dialplan/resources/switch/conf/dialplan/050_user_record.xml +++ b/app/dialplan/resources/switch/conf/dialplan/050_user_record.xml @@ -46,7 +46,7 @@ - + diff --git a/app/sip_status/sip_status.php b/app/sip_status/sip_status.php index 029f979e55..8afe5b5aa8 100644 --- a/app/sip_status/sip_status.php +++ b/app/sip_status/sip_status.php @@ -93,16 +93,25 @@ if ($_GET['a'] == "download") { } //get the gateways - $sql = "select g.domain_uuid, g.gateway, g.gateway_uuid, d.domain_name from v_gateways as g, v_domains as d "; - $sql .= "where d.domain_uuid = g.domain_uuid "; + $sql = "select g.domain_uuid, g.gateway, g.gateway_uuid, d.domain_name "; + $sql .= "from v_gateways as g left outer join v_domains as d on d.domain_uuid = g.domain_uuid"; $prep_statement = $db->prepare(check_sql($sql)); $prep_statement->execute(); $gateways = $prep_statement->fetchAll(PDO::FETCH_NAMED); unset ($prep_statement, $sql); + if ($fp) { + $hostname = trim(event_socket_request($fp, 'api switchname')); + } + //get the sip profiles $sql = "select sip_profile_name from v_sip_profiles "; $sql .= "where sip_profile_enabled = 'true' "; + if ($hostname) { + $sql .= "and (sip_profile_hostname = '" . check_str($hostname) . "' "; + $sql .= "or sip_profile_hostname = '' "; + $sql .= "or sip_profile_hostname is null ) "; + } $sql .= "order by sip_profile_name asc "; $prep_statement = $db->prepare(check_sql($sql)); $prep_statement->execute(); diff --git a/resources/classes/EventSocket.php b/resources/classes/EventSocket.php new file mode 100644 index 0000000000..0f4bb239fd --- /dev/null +++ b/resources/classes/EventSocket.php @@ -0,0 +1,196 @@ +content = ''; + $this->eol = "\n"; + } + + public function append($str) { + $this->content .= $str; + } + + public function read_line() { + $ar = explode($this->eol, $this->content, 2); + if (count($ar) != 2) { + return false; + } + $this->content = $ar[1]; + return $ar[0]; + } + + public function read_n($n) { + if (strlen($this->content) < $n) { + return false; + } + $s = substr($this->content, 0, $n); + $this->content = substr($this->content, $n); + return $s; + } + + public function read_all($n) { + $tmp = $this->content; + $this->content = ''; + return $tmp; + } +} + +//$b = new Buffer; +//$b->append("hello\nworld\n"); +//print($b->read_line()); +//print($b->read_line()); + +class EventSocket { + private $buffer; + private $fp; + + public function __construct($fp = false) { + $this->buffer = new Buffer; + $this->fp = $fp; + } + + public function __destructor() { + $this->close(); + } + + public function read_event() { + if (!$this->fp) { + return false; + } + + $b = $this->buffer; + $content_length = 0; + $content = Array(); + + while (true) { + while(($line = $b->read_line()) !== false ) { + if ($line == '') { + break 2; + } + $kv = explode(':', $line, 2); + $content[trim($kv[0])] = trim($kv[1]); + } + usleep(100); + + if (feof($this->fp)) { + break; + } + + $buffer = fgets($this->fp, 1024); + $b->append($buffer); + } + + if (array_key_exists('Content-Length', $content)) { + $str = $b->read_n($content['Content-Length']); + if ($str === false) { + while (!feof($this->fp)) { + $buffer = fgets($this->fp, 1024); + $b->append($buffer); + $str = $b->read_n($content['Content-Length']); + if ($str !== false) { + break; + } + } + } + if ($str !== false) { + $content['$'] = $str; + } + } + + return $content; + } + + public function connect($host, $port, $password) { + $fp = fsockopen($host, $port, $errno, $errdesc, 3); + + if (!$fp) { + return false; + } + + socket_set_blocking($fp, false); + $this->fp = $fp; + + // Wait auth request and send response + while (!feof($fp)) { + $event = $this->read_event(); + if(@$event['Content-Type'] == 'auth/request'){ + fputs($fp, "auth $password\n\n"); + break; + } + } + + // Wait auth response + while (!feof($fp)) { + $event = $this->read_event(); + if (@$event['Content-Type'] == 'command/reply') { + if (@$event['Reply-Text'] == '+OK accepted') { + return $fp; + } + $this->fp = false; + fclose($fp); + return false; + } + } + + return false; + } + + public function request($cmd) { + if (!$this->fp) { + return false; + } + + $cmd_array = explode("\n", $cmd); + foreach ($cmd_array as &$value) { + fputs($this->fp, $value."\n"); + } + fputs($this->fp, "\n"); //second line feed to end the headers + + $event = $this->read_event(); + + if (array_key_exists('$', $event)) { + return $event['$']; + } + return $event; + } + + public function reset_fp($fp = false){ + $tmp = $this->fp; + $this->fp = $fp; + return $tmp; + } + + public function close() { + if ($this->fp) { + fclose($fp); + $this->fp = false; + } + } +} + +/* +function event_socket_create($host, $port, $password) { + $esl = new EventSocket; + if ($esl->connect($host, $port, $password)) { + return $esl->reset_fp(); + } + return false; +} + +function event_socket_request($fp, $cmd) { + $esl = new EventSocket($fp); + $result = $esl->request($cmd); + $esl->reset_fp(); + return $result; +} +*/ + +// $esl = new EventSocket; +// $esl->connect('127.0.0.1', 8021, 'ClueCon'); +// print($esl->request('api sofia status')); + +// $fp = event_socket_create('127.0.0.1', 8021, 'ClueCon'); +// print(event_socket_request($fp, 'api sofia status')); diff --git a/resources/switch.php b/resources/switch.php index 753639d677..ff873d1ca7 100644 --- a/resources/switch.php +++ b/resources/switch.php @@ -110,76 +110,22 @@ function load_extensions() { load_extensions(); function event_socket_create($host, $port, $password) { - $fp = fsockopen($host, $port, $errno, $errdesc, 3); - socket_set_blocking($fp,false); - - if (!$fp) { - //error "invalid handle
\n"; - //echo "error number: ".$errno."
\n"; - //echo "error description: ".$errdesc."
\n"; + $esl = new EventSocket; + if ($esl->connect($host, $port, $password)) { + return $esl->reset_fp(); } - else { - //connected to the socket return the handle - while (!feof($fp)) { - $buffer = fgets($fp, 1024); - usleep(100); //allow time for reponse - if (trim($buffer) == "Content-Type: auth/request") { - fputs($fp, "auth $password\n\n"); - break; - } - } - return $fp; - } -} //end function + return false; +} function event_socket_request($fp, $cmd) { - if ($fp) { - $cmd_array = explode("\n",$cmd); - foreach ($cmd_array as &$value) { - fputs($fp, $value."\n"); - } - fputs($fp, "\n"); //second line feed to end the headers - - $response = ''; - $i = 0; - $content_length = 0; - while (!feof($fp)) { - $buffer = fgets($fp, 4096); - if ($content_length > 0) { - $response .= $buffer; - } - - if ($content_length == 0) { //if the content has length don't process again - if (strlen(trim($buffer)) > 0) { //run only if buffer has content - $array = explode(":", trim($buffer)); - if ($array[0] == "Content-Length") { - $content_length = trim($array[1]); - } - } - } - - if ($content_length > 0) { //is content_length set - //stop reading if all content has been read. - if (strlen($response) >= $content_length) { - break; - } - } - else { - //prevent an endless loop - if ($i > 300000) { break; } - } - $i++; - } - - return $response; - } - else { - echo "no handle"; - } + $esl = new EventSocket($fp); + $result = $esl->request($cmd); + $esl->reset_fp(); + return $result; } function event_socket_request_cmd($cmd) { - global $db, $domain_uuid, $host; + global $db; if (file_exists($_SERVER['DOCUMENT_ROOT'].PROJECT_PATH."/app/settings/app_config.php")) { $sql = "select * from v_settings "; @@ -195,9 +141,13 @@ function event_socket_request_cmd($cmd) { unset ($prep_statement); } - $fp = event_socket_create($event_socket_ip_address, $event_socket_port, $event_socket_password); - $response = event_socket_request($fp, $cmd); - fclose($fp); + $esl = new EventSocket; + if (!$esl->connect($event_socket_ip_address, $event_socket_port, $event_socket_password)) { + return false; + } + $response = $esl->request($cmd); + $esl->close(); + return $response; } function byte_convert($bytes, $decimals = 2) {