Get default system settings from chan_sccp and add to sccpsettings Remove legacy settings from sccpsettings Change tftpReadTestFile to accept host as argument Change sccpsettings structure to include systemdefaults
1019 lines
58 KiB
PHP
1019 lines
58 KiB
PHP
<?php
|
|
|
|
if (!defined('FREEPBX_IS_AUTH')) {
|
|
die_freepbx('No direct script access allowed');
|
|
}
|
|
|
|
global $db;
|
|
global $amp_conf;
|
|
global $version;
|
|
global $aminterface;
|
|
global $extconfigs;
|
|
global $mobile_hw;
|
|
global $useAmiForSoftKeys;
|
|
global $settingsFromDb;
|
|
global $thisInstaller;
|
|
global $cnf_int;
|
|
global $sccp_compatible;
|
|
$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();
|
|
|
|
// Do not create Sccp_Manager object as not required.
|
|
// Only include required classes and create anonymous class for thisInstaller
|
|
|
|
$thisInstaller = new class{
|
|
use \FreePBX\modules\Sccp_Manager\sccpManTraits\helperFunctions;
|
|
};
|
|
|
|
$requiredClasses = array('aminterface', 'extconfigs');
|
|
foreach ($requiredClasses as $className) {
|
|
$class = "\\FreePBX\\Modules\\Sccp_manager\\$className";
|
|
if (!class_exists($class, false)) {
|
|
include(__DIR__ . "/sccpManClasses/$className.class.php");
|
|
}
|
|
if (class_exists($class, false)) {
|
|
${$className} = new $class();
|
|
}
|
|
}
|
|
|
|
CheckAsteriskVersion();
|
|
$sccp_version = CheckChanSCCPCompatible();
|
|
$sccp_compatible = $sccp_version[0];
|
|
$chanSCCPWarning = $sccp_version[1] ^= 1;
|
|
outn("<li>" . _("Sccp model Compatible code : ") . $sccp_compatible . "</li>");
|
|
if ($sccp_compatible == 0) {
|
|
outn("<br>");
|
|
outn("<font color='red'>Chan Sccp not Found. Install it before continuing !</font>");
|
|
die();
|
|
}
|
|
|
|
// BackUp Old config
|
|
createBackUpConfig();
|
|
RenameConfig();
|
|
|
|
$db_config = Get_DB_config($sccp_compatible);
|
|
InstallDB_updateSchema($db_config);
|
|
|
|
cleanUpSccpSettings();
|
|
|
|
InstallDB_createButtonConfigTrigger();
|
|
InstallDB_CreateSccpDeviceConfigView($sccp_compatible);
|
|
InstallDB_updateDBVer($sccp_compatible);
|
|
if ($chanSCCPWarning) {
|
|
outn("<br>");
|
|
outn("<font color='red'>Error: installed version of chan-sccp is not compatible. Please upgrade chan-sccp</font>");
|
|
}
|
|
Setup_RealTime();
|
|
addDriver($sccp_compatible);
|
|
checkTftpServer();
|
|
|
|
outn("<br>");
|
|
outn("Install Complete !");
|
|
outn("<br>");
|
|
|
|
// 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')"),
|
|
'description' => array('rename' => "_description"),
|
|
'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('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'cfwdall' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'cfwdbusy' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'cfwdnoanswer' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'park' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'directrtp' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'dndFeature' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'earlyrtp' => array('create' => "ENUM('immediate','offHook','dialing','ringout','progress','none') NOT NULL default 'none'",
|
|
'modify' => "ENUM('immediate','offHook','dialing','ringout','progress','none')"),
|
|
'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('on','off') NOT NULL DEFAULT 'off'", 'modify' => "enum('on','off')"),
|
|
'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('on','off') NOT NULL default 'on'",
|
|
'modify' => "enum('on','off')"),
|
|
'private' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'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('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'directed_pickup_context' => array('create' => "VARCHAR(100) NULL DEFAULT NULL"),
|
|
'pickup_modeanswer' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'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('user','auto','off') NOT NULL default 'auto'", 'modify' => "enum('user','auto','off')"),
|
|
'incominglimit' => array('create' => "INT(11) DEFAULT '6'", 'modify' => 'INT(11)', 'def_modify' => "6"),
|
|
'transfer' => array('create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'vmnum' => array('def_modify' => "*97"),
|
|
'musicclass' => array('def_modify' => "default"),
|
|
'disallow' => array('create' => "VARCHAR(255) NULL DEFAULT NULL"),
|
|
'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('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'silencesuppression' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'dnd' => array('create' => "enum('off','reject','silent','user') NOT NULL default 'reject'", 'modify' => "enum('off','reject','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('on','off','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('on','off') NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'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.
|
|
// By prefixing with an underscore, these fields are ignored by chan-sccp
|
|
// which is not an issue as they are not "runtime"
|
|
$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')"),
|
|
'_simulate_enbloc' => array( 'create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'_hotline_enabled' => array( 'create' => "enum('on','off') NOT NULL default 'on'", 'modify' => "enum('on','off')"),
|
|
'_hotline_extension' => array( 'create' => "VARCHAR(20) NULL default '*60'", 'modify' => "VARCHAR(20)"),
|
|
'_hotline_label' => array( 'create' => "VARCHAR(20) NULL default 'hotline'", 'modify' => "VARCHAR(20)"),
|
|
'_hotline_context' => array( 'create' => "VARCHAR(20) NULL default 'default'", 'modify' => "VARCHAR(20)"),
|
|
'_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')"),
|
|
'_echocancel' => array('create' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')"),
|
|
'_silencesuppression' => array('create' => "VARCHAR(20) NULL default null", 'modify' => "VARCHAR(20)"),
|
|
'_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' => "enum('on','off') NOT NULL default 'off'", 'modify' => "enum('on','off')")
|
|
),
|
|
'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')")
|
|
),
|
|
'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;
|
|
}
|
|
|
|
// New values to add (these are currently unused)
|
|
|
|
|
|
}
|
|
|
|
function CheckSCCPManagerDBVersion()
|
|
{
|
|
|
|
}
|
|
|
|
/* notused */
|
|
|
|
function CheckPermissions()
|
|
{
|
|
outn("<li>" . _("Checking Filesystem Permissions") . "</li>");
|
|
$dst = $_SERVER['DOCUMENT_ROOT'] . '/admin/modules/sccp_manager/views';
|
|
if (fileowner($_SERVER['DOCUMENT_ROOT']) != fileowner($dst)) {
|
|
die_freepbx('Please (re-)check permissions by running "amportal chown. Installation Failed"');
|
|
}
|
|
}
|
|
|
|
function CheckAsteriskVersion()
|
|
{
|
|
$version = FreePBX::Config()->get('ASTVERSION');
|
|
outn("<li>" . _("Checking Asterisk Version : ") . $version . "</li>");
|
|
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)
|
|
{
|
|
global $db;
|
|
if (!$db_config) {
|
|
die_freepbx("No db_config provided");
|
|
}
|
|
$count_modify = 0;
|
|
outn("<li>" . _("Modify Database schema") . "</li>");
|
|
foreach ($db_config as $tabl_name => &$tab_modif) {
|
|
// 0 - name 1-type 4- default
|
|
$sql = "DESCRIBE {$tabl_name};";
|
|
$stmt = $db->prepare("DESCRIBE {$tabl_name}");
|
|
$stmt->execute();
|
|
$db_result = $stmt->fetchAll();
|
|
if (DB::IsError($db_result)) {
|
|
die_freepbx("Can not get information from " . $tabl_name . " table\n");
|
|
}
|
|
foreach ($db_result as $tabl_data) {
|
|
$fld_id = $tabl_data[0];
|
|
$db_config[$tabl_name][$fld_id]['fieldExists'] = FALSE;
|
|
// Filter commands to avoid applying unnecessary
|
|
if (!empty($tab_modif[$fld_id])) {
|
|
// Potentially have something to modify in schema
|
|
$db_config[$tabl_name][$fld_id]['fieldExists'] = TRUE;
|
|
if (!empty($tab_modif[$fld_id]['modify'])) {
|
|
if (strtoupper($tab_modif[$fld_id]['modify']) == strtoupper($tabl_data[1])) {
|
|
unset($db_config[$tabl_name][$fld_id]['modify']);
|
|
}
|
|
// Modifying field so do not then need to modify defaults as this should do that
|
|
if (!empty($tab_modif[$fld_id]['def_modify'])) {
|
|
unset($db_config[$tabl_name][$fld_id]['def_modify']);
|
|
}
|
|
}
|
|
if (!empty($tab_modif[$fld_id]['def_modify'])) {
|
|
if (strtoupper($tab_modif[$fld_id]['def_modify']) == strtoupper($tabl_data[4])) {
|
|
unset($db_config[$tabl_name][$fld_id]['def_modify']);
|
|
}
|
|
}
|
|
if (!empty($tab_modif[$fld_id]['rename'])) {
|
|
$fld_id_source = $tab_modif[$fld_id]['rename'];
|
|
$db_config[$tabl_name][$fld_id_source]['fieldExists'] = TRUE;
|
|
if (!empty($db_config[$tabl_name][$fld_id_source]['create'])) {
|
|
$db_config[$tabl_name][$fld_id]['create'] = $db_config[$tabl_name][$fld_id_source]['create'];
|
|
} else {
|
|
$db_config[$tabl_name][$fld_id]['create'] = strtoupper($tabl_data[1]).(($tabl_data[2] == 'NO') ?' NOT NULL': ' NULL');
|
|
$db_config[$tabl_name][$fld_id]['create'] .= ' DEFAULT '. ((empty($tabl_data[4]))?'NULL': "'". $tabl_data[4]."'" );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$sql_create = '';
|
|
$sql_modify = '';
|
|
$sql_update = '';
|
|
|
|
foreach ($tab_modif as $row_fld => $row_data) {
|
|
if (!$row_data['fieldExists']) {
|
|
if (!empty($row_data['create'])) {
|
|
$sql_create .= "ADD COLUMN {$row_fld} {$row_data['create']}, ";
|
|
$count_modify ++;
|
|
}
|
|
} else {
|
|
if (!empty($row_data['rename'])) {
|
|
$sql_modify .= "RENAME COLUMN {$row_fld} TO {$row_data['rename']}, ";
|
|
$count_modify ++;
|
|
}
|
|
$row_data['fieldModified'] = FALSE;
|
|
if (!empty($row_data['modify'])) {
|
|
if (!empty($row_data['create'])) {
|
|
// Use values in create to set defaults
|
|
$sql_modify .= "MODIFY COLUMN {$row_fld} {$row_data['create']}, ";
|
|
} else {
|
|
$sql_modify .= "MODIFY COLUMN {$row_fld} {$row_data['modify']} DEFAULT {$row_data['def_modify']}, ";
|
|
}
|
|
if (strpos($row_data['modify'], 'enum') !== false) {
|
|
$sql_update .= "UPDATE " . $tabl_name . " set `" . $row_fld . "`=case when lower(`" . $row_fld . "`) in ('yes','true','1') then 'on' when lower(`" . $row_fld . "`) in ('no', 'false', '0') then 'off' else `" . $row_fld . "` end; ";
|
|
}
|
|
$count_modify ++;
|
|
}
|
|
if (!empty($row_data['def_modify'])) {
|
|
$sql_modify .= "ALTER COLUMN {$row_fld} SET DEFAULT '{$row_data['def_modify']}', ";
|
|
$count_modify ++;
|
|
}
|
|
if (!empty($row_data['drop'])) {
|
|
$sql_create .= "DROP COLUMN {$row_fld}, ";
|
|
$count_modify ++;
|
|
}
|
|
}
|
|
}
|
|
if (!empty($sql_update)) {
|
|
outn("<li>" . _("Updating table rows :") . $affected_rows . "</li>");
|
|
$sql_update = 'BEGIN; ' . $sql_update . ' COMMIT;';
|
|
sql($sql_update);
|
|
$affected_rows = $db->affectedRows();
|
|
outn("<li>" . _("Updated table rows :") . $affected_rows . "</li>");
|
|
}
|
|
|
|
if (!empty($sql_create)) {
|
|
outn("<li>" . _("Adding new columns ...") . "</li>");
|
|
$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 column to {$tabl_name}. SQL: {$sql_create} \n");
|
|
}
|
|
}
|
|
if (!empty($sql_modify)) {
|
|
outn("<li>" . _("Modifying table columns") . $tabl_name ."</li>");
|
|
|
|
$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_create} \n");
|
|
}
|
|
}
|
|
}
|
|
outn("<li>" . _("Total modify count :") . $count_modify . "</li>");
|
|
|
|
$stmt = $db->prepare('SELECT CASE WHEN EXISTS(SELECT 1 FROM sccpdevmodel) THEN 0 ELSE 1 END AS IsEmpty;');
|
|
$stmt->execute();
|
|
$result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
|
if (!$result[0]['IsEmpty']) {
|
|
return;
|
|
} else {
|
|
outn("Populating sccpdevmodel...");
|
|
outn("<li>" . _("Fill sccpdevmodel") . "</li>");
|
|
$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, 1, 'SCCP894x.9-2-2-0', 'loadInformation586', 0, NULL),
|
|
('8945', 'CISCO', 1, 1, 'SCCP894x.9-2-2-0', 'loadInformation585', 0, NULL),
|
|
('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, 1, '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("<li>" . _("(Re)Create buttonconfig trigger") . "</li>");
|
|
$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("<li>" . _("(Re)Create trigger Ok") . "</li>");
|
|
return true;
|
|
}
|
|
function InstallDB_updateDBVer($sccp_compatible)
|
|
{
|
|
global $db;
|
|
outn("<li>" . _("Update DB Ver") . "</li>");
|
|
$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 InstallDB_CreateSccpDeviceConfigView($sccp_compatible)
|
|
{
|
|
global $db;
|
|
outn("<li>" . _("(Re)Create sccpdeviceconfig view") . "</li>");
|
|
$sql = "";
|
|
$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
|
|
ALGORITHM = MERGE
|
|
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.*
|
|
FROM sccpdevice
|
|
LEFT JOIN sccpuser sccpuser ON ( sccpuser.name = sccpdevice._loginname )
|
|
GROUP BY sccpdevice.name;";
|
|
}
|
|
$results = $db->query($sql);
|
|
if (DB::IsError($results)) {
|
|
die_freepbx(sprintf(_("Error updating sccpdeviceconfig view. Command was: %s; error was: %s "), $sql, $results->getMessage()));
|
|
}
|
|
return true;
|
|
}
|
|
function createBackUpConfig()
|
|
{
|
|
global $amp_conf;
|
|
global $cnf_int;
|
|
outn("<li>" . _("Creating Config BackUp") . "</li>");
|
|
$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("<br>");
|
|
outn("<font color='red'>PHPx.x-zip not installed where x.x is the installed PHP version. Install it before continuing !</font>");
|
|
die_freepbx();
|
|
}
|
|
$filename = $dir . "/sccp_install_backup" . date("Ymd"). ".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("<li>" . _("Error Creating BackUp: ") . $filename ."</li>");
|
|
}
|
|
unlink($fsql);
|
|
outn("<li>" . _("Config backup created: ") . $filename ."</li>");
|
|
}
|
|
|
|
function RenameConfig()
|
|
{
|
|
outn("<li>" . _("Move Old Config") . "</li>");
|
|
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("<li>" . _("Checking realtime configuration ...") . "</li>");
|
|
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},sccpline");
|
|
|
|
// 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("<li>" . _("Updating extconfig file ... ") . $ext_conf_file . "</li>");
|
|
$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("<li>" . _("Creating extconfig file ... ") . $ext_conf_file . "</li>");
|
|
$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 = '';
|
|
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("<li>" . _("Updating res_mysql.conf file ...") . "</li>");
|
|
}
|
|
} 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("<li>" . _("Updating res_config_mysql.conf file ...") . "</li>");
|
|
}
|
|
} 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) {
|
|
outn("<li>" . _("Adding driver ...") . "</li>");
|
|
$file = "{$_SERVER['DOCUMENT_ROOT']}/admin/modules/core/functions.inc/drivers/Sccp.class.php";
|
|
$contents = "<?php include '/var/www/html/admin/modules/sccp_manager/sccpManClasses/Sccp.class.php.v{$sccp_compatible}'; ?>";
|
|
file_put_contents($file, $contents);
|
|
|
|
global $cnf_int;
|
|
$dir = $cnf_int->get('ASTETCDIR');
|
|
if (!file_exists("{$dir}/sccp.conf")) { // System re Config
|
|
outn("<li>" . _("Adding default configuration file ...") . "</li>");
|
|
$sccpfile = file_get_contents("{$_SERVER['DOCUMENT_ROOT']}/admin/modules/sccp_manager/conf/sccp.conf");
|
|
file_put_contents("{$dir}/sccp.conf", $sccpfile);
|
|
}
|
|
}
|
|
function checkTftpServer() {
|
|
outn("<li>" . _("Checking TFTP server path and availability ...") . "</li>");
|
|
global $db;
|
|
global $cnf_int;
|
|
global $settingsFromDb;
|
|
global $extconfigs;
|
|
global $thisInstaller;
|
|
$confDir = $cnf_int->get('ASTETCDIR');
|
|
$tftpRootPath = "";
|
|
|
|
// 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
|
|
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("<li>" . _("Found ftp root dir at {$tftpRootPath}") . "</li>");
|
|
if ($settingsFromDb['tftp_path']['data'] != $tftpRootPath) {
|
|
$settingsToDb["tftp_path"] = array( 'keyword' => 'tftp_path', 'seq' => 2, 'type' => 0, 'data' => $tftpRootPath);
|
|
// Need to set the new value here to pass to extconfigs below
|
|
$settingsFromDb['tftp_path']['data'] = $tftpRootPath;
|
|
}
|
|
// 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"));
|
|
}
|
|
|
|
$settingsToDb['asterisk_etc_path'] =array( 'keyword' => 'asterisk_etc_path', 'seq' => 20, 'type' => 0, 'data' => $confDir);
|
|
$settingsFromDb['asterisk_etc_path']['data'] = $confDir;
|
|
|
|
foreach ($settingsToDb as $settingToSave) {
|
|
$sql = "REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES ('{$settingToSave['keyword']}', '{$settingToSave['data']}', {$settingToSave['seq']}, {$settingToSave['type']});";
|
|
$results = $db->query($sql);
|
|
if (DB::IsError($results)) {
|
|
die_freepbx(_("Error updating sccpsettings. $sql"));
|
|
}
|
|
unset($settingsToDb[$settingToSave['keyword']]);
|
|
}
|
|
|
|
$settingsToDb = $extconfigs->updateTftpStructure($settingsFromDb);
|
|
|
|
foreach ($settingsToDb as $settingKey => $settingVal) {
|
|
$settingsFromDb[$settingKey]['data'] = $settingVal;
|
|
$sql = "REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES ('{$settingKey}', '{$settingVal}', 20, 0)";
|
|
$results = $db->query($sql);
|
|
if (DB::IsError($results)) {
|
|
die_freepbx(_("Error updating sccpsettings. $sql"));
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
function cleanUpSccpSettings() {
|
|
global $thisInstaller;
|
|
global $settingsFromDb;
|
|
global $db;
|
|
global $aminterface;
|
|
global $sccp_compatible;
|
|
|
|
// Get current default settings from db
|
|
$stmt = $db->prepare("SELECT * FROM sccpsettings");
|
|
$stmt->execute();
|
|
$settingsFromDb = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
|
foreach ($settingsFromDb as $key => $rowArray) {
|
|
$settingsFromDb[$rowArray['keyword']] = $rowArray;
|
|
unset($settingsFromDb[$key]);
|
|
}
|
|
// See if a previous version was installed
|
|
outn("<li>" . _("Checking for previous version of Sccp_manager.") . "</li>");
|
|
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 = "{$_SERVER['DOCUMENT_ROOT']}/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
|
|
|
|
$sysConfiguration = $aminterface->getSCCPConfigMetaData('general');
|
|
|
|
foreach ($sysConfiguration['Options'] as $key => $valueArray) {
|
|
if ($valueArray['Flags'][0] == 'Obsolete' || $valueArray['Flags'][0] == 'Deprecated') {
|
|
continue;
|
|
}
|
|
$sysConfiguration[$valueArray['Name']] = $valueArray;
|
|
if (array_key_exists($valueArray['Name'],$settingsFromDb)) {
|
|
if (!empty($sysConfiguration[$valueArray['Name']]['DefaultValue'])) {
|
|
$settingsFromDb[$valueArray['Name']]['systemdefault'] = $sysConfiguration[$valueArray['Name']]['DefaultValue'];
|
|
}
|
|
} else {
|
|
$settingsFromDb[$valueArray['Name']] = array('keyword' => $valueArray['Name'], 'seq' => 0, 'type' => 0, 'data' => '', 'systemdefault' => $sysConfiguration[$valueArray['Name']]['DefaultValue']);
|
|
}
|
|
unset($sysConfiguration[$key]);
|
|
}
|
|
unset($sysConfiguration['Options']);
|
|
|
|
// 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);
|
|
}
|
|
}
|
|
?>
|