From 519c9a1f3ba8332d8ec740e36395eb3f5e1a6238 Mon Sep 17 00:00:00 2001 From: stevenA Date: Sat, 15 Jan 2022 17:00:19 +0100 Subject: [PATCH] Optimise aminterface class Remove duplicate functions Remove legacy tests from _Construct Optimise JSON handling (eliminate duplicate parsing of rawMessage) Optimise Message class _Construct - high load so minimise unnecessary calls --- Sccp_manager.class.php | 7 +- install.php | 19 +-- .../amInterfaceClasses/Message.class.php | 126 ++++++++++-------- .../amInterfaceClasses/Response.class.php | 10 +- sccpManClasses/aminterface.class.php | 40 +----- sccpManClasses/xmlinterface.class.php | 10 +- views/server.info.php | 2 +- 7 files changed, 94 insertions(+), 120 deletions(-) diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php index 24bf179..e6b0735 100644 --- a/Sccp_manager.class.php +++ b/Sccp_manager.class.php @@ -165,7 +165,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { // load metainfo from chan-sccp - help information if not in xml. Only load first time as static data. if (empty($this->sccpHelpInfo)) { $sysConfiguration = $this->aminterface->getSCCPConfigMetaData('general'); - foreach ($sysConfiguration['Options'] as $key => $valueArray) { foreach ($valueArray['Description'] as $descKey => $descValue) { $this->sccpHelpInfo[$valueArray['Name']] .= $descValue . '
'; @@ -920,12 +919,10 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO { $dev_config['addon_info'][$key] = $hw_data[0]['loadimage']; } } - - $lang_data = $this->extconfigs->getExtConfig('sccp_lang'); if (!$sccp_native) { - return $this->xmlinterface->create_SEP_SIP_XML($this->sccppath["tftp_store_path"], $data_value, $dev_config, $dev_id, $lang_data); + return $this->xmlinterface->create_SEP_SIP_XML($this->sccppath["tftp_store_path"], $data_value, $dev_config, $dev_id); } - return $this->xmlinterface->create_SEP_XML($this->sccppath["tftp_templates_path"], $data_value, $dev_config, $dev_id, $lang_data); + return $this->xmlinterface->create_SEP_XML($this->sccppath["tftp_templates_path"], $data_value, $dev_config, $dev_id); } function deleteSccpDeviceXML($dev_id = '') { diff --git a/install.php b/install.php index f7f9707..d88f3d8 100644 --- a/install.php +++ b/install.php @@ -10,7 +10,6 @@ global $version; global $aminterface; global $extconfigs; global $mobile_hw; -global $useAmiForSoftKeys; global $settingsFromDb; global $thisInstaller; global $cnf_int; @@ -21,7 +20,6 @@ $mobile_hw = '0'; $autoincrement = (($amp_conf["AMPDBENGINE"] == "sqlite") || ($amp_conf["AMPDBENGINE"] == "sqlite3")) ? "AUTOINCREMENT" : "AUTO_INCREMENT"; $table_req = array('sccpdevice', 'sccpline', 'sccpsettings'); $sccp_compatible = 0; -$chanSCCPWarning = true; $db_config = ''; $sccp_version = array(); $cnf_int = \FreePBX::Config(); @@ -45,16 +43,14 @@ foreach ($requiredClasses as $className) { } CheckAsteriskVersion(); -$sccp_version = CheckChanSCCPCompatible(); -$sccp_compatible = $sccp_version[0]; -$chanSCCPWarning = $sccp_version[1] ^= 1; +$sccp_compatible = $aminterface->getSCCPVersion['vCode']; + outn("
  • " . _("Sccp model Compatible code : ") . $sccp_compatible . "
  • "); if ($sccp_compatible == 0) { outn("
    "); - outn("Chan Sccp not Found. Install it before continuing !"); + outn("chan-sccp not found. Install it before continuing !"); die(); } - // BackUp Old config createBackUpConfig(); RenameConfig(); @@ -68,10 +64,7 @@ InstallDB_createButtonConfigTrigger(); InstallDbCreateViews($sccp_compatible); installDbPopulateSccpline(); InstallDB_updateDBVer($sccp_compatible); -if ($chanSCCPWarning) { - outn("
    "); - outn("Error: installed version of chan-sccp is not compatible. Please upgrade chan-sccp"); -} + Setup_RealTime(); addDriver($sccp_compatible); checkTftpServer(); @@ -369,10 +362,8 @@ function CheckAsteriskVersion() function CheckChanSCCPCompatible() { - global $chanSCCPWarning; global $aminterface; - // calling with true returns array with compatibility and RevisionNumber - return $aminterface->get_compatible_sccp(true); + return $aminterface->getSCCPVersion['vCode']; } function InstallDB_updateSchema($db_config) diff --git a/sccpManClasses/amInterfaceClasses/Message.class.php b/sccpManClasses/amInterfaceClasses/Message.class.php index 84c5993..d7bb756 100644 --- a/sccpManClasses/amInterfaceClasses/Message.class.php +++ b/sccpManClasses/amInterfaceClasses/Message.class.php @@ -71,7 +71,8 @@ abstract class Message print_r($value); */ } - +/* + // Duplicate declaration - also declared in Response class where is used. public function getVariable($key) { $key = strtolower($key); @@ -81,17 +82,11 @@ abstract class Message } return $this->variables[$key]; } - +*/ protected function setKey($key, $value) { $key = strtolower((string) $key); $this->keys[$key] = (string) $value; - /* - print_r('
    ----Set Key -------
    '); - print_r($key); - print_r($value); - * - */ } public function getKey($key) @@ -126,8 +121,24 @@ abstract class Message protected function setSanitizedKey($key, $value) { - //$key = strtolower((string) $key); - $_string_key = array('actionid', 'descr'); + // TODO: Need to handle JSON here rather than in getVariable as have + // already broken data into array. + $key = strtolower($key); + switch ($key) { + case 'json': + $this->keys['JSONRAW'] = (string) $value; + break; + case 'actionid': + case 'desc': + $this->keys[$key] = (string) $value; + break; + default: + $this->keys[$key] = $this->sanitizeInput($value); + break; + } + + + $_string_key = array('actionid', 'descr', 'json'); if (array_search($key, $_string_key) !== false) { $this->keys[$key] = (string) $this->sanitizeInput($value, 'string'); } else { @@ -138,9 +149,11 @@ abstract class Message protected function sanitizeInput($value, $prefered_type = '') { if ($prefered_type == '') { - if (!isset($value) || $value === null || strlen($value) == 0) { - return null; - } elseif (is_numeric($value)) { + // No longer send empty values + //if (!isset($value) || $value === null || strlen($value) == 0) { + //return null; + //} elseif (is_numeric($value)) { + if (is_numeric($value)) { $prefered_type = 'numeric'; } elseif (is_string($value)) { $prefered_type = 'string'; @@ -148,38 +161,38 @@ abstract class Message throw new AMIException("Don't know how to convert: '" . $value . "'\n"); } } - if ($prefered_type !== '') { - switch ($prefered_type) { - case 'string': - if (!isset($value) || $value === null || strlen($value) == 0) { - return ''; - } - if (filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) { - return (boolean) $value; - } elseif (filter_var($value, FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE)) { - return (string) $value; - } elseif (filter_var($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_NULL_ON_FAILURE)) { - return (string) htmlspecialchars($value, ENT_QUOTES); - } else { - throw new AMIException("Incoming String is not sanitary. Skipping: '" . $value . "'\n"); - } - break; - case 'numeric': - if (!isset($value) || $value === null || strlen($value) == 0) { - return 0; - } - if (filter_var($value, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX | FILTER_FLAG_ALLOW_OCTAL)) { - return intval($value, 0); - } elseif (filter_var($value, FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND | FILTER_FLAG_ALLOW_SCIENTIFIC)) { - return (float) $value; - } else { - return (double) $value; - } - default: - throw new AMIException("Don't know how to convert: '" . $value . "'\n"); - break; - } + //if ($prefered_type !== '') { + switch ($prefered_type) { + case 'string': + //if (!isset($value) || $value === null || strlen($value) == 0) { + //return ''; + //} + if (filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) { + return (boolean) $value; + } elseif (filter_var($value, FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE)) { + return (string) $value; + } elseif (filter_var($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_NULL_ON_FAILURE)) { + return (string) htmlspecialchars($value, ENT_QUOTES); + } else { + throw new AMIException("Incoming String is not sanitary. Skipping: '" . $value . "'\n"); + } + break; + case 'numeric': + //if (!isset($value) || $value === null || strlen($value) == 0) { + //return 0; + //} + if (filter_var($value, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX | FILTER_FLAG_ALLOW_OCTAL)) { + return intval($value, 0); + } elseif (filter_var($value, FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND | FILTER_FLAG_ALLOW_SCIENTIFIC)) { + return (float) $value; + } else { + return (double) $value; + } + default: + throw new AMIException("Don't know how to convert: '" . $value . "'\n"); + break; } + //} } protected function finishMessage($message) @@ -257,21 +270,28 @@ abstract class IncomingMessage extends Message public function __construct($rawContent) { parent::__construct(); - dbug($rawContent); + //dbug($rawContent); $this->rawContent = $rawContent; $lines = explode(Message::EOL, $rawContent); foreach ($lines as $line) { $content = explode(':', $line); - $name = strtolower(trim($content[0])); - unset($content[0]); - $value = isset($content[1]) ? trim(implode(':', $content)) : ''; + //$content = preg_split("/: /",$line); + //$name = strtolower(trim($content[0])); + // do strtolower in setSanitizedKey + $name = array_shift($content); + //unset($content[0]); + if (!isset($content[0])) { + continue; + } + //$value = isset($content[0]) ? trim(implode(':', $content)) : ''; try { - $this->setSanitizedKey($name, $value); + $this->setSanitizedKey($name, trim(implode(':', $content))); } catch (AMIException $e) { throw new AMIException("Error: '" . $e . "'\n Dump RawContent:\n" . $this->rawContent . "\n"); } - dbug($this->keys); + //dbug($this->keys); } + //dbug($this->keys); } } @@ -405,9 +425,9 @@ class SCCPDeviceRestartAction extends ActionMessage { parent::__construct('SCCPDeviceRestart'); $this->setResponseHandler("Generic"); - if (empty($Type)) { - $Type = "restart"; - } + //if (empty($Type)) { + //$Type = "restart"; + //} $this->setKey('DeviceName', $DeviceName); if (in_array(strtolower($Type), array('restart', 'full', 'reset'))) { $this->setKey('Type', $Type); diff --git a/sccpManClasses/amInterfaceClasses/Response.class.php b/sccpManClasses/amInterfaceClasses/Response.class.php index 60be7bd..101cf4c 100644 --- a/sccpManClasses/amInterfaceClasses/Response.class.php +++ b/sccpManClasses/amInterfaceClasses/Response.class.php @@ -71,8 +71,10 @@ abstract class Response extends IncomingMessage $this->setKey('ActionId', $actionId); } - public function getVariable($_rawContent, $_fields = '') + public function getVariable(string $_rawContent, array $_fields) { + dbug($_rawContent); + dbug($_fields); $lines = explode(Message::EOL, $_rawContent); foreach ($_fields as $key => $value) { foreach ($lines as $data) { @@ -84,9 +86,6 @@ abstract class Response extends IncomingMessage } } } -class GenericResponse extends Response -{ -} //**************************************************************************** // There are two types of Response messages returned by AMI @@ -106,7 +105,6 @@ class Generic_Response extends Response $this->_events['ClosingEvent'] = new ResponseComplete_Event($rawContent); $this->_completed = true; $this->eventListIsCompleted = true; - } } @@ -157,7 +155,7 @@ class SCCPJSON_Response extends Generic_Response public function __construct($rawContent) { parent::__construct($rawContent); - $this->getVariable($rawContent, array("DataType" => "DataType:", "JSONRAW" => "JSON:")); + //$this->getVariable($rawContent, array("DataType" => "DataType:", "JSONRAW" => "JSON:")); if (null !== $this->getKey('JSONRAW')) { $this->setKey('Response', 'Success'); } diff --git a/sccpManClasses/aminterface.class.php b/sccpManClasses/aminterface.class.php index e0cdba0..a55d628 100644 --- a/sccpManClasses/aminterface.class.php +++ b/sccpManClasses/aminterface.class.php @@ -59,8 +59,7 @@ class aminterface 'pass' => '', 'port' => '5038', 'tsoket' => 'tcp://', - 'timeout' => 30, - 'enabled' => true + 'timeout' => 30 ); $this->_eventListeners = array(); $this->_incomingMsgObjectList = array(); @@ -76,33 +75,14 @@ class aminterface } } } - if ($this->_config['enabled']) { - $this->load_subspace(); - } - - if ($this->_config['enabled']) { - // Ami is not hard disabled in __construct line 63. - if ($this->open()) { - // Can open a connection. Now check compatibility with chan-sccp. - // will return true if compatible. - if (!$this->get_compatible_sccp(true)[1]) { - // Close the open socket as will not use - $this->close(); - } - } - } + $this->load_subspace(); + $this->open(); } public function info() { $Ver = '16.0.0.1'; - if ($this->_config['enabled']){ - return array('Version' => $Ver, - 'about' => 'AMI data ver: ' . $Ver, 'test' => get_declared_classes()); - } else { - return array('Version' => $Ver, - 'about' => 'Disabled AMI ver: ' . $Ver); - } + return array('Version' => $Ver, 'about' => 'AMI data ver: ' . $Ver); } /* @@ -509,16 +489,4 @@ class aminterface } return $cmd_res; } - - public function get_compatible_sccp($revNumComp=false) { - // only called with args from installer to get revision and compatibility - $res = $this->getSCCPVersion(); - if ($res['RevisionNum'] < 11063) { - $this->useAmiInterface = false; - } - if ($revNumComp) { - return array($res['vCode'], true); - } - return $res['vCode']; - } } diff --git a/sccpManClasses/xmlinterface.class.php b/sccpManClasses/xmlinterface.class.php index 8cc65e3..17d25c5 100644 --- a/sccpManClasses/xmlinterface.class.php +++ b/sccpManClasses/xmlinterface.class.php @@ -126,9 +126,9 @@ class xmlinterface } else { $lang = $data_values['devlang']; } - if (isset($lang_info[$lang])) { - $xnode->name = $lang_info[$lang]['locale']; - $xnode->langCode = $lang_info[$lang]['code']; + if (isset($this->langCodeArray[$lang])) { + $xnode->name = $lang; + $xnode->langCode = $this->langCodeArray[$lang]; } else { $xnode->name = ''; $xnode->langCode = ''; @@ -156,7 +156,7 @@ class xmlinterface } } - function create_SEP_XML($store_path, $data_values, $dev_config, $dev_id, $lang_info = array()) + function create_SEP_XML($store_path, $data_values, $dev_config, $dev_id) { // TODO: $data_values are system wide defaults, $dev_config are specific device values. // Need to merge the two arrays so that device specific values override system values @@ -461,7 +461,7 @@ class xmlinterface return $res; } - function create_SEP_SIP_XML($store_path = '', $data_values = array(), $dev_config = array(), $dev_id = '', $lang_info = array()) + function create_SEP_SIP_XML($store_path = '', $data_values = array(), $dev_config = array(), $dev_id = '') { $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', diff --git a/views/server.info.php b/views/server.info.php index 8ab0751..87e0b27 100644 --- a/views/server.info.php +++ b/views/server.info.php @@ -27,7 +27,7 @@ foreach ($ast_realtime as $key => $value) { $conf_realtime = $this->extconfigs->validate_RealTime($ast_realm); $db_Schema = $this->dbinterface->validate(); $mysql_info = $this->dbinterface->get_db_sysvalues(); -$compatible = $this->aminterface->get_compatible_sccp(); +$compatible = $core['vCode']; $info = array(); //$info['srvinterface'] = $this->srvinterface->info();