From c06e9a5ba955b82d637061393474cbb1536750f3 Mon Sep 17 00:00:00 2001 From: PhantomVl Date: Mon, 14 Jan 2019 12:33:24 +0300 Subject: [PATCH] - Bug fix. --- Sccp_manager.class.php | 49 +++++++++++++++++++++--- Sccp_manager.inc/srvinterface.class.php | 42 +++++++++++++++++++-- Sccp_manager.inc/xmlinterface.class.php | 37 ++++++++++++++---- conf/sccpgeneral.xml.v433 | 15 ++++++++ views/form.buttons.php | 11 ++++-- views/formShow.php | 50 ++++++++++++++++++++++++- views/server.info.php | 12 ++++-- 7 files changed, 190 insertions(+), 26 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 82c6d8e..d2500a8 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -98,6 +98,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { private $hint_context = array('default' => '@ext-local'); /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Get it from Config !!! private $val_null = 'NONE'; /// REPLACE to null Field public $sccp_model_list = array(); + public $sccp_metainfo = array(); private $cnf_wr = null; public $sccppath = array(); public $sccpvalues = array(); @@ -175,7 +176,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $htmlret .= load_view(__DIR__ . '/views/formShow.php', array( 'itm' => $item, 'h_show' => $heder_show, 'form_prefix' => $form_prefix, 'fvalues' => $form_values, - 'tftp_lang' => $this->getTftpLang()) + 'tftp_lang' => $this->getTftpLang(), 'metainfo' => $this->sccp_metainfo) ); } } else { @@ -364,6 +365,9 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { public function myShowPage() { $request = $_REQUEST; $action = !empty($request['action']) ? $request['action'] : ''; + if ($this->sccpvalues['sccp_compatible']['data'] >= '433') { + $this->sccp_metainfo = $this->srvinterface->getеtestChanSCCP_GlablsInfo('general'); + } if (!empty($this->sccpvalues['displayconfig'])) { if (!empty($this->sccpvalues['displayconfig']['data']) && ($this->sccpvalues['displayconfig']['data'] == 'sccpsimple')) { @@ -492,6 +496,9 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $request = $_REQUEST; $action = !empty($request['action']) ? $request['action'] : ''; $inputform = !empty($request['tech_hardware']) ? $request['tech_hardware'] : ''; + if ($this->sccpvalues['sccp_compatible']['data'] >= '433') { + $this->sccp_metainfo = $this->srvinterface->getеtestChanSCCP_GlablsInfo('device'); + } // print_r($inputform); if (empty($this->pagedata)) { @@ -1658,7 +1665,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { foreach ($this->sccpvalues as $key => $value) { $data_value[$key] = $value['data']; } - $data_value['server_if_list'] = $this->getIP_information(); + $data_value['server_if_list'] = $this->getIP_information2('ip4'); $model_information = $this->getSccp_model_information($get = "enabled", $validate = false); // Get Active if (empty($model_information)) @@ -1686,7 +1693,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $data_value[$key] = $value['data']; } $data_value['ntp_timezone_id'] = $this->extconfigs->getextConfig('sccp_timezone', $data_value['ntp_timezone']); - $data_value['server_if_list'] = $this->getIP_information(); + $data_value['server_if_list'] = $this->getIP_information2('ip4'); $dev_config['tftp_path'] = $this->sccppath["tftp_path"]; $dev_config['tftp_firmware'] = ''; /* if (!empty($this->sccpvalues['tftp_rewrite'])) { @@ -1911,10 +1918,42 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { return $res; } - function getIP_information() { + function getIP_information2($type = '') { + $interfaces= array(); + switch ($type) { + case 'ip4': + exec("/sbin/ip -4 -o addr", $result, $ret); + break; + case 'ip6': + exec("/sbin/ip -6 -o addr", $result, $ret); + break; + + default: + exec("/sbin/ip -o addr", $result, $ret); + break; + } + foreach ($result as $line) { + $vals = preg_split("/\s+/", $line); + if ($vals[3] == "mtu") + continue; + if ($vals[2] != "inet" && $vals[2] != "inet6") + continue; + if (preg_match("/(.+?)(?:@.+)?:$/", $vals[1], $res)) { + continue; + } + $ret = preg_match("/(\d*+.\d*+.\d*+.\d*+)[\/(\d*+)]*/", $vals[3], $ip); + + $interfaces[$vals[1].':'.$vals[2]] = Array('name' => $vals[1],'type' => $vals[2], 'ip' => ((empty($ip[1]) ? '' : $ip[1]))); + } + return $interfaces; + } + + + + function getIP_information_old() { $interfaces['auto'] = array('0.0.0.0', 'All', '0'); - exec("/sbin/ip -o addr", $result, $ret); + exec("/sbin/ip -4 -o addr", $result, $ret); foreach ($result as $line) { $vals = preg_split("/\s+/", $line); diff --git a/Sccp_manager.inc/srvinterface.class.php b/Sccp_manager.inc/srvinterface.class.php index 5860881..e3edc0e 100644 --- a/Sccp_manager.inc/srvinterface.class.php +++ b/Sccp_manager.inc/srvinterface.class.php @@ -463,6 +463,38 @@ class srvinterface { $metadata = $astman->send_request($action, $params); return $metadata; } + /* + * [Segments] => ( [0] => general [1] => device [2] => line [3] => softkey ) + */ + function getеtestChanSCCP_GlablsInfo($Segment='') { + global $astman; + $params = array(); + $response = $astman->send_request('SCCPConfigMetaData', $params); + + $action = 'SCCPConfigMetaData'; + if (empty($Segment)) { + $Segment = 'general'; + } + $params = array('Segment' => $Segment, 'ResultFormat'=>'command' ); + $metadata = $astman->send_request($action, $params); + if (!empty($metadata['data'])) { + $tmp_data = $metadata['data']; + if (strpos($tmp_data, 'JSON:')!==false ) { + $decode = json_decode(substr ($tmp_data,strpos($tmp_data, 'JSON:') + 5), true); + $result = array(); + if (!empty($decode['Options'])) { + foreach ($decode['Options'] as $value) { + $result[$value['Name']] = $value; + } + return $result; + } + return $decode; + } + + } + return $metadata; + } + /* private function astLogin($host="localhost", $username="admin", $password="amp111"){ @@ -607,11 +639,13 @@ class srvinterface { fputs ($fp,"Secret: ".$amp_conf[AMPMGRPASS]."\r\n"); fputs ($fp,"Events: on\r\n\r\n"); - fputs ($fp,"Action: SCCPShowDevices\r\n"); +// fputs ($fp,"Action: SCCPShowDevices\r\n"); -// fputs ($fp,"Action: SCCPConfigMetaData\r\n"); -// fputs ($fp,"Segment: device\r\n"); -// fputs ($fp,"ResultFormat: command\r\n"); + fputs ($fp,"Action: SCCPConfigMetaData\r\n"); +// fputs ($fp,"Segment: general\r\n"); +// "Segments":["general","device","line","softkey"]} + fputs ($fp,"Segment: device\r\n"); + fputs ($fp,"ResultFormat: command\r\n"); fputs ($fp,"\r\n"); /* diff --git a/Sccp_manager.inc/xmlinterface.class.php b/Sccp_manager.inc/xmlinterface.class.php index b0d2e1e..bf3f675 100644 --- a/Sccp_manager.inc/xmlinterface.class.php +++ b/Sccp_manager.inc/xmlinterface.class.php @@ -44,15 +44,26 @@ class xmlinterface { $xnode = &$xml_work->callManagerGroup->members; if ($data_values['bindaddr'] == '0.0.0.0') { $ifc = 0; +// $xnode->member['priority'] = print_r($data_values['server_if_list'], true); foreach ($data_values['server_if_list'] as $value) { - if (!empty($value[0])) { - if (!in_array($value[0], array('0.0.0.0', '127.0.0.1'), true)) { + if (!empty($value['ip'])) { + $ip_valid = true; + if (!empty($data_values['ccm_address'])) { + if (strpos($data_values['ccm_address'], 'internal') !== false || strpos($data_values['ccm_address'], '0.0.0.0') !== false ) { + // Skip + } else { + if (strpos($data_values['ccm_address'], $value['ip']) === false) { + $ip_valid = false; + } + } + } + if (!in_array($value['ip'], array('0.0.0.0', '127.0.0.1'), true) && ($ip_valid)) { $xnode_obj = clone $xnode->member; $xnode_obj['priority'] = $ifc; //$xnode_obj = &$xnode -> member -> callManager; $xnode_obj->callManager->name = $data_values['servername']; $xnode_obj->callManager->ports->ethernetPhonePort = $data_values['port']; - $xnode_obj->callManager->processNodeName = $value[0]; + $xnode_obj->callManager->processNodeName = $value['ip']; if ($ifc === 0) { $this->replaceSimpleXmlNode($xnode->member, $xnode_obj); } else { @@ -240,16 +251,28 @@ class xmlinterface { if ($data_values['bindaddr'] == '0.0.0.0') { $ifc = 0; foreach ($data_values['server_if_list'] as $value) { - if (!empty($value[0])) { - if (!in_array($value[0], array('0.0.0.0', '127.0.0.1'), true)) { - $xnode_obj = clone $xnode->member; + + if (!empty($value['ip'])) { + $ip_valid = true; + if (!empty($data_values['ccm_address'])) { + if (strpos($data_values['ccm_address'], 'internal') !== false || strpos($data_values['ccm_address'], '0.0.0.0') !== false ) { + // Skip + } else { + if (strpos($data_values['ccm_address'], $value['ip']) === false) { + $ip_valid = false; + } + } + } + if (!in_array($value['ip'], array('0.0.0.0', '127.0.0.1'), true) && ($ip_valid)) { + + $xnode_obj = clone $xnode->member; // $xnode_obj = $xnode -> member; // $xnode_obj = $xnode -> addChild($xnode->member); $xnode_obj['priority'] = $ifc; //$xnode_obj = &$xnode -> member -> callManager; $xnode_obj->callManager->name = $data_values['servername']; $xnode_obj->callManager->ports->ethernetPhonePort = $data_values['port']; - $xnode_obj->callManager->processNodeName = $value[0]; + $xnode_obj->callManager->processNodeName = $value['ip']; if ($ifc === 0) { $this->replaceSimpleXmlNode($xnode->member, $xnode_obj); } else { diff --git a/conf/sccpgeneral.xml.v433 b/conf/sccpgeneral.xml.v433 index ee34552..9a2a0b1 100644 --- a/conf/sccpgeneral.xml.v433 +++ b/conf/sccpgeneral.xml.v433 @@ -105,8 +105,10 @@ and open the template in the editor. Base Version before all crash :-) External IP Address of the firewall, required in case the PBX is running on a seperate host behind it. IP Address that we're going to notify in RTP media stream as the pbx source address. + 1 / + @@ -201,6 +203,19 @@ and open the template in the editor. Base Version before all crash :-) All RFC 1918 addresses are local networks. Should always be at least '0.0.0.0/0.0.0.0'. + + + ccm_address + Internal + 0.0.0.0 + + + + + + Add Address + This function is useful when the server has many interfaces, but devices must connect only to some interfaces. + + diff --git a/views/form.buttons.php b/views/form.buttons.php index 160c19b..0969948 100644 --- a/views/form.buttons.php +++ b/views/form.buttons.php @@ -97,11 +97,10 @@ if (!empty($_REQUEST['new_id'])) { $defaul_tv = (empty($db_buttons[$line_id])) ? "empty": $db_buttons[$line_id]['type']; $defaul_btn = (empty($db_buttons[$line_id])) ? "": $db_buttons[$line_id]['name']; $defaul_opt = (empty($db_buttons[$line_id])) ? array(''): explode(',',$db_buttons[$line_id]['options']); -// print_r($defaul_btn); -// print_r($defaul_opt); $show_form_mode = $defaul_tv; - $def_hint = ''; + $def_hint = ''; // Hint check Box + $def_hint_btn = ''; // Hint Combo Box $def_silent = ''; $defaul_advline = ''; if (strpos($defaul_btn,'@') >0) { @@ -128,17 +127,21 @@ if (!empty($_REQUEST['new_id'])) { $test_btn = strtok($data_i,'@'); $def_hint = 'checked'; $defaul_btn = $data_i; + $def_hint_btn = $data_i; if ($test_btn == $defaul_opt[0]) { foreach ($lines_list as $data){ if ($data['name']==$test_btn) { $show_form_mode = 'line'; $defaul_tv = 'monitor'; + $defaul_btn = $test_btn; break; } } } } } +// print_r($defaul_btn); +// print_r($defaul_opt); echo ''; echo '
'; @@ -208,7 +211,7 @@ if (!empty($_REQUEST['new_id'])) { echo ''; diff --git a/views/formShow.php b/views/formShow.php index 63a9fd5..1e0df54 100644 --- a/views/formShow.php +++ b/views/formShow.php @@ -38,6 +38,7 @@ $time_zone = array('-12' => 'GTM -12', '-11' => 'GTM -11', '-10' => 'GTM -10', ' $time_zone_name = \FreePBX::Sccp_manager()-> extconfigs-> getextConfig('cisco_timezone'); //$time_zone = \FreePBX::Sccp_manager()-> extconfigs-> getextConfig('cisco_time'); //$system_time_zone = \FreePBX::Sccp_manager()->getSysnemTimeZone(); +//print_r($metainfo); if (\FreePBX::Modules()->checkStatus("soundlang")) { $syslangs = \FreePBX::Soundlang()->getLanguages(); @@ -76,13 +77,22 @@ if ($h_show==1) { } foreach ($items as $child) { if (empty($child->help)) { - $child->help = 'Help is not available.'; + $child->help = 'Help is not available.'; + $child->meta_help = '1'; } +// $child->meta_help = '1'; // Remove comments to see original help ! if ($child['type'] == 'IE') { $res_input = ''; $res_name = ''; - $res_id = $npref.$child->input[0]->name; + $res_oid = (string)$child->input[0]->name; + $res_id = $npref.$res_oid; + if (!empty($metainfo[$res_oid])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_oid]['Description']; + } + } + // --- Add Hiden option $res_sec_class =''; if (!empty($child ->class)){ @@ -158,8 +168,14 @@ foreach ($items as $child) { $res_input = ''; $res_name = ''; $res_value = ''; + $opt_at = array(); $res_n = (string)$child->name; + if (!empty($metainfo[$res_n])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_n]['Description']; + } + } // $res_value $lnhtm = ''; $res_id = $napref.$child->name; @@ -300,6 +316,12 @@ foreach ($items as $child) { if ($child['type'] == 'IS') { $res_n = (string)$child->name; $res_id = $npref.$child->name; + if (!empty($metainfo[$res_n])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_n]['Description']; + } + } + // --- Add Hiden option $res_sec_class =''; if (!empty($child ->class)){ @@ -377,6 +399,12 @@ foreach ($items as $child) { // $value = $child -> select; $res_n = (string)$child ->name; $res_id = $npref.$res_n; + if (!empty($metainfo[$res_n])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_n]['Description']; + } + } + if (empty($child->class)) { $child->class = 'form-control'; } @@ -440,6 +468,11 @@ foreach ($items as $child) { $res_id = $npref.$res_n; $child->value =''; + if (!empty($metainfo[$res_n])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_n]['Description']; + } + } if ($child['type'] == 'SLS') { $select_opt= $syslangs; @@ -530,6 +563,12 @@ foreach ($items as $child) { if ($child['type'] == 'SL') { $res_n = (string)$child->name; $res_id = $npref.$child->name; + + if (!empty($metainfo[$res_n])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_n]['Description']; + } + } if (empty($child ->class)) { $child->class = 'form-control'; @@ -584,6 +623,13 @@ foreach ($items as $child) { // $value = $child -> select; $res_n = (string)$child ->name; $res_id = $npref.$res_n; + + if (!empty($metainfo[$res_n])){ + if ($child->meta_help == '1' || $child->help == 'Help!') { + $child->help = $metainfo[$res_n]['Description']; + } + } + if (empty($child->class)) { $child->class = 'form-control'; } diff --git a/views/server.info.php b/views/server.info.php index f9fdc6d..a4e3768 100644 --- a/views/server.info.php +++ b/views/server.info.php @@ -57,6 +57,7 @@ if (empty($ast_realtime)) { } $info['RealTime'] = array('Version' => $rt_sccp, 'about'=> $rt_info); } + if (empty($conf_realtime)) { $info['ConfigsRealTime'] = array('Version' => 'Error', 'about'=> '
No found Real Time Configs
'); } else { @@ -70,18 +71,21 @@ if (empty($conf_realtime)) { $info['ConfigsRealTime'] = array('Version' => 'Error', 'about'=> $rt_info); } } -/* //global $amp_conf; +/* print_r("
Request:
");
  $json = '';
  print_r("
"); - //print_r($conf_realtime); + print_r($conf_realtime); print_r("
"); print_r("
"); - //print_r($amp_conf); + print_r($ast_realtime); // print_r("DIRECT START"); + print_r($this->sccpvalues['ccm_address']); print_r("
"); -// print_r($this->srvinterface->t_get_meta_data()); +// print_r($this->getIP_information2()); +// print_r($this->srvinterface->getеtestChanSCCP_GlablsInfo()); +// print_r($this->sccp_metainfo); print("
"); */ // $lang_arr = $this->extconfigs->getextConfig('sccp_lang','sk_SK');