| Current Path : /home/w/u/e/wuectly/www/03cbe/ |
| Current File : /home/w/u/e/wuectly/www/03cbe/Log.php.tar |
home/wuectly/www/libraries/src/Log/Log.php 0000604 00000022231 15245535750 0014541 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\CMS\Log;
defined('JPATH_PLATFORM') or die;
/**
* Joomla! Log Class
*
* This class hooks into the global log configuration settings to allow for user configured
* logging events to be sent to where the user wishes them to be sent. On high load sites
* Syslog is probably the best (pure PHP function), then the text file based loggers (CSV, W3c
* or plain Formattedtext) and finally MySQL offers the most features (e.g. rapid searching)
* but will incur a performance hit due to INSERT being issued.
*
* @since 1.7.0
*/
class Log
{
/**
* All log priorities.
*
* @var integer
* @since 1.7.0
*/
const ALL = 30719;
/**
* The system is unusable.
*
* @var integer
* @since 1.7.0
*/
const EMERGENCY = 1;
/**
* Action must be taken immediately.
*
* @var integer
* @since 1.7.0
*/
const ALERT = 2;
/**
* Critical conditions.
*
* @var integer
* @since 1.7.0
*/
const CRITICAL = 4;
/**
* Error conditions.
*
* @var integer
* @since 1.7.0
*/
const ERROR = 8;
/**
* Warning conditions.
*
* @var integer
* @since 1.7.0
*/
const WARNING = 16;
/**
* Normal, but significant condition.
*
* @var integer
* @since 1.7.0
*/
const NOTICE = 32;
/**
* Informational message.
*
* @var integer
* @since 1.7.0
*/
const INFO = 64;
/**
* Debugging message.
*
* @var integer
* @since 1.7.0
*/
const DEBUG = 128;
/**
* The global Log instance.
*
* @var Log
* @since 1.7.0
*/
protected static $instance;
/**
* Container for Logger configurations.
*
* @var array
* @since 1.7.0
*/
protected $configurations = array();
/**
* Container for Logger objects.
*
* @var Logger[]
* @since 1.7.0
*/
protected $loggers = array();
/**
* Lookup array for loggers.
*
* @var array
* @since 1.7.0
*/
protected $lookup = array();
/**
* Constructor.
*
* @since 1.7.0
*/
protected function __construct()
{
}
/**
* Method to add an entry to the log.
*
* @param mixed $entry The LogEntry object to add to the log or the message for a new LogEntry object.
* @param integer $priority Message priority.
* @param string $category Type of entry
* @param string $date Date of entry (defaults to now if not specified or blank)
* @param array $context An optional array with additional message context.
*
* @return void
*
* @since 1.7.0
*/
public static function add($entry, $priority = self::INFO, $category = '', $date = null, array $context = array())
{
// Automatically instantiate the singleton object if not already done.
if (empty(static::$instance))
{
static::setInstance(new Log);
}
// If the entry object isn't a LogEntry object let's make one.
if (!($entry instanceof LogEntry))
{
$entry = new LogEntry((string) $entry, $priority, $category, $date, $context);
}
static::$instance->addLogEntry($entry);
}
/**
* Add a logger to the Log instance. Loggers route log entries to the correct files/systems to be logged.
*
* @param array $options The object configuration array.
* @param integer $priorities Message priority
* @param array $categories Types of entry
* @param boolean $exclude If true, all categories will be logged except those in the $categories array
*
* @return void
*
* @since 1.7.0
*/
public static function addLogger(array $options, $priorities = self::ALL, $categories = array(), $exclude = false)
{
// Automatically instantiate the singleton object if not already done.
if (empty(static::$instance))
{
static::setInstance(new Log);
}
static::$instance->addLoggerInternal($options, $priorities, $categories, $exclude);
}
/**
* Add a logger to the Log instance. Loggers route log entries to the correct files/systems to be logged.
* This method allows you to extend Log completely.
*
* @param array $options The object configuration array.
* @param integer $priorities Message priority
* @param array $categories Types of entry
* @param boolean $exclude If true, all categories will be logged except those in the $categories array
*
* @return void
*
* @since 1.7.0
*/
protected function addLoggerInternal(array $options, $priorities = self::ALL, $categories = array(), $exclude = false)
{
// The default logger is the formatted text log file.
if (empty($options['logger']))
{
$options['logger'] = 'formattedtext';
}
$options['logger'] = strtolower($options['logger']);
// Special case - if a Closure object is sent as the callback (in case of CallbackLogger)
// Closure objects are not serializable so swap it out for a unique id first then back again later
if (isset($options['callback']))
{
if (is_a($options['callback'], 'closure'))
{
$callback = $options['callback'];
$options['callback'] = spl_object_hash($options['callback']);
}
elseif (is_array($options['callback']) && count($options['callback']) == 2 && is_object($options['callback'][0]))
{
$callback = $options['callback'];
$options['callback'] = spl_object_hash($options['callback'][0]) . '::' . $options['callback'][1];
}
}
// Generate a unique signature for the Log instance based on its options.
$signature = md5(serialize($options));
// Now that the options array has been serialized, swap the callback back in
if (isset($callback))
{
$options['callback'] = $callback;
}
// Register the configuration if it doesn't exist.
if (empty($this->configurations[$signature]))
{
$this->configurations[$signature] = $options;
}
$this->lookup[$signature] = (object) array(
'priorities' => $priorities,
'categories' => array_map('strtolower', (array) $categories),
'exclude' => (bool) $exclude,
);
}
/**
* Creates a delegated PSR-3 compatible logger from the current singleton instance. This method always returns a new delegated logger.
*
* @return DelegatingPsrLogger
*
* @since 3.8.0
*/
public static function createDelegatedLogger()
{
// Ensure a singleton instance has been created first
if (empty(static::$instance))
{
static::setInstance(new static);
}
return new DelegatingPsrLogger(static::$instance);
}
/**
* Returns a reference to the a Log object, only creating it if it doesn't already exist.
* Note: This is principally made available for testing and internal purposes.
*
* @param Log $instance The logging object instance to be used by the static methods.
*
* @return void
*
* @since 1.7.0
*/
public static function setInstance($instance)
{
if (($instance instanceof Log) || $instance === null)
{
static::$instance = & $instance;
}
}
/**
* Method to add an entry to the appropriate loggers.
*
* @param LogEntry $entry The LogEntry object to send to the loggers.
*
* @return void
*
* @since 1.7.0
* @throws \RuntimeException
*/
protected function addLogEntry(LogEntry $entry)
{
// Find all the appropriate loggers based on priority and category for the entry.
$loggers = $this->findLoggers($entry->priority, $entry->category);
foreach ((array) $loggers as $signature)
{
// Attempt to instantiate the logger object if it doesn't already exist.
if (empty($this->loggers[$signature]))
{
$class = __NAMESPACE__ . '\\Logger\\' . ucfirst($this->configurations[$signature]['logger']) . 'Logger';
if (!class_exists($class))
{
throw new \RuntimeException('Unable to create a Logger instance: ' . $class);
}
$this->loggers[$signature] = new $class($this->configurations[$signature]);
}
// Add the entry to the logger.
$this->loggers[$signature]->addEntry(clone $entry);
}
}
/**
* Method to find the loggers to use based on priority and category values.
*
* @param integer $priority Message priority.
* @param string $category Type of entry
*
* @return array The array of loggers to use for the given priority and category values.
*
* @since 1.7.0
*/
protected function findLoggers($priority, $category)
{
$loggers = array();
// Sanitize inputs.
$priority = (int) $priority;
$category = strtolower($category);
// Let's go iterate over the loggers and get all the ones we need.
foreach ((array) $this->lookup as $signature => $rules)
{
// Check to make sure the priority matches the logger.
if ($priority & $rules->priorities)
{
if ($rules->exclude)
{
// If either there are no set categories or the category (including the empty case) is not in the list of excluded categories, add this logger.
if (empty($rules->categories) || !in_array($category, $rules->categories))
{
$loggers[] = $signature;
}
}
else
{
// If either there are no set categories (meaning all) or the specific category is set, add this logger.
if (empty($rules->categories) || in_array($category, $rules->categories))
{
$loggers[] = $signature;
}
}
}
}
return $loggers;
}
}
home/wuectly/www/libraries/regularlabs/src/Log.php 0000604 00000006175 15245556134 0016333 0 ustar 00 <?php
/**
* @package Regular Labs Library
* @version 21.4.10972
*
* @author Peter van Westen <info@regularlabs.com>
* @link http://www.regularlabs.com
* @copyright Copyright © 2021 Regular Labs All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
namespace RegularLabs\Library;
defined('_JEXEC') or die;
use ActionlogsModelActionlog;
use JLoader;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\MVC\Model\BaseDatabaseModel as JModel;
/**
* Class Log
* @package RegularLabs\Library
*/
class Log
{
public static function add($message, $languageKey, $context)
{
$user = JFactory::getUser();
$message['userid'] = $user->id;
$message['username'] = $user->username;
$message['accountlink'] = 'index.php?option=com_users&task=user.edit&id=' . $user->id;
JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');
JLoader::register('ActionlogsModelActionlog', JPATH_ADMINISTRATOR . '/components/com_actionlogs/models/actionlog.php');
/* @var ActionlogsModelActionlog $model */
$model = JModel::getInstance('Actionlog', 'ActionlogsModel');
$model->addLog([$message], $languageKey, $context, $user->id);
}
public static function save($message, $context, $isNew)
{
$languageKey = $isNew ? 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED' : 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED';
$message['action'] = $isNew ? 'add' : 'update';
self::add($message, $languageKey, $context);
}
public static function delete($message, $context)
{
$languageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED';
$message['action'] = 'deleted';
self::add($message, $languageKey, $context);
}
public static function changeState($message, $context, $value)
{
switch ($value)
{
case 0:
$languageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UNPUBLISHED';
$message['action'] = 'unpublish';
break;
case 1:
$languageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_PUBLISHED';
$message['action'] = 'publish';
break;
case 2:
$languageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ARCHIVED';
$message['action'] = 'archive';
break;
case -2:
$languageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_TRASHED';
$message['action'] = 'trash';
break;
default:
return;
}
self::add($message, $languageKey, $context);
}
public static function install($message, $context, $type = 'component')
{
$languageKey = 'PLG_ACTIONLOG_JOOMLA_' . strtoupper($type) . '_INSTALLED';
if ( ! JFactory::getApplication()->getLanguage()->hasKey($languageKey))
{
$languageKey = 'PLG_ACTIONLOG_JOOMLA_EXTENSION_INSTALLED';
}
$message['action'] = 'install';
$message['type'] = 'PLG_ACTIONLOG_JOOMLA_TYPE_' . strtoupper($type);
self::add($message, $languageKey, $context);
}
public static function uninstall($message, $context, $type = 'component')
{
$languageKey = 'PLG_ACTIONLOG_JOOMLA_EXTENSION_UNINSTALLED';
$message['action'] = 'uninstall';
$message['type'] = 'PLG_ACTIONLOG_JOOMLA_TYPE_' . strtoupper($type);
self::add($message, $languageKey, $context);
}
}
home/wuectly/www/administrator/components/com_akeeba/Controller/Log.php 0000604 00000006414 15245630316 0022512 0 ustar 00 <?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
namespace Akeeba\Backup\Admin\Controller;
// Protect from unauthorized access
defined('_JEXEC') || die();
use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Controller\Mixin\PredefinedTaskList;
use Akeeba\Backup\Admin\Model\Log as LogModel;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Controller\Controller;
class Log extends Controller
{
use CustomACL {
CustomACL::onBeforeExecute as onCustomACLBeforeExecute;
}
/** @var bool */
private $noFlush = false;
protected function onBeforeExecute(&$task)
{
$this->onCustomACLBeforeExecute($task);
$profile_id = $this->input->getInt('profileid', null);
if (!empty($profile_id) && is_numeric($profile_id) && ($profile_id > 0))
{
$this->container->platform->setSessionVar('profile', $profile_id, 'akeeba');
}
}
/**
* Display the log page
*
* @return void
*/
public function onBeforeDefault()
{
$tag = $this->input->get('tag', null, 'cmd');
$latest = $this->input->get('latest', false, 'int');
if (empty($tag))
{
$tag = null;
}
/** @var LogModel $model */
$model = $this->getModel();
if ($latest)
{
$logFiles = $model->getLogFiles();
$tag = array_shift($logFiles);
}
$model->setState('tag', $tag);
Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());
}
/**
* Renders the contents of the log, used inside the IFRAME of the log page
*
* @return void
*/
public function iframe()
{
$tag = $this->input->get('tag', null, 'cmd');
if (empty($tag))
{
$tag = null;
}
/** @var LogModel $model */
$model = $this->getModel();
$model->setState('tag', $tag);
Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());
$this->display();
}
/**
* Download the log file as a text file
*
* @return void
*/
public function download()
{
Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());
$tag = $this->input->get('tag', null, 'cmd');
if (empty($tag))
{
$tag = null;
}
$asAttachment = $this->input->getBool('attachment', true);
@ob_end_clean(); // In case some braindead plugin spits its own HTML
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Content-Description: File Transfer");
header('Content-Type: text/plain');
if ($asAttachment)
{
header('Content-Disposition: attachment; filename="Akeeba Backup Debug Log.txt"');
}
/** @var LogModel $model */
$model = $this->getModel();
$model->setState('tag', $tag);
$model->echoRawLog();
if (!$this->noFlush)
{
flush();
}
$this->container->platform->closeApplication();
}
public function inlineRaw()
{
Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());
$tag = $this->input->get('tag', null, 'cmd');
if (empty($tag))
{
$tag = null;
}
/** @var LogModel $model */
$model = $this->getModel();
$model->setState('tag', $tag);
echo "<pre>";
$model->echoRawLog();
echo "</pre>";
}
}
home/wuectly/www/administrator/components/com_akeeba/Model/Log.php 0000604 00000012177 15245630440 0021430 0 ustar 00 <?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
namespace Akeeba\Backup\Admin\Model;
// Protect from unauthorized access
defined('_JEXEC') || die();
use Akeeba\Engine\Factory;
use FOF40\Model\Model;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
class Log extends Model
{
/**
* Get an array with the names of all log files in this backup profile
*
* @param bool $onlyFailed Should I only return the log files of backups marked as failed?
*
* @return string[]
*/
public function getLogFiles(bool $onlyFailed = false): array
{
$configuration = Factory::getConfiguration();
$outdir = $configuration->get('akeeba.basic.output_directory');
$files = Factory::getFileLister()->getFiles($outdir);
$ret = [];
if (!empty($files) && is_array($files))
{
foreach ($files as $filename)
{
$baseName = basename($filename);
$startsWithAkeeba = substr($baseName, 0, 7) == 'akeeba.';
$endsWithLog = substr($baseName, -4) == '.log';
$endsWithPhpLog = substr($baseName, -8) == '.log.php';
$isDefaultLog = $baseName == 'akeeba.log';
if ($startsWithAkeeba && ($endsWithLog || $endsWithPhpLog) && !$isDefaultLog)
{
/**
* Extract the tag from the filename (akeeba.tag.log or akeeba.tag.log.php)
*
* We ignore the first seven characters ("akeeba.") and the last X characters, where X is 8 if the
* log file name ends with .log.php or 4 if the log name ends with .log.
*/
$tag = substr($baseName, 7, -($endsWithPhpLog ? 8 : 4));
if (empty($tag))
{
continue;
}
$parts = explode('.', $tag);
$key = array_pop($parts);
$key = str_replace('id', '', $key);
$key = is_numeric($key) ? sprintf('%015u', $key) : $key;
if (empty($parts))
{
$key = str_repeat('0', 15) . '.' . $key;
}
else
{
$key .= '.' . implode('.', $parts);
}
$ret[$key] = $tag;
}
}
}
if ($onlyFailed)
{
$ret = $this->keepOnlyFailedLogs($ret);
}
krsort($ret);
return $ret;
}
/**
* Gets the JHtml options list for selecting a log file
*
* @param bool $onlyFailed Should I only return the log files of backups marked as failed?
*
* @return array
*/
public function getLogList(bool $onlyFailed = false): array
{
$origin = null;
$options = [];
$list = $this->getLogFiles($onlyFailed);
if (!empty($list))
{
$options[] = HTMLHelper::_('select.option', null, Text::_('COM_AKEEBA_LOG_CHOOSE_FILE_VALUE'));
foreach ($list as $item)
{
$text = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_' . $item);
if (strstr($item, '.') !== false)
{
[$origin, $backupId] = explode('.', $item, 2);
$text = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_' . $origin) . ' (' . $backupId . ')';
}
$options[] = HTMLHelper::_('select.option', $item, $text);
}
}
return $options;
}
/**
* Output the raw text log file to the standard output without the PHP die header
*
* @param bool $withHeader Should I include a header telling the user how to submit this file?
*
* @return void
*/
public function echoRawLog($withHeader = true)
{
$tag = $this->getState('tag', '');
$logFile = Factory::getLog()->getLogFilename($tag);
if (!@is_file($logFile) && @file_exists(substr($logFile, 0, -4)))
{
/**
* Transitional period: the log file akeeba.tag.log.php may not exist but the akeeba.tag.log does. This
* addresses this transition.
*/
$logFile = substr($logFile, 0, -4);
}
if ($withHeader)
{
echo "WARNING: Do not copy and paste lines from this file!\r\n";
echo "You are supposed to ZIP and attach it in your support forum post.\r\n";
echo "If you fail to do so, we will be unable to provide efficient support.\r\n";
echo "\r\n";
echo "--- START OF RAW LOG --\r\n";
}
// The at sign (silence operator) is necessary to prevent PHP showing a warning if the file doesn't exist or
// isn't readable for any reason.
$fp = @fopen($logFile, 'r');
if ($fp === false)
{
if ($withHeader)
{
echo "--- END OF RAW LOG ---\r\n";
}
return;
}
$firstLine = @fgets($fp);
if (substr($firstLine, 0, 5) != '<' . '?' . 'php')
{
@fclose($fp);
@readfile($logFile);
}
else
{
while (!feof($fp))
{
echo rtrim(fgets($fp)) . "\r\n";
}
@fclose($fp);
}
if ($withHeader)
{
echo "--- END OF RAW LOG ---\r\n";
}
}
protected function keepOnlyFailedLogs($logs)
{
$db = $this->container->db;
$query = $db->getQuery(true)
->select([
$db->quoteName('tag'),
$db->quoteName('backupid'),
])
->from($db->quoteName('#__ak_stats'))
->where($db->quoteName('status') . ' = ' . $db->quote('fail'));
$failedBackups = $db->setQuery($query)->loadObjectList() ?: [];
if (empty($failedBackups))
{
return [];
}
$failedBackups = array_map(function ($o) {
$tag = $o->tag ?? '';
return (empty($tag) ? '' : '.') . $o->backupid;
}, $failedBackups);
return array_intersect($logs, $failedBackups);
}
}