From 4b6ebea9847a4935421e1d2f65c63d7dfd037db6 Mon Sep 17 00:00:00 2001 From: PhantomVl Date: Thu, 2 Nov 2017 11:10:48 +0300 Subject: [PATCH] Begin resample Sccp_manager Create seporated interface to Xml --- Sccp_manager.class.php | 57 ++++ Sccp_manager.inc/extconfigs.class.php | 52 ++-- Sccp_manager.inc/xmlinterface.class.php | 342 ++++++++++++++++++++++++ conf/sccpgeneral.xml.v431 | 2 +- views/server.info.php | 1 + 5 files changed, 427 insertions(+), 27 deletions(-) create mode 100644 Sccp_manager.inc/xmlinterface.class.php diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 69cd42f..ce4ce4f 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -30,7 +30,17 @@ * + Change internal use Field to _Field (new feature in chan_sccp (added for Sccp_manager)) * + Delete phone XML * + Change Installer ?? (test ) + * + Installer Realtime config update + * + Installer Adaptive DB reconfig. + * + Add system info page + * + Change Cisco Language data + * + Make DB Acces from separate class + * + Make System Acces from separate class + * + Make Var elements from separate class + * - To make creating XML files in a separate class + * - Add Switch to select XML schema (display) * - Bootstrap encodeURI(row['type']) ??????? + * - Check Time zone .... * + SRST Config * - Failover config * + Auto Addons! @@ -1637,6 +1647,21 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { */ function sccp_create_tftp_XML() { + + foreach ($this->sccpvalues as $key => $value) { + $data_value[$key] = $value['data']; + } + $data_value['server_if_list'] = $this->getIP_information(); + $model_information = $this->getSccp_model_information($get = "enabled", $validate = false); // Get Active + + if (empty($model_information)) + $model_information = $this->getSccp_model_information($get = "all", $validate = false); // Get All + + $lang_data = $this->extconfigs->getextConfig('sccp_lang'); + + $this->xmlinterface->create_default_XML($this->sccppath["tftp_path"], $data_value, $model_information, $lang_data); + +/* $def_xml_fields = array('authenticationURL', 'informationURL', 'messagesURL', 'servicesURL', 'directoryURL', 'proxyServerURL', 'idleTimeout', 'idleURL'); $def_xml_locale = array('userLocale', 'networkLocaleInfo', 'networkLocale'); $xml_name = $this->sccppath["tftp_path"] . '/XMLDefault.cnf.xml'; @@ -1722,6 +1747,8 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // // die(print_r($xml_work)); } + * + */ } /* @@ -1729,6 +1756,34 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { */ function sccp_create_device_XML($dev_id = '') { + + if (empty($dev_id)) { + return false; + } + + $dev_config = $this->dbinterface->get_db_SccpTableData("get_sccpdevice_byid", array('id' => $dev_id)); + + foreach ($this->sccpvalues as $key => $value) { + $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(); + + $dev_config['addon_info'] = array(); + if (!empty($dev_config['addon'])) { + $hw_addon = explode(',', $dev_config['addon']); + foreach ($hw_addon as $key) { + $hw_data = $this->getSccp_model_information('byid', false, "all", array('model' => $key)); + $dev_config['addon_info'][$key] = $hw_data[0]['loadimage']; + } + } + $lang_data = $this->extconfigs->getextConfig('sccp_lang'); + + return $this->xmlinterface->create_SEP_XML($this->sccppath["tftp_path"], $data_value, $dev_config, $dev_id, $lang_data); + + + /* + $var_xml_general_fields = array('authenticationURL' => 'dev_authenticationURL', 'informationURL' => 'dev_informationURL', 'messagesURL' => 'dev_messagesURL', 'servicesURL' => 'dev_servicesURL', 'directoryURL' => 'dev_directoryURL', 'proxyServerURL' => 'dev_proxyServerURL', 'idleTimeout' => 'dev_idleTimeout', 'idleURL' => 'dev_idleURL', 'sshUserId' => 'dev_sshUserId', 'sshPassword' => 'dev_sshPassword', 'deviceProtocol' => 'dev_deviceProtocol' @@ -1937,6 +1992,8 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { die('Error Hardware templatee :' . $xml_template . ' not found'); } return time(); + * + */ } function sccp_delete_device_XML($dev_id = '') { diff --git a/Sccp_manager.inc/extconfigs.class.php b/Sccp_manager.inc/extconfigs.class.php index 793e1e9..0b3c3fd 100644 --- a/Sccp_manager.inc/extconfigs.class.php +++ b/Sccp_manager.inc/extconfigs.class.php @@ -134,35 +134,35 @@ class extconfigs { 'Dateline' => array('offset' => '-720', 'daylight' => ''), 'Samoa' => array('offset' => '-660', 'daylight' => ''), 'Hawaiian' => array('offset' => '-600', 'daylight' => ''), - 'Alaskan' => array('offset' => '-540', 'daylight' => 'Daylight Time'), - 'Pacific' => array('offset' => '-480', 'daylight' => 'Daylight Time'), - 'Mountain' => array('offset' => '-420', 'daylight' => 'Daylight Time'), + 'Alaskan' => array('offset' => '-540', 'daylight' => 'Daylight'), + 'Pacific' => array('offset' => '-480', 'daylight' => 'Daylight'), + 'Mountain' => array('offset' => '-420', 'daylight' => 'Daylight'), 'US Mountain' => array('offset' => '-420', 'daylight' => ''), - 'Central' => array('offset' => '-360', 'daylight' => 'Daylight Time'), - 'Mexico' => array('offset' => '-360', 'daylight' => 'Daylight Time'), + 'Central' => array('offset' => '-360', 'daylight' => 'Daylight'), + 'Mexico' => array('offset' => '-360', 'daylight' => 'Daylight'), 'Canada Central' => array('offset' => '-360', 'daylight' => ''), 'SA Pacific' => array('offset' => '-300', 'daylight' => ''), - 'Eastern' => array('offset' => '-300', 'daylight' => 'Daylight Time'), + 'Eastern' => array('offset' => '-300', 'daylight' => 'Daylight'), 'US Eastern' => array('offset' => '-300', 'daylight' => ''), - 'Atlantic' => array('offset' => '-240', 'daylight' => 'Daylight Time'), + 'Atlantic' => array('offset' => '-240', 'daylight' => 'Daylight'), 'SA Western' => array('offset' => '-240', 'daylight' => ''), 'Pacific SA' => array('offset' => '-240', 'daylight' => ''), - 'Newfoundland' => array('offset' => '-210', 'daylight' => 'Daylight Time'), - 'E. South America' => array('offset' => '-180', 'daylight' => 'Daylight Time'), + 'Newfoundland' => array('offset' => '-210', 'daylight' => 'Daylight'), + 'E. South America' => array('offset' => '-180', 'daylight' => 'Daylight'), 'SA Eastern' => array('offset' => '-180', 'daylight' => ''), - 'Pacific SA' => array('offset' => '-180', 'daylight' => 'Daylight Time'), - 'Mid-Atlantic' => array('offset' => '-120', 'daylight' => 'Daylight Time'), - 'Azores' => array('offset' => '-060', 'daylight' => 'Daylight Time'), - 'GMT' => array('offset' => '00', 'daylight' => 'Daylight Time'), + 'Pacific SA' => array('offset' => '-180', 'daylight' => 'Daylight'), + 'Mid-Atlantic' => array('offset' => '-120', 'daylight' => 'Daylight'), + 'Azores' => array('offset' => '-060', 'daylight' => 'Daylight'), + 'GMT' => array('offset' => '00', 'daylight' => 'Daylight'), 'Greenwich' => array('offset' => '00', 'daylight' => ''), - 'W. Europe' => array('offset' => '60', 'daylight' => 'Daylight Time'), - 'GTB' => array('offset' => '60', 'daylight' => 'Daylight Time'), - 'Egypt' => array('offset' => '60', 'daylight' => 'Daylight Time'), - 'E. Europe' => array('offset' => '60', 'daylight' => 'Daylight Time'), - 'Romance' => array('offset' => '120', 'daylight' => 'Daylight Time'), - 'Central Europe' => array('offset' => '120', 'daylight' => 'Daylight Time'), + 'W. Europe' => array('offset' => '60', 'daylight' => 'Daylight'), + 'GTB' => array('offset' => '60', 'daylight' => 'Daylight'), + 'Egypt' => array('offset' => '60', 'daylight' => 'Daylight'), + 'E. Europe' => array('offset' => '60', 'daylight' => 'Daylight'), + 'Romance' => array('offset' => '120', 'daylight' => 'Daylight'), + 'Central Europe' => array('offset' => '120', 'daylight' => 'Daylight'), 'South Africa' => array('offset' => '120', 'daylight' => ''), - 'Jerusalem' => array('offset' => '120', 'daylight' => 'Daylight Time'), + 'Jerusalem' => array('offset' => '120', 'daylight' => 'Daylight'), 'Saudi Arabia' => array('offset' => '180', 'daylight' => ''), /* Russion Regions */ 'Russian/Kaliningrad' => array('offset' => '120', 'daylight' => ''), @@ -180,8 +180,8 @@ class extconfigs { 'Russian/Kamchatka' => array('offset' => '720', 'daylight' => ''), /* EnD - Russion Regions */ - 'Iran' => array('offset' => '210', 'daylight' => 'Daylight Time'), - 'Caucasus' => array('offset' => '240', 'daylight' => 'Daylight Time'), + 'Iran' => array('offset' => '210', 'daylight' => 'Daylight'), + 'Caucasus' => array('offset' => '240', 'daylight' => 'Daylight'), 'Arabian' => array('offset' => '240', 'daylight' => ''), 'Afghanistan' => array('offset' => '270', 'daylight' => ''), 'West Asia' => array('offset' => '300', 'daylight' => ''), @@ -191,15 +191,15 @@ class extconfigs { 'China' => array('offset' => '480', 'daylight' => ''), 'Taipei' => array('offset' => '480', 'daylight' => ''), 'Tokyo' => array('offset' => '540', 'daylight' => ''), - 'Cen. Australia' => array('offset' => '570', 'daylight' => 'Daylight Time'), + 'Cen. Australia' => array('offset' => '570', 'daylight' => 'Daylight'), 'AUS Central' => array('offset' => '570', 'daylight' => ''), 'E. Australia' => array('offset' => '600', 'daylight' => ''), - 'AUS Eastern' => array('offset' => '600', 'daylight' => 'Daylight Time'), + 'AUS Eastern' => array('offset' => '600', 'daylight' => 'Daylight'), 'West Pacific' => array('offset' => '600', 'daylight' => ''), - 'Tasmania' => array('offset' => '600', 'daylight' => 'Daylight Time'), + 'Tasmania' => array('offset' => '600', 'daylight' => 'Daylight'), 'Central Pacific' => array('offset' => '660', 'daylight' => ''), 'Fiji' => array('offset' => '720', 'daylight' => ''), - 'New Zealand' => array('offset' => '720', 'daylight' => 'Daylight Time') + 'New Zealand' => array('offset' => '720', 'daylight' => 'Daylight') ); } \ No newline at end of file diff --git a/Sccp_manager.inc/xmlinterface.class.php b/Sccp_manager.inc/xmlinterface.class.php new file mode 100644 index 0000000..8005df8 --- /dev/null +++ b/Sccp_manager.inc/xmlinterface.class.php @@ -0,0 +1,342 @@ + '13.0.2', + 'about' =>'Create XML data interface v. 13.0.2'); + } + + + function create_default_XML($data_path = '', $data_values= array(), $model_information =array(), $lang_info =array()) { + if (empty($data_path) || empty($data_values)) { + return; + } + $def_xml_fields = array('authenticationURL', 'informationURL', 'messagesURL', 'servicesURL', 'directoryURL', 'proxyServerURL', 'idleTimeout', 'idleURL'); + $def_xml_locale = array('userLocale', 'networkLocaleInfo', 'networkLocale'); + $xml_name = $data_path . '/XMLDefault.cnf.xml'; + $xml_template = $data_path . '/templates/XMLDefault.cnf.xml_template'; + + if (file_exists($xml_template)) { + $xml_work = simplexml_load_file($xml_template); + + + $xnode = &$xml_work->callManagerGroup->members; + 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; + $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]; + if ($ifc === 0) { + $this->replaceSimpleXmlNode($xnode->member, $xnode_obj); + } else { + $this->appendSimpleXmlNode($xnode->member, $xnode_obj); + } + $ifc ++; + } + } + } + } else { + $xnode->member['priority'] = '0'; + $xnode_obj = &$xnode->member->callManager; + $xnode_obj->name = $data_values['servername']; + $xnode_obj->ports->ethernetPhonePort = $data_values['port']; + $xnode_obj->processNodeName = $data_values['bindaddr']; + } + $this->replaceSimpleXmlNode($xml_work->callManagerGroup->members, $xnode); + + foreach ($def_xml_fields as $value) { + if (!empty($data_values['dev_' . $value])) { + $xml_work->$value = trim($data_values['dev_' . $value]); + } + } + foreach ($def_xml_locale as $key) { + if (!empty($xml_work->$key)) { + $xnode = &$xml_work->$key; + switch ($key) { + case 'userLocale': + case 'networkLocaleInfo': + if ($key == 'networkLocaleInfo') { + $lang = $data_values['netlang']; + } else { + $lang = $data_values['devlang']; + } +// configs->getConfig('sccp_lang') + if (isset($lang_info[$lang])) { + $xnode->name = $lang_info[$lang]['locale']; + $xnode->langCode = $lang_info[$lang]['code']; + } else { + $xnode->name = ''; + $xnode->langCode = ''; + } +// $this -> replaceSimpleXmlNode($xml_work->$key,$xnode); + break; + case 'networkLocale': + $lang = $data_values['netlang']; + if (isset($lang_info[$lang])) { + $xnode = $lang_info[$lang]['language']; + } else { + $xnode = ''; + } + break; + } + //$this-> replaceSimpleXmlNode($xml_work->$value, $xnode ); + } + } + + foreach ($model_information as $var) { + if (!empty($var['loadinformationid'])) { + $node = $xml_work->addChild($var['loadinformationid'], $var['loadimage']); + $node->addAttribute('model', $var['vendor'] . ' ' . $var['model']); + } + } + $xml_work->asXml($xml_name); // Save XMLDefault1.cnf.xml + } + } + + + function create_SEP_XML($data_path = '', $data_values= array(), $dev_config = array(), $dev_id = '',$lang_info =array()) { + + $var_xml_general_fields = array('authenticationURL' => 'dev_authenticationURL', 'informationURL' => 'dev_informationURL', 'messagesURL' => 'dev_messagesURL', + 'servicesURL' => 'dev_servicesURL', 'directoryURL' => 'dev_directoryURL', 'proxyServerURL' => 'dev_proxyServerURL', 'idleTimeout' => 'dev_idleTimeout', + 'idleURL' => 'dev_idleURL', 'sshUserId' => 'dev_sshUserId', 'sshPassword' => 'dev_sshPassword', 'deviceProtocol' => 'dev_deviceProtocol' + ); + $var_xml_general_vars = array('capfAuthMode' => 'null', 'capfList'=> 'null', 'mobility' => 'null', + 'phoneServices' =>'null', 'certHash' =>'null', + 'deviceSecurityMode' => '1'); + + if (empty($dev_id)) { + return false; + } +// $var_hw_config = $this->dbinterface->get_db_SccpTableData("get_sccpdevice_byid", array('id' => $dev_id)); + + if (empty($dev_config)) { + return false; + } + + if (!empty($dev_config['nametemplate'])) { + $xml_template = $data_path . '/templates/' . $dev_config['nametemplate']; + } else { + $xml_template = $data_path . '/templates/SEP0000000000.cnf.xml_79df_template'; + } + $xml_name = $data_path . '/' . $dev_id . '.cnf.xml'; + if (file_exists($xml_template)) { + $xml_work = simplexml_load_file($xml_template); + + foreach ($var_xml_general_vars as $key => $data) { + if (isset($xml_work->$key)) { + if ($data != 'null') { + $xml_work->$key = $data; + } else { + $node = $xml_work->$key; + unset($node[0][0]); + } + } + } + + foreach ($xml_work as $key => $data) { +// Set System global Values + if (!empty($var_xml_general_fields[$key])) { + $xml_work->$key = $data_values[$var_xml_general_fields[$key]]; + } +// Set section Values + $xml_node = $xml_work->$key; + switch ($key) { + case 'devicePool': + $xml_node = $xml_work->$key; + foreach ($xml_work->$key->children() as $dkey => $ddata) { + switch ($dkey) { + case 'dateTimeSetting': + $xnode = &$xml_node->$dkey; + $tz_id = $data_values['ntp_timezone']; + $TZdata = $data_values['ntp_timezone_id']; + if (empty($TZdata)){ + $TZdata = array('offset' => '0', 'daylight' => ''); + } + $xnode->name = $tz_id; + $xnode->dateTemplate = $data_values['dateformat']; + $xnode->timeZone = $tz_id.' Standard'.((empty($TZdata['daylight']))? '': '/'.$TZdata['daylight']).' Time'; + + if ($data_values['ntp_config_enabled'] == 'yes') { + $xnode->ntps->ntp->name = $data_values['ntp_server']; + $xnode->ntps->ntp->ntpMode = $data_values['ntp_server_mode']; + } else { + $xnode->ntps = ''; + } + // Ntp Config + break; + case 'srstInfo': + if ($data_values['srst_Option'] == 'user') { + break; + } + $xnode = &$xml_node->$dkey; + $xnode -> name = $data_values['srst_Name']; + $xnode -> srstOption = $data_values['srst_Option']; + $xnode -> userModifiable = $data_values['srst_userModifiable']; + $xnode -> isSecure = $data_values['srst_isSecure']; + + $srst_fld = array('srst_ip' => array('ipAddr','port') ); +// $srst_fld = array('srst_ip' => array('ipAddr','port') , 'srst_sip' => array('sipIpAddr','sipPort') ); + foreach ($srst_fld as $srst_pro => $srs_put){ + $srst_data = explode(';', $data_values[$srst_pro]); + $si = 1; +// $xnode['test'] = $srst_data[0]; + foreach ($srst_data as $value) { + $srs_val = explode('/',$value); + $nod = $srs_put[0].$si; + $xnode -> $nod = $srs_val[0]; + $nod = $srs_put[1].$si; + $xnode -> $nod = $srs_val[1]; + $si ++; + } + while ($si < 4) { + $nod = $srs_put[0].$si; + $xnode -> $nod = ''; + $nod = $srs_put[1].$si; + $xnode -> $nod = ''; + $si ++; + } + } + break; + case 'connectionMonitorDuration': + $xml_node->$dkey = strval(intval(intval($data_values['keepalive'])* 0.75)); + break; + case 'callManagerGroup': + $xnode = &$xml_node->$dkey->members; + 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; +// $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]; + if ($ifc === 0) { + $this->replaceSimpleXmlNode($xnode->member, $xnode_obj); + } else { + $this->appendSimpleXmlNode($xnode->member, $xnode_obj); + } + $ifc ++; + } + } + } + } else { + $xnode->member['priority'] = '0'; + $xnode_obj = &$xnode->member->callManager; + $xnode_obj->name = $data_values['servername']; + $xnode_obj->ports->ethernetPhonePort = $data_values['port']; + $xnode_obj->processNodeName = $data_values['bindaddr']; + } + break; + } + } + $this->replaceSimpleXmlNode($xml_work->$key, $xml_node); + break; + case 'versionStamp': + $xml_work->$key = time(); + break; + case 'loadInformation': + $xml_work->$key = $dev_config["loadimage"]; + if (!empty($dev_config['addon'])) { + $xnode = $xml_work->addChild('addOnModules'); + $ti = 1; + foreach ($dev_config['addon_info'] as $add_key => $add_val) { + $xnode_obj = $xnode->addChild('addOnModule'); + $xnode_obj->addAttribute('idx', $ti); + $xnode_obj->addChild('loadInformation', $add_val); + $ti ++; + } +// $this->appendSimpleXmlNode($xml_work , $xnode_obj); + } + break; + case 'userLocale': + case 'networkLocaleInfo': + case 'networkLocale': + $hwlang = ''; + $lang = ''; + if (!empty($dev_config["_hwlang"])) { + $hwlang = explode(':', $dev_config["_hwlang"]); + } + if (($key == 'networkLocaleInfo') || ($key == 'networkLocale')) { + $lang = (empty($hwlang[0])) ? $data_values['netlang'] : $hwlang[0]; + } else { + $lang = (empty($hwlang[1])) ? $data_values['devlang'] : $hwlang[1]; + } + if (($lang !='null') && (!empty(trim($lang)))) { + if ($key == 'networkLocale') { + $xml_work->$key = $lang; + } else { + if (isset($lang_info[$lang])) { + $xml_node->name = $lang_info[$lang]['locale']; + $xml_node->langCode = $lang_info[$lang]['code']; + $this->replaceSimpleXmlNode($xml_work->$key, $xml_node); + } + } + } else { + $xml_work->$key =''; + } + break; +// Move all set to $var_xml_general_vars +// case 'mobility': +// case 'capfList': +// break; +// case 'phoneServices': +// break; +// $xml_work->$key = ''; + default: + break; + } + } + +// print_r($xml_work); + $xml_work->asXml($xml_name); // Save + } else { + die('Error Hardware templatee :' . $xml_template . ' not found'); + } + return time(); + } + + + + private function replaceSimpleXmlNode($xml, $element = SimpleXMLElement) { + $dom = dom_import_simplexml($xml); + $import = $dom->ownerDocument->importNode( + dom_import_simplexml($element), TRUE + ); + $dom->parentNode->replaceChild($import, $dom); + } + + private function appendSimpleXmlNode($xml, $element = SimpleXMLElement) { + + $dom = dom_import_simplexml($xml); + $import = $dom->ownerDocument->importNode( + dom_import_simplexml($element), TRUE + ); +// $dom->parentNode->appendChild($import, $dom); + $dom->parentNode->appendChild($import->cloneNode(true)); + } + + + +} \ No newline at end of file diff --git a/conf/sccpgeneral.xml.v431 b/conf/sccpgeneral.xml.v431 index c4e5500..266c027 100644 --- a/conf/sccpgeneral.xml.v431 +++ b/conf/sccpgeneral.xml.v431 @@ -47,7 +47,7 @@ and open the template in the editor. Base Version before all crash :-) - + diff --git a/views/server.info.php b/views/server.info.php index 9b35e97..1c61bc6 100644 --- a/views/server.info.php +++ b/views/server.info.php @@ -17,6 +17,7 @@ $info = array(); $info['srvinterface'] = $this->srvinterface->info(); $info['extconfigs'] = $this->extconfigs->info(); $info['dbinterface'] = $this->dbinterface->info(); +$info['XML'] = $this->xmlinterface->info(); $info['sccp_class'] = $driver['sccp']; $info['Core_sccp'] = array('Version' => $core['Version'], 'about'=> 'Sccp ver.'. $core['Version'].' r'.$core['vCode']. ' Revision :'. $core['RevisionNum']); $info['Asterisk'] = array('Version' => FreePBX::Config()->get('ASTVERSION'), 'about'=> 'Asterisk.');