Exemplo n.º 1
0
 protected function _prepare()
 {
     // Intialize the timer class
     $timer = AEFactory::getTimer();
     // Do we have a tag?
     if (!empty($this->_parametersArray['tag'])) {
         $this->tag = $this->_parametersArray['tag'];
     }
     // Make sure a tag exists (or create a new one)
     $this->tag = $this->getTag();
     // Reset the log
     AEUtilLogger::openLog($this->tag);
     AEUtilLogger::ResetLog($this->tag);
     set_error_handler('akeebaBackupErrorHandler');
     // Reset the storage
     AEUtilTempvars::reset($this->tag);
     // Get the domain chain
     $this->domain_chain = AEUtilScripting::getDomainChain();
     $this->total_steps = count($this->domain_chain) - 1;
     // Init shouldn't count in the progress bar
     // Mark this engine for Nesting Logging
     $this->nest_logging = true;
     // Preparation is over
     $this->array_cache = null;
     $this->setState('prepared');
     //restore_error_handler();
 }
Exemplo n.º 2
0
 protected function _prepare()
 {
     // Intialize the timer class
     $timer = AEFactory::getTimer();
     // Do we have a tag?
     if (!empty($this->_parametersArray['tag'])) {
         $this->tag = $this->_parametersArray['tag'];
     }
     // Make sure a tag exists (or create a new one)
     $this->tag = $this->getTag();
     // Reset the log
     $logTag = $this->getLogTag();
     AEUtilLogger::openLog($logTag);
     AEUtilLogger::ResetLog($logTag);
     set_error_handler('akeebaBackupErrorHandler');
     // Reset the storage
     $tempVarsTag = $this->tag . (empty($this->backup_id) ? '' : '.' . $this->backup_id);
     AEUtilTempvars::reset($tempVarsTag);
     // Apply the configuration overrides
     $overrides = AEPlatform::getInstance()->configOverrides;
     if (is_array($overrides) && @count($overrides)) {
         $registry = AEFactory::getConfiguration();
         $protected_keys = $registry->getProtectedKeys();
         $registry->resetProtectedKeys();
         foreach ($overrides as $k => $v) {
             $registry->set($k, $v);
         }
         $registry->setProtectedKeys($protected_keys);
     }
     // Get the domain chain
     $this->domain_chain = AEUtilScripting::getDomainChain();
     $this->total_steps = count($this->domain_chain) - 1;
     // Init shouldn't count in the progress bar
     // Mark this engine for Nesting Logging
     $this->nest_logging = true;
     // Preparation is over
     $this->array_cache = null;
     $this->setState('prepared');
     //restore_error_handler();
 }
Exemplo n.º 3
0
	public function __construct(& $subject, $config = array())
	{
		// Use the parent constructor to create the plugin object
		parent::__construct($subject, $config);
		
		// Check if we have to disable ourself
		$akreset = JRequest::getCmd('akreset','');
		$defaultpw = $this->params->get('resetpw','');
		if( ($akreset == $defaultpw) && !empty($defaultpw) )
		{
			// Disable the plugin
			$db = JFactory::getDBO();

			if( version_compare( JVERSION, '1.6.0', 'ge' ) ) {
				$sql = 'UPDATE `#__extensions` SET `enabled` = 0 WHERE `type` = \'plugin\' AND `element` = \'aklazy\'';
			} else {
				$sql = 'UPDATE #__plugins SET `published` = 0 WHERE `element` = \'aklazy\'';
			}
			$db->setQuery($sql);
			$db->query();

			// Load the configuration
			$profile = (int)$this->params->get('profile',1);
			if($profile <= 0) $profile = 1;
			$session = JFactory::getSession();
			$session->set('profile', $profile, 'akeeba');
			AEPlatform::getInstance()->load_configuration($profile);

			// Remove the log files
			$logfile = AEUtilLogger::logName(null);
			@unlink($logfile);
			AEUtilLogger::ResetLog('lazy');
			
			// Clear lock
			$this->unsetLock();
			$this->unsetNonce();
			$this->saveStorage();

			// Reset pending backups
			AECoreKettenrad::reset(array(
				'maxrun'	=> 0
			));
			
			// Redirect
			$app = JFactory::getApplication();
			$app->redirect('index.php');

			return;
		}

		// Hijack the application to do the backup steps if aklazy and nonce
		// params are defined in the URL query
		$aklazy = JRequest::getCmd('aklazy',null);
		$nonce = JRequest::getCmd('nonce',null);
		
		// Can we create test files in the storage directory?
		$filename = $this->getStorageFilename().'.tmp';
		jimport('joomla.filesystem.file');
		// Fix 3.2.2: JFile::write in 1.6 uses pass-by-reference for the data part
		$dummyData = 'x';
		$touched = @file_put_contents($filename, $dummyData);
		if(!$touched) {
			$touched = JFile::write($filename,$dummyData);
		}
		if($touched) {
			if(!@unlink($filename)) {
				JFile::delete($filename);
			}
		} else {
			$app = JFactory::getApplication();
			if(JFactory::getApplication()->isAdmin()) {
				JError::raiseWarning(0, "Your cache directory (".JPATH_SITE.DS."cache) is not writable. Akeeba Backup Lazy Scheduling plugin will not work until you fix this issue.");
			}
			return;
		}

		// Load the settings
		$status = $this->loadStorage();
		if(!$status) {
			$app = JFactory::getApplication();
			if(JFactory::getApplication()->isAdmin()) {
				JError::raiseWarning(0, "Akeeba Backup Lazy Scheduling plugin can not read its temporary file. Make sure the cache directory in your site's root is writable and readable.");
			}
			return;
		}

		// When aklazy is 'check', it returns a backup URL, or dies if there's
		// no need to start/step a backup.
		if( ($aklazy == 'check') )
		{
			// Do a backup necessity check and return a URL or nothing at all
			$state = $this->getBackupState();
			if($state != 'none')
			{
				$url = JURI::base().'index.php?aklazy='.$state.'&nonce='.$this->nonce;
			}
			else
			{
				$url = '';
			}
			@ob_end_clean(); // Just in case...
			echo('###'.$url.'###');
			jexit();
		}

		if( (in_array($aklazy, array('start','step','ajaxstart','ajaxstep'))) && !empty($nonce) )
		{
			// Make sure we're not locked
			if($this->isLocked()) return;

			// Get the saved nonce and compare it to the one in the URL
			$this->getNonce();
			if(empty($this->nonce)) return;
			if($this->nonce != $nonce) return;
			if($this->isLocked()) return;

			// Try to convince PHP to not abort the request when the user is disconnected
			if(function_exists('ignore_user_abort')) {
				@ignore_user_abort(true);
			}
			
			// Set a time limit of 5 mintues
			if(function_exists('set_time_limit')) {
				@set_time_limit(300);
			}
			
			// Lock the backup process
			$this->setNonce();
			$this->setLock();
			$this->saveStorage();

			// Define the basic constants for the Akeeba Engine
			if(!defined('AKEEBA_BACKUP_ORIGIN')) {
				define('AKEEBA_BACKUP_ORIGIN','lazy'); // Set the backup origin
			}
			
			// Load the language files
			$jlang = JFactory::getLanguage();
			$jlang->load('com_akeeba', JPATH_SITE, 'en-GB', true);
			$jlang->load('com_akeeba', JPATH_SITE, $jlang->getDefault(), true);
			$jlang->load('com_akeeba', JPATH_SITE, null, true);
			$jlang->load('com_akeeba', JPATH_ADMINISTRATOR, 'en-GB', true);
			$jlang->load('com_akeeba', JPATH_ADMINISTRATOR, $jlang->getDefault(), true);
			$jlang->load('com_akeeba', JPATH_ADMINISTRATOR, null, true);

			// Set the profile and load the configuration
			$profile = (int)$this->params->get('profile',1);
			if($profile <= 0) $profile = 1;
			$session = JFactory::getSession();
			$session->set('profile', $profile, 'akeeba');
			
			AEPlatform::getInstance()->load_configuration($profile);
			if(empty($tag)) $tag = AEPlatform::getInstance()->get_backup_origin();

			$isDone = false;
			register_shutdown_function('AkeebaBackupLazyShutdown');
			if(in_array($aklazy,array('start','ajaxstart')))
			{
				// Start a new backup
				AEUtilTempvars::reset($tag);

				$kettenrad = AECoreKettenrad::load($tag);
				
				$user = JFactory::getUser();
				$userTZ = $user->getParam('timezone',0);
				$dateNow = new JDate();
				$dateNow->setOffset($userTZ);
				if( version_compare( JVERSION, '1.6.0', 'ge' ) ) {
					$description = JText::_('BACKUP_DEFAULT_DESCRIPTION').' '.$dateNow->format(JText::_('DATE_FORMAT_LC2'), true);
				} else {
					$description = JText::_('BACKUP_DEFAULT_DESCRIPTION').' '.$dateNow->toFormat(JText::_('DATE_FORMAT_LC2'));
				}
				$options = array(
					'description'	=> $description,
					'comment'		=> ''
				);
				$kettenrad->setup($options); // Setting up the engine
				$kettenrad->tick(); // Initializes the init domain
			} else {
				// Run a backup step
				$kettenrad = AECoreKettenrad::load($tag);
				$kettenrad->tick();
			}
			$array = $kettenrad->getStatusArray();
			$kettenrad->resetWarnings(); // So as not to have duplicate warnings reports
			AECoreKettenrad::save($tag);

			// Parse the return array
			if($array['Error'] != '')
			{
				// An error occured. Reset the engine and unset the nonce.
				$this->unsetNonce();
				$this->saveStorage();
				AECoreKettenrad::reset(array(
					'maxrun'	=> 0
				));
				$isDone = true;
			}
			elseif($array['HasRun'] == 1)
			{
				// All done. Clean up and unset the nonce.
				$this->unsetNonce();
				$this->saveStorage();
				AEFactory::nuke();
				AEUtilTempvars::reset($tag);
				$isDone = true;
			}

			// Unlock the process
			$this->unsetLock();
			$this->saveStorage();

			// Do we need to forward to the new step?
			if(in_array($aklazy, array('start','step')))
			{
				// IFRAME handling
				if(!$isDone)
				{
					$url = JURI::base().'index.php?aklazy=step&nonce='.$this->nonce;
					echo "<html><head><meta http-equiv=\"refresh\" content=\"0;$url\" /></head><body></body></html>";
					jexit();
				}
			}
			else
			{
				if(!$isDone)
				{
					echo '###'.$this->nonce.'###';
					jexit();
				}
			}

			// Stop processing
			jexit();
		}
	}