diff --git a/Sccp_manager.class.php b/Sccp_manager.class.php
index 4c0d8dc..a18eade 100644
--- a/Sccp_manager.class.php
+++ b/Sccp_manager.class.php
@@ -956,7 +956,6 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO {
* Check file paths and permissions
*/
- // !TODO!: -TODO-: This function is getting a little big. Might be possible to sperate tftp work into it's own file/class. Initially, you need to remove the not working section and commented out section
function initializeSccpPath() {
global $db;
global $amp_conf;
@@ -978,7 +977,7 @@ class Sccp_manager extends \FreePBX_Helpers implements \BMO {
$driver = $this->FreePBX->Core->getAllDriversInfo();
$this->sccpvalues['sccp_compatible'] = array('keyword' => 'sccp_compatible', 'data' => $ver_id, 'type' => '1', 'seq' => '99');
- $this->sccppath = $this->extconfigs->validate_init_path($confDir, $this->sccpvalues);
+ //$this->sccppath = $this->extconfigs->validate_init_path($confDir, $this->sccpvalues);
$driver = $this->FreePBX->Core->getAllDriversInfo(); // Check that Sccp Driver has been updated by above
$read_config = $this->cnf_read->getConfig('sccp.conf');
diff --git a/install.php b/install.php
index d485969..305871a 100644
--- a/install.php
+++ b/install.php
@@ -10,6 +10,8 @@ global $version;
global $aminterface;
global $mobile_hw;
global $useAmiForSoftKeys;
+global $settingsFromDb;
+global $cnf_int;
$mobile_hw = '0';
$autoincrement = (($amp_conf["AMPDBENGINE"] == "sqlite") || ($amp_conf["AMPDBENGINE"] == "sqlite3")) ? "AUTOINCREMENT" : "AUTO_INCREMENT";
$table_req = array('sccpdevice', 'sccpline', 'sccpsettings');
@@ -17,8 +19,14 @@ $sccp_compatible = 0;
$chanSCCPWarning = true;
$db_config = '';
$sccp_version = array();
+$cnf_int = \FreePBX::Config();
CheckSCCPManagerDBTables($table_req);
+
+$stmt = $db->prepare("SELECT * FROM sccpsettings");
+$stmt->execute();
+$settingsFromDb = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
CheckAsteriskVersion();
// Have essential tables so can create Sccp_manager object and verify have aminterface
@@ -66,6 +74,7 @@ if ($chanSCCPWarning) {
}
Setup_RealTime();
addDriver($sccp_compatible);
+checkTftpServer();
outn("
");
outn("Install Complete !");
outn("
");
@@ -283,7 +292,6 @@ function Get_DB_config($sccp_compatible)
function CheckSCCPManagerDBTables($table_req)
{
// These tables should already exist having been created by FreePBX through module.xml
- global $amp_conf;
global $db;
outn("
" . _("Checking for required Sccp_manager database tables..") . "");
foreach ($table_req as $value) {
@@ -300,17 +308,13 @@ function CheckSCCPManagerDBVersion()
{
global $db;
outn("" . _("Checking for previous version of Sccp_manager.") . "");
- $check = $db->getRow("SELECT data FROM `sccpsettings` where keyword ='sccp_compatible'", DB_FETCHMODE_ASSOC);
- if (DB::IsError($check)) {
+
+ if (!isset($settingsFromDb['sccp_compatible']['data'])) {
outn(_("No previous version found "));
return false;
}
- if (!empty($check['data'])) {
- outn(_("Found DB Schema : " . $check['data']));
- return $check['data'];
- } else {
- return false;
- }
+ outn(_("Found DB Schema : {$settingsFromDb['sccp_compatible']['data']}"));
+ return $settingsFromDb['sccp_compatible']['data'];
}
/* notused */
@@ -707,8 +711,8 @@ function InstallDB_CreateSccpDeviceConfigView($sccp_compatible)
function createBackUpConfig()
{
global $amp_conf;
+ global $cnf_int;
outn("" . _("Creating Config BackUp") . "");
- $cnf_int = \FreePBX::Config();
$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');
@@ -745,9 +749,8 @@ function createBackUpConfig()
function RenameConfig()
{
- global $amp_conf;
outn("" . _("Move Old Config") . "");
- $cnf_int = \FreePBX::Config();
+ global $cnf_int;
$rename_files = array('sccp_hardware','sccp_extensions');
$rename_ext = array('_custom.conf', '_additional.conf','.conf');
$dir = $cnf_int->get('ASTETCDIR');
@@ -764,7 +767,7 @@ function Setup_RealTime()
{
outn("" . _("Checking realtime configuration ...") . "");
global $amp_conf;
- $cnf_int = \FreePBX::Config();
+ global $cnf_int;
$cnf_wr = \FreePBX::WriteConfig();
$cnf_read = \FreePBX::LoadConfig();
@@ -858,7 +861,7 @@ function addDriver($sccp_compatible) {
$contents = "";
file_put_contents($file, $contents);
- $cnf_int = \FreePBX::Config();
+ global $cnf_int;
$dir = $cnf_int->get('ASTETCDIR');
if (!file_exists("{$dir}/sccp.conf")) { // System re Config
outn("" . _("Adding default configuration file ...") . "");
@@ -866,5 +869,158 @@ function addDriver($sccp_compatible) {
file_put_contents("{$dir}/sccp.conf", $sccpfile);
}
}
+function checkTftpServer() {
+ global $db;
+ global $cnf_int;
+ $confDir = $cnf_int->get('ASTETCDIR');
+ // TODO: add option to use external server
+ $remoteFile = "TestFileXXX111.txt"; // should not exist
+ tftp_put_test_file();
+
+ $possibleFtpDirs = array('/srv', '/srv/tftp','/var/lib/tftp', '/tftpboot');
+ foreach ($possibleFtpDirs as $dirToTest) {
+ if (file_exists("{$dirToTest}/{$remoteFile}")) {
+ $tftpRootPath = $dirToTest;
+ unlink("{$dirToTest}/{$remoteFile}");
+ outn("" . _("Found ftp root dir at {$dirToTest}") . "");
+
+ $sql = "REPLACE INTO sccpsettings (keyword, data, seq, type) VALUES ('tftp_path', '{$tftpRootPath}','0','0');";
+ $results = $db->query($sql);
+ if (DB::IsError($results)) {
+ die_freepbx(sprintf(_("Error updating tftp_path in sccpsettings. Command was: %s; error was: %s "), $sql, $results->getMessage()));
+ }
+ break;
+ }
+ }
+
+ if (empty($tftpRootPath)) {
+ die_freepbx(_("Either tftp server is down or TFTP root is non standard. Please fix, refresh, and try again"));
+ }
+ if (!is_writeable($tftpRootPath)) {
+ die_freepbx(_("{$tftpRootPath} is not writable by user asterisk. Please fix, refresh and try again"));
+ }
+
+ $adv_config = array('tftproot' => '',
+ 'firmware' => 'firmware',
+ 'settings' => 'settings',
+ 'locales' => 'locales',
+ 'languages' => 'languages',
+ 'templates' => 'templates',
+ 'dialplan' => 'dialplan',
+ 'softkey' => 'softkey'
+ );
+
+ $adv_tree['pro'] = array('templates' => 'tftproot',
+ 'settings' => 'tftproot',
+ 'locales' => 'tftproot',
+ 'firmware' => 'tftproot',
+ 'languages' => 'locales',
+ 'dialplan' => 'tftproot',
+ 'softkey' => 'tftproot'
+ );
+
+ $adv_tree['def'] = array('templates' => 'tftproot',
+ 'settings' => '',
+ 'locales' => '',
+ 'firmware' => '',
+ 'languages' => 'tftproot',
+ 'dialplan' => '',
+ 'softkey' => ''
+ );
+
+ $base_tree = array('tftp_templates' => 'templates',
+ 'tftp_path_store' => 'settings',
+ 'tftp_lang_path' => 'languages',
+ 'tftp_firmware_path' => 'firmware',
+ 'tftp_dialplan' => 'dialplan',
+ 'tftp_softkey' => 'softkey'
+ );
+
+ $base_config = array('asterisk' => $confDir,
+ 'sccp_conf' => "$confDir/sccp.conf",
+ 'tftp_path' => $tftpRootPath);
+
+ if (!empty($db_vars['tftp_rewrite_path'])) {
+ $adv_ini = $db_vars['tftp_rewrite_path']["data"];
+ }
+
+ $adv_tree_mode = 'def';
+ if (empty($db_vars["tftp_rewrite"])) {
+ $db_vars["tftp_rewrite"]["data"] = "off";
+ }
+
+ $adv_config['tftproot'] = $base_config["tftp_path"];
+ if ($settingsFromDb["tftp_rewrite"]["data"] == 'pro') {
+ $adv_tree_mode = 'pro';
+ if (!empty($adv_ini)) { // something found in external conflicts
+ $adv_ini .= '/index.cnf';
+ if (file_exists($adv_ini)) {
+ $adv_ini_array = parse_ini_file($adv_ini);
+ $adv_config = array_merge($adv_config, $adv_ini_array);
+ }
+ }
+ }
+ if ($settingsFromDb["tftp_rewrite"]["data"] == 'on') {
+ $adv_tree_mode = 'def';
+ }
+ foreach ($adv_tree[$adv_tree_mode] as $key => $value) {
+ if (!empty($adv_config[$key])) {
+ if (!empty($value)) {
+ if (substr($adv_config[$key], 0, 1) != "/") {
+ $adv_config[$key] = $adv_config[$value] . '/' . $adv_config[$key];
+ }
+ } else {
+ $adv_config[$key] = $adv_config['tftproot'];
+ }
+ }
+ }
+ foreach ($base_tree as $key => $value) {
+ $base_config[$key] = $adv_config[$value];
+ if (!file_exists($base_config[$key])) {
+ if (!mkdir($base_config[$key], 0777, true)) {
+ die('Error creating dir : ' . $base_config[$key]);
+ }
+ }
+ }
+
+ if (!file_exists($base_config["tftp_templates"] . '/XMLDefault.cnf.xml_template')) {
+ $src_path = $_SERVER['DOCUMENT_ROOT'] . '/admin/modules/sccp_manager/conf/';
+ $dst_path = $base_config["tftp_templates"] . '/';
+ foreach (glob($src_path . '*.*_template') as $filename) {
+ copy($filename, $dst_path . basename($filename));
+ }
+ }
+ return $base_config;
+}
+
+function tftp_put_test_file()
+{
+ // https://datatracker.ietf.org/doc/html/rfc1350
+ $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+ $host = "127.0.0.1"; // TODO: Should consider remote TFT Servers in future
+
+ // create the WRQ request packet
+ $packet = chr(0) . chr(2) . "TestFileXXX111.txt" . chr(0) . 'netascii' . chr(0);
+ // UDP is connectionless, so we just send it.
+ socket_sendto($socket, $packet, strlen($packet), MSG_EOR, $host, 69);
+
+ $buffer = '';
+ $port = '';
+ $ret = '';
+
+ // Should now receive an ack packet
+ socket_recvfrom($socket, $buffer, 4, MSG_PEEK, $host, $port);
+
+ // Then should send our data packet
+ $packet = chr(0) . chr(3) . chr(0) . chr(1) . 'This is a test file';
+ socket_sendto($socket, $packet, strlen($packet), MSG_EOR, $host, $port);
+
+ // finally will recieve an ack packet
+ socket_recvfrom($socket, $buffer, 4, MSG_PEEK, $host, $port);
+
+ socket_close($socket);
+
+ return;
+}
?>
diff --git a/module.xml b/module.xml
index 57723fe..cd5c29f 100644
--- a/module.xml
+++ b/module.xml
@@ -1,7 +1,7 @@
sccp_manager
SCCP Manager
- 14.3.0.1
+ 14.3.0.0
setup
SCCP Connectivity
Steve Lad, Alex GP
diff --git a/sccpManClasses/extconfigs.class.php b/sccpManClasses/extconfigs.class.php
index 75cdd6d..e73df46 100644
--- a/sccpManClasses/extconfigs.class.php
+++ b/sccpManClasses/extconfigs.class.php
@@ -113,8 +113,7 @@ class extconfigs
"hotline_extension" => '*60', # !TODO!: Is this a good default extension to dial for hotline ?
"hotline_label" => 'hotline',
"devicetable" => 'sccpdevice',
- "linetable" => 'sccpline',
- "tftp_path" => '/tftpboot'
+ "linetable" => 'sccpline'
);
private $keysetdefault = array('onhook' => 'redial,newcall,cfwdall,cfwdbusy,cfwdnoanswer,pickup,gpickup,dnd,private',
'connected' => 'hold,endcall,park,vidmode,select,cfwdall,cfwdbusy,idivert,monitor',
@@ -221,137 +220,7 @@ class extconfigs
'New Zealand' => array('offset' => '720', 'daylight' => true)
);
- public function validate_init_path($confDir = '', $db_vars) {
- $adv_config = array('tftproot' => '',
- 'firmware' => 'firmware',
- 'settings' => 'settings',
- 'locales' => 'locales',
- 'languages' => 'languages',
- 'templates' => 'templates',
- 'dialplan' => 'dialplan',
- 'softkey' => 'softkey'
- );
-
- $adv_tree['pro'] = array('templates' => 'tftproot',
- 'settings' => 'tftproot',
- 'locales' => 'tftproot',
- 'firmware' => 'tftproot',
- 'languages' => 'locales',
- 'dialplan' => 'tftproot',
- 'softkey' => 'tftproot'
- );
-
- $adv_tree['def'] = array('templates' => 'tftproot',
- 'settings' => '',
- 'locales' => '',
- 'firmware' => '',
- 'languages' => 'tftproot',
- 'dialplan' => '',
- 'softkey' => ''
- );
-
- $base_tree = array('tftp_templates' => 'templates',
- 'tftp_path_store' => 'settings',
- 'tftp_lang_path' => 'languages',
- 'tftp_firmware_path' => 'firmware',
- 'tftp_dialplan' => 'dialplan',
- 'tftp_softkey' => 'softkey'
- );
-
- if (empty($confDir)) {
- return array('error' => 'empty СonfDir');
- }
-
- $base_config = array('asterisk' => $confDir,
- 'sccp_conf' => "$confDir/sccp.conf",
- 'tftp_path' => '');
-
-// Test Base dir (/tftproot)
- if (!empty($db_vars["tftp_path"])) {
- if (file_exists($db_vars["tftp_path"]["data"])) {
- $base_config["tftp_path"] = $db_vars["tftp_path"]["data"];
- }
- }
- if (empty($base_config["tftp_path"])) {
- if (file_exists($this->getExtConfig('sccpDefaults', "tftp_path"))) {
- $base_config["tftp_path"] = $this->getExtConfig('sccpDefaults', "tftp_path");
- }
- }
- if (empty($base_config["tftp_path"])) {
- if (!empty($this->paren_class)) {
- $this->paren_class->class_error['tftp_path'] = 'Tftp path not exist or not defined';
- }
- return array('error' => 'empty tftp_path');
- }
- if (!is_writeable($base_config["tftp_path"])) {
- if (!empty($this->paren_class)) {
- $this->paren_class->class_error['tftp_path'] = 'No write permission on tftp DIR';
- }
- return array('error' => 'No write permission on tftp DIR');
- }
-// END Test Base dir (/tftproot)
-
- if (!empty($db_vars['tftp_rewrite_path'])) {
- $adv_ini = $db_vars['tftp_rewrite_path']["data"];
- }
-
- $adv_tree_mode = 'def';
- if (empty($db_vars["tftp_rewrite"])) {
- $db_vars["tftp_rewrite"]["data"] = "off";
- }
-
- $adv_config['tftproot'] = $base_config["tftp_path"];
- if ($db_vars["tftp_rewrite"]["data"] == 'pro') {
- $adv_tree_mode = 'pro';
- if (!empty($adv_ini)) { // something found in external conflicts
- $adv_ini .= '/index.cnf';
- if (file_exists($adv_ini)) {
- $adv_ini_array = parse_ini_file($adv_ini);
- $adv_config = array_merge($adv_config, $adv_ini_array);
- }
- }
- }
- if ($db_vars["tftp_rewrite"]["data"] == 'on') {
- $adv_tree_mode = 'def';
- }
- foreach ($adv_tree[$adv_tree_mode] as $key => $value) {
- if (!empty($adv_config[$key])) {
- if (!empty($value)) {
- if (substr($adv_config[$key], 0, 1) != "/") {
- $adv_config[$key] = $adv_config[$value] . '/' . $adv_config[$key];
- }
- } else {
- $adv_config[$key] = $adv_config['tftproot'];
- }
- }
- }
- foreach ($base_tree as $key => $value) {
- $base_config[$key] = $adv_config[$value];
- if (!file_exists($base_config[$key])) {
- if (!mkdir($base_config[$key], 0777, true)) {
- die('Error creating dir : ' . $base_config[$key]);
- }
- }
- }
-
- // TFTP -REWrite double model
- if (empty($_SERVER['DOCUMENT_ROOT'])) {
- if (!empty($this->paren_class)) {
- $this->paren_class->class_error['DOCUMENT_ROOT'] = 'Empty DOCUMENT_ROOT';
- }
- $base_config['error'] = 'Empty DOCUMENT_ROOT';
- return $base_config;
- }
-
- if (!file_exists($base_config["tftp_templates"] . '/XMLDefault.cnf.xml_template')) {
- $src_path = $_SERVER['DOCUMENT_ROOT'] . '/admin/modules/sccp_manager/conf/';
- $dst_path = $base_config["tftp_templates"] . '/';
- foreach (glob($src_path . '*.*_template') as $filename) {
- copy($filename, $dst_path . basename($filename));
- }
- }
- return $base_config;
- }
+
public function validate_RealTime( $connector )
{