/**
  * Effacer les fichiers d'un paquet
  *
  * @param array $info
  *     Description courte du paquet
  * @return bool
  *     false si erreur, true sinon
  */
 public function do_kill($info)
 {
     // on reverifie que c'est bien un plugin auto !
     // il faudrait aussi faire tres attention sur un site mutualise
     // cette option est encore plus delicate que les autres...
     $i = sql_fetsel('*', 'spip_paquets', 'id_paquet=' . sql_quote($info['i']));
     if (in_array($i['constante'], array('_DIR_PLUGINS', '_DIR_PLUGINS_SUPPL')) and substr($i['src_archive'], 0, 5) == 'auto/') {
         $dir = constant($i['constante']) . $i['src_archive'];
         if (supprimer_repertoire($dir)) {
             $id_plugin = sql_getfetsel('id_plugin', 'spip_paquets', 'id_paquet=' . sql_quote($info['i']));
             // on supprime le paquet
             sql_delete('spip_paquets', 'id_paquet=' . sql_quote($info['i']));
             // ainsi que le plugin s'il n'est plus utilise
             $utilise = sql_allfetsel('pl.id_plugin', array('spip_paquets AS pa', 'spip_plugins AS pl'), array('pa.id_plugin = pl.id_plugin', 'pa.id_plugin=' . sql_quote($id_plugin)));
             if (!$utilise) {
                 sql_delete('spip_plugins', 'id_plugin=' . sql_quote($id_plugin));
             } else {
                 // on met a jour d'eventuels obsoletes qui ne le sont plus maintenant
                 // ie si on supprime une version superieure à une autre qui existe en local...
                 include_spip('inc/svp_depoter_local');
                 svp_corriger_obsolete_paquets(array($id_plugin));
             }
             // on tente un nettoyage jusqu'a la racine de auto/
             // si la suppression concerne une profondeur d'au moins 2
             // et que les repertoires sont vides
             $chemins = explode('/', $i['src_archive']);
             // auto / prefixe / version
             // le premier c'est auto
             array_shift($chemins);
             // le dernier est deja fait...
             array_pop($chemins);
             // entre les deux...
             while (count($chemins)) {
                 $vide = true;
                 $dir = constant($i['constante']) . 'auto/' . implode('/', $chemins);
                 $fichiers = scandir($dir);
                 if ($fichiers) {
                     foreach ($fichiers as $f) {
                         if ($f[0] != '.') {
                             $vide = false;
                             break;
                         }
                     }
                 }
                 // on tente de supprimer si c'est effectivement vide.
                 if ($vide and !supprimer_repertoire($dir)) {
                     break;
                 }
                 array_pop($chemins);
             }
             return true;
         }
     }
     return false;
 }
