Seditio Source
Root |
./othercms/dotclear-2.22/plugins/maintenance/inc/class.dc.maintenance.php
<?php
/**
 * @brief maintenance, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
if (!defined('DC_RC_PATH')) {
    return;
}

/**
Main class to call everything related to maintenance.
 */
class dcMaintenance
{
    public
$core;
    public
$p_url;

    private
$tasks  = [];
    private
$tabs   = [];
    private
$groups = [];
    private
$logs   = null;

   
/**
     * Constructor.
     *
     * @param    dcCore    $core    dcCore instance
     */
   
public function __construct(dcCore $core)
    {
       
$this->core  = $core;
       
$this->p_url = $core->adminurl->get('admin.plugin.maintenance');
       
$logs        = $this->getLogs();
       
$this->init();
    }

   
/**
     * Initialize list of tabs and groups and tasks.
     *
     * To register a tab or group or task,
     * use behavior dcMaintenanceInit then a method of
     * dcMaintenance like addTab('myTab', ...).
     */
   
protected function init()
    {
       
# --BEHAVIOR-- dcMaintenanceInit
       
$this->core->callBehavior('dcMaintenanceInit', $this);
    }

   
/// @name Tab methods
    //@{
    /**
     * Adds a tab.
     *
     * @param      string  $id       The identifier
     * @param      string  $name     The name
     * @param      array   $options  The options
     *
     * @return     self
     */
   
public function addTab($id, $name, $options = [])
    {
       
$this->tabs[$id] = new dcMaintenanceDescriptor($id, $name, $options);

        return
$this;
    }

   
/**
     * Gets the tab.
     *
     * @param      string  $id     The identifier
     *
     * @return     dcMaintenanceDescriptor|null  The tab.
     */
   
public function getTab($id)
    {
        return
array_key_exists($id, $this->tabs) ? $this->tabs[$id] : null;
    }

   
/**
     * Gets the tabs.
     *
     * @return     array  The tabs.
     */
   
public function getTabs()
    {
        return
$this->tabs;
    }
   
//@}

    /// @name Group methods
    //@{
    /**
     * Adds a group.
     *
     * @param      string  $id       The identifier
     * @param      string  $name     The name
     * @param      array   $options  The options
     *
     * @return     self
     */
   
public function addGroup($id, $name, $options = [])
    {
       
$this->groups[$id] = new dcMaintenanceDescriptor($id, $name, $options);

        return
$this;
    }

   
/**
     * Gets the group.
     *
     * @param      string  $id     The identifier
     *
     * @return     dcMaintenanceDescriptor|null  The group.
     */
   
public function getGroup($id)
    {
        return
array_key_exists($id, $this->groups) ? $this->groups[$id] : null;
    }

   
/**
     * Gets the groups.
     *
     * @return     array  The groups.
     */
   
public function getGroups()
    {
        return
$this->groups;
    }
   
//@}

    /// @name Task methods
    //@{
    /**
     * Adds a task.
     *
     * @param      mixed  $task   The task, Class name or object
     *
     * @return     self
     */
   
public function addTask($task)
    {
        if (
class_exists($task) && is_subclass_of($task, 'dcMaintenanceTask')) {
           
$this->tasks[$task] = new $task($this);
        }

        return
$this;
    }

   
/**
     * Gets the task.
     *
     * @param      string  $id     The identifier
     *
     * @return     mixed  The task.
     */
   
public function getTask($id)
    {
        return
array_key_exists($id, $this->tasks) ? $this->tasks[$id] : null;
    }

   
/**
     * Gets the tasks.
     *
     * @return     array  The tasks.
     */
   
public function getTasks()
    {
        return
$this->tasks;
    }

   
/**
     * Gets the headers for plugin maintenance admin page.
     *
     * @return     string  The headers.
     */
   
public function getHeaders()
    {
       
$res = '';
        foreach (
$this->tasks as $task) {
           
$res .= $task->header();
        }

        return
$res;
    }
   
//@}

    /// @name Log methods
    //@{
    /**
     * Sets the log for a task.
     *
     * @param      string  $id     Task ID
     */
   
public function setLog($id)
    {
       
// Check if taks exists
       
if (!$this->getTask($id)) {
            return;
        }

       
// Get logs from this task
       
$rs = $this->core->con->select(
           
'SELECT log_id ' .
           
'FROM ' . $this->core->prefix . 'log ' .
           
"WHERE log_msg = '" . $this->core->con->escape($id) . "' " .
           
"AND log_table = 'maintenance' "
       
);

       
$logs = [];
        while (
$rs->fetch()) {
           
$logs[] = $rs->log_id;
        }

       
// Delete old logs
       
if (!empty($logs)) {
           
$this->core->log->delLogs($logs);
        }

       
// Add new log
       
$cur = $this->core->con->openCursor($this->core->prefix . 'log');

       
$cur->log_msg   = $id;
       
$cur->log_table = 'maintenance';
       
$cur->user_id   = $this->core->auth->userID();

       
$this->core->log->addLog($cur);
    }

   
/**
     * Delete all maintenance logs.
     */
   
public function delLogs()
    {
       
// Retrieve logs from this task
       
$rs = $this->core->log->getLogs([
           
'log_table' => 'maintenance',
           
'blog_id'   => '*',
        ]);

       
$logs = [];
        while (
$rs->fetch()) {
           
$logs[] = $rs->log_id;
        }

       
// Delete old logs
       
if (!empty($logs)) {
           
$this->core->log->delLogs($logs);
        }
    }

   
/**
     * Get logs
     *
     * Return [
     *        task id => [
     *            timestamp of last execution,
     *            logged on current blog or not
     *        ]
     * ]
     *
     * @return    array List of logged tasks
     */
   
public function getLogs()
    {
        if (
$this->logs === null) {
           
$rs = $this->core->log->getLogs([
               
'log_table' => 'maintenance',
               
'blog_id'   => '*',
            ]);

           
$this->logs = [];
            while (
$rs->fetch()) {
               
$this->logs[$rs->log_msg] = [
                   
'ts'   => strtotime($rs->log_dt),
                   
'blog' => $rs->blog_id == $this->core->blog->id,
                ];
            }
        }

        return
$this->logs;
    }
   
//@}
}