From 5625503e2ddf92a4e700fabd7d0cbb906ebef782 Mon Sep 17 00:00:00 2001 From: Michael Kaufmann Date: Sat, 27 Apr 2024 10:22:42 +0200 Subject: [PATCH] add compatibility for mariadb-dump executable instead of mysqldump Signed-off-by: Michael Kaufmann --- lib/Froxlor/Cron/System/ExportCron.php | 60 ++++++++++++++++---------- lib/Froxlor/Install/Install/Core.php | 10 +++-- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/lib/Froxlor/Cron/System/ExportCron.php b/lib/Froxlor/Cron/System/ExportCron.php index 8def5b7d3..b7cfd10be 100644 --- a/lib/Froxlor/Cron/System/ExportCron.php +++ b/lib/Froxlor/Cron/System/ExportCron.php @@ -115,30 +115,46 @@ private static function createCustomerExport($data = null, $customerdocroot = nu $has_dbs = false; $current_dbserver = -1; - while ($row = $sel_stmt->fetch()) { - // Get sql_root data for the specific database-server the database resides on - if ($current_dbserver != $row['dbserver']) { - Database::needRoot(true, $row['dbserver']); - Database::needSqlData(); - $sql_root = Database::getSqlData(); - Database::needRoot(false); - // create temporary mysql-defaults file for the connection-credentials/details - $mysqlcnf_file = tempnam("/tmp", "frx"); - $mysqlcnf = "[mysqldump]\npassword=" . $sql_root['passwd'] . "\nhost=" . $sql_root['host'] . "\n"; - if (!empty($sql_root['port'])) { - $mysqlcnf .= "port=" . $sql_root['port'] . "\n"; - } elseif (!empty($sql_root['socket'])) { - $mysqlcnf .= "socket=" . $sql_root['socket'] . "\n"; + + // look for mysqldump + $section = 'mysqldump'; + if (file_exists("/usr/bin/mysqldump")) { + $mysql_dump = '/usr/bin/mysqldump'; + } elseif (file_exists("/usr/local/bin/mysqldump")) { + $mysql_dump = '/usr/local/bin/mysqldump'; + } elseif (file_exists("/usr/bin/mariadb-dump")) { + $mysql_dump = '/usr/bin/mariadb-dump'; + $section = 'mariadb-dump'; + } + if (!isset($mysql_dump)) { + $cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_ERR, 'mysqldump/mariadb-dump executable could not be found. Please install mysql-client/mariadb-client package.'); + } else { + + while ($row = $sel_stmt->fetch()) { + // Get sql_root data for the specific database-server the database resides on + if ($current_dbserver != $row['dbserver']) { + Database::needRoot(true, $row['dbserver']); + Database::needSqlData(); + $sql_root = Database::getSqlData(); + Database::needRoot(false); + // create temporary mysql-defaults file for the connection-credentials/details + $mysqlcnf_file = tempnam("/tmp", "frx"); + $mysqlcnf = "[".$section."]\npassword=" . $sql_root['passwd'] . "\nhost=" . $sql_root['host'] . "\n"; + if (!empty($sql_root['port'])) { + $mysqlcnf .= "port=" . $sql_root['port'] . "\n"; + } elseif (!empty($sql_root['socket'])) { + $mysqlcnf .= "socket=" . $sql_root['socket'] . "\n"; + } + file_put_contents($mysqlcnf_file, $mysqlcnf); } - file_put_contents($mysqlcnf_file, $mysqlcnf); + $cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, 'shell> '.basename($mysql_dump) . ' -u ' . escapeshellarg($sql_root['user']) . ' -pXXXXX ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql')); + $bool_false = false; + FileDir::safe_exec($mysql_dump . ' --defaults-file=' . escapeshellarg($mysqlcnf_file) . ' -u ' . escapeshellarg($sql_root['user']) . ' ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql'), $bool_false, [ + '>' + ]); + $has_dbs = true; + $current_dbserver = $row['dbserver']; } - $cronlog->logAction(FroxlorLogger::CRON_ACTION, LOG_DEBUG, 'shell> mysqldump -u ' . escapeshellarg($sql_root['user']) . ' -pXXXXX ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql')); - $bool_false = false; - FileDir::safe_exec('mysqldump --defaults-file=' . escapeshellarg($mysqlcnf_file) . ' -u ' . escapeshellarg($sql_root['user']) . ' ' . $row['databasename'] . ' > ' . FileDir::makeCorrectFile($tmpdir . '/mysql/' . $row['databasename'] . '_' . date('YmdHi', time()) . '.sql'), $bool_false, [ - '>' - ]); - $has_dbs = true; - $current_dbserver = $row['dbserver']; } if ($has_dbs) { diff --git a/lib/Froxlor/Install/Install/Core.php b/lib/Froxlor/Install/Install/Core.php index f30e68910..22d45e2bf 100644 --- a/lib/Froxlor/Install/Install/Core.php +++ b/lib/Froxlor/Install/Install/Core.php @@ -176,15 +176,19 @@ private function backupExistingDatabase(object &$db_root) $filename = "/tmp/froxlor_backup_" . date('YmdHi') . ".sql"; // look for mysqldump + $section = 'mysqldump'; if (file_exists("/usr/bin/mysqldump")) { $mysql_dump = '/usr/bin/mysqldump'; } elseif (file_exists("/usr/local/bin/mysqldump")) { $mysql_dump = '/usr/local/bin/mysqldump'; + } elseif (file_exists("/usr/bin/mariadb-dump")) { + $mysql_dump = '/usr/bin/mariadb-dump'; + $section = 'mariadb-dump'; } // create temporary .cnf file $cnffilename = "/tmp/froxlor_dump.cnf"; - $dumpcnf = "[mysqldump]" . PHP_EOL . "password=\"" . $this->validatedData['mysql_root_pass'] . "\"" . PHP_EOL; + $dumpcnf = "[".$section."]" . PHP_EOL . "password=\"" . $this->validatedData['mysql_root_pass'] . "\"" . PHP_EOL; file_put_contents($cnffilename, $dumpcnf); // make the backup @@ -195,7 +199,7 @@ private function backupExistingDatabase(object &$db_root) @unlink($cnffilename); if (stristr(implode(" ", $output), "error")) { throw new Exception(lng('install.errors.mysqldump_backup_failed')); - } else if (!file_exists($filename)) { + } elseif (!file_exists($filename)) { throw new Exception(lng('install.errors.sql_backup_file_missing')); } } else { @@ -379,7 +383,7 @@ private function doSettings(object &$db_user) $this->updateSetting($upd_stmt, 1, 'system', 'leenabled'); $this->updateSetting($upd_stmt, 1, 'system', 'le_froxlor_enabled'); } - $this->updateSetting($upd_stmt, $this->validatedData['servername'], 'system', 'hostname'); + $this->updateSetting($upd_stmt, strtolower($this->validatedData['servername']), 'system', 'hostname'); $this->updateSetting($upd_stmt, 'en', 'panel', 'standardlanguage'); // TODO: set language $this->updateSetting($upd_stmt, $this->validatedData['mysql_access_host'], 'system', 'mysql_access_host'); $this->updateSetting($upd_stmt, $this->validatedData['webserver'], 'system', 'webserver');