Example #2
0
/**
 * Insère en base tous les paquets locaux transmis
 *
 * De chaque description est extrait la partie plugin (1 seul plugin
 * par préfixe de plugin connu) et la partie paquet (il peut y avoir plusieurs
 * paquets pour un même préfixe de plugin).
 * 
 * @note
 *     On essaie au mieux de faire des requêtes d'insertions multiples,
 *     mieux gérées par les moteurs SQL (particulièrement pour SQLite)
 * 
 * @param array $paquets_locaux
 *     Descriptions des paquets (intégrant un hash), stockés par
 *     constante, puis par chemin.
 *     array[_DIR_PLUGIN*][$chemin] = description
**/
function svp_base_inserer_paquets_locaux($paquets_locaux)
{
    include_spip('inc/svp_depoter_distant');
    // On initialise les informations specifiques au paquet :
    // l'id du depot et les infos de l'archive
    $paquet_base = array('id_depot' => 0, 'nom_archive' => '', 'nbo_archive' => '', 'maj_archive' => '', 'src_archive' => '', 'date_modif' => '', 'maj_version' => '', 'signature' => '');
    $preparer_sql_paquet = charger_fonction('preparer_sql_paquet', 'plugins');
    // pour chaque decouverte, on insere les paquets en base.
    // on evite des requetes individuelles, tres couteuses en sqlite...
    $cle_plugins = array();
    // prefixe => id
    $insert_plugins = array();
    // insertion prefixe...
    $insert_plugins_vmax = array();
    // vmax des nouveaux plugins...
    $insert_paquets = array();
    // insertion de paquet...
    include_spip('inc/config');
    $recents = lire_config('plugins_interessants');
    $installes = lire_config('plugin_installes');
    $actifs = lire_config('plugin');
    $attentes = lire_config('plugin_attente');
    foreach ($paquets_locaux as $const_dir => $paquets) {
        foreach ($paquets as $chemin => $paquet) {
            // Si on est en presence d'un plugin dont la dtd est "paquet" on compile en multi
            // les nom, slogan et description a partir des fichiers de langue.
            // De cette façon, les informations des plugins locaux et distants seront identiques
            // => On evite l'utilisation de _T() dans les squelettes
            if ($paquet['dtd'] == 'paquet') {
                $multis = svp_compiler_multis($paquet['prefix'], constant($const_dir) . '/' . $chemin);
                if (isset($multis['nom'])) {
                    $paquet['nom'] = $multis['nom'];
                }
                $paquet['slogan'] = isset($multis['slogan']) ? $multis['slogan'] : '';
                $paquet['description'] = isset($multis['description']) ? $multis['description'] : '';
            }
            $le_paquet = $paquet_base;
            #$le_paquet['traductions'] = serialize($paquet['traductions']);
            if ($champs = $preparer_sql_paquet($paquet)) {
                // Eclater les champs recuperes en deux sous tableaux, un par table (plugin, paquet)
                $champs = eclater_plugin_paquet($champs);
                $paquet_plugin = true;
                // On complete les informations du paquet et du plugin
                $le_paquet = array_merge($le_paquet, $champs['paquet']);
                $le_plugin = $champs['plugin'];
                // On loge l'absence de categorie ou une categorie erronee et on positionne la categorie par defaut "aucune"
                if (!$le_plugin['categorie']) {
                    $le_plugin['categorie'] = 'aucune';
                } else {
                    if (!in_array($le_plugin['categorie'], $GLOBALS['categories_plugin'])) {
                        $le_plugin['categorie'] = 'aucune';
                    }
                }
                // creation du plugin...
                $prefixe = strtoupper($le_plugin['prefixe']);
                // on fait attention lorqu'on cherche ou ajoute un plugin
                // le nom et slogan est TOUJOURS celui de la plus haute version
                // et il faut donc possiblement mettre a jour la base...
                //
                // + on est tolerant avec les versions identiques de plugin deja presentes
                //   on permet le recalculer le titre...
                if (!isset($cle_plugins[$prefixe])) {
                    if (!($res = sql_fetsel('id_plugin, vmax', 'spip_plugins', 'prefixe = ' . sql_quote($prefixe)))) {
                        // on ne stocke pas de vmax pour les plugins locaux dans la bdd... (parait il)
                        if (!isset($insert_plugins[$prefixe])) {
                            $insert_plugins[$prefixe] = $le_plugin;
                            $insert_plugins_vmax[$prefixe] = $le_paquet['version'];
                        } elseif (spip_version_compare($le_paquet['version'], $insert_plugins_vmax[$prefixe], '>')) {
                            $insert_plugins[$prefixe] = $le_plugin;
                            $insert_plugins_vmax[$prefixe] = $le_paquet['version'];
                        }
                    } else {
                        $id_plugin = $res['id_plugin'];
                        $cle_plugins[$prefixe] = $id_plugin;
                        // comme justement on ne stocke pas de vmax pour les plugins locaux...
                        // il est possible que ce test soit faux. pff.
                        if (spip_version_compare($le_paquet['version'], $res['vmax'], '>=')) {
                            sql_updateq('spip_plugins', $le_plugin, 'id_plugin=' . sql_quote($id_plugin));
                        }
                    }
                }
                // ajout du prefixe dans le paquet
                $le_paquet['prefixe'] = $prefixe;
                $le_paquet['constante'] = $const_dir;
                $le_paquet['src_archive'] = $chemin;
                $le_paquet['recent'] = isset($recents[$chemin]) ? $recents[$chemin] : 0;
                $le_paquet['installe'] = in_array($chemin, $installes) ? 'oui' : 'non';
                // est desinstallable ?
                $le_paquet['obsolete'] = 'non';
                $le_paquet['signature'] = $paquet['signature'];
                // le plugin est il actuellement actif ?
                $actif = "non";
                if (isset($actifs[$prefixe]) and $actifs[$prefixe]['dir_type'] == $const_dir and $actifs[$prefixe]['dir'] == $chemin) {
                    $actif = "oui";
                }
                $le_paquet['actif'] = $actif;
                // le plugin etait il actif mais temporairement desactive
                // parce qu'une dependence a disparue ?
                $attente = "non";
                if (isset($attentes[$prefixe]) and $attentes[$prefixe]['dir_type'] == $const_dir and $attentes[$prefixe]['dir'] == $chemin) {
                    $attente = "oui";
                    $le_paquet['actif'] = "oui";
                    // il est presenté dans la liste des actifs (en erreur).
                }
                $le_paquet['attente'] = $attente;
                // on recherche d'eventuelle mises a jour existantes
                if ($maj_version = svp_rechercher_maj_version($prefixe, $le_paquet['version'], $le_paquet['etatnum'])) {
                    $le_paquet['maj_version'] = $maj_version;
                }
                $insert_paquets[] = $le_paquet;
            }
        }
    }
    if ($insert_plugins) {
        sql_insertq_multi('spip_plugins', $insert_plugins);
        $pls = sql_allfetsel(array('id_plugin', 'prefixe'), 'spip_plugins', sql_in('prefixe', array_keys($insert_plugins)));
        foreach ($pls as $p) {
            $cle_plugins[$p['prefixe']] = $p['id_plugin'];
        }
    }
    if ($insert_paquets) {
        // sert pour le calcul d'obsolescence
        $id_plugin_concernes = array();
        foreach ($insert_paquets as $c => $p) {
            $insert_paquets[$c]['id_plugin'] = $cle_plugins[$p['prefixe']];
            $id_plugin_concernes[$insert_paquets[$c]['id_plugin']] = true;
            // remettre les necessite, utilise, librairie dans la cle 0
            // comme SVP
            if ($dep = unserialize($insert_paquets[$c]['dependances']) and is_array($dep)) {
                foreach ($dep as $d => $contenu) {
                    if ($contenu) {
                        $new = array();
                        foreach ($contenu as $n) {
                            unset($n['id']);
                            $new[strtolower($n['nom'])] = $n;
                        }
                        $dep[$d] = array($new);
                    }
                }
                $insert_paquets[$c]['dependances'] = serialize($dep);
            }
        }
        sql_insertq_multi('spip_paquets', $insert_paquets);
        svp_corriger_obsolete_paquets(array_keys($id_plugin_concernes));
    }
}