" . _("Sccp model Compatible code : ") . $sccp_compatible . ""); if ($sccp_compatible == 0) { outn("
"); outn("Chan Sccp not Found. Install it before continuing !"); die(); } // BackUp Old config createBackUpConfig(); RenameConfig(); $db_config = Get_DB_config($sccp_compatible); InstallDB_updateSchema($db_config); cleanUpSccpSettings(); 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(); outn("
"); outn("Install Complete !"); outn("
"); // Functions follow function Get_DB_config($sccp_compatible) { global $mobile_hw; // Software mobile $db_config_v4 = array( 'sccpdevmodel' => array( 'enabled' => array('create' => "INT(2) NULL DEFAULT '0'"), 'nametemplate' => array('create' => 'VARCHAR(50) NULL DEFAULT NULL'), 'loadinformationid' => array('create' => "VARCHAR(30) NULL DEFAULT NULL") ), 'sccpdevice' => array( 'pickupexten' => array('drop' => "yes"), 'directed_pickup' => array('drop' => "yes"), 'directed_pickup_context' => array('drop' => "yes"), 'pickupcontext' => array('drop' => "yes"), 'directed_pickup_modeanswer' => array('drop' => "yes"), 'pickupmodeanswer' => array('drop' => "yes"), 'disallow' => array('drop' => "yes"), 'callhistory_answered_elsewhere' => array('create' => "enum('Ignore','Missed Calls','Received Calls', 'Placed Calls') NOT NULL default 'Ignore'", 'modify' => "enum('Ignore','Missed Calls','Received Calls','Placed Calls')"), 'hwlang' => array('rename' => "_hwlang"), '_hwlang' => array('create' => 'VARCHAR(12) NULL DEFAULT NULL'), '_loginname' => array('create' => 'VARCHAR(20) NULL DEFAULT NULL AFTER `_hwlang`'), '_profileid' => array('create' => "INT(11) NOT NULL DEFAULT '0' AFTER `_loginname`"), '_dialrules' => array('create' => "VARCHAR(255) NULL DEFAULT NULL AFTER `_profileid`"), 'useRedialMenu' => array('create' => "enum('yes','no') NOT NULL default 'no'", 'modify' => "enum('yes','no')"), 'dtmfmode' => array('drop' => "yes"), 'force_dtmfmode' => array('create' => "ENUM('auto','rfc2833','skinny') NOT NULL default 'auto'", 'modify' => "ENUM('auto','rfc2833','skinny')"), 'deny' => array('create' => 'VARCHAR(100) NULL DEFAULT NULL', 'modify' => "VARCHAR(100)"), 'permit' => array('create' => 'VARCHAR(100) NULL DEFAULT NULL', 'modify' => "VARCHAR(100)"), 'backgroundImage' => array('create' => 'VARCHAR(255) NULL DEFAULT NULL', 'modify' => "VARCHAR(255)"), 'ringtone' => array('create' => 'VARCHAR(255) NULL DEFAULT NULL', 'modify' => "VARCHAR(255)"), 'transfer' => array('create' => "enum('no','yes') NOT NULL default 'no'", 'modify' => "enum('no','yes')"), 'cfwdall' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'cfwdbusy' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'cfwdnoanswer' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'park' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"), 'directrtp' => array('create' => "enum('no','yes') NOT NULL default 'no'", 'modify' => "enum('no','yes')"), 'dndFeature' => array('create' => "enum('off','on') NOT NULL default 'off'", 'modify' => "enum('off','on')"), 'earlyrtp' => array('create' => "ENUM('yes','no') NOT NULL default 'yes'", 'modify' => "ENUM('yes','no')"), 'monitor' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'audio_tos' => array('create' => "VARCHAR(11) NOT NULL default '0xB8'",'modify' => "0xB8"), 'audio_cos' => array('create' => "VARCHAR(11) NOT NULL default '0x6'",'modify' => "0x6"), 'video_tos' => array('create' => "VARCHAR(11) NOT NULL default '0x88'",'modify' => "0x88"), 'video_cos' => array('create' => "VARCHAR(11) NOT NULL default '0x5'",'modify' => "0x5"), 'trustphoneip' => array('drop' => "yes"), 'transfer_on_hangup' => array('create' => "enum('yes','no') NOT NULL DEFAULT 'no'", 'modify' => "enum('yes','no')"), 'phonecodepage' => array('create' => 'VARCHAR(50) NULL DEFAULT NULL', 'modify' => "VARCHAR(50)"), 'mwilamp' => array('create' => "enum('on','off','wink','flash','blink') NOT NULL default 'on'", 'modify' => "enum('on','off','wink','flash','blink')"), 'mwioncall' => array('create' => "enum('no','yes') NOT NULL default 'yes'",'modify' => "enum('no','yes')"), 'private' => array('create' => "enum('yes','no') NOT NULL default 'no'", 'modify' => "enum('yes','no')"), 'privacy' => array('create' => "enum('full','on','off') NOT NULL default 'full'", 'modify' => "enum('full','on','off')"), 'nat' => array('create' => "enum('on','off','auto') NOT NULL default 'off'", 'modify' => "enum('on','off','auto')"), 'conf_allow' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"), 'conf_play_part_announce' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"), 'conf_mute_on_entry' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'conf_show_conflist' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"), 'type' => array('create' => 'VARCHAR(15) NULL DEFAULT NULL', 'modify' => "VARCHAR(15)"), 'imageversion' => array('create' => 'VARCHAR(31) NULL DEFAULT NULL', 'modify' => "VARCHAR(31)"), 'softkeyset' => array('def_modify' => "softkeyset") ), 'sccpline' => array( 'directed_pickup' => array('create' => "enum('yes','no') NOT NULL default 'no'", 'modify' => "enum('yes','no')"), 'directed_pickup_context' => array('create' => "VARCHAR(100) NULL DEFAULT NULL"), 'pickup_modeanswer' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'namedcallgroup' => array('create' => "VARCHAR(100) NULL DEFAULT NULL AFTER `setvar`", 'modify' => "VARCHAR(100)"), 'namedpickupgroup' => array('create' => "VARCHAR(100) NULL DEFAULT NULL AFTER `namedcallgroup`", 'modify' => "VARCHAR(100)"), 'adhocNumber' => array('create' => "VARCHAR(45) NULL DEFAULT NULL AFTER `namedpickupgroup`"), 'meetme' => array('create' => "VARCHAR(5) NULL DEFAULT NULL AFTER `adhocNumber`"), 'context' => array('create' => "VARCHAR(45) NULL DEFAULT NULL AFTER `description`", 'def_modify' => 'from-internal'), 'meetmenum' => array('create' => "VARCHAR(45) NULL DEFAULT NULL AFTER `meetme`"), 'meetmeopts' => array('create' => "VARCHAR(45) NULL DEFAULT NULL AFTER `meetmenum`"), 'regexten' => array('create' => "VARCHAR(45) NULL DEFAULT NULL AFTER `meetmeopts`"), 'rtptos' => array('drop' => "yes"), 'audio_tos' => array('drop' => "yes"), 'audio_cos' => array('drop' => "yes"), 'video_tos' => array('drop' => "yes"), 'video_cos' => array('drop' => "yes"), 'videomode' => array('create' => "enum('auto','user','off') NOT NULL default 'auto'", 'modify' => "enum('auto','user','off')"), 'incominglimit' => array('create' => "INT(11) DEFAULT '6'", 'modify' => 'INT(11)', 'def_modify' => "6"), 'transfer' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'vmnum' => array('def_modify' => "*97"), 'musicclass' => array('def_modify' => "default"), 'disallow' => array('create' => "VARCHAR(255) NULL DEFAULT 'all'", 'modify' => 'VARCHAR(255)'), 'allow' => array('create' => "VARCHAR(255) NULL DEFAULT NULL"), 'id' => array('create' => 'MEDIUMINT(9) NOT NULL AUTO_INCREMENT, ADD UNIQUE(id);', 'modify' => "MEDIUMINT(9)", 'index' => 'id'), 'echocancel' => array('create' => "enum('yes','no') NOT NULL default 'yes'", 'modify' => "enum('yes','no')"), 'silencesuppression' => array('create' => "enum('no','yes') NOT NULL default 'no'", 'modify' => "enum('no','yes')"), 'dnd' => array('create' => "enum('reject','off','silent','user') NOT NULL default 'reject'", 'modify' => "enum('reject','off','silent','user')", 'def_modify' => "reject") ), 'sccpuser' => array( 'name' => array('create' => "VARCHAR(20) NOT NULL", 'modify' => "VARCHAR(20)" ), 'pin' => array('create' => "VARCHAR(7) NOT NULL", 'modify' => "VARCHAR(7)" ), 'password' => array('create' => "VARCHAR(7) NOT NULL", 'modify' => "VARCHAR(7)" ), 'description' => array('create' => "VARCHAR(45) NOT NULL", 'modify' => "VARCHAR(45)" ), 'roaminglogin' => array('create' => "ENUM('off','on','multi') NOT NULL DEFAULT 'off'", 'modify' => "ENUM('on','off','multi')" ), 'auto_logout' => array('create' => "ENUM('on','off') NOT NULL DEFAULT 'off'", 'modify' => "ENUM('on','off')" ), 'homedevice' => array('create' => "VARCHAR(20) NOT NULL", 'modify' => "VARCHAR(20)" ), 'devicegroup' => array('create' => "VARCHAR(7) NOT NULL", 'modify' => "VARCHAR(7)" ), ), 'sccpbuttonconfig' => array( 'reftype' => array('create' => "enum('sccpdevice', 'sipdevice', 'sccpuser') NOT NULL default 'sccpdevice'", 'modify' => "enum('sccpdevice', 'sipdevice', 'sccpuser')" ), ) ); // Hardware Mobile. Can switch Softwate to Hardware $db_config_v4M = array( 'sccpdevmodel' => array( 'loadinformationid' => array('create' => "VARCHAR(30) NULL DEFAULT NULL") ), 'sccpdevice' => array( 'pickupexten' => array('drop' => "yes"), 'directed_pickup' => array('drop' => "yes"), 'cfwdnoanswer' => array('create' => "enum('yes','no') NULL default 'yes'", 'modify' => "enum('yes','no')"), 'park' => array('create' => "enum('on','off') NULL default 'on'", 'modify' => "enum('on','off')"), 'monitor' => array('create' => "enum('on','off') NULL default NULL", 'modify' => "enum('on','off')"), '_description' => array('rename' => "description"), '_loginname' => array('drop' => "yes"), '_profileid' => array('drop' => "yes"), '_dialrules' => array('create' => "VARCHAR(255) NULL DEFAULT NULL AFTER `_profileid`"), 'transfer_on_hangup' => array('create' => "enum('on','off') NULL DEFAULT NULL", 'modify' => "enum('on','off')"), ), 'sccpline' => array( 'directed_pickup' => array('create' => "enum('on','off') NULL default NULL", 'modify' => "enum('on','off')"), 'videomode' => array('create' => "enum('user','auto','off') NULL default 'auto'", 'modify' => "enum('user','auto','off')"), ), 'sccpuser' => array( 'id' => array('create' => "VARCHAR(20) NOT NULL", 'modify' => "VARCHAR(20)" ), 'name' => array('create' => "VARCHAR(45) NOT NULL", 'modify' => "VARCHAR(45)" ), ) ); // Below fields allow configuration of these settings on a per device basis // whereas previously they were all global.Some of these are not supported by chan-sccp; // The supported fields are listed in the view sccpdeviceconfig. $db_config_v5 = array( 'sccpdevice' => array( 'logserver' => array('create' => "VARCHAR(100) NULL default null", 'modify' => "VARCHAR(20)"), 'daysdisplaynotactive' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'displayontime' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'displayonduration' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'displayidletimeout' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'settingsaccess' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'videocapability' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'webaccess' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'webadmin' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'pcport' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"), 'spantopcport' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"), 'voicevlanaccess' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'enablecdpswport' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'enablecdppcport' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'enablelldpswport' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'enablelldppcport' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'firstdigittimeout' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'digittimeout' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'cfwdnoanswer_timeout' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'autoanswer_ring_time' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'autoanswer_tone' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'remotehangup_tone' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'transfer_tone' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'callwaiting_tone' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"), 'callanswerorder' => array('create' => "enum('oldestfirst','latestfirst') NOT NULL default 'latestfirst'", 'modify' => "enum('oldestfirst','latestfirst')"), 'sccp_tos' => array('create' => "VARCHAR(11) NOT NULL default '0x68'", 'modify' => "VARCHAR(11)"), 'sccp_cos' => array('create' => "VARCHAR(11) NOT NULL default '0x4'", 'modify' => "VARCHAR(11)"), 'dev_sshPassword' => array('create' => "VARCHAR(25) NOT NULL default 'cisco'"), 'dev_sshUserId' => array('create' => "VARCHAR(25) NOT NULL default 'cisco'"), 'phonepersonalization' => array('create' => "VARCHAR(25) NOT NULL default '0'", 'modify' => "VARCHAR(25)"), 'loginname' => array('create' => 'VARCHAR(20) NULL DEFAULT NULL'), 'profileid' => array('create' => "INT(11) NOT NULL DEFAULT '0'"), 'dialrules' => array('create' => "VARCHAR(255) NULL DEFAULT NULL"), 'description' => array('create' => "VARCHAR(45) NULL DEFAULT NULL"), '_hwlang' => array ('drop' => 'yes'), 'devlang' => array('create' => "VARCHAR(50) NULL default NULL", 'modify' => "VARCHAR(50)"), 'netlang' => array('create' => "VARCHAR(50) NULL default NULL", 'modify' => "VARCHAR(50)"), '_devlang' => array('rename' => "devlang"), '_netlang' => array('rename' => "netlang"), '_logserver' => array('rename' => 'logserver'), '_daysdisplaynotactive' => array('rename' => 'daysdisplaynotactive'), '_displayontime' => array('rename' => 'displayontime'), '_displayonduration' => array('rename' => 'displayonduration'), '_displayidletimeout' => array('rename' => 'displayidletimeout'), '_settingsaccess' => array('rename' => 'settingsaccess'), '_videocapability' => array('rename' => 'videocapability'), '_webaccess' => array('rename' => 'webaccess'), '_webadmin' => array('rename' => 'webadmin'), '_pcport' => array('rename' => 'pcport'), '_spantopcport' => array('rename' => 'spantopcport'), '_voicevlanaccess' => array('rename' => 'voicevlanaccess'), '_enablecdpswport' => array('rename' => 'enablecdpswport'), '_enablecdppcport' => array('rename' => 'enablecdppcport'), '_enablelldpswport' => array('rename' => 'enablelldpswport'), '_enablelldppcport' => array('rename' => 'enablelldppcport'), '_firstdigittimeout' => array('rename' => 'firstdigittimeout'), '_digittimeout' => array('rename' => 'digittimeout'), '_cfwdnoanswer_timeout' => array('rename' => 'cfwdnoanswer_timeout'), '_autoanswer_ring_time' => array('rename' => 'autoanswer_ring_time'), '_autoanswer_tone' => array('rename' => 'autoanswer_tone'), '_remotehangup_tone' => array('rename' => 'remotehangup_tone'), '_transfer_tone' => array('rename' => 'transfer_tone'), '_callwaiting_tone' => array('rename' => 'callwaiting_tone'), '_callanswerorder' => array('rename' => 'callanswerorder'), '_sccp_tos' => array('rename' => 'sccp_tos'), '_sccp_cos' => array('rename' => 'sccp_cos'), '_dev_sshPassword' => array('rename' => 'dev_sshPassword'), '_dev_sshUserId' => array('rename' => 'dev_sshUserId'), '_phonepersonalization' => array('rename' => '_phonepersonalization'), '_loginname' => array('rename' => 'loginname'), '_profileid' => array('rename' => 'profileid'), '_dialrules' => array('rename' => 'dialrules'), '_description' => array('rename' => 'description'), 'keepalive' => array('create' => "INT(11) DEFAULT '60'", 'modify' => 'INT(11)', 'def_modify' => "60") ), 'sccpline' => array ( 'regcontext' => array('create' => "VARCHAR(20) NULL default 'sccpregistration'", 'modify' => "VARCHAR(20)"), 'transfer_on_hangup' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'autoselectline_enabled' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'autocall_select' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'backgroundImageAccess' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"), 'callLogBlfEnabled' => array('create' => "enum('3','2') NOT NULL default '2'", 'modify' => "enum('3','2')"), '_regcontext' => array('rename' => 'regcontext'), '_transfer_on_hangup' => array('rename' => 'transfer_on_hangup'), '_autoselectline_enabled' => array('rename' => 'autoselectline_enabled'), '_autocall_select' => array('rename' => 'autocall_select'), '_backgroundImageAccess' => array('rename' => 'backgroundImageAccess'), '_callLogBlfEnabled' => array('rename' => 'callLogBlfEnabled') ), 'sccpsettings' => array ( 'systemdefault' => array('create' => "VARCHAR(255) NULL default ''") ) ); if ($sccp_compatible >= 433) { if ($mobile_hw == '1') { return $db_config_v4M; } // This looks extraneous, but is for future compatibility - do not delete // If integrated into chan-sccp, the version number will change if ($sccp_compatible >= 433) { $db_config_v4['sccpdevice'] = array_merge($db_config_v4['sccpdevice'],$db_config_v5['sccpdevice']); $db_config_v4['sccpline'] = array_merge($db_config_v4['sccpline'],$db_config_v5['sccpline']); $db_config_v4['sccpsettings'] = $db_config_v5['sccpsettings']; } return $db_config_v4; } } function CheckSCCPManagerDBVersion() { } /* notused */ function CheckPermissions() { global $amp_conf; outn("
  • " . _("Checking Filesystem Permissions") . "
  • "); $dst = $amp_conf['AMPWEBROOT'] . '/admin/modules/sccp_manager/views'; if (fileowner($amp_conf['AMPWEBROOT']) != fileowner($dst)) { die_freepbx('Please (re-)check permissions by running "amportal chown. Installation Failed"'); } } function CheckAsteriskVersion() { $version = FreePBX::Config()->get('ASTVERSION'); outn("
  • " . _("Checking Asterisk Version : ") . $version . "
  • "); if (!empty($version)) { // Woo, we have a version if (version_compare($version, "12.2.0", ">=")) { $ver_compatible = true; } else { die_freepbx('Asterisk Version is to old, please upgrade to asterisk-12 or higher. Installation Failed'); } } else { // Well. I don't know what version of Asterisk I'm running. // Assume less than 12. $ver_compatible = false; die_freepbx('Asterisk Version could not be verified. Installation Failed'); } return $ver_compatible; } function CheckChanSCCPCompatible() { global $chanSCCPWarning; global $aminterface; // calling with true returns array with compatibility and RevisionNumber return $aminterface->get_compatible_sccp(true); } function InstallDB_updateSchema($db_config) { /* Initially, referred to schema existing and created db from scratch. This required initialising sccp_manager object which in term required that sccpsettings existed To overcome this, moved to creation/modification of db via module.xml. In early version of 14.3, only used initial fields present in older versions, and then added new required fields. This resulted in new fields being dropped at next install. Now include all fields in module.xml, and then transfer any data in old fields to new fields before then deleting old fields, rather than renaming columns which will no longer work as the new column already exists, and may contain data. This affected 36 fields in sccpdevice and 5 fields in sccpline which in old db schema used _ prefix to hide from chan-sccp. */ global $db; if (!$db_config) { die_freepbx("No db_config provided"); } outn("
  • " . _("Saving legacy data into current column") . "
  • "); $priorSchemaFields = array( 'sccpdevice' => array( '_description', '_loginname', '_profileid', '_dialrules', '_devlang', '_netlang', '_logserver', '_daysdisplaynotactive', '_displayontime', '_displayonduration', '_displayidletimeout', '_settingsaccess', '_videocapability', '_webaccess', '_webadmin', '_pcport', '_spantopcport', '_voicevlanaccess', '_enablecdpswport', '_enablecdppcport', '_enablelldpswport', '_enablelldppcport', '_firstdigittimeout', '_digittimeout', '_cfwdnoanswer_timeout', '_autoanswer_ring_time', '_autoanswer_tone', '_remotehangup_tone', '_transfer_tone', '_callwaiting_tone', '_callanswerorder', '_sccp_tos', '_sccp_cos', '_dev_sshPassword', '_dev_sshUserId', '_phonepersonalization'), 'sccpline' => array( '_regcontext', '_transfer_on_hangup', '_autoselectline_enabled', '_autocall_select', '_backgroundImageAccess', '_callLogBlfEnabled') ); foreach ($priorSchemaFields as $table => $fieldsArr) { // First get any data in columns to be deleted ( _Column) $sqlMatch = array_reduce($fieldsArr, function($carry, $column) { return "${carry} ${column} IS NOT NULL OR"; }); unset($column); $sqlFields = array_reduce($fieldsArr, function($carry, $column) { return "${carry} ${column} AS " . ltrim($column,"_") .","; }); $sqlMatch = rtrim($sqlMatch, "OR"); $sqlFields = rtrim($sqlFields, ","); $stmt = $db->prepare("SELECT name, ${sqlFields} FROM ${table} WHERE ${sqlMatch}"); $stmt->execute(); $dbResult = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); // Now move any data found from _Column to Column. This is safe as the two should not exist. if (!empty($dbResult)) { foreach ($dbResult as $name => $columnArr) { $sqlVar = array_reduce(array_keys($columnArr), function($carry, $key) use ($columnArr){ $carry .= (isset($columnArr[$key])) ? "${key} = '${columnArr[$key]}'," : ""; return $carry; }); $sqlVar = rtrim($sqlVar, ","); $stmt = $db->prepare("UPDATE ${table} SET ${sqlVar} WHERE name = '${name}'"); $stmt->execute(); } } // Processed all _Column names; now safe to delete them $sqlDrop = array_reduce($fieldsArr, function($carry, $column) { return "${carry} DROP COLUMN ${column},"; }); $sqlDrop = rtrim($sqlDrop, ", "); $stmt = $db->prepare("ALTER TABLE ${table} ${sqlDrop}"); $stmt->execute(); } // Now process the column updates as per the legacy installer $count_modify = 0; outn("
  • " . _("Modifying Database schema") . "
  • "); foreach ($db_config as $tabl_name => $tab_modif) { $sql_create = ''; $sql_modify = ''; $sql_rename = ''; $stmt = $db->prepare("DESCRIBE {$tabl_name}"); $stmt->execute(); $db_result = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); if (DB::IsError($db_result)) { die_freepbx("Can not get information for " . $tabl_name . " table\n"); } // filter modifications based on field existance and prepare sql foreach ($db_result as $fld_id => $tabl_data) { if (!empty($tab_modif[$fld_id])) { // have column in table so potentially something to update // if dropping column, prepare sql and continue. The drop case will never // occur as columns that are dropped should no longer be in the module.xml schema // and so Doctrine will have already dropped them. if (!empty($tab_modif[$fld_id]['drop'])) { $sql_create .= "DROP COLUMN {$row_fld}, "; unset($tab_modif[$fld_id]['drop']); continue; } if (!empty($tab_modif[$fld_id]['modify'])) { // Check if modify type is same as current type if (strtoupper($tab_modif[$fld_id]['modify']) == strtoupper($tabl_data['Type'])) { // Type has not changed so unset unset($tab_modif[$fld_id]['modify']); } else { if (!empty($tab_modif[$fld_id]['def_modify'])) { // if a default has been modified, use it here and unset $sql_modify .= "MODIFY COLUMN {$fld_id} {$tab_modif[$fld_id]['modify']} DEFAULT '{$tab_modif[$fld_id]['def_modify']}', "; // def_modify has been used so unset unset($tab_modif[$fld_id]['def_modify']); } else if (!empty($tab_modif[$fld_id]['create'])) { // use create attributes $sql_modify .= "MODIFY COLUMN {$fld_id} {$tab_modif[$fld_id]['create']}, "; } else { // No default to modify so leave unchanged $sql_modify .= "MODIFY COLUMN {$fld_id} {$tab_modif[$fld_id]['modify']}, "; } $count_modify ++; } } if (!empty($tab_modif[$fld_id]['def_modify'])) { // Check if def_modify value is same as current value if (strtoupper($tab_modif[$fld_id]['def_modify']) == strtoupper($tabl_data['Default'])) { // Defaults have not changed so unset unset($tab_modif[$fld_id]['def_modify']); } else { $sql_modify .= "ALTER COLUMN {$fld_id} SET DEFAULT '{$tab_modif[$fld_id]['def_modify']}', "; $count_modify ++; } } // Now handle rename. Need to be carefull that the newname does not exist. If it does then need to // ignore or unexpected things may happen. if (!empty($tab_modif[$fld_id]['rename'])) { // Field currently exists so need to rename (and keep data). All of legacy _columns have already // been dropped so will not get here as $fld_id cannot be _column. // for backward compatibility use CHANGE - REPLACE is only available in MariaDb > 10.5. $fld_id_newName = $tab_modif[$fld_id]['rename']; // Only execute if the newname column does not already exist. if (empty($db_result[$fld_id_newName])) { // Trying to rename to an existing column. Ignore this case. // Does a create exist for newName if (!empty($tab_modif[$fld_id_newName]['create'])) { //carry the attributes from the new create to the rename $sql_rename .= "CHANGE COLUMN {$fld_id} {$fld_id_newName} {$tab_modif[$fld_id_newName]['create']}, "; // do not create newName as modifying existing unset($tab_modif[$fld_id_newName]['create']); } else { // add current attributes to the new name. $existingAttrs = strtoupper($tabl_data['Type']).(($tabl_data['Null'] == 'NO') ?' NOT NULL': ' NULL') . ((empty($tabl_data['Default']))?'': ' DEFAULT ' . "'" . $tabl_data['Default']."'"); $sql_rename .= "CHANGE COLUMN {$fld_id} {$fld_id_newName} {$existingAttrs}, "; } $count_modify ++; } // Have treated this rename so unset. If the newname already exists, have done nothing. unset($tab_modif[$fld_id]['rename']); } // is there a create for this field if (!empty($tab_modif[$fld_id]['create'])) { // unset as cannot create existing field unset($tab_modif[$fld_id]['create']); } } } // only case left to handle is create as all others handled above foreach ($tab_modif as $row_fld => $row_data) { if (!empty($row_data['create'])) { $sql_create .= "ADD COLUMN {$row_fld} {$row_data['create']}, "; $count_modify ++; } } //Now execute sql statements if (!empty($sql_create)) { outn("
  • " . _("Adding/dropping columns ...") . "
  • "); $sql_create = "ALTER TABLE {$tabl_name} " .substr($sql_create, 0, -2); try { $check = $db->query($sql_create); } catch (\Exception $e) { die_freepbx("Can't add/drop column in {$tabl_name}. SQL: {$sql_create} \n"); } } if (!empty($sql_modify)) { outn("
  • " . _("Modifying table columns ") . $tabl_name ."
  • "); $sql_modify = "ALTER TABLE {$tabl_name} " . substr($sql_modify, 0, -2); try { $check = $db->query($sql_modify); } catch (\Exception $e) { die_freepbx("Can not modify {$tabl_name}. SQL: {$sql_modify} \n"); } } if (!empty($sql_rename)) { outn("
  • " . _("Renaming table columns ") . $tabl_name ."
  • "); $sql_rename = "ALTER TABLE {$tabl_name} " . substr($sql_rename, 0, -2); try { $check = $db->query($sql_rename); } catch (\Exception $e) { die_freepbx("Can not modify {$tabl_name}. SQL: {$sql_rename} \n"); } } } outn("
  • " . _("Total modify count :") . $count_modify . "
  • "); // Force update of sccp devmodel to ensure changes are taken into account outn("Updating sccpdevmodel..."); outn("
  • " . _("Fill sccpdevmodel") . "
  • "); $sql = "REPLACE INTO sccpdevmodel (model, vendor, dns, buttons, loadimage, loadinformationid, enabled, nametemplate) VALUES ('12 SP', 'CISCO', 1, 1, '', 'loadInformation3', 0, NULL), ('12 SP+', 'CISCO', 1, 1, '', 'loadInformation2', 0, NULL), ('30 SP+', 'CISCO', 1, 1, '', 'loadInformation1', 0, NULL), ('30 VIP', 'CISCO', 1, 1, '', 'loadInformation5', 0, NULL), ('3911', 'CISCO', 1, 1, '', 'loadInformation446', 0, NULL), ('3951', 'CISCO', 1, 1, '', 'loadInformation412', 0, ''), ('6901', 'CISCO', 1, 1, 'SCCP6901.9-2-1-a', 'loadInformation547', 0, NULL), ('6911', 'CISCO', 1, 1, 'SCCP6911.9-2-1-a', 'loadInformation548', 0, NULL), ('6921', 'CISCO', 1, 1, 'SCCP69xx.9-4-1-3SR3', 'loadInformation496', 0, NULL), ('6941', 'CISCO', 1, 1, 'SCCP69xx.9-3-1-3', 'loadInformation495', 0, NULL), ('6945', 'CISCO', 1, 1, 'SCCP6945.9-3-1-3', 'loadInformation564', 0, NULL), ('6961', 'CISCO', 1, 1, 'SCCP69xx.9-2-1-0', 'loadInformation497', 0, NULL), ('7902', 'CISCO', 1, 1, 'CP7902080002SCCP060817A', 'loadInformation30008', 0, NULL), ('7905', 'CISCO', 1, 1, 'CP7905080003SCCP070409A', 'loadInformation20000', 0, NULL), ('7906', 'CISCO', 1, 1, 'SCCP11.9-4-2SR3-1S', 'loadInformation369', 1, 'SEP0000000000.cnf.xml_791x_template'), ('7910', 'CISCO', 1, 1, 'P00405000700', 'loadInformation6', 1, 'SEP0000000000.cnf.xml_791x_template'), ('7911', 'CISCO', 1, 1, 'SCCP11.9-4-2SR3-1S', 'loadInformation307', 1, 'SEP0000000000.cnf.xml_791x_template'), ('7912', 'CISCO', 1, 1, 'CP7912080004SCCP080108A', 'loadInformation30007', 0, NULL), ('7914', 'CISCO', 0, 14, 'S00105000400', 'loadInformation124', 1, NULL), ('7914;7914', 'CISCO', 0, 28, 'S00105000400', 'loadInformation124', 1, NULL), ('7915', 'CISCO', 0, 24, 'B015-1-0-4-2', 'loadInformation227', 1, NULL), ('7915;7915', 'CISCO', 0, 48, 'B015-1-0-4-2', 'loadInformation228', 1, NULL), ('7916', 'CISCO', 0, 24, 'B016-1-0-4-2', 'loadInformation229', 1, NULL), ('7916;7916', 'CISCO', 0, 48, 'B016-1-0-4-2', 'loadInformation230', 1, NULL), ('7920', 'CISCO', 1, 1, 'cmterm_7920.4.0-03-02', 'loadInformation30002', 0, NULL), ('7921', 'CISCO', 1, 1, 'CP7921G-1.4.6.3', 'loadInformation365', 0, NULL), ('7925', 'CISCO', 1, 6, 'CP7925G-1.4.1SR1', 'loadInformation484', 0, 'SEP0000000000.cnf.xml_7925_template'), ('7926', 'CISCO', 1, 1, 'CP7926G-1.4.1SR1', 'loadInformation557', 0, NULL), ('7931', 'CISCO', 1, 34, 'SCCP31.9-2-1S', 'loadInformation348', 0, NULL), ('7935', 'CISCO', 1, 2, 'P00503021900', 'loadInformation9', 0, NULL), ('7936', 'CISCO', 1, 1, 'cmterm_7936.3-3-21-0', 'loadInformation30019', 0, NULL), ('7937', 'CISCO', 1, 1, 'apps37sccp.1-4-5-7', 'loadInformation431', 0, 'SEP0000000000.cnf.xml_7937_template'), ('7940', 'CISCO', 1, 2, 'P0030801SR02', 'loadInformation8', 1, 'SEP0000000000.cnf.xml_7940_template'), ('7941', 'CISCO', 1, 2, 'SCCP41.9-4-2SR3-1S', 'loadInformation115', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7941G-GE', 'CISCO', 1, 2, 'SCCP41.9-4-2SR3-1S', 'loadInformation309', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7942', 'CISCO', 1, 2, 'SCCP42.9-4-2SR3-1S', 'loadInformation434', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7945', 'CISCO', 1, 2, 'SCCP45.9-3-1SR1-1S', 'loadInformation435', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7960', 'CISCO', 3, 6, 'P0030801SR02', 'loadInformation7', 1, 'SEP0000000000.cnf.xml_7940_template'), ('7961', 'CISCO', 3, 6, 'SCCP41.9-4-2SR3-1S', 'loadInformation30018', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7961G-GE', 'CISCO', 3, 6, 'SCCP41.9-4-2SR3-1S', 'loadInformation308', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7962', 'CISCO', 3, 6, 'SCCP42.9-4-2SR3-1S', 'loadInformation404', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7965', 'CISCO', 3, 6, 'SCCP45.9-3-1SR1-1S', 'loadInformation436', 0, 'SEP0000000000.cnf.xml_796x_template'), ('7970', 'CISCO', 3, 8, 'SCCP70.9-4-2SR3-1S', 'loadInformation30006', 0, 'SEP0000000000.cnf.xml_797x_template'), ('7971', 'CISCO', 1, 2, 'SCCP70.9-4-2SR3-1S', 'loadInformation119', 0, 'SEP0000000000.cnf.xml_797x_template'), ('7975', 'CISCO', 3, 8, 'SCCP75.9-4-2SR3-1S', 'loadInformation437', 0, 'SEP0000000000.cnf.xml_7975_template'), ('7985', 'CISCO', 3, 8, 'cmterm_7985.4-1-7-0', 'loadInformation302', 0, NULL), ('8941', 'CISCO', 1, 4, 'SCCP894x.9-4-2SR1-2', 'loadInformation586', 0, 'SEP0000000000.cnf.xml_797x_template'), ('8945', 'CISCO', 1, 4, 'SCCP894x.9-4-2SR1-2', 'loadInformation585', 0, 'SEP0000000000.cnf.xml_7975_template'), ('ATA 186', 'CISCO', 1, 1, 'ATA030204SCCP090202A', 'loadInformation12', 0, 'SEP0000000000.cnf.xml_ATA_template'), ('ATA 187', 'CISCO', 1, 1, 'ATA187.9-2-3-1', 'loadInformation550', 0, 'SEP0000000000.cnf.xml_ATA_template'), ('CN622', 'MOTOROLA', 1, 1, '', 'loadInformation335', 0, NULL), ('Digital Access', 'CISCO', 1, 1, 'D001M022', 'loadInformation40', 0, NULL), ('Digital Access+', 'CISCO', 1, 1, 'D00303010033', 'loadInformation42', 0, NULL), ('E-Series', 'NOKIA', 1, 1, '', '', 0, NULL), ('ICC', 'NOKIA', 1, 1, '', '', 0, NULL), ('Analog Access', 'CISCO', 1, 1, 'A001C030', 'loadInformation30', 0, ''),('WS-X6608', 'CISCO', 1, 1, 'D00404000032', 'loadInformation43', 0, ''), ('WS-X6624', 'CISCO', 1, 1, 'A00204000013', 'loadInformation43', 0, ''), ('WS-X6608', 'CISCO', 1, 1, 'C00104000003', 'loadInformation51', 0, ''), ('H.323 Phone', 'CISCO', 1, 1, '', 'loadInformation61', 0, ''), ('Simulator', 'CISCO', 1, 1, '', 'loadInformation100', 0, ''), ('MTP', 'CISCO', 1, 1, '', 'loadInformation111', 0, ''), ('MGCP Station', 'CISCO', 1, 1, '', 'loadInformation120', 0, ''), ('MGCP Trunk', 'CISCO', 1, 1, '', 'loadInformation121', 0, ''), ('UPC', 'CISCO', 1, 1, '', 'loadInformation358', 0, ''), ('TelePresence', 'TELEPRESENCE', 1, 1, '', 'loadInformation375', 0, ''), ('1000', 'TELEPRESENCE', 1, 1, '', 'loadInformation478', 0, ''), ('3000', 'TELEPRESENCE', 1, 1, '', 'loadInformation479', 0, ''), ('3200', 'TELEPRESENCE', 1, 1, '', 'loadInformation480', 0, ''), ('500-37', 'TELEPRESENCE', 1, 1, '', 'loadInformation481', 0, ''), ('1300-65', 'TELEPRESENCE', 1, 1, '', 'loadInformation505', 0, ''), ('1100', 'TELEPRESENCE', 1, 1, '', 'loadInformation520', 0, ''), ('200', 'TELEPRESENCE', 1, 1, '', 'loadInformation557', 0, ''), ('400', 'TELEPRESENCE', 1, 1, '', 'loadInformation558', 0, ''), ('EX90', 'TELEPRESENCE', 1, 1, '', 'loadInformation584', 0, ''), ('500-32', 'TELEPRESENCE', 1, 1, '', 'loadInformation590', 0, ''), ('1300-47', 'TELEPRESENCE', 1, 1, '', 'loadInformation591', 0, ''), ('TX1310-65', 'TELEPRESENCE', 1, 1, '', 'loadInformation596', 0, ''), ('EX60', 'TELEPRESENCE', 1, 1, '', 'loadInformation604', 0, ''), ('C90', 'TELEPRESENCE', 1, 1, '', 'loadInformation606', 0, ''), ('C60', 'TELEPRESENCE', 1, 1, '', 'loadInformation607', 0, ''), ('C40', 'TELEPRESENCE', 1, 1, '', 'loadInformation608', 0, ''), ('C20', 'TELEPRESENCE', 1, 1, '', 'loadInformation609', 0, ''), ('C20-42', 'TELEPRESENCE', 1, 1, '', 'loadInformation610', 0, ''), ('C60-42', 'TELEPRESENCE', 1, 1, '', 'loadInformation611', 0, ''), ('C40-52', 'TELEPRESENCE', 1, 1, '', 'loadInformation612', 0, ''), ('C60-52', 'TELEPRESENCE', 1, 1, '', 'loadInformation613', 0, ''), ('C60-52D', 'TELEPRESENCE', 1, 1, '', 'loadInformation614', 0, ''), ('C60-65', 'TELEPRESENCE', 1, 1, '', 'loadInformation615', 0, ''), ('C90-65', 'TELEPRESENCE', 1, 1, '', 'loadInformation616', 0, ''), ('MX200', 'TELEPRESENCE', 1, 1, '', 'loadInformation617', 0, ''), ('TX9000', 'TELEPRESENCE', 1, 1, '', 'loadInformation619', 0, ''), ('TX9200', 'TELEPRESENCE', 1, 1, '', 'loadInformation620', 0, ''), ('SX20', 'TELEPRESENCE', 1, 1, '', 'loadInformation626', 0, ''), ('MX300', 'TELEPRESENCE', 1, 1, '', 'loadInformation627', 0, ''), ('C40-42', 'TELEPRESENCE', 1, 1, '', 'loadInformation633', 0, ''), ('Jabber', 'CISCO', 1, 1, '', 'loadInformation652', 0, ''), ('S60', 'NOKIA', 0, 1, '', 'loadInformation376', 0, ''), ('9971', 'CISCO', 1, 1, '', 'loadInformation493', 0, ''), ('9951', 'CISCO', 1, 1, '', 'loadInformation537', 0, ''), ('8961', 'CISCO', 1, 1, '', 'loadInformation540', 0, ''), ('Iphone', 'APPLE', 0, 1, '', 'loadInformation562', 0, ''), ('Android', 'ANDROID', 0, 1, '', 'loadInformation575', 0, ''), ('7926', 'CISCO', 1, 1, 'CP7926G-1.4.5.3', 'loadInformation577', 0, ''), ('7821', 'CISCO', 1, 1, '', 'loadInformation621', 0, ''), ('7841', 'CISCO', 1, 1, '', 'loadInformation622', 0, ''), ('7861', 'CISCO', 1, 1, '', 'loadInformation623', 0, ''), ('VXC 6215', 'CISCO', 1, 1, '', 'loadInformation634', 0, ''), ('8831', 'CISCO', 1, 1, '', 'loadInformation659', 0, ''), ('8841', 'CISCO', 1, 1, '', 'loadInformation683', 0, ''), ('8851', 'CISCO', 1, 1, '', 'loadInformation684', 0, ''), ('8861', 'CISCO', 1, 1, '', 'loadInformation685', 0, ''), ('Analog', 'CISCO', 1, 1, '', 'loadInformation30027', 0, ''), ('ISDN', 'CISCO', 1, 1, '', 'loadInformation30028', 0, ''), ('SCCP GW', 'CISCO', 1, 1, '', 'loadInformation30032', 0, ''), ('IP-STE', 'CISCO', 1, 1, '', 'loadInformation30035', 0, ''), ('SPA 521S', 'CISCO', 1, 1, '', 'loadInformation80000', 0, ''), ('SPA 502G', 'CISCO', 1, 1, '', 'loadInformation80003', 0, ''), ('SPA 504G', 'CISCO', 1, 1, '', 'loadInformation80004', 0, ''), ('SPA 525G', 'CISCO', 1, 1, '', 'loadInformation80005', 0, ''), ('SPA 525G2', 'CISCO', 1, 1, '', 'loadInformation80009', 0, ''), ('SPA 303G', 'CISCO', 1, 1, '', 'loadInformation80011', 0, ''), ('IP Communicator', 'CISCO', 1, 1, '', 'loadInformation30016', 0, NULL), ('Nokia E', 'Nokia', 1, 28, '', 'loadInformation275', 0, NULL), ('VGC Phone', 'CISCO', 1, 1, '', 'loadInformation10', 0, NULL), ('7911-sip', 'CISCO-SIP', 1, 1, 'SIP11.9-2-1S', 'loadInformation307', 1, 'SEP0000000000.cnf.xml_791x_sip_template'), ('9951-sip', 'CISCO-SIP', 1, 5, 'sip9951.9-2-2SR1-9', 'loadinformation537', 1, 'SEP0000000000.cnf.xml_99xx_sip_template'), ('VGC Virtual', 'CISCO', 1, 1, '', 'loadInformation11', 0, NULL);"; $check = $db->query($sql); if (DB::IsError($check)) { die_freepbx("Can not create sccpdevmodel table, error:$check\n"); } return; } function InstallDB_createButtonConfigTrigger() { global $db; outn("
  • " . _("(Re)Create buttonconfig trigger") . "
  • "); $sql = "DROP TRIGGER IF EXISTS sccp_trg_buttonconfig;"; $sql .= "CREATE TRIGGER `sccp_trg_buttonconfig` BEFORE INSERT ON `sccpbuttonconfig` FOR EACH ROW BEGIN IF NEW.`reftype` = 'sccpdevice' THEN IF (SELECT COUNT(*) FROM `sccpdevice` WHERE `sccpdevice`.`name` = NEW.`ref` ) = 0 THEN UPDATE `Foreign key contraint violated: ref does not exist in sccpdevice` SET x=1; END IF; END IF; IF NEW.`reftype` = 'sccpline' THEN IF (SELECT COUNT(*) FROM `sccpline` WHERE `sccpline`.`name` = NEW.`ref`) = 0 THEN UPDATE `Foreign key contraint violated: ref does not exist in sccpline` SET x=1; END IF; END IF; IF NEW.`buttontype` = 'line' THEN SET @line_x = SUBSTRING_INDEX(NEW.`name`,'!',1); SET @line_x = SUBSTRING_INDEX(@line_x,'@',1); IF NEW.`reftype` != 'sipdevice' THEN IF (SELECT COUNT(*) FROM `sccpline` WHERE `sccpline`.`name` = @line_x ) = 0 THEN UPDATE `Foreign key contraint violated: line does not exist in sccpline` SET x=1; END IF; END IF; END IF; END;"; $check = $db->query($sql); if (DB::IsError($check)) { die_freepbx("Can not modify sccpdevice table\n"); } outn("
  • " . _("(Re)Create trigger Ok") . "
  • "); return true; } function InstallDB_updateDBVer($sccp_compatible) { global $db; outn("
  • " . _("Update DB Ver") . "
  • "); $sql = "REPLACE INTO `sccpsettings` (`keyword`, `data`, `seq`, `type`) VALUES ('SccpDBmodel', '". $sccp_compatible. "','30','0');"; $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx(sprintf(_("Error updating sccpsettings. Command was: %s; error was: %s "), $sql, $results->getMessage())); } return true; } function InstallDbCreateViews($sccp_compatible) { global $db; outn("
  • " . _("(Re)Create sccpdeviceconfig view") . "
  • "); $sql = "DROP VIEW IF EXISTS sccpdeviceconfig; DROP VIEW IF EXISTS sccpuserconfig; "; /// global $hw_mobil; // From logserver to end only applies to db ver > 433 global $mobile_hw; if ($mobile_hw == '1') { $sql .= "CREATE OR REPLACE ALGORITHM = MERGE VIEW sccpdeviceconfig AS SELECT GROUP_CONCAT( CONCAT_WS( ',', sccpbuttonconfig.buttontype, sccpbuttonconfig.name, sccpbuttonconfig.options ) ORDER BY instance ASC SEPARATOR ';' ) AS sccpbutton, sccpdevice.* FROM sccpdevice LEFT JOIN sccpbuttonconfig ON (sccpbuttonconfig.reftype = 'sccpdevice' AND sccpbuttonconfig.ref = sccpdevice.name ) GROUP BY sccpdevice.name; "; $sql .= "CREATE OR REPLACE ALGORITHM = MERGE VIEW sccpuserconfig AS SELECT GROUP_CONCAT( CONCAT_WS( ',', sccpbuttonconfig.buttontype, sccpbuttonconfig.name, sccpbuttonconfig.options ) ORDER BY instance ASC SEPARATOR ';' ) AS button, sccpuser.* FROM sccpuser LEFT JOIN sccpbuttonconfig ON ( sccpbuttonconfig.reftype = 'sccpuser' AND sccpbuttonconfig.ref = sccpuser.id) GROUP BY sccpuser.name; "; } else { $sql .= "CREATE OR REPLACE VIEW sccpdeviceconfig AS SELECT CASE sccpdevice.profileid WHEN 0 THEN (SELECT GROUP_CONCAT(CONCAT_WS(',', defbutton.buttontype, defbutton.name, defbutton.options ) SEPARATOR ';') FROM sccpbuttonconfig AS defbutton WHERE defbutton.ref = sccpdevice.name ORDER BY defbutton.instance ) WHEN 1 THEN (SELECT GROUP_CONCAT(CONCAT_WS(',', userbutton.buttontype, userbutton.name, userbutton.options ) SEPARATOR ';') FROM sccpbuttonconfig AS userbutton WHERE userbutton.ref = sccpdevice.loginname ORDER BY userbutton.instance ) WHEN 2 THEN (SELECT GROUP_CONCAT(CONCAT_WS(',', homebutton.buttontype, homebutton.name, homebutton.options ) SEPARATOR ';') FROM sccpbuttonconfig AS homebutton WHERE homebutton.ref = sccpuser.homedevice ORDER BY homebutton.instance ) END AS button, if(sccpdevice.profileid = 0, sccpdevice.description, sccpuser.description) AS description, sccpdevice.name, sccpdevice.type, sccpdevice.addon, sccpdevice.tzoffset, sccpdevice.imageversion, sccpdevice.deny, sccpdevice.permit, sccpdevice.earlyrtp, sccpdevice.mwilamp, sccpdevice.mwioncall, sccpdevice.dndFeature, sccpdevice.transfer, sccpdevice.cfwdall, sccpdevice.cfwdbusy, sccpdevice.private, sccpdevice.privacy, sccpdevice.nat, sccpdevice.directrtp, sccpdevice.softkeyset, sccpdevice.audio_tos, sccpdevice.audio_cos, sccpdevice.video_tos, sccpdevice.video_cos, sccpdevice.conf_allow, sccpdevice.conf_play_general_announce, sccpdevice.conf_play_part_announce, sccpdevice.conf_mute_on_entry, sccpdevice.conf_music_on_hold_class, sccpdevice.conf_show_conflist, sccpdevice.force_dtmfmode, sccpdevice.setvar, sccpdevice.backgroundImage, sccpdevice.backgroundThumbnail, sccpdevice.ringtone, sccpdevice.callhistory_answered_elsewhere, sccpdevice.useRedialMenu, sccpdevice.cfwdnoanswer, sccpdevice.park, sccpdevice.monitor, sccpdevice.phonecodepage, sccpdevice.keepalive FROM sccpdevice LEFT JOIN sccpuser sccpuser ON ( sccpuser.name = sccpdevice.loginname ) GROUP BY sccpdevice.name;"; } $stmt = $db->prepare($sql); $result = $stmt->execute(); if (!$result) { die_freepbx(sprintf(_("Error updating sccpdeviceconfig view. Command was: %s"), $sql)); } outn("
  • " . _("(Re)Create sccplineconfig view") . "
  • "); $sql = "DROP VIEW IF EXISTS sccplineconfig; "; $sql .= "CREATE OR REPLACE VIEW sccplineconfig AS SELECT sccpline.name, sccpline.id, sccpline.pin ,sccpline.label, sccpline.description, sccpline.context, sccpline.incominglimit, sccpline.transfer, sccpline.mailbox, sccpline.vmnum, sccpline.cid_name, sccpline.cid_num, sccpline.disallow, sccpline.allow, sccpline.trnsfvm, sccpline.secondary_dialtone_digits, sccpline.secondary_dialtone_tone, sccpline.musicclass, sccpline.language, sccpline.accountcode, sccpline.echocancel, sccpline.silencesuppression, sccpline.callgroup, sccpline.pickupgroup, sccpline.adhocNumber, sccpline.meetme, sccpline.meetmenum, sccpline.meetmeopts, sccpline.regexten, sccpline.directed_pickup, sccpline.directed_pickup_context, sccpline.pickup_modeanswer, sccpline.amaflags, sccpline.dnd, sccpline.setvar, sccpline.namedcallgroup, sccpline.namedpickupgroup, sccpline.phonecodepage, sccpline.videomode FROM sccpline"; $stmt = $db->prepare($sql); $result = $stmt->execute(); if (!$result) { die_freepbx(sprintf(_("Error updating sccplineconfig view. Command was: %s"), $sql)); } return true; } function installDbPopulateSccpline() { // Lines in Sccp_manager are devices in FreePbx. Need to ensure that these two tables are synchronised on install global $db; $freePbxExts = array (); $sccpExts =array(); $sql = "SELECT id AS name, user AS accountcode, description AS label FROM devices WHERE tech='sccp'"; $stmt = $db->prepare($sql); $stmt->execute(); $freePbxExts = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); $sql = "SELECT name, accountcode, label FROM sccpline"; $stmt = $db->prepare($sql); $stmt->execute(); $sccpExts = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); $linesToCreate = array_diff_assoc($freePbxExts, $sccpExts); foreach ($linesToCreate as $key => $valArr) { $stmt = $db->prepare("INSERT into sccpline (name, accountcode, description, label) VALUES (:name, :accountcode, :description, :label)"); $stmt->bindParam(':name',$key,\PDO::PARAM_STR); $description = "{$valArr['label']} <{$key}>"; $stmt->bindParam(':accountcode',$valArr['accountcode'],\PDO::PARAM_STR); $stmt->bindParam(':description',$description,\PDO::PARAM_STR); $stmt->bindParam(':label',$valArr['label'],\PDO::PARAM_STR); $stmt->execute(); if (DB::IsError($stmt)) { die_freepbx(sprintf(_("Error inserting into sccpline. Command was: %s; error was: %s "), $stmt, $stmt->getMessage())); } } } function createBackUpConfig() { global $amp_conf; global $cnf_int; outn("
  • " . _("Creating Config BackUp") . "
  • "); $backup_files = array('extensions','extconfig','res_mysql', 'res_config_mysql','sccp','sccp_hardware','sccp_extensions'); $backup_ext = array('_custom.conf', '_additional.conf','.conf'); $dir = $cnf_int->get('ASTETCDIR'); $fsql = $dir.'/sccp_backup_'.date("Ymd").'.sql'; $result = exec('mysqldump '.$amp_conf['AMPDBNAME'].' --password='.$amp_conf['AMPDBPASS'].' --user='.$amp_conf['AMPDBUSER'].' --single-transaction >'.$fsql); try { $zip = new \ZipArchive(); } catch (\Exception $e) { outn("
    "); outn("PHPx.x-zip not installed where x.x is the installed PHP version. Install it before continuing !"); die_freepbx(); } $filename = $dir . "/sccp_install_backup" . date("Ymdhis"). ".zip"; if ($zip->open($filename, \ZIPARCHIVE::CREATE)) { foreach ($backup_files as $file) { foreach ($backup_ext as $b_ext) { if (file_exists($dir . '/'.$file . $b_ext)) { $zip->addFile($dir . '/'.$file . $b_ext); } } } if (file_exists($fsql)) { $zip->addFile($fsql); } $zip->close(); } else { outn("
  • " . _("Error Creating BackUp: ") . $filename ."
  • "); } unlink($fsql); outn("
  • " . _("Config backup created: ") . $filename ."
  • "); } function RenameConfig() { outn("
  • " . _("Move Old Config") . "
  • "); global $cnf_int; $rename_files = array('sccp_hardware','sccp_extensions'); $rename_ext = array('_custom.conf', '_additional.conf','.conf'); $dir = $cnf_int->get('ASTETCDIR'); foreach ($rename_files as $file) { foreach ($rename_ext as $b_ext) { if (file_exists($dir . '/'.$file . $b_ext)) { rename($dir . '/'.$file . $b_ext, $dir . '/'.$file . $b_ext.'.old'); } } } } function Setup_RealTime() { outn("
  • " . _("Checking realtime configuration ...") . "
  • "); global $amp_conf; global $cnf_int; $cnf_wr = \FreePBX::WriteConfig(); $cnf_read = \FreePBX::LoadConfig(); // Define required default settings based on FreePBX and system settings $dir = $cnf_int->get('ASTETCDIR'); $sys_mysql_socket = ini_get('pdo_mysql.default_socket'); $def_bd_config = array('dbhost' => $amp_conf['AMPDBHOST'], 'dbname' => $amp_conf['AMPDBNAME'], 'dbuser' => $amp_conf['AMPDBUSER'], 'dbpass' => $amp_conf['AMPDBPASS'], 'dbport' => '3306', 'dbsock' => '/var/lib/mysql/mysql.sock', 'dbcharset'=>'utf8' ); if (!empty($sys_mysql_socket)) { if (file_exists($sys_mysql_socket)) { $def_bd_config['dbsock'] = $sys_mysql_socket; } } $def_bd_section = $amp_conf['AMPDBNAME']; $def_ext_config = array('sccpdevice' => "mysql,{$def_bd_section},sccpdeviceconfig",'sccpline' => "mysql,{$def_bd_section},sccplineconfig"); // Check extconfig file for correct connector values $ext_conf = ''; $ext_conf_file = ''; $backup_ext = array('_custom.conf', '_additional.conf','.conf'); foreach ($backup_ext as $value) { if (file_exists($dir . '/extconfig' . $value)) { // Last possibility is normal file extconfig.conf $ext_conf_file = 'extconfig' . $value; $ext_conf = $cnf_read->getConfig($ext_conf_file); break; } } if (empty($ext_conf_file)) { // Have not found a file, so will need to create. $ext_conf must be empty $ext_conf_file = 'extconfig.conf'; } if (!empty($ext_conf)) { // Have found a file and read a config. Now need to check required settings $currentExtSettings = array(); $writeExtSettings = $ext_conf; if (empty($ext_conf['settings']['sccpdevice']) || ($ext_conf['settings']['sccpdevice'] !== $def_ext_config['sccpdevice'])) { // Have error in sccpdevice so need to correct $writeExtSettings['settings']['sccpdevice'] = $def_ext_config['sccpdevice']; } if (empty($ext_conf['settings']['sccpline']) || ($ext_conf['settings']['sccpline'] !== $def_ext_config['sccpline'])) { // Have error in sccpline so need to correct $writeExtSettings['settings']['sccpline'] = $def_ext_config['sccpline']; } if (!empty($writeExtSettings)) { outn("
  • " . _("Updating extconfig file ... ") . $ext_conf_file . "
  • "); $cnf_wr->writeConfig($ext_conf_file, $writeExtSettings); } } else { // Either did not find file or file did not contain any config, so create and fill outn("
  • " . _("Creating extconfig file ... ") . $ext_conf_file . "
  • "); $writeExtSettings['settings']['sccpdevice'] = $def_ext_config['sccpdevice']; $writeExtSettings['settings']['sccpline'] = $def_ext_config['sccpline']; $cnf_wr->writeConfig($ext_conf_file, $writeExtSettings); } // Check database settings $res_conf = array(); if (file_exists($dir . '/res_mysql.conf')) { $res_conf = $cnf_read->getConfig('res_mysql.conf'); if (empty($res_conf[$def_bd_section])) { $res_conf[$def_bd_section] = $def_bd_config; $cnf_wr->writeConfig('res_mysql.conf', $res_conf); outn("
  • " . _("Updating res_mysql.conf file ...") . "
  • "); } } elseif (file_exists($dir . '/res_config_mysql.conf')) { $res_conf = $cnf_read->getConfig('res_config_mysql.conf'); if (empty($res_conf[$def_bd_section])) { $res_conf[$def_bd_section] = $def_bd_config; $cnf_wr->writeConfig('res_config_mysql.conf', $res_conf); outn("
  • " . _("Updating res_config_mysql.conf file ...") . "
  • "); } } else { // Have not found either res_mysql.conf or res_config_mysql.config // So create the latter $res_conf[$def_bd_section] = $def_bd_config; $cnf_wr->writeConfig('res_config_mysql.conf', $res_conf, false); } } function addDriver($sccp_compatible) { global $amp_conf; global $cnf_int; outn("
  • " . _("Adding driver ...") . "
  • "); $file = $amp_conf['AMPWEBROOT'] . '/admin/modules/core/functions.inc/drivers/Sccp.class.php'; $contents = ""; file_put_contents($file, $contents); $dir = $cnf_int->get('ASTETCDIR'); if (!file_exists("{$dir}/sccp.conf")) { // System re Config outn("
  • " . _("Adding default configuration file ...") . "
  • "); $sccpfile = file_get_contents($amp_conf['AMPWEBROOT'] . '/admin/modules/sccp_manager/conf/sccp.conf'); file_put_contents("{$dir}/sccp.conf", $sccpfile); } } function checkTftpServer() { outn("
  • " . _("Checking TFTP server path and availability ...") . "
  • "); global $db; global $cnf_int; global $settingsFromDb; global $extconfigs; global $thisInstaller; global $amp_conf; $confDir = $cnf_int->get('ASTETCDIR'); $tftpRootPath = ""; // put the rewrite rules into the required location if (file_exists("{$confDir}/sccpManagerRewrite.rules")) { rename("{$confDir}/sccpManagerRewrite.rules", "{$confDir}/sccpManagerRewrite.rules.bu"); } copy($amp_conf['AMPWEBROOT'] . '/admin/modules/sccp_manager/conf/mappingRulesHeader',"{$confDir}/sccpManagerRewrite.rules"); file_put_contents("{$confDir}/sccpManagerRewrite.rules", file_get_contents($amp_conf['AMPWEBROOT'] . '/admin/modules/sccp_manager/contrib/rewrite.rules'), FILE_APPEND); file_put_contents("{$confDir}/sccpManagerRewrite.rules", "\n# Do not disable this rule - this is required by sccp_manager\nri ^(.+\.tlzz)?$ settings/\\1", FILE_APPEND); // TODO: add option to use external server $remoteFileName = ".sccp_manager_installer_probe_sentinel_temp".mt_rand(0, 9999999); $remoteFileContent = "# This is a test file created by Sccp_Manager. It can be deleted without impact"; $possibleFtpDirs = array('/srv', '/srv/tftp','/var/lib/tftp', '/tftpboot'); // write a couple of sentinels to different distro tftp locations in the filesystem // TODO: Depending on distro, do we have write permissions foreach ($possibleFtpDirs as $dirToTest) { if (is_dir($dirToTest) && is_writable($dirToTest)) { $tempFile = "${dirToTest}/{$remoteFileName}"; file_put_contents($tempFile, $remoteFileContent); // try to pull the written file through tftp. // this way we can determine if tftp server is active, and what it's // source directory is. if ($remoteFileContent == $thisInstaller->tftpReadTestFile($remoteFileName)) { $tftpRootPath = $dirToTest; outn("
  • " . _("Found ftp root dir at {$tftpRootPath}") . "
  • "); if ($settingsFromDb['tftp_path']['data'] != $tftpRootPath) { $settingsFromDb["tftp_path"] = array( 'keyword' => 'tftp_path', 'seq' => 2, 'type' => 0, 'data' => $tftpRootPath, 'systemdefault' => ''); } // Found sentinel file. Remove it and exit loop if (file_exists($tempFile)) { unlink($tempFile); } break; } // Did not find sentinel so remove and continue if (file_exists($tempFile)) { unlink($tempFile); } } } if (empty($tftpRootPath)) { die_freepbx(_("Either TFTP server is down or TFTP root is non standard. Please fix, refresh, and try again")); } $settingsFromDb['asterisk_etc_path'] = array( 'keyword' => 'asterisk_etc_path', 'seq' => 20, 'type' => 0, 'data' => $confDir, 'systemdefault' => ''); // Get TFTP mapping Status $settingsFromDb['tftp_rewrite'] = array('keyword' => 'tftp_rewrite', 'seq' => 20, 'type' => 0, 'data' => 'off', 'systemdefault' => ''); if ($thisInstaller->checkTftpMapping()) { $settingsFromDb['tftp_rewrite']['data'] = 'pro'; } // Populate TFTP paths in SccpSettings $settingsFromDb = $extconfigs->updateTftpStructure($settingsFromDb); foreach ($settingsFromDb as $settingToSave) { $sql = "REPLACE INTO sccpsettings (keyword, data, seq, type, systemdefault) VALUES ('{$settingToSave['keyword']}', '{$settingToSave['data']}', {$settingToSave['seq']}, {$settingToSave['type']}, '{$settingToSave['systemdefault']}')"; $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx(_("Error updating sccpsettings. $sql")); } } getMasterFileList($tftpRootPath); return; } function getMasterFileList(string $tftpRootPath) { global $thisInstaller; global $amp_conf; outn("
  • " . _("Checking TFTP server path and availability ...") . "
  • "); if (file_exists("{$tftpRootPath}/masterFilesStructure.xml")) { outn("
  • " . _("Backing up existing masterFilesList ...") . "
  • "); rename("{$tftpRootPath}/masterFilesStructure.xml","{$tftpRootPath}/masterFilesStructure.xml.old"); } outn("
  • " . _("Getting latest master file list from provisioner ...") . "
  • "); if (!$thisInstaller->getFileListFromProvisioner($tftpRootPath)) { outn("
  • " . _("Unable to fetch master file list from provisioner, installing local copy ...") . "
  • "); // Cannot get file from internet, so use copy with this dist which may be older. if (!copy($amp_conf['AMPWEBROOT'] . '/admin/modules/sccp_manager/contrib/masterFilesStructure.xml',"{$tftpRootPath}/masterFilesStructure.xml")) { return false; }; return true; }; } function cleanUpSccpSettings() { global $thisInstaller; global $settingsFromDb; global $db; global $aminterface; global $sccp_compatible; global $amp_conf; global $cnf_int; // Get current default settings from db $stmt = $db->prepare("SELECT keyword, sccpsettings.* FROM sccpsettings"); $stmt->execute(); $settingsFromDb = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); // See if a previous version was installed outn("
  • " . _("Checking for previous version of Sccp_manager.") . "
  • "); if (!isset($settingsFromDb['sccp_compatible']['data'])) { outn(_("No previous version found ")); } else { outn(_("Found DB Schema : {$settingsFromDb['sccp_compatible']['data']}")); } // Check that required settings are initialised and update db and $settingsFromDb if not /* foreach ($extconfigs->getExtConfig('sccpDefaults') as $key => $value) { if (empty($settingsFromDb[$key])) { $settingsFromDb[$key] = array('keyword' => $key, 'data' => $value, 'type' => 0, 'seq' => 0); $sql = "REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES ('{$key}', '{$value}', 0, 0)"; $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx(_("Error updating sccpsettings: $key")); } } } */ // Clean up sccpsettings to remove legacy values. $xml_vars = $amp_conf['AMPWEBROOT'] . "/admin/modules/sccp_manager/conf/sccpgeneral.xml.v{$sccp_compatible}"; $thisInstaller->xml_data = simplexml_load_file($xml_vars); $thisInstaller->initVarfromXml(); foreach ( array_diff_key($settingsFromDb,$thisInstaller->sccpvalues) as $key => $valueArray) { // Remove legacy values unset($settingsFromDb[$key]); } foreach ($settingsFromDb as $key => $valueArray) { $settingsFromDb[$key]['seq'] = $thisInstaller->sccpvalues[$key]['seq']; $settingsFromDb[$key]['type'] = $thisInstaller->sccpvalues[$key]['type']; } $settingsFromDb = array_merge($settingsFromDb, array_diff_key($thisInstaller->sccpvalues, $settingsFromDb)); unset($thisInstaller->sccpvalues); // get chan-sccp defaults foreach (array('general','device','line') as $section) { $sysConfig = $aminterface->getSCCPConfigMetaData($section); foreach ($sysConfig['Options'] as $valueArray) { if (isset($valueArray['Flags'])) { if ($valueArray['Flags'][0] == 'Obsolete' || $valueArray['Flags'][0] == 'Deprecated') { continue; } } if (isset($sysConfiguration[$valueArray['Name']])) { continue; } $sysConfiguration[$valueArray['Name']] = $valueArray; } } unset($sysConfig); foreach ($sysConfiguration as $key => $valueArray) { // 2 special cases deny|permit & disallow|allow where need to parse on |. $newKeyword = explode("|", $key, 2); if (isset($newKeyword[1])) { // chan-sccp sets sysdef as comma separated list for sccp.conf, but expects ; separated list // when returned from db $newSysDef = explode("|", $valueArray['DefaultValue'], 2); $newSysDef = str_replace(',',';', $newSysDef); $i = 0; foreach ($newKeyword as $dummy) { if (array_key_exists($newKeyword[$i],$settingsFromDb)) { if (!empty($newSysDef[$i])) { $settingsFromDb[$newKeyword[$i]]['systemdefault'] = $newSysDef[$i]; } } else { $settingsFromDb[$newKeyword[$i]] = array('keyword' => $newKeyword[$i], 'seq' => 0, 'type' => 0, 'data' => '', 'systemdefault' => $newSysDef[$i]); } $i++; } if (array_key_exists($key, $settingsFromDb)){ unset($settingsFromDb[$key]); } } else { $sysConfiguration[$key]['DefaultValue'] = ($sysConfiguration[$key]['DefaultValue'] == '(null)') ? '' : $sysConfiguration[$key]['DefaultValue']; if (array_key_exists($key,$settingsFromDb)) { // Preserve sequence and type $settingsFromDb[$key]['systemdefault'] = $sysConfiguration[$key]['DefaultValue']; } else { $settingsFromDb[$key] = array('keyword' => $key, 'seq' => 0, 'type' => 0, 'data' => '', 'systemdefault' => $sysConfiguration[$key]['DefaultValue']); } } // Override certain chan-sccp defaults as they are based on a non-FreePbx system $settingsFromDb['context']['systemdefault'] = 'from-internal'; $settingsFromDb['directed_pickup']['systemdefault'] = 'no'; unset($sysConfiguration[$key]); } unset($sysConfiguration); // Update enums in sccpsettings - values have changed over versions so need to update values in db that are not compliant outn("
  • " . _("Updating invalid enums in sccpsettings") . "
  • "); $rowsToTest = array(); $tablesToDescribe = array('sccpline', 'sccpdevice'); foreach ($tablesToDescribe as $theTable) { $stmt = $db->prepare("DESCRIBE {$theTable}"); $stmt->execute(); $tableDesc = $stmt->fetchAll(\PDO::FETCH_ASSOC|\PDO::FETCH_UNIQUE); foreach ($tableDesc as $key => $valArr) { if (strpos($valArr['Type'], 'enum') !== 0) { continue; } $rowsToTest[$key] = explode(',',rtrim(str_replace('enum(', '',$valArr['Type']), ')')); } } $count = 0; foreach ($rowsToTest as $key => $valArr) { if (empty($settingsFromDb[$key]['data'])) { continue; } if (in_array("'{$settingsFromDb[$key]['data']}'", $valArr, true)) { continue; } // clear site setting so that will return to system defaults. // Try to convert based on change from on/off to yes/no. if (in_array($settingsFromDb[$key]['data'], array('on','off'), true)) { if (in_array("'yes'", $valArr, true)) { $settingsFromDb[$key]['data'] = ($settingsFromDb[$key]['data'] = 'on') ? 'yes' : 'no'; continue; } } // Test for case if (in_array("'" . strtolower($settingsFromDb[$key]['data']) . "'", $valArr, true)) { $settingsFromDb[$key]['data'] = strtolower($settingsFromDb[$key]['data']); continue; } // No easy choices so reset to system default $settingsFromDb[$key]['data'] = ''; $count++; } // Write settings back to db $sql = "TRUNCATE sccpsettings"; $results = $db->query($sql); foreach ( $settingsFromDb as $key =>$valueArray ) { $sql = "REPLACE INTO sccpsettings (keyword, seq, type, data, systemdefault) VALUES ( '{$settingsFromDb[$key]['keyword']}', {$settingsFromDb[$key]['seq']}, {$settingsFromDb[$key]['type']}, '{$settingsFromDb[$key]['data']}', '{$settingsFromDb[$key]['systemdefault']}' )"; $results = $db->query($sql); } // Now correct sccp.conf to replace any illegal settings $thisInstaller->createDefaultSccpConfig($settingsFromDb, $cnf_int->get('ASTETCDIR')); // have to correct prior verion sccpline lists for allow/disallow and deny permit. Prior // versions used csl, but chan-sccp expects ; separated lists when returned by db. outn("
  • " . _("Replacing invalid values in sccpline") . "
  • "); $db->query("UPDATE sccpline SET allow = REPLACE(allow, ',',';') WHERE allow like '%,%'"); $db->query("UPDATE sccpline SET disallow = REPLACE(disallow, ',',';') WHERE disallow like '%,%'"); // Ensure that disallow is set to all if unset (and not NULL) $db->query("UPDATE sccpline SET disallow = 'all' WHERE disallow like ''"); } ?>