Leitgedanken/msd/inc/functions_dump.php
2023-02-11 15:24:36 +01:00

569 lines
26 KiB
PHP

<?php
/* ----------------------------------------------------------------------
MyOOS [Dumper]
http://www.oos-shop.de/
Copyright (c) 2013 - 2022 by the MyOOS Development Team.
----------------------------------------------------------------------
Based on:
MySqlDumper
http://www.mysqldumper.de
Copyright (C)2004-2011 Daniel Schlichtholz (admin@mysqldumper.de)
----------------------------------------------------------------------
Released under the GNU General Public License
---------------------------------------------------------------------- */
/* ensure this file is being included by a parent file */
defined('OOS_VALID_MOD') or exit('Direct Access to this location is not allowed.');
include './inc/functions_global.php';
//Buffer fuer Multipart-Filesizepruefung
$buffer = 10 * 1024;
function new_file($last_groesse = 0)
{
global $dump, $databases, $config, $out, $lang, $nl, $mysql_commentstring;
// Dateiname aus Datum und Uhrzeit bilden
if ($dump['part'] - $dump['part_offset'] == 1) {
$dump['filename_stamp'] = date('Y_m_d_H_i', time());
}
if (isset($config['multi_part']) && (1 == $config['multi_part'])) {
$dateiname = $databases['Name'][$dump['dbindex']].'_'.$dump['filename_stamp'].'_part_'.($dump['part'] - $dump['part_offset']);
} else {
$dateiname = $databases['Name'][$dump['dbindex']].'_'.date('Y_m_d_H_i', time());
}
$endung = (isset($config['compression']) && ($config['compression'])) ? '.sql.gz' : '.sql';
$dump['backupdatei'] = $dateiname.$endung;
if (file_exists($config['paths']['backup'].$dump['backupdatei'])) {
unlink($config['paths']['backup'].$dump['backupdatei']);
}
$cur_time = date('Y-m-d H:i');
$statuszeile = GetStatusLine().$nl.$mysql_commentstring.' Dump by MyOOS [Dumper] '.MOD_VERSION.' ('.$config['homepage'].')'.$nl;
$statuszeile .= '/*!40101 SET NAMES \''.$dump['dump_encoding'].'\' */;'.$nl;
$statuszeile .= 'SET FOREIGN_KEY_CHECKS=0;'.$nl;
if ($dump['part'] - $dump['part_offset'] == 1) {
if (isset($config['multi_part']) && (0 == $config['multi_part'])) {
if (isset($config['multi_part']) && 1 == $config['multi_dump'] && 0 == $dump['dbindex']) {
WriteLog('starting Multidump with '.count($databases['multi']).' Datenbases.');
}
WriteLog('Start Dump \''.$dump['backupdatei'].'\'');
} else {
WriteLog('Start Multipart-Dump \''.$dateiname.'\'');
}
$out .= '<strong>'.$lang['L_STARTDUMP'].' `'.$databases['Name'][$dump['dbindex']].'`</strong>'.(('' != $databases['praefix'][$dump['dbindex']]) ? ' ('.$lang['L_WITHPRAEFIX'].' <span style="color:blue">'.$databases['praefix'][$dump['dbindex']].'</span>)' : '').'... ';
if (1 == $dump['part']) {
$dump['table_offset'] = 0;
$dump['countdata'] = 0;
}
// Seitenerstaufruf -> Backupdatei anlegen
$dump['data'] = $statuszeile.$mysql_commentstring.' Dump created: '.$cur_time;
} else {
if (0 != $config['multi_part']) {
WriteLog('Continue Multipart-Dump with File '.($dump['part'] - $dump['part_offset']).' (last file was '.$last_groesse.' Bytes)');
$dump['data'] = $statuszeile.$mysql_commentstring.' This is part '.($dump['part'] - $dump['part_offset']).' of the backup.'.$nl.$nl.$dump['data'];
}
}
WriteToDumpFile();
++$dump['part'];
}
function GetStatusLine($kind = 'php')
{
/*AUFBAU der Statuszeile:
-- Status:tabellenzahl:datensätze:Multipart:Datenbankname:script:scriptversion:Kommentar:MySQLVersion:Backupflags:SQLBefore:SQLAfter:Charset:CharsetEXTINFO
Aufbau Backupflags (1 Zeichen pro Flag, 0 oder 1, 2=unbekannt)
(complete inserts)(extended inserts)(ignore inserts)(delayed inserts)(downgrade)(lock tables)(optimize tables)
*/
global $databases, $config, $lang, $dump, $mysql_commentstring;
$t_array = explode('|', $databases['db_actual_tableselected']);
$t = 0;
$r = 0;
$t_zeile = "$mysql_commentstring\n$mysql_commentstring TABLE-INFO\r\n";
mod_mysqli_connect();
$res = mysqli_query($config['dbconnection'], 'SHOW TABLE STATUS FROM `'.$databases['Name'][$dump['dbindex']].'`');
$numrows = intval(@mysqli_num_rows($res));
for ($i = 0; $i < $numrows; ++$i) {
$erg = mysqli_fetch_array($res);
// Get nr of records -> need to do it this way because of incorrect returns when using InnoDBs
$sql_2 = 'SELECT count(*) as `count_records` FROM `'.$databases['Name'][$dump['dbindex']].'`.`'.$erg['Name'].'`';
$res2 = mysqli_query($config['dbconnection'], $sql_2);
if (false === $res2) {
// error reading table definition
$read_create_error = sprintf($lang['L_FATAL_ERROR_DUMP'], $databases['Name'][$dump['dbindex']], $erg['Name']).': '.mysqli_error($config['dbconnection']);
Errorlog('DUMP', $databases['Name'][$dump['dbindex']], '', $read_create_error, 0);
WriteLog($read_create_error);
if ($config['stop_with_error'] > 0) {
exit($read_create_error);
}
++$dump['errors'];
//$i++; // skip corrupted table
} else {
$row2 = mysqli_fetch_array($res2);
$erg['Rows'] = $row2['count_records'];
if (('' == $databases['db_actual_tableselected'] || ('' != $databases['db_actual_tableselected'] && (in_array($erg[0], $t_array)))) && (substr($erg[0], 0, strlen($databases['praefix'][$dump['dbindex']])) == $databases['praefix'][$dump['dbindex']])) {
++$t;
$r += $erg['Rows'];
if (isset($erg['Type'])) {
$erg['Engine'] = $erg['Type'];
}
$t_zeile .= "$mysql_commentstring TABLE|".$erg['Name'].'|'.$erg['Rows'].'|'.($erg['Data_length'] + $erg['Index_length']).'|'.$erg['Update_time'].'|'.$erg['Engine']."\n";
}
}
}
//$dump['totalrecords'] = $r;
$flags = 1;
$mp = (isset($config['multi_part']) && (1 == $config['multi_part'])) ? $mp = 'MP_'.($dump['part'] - $dump['part_offset']) : 'MP_0';
$statusline = "$mysql_commentstring Status:$t:$r:$mp:".$databases['Name'][$dump['dbindex']].":$kind:".MOD_VERSION.':'.$dump['kommentar'].':';
$statusline .= MOD_MYSQL_VERSION.":$flags:::".$dump['dump_encoding'].":EXTINFO\n".$t_zeile."$mysql_commentstring"." EOF TABLE-INFO\n$mysql_commentstring";
return $statusline;
}
// Liest die Eigenschaften der Tabelle aus der DB und baut die CREATE-Anweisung zusammen
function get_def($db, $table, $withdata = 1)
{
global $config, $nl, $mysql_commentstring, $dump;
$def = "\n\n$mysql_commentstring\n$mysql_commentstring Create Table `$table`\n$mysql_commentstring\n\n";
if ('VIEW' == $dump['table_types'][getDBIndex($db, $table)]) {
$def .= "DROP VIEW IF EXISTS `$table`;\n";
$withdata = 0;
} else {
$def .= "DROP TABLE IF EXISTS `$table`;\n";
}
mysqli_select_db($config['dbconnection'], $db);
$result = mysqli_query($config['dbconnection'], 'SHOW CREATE TABLE `'.$table.'`');
$row = mysqli_fetch_row($result);
if (false === $row) {
return false;
}
$def .= $row[1].';'."\n\n";
if (1 == $withdata) {
$def .= "$mysql_commentstring\n$mysql_commentstring Data for Table `$table`\n$mysql_commentstring\n\n";
$def .= "/*!40000 ALTER TABLE `$table` DISABLE KEYS */;".$nl;
}
return $def;
}
// Liest die Daten aus der DB aus und baut die INSERT-Anweisung zusammen
function get_content($db, $table)
{
global $config, $nl, $dump, $buffer;
$content = '';
$complete = Fieldlist($db, $table).' ';
if (!isset($config['dbconnection'])) {
mod_mysqli_connect();
}
$table_ready = 0;
$query = 'SELECT * FROM `'.$table.'` LIMIT '.$dump['zeilen_offset'].','.($dump['restzeilen'] + 1);
mysqli_select_db($config['dbconnection'], $db);
$result = mysqli_query($config['dbconnection'], $query);
$ergebnisse = mysqli_num_rows($result);
if (false !== $ergebnisse) {
// $num_felder=mysqli_field_count($result);
$num_felder = mysqli_field_count($config['dbconnection']);
$first = 1;
if ($ergebnisse > $dump['restzeilen']) {
$dump['zeilen_offset'] += $dump['restzeilen'];
--$ergebnisse;
$dump['restzeilen'] = 0;
} else {
++$dump['table_offset'];
$dump['zeilen_offset'] = 0;
$dump['restzeilen'] = $dump['restzeilen'] - $ergebnisse;
$table_ready = 1;
}
$ax = 0;
for ($x = 0; $x < $ergebnisse; ++$x) {
$row = mysqli_fetch_row($result);
++$ax;
$insert = 'INSERT INTO `'.$table.'` '.$complete.'VALUES (';
for ($j = 0; $j < $num_felder; ++$j) {
if (!isset($row[$j])) {
$insert .= 'NULL,';
} else {
$fieldinfo = mysqli_fetch_field_direct($result, $j);
if (($fieldinfo->flags & 128) == true && isset($config['use_binary_container']) && 1 == $config['use_binary_container']) {
if ('' != $row[$j]) {
$insert .= '_binary 0x'.bin2hex($row[$j]).',';
} else {
$insert .= '_binary \'\',';
}
} elseif ('' != $row[$j]) {
$insert .= '\''.mysqli_real_escape_string($config['dbconnection'], $row[$j]).'\',';
} else {
$insert .= '\'\',';
}
}
}
$insert = substr($insert, 0, -1).');'.$nl;
$dump['data'] .= $insert;
++$dump['countdata'];
$config['memory_limit'] = isset($config['memory_limit']) ? $config['memory_limit'] : 0;
if (strlen($dump['data']) > $config['memory_limit'] || (1 == $config['multi_part'] && strlen($dump['data']) + $buffer > $config['multipart_groesse'])) {
WriteToDumpFile();
}
}
if (1 == $table_ready && 'VIEW' != $dump['table_types'][getDBIndex($db, $table)]) {
$dump['data'] .= "/*!40000 ALTER TABLE `$table` ENABLE KEYS */;\n";
}
} else {
// table corrupt -> skip it
++$dump['table_offset'];
$dump['zeilen_offset'] = 0;
$dump['restzeilen'] = $dump['restzeilen'] - $ergebnisse;
$dump['data'] .= "/*!40000 ALTER TABLE `$table` ENABLE KEYS */;\n";
if (strlen($dump['data']) > $config['memory_limit'] || (1 == $config['multi_part'] && strlen($dump['data']) + $buffer > $config['multipart_groesse'])) {
WriteToDumpFile();
}
}
@mysqli_free_result($result);
}
function WriteToDumpFile()
{
global $config, $dump, $buffer;
$dump['filesize'] = 0;
$df = $config['paths']['backup'].$dump['backupdatei'];
if (isset($config['compression']) && (1 == $config['compression'])) {
if ('' != $dump['data']) {
$fp = gzopen($df, 'ab');
gzwrite($fp, $dump['data']);
gzclose($fp);
}
} else {
if ('' != $dump['data']) {
$fp = fopen($df, 'ab');
fwrite($fp, $dump['data']);
fclose($fp);
}
}
$dump['data'] = '';
if (!isset($dump['fileoperations'])) {
$dump['fileoperations'] = 0;
}
++$dump['fileoperations'];
if (isset($config['multi_part']) && (1 == $config['multi_part'])) {
clearstatcache();
}
$dump['filesize'] = filesize($df);
if ((isset($config['multi_part']) && 1 == $config['multi_part']) && ($dump['filesize'] + $buffer > $config['multipart_groesse'])) {
@chmod($df, 0777);
new_file($dump['filesize']); // Wenn maximale Dateigroesse erreicht -> neues File starten
}
}
function ExecuteCommand($when)
{
global $config, $databases, $dump, $out, $lang;
$lf = '<br>';
if (!isset($dump['dbindex'])) {
return;
}
if ('b' == $when) { // before dump
$cd = $databases['command_before_dump'][$dump['dbindex']];
//WriteLog('DbIndex: '.$dump['dbindex'].' Before: '.$databases['command_before_dump'][$dump['dbindex']]);
} else {
$cd = $databases['command_after_dump'][$dump['dbindex']];
//WriteLog('DbIndex: '.$dump['dbindex'].' After: '.$databases['command_after_dump'][$dump['dbindex']]);
}
if ('' != $cd) {
//jetzt ausführen
if ('system:' != substr(strtolower($cd), 0, 7)) {
$cad = [];
@mysqli_select_db($config['dbconnection'], $databases['Name'][$dump['dbindex']]);
if (strpos($cd, ';')) {
$cad = explode(';', $cd);
} else {
$cad[0] = $cd;
}
for ($i = 0; $i < sizeof($cad); ++$i) {
if (trim($cad[$i]) > '') {
$result = mysqli_query($config['dbconnection'], $cad[$i]);
if (false === $result) {
WriteLog("Error executing Query '$cad[$i]'! MySQL returns: ".trim(mysqli_error($config['dbconnection'])));
ErrorLog("Error executing Query '$cad[$i]'!", $databases['Name'][$dump['dbindex']], $cad[$i], mysqli_error($config['dbconnection']), 0);
++$dump['errors'];
$out .= '<span class="error">Error executing Query '.$cad[$i].'</span>'.$lf;
} else {
WriteLog("Successfully executed Query: '$cad[$i]'");
$out .= '<span class="success">Successfully executed Query: \''.$cad[$i].'\'</span>'.$lf;
}
}
}
} elseif ('system:' == substr(strtolower($cd), 0, 7)) {
$command = substr($cd, 7);
$result = @system($command, $returnval);
if (!$result) {
WriteLog("Error while executing System Command '$command'");
++$dump['errors'];
$out .= $lf.'<span class="error">ERROR executing System Command \''.$command.'\'</span><br>';
} else {
WriteLog("Successfully executed System Command '$command'. [$returnval]");
$out .= $lf.'<span class="success">Successfully executed System Command \''.$command.'.</span><br>';
}
}
}
}
function DoEmail()
{
global $config, $dump, $databases, $email, $lang, $out, $REMOTE_ADDR;
$header = '';
if (1 == $config['cron_use_sendmail']) {
//sendmail
if (ini_get('sendmail_path') != $config['cron_sendmail']) {
@ini_set('SMTP', $config['cron_sendmail']);
}
if (ini_get('sendmail_from') != $config['email_sender']) {
@ini_set('SMTP', $config['email_sender']);
}
} else {
//SMTP
}
if (ini_get('SMTP') != $config['cron_smtp']) {
@ini_set('SMTP', $config['cron_smtp']);
}
if (25 != ini_get('smtp_port')) {
@ini_set('smtp_port', 25);
}
if (0 == $config['multi_part']) {
$file = $dump['backupdatei'];
$file_name = (strpos('/', $file)) ? substr($file, strrpos('/', $file)) : $file;
$file_type = filetype($config['paths']['backup'].$file);
$file_size = filesize($config['paths']['backup'].$file);
if (($config['email_maxsize'] > 0 && $file_size > $config['email_maxsize']) || 0 == $config['send_mail_dump']) {
//anhang zu gross
$subject = "Backup '".$databases['Name'][$dump['dbindex']]."' - ".date("d\.m\.Y H:i", time());
$header .= 'FROM:'.$config['email_sender']."\n";
if (isset($config['email_recipient_cc']) && trim($config['email_recipient_cc']) > '') {
$header .= 'Cc: '.$config['email_recipient_cc']."\r\n";
}
$header .= "MIME-version: 1.0\n";
$header .= 'X-Mailer: PHP/'.phpversion()."\n";
$header .= "X-Sender-IP: $REMOTE_ADDR\n";
$header .= "Content-Type: text/html; charset=utf-8\n";
if (0 != $config['send_mail_dump']) {
$msg_body = sprintf(addslashes($lang['L_EMAILBODY_TOOBIG']), byte_output($config['email_maxsize']), $databases['Name'][$dump['dbindex']], "$file (".byte_output(filesize($config['paths']['backup'].$file)).')<br>');
} else {
$msg_body = sprintf(addslashes($lang['L_EMAILBODY_NOATTACH']), $databases['Name'][$dump['dbindex']], "$file (".byte_output(filesize($config['paths']['backup'].$file)).')');
}
include_once './inc/functions.php';
$msg_body .= '<a href="'.getServerProtocol().$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')).'/'.$config['paths']['backup'].$file.'">'.$file.'</a>';
$email_log = "Email sent to '".$config['email_recipient']."'";
$email_out = $lang['L_EMAIL_WAS_SEND'].'`'.$config['email_recipient'].'`<br>';
} else {
//alles ok, anhang generieren
$msg_body = sprintf(addslashes($lang['L_EMAILBODY_ATTACH']), $databases['Name'][$dump['dbindex']], "$file (".byte_output(filesize($config['paths']['backup'].$file)).')');
$subject = "Backup '".$databases['Name'][$dump['dbindex']]."' - ".date("d\.m\.Y", time());
$fp = fopen($config['paths']['backup'].$file, 'r');
$contents = fread($fp, $file_size);
$encoded_file = chunk_split(base64_encode($contents));
fclose($fp);
$header .= 'FROM:'.$config['email_sender']."\n";
if (isset($config['email_recipient_cc']) && trim($config['email_recipient_cc']) > '') {
$header .= 'Cc: '.$config['email_recipient_cc']."\r\n";
}
$header .= "MIME-version: 1.0\n";
$header .= 'Content-type: multipart/mixed; ';
$header .= "boundary=\"Message-Boundary\"\n";
$header .= "Content-transfer-encoding: 7BIT\n";
$header .= "X-attachments: $file_name";
$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/html; charset=utf-8\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";
$msg_body = $body_top.$msg_body;
$msg_body .= "\n\n--Message-Boundary\n";
$msg_body .= "Content-type: $file_type; name=\"$file\"\n";
$msg_body .= "Content-Transfer-Encoding: BASE64\n";
$msg_body .= "Content-disposition: attachment; filename=\"$file\"\n\n";
$msg_body .= "$encoded_file\n";
$msg_body .= "--Message-Boundary--\n";
$email_log = "Email was sent to '".$config['email_recipient']."' with '".$dump['backupdatei']."'.";
$email_out = $lang['L_EMAIL_WAS_SEND'].'`'.$config['email_recipient'].'`'.$lang['L_WITH'].'`'.$dump['backupdatei'].'`.<br>';
}
} else {
//Multipart
$mp_sub = "Backup '".$databases['Name'][$dump['dbindex']]."' - ".date("d\.m\.Y", time());
$subject = $mp_sub;
$header .= 'FROM:'.$config['email_sender']."\n";
if (isset($config['email_recipient_cc']) && trim($config['email_recipient_cc']) > '') {
$header .= 'Cc: '.$config['email_recipient_cc']."\r\n";
}
$header .= "MIME-version: 1.0\n";
$header .= 'X-Mailer: PHP/'.phpversion()."\n";
$header .= "X-Sender-IP: $REMOTE_ADDR\n";
$header .= 'Content-Type: text/html; charset=utf-8';
$dateistamm = substr($dump['backupdatei'], 0, strrpos($dump['backupdatei'], 'part_')).'part_';
$dateiendung = (1 == $config['compression']) ? '.sql.gz' : '.sql';
$mpdatei = [];
$mpfiles = '';
for ($i = 1; $i < ($dump['part'] - $dump['part_offset']); ++$i) {
$mpdatei[$i - 1] = $dateistamm.$i.$dateiendung;
$sz = byte_output(@filesize($config['paths']['backup'].$mpdatei[$i - 1]));
$mpfiles .= $mpdatei[$i - 1].' ('.$sz.')<br>';
}
$msg_body = (1 == $config['send_mail_dump']) ? sprintf(addslashes($lang['L_EMAILBODY_MP_ATTACH']), $databases['Name'][$dump['dbindex']], $mpfiles) : sprintf(addslashes($lang['L_EMAILBODY_MP_NOATTACH']), $databases['Name'][$dump['dbindex']], $mpfiles);
$email_log = "Email was sent to '".$config['email_recipient']."'";
$email_out = $lang['L_EMAIL_WAS_SEND'].'`'.$config['email_recipient'].'`<br>';
}
if (@mail($config['email_recipient'], stripslashes($subject), $msg_body, $header)) {
$out .= '<span class="success">'.$email_out.'</span>';
WriteLog("$email_log");
} else {
$out .= '<span class="error">'.$lang['L_MAILERROR'].'</span><br>';
WriteLog("Email to '".$config['email_recipient']."' failed !");
ErrorLog('Email ', $databases['Name'][$dump['dbindex']], 'Subject: '.stripslashes($subject), $lang['L_MAILERROR']);
++$dump['errors'];
}
if (isset($mpdatei) && 1 == $config['send_mail_dump']) { // && ($config['email_maxsize'] ==0 || ($config['email_maxsize']>0 && $config['multipartgroesse2']<= $config['email_maxsize']))) {
for ($i = 0; $i < count($mpdatei); ++$i) {
$file_name = $mpdatei[$i];
$file_type = filetype($config['paths']['backup'].$mpdatei[$i]);
$file_size = filesize($config['paths']['backup'].$mpdatei[$i]);
$fp = fopen($config['paths']['backup'].$mpdatei[$i], 'r');
$contents = fread($fp, $file_size);
$encoded_file = chunk_split(base64_encode($contents));
fclose($fp);
$subject = $mp_sub.' [Part '.($i + 1).' / '.count($mpdatei).']';
$header = 'FROM:'.$config['email_sender']."\n";
if (isset($config['email_recipient_cc']) && trim($config['email_recipient_cc']) > '') {
$header .= 'Cc: '.$config['email_recipient_cc']."\r\n";
}
$header .= "MIME-version: 1.0\n";
$header .= 'Content-type: multipart/mixed; ';
$header .= "boundary=\"Message-Boundary\"\n";
$header .= "Content-transfer-encoding: 7BIT\n";
$header .= "X-attachments: $file_name";
$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/html; charset=utf-8\n";
$body_top .= "Content-transfer-encoding: 7BIT\n";
$body_top .= "Content-description: Mail message body\n\n";
$msg_body = $body_top.addslashes($lang['L_EMAIL_ONLY_ATTACHMENT'].$lang['L_EMAILBODY_FOOTER']);
$msg_body .= "\n\n--Message-Boundary\n";
$msg_body .= "Content-type: $file_type; name=\"".$mpdatei[$i]."\"\n";
$msg_body .= "Content-Transfer-Encoding: BASE64\n";
$msg_body .= 'Content-disposition: attachment; filename="'.$mpdatei[$i]."\"\n\n";
$msg_body .= "$encoded_file\n";
$msg_body .= "--Message-Boundary--\n";
$email_log = "Email with $mpdatei[$i] was sent to '".$config['email_recipient']."'";
$email_out = $lang['L_EMAIL_WAS_SEND'].'`'.$config['email_recipient'].'`'.$lang['L_WITH'].'`'.$mpdatei[$i].'`.<br>';
if (@mail($config['email_recipient'], stripslashes($subject), $msg_body, $header)) {
$out .= '<span class="success">'.$email_out.'</span>';
WriteLog("$email_log");
} else {
$out .= '<span class="error">'.$lang['L_MAILERROR'].'</span><br>';
WriteLog("Email to '".$config['email_recipient']."' failed !");
ErrorLog('Email ', $databases['Name'][$dump['dbindex']], 'Subject: '.stripslashes($subject), $lang['L_MAILERROR']);
++$dump['errors'];
}
}
}
}
function DoFTP($i)
{
global $config, $dump, $out;
if (0 == $config['multi_part']) {
SendViaFTP($i, $dump['backupdatei'], 1);
} else {
$dateistamm = substr($dump['backupdatei'], 0, strrpos($dump['backupdatei'], 'part_')).'part_';
$dateiendung = (1 == $config['compression']) ? '.sql.gz' : '.sql';
for ($a = 1; $a < ($dump['part'] - $dump['part_offset']); ++$a) {
$mpdatei = $dateistamm.$a.$dateiendung;
SendViaFTP($i, $mpdatei, $a);
}
}
}
function SendViaFTP($i, $source_file, $conn_msg = 1)
{
global $config, $out, $lang;
flush();
if (1 == $conn_msg) {
$out .= '<span class="success">'.$lang['L_FILESENDFTP'].'('.$config['ftp_server'][$i].' - '.$config['ftp_user'][$i].')</span><br>';
}
// Herstellen der Basis-Verbindung
if (0 == $config['ftp_useSSL'][$i]) {
$conn_id = @ftp_connect($config['ftp_server'][$i], $config['ftp_port'][$i], $config['ftp_timeout'][$i]);
} else {
$conn_id = @ftp_ssl_connect($config['ftp_server'][$i], $config['ftp_port'][$i], $config['ftp_timeout'][$i]);
}
// Einloggen mit Benutzername und Kennwort
$login_result = @ftp_login($conn_id, $config['ftp_user'][$i], $config['ftp_pass'][$i]);
if (1 == $config['ftp_mode'][$i]) {
ftp_pasv($conn_id, true);
}
// Verbindung überprüfen
if ((!$conn_id) || (!$login_result)) {
$out .= '<span class="error">'.$lang['L_FTPCONNERROR'].$config['ftp_server'][$i].$lang['L_FTPCONNERROR1'].$config['ftp_user'][$i].$lang['L_FTPCONNERROR2'].'</span><br>';
} else {
if (1 == $conn_msg) {
$out .= '<span class="success">'.$lang['L_FTPCONNECTED1'].$config['ftp_server'][$i].$lang['L_FTPCONNERROR1'].$config['ftp_user'][$i].'</span><br>';
}
}
// Upload der Datei
$dest = $config['ftp_dir'][$i].$source_file;
$source = $config['paths']['backup'].$source_file;
$upload = @ftp_put($conn_id, $dest, $source, FTP_BINARY);
// Upload-Status überprüfen
if (!$upload) {
$out .= '<span class="error">'.$lang['L_FTPCONNERROR3']."<br>($source -> $dest)</span><br>";
} else {
$out .= '<span class="success">'.$lang['L_FILE'].' <a href="'.$config['paths']['backup'].$source_file.'" class="smallblack">'.$source_file.'</a>'.$lang['L_FTPCONNECTED2'].$config['ftp_server'][$i].$lang['L_FTPCONNECTED3'].'</span><br>';
WriteLog("'$source_file' sent via FTP.");
}
// Schließen des FTP-Streams
@ftp_quit($conn_id);
}
function DoSFTP($i)
{
global $config, $dump, $out;
if (0 == $config['multi_part']) {
SendViaSFTP($i, $dump['backupdatei'], 1);
} else {
$dateistamm = substr($dump['backupdatei'], 0, strrpos($dump['backupdatei'], 'part_')).'part_';
$dateiendung = (1 == $config['compression']) ? '.sql.gz' : '.sql';
for ($a = 1; $a < ($dump['part'] - $dump['part_offset']); ++$a) {
$mpdatei = $dateistamm.$a.$dateiendung;
SendViaSFTP($i, $mpdatei, $a);
}
}
}