Files
portal-legacy/data/symfony/tasks/sfPakeMisc.php

339 lines
8.7 KiB
PHP
Raw Normal View History

2012-11-28 03:55:08 -05:00
<?php
/*
* This file is part of the symfony package.
* (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
pake_desc('clear cached information');
pake_task('clear-cache', 'project_exists');
pake_alias('cc', 'clear-cache');
pake_desc('clear controllers');
pake_task('clear-controllers', 'project_exists');
pake_desc('fix directories permissions');
pake_task('fix-perms', 'project_exists');
pake_desc('rotates an applications log files');
pake_task('log-rotate', 'app_exists');
pake_desc('purges an applications log files');
pake_task('log-purge', 'project_exists');
pake_desc('enables an application in a given environment');
pake_task('enable', 'app_exists');
pake_desc('disables an application in a given environment');
pake_task('disable', 'app_exists');
/**
* fixes permissions in a symfony project
*
* @example symfony fix-perms
*
* @param object $task
* @param array $args
*/
function run_fix_perms($task, $args)
{
$sf_root_dir = sfConfig::get('sf_root_dir');
pake_chmod(sfConfig::get('sf_cache_dir_name'), $sf_root_dir, 0777);
pake_chmod(sfConfig::get('sf_log_dir_name'), $sf_root_dir, 0777);
pake_chmod(sfConfig::get('sf_web_dir_name').DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'), $sf_root_dir, 0777);
pake_chmod('symfony', $sf_root_dir, 0777);
$dirs = array(sfConfig::get('sf_cache_dir_name'), sfConfig::get('sf_web_dir_name').DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'), sfConfig::get('sf_log_dir_name'));
$dir_finder = pakeFinder::type('dir')->ignore_version_control();
$file_finder = pakeFinder::type('file')->ignore_version_control();
foreach ($dirs as $dir)
{
pake_chmod($dir_finder, $dir, 0777);
pake_chmod($file_finder, $dir, 0666);
}
}
/**
* clears symfony project cache
*
* @example symfony clear-cache
* @example symfony cc
*
* @param object $task
* @param array $args
*/
function run_clear_cache($task, $args)
{
if (!file_exists('cache'))
{
throw new Exception('Cache directory does not exist.');
}
$cache_dir = sfConfig::get('sf_cache_dir_name');
// app
$main_app = '';
if (isset($args[0]))
{
$main_app = $args[0];
}
// type (template, i18n or config)
$main_type = '';
if (isset($args[1]))
{
$main_type = $args[1];
}
// declare type that must be cleaned safely (with a lock file during cleaning)
$safe_types = array(sfConfig::get('sf_app_config_dir_name'), sfConfig::get('sf_app_i18n_dir_name'));
// finder to remove all files in a cache directory
$finder = pakeFinder::type('file')->ignore_version_control()->discard('.sf');
// finder to find directories (1 level) in a directory
$dir_finder = pakeFinder::type('dir')->ignore_version_control()->discard('.sf')->maxdepth(0)->relative();
// iterate through applications
$apps = array();
if ($main_app)
{
$apps[] = $main_app;
}
else
{
$apps = $dir_finder->in($cache_dir);
}
foreach ($apps as $app)
{
if (!is_dir($cache_dir.'/'.$app))
{
continue;
}
// remove cache for all environments
foreach ($dir_finder->in($cache_dir.'/'.$app) as $env)
{
// which types?
$types = array();
if ($main_type)
{
$types[] = $main_type;
}
else
{
$types = $dir_finder->in($cache_dir.'/'.$app.'/'.$env);
}
$sf_root_dir = sfConfig::get('sf_root_dir');
foreach ($types as $type)
{
$sub_dir = $cache_dir.'/'.$app.'/'.$env.'/'.$type;
if (!is_dir($sub_dir))
{
continue;
}
// remove cache files
if (in_array($type, $safe_types))
{
$lock_name = $app.'_'.$env;
_safe_cache_remove($finder, $sub_dir, $lock_name);
}
else
{
pake_remove($finder, $sf_root_dir.'/'.$sub_dir);
}
}
}
}
}
/**
* clears all controllers in your web directory other than one running in a produciton environment
*
* @example symfony clear-controllers
*
* @param object $task
* @param array $args
*/
function run_clear_controllers($task, $args)
{
$web_dir = sfConfig::get('sf_web_dir');
$app_dir = sfConfig::get('sf_app_dir');
$apps = count($args) > 1 ? $args : null;
// get controller
$controllers = pakeFinder::type('file')->ignore_version_control()->maxdepth(1)->name('*.php')->in($web_dir);
foreach ($controllers as $controller)
{
$contents = file_get_contents($controller);
preg_match('/\'SF_APP\',[\s]*\'(.*)\'\)/', $contents, $found_app);
preg_match('/\'SF_ENVIRONMENT\',[\s]*\'(.*)\'\)/', $contents, $env);
// remove file if it has found an application and the environment is not production
if (isset($found_app[1]) && isset($env[1]) && $env[1] != 'prod')
{
pake_remove($controller, '');
}
}
}
/**
* safely removes directory via pake
*
* @param object $finder
* @param string $sub_dir
* @param string $lock_name
*/
function _safe_cache_remove($finder, $sub_dir, $lock_name)
{
$sf_root_dir = sfConfig::get('sf_root_dir');
// create a lock file
pake_touch($sf_root_dir.'/'.$lock_name.'.lck', '');
// change mode so the web user can remove it if we die
pake_chmod($lock_name.'.lck', $sf_root_dir, 0777);
// remove cache files
pake_remove($finder, $sf_root_dir.'/'.$sub_dir);
// release lock
pake_remove($sf_root_dir.'/'.$lock_name.'.lck', '');
}
/**
* forces rotation of the given log file
*
* @example symfony log-rotate
*
* @param object $task
* @param array $args
*/
function run_log_rotate($task, $args)
{
// handling two required arguments (application and environment)
if (count($args) < 2)
{
throw new Exception('You must provide the environment of the log to rotate');
}
$app = $args[0];
$env = $args[1];
// define constants
define('SF_ROOT_DIR', sfConfig::get('sf_root_dir'));
define('SF_APP', $app);
define('SF_ENVIRONMENT', $env);
define('SF_DEBUG', true);
// get configuration
require_once SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php';
sfLogManager::rotate($app, $env, sfConfig::get('sf_logging_period'), sfConfig::get('sf_logging_history'), true);
}
/**
* purges the application log directory as per settings in logging.yml
*
* @example symfony log-purge
*
* @param object $task
* @param array $args
*/
function run_log_purge($task, $args)
{
$sf_symfony_data_dir = sfConfig::get('sf_symfony_data_dir');
$default_logging = sfYaml::load($sf_symfony_data_dir.'/config/logging.yml');
$app_dir = sfConfig::get('sf_app_dir');
$apps = pakeFinder::type('dir')->maxdepth(0)->relative()->ignore_version_control()->in('apps');
$ignore = array('all', 'default');
foreach ($apps as $app)
{
$logging = sfYaml::load($app_dir.'/'.$app.'/config/logging.yml');
$logging = array_merge($default_logging, $logging);
foreach ($logging as $env => $config)
{
if (in_array($env, $ignore))
{
continue;
}
$props = array_merge($default_logging['default'], is_array($config) ? $config : array());
$active = isset($props['active']) ? $props['active'] : true;
$purge = isset($props['purge']) ? $props['purge'] : true;
if ($active && $purge)
{
$filename = sfConfig::get('sf_log_dir').'/'.$app.'_'.$env.'.log';
if (file_exists($filename))
{
pake_remove($filename, '');
}
}
}
}
}
function run_enable($task, $args)
{
// handling two required arguments (application and environment)
if (count($args) < 2)
{
throw new Exception('You must provide an environment for the application.');
}
$app = $args[0];
$env = $args[1];
$lockFile = $app.'_'.$env.'.clilock';
$locks = pakeFinder::type('file')->prune('.svn')->discard('.svn')->maxdepth(0)->name($lockFile)->relative()->in('./');
if (file_exists(sfConfig::get('sf_root_dir').'/'.$lockFile))
{
pake_remove($lockFile, '');
run_clear_cache($task, array());
pake_echo_action('enable', "$app [$env] has been ENABLED");
return;
}
pake_echo_action('enable', "$app [$env] is currently ENABLED");
}
function run_disable($task, $args)
{
// handling two required arguments (application and environment)
if (count($args) < 2)
{
throw new Exception('You must provide an environment for the application.');
}
$app = $args[0];
$env = $args[1];
$lockFile = $app.'_'.$env.'.clilock';
if (!file_exists(sfConfig::get('sf_root_dir').'/'.$lockFile))
{
pake_touch(sfConfig::get('sf_root_dir').'/'.$lockFile, '777');
pake_echo_action('enable', "$app [$env] has been DISABLED");
return;
}
pake_echo_action('enable', "$app [$env] is currently DISABLED");
return;
}