예제 #1
0
파일: plugin.php 프로젝트: spip/SPIP
/**
 * Calcule ou modifie la liste des plugins actifs et recompile les fichiers caches
 * qui leurs sont relatifs
 *
 * @note
 *   Les  ecrire_meta() doivent en principe aussi initialiser la valeur a vide
 *   si elle n'existe pas risque de pb en php5 a cause du typage ou de null
 *   (verifier dans la doc php)
 *
 * @param string|string[] $plugin
 *     Plugin ou plugins concernés (leur chemin depuis le répertoire plugins)
 * @param bool $pipe_recherche
 *     ?
 * @param string $operation
 *     - raz : recalcule tout
 *     - ajoute : ajoute le plugin indiqué à la liste des plugins actifs
 *     - enleve : enleve le plugin indiqué de la liste des plugins actifs
 *     - force  : ?
 * @return bool
 *     true si il y a eu des modifications sur la liste des plugins actifs, false sinon
 **/
function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz')
{
    // creer le repertoire cache/ si necessaire ! (installation notamment)
    $cache = sous_repertoire(_DIR_CACHE, '', false, true);
    // Si on n'a ni cache accessible, ni connexion SQL, on ne peut pas faire grand chose encore.
    if (!$cache and !spip_connect()) {
        return false;
    }
    if ($operation != 'raz') {
        $plugin_valides = liste_chemin_plugin_actifs();
        $plugin_valides = is_plugin_dir($plugin_valides);
        if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) {
            $plugin_valides_supp = liste_chemin_plugin_actifs(_DIR_PLUGINS_SUPPL);
            $plugin_valides_supp = is_plugin_dir($plugin_valides_supp, _DIR_PLUGINS_SUPPL);
            $plugin_valides = array_merge($plugin_valides, $plugin_valides_supp);
        }
        // si des plugins sont en attentes (coches mais impossible a activer)
        // on les reinjecte ici
        if (isset($GLOBALS['meta']['plugin_attente']) and $a = unserialize($GLOBALS['meta']['plugin_attente'])) {
            $plugin_valides = $plugin_valides + liste_chemin_plugin($a);
        }
        if ($operation == 'ajoute') {
            $plugin = array_merge($plugin_valides, $plugin);
        } elseif ($operation == 'enleve') {
            $plugin = array_diff($plugin_valides, $plugin);
        } else {
            $plugin = $plugin_valides;
        }
    }
    $actifs_avant = isset($GLOBALS['meta']['plugin']) ? $GLOBALS['meta']['plugin'] : '';
    // si une fonction de gestion de dependances existe, l'appeler ici
    if ($ajouter_dependances = charger_fonction("ajouter_dependances", "plugins", true)) {
        $plugin = $ajouter_dependances($plugin);
    }
    // recharger le xml des plugins a activer
    // on forcer le reload ici, meme si le fichier xml n'a pas change
    // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations
    // pourra etre evite quand on ne supportera plus les plugin.xml
    // en deplacant la detection de ces fichiers dans la compilation ci dessous
    list($infos, $liste) = liste_plugin_valides($plugin, true);
    // trouver l'ordre d'activation
    list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste);
    if ($reste) {
        plugins_erreurs($reste, $liste, $infos);
    }
    // Ignorer les plugins necessitant une lib absente
    // et preparer la meta d'entete Http
    $err = $msg = $header = array();
    foreach ($plugin_valides as $p => $resume) {
        $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : "");
        if ($resume['dir']) {
            foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) {
                if (!find_in_path($l['nom'], 'lib/')) {
                    $err[$p] = $resume;
                    $msg[$p][] = $l;
                    unset($plugin_valides[$p]);
                }
            }
        }
    }
    if ($err) {
        plugins_erreurs($err, '', $infos, $msg);
    }
    if (isset($GLOBALS['meta']['message_crash_plugins'])) {
        effacer_meta('message_crash_plugins');
    }
    ecrire_meta('plugin', serialize($plugin_valides));
    $liste = array_diff_key($liste, $plugin_valides);
    ecrire_meta('plugin_attente', serialize($liste));
    $header = strtolower(implode(",", $header));
    ecrire_meta('plugin_header', substr($header, 0, 900));
    if (!isset($GLOBALS['spip_header_silencieux']) or !$GLOBALS['spip_header_silencieux']) {
        ecrire_fichier(_DIR_VAR . "config.txt", (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : "Composed-By: SPIP") . ' ' . $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header);
    } else {
        @unlink(_DIR_VAR . "config.txt");
    }
    // generer charger_plugins_chemin.php
    plugins_precompile_chemin($plugin_valides, $ordre);
    // generer les fichiers
    // 	charger_plugins_options.php
    // 	charger_plugins_fonctions.php
    // et retourner les fichiers a verifier
    plugins_precompile_xxxtions($plugin_valides, $ordre);
    // mise a jour de la matrice des pipelines
    $prepend_code = pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche);
    // generer le fichier _CACHE_PIPELINE
    pipeline_precompile($prepend_code);
    // attendre eventuellement l'invalidation du cache opcode
    spip_attend_invalidation_opcode_cache();
    if (spip_connect()) {
        // lancer et initialiser les nouveaux crons !
        include_spip('inc/genie');
        genie_queue_watch_dist();
    }
    return $GLOBALS['meta']['plugin'] != $actifs_avant;
}
예제 #2
0
파일: plugin.php 프로젝트: nursit/SPIP
function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz')
{
    // creer le repertoire cache/ si necessaire ! (installation notamment)
    sous_repertoire(_DIR_CACHE, '', false, true);
    if (!spip_connect()) {
        return false;
    }
    if ($operation != 'raz') {
        $plugin_valides = liste_chemin_plugin_actifs();
        // si des plugins sont en attentes (coches mais impossible a activer)
        // on les reinjecte ici
        if (isset($GLOBALS['meta']['plugin_attente']) and $a = unserialize($GLOBALS['meta']['plugin_attente'])) {
            $plugin_valides = $plugin_valides + liste_chemin_plugin($a);
        }
        $plugin_valides = is_plugin_dir($plugin_valides);
        if ($operation == 'ajoute') {
            $plugin = array_merge($plugin_valides, $plugin);
        } elseif ($operation == 'enleve') {
            $plugin = array_diff($plugin_valides, $plugin);
        } else {
            $plugin = $plugin_valides;
        }
    }
    $actifs_avant = $GLOBALS['meta']['plugin'];
    // recharger le xml des plugins a activer
    // on forcer le reload ici, meme si le fichier xml n'a pas change
    // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations
    // pourra etre evite quand on ne supportera plus les plugin.xml
    // en deplacant la detection de ces fichiers dans la compilation ci dessous
    list($infos, $liste) = liste_plugin_valides($plugin, true);
    // trouver l'ordre d'activation
    list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste);
    if ($reste) {
        plugins_erreurs($reste, $liste, $infos);
    }
    // Ignorer les plugins necessitant une lib absente
    // et preparer la meta d'entete Http
    $err = $msg = $header = array();
    foreach ($plugin_valides as $p => $resume) {
        $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : "");
        if ($resume['dir']) {
            foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) {
                if (!find_in_path($l['nom'], 'lib/')) {
                    $err[$p] = $resume;
                    $msg[$p][] = $l;
                    unset($plugin_valides[$p]);
                }
            }
        }
    }
    if ($err) {
        plugins_erreurs($err, '', $infos, $msg);
    }
    if (isset($GLOBALS['meta']['message_crash_plugins'])) {
        effacer_meta('message_crash_plugins');
    }
    ecrire_meta('plugin', serialize($plugin_valides));
    $liste = array_diff_key($liste, $plugin_valides);
    ecrire_meta('plugin_attente', serialize($liste));
    ecrire_meta('plugin_header', substr(strtolower(implode(",", $header)), 0, 900));
    // generer charger_plugins_chemin.php
    plugins_precompile_chemin($plugin_valides, $ordre);
    // generer les fichiers
    // 	charger_plugins_options.php
    // 	charger_plugins_fonctions.php
    // et retourner les fichiers a verifier
    plugins_precompile_xxxtions($plugin_valides, $ordre);
    // mise a jour de la matrice des pipelines
    pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche);
    // generer le fichier _CACHE_PIPELINE
    pipeline_precompile();
    // lancer et initialiser les nouveaux crons !
    include_spip('inc/genie');
    genie_queue_watch_dist();
    return $GLOBALS['meta']['plugin'] != $actifs_avant;
}