'.$lang['L_STARTDUMP'].' `'.$databases['Name'][$dump['dbindex']].'`'.(('' != $databases['praefix'][$dump['dbindex']]) ? ' ('.$lang['L_WITHPRAEFIX'].' '.$databases['praefix'][$dump['dbindex']].')' : '').'... '; 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 = '
'; 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 .= 'Error executing Query '.$cad[$i].''.$lf; } else { WriteLog("Successfully executed Query: '$cad[$i]'"); $out .= 'Successfully executed Query: \''.$cad[$i].'\''.$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.'ERROR executing System Command \''.$command.'\'
'; } else { WriteLog("Successfully executed System Command '$command'. [$returnval]"); $out .= $lf.'Successfully executed System Command \''.$command.'.
'; } } } } 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)).')
'); } 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 .= ''.$file.''; $email_log = "Email sent to '".$config['email_recipient']."'"; $email_out = $lang['L_EMAIL_WAS_SEND'].'`'.$config['email_recipient'].'`
'; } 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'].'`.
'; } } 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.')
'; } $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'].'`
'; } if (@mail($config['email_recipient'], stripslashes($subject), $msg_body, $header)) { $out .= ''.$email_out.''; WriteLog("$email_log"); } else { $out .= ''.$lang['L_MAILERROR'].'
'; 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].'`.
'; if (@mail($config['email_recipient'], stripslashes($subject), $msg_body, $header)) { $out .= ''.$email_out.''; WriteLog("$email_log"); } else { $out .= ''.$lang['L_MAILERROR'].'
'; 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 .= ''.$lang['L_FILESENDFTP'].'('.$config['ftp_server'][$i].' - '.$config['ftp_user'][$i].')
'; } // 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 .= ''.$lang['L_FTPCONNERROR'].$config['ftp_server'][$i].$lang['L_FTPCONNERROR1'].$config['ftp_user'][$i].$lang['L_FTPCONNERROR2'].'
'; } else { if (1 == $conn_msg) { $out .= ''.$lang['L_FTPCONNECTED1'].$config['ftp_server'][$i].$lang['L_FTPCONNERROR1'].$config['ftp_user'][$i].'
'; } } // 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 .= ''.$lang['L_FTPCONNERROR3']."
($source -> $dest)

"; } else { $out .= ''.$lang['L_FILE'].' '.$source_file.''.$lang['L_FTPCONNECTED2'].$config['ftp_server'][$i].$lang['L_FTPCONNECTED3'].'
'; 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); } } }