* @copyright (c) 2012-2013, conlite.org * * $Id$ */ /* @var $sess Contenido_Session */ /* @var $perm Contenido_Perm */ /* @var $auth Contenido_Challenge_Crypt_Auth */ /* @var $notification Contenido_Notification */ if (!defined('CON_FRAMEWORK')) { die('Illegal call'); } define('CL_BACKUP_COUNT_LINES', 20000); define('CL_BACKUP_MAX_RELOADS', 600); define('CL_BACKUP_VERSION', 'CL DB-Backup 1.3.4'); define('CL_BACKUP_PATH', $cfg['path']['conlite_backup']); define('CL_BACKUP_LOGFILE', $cfg['path']['conlite_logs'] . "db-backup-log.txt"); define('CL_BACKUP_START_IMG', $cfg['path']['contenido_html'] . $cfg['path']['images'] . "db_backup_start.png"); define('CL_BACKUP_START_IMG_OFF', $cfg['path']['contenido_html'] . $cfg['path']['images'] . "db_backup_start_off.png"); $aMessage = array(); $bNoBackup = false; $bFinalStep = false; // check backup path if (!is_dir(CL_BACKUP_PATH) || !is_writable(CL_BACKUP_PATH)) { $notification->displayNotification("error", i18n("Backupfolder missing or not writable!")); $bNoBackup = true; } $backup_action = (isset($_GET['cl_action']) ? $_GET['cl_action'] : ''); // check dbuser rights /* echo "
"; $oDb = new DB_ConLite(); //echo $sSql = "SHOW GRANTS FOR '".$cfg['db']['connection']['user']."'@'".$cfg['db']['connection']['host']."';"; echo $sSql = "SHOW GRANTS FOR '" . $cfg['db']['connection']['user'] . "';"; $oDb->query($sSql); while ($oDb->next_record()) { print_r($oDb->toArray()); } */ $sTable = ""; $bk_filename = str_replace(array("&cl_action=backupnow", "&"), array("", "&"), $sess->self_url()); // web28 - 2011-07-02 - Security Fix - PHP_SELF $info_h1 = i18n("Start your Backup!"); $info_h2 = ' '; $oImgButton = new cHTMLImage(); if ($bNoBackup) { $oImgButton->setSrc(CL_BACKUP_START_IMG_OFF); $oImgButton->setAlt(mi18n("Backup not possible!")); } else { $oImgButton->setSrc(CL_BACKUP_START_IMG); $oImgButton->setAlt(mi18n("Click to start Backup!")); } $sImage = $oImgButton->render(); $oStartButton = new cHTMLLink($sess->self_url() . "&cl_action=backupnow"); $oStartButton->_setContent($sImage); $button_back = ($bNoBackup) ? $sImage : $oStartButton->toHtml(); //aktiviert die Ausgabepufferung ob_start(); //Start Session session_name('dbdump'); if (!isset($_SESSION)) { session_start(); } //unset($_SESSION['dump']); //#### BACKUP ANFANG ####### if (isset($_SESSION['dump'])) { $dump = $_SESSION['dump']; $info_h2 = ' '; $button_back = ' '; } else { $oUser = new User(); $oUser->loadUserByUserID($auth->auth['uid']); $bHasPermission = ($oUser->getUserProperty("system", "cl_backup_allowed") == 'true') ? true : false; if (!$perm->isSysadmin() && !$bHasPermission) { $notification->displayNotification("error", i18n("Permission denied!")); exit(); } } cInclude("classes", "class.cl_db_backup.php"); if ($backup_action == 'backupnow') { $oDB = new DB_ConLite(); $oDB2 = new DB_ConLite(); $info_h1 = i18n("Starting Backup."); $info_h2 = ' '; $restore = array(); unset($_SESSION['restore']); $dump = array(); unset($_SESSION['dump']); @set_time_limit(0); //BOF Disable "STRICT" mode! $vers = $oDB->getClientInfo(); if (substr($vers, 0, 1) > 4) { $oDB->query("SET SESSION sql_mode=''"); //@mysql_query("SET SESSION sql_mode=''", $oDB->Link_ID); } //EOF Disable "STRICT" mode! $mysql_version = '-- MySQL-Client-Version: ' . $oDB->getClientInfo() . "\n--\n"; $schema = '-- ConLite ' . $cfg['version'] . "\n" . '--' . "\n" . '-- ' . CL_BACKUP_VERSION . ' (c) 2012-' . date('Y') . ' php-backoffice.de' . "\n" . '--' . "\n" . '-- Database: ' . $cfg['db']['connection']['database'] . "\n" . '-- Database Server: ' . $oDB->getServerInfo() . "\n" . '--' . "\n" . $mysql_version . '-- Backup Date: ' . date("r") . "\n\n"; $backup_file = 'dbd_' . $cfg['db']['connection']['database'] . '-' . date('YmdHis'); $dump['file'] = CL_BACKUP_PATH . $backup_file; if (!isset($dump['compress'])) { if (getEffectiveSetting("cl-backup", "use_gzip", false) == 'true') { $dump['compress'] = true; $dump['file'] .= '.sql.gz'; } else { $dump['compress'] = false; $dump['file'] .= '.sql'; } } if (!isset($dump['complete_inserts'])) { if (getEffectiveSetting("cl-backup", "complete_inserts", false) == 'true') { $dump['complete_inserts'] = 'yes'; } } $oDB->query("SHOW TABLE STATUS FROM `" . $cfg['db']['connection']['database'] . "` LIKE '" . $cfg['sql']['sqlprefix'] . "_%'"); $dump['num_tables'] = $oDB->num_rows(); //Tabellennamen in Array einlesen $dump['tables'] = Array(); $dump['num_rows'] = -1; //echo ""; if ($dump['num_tables'] > 0) { $dump['num_rows'] = 0; for ($i = 0; $i < $dump['num_tables']; $i++) { $oDB->next_record(); $row = $oDB->toArray(); $dump['tables'][$i] = $row['Name']; $oDB2->query("SELECT COUNT(*) FROM " . $row['Name']); $oDB2->next_record(); //$result = mysql_query("SELECT COUNT(*) FROM ".$row['Name'], $oDB->Link_ID); $aTmp = $oDB2->toArray(); $dump['num_rows'] += $aTmp[0]; //print_r($row); } $dump['nr'] = 0; $dump['table_offset'] = 0; $_SESSION['dump'] = $dump; //echo ''; //print_r($dump); /* * Statuszeile kompatibel zu MySQLDumper (MSD) * AUFBAU der Statuszeile: * -- Status:tabellenzahl:datensätze:Multipart:Datenbankname:script:scriptversion:Kommentar:MySQLVersion:Backupflags:SQLBefore:SQLAfter:Charset:EXTINFO * Aufbau Backupflags (1 Zeichen pro Flag, 0 oder 1, 2=unbekannt) * (complete inserts)(extended inserts)(ignore inserts)(delayed inserts)(downgrade)(lock tables)(optimize tables) */ $statusline = array(); $statusline['tables'] = $dump['num_tables']; $statusline['records'] = $dump['num_rows']; $statusline['part'] = 'MP_0'; $statusline['dbname'] = $cfg['db']['connection']['database']; $statusline['script'] = 'php'; $statusline['scriptversion'] = '1.24'; $statusline['comment'] = 'Backup made by ' . CL_BACKUP_VERSION; $statusline['mysqlversion'] = $oDB->getServerInfo(); $statusline['flags'] = '2222222'; $statusline['sqlbefore'] = ''; $statusline['sqlafter'] = ''; $statusline['charset'] = $oDB->getClientEncoding(); $statusline['extinfo'] = 'EXTINFO'; $sStatLine = "-- Status:"; $sStatLine .= implode(":", $statusline) . "\n\n"; ; $schema = $sStatLine . $schema; //die($schema); $oClBackup = new clDbBackup(); $oClBackup->_writeToDumpFile($schema); $selbstaufruf = ''; } else { $aMessage['level'] = Contenido_Notification::LEVEL_ERROR; $aMessage['text'] = "Error: Cannot read database!"; //else ERROR } } //Seite neu laden wenn noch nicht alle Tabellen ausgelesen sind if ($dump['num_tables'] > 0 && $backup_action != 'backupnow') { if (!is_object($oClBackup)) { $oClBackup = new clDbBackup(); } $info_h1 = i18n("Backup in Progress!"); @set_time_limit(0); if ($dump['nr'] < $dump['num_tables']) { $nr = $dump['nr']; $dump['aufruf'] ++; $table_ok = i18n("Tables saved: ") . ($nr + 1) . '
' . i18n("Last processed: ") . $dump['tables'][$nr] . '
' . i18n("Pageviews: ") . $dump['aufruf']; //Neue Tabelle if ($dump['table_offset'] == 0) { $dump['table_records'] = $oClBackup->_writeTableHeader($dump['tables'][$nr]); $dump['anzahl_zeilen'] = CL_BACKUP_COUNT_LINES; $dump['table_offset'] = 1; $dump['zeilen_offset'] = 0; } else { //Daten aus Tabelle lesen //GetTableData($dump['tables'][$nr]); $oClBackup->_writeTableData($dump['tables'][$nr]); } $_SESSION['dump'] = $dump; $selbstaufruf = ''; //Verhindert Endlosschleife - Script wir nach MAX_RELOADS beendet if ($dump['aufruf'] > CL_BACKUP_MAX_RELOADS) { $selbstaufruf = ''; } } else { //Fertig $info_h2 = ' '; $info_h1 = i18n("Backup done!"); $table_ok = i18n("Tables saved: ") . $dump['nr'] . '
' . i18n("Pageviews: ") . $dump['aufruf']; $selbstaufruf = ''; unset($_SESSION['dump']); $oBackButton = new cHTMLLink($sess->self_url()); $oBackButton->_setContent(i18n("Go Back to Overview")); $button_back = $oBackButton->toHtml(); $bFinalStep = true; if (!is_object($oClBackup)) { $oClBackup = new clDbBackup(); } $oClBackup->writeLog(); } } //#### BACKUP ENDE ####### // Let's build the file table if (!isset($_SESSION['dump']) && !$bFinalStep) { if (!is_object($oClBackup)) { $oClBackup = new clDbBackup(); } $aFiles = $oClBackup->getDumpFiles(CL_BACKUP_PATH); //print_r($aFiles); $oFileList = new cScrollList(); $oFileList->objTable->setID("files_tab"); $oFileList->setHeader(mi18n("#"), mi18n("Date"), mi18n("Filename"), mi18n("Filesize"), mi18n("Tables/Entries"), "", mi18n("Actions")); $oFileList->objHeaderItem->updateAttributes(array('style' => "width: 20px; padding: 0 4px;white-space:nowrap; border: 1px solid #B3B3B3; border-bottom: 0;")); $oFileList->setSortable(1, true); $oFileList->setSortable(2, true); $iLoop = 0; if (is_array($aFiles) && count($aFiles) > 0) { foreach ($aFiles as $sKey => $aFile) { // send file on request if ($cl_action == 'download_file' && $fileid == $sKey) { $oClBackup->sendFile(CL_BACKUP_PATH . $aFile['filename']); die(); } if ($cl_action == 'del_file' && $fileid == $sKey) { if (unlink(CL_BACKUP_PATH . $aFile['filename'])) { $notification->displayNotification('info', i18n("File successfully deleted.")); continue; } } $oDelImg = new cHTMLImage(); $oDelImg->setSrc($cfg['path']['contenido_html'] . $cfg['path']['images'] . "but_delete.gif"); $oDelImg->setClass("img_but"); $oDelImg->setAlt(i18n("Delete File")); $oDelete = new cHTMLLink($sess->url($sess->self_url() . "&cl_action=del_file&fileid=$sKey"), "delete"); $oDelete->setContent($oDelImg->render()); $oDownloadImg = new cHTMLImage(); $oDownloadImg->setSrc($cfg['path']['contenido_html'] . $cfg['path']['images'] . "but_downloadlist.gif"); $oDownloadImg->setClass("img_but"); $oDownloadImg->setAlt(i18n("Download File")); $oDownload = new cHTMLLink($sess->url($sess->self_url() . "&cl_action=download_file&fileid=$sKey"), "download"); $oDownload->setContent($oDownloadImg->render()); $aFileStats = readStatusLineFromFile(CL_BACKUP_PATH . $aFile['filename']); if (is_array($aFileStats)) { $sFileStats = $aFileStats['tables'] . " / " . $aFileStats['records']; } else { $sFileStats = ''; } $oFileList->setData($iLoop, $iLoop + 1, date("Y-m-d H:i", $aFile['ctime']), $aFile['filename'], human_readable_size($aFile['size']), $sFileStats, " ", $oDelete->render() . $oDownload->render()); $iLoop++; } } $sFileList = $oFileList->render(true); } function readStatusLineFromFile($sFile) { $FileName = basename($sFile); if (strtolower(substr($FileName, -2)) == 'gz') { $fp = gzopen($sFile, "r"); if ($fp === false) die('Can\'t open file ' . $FileName); $sline = gzgets($fp, 40960); gzclose($fp); } else { $fp = fopen($sFile, "r"); if ($fp === false) die('Can\'t open file ' . $FileName); $sline = fgets($fp, 5000); fclose($fp); } $aStatusLine = clStatusLine2Array($sline); return $aStatusLine; } function clStatusLine2Array($sLine) { if (substr($sLine, 0, 9) != "-- Status") return false; $aStatus = explode(":", $sLine); $aRet = array(); $aRet['tables'] = $aStatus[1]; $aRet['records'] = $aStatus[2]; $aRet['dbname'] = $aStatus[4]; if ((isset($aStatus[12])) && trim($aStatus[12]) != 'EXTINFO') { $aRet['charset'] = $aStatus[12]; } else { $aRet['charset'] = '?'; } return $aRet; } ?>'; ?> displayNotification($aMessage['level'], $aMessage['text']); } ?>