Changeset 110776 in spip-zone


Ignore:
Timestamp:
Jun 20, 2018, 3:22:46 PM (3 years ago)
Author:
marcimat@…
Message:
  • Pouvoir remettre le chemin de travail à la racine du SPIP facilement

(Spip Cli, remet le répertoire de travail sur le lieu d’exécution du script après avoir chargé SPIP, ce que je ne trouve pas très pratique)

  • Lorsqu’on charge spip-cli depuis un répertoire de travail qui est dans une arborescence d’un site mutualisé, ie: si on est dans "sites/domaine.tld" ou "sites/domaine.tld/qqc", alors on tente de définir $_SERVER['HTTP_HOST']

avant de démarrer le SPIP, pour que celui-ci démarre la mutualisation sur le bon site.
Pour cela, on essaie de trouver un sites/domaine.tld/config/connect.php valide, on s’y connecte avec PDO pour trouver l’adresse du site,
qui sert alors à calculer le HOST.
On affiche le host utilisé (mais c’est pas très joli).

Location:
_outils_/spip-cli/trunk/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _outils_/spip-cli/trunk/src/Application.php

    r110765 r110776  
    3737                        'spip.webmestre.nom' => '',
    3838                        'spip.webmestre.login.prefixe' => 'SpipCli-',
     39                        'cwd' => getcwd()
    3940                ]);
    4041
     
    7172                };
    7273                $app['spip.sql'] = function ($app) {
    73                         $connect = $app['spip.loader']->getPathconnect();
     74                        $connect = $app['spip.loader']->getPathConnect();
    7475                        if (!is_file($connect)) {
    7576                                throw new \Exception('SPIP database is not configured');
  • _outils_/spip-cli/trunk/src/Command/TestSpipCommand.php

    r110768 r110776  
    6868                        $spip = $this->getApplication()->getService('spip.loader');
    6969                        $spip->load();
     70                        $spip->chdir(); // grml
    7071                } catch (\Exception $e) {
    7172                        $io->fail('Chargement de SPIP en erreur !');
  • _outils_/spip-cli/trunk/src/Loader/Spip.php

    r110768 r110776  
    1919        protected $connect = 'config/connect.php';
    2020
     21        /** @var string Nom du répertoire théorique des sites, si mutualisation */
     22        protected $dir_sites = 'sites';
     23
    2124        /** @var string */
    2225        private $directory;
     
    3841                if (is_null($directory)) {
    3942                        $directory = $this->chercher_racine_spip();
    40                 }
    41                 $this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
     43                        if ($directory) {
     44                                $this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
     45                                $this->trouver_host_si_mutualisation();
     46                        }
     47                } else {
     48                        $this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
     49                }
    4250        }
    4351
     
    7078
    7179        /**
     80         * Si le répertoire d’exécution de spip-cli est dans un site mutualisé,
     81         * ie quelque part dans `sites/truc.tld/qqc`, alors, déclarer à SPIP l’adresse
     82         * du site concerné (dans http_host), si on arrive à le calculer
     83         * (en se connectant au sql du site via PDO)
     84         *
     85         * @return bool
     86         */
     87        private function trouver_host_si_mutualisation() {
     88                // si le host a déjà été défini, ne rien tenter.
     89                if (!empty($_SERVER['HTTP_HOST'])) {
     90                        return false;
     91                }
     92                // Si pas de répertoire 'sites', pas la peine de chercher...
     93                $cwd = explode(DIRECTORY_SEPARATOR, getcwd());
     94                if (!in_array($this->dir_sites, $cwd)) {
     95                        return false;
     96                }
     97                // On suppose que les fichiers de travail d’un site mutualisé,
     98                // est un répertoire enfant du répertoire 'sites' (ie: sites/domaine.tld).
     99                // On cherche un connecteur SQL dedans (ie: sites/domaine.tld/config/connect.php)
     100                // On l’utilise pour se connecter à la bdd et retrouver l’adresse du site.
     101                $previous = null;
     102                foreach (array_reverse($cwd) as $dir) {
     103                        if ($dir === $this->dir_sites and $previous) {
     104                                $connect_file = $this->getPathFile($this->dir_sites . DIRECTORY_SEPARATOR . $previous . DIRECTORY_SEPARATOR . $this->connect);
     105                                if (file_exists($connect_file)) {
     106                                        try {
     107                                                $adresse = (new Sql($connect_file))->getAdresseSite();
     108                                                if ($adresse) {
     109                                                        $host = parse_url($adresse, PHP_URL_HOST);
     110                                                        $_SERVER['HTTP_HOST'] = $host;
     111                                                        echo "Host défini sur $host\n";
     112                                                }
     113                                        } catch (\Exception $e) {
     114                                                // a améliorer
     115                                                echo $e->getMessage() . "\n";
     116                                        }
     117                                }
     118                        }
     119                        $previous = $dir;
     120                }
     121                return false;
     122        }
     123
     124        /**
    72125         * Indique si on est à la racine d’un site SPIP
    73126         * @return bool;
     
    78131                }
    79132                return $this->exists;
     133        }
     134
     135        /**
     136         * Place le dossier de travail au bon endroit
     137         */
     138        public function chdir() {
     139                chdir($this->getDirectory());
    80140        }
    81141
     
    206266
    207267                $cwd = getcwd();
    208                 chdir($this->directory);
     268                $this->chdir();
    209269                $this->preparerPourInstallation();
    210270                require_once $starter;
  • _outils_/spip-cli/trunk/src/Loader/Sql.php

    r110765 r110776  
    154154                return $sqlite;
    155155        }
     156
     157        public function getAdresseSite() {
     158                /** @var \PDO $pdo */
     159                $pdo = $this->getPdo();
     160                $query = $pdo->prepare('SELECT valeur FROM spip_meta WHERE nom=:nom');
     161                $query->bindValue(':nom', 'adresse_site', \PDO::PARAM_STR);
     162                $query->execute();
     163                $adr = $query->fetchColumn();
     164                return trim($adr);
     165        }
    156166}
Note: See TracChangeset for help on using the changeset viewer.