* @license http://www.contenido.org/license/LIZENZ.txt * @link http://www.4fb.de * @link http://www.contenido.org * @since file available since contenido release <= 4.8.12 * * $Id: */ if(!defined('CON_FRAMEWORK')) { die('Illegal call'); } /** * class Purge * */ class Purge { /** * @var DB_ConLite $oDb */ private $oDb; /** * @var $cfg */ private $cfg; /** * @var $cfgClient */ private $cfgClient; /** * @var string $sDefaultCacheDir */ private $sDefaultCacheDir = 'cache/'; /** * @var string $sDefaultLogDir */ private $sDefaultLogDir = 'logs/'; /** * @var string $sDefaultVersionDir */ private $sDefaultVersionDir = 'version/'; /** * @var string $sDefaultCronjobDir */ private $sDefaultCronjobDir = 'cronjobs/'; /** * @var array $aLogFileTypes */ private $aLogFileTypes; /** * @var array $aCronjobFileTypes */ private $aCronjobFileTypes; /** * Constructor of class * * @param object $db * @param array $cfg * @param array $cfgClient */ public function __construct(&$db, $cfg, $cfgClient) { $this->oDb = $db; $this->cfg = $cfg; $this->cfgClient = $cfgClient; $this->setLogFileTypes(array('txt')); $this->setCronjobFileTypes(array('job')); } /** * Reset the table con_code for a client * * @param int $iClientId * @return boolean */ public function resetClientConCode($iClientId) { $sSql = "DELETE FROM " . $this->cfg['tab']['code'] . " WHERE idclient = " . $iClientId; $this->oDb->query($sSql); return ($this->oDb->Error == '') ? true : false; } /** * Reset the table con_cat_art for a client * * @param int $iClientId * @return boolean */ public function resetClientConCatArt ($iClientId) { $sSql = " UPDATE " . $this->cfg['tab']['cat_art'] . " cca, " . $this->cfg['tab']['cat'] . " cc, " . $this->cfg['tab']['art'] . " ca " . " SET cca.createcode=1 " . " WHERE cc.idcat = cca.idcat " . " AND ca.idart = cca.idart " . " AND cc.idclient = " . $iClientId . " AND ca.idclient =" . $iClientId; $this->oDb->query($sSql); return ($this->oDb->Error == '') ? true : false; } /** * Reset the table con_inuse * * @return boolean */ public function resetConInuse () { $sSql = "DELETE FROM " . $this->cfg['tab']['inuse']; $this->oDb->query($sSql); return ($this->oDb->Error == '') ? true : false; } /** * Reset the table con_phplib_active_sessions * * @return boolean */ public function resetPHPLibActiveSession () { $sSql = "DELETE FROM " . $this->cfg['tab']['phplib_active_sessions']; $this->oDb->query($sSql); return ($this->oDb->Error == '') ? true : false; } /** * Reset the table con_inuse * * @return boolean */ public function resetUnusedSession () { $sSql = "DELETE FROM " . $this->cfg['tab']['inuse']; $this->oDb->query($sSql); return ($this->oDb->Error == '') ? true : false; } /** * Clear the cache directory for a client * * @param int $sClientName * @return boolean */ public function clearClientCache ($iClientId, $sCacheDir = 'cache/') { $sClientDir = $this->getClientDir($iClientId); $sCacheDir = (trim($sCacheDir) == '' || trim($sCacheDir) == '/') ? $this->sDefaultCacheDir : $sCacheDir; if (is_dir($sClientDir . $sCacheDir)) { $sCachePath = $sClientDir . $sCacheDir; return ($this->clearDir($sCachePath, $sCachePath) ? true : false); } return false; } /** * Clear the cache directory for a client * * @param int $sClientName * @return boolean */ public function clearClientHistory ($iClientId, $bKeep, $iFileNumber, $sVersionDir = 'version/') { $sClientDir = $this->getClientDir($iClientId); $sCacheDir = (trim($sVersionDir) == '' || trim($sVersionDir) == '/') ? $this->sDefaultVersionDir : $sVersionDir; if (is_dir($sClientDir . $sVersionDir)) { $sVersionPath = $sClientDir . $sVersionDir; $aTmpFile = array(); $this->clearDir($sVersionPath, $sVersionPath, $bKeep, $aTmpFile); if (count($aTmpFile) > 0 ) foreach ($aTmpFile as $sKey => $aFiles) { // sort the history files with filename array_multisort($aTmpFile[$sKey]); $iCount = count($aTmpFile[$sKey]); // find the total number to delete $iCountDelete = ($iCount <= $iFileNumber) ? 0 : ($iCount - $iFileNumber); // delete the files for ($i = 0; $i < $iCountDelete; $i++) { if (file_exists($aTmpFile[$sKey][$i]) && is_writable($aTmpFile[$sKey][$i])) { unlink($aTmpFile[$sKey][$i]); } } } return true; } return false; } /** * Clear client log file * * @param int $iClientId * @param string $sLogDir * @return boolean */ public function clearClientLog ($iClientId, $sLogDir = 'logs/') { $sClientDir = $this->getClientDir($iClientId); $sLogDir = (trim($sLogDir) == '' || trim($sLogDir) == '/') ? $this->sDefaultLogDir : $sLogDir; if (is_dir($sClientDir . $sLogDir)) { return $this->emptyFile($sClientDir . $sLogDir, $this->aLogFileTypes); } return false; } /** * Clear contenido log files * * @param string $sLogDir * @return boolean */ public function clearConLog ($sLogDir = 'logs/') { $sLogDir = (trim($sLogDir) == '' || trim($sLogDir) == '/') ? $this->sDefaultLogDir : $sLogDir; if (is_dir($sLogDir)) { return $this->emptyFile($sLogDir, $this->aLogFileTypes); } return false; } /** * Clear contenido log files * * @param string $sLogDir * @return boolean */ public function clearConCronjob ($sCronjobDir = 'cronjobs/') { $sCronjobDir = (trim($sCronjobDir) == '' || trim($sCronjobDir) == '/') ? $this->sDefaultCronjobDir : $sCronjobDir; if (is_dir($sCronjobDir)) { return $this->emptyFile($sCronjobDir, $this->aCronjobFileTypes); } return false; } /** * Clear the cache directory for a client * * @param int $sClientName * @return boolean */ public function clearConCache ($sCacheDir = 'cache/') { $sCacheDir = (trim($sCacheDir) == '' || trim($sCacheDir) == '/') ? $this->sDefaultCacheDir : $sCacheDir; if (is_dir($sCacheDir)) { return ($this->clearDir($sCacheDir, $sCacheDir) ? true : false); } return false; } /** * Delete all files and sub directories in a directory * * @param string $sDirPath * @param string $sTmpDirPath - root directory not deleted * @param boolean $bKeep * @param array $aTmpFileList - files are temporarily saved * @return boolean */ public function clearDir ($sDirPath, $sTmpDirPath, $bKeep = false, &$aTmpFileList = array()) { if (is_dir($sDirPath) && ($handle = opendir($sDirPath))) { $sTmp = str_replace(array('/', '..'), '', $sDirPath); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $sFilePath = $sDirPath . '/' . $file; $sFilePath = str_replace('//', '/', $sFilePath); if (is_dir($sFilePath)) { $this->clearDir($sFilePath, $sTmpDirPath, $bKeep, $aTmpFileList); } else { if ($bKeep === false ) { unlink($sFilePath); } else { $aTmpFileList[$sTmp][] = $sFilePath; } } } } if (str_replace(array('/', '..'), '', $sDirPath) != str_replace(array('/', '..'), '', $sTmpDirPath) && $bKeep === false) rmdir($sDirPath); closedir($handle); return true; } else { return false; } } /** * Empty a file content * * @param string $sFilePath * @return boolean */ public function emptyFile($sDirPath, $aTypes) { $iCount = 0; $iCountCleared = 0; if (is_dir($sDirPath) && ($handle = opendir($sDirPath))) { while (false !== ($file = readdir($handle))) { $sFileExt = trim(end(explode('.', $file))); if ($file != "." && $file != ".." && in_array($sFileExt, $aTypes)) { $sFilePath = $sDirPath . '/' . $file; if (file_exists($sFilePath) && is_writable($sFilePath)) { $iCount++; //chmod($sFilePath, 0777); if (fclose(fopen($sFilePath, 'w+'))) $iCountCleared++; } } } // true if all files are cleaned return ($iCount == $iCountCleared) ? true : false; } return false; } /** * Get frontend directory name for a client * * @param int $iClientId * @return string $sClientDir */ public function getClientDir($iClientId) { $sClientDir = str_replace($this->cfg['path']['frontend'], '..', $this->cfgClient[$iClientId]['path']['frontend']); return $sClientDir; } /** * Set log file types * * @param array $aTypes */ public function setLogFileTypes( $aTypes) { if (count($aTypes) > 0) { foreach($aTypes as $sType) { $this->aLogFileTypes[] = $sType; } } } /** * Set cronjob file types * * @param array $aTypes */ public function setCronjobFileTypes($aTypes) { if (count($aTypes) > 0) { foreach($aTypes as $sType) { $this->aCronjobFileTypes[] = $sType; } } } /** * updates con_sequence for all tables in db * which are know in CL * * @author Ortwin Pinke * @since 4.8.17 CL * * @return boolean */ public function updateConSequence() { $aDbTables = array(); $sSql = 'SHOW TABLES'; $this->oDb->query($sSql); while($this->oDb->next_record()) { $aTmp = $this->oDb->toArray(); $aDbTables[] = $aTmp[0]; } $iLoop = 0; //only use tables which are listet in tab-cfg foreach ($this->cfg['tab'] as $sTable) { if(in_array($sTable, $aDbTables)) { dbUpdateSequence($this->cfg['tab']['sequence'], $sTable, $this->oDb); if($this->oDb->Errno > 0) { return false; } $iLoop++; } } return true; // not working with tables not listed in tab-cfg // return ($iLoop == count($aDbTables))?true:false; } } ?>