| Current Path : /home/sunflowe/www2/j15/tmp/install_4f118f48ca3c3/backend/akeeba/utils/ |
| Current File : /home/sunflowe/www2/j15/tmp/install_4f118f48ca3c3/backend/akeeba/utils/filesystem.php |
<?php
/**
* Akeeba Engine
* The modular PHP5 site backup engine
* @copyright Copyright (c)2009-2012 Nicholas K. Dionysopoulos
* @license GNU GPL version 3 or, at your option, any later version
* @package akeebaengine
* @version $Id$
*/
// Protection against direct access
defined('AKEEBAENGINE') or die('Restricted access');
/**
* Utility functions related to filesystem objects, e.g. path translation
*/
class AEUtilFilesystem
{
/**
* Makes a Windows path more UNIX-like, by turning backslashes to forward slashes.
* It takes into account UNC paths, e.g. \\myserver\some\folder becomes
* \\myserver/some/folder
*
* @param string $p_path The path to transform
* @return string
*/
static public function TranslateWinPath( $p_path )
{
static $is_windows;
if(empty($is_windows))
{
$is_windows = (DIRECTORY_SEPARATOR == '\\');
}
$is_unc = false;
if ($is_windows)
{
// Is this a UNC path?
$is_unc = (substr($p_path, 0, 2) == '\\\\') || (substr($p_path, 0, 2) == '//');
// Change potential windows directory separator
if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')){
$p_path = strtr($p_path, '\\', '/');
}
}
// Remove multiple slashes
$p_path = str_replace('///','/',$p_path);
$p_path = str_replace('//','/',$p_path);
// Fix UNC paths
if($is_unc)
{
$p_path = '//'.ltrim($p_path,'/');
}
return $p_path;
}
/**
* Removes trailing slash or backslash from a pathname
*
* @param string $path The path to treat
* @return string The path without the trailing slash/backslash
*/
static public function TrimTrailingSlash($path)
{
$newpath = $path;
if( substr($path, strlen($path)-1, 1) == '\\' )
{
$newpath = substr($path, 0, strlen($path)-1);
}
if( substr($path, strlen($path)-1, 1) == '/' )
{
$newpath = substr($path, 0, strlen($path)-1);
}
return $newpath;
}
public static function get_archive_name_variables()
{
$variables = null;
$registry =& AEFactory::getConfiguration();
$serialized = $registry->get('volatile.core.archivenamevars', null);
if(!empty($serialized)) {
$variables = @unserialize($serialized);
}
if(empty($variables))
{
$host = AEPlatform::getInstance()->get_host();
$version = defined('AKEEBA_VERSION') ? AKEEBA_VERSION : 'svn';
$variables = array(
'[DATE]' => AEPlatform::getInstance()->get_local_timestamp("%Y%m%d"),
'[YEAR]' => AEPlatform::getInstance()->get_local_timestamp("%Y"),
'[MONTH]' => AEPlatform::getInstance()->get_local_timestamp("%m"),
'[DAY]' => AEPlatform::getInstance()->get_local_timestamp("%d"),
'[TIME]' => AEPlatform::getInstance()->get_local_timestamp("%H%M%S"),
'[WEEK]' => AEPlatform::getInstance()->get_local_timestamp("%U"),
'[WEEKDAY]' => AEPlatform::getInstance()->get_local_timestamp("%A"),
'[HOST]' => empty($host) ? 'unknown_host' : $host,
'[RANDOM]' => md5(microtime()),
'[VERSION]' => $version
);
}
return $variables;
}
public static function replace_archive_name_variables($source)
{
$tagReplacements = self::get_archive_name_variables();
return str_replace( array_keys($tagReplacements), array_values($tagReplacements), $source );
}
/**
* Returns the relative and absolute path to the archive, if defined
* @param string $relative The relative path
* @param string $absolute The absolute path
*/
public static function get_archive_name( &$relative, &$absolute )
{
static $relative_path = null;
static $absolute_path = null;
if( is_null($relative_path) || is_null($absolute_path) )
{
$registry = AEFactory::getConfiguration();
// Import volatile scripting keys to the registry
AEUtilScripting::importScriptingToRegistry();
// Determine the extension
$force_extension = AEUtilScripting::getScriptingParameter('core.forceextension', null);
if( is_null($force_extension) )
{
$archiver =& AEFactory::getArchiverEngine();
$extension = $archiver->getExtension();
}
else
{
$extension = $force_extension;
}
// Get the template name
$templateName = $registry->get('akeeba.basic.archive_name');
AEUtilLogger::WriteLog(_AE_LOG_DEBUG, "Archive template name: $templateName");
// Parse all tags
$templateName = self::replace_archive_name_variables($templateName);
AEUtilLogger::WriteLog(_AE_LOG_DEBUG, "Expanded template name: $templateName");
$ds = DIRECTORY_SEPARATOR;
$relative_path = $templateName.$extension;
$absolute_path = AEUtilFilesystem::TranslateWinPath( $registry->get('akeeba.basic.output_directory').$ds.$relative_path );
}
$relative = $relative_path;
$absolute = $absolute_path;
}
/**
* Checks if a folder (directory) exists.
* @param string $folder_to_check The path to check if it exists
* @return bool True if the folder is there, false if it's not or the path exists but is not a folder
*/
static function folderExists($folder_to_check)
{
// Try to find the real path to the folder
$folder_clean = @realpath($folder_to_check);
if( ($folder_clean !== false) && (!empty($folder_clean)) )
{
$folder = $folder_clean;
}
else
{
$folder = $folder_to_check;
}
// Clear filesystem cache to avoid getting stale information
if(function_exists("clearstatcache")) clearstatcache();
// Check that the path is there
if( !file_exists($folder) ) return false;
// Check that it is a folder, indeed
if( !is_dir($folder) ) return false;
return true;
}
static function translateStockDirs( $folder, $translate_win_dirs = false, $trim_trailing_slash = false )
{
static $stock_dirs;
if(empty($stock_dirs))
{
$stock_dirs = AEPlatform::getInstance()->get_stock_directories();
}
$temp = $folder;
foreach($stock_dirs as $find => $replace)
{
$temp = str_replace($find, $replace, $temp);
}
if($translate_win_dirs)
{
$temp = self::TranslateWinPath( $temp );
}
if( $trim_trailing_slash )
{
$temp = self::TrimTrailingSlash( $temp );
}
return $temp;
}
}