clean up sqldumpcmd, add ssl

Noah Zalev committed May 1, 2021 at 15:08 UTC e21077b06444355fd7b3cc3aa54a250e277a3a26
1 file changed +37 -20
db.js
+37 -20
@@ -1579,6 +1579,37 @@ module.exports.CreateDB = function (parent, func) {
1579 return r;
1580 }
1581
1582 + function buildSqlDumpCommand() {
1583 + var props = (obj.databaseType == 4) ? parent.args.mariadb : parent.args.mysql;
1584 +
1585 + var mysqldumpPath = 'mysqldump';
1586 + if (parent.config.settings.autobackup && parent.config.settings.autobackup.mysqldumppath) {
1587 + mysqldumpPath = parent.config.settings.autobackup.mysqldumppath;
1588 + }
1589 +
1590 + var cmd = '\"' + mysqldumpPath + '\" --user=\'' + props.user + '\'';
1591 + // Windows will treat ' as part of the pw. Linux/Unix requires it to escape.
1592 + cmd += (parent.platform == 'win32') ? ' --password=\"' + props.password + '\"' : ' --password=\'' + props.password + '\'';
1593 + if (props.host) { cmd += ' -h ' + props.host; }
1594 + if (props.port) { cmd += ' -P ' + props.port; }
1595 +
1596 + // SSL options different on mariadb/mysql
1597 + var sslOptions = '';
1598 + if (obj.databaseType == 4) {
1599 + if (props.ssl) sslOptions = ' --ssl';
1600 + if (props.ssl.cacertpath) sslOptions = ' --ssl-verify-server-cert --ssl-ca=' + props.ssl.cacertpath;
1601 + } else {
1602 + if (props.ssl) sslOptions = ' --ssl-mode=required';
1603 + if (props.ssl.cacertpath) sslOptions = ' --ssl-mode=verify_identity --ssl-ca=' + props.ssl.cacertpath;
1604 + }
1605 + cmd += sslOptions;
1606 +
1607 + var dbname = (props.database) ? props.database : 'meshcentral';
1608 + cmd += ' ' + dbname
1609 +
1610 + return cmd;
1611 + }
1612 +
1613 // Check that the server is capable of performing a backup
1614 obj.checkBackupCapability = function (func) {
1615 if ((parent.config.settings.autobackup == null) || (parent.config.settings.autobackup == false)) { func(); }
@@ -1612,16 +1643,9 @@ module.exports.CreateDB = function (parent, func) {
1643 var backupPath = parent.backuppath;
1644 if (parent.config.settings.autobackup && parent.config.settings.autobackup.backuppath) { backupPath = parent.config.settings.autobackup.backuppath; }
1645 try { parent.fs.mkdirSync(backupPath); } catch (e) { }
1615 - var props = (obj.databaseType == 4) ? parent.args.mariadb : parent.args.mysql;
1616 - var mysqldumpPath = 'mysqldump';
1617 - if (parent.config.settings.autobackup && parent.config.settings.autobackup.mysqldumppath) { mysqldumpPath = parent.config.settings.autobackup.mysqldumppath; }
1618 - var cmd = '\"' + mysqldumpPath + '\" --user=\'' + props.user + '\'';
1619 - // Windows will treat ' as part of the pw. Linux/Unix requires it to escape.
1620 - cmd += (parent.platform == 'win32') ? ' --password=\"' + props.password + '\"' : ' --password=\'' + props.password + '\'';
1621 - if (props.host) { cmd += ' -h ' + props.host; }
1622 - if (props.port) { cmd += ' -P ' + props.port; }
1623 - var dbname = (props.database) ? props.database : 'meshcentral';
1624 - cmd += ' ' + dbname + ' > ' + ((parent.platform == 'win32') ? '\"nul\"' : '\"/dev/null\"');
1646 +
1647 + var cmd = buildSqlDumpCommand();
1648 + cmd += ' > ' + ((parent.platform == 'win32') ? '\"nul\"' : '\"/dev/null\"');
1649 const child_process = require('child_process');
1650 child_process.exec(cmd, { cwd: backupPath }, function(error, stdout, stdin) {
1651 try {
@@ -1813,16 +1837,9 @@ module.exports.CreateDB = function (parent, func) {
1837 // Perform a MySqlDump backup
1838 const newBackupFile = 'mysqldump-' + fileSuffix;
1839 var newBackupPath = parent.path.join(backupPath, newBackupFile);
1816 - var props = (obj.databaseType == 4) ? parent.args.mariadb : parent.args.mysql;
1817 - var mysqldumpPath = 'mysqldump';
1818 - if (parent.config.settings.autobackup && parent.config.settings.autobackup.mysqldumppath) { mysqldumpPath = parent.config.settings.autobackup.mysqldumppath; }
1819 - var cmd = '\"' + mysqldumpPath + '\" --user=\'' + props.user + '\'';
1820 - // Windows will treat ' as part of the pw. Linux/Unix requires it to escape.
1821 - cmd += (parent.platform == 'win32') ? ' --password=\"' + props.password + '\"' : ' --password=\'' + props.password + '\'';
1822 - if (props.host) { cmd += ' -h ' + props.host; }
1823 - if (props.port) { cmd += ' -P ' + props.port; }
1824 - var sqldbname = (props.database) ? props.database : 'meshcentral';
1825 - cmd += ' ' + sqldbname + ' --result-file=\"' + newBackupPath + '.sql\"';
1840 +
1841 + var cmd = buildSqlDumpCommand();
1842 + cmd += ' --result-file=\"' + newBackupPath + '.sql\"';
1843 const child_process = require('child_process');
1844 var backupProcess = child_process.exec(cmd, { cwd: backupPath }, function (error, stdout, stderr) {
1845 try {