Valider 321d7cd3 rédigé par marcimat@rezo.net's avatar marcimat@rezo.net
Parcourir les fichiers

- 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).

parent 16fe4dff
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+2 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -36,6 +36,7 @@ class Application extends ConsoleApplication {
			'spip.webmestre.login' => '',
			'spip.webmestre.nom' => '',
			'spip.webmestre.login.prefixe' => 'SpipCli-',
			'cwd' => getcwd()
		]);

		// todo: config file
@@ -70,7 +71,7 @@ class Application extends ConsoleApplication {
			return $spip;
		};
		$app['spip.sql'] = function ($app) {
			$connect = $app['spip.loader']->getPathconnect();
			$connect = $app['spip.loader']->getPathConnect();
			if (!is_file($connect)) {
				throw new \Exception('SPIP database is not configured');
			}
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -67,6 +67,7 @@ class TestSpipCommand extends Command
			/** @var Spip $spip */
			$spip = $this->getApplication()->getService('spip.loader');
			$spip->load();
			$spip->chdir(); // grml
		} catch (\Exception $e) {
			$io->fail('Chargement de SPIP en erreur !');
			$io->fail($e->getMessage());
+62 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -18,6 +18,9 @@ class Spip {
	/** @var string Chemin du connecteur SQL */
	protected $connect = 'config/connect.php';

	/** @var string Nom du répertoire théorique des sites, si mutualisation */
	protected $dir_sites = 'sites';

	/** @var string */
	private $directory;

@@ -37,9 +40,14 @@ class Spip {
	public function __construct($directory = null) {
		if (is_null($directory)) {
			$directory = $this->chercher_racine_spip();
			if ($directory) {
				$this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
				$this->trouver_host_si_mutualisation();
			}
		} else {
			$this->directory = rtrim(Files::formatPath($directory), DIRECTORY_SEPARATOR);
		}
	}


	/**
@@ -68,6 +76,51 @@ class Spip {
		return false;
	}

	/**
	 * Si le répertoire d’exécution de spip-cli est dans un site mutualisé,
	 * ie quelque part dans `sites/truc.tld/qqc`, alors, déclarer à SPIP l’adresse
	 * du site concerné (dans http_host), si on arrive à le calculer
	 * (en se connectant au sql du site via PDO)
	 *
	 * @return bool
	 */
	private function trouver_host_si_mutualisation() {
		// si le host a déjà été défini, ne rien tenter.
		if (!empty($_SERVER['HTTP_HOST'])) {
			return false;
		}
		// Si pas de répertoire 'sites', pas la peine de chercher...
		$cwd = explode(DIRECTORY_SEPARATOR, getcwd());
		if (!in_array($this->dir_sites, $cwd)) {
			return false;
		}
		// On suppose que les fichiers de travail d’un site mutualisé,
		// est un répertoire enfant du répertoire 'sites' (ie: sites/domaine.tld).
		// On cherche un connecteur SQL dedans (ie: sites/domaine.tld/config/connect.php)
		// On l’utilise pour se connecter à la bdd et retrouver l’adresse du site.
		$previous = null;
		foreach (array_reverse($cwd) as $dir) {
			if ($dir === $this->dir_sites and $previous) {
				$connect_file = $this->getPathFile($this->dir_sites . DIRECTORY_SEPARATOR . $previous . DIRECTORY_SEPARATOR . $this->connect);
				if (file_exists($connect_file)) {
					try {
						$adresse = (new Sql($connect_file))->getAdresseSite();
						if ($adresse) {
							$host = parse_url($adresse, PHP_URL_HOST);
							$_SERVER['HTTP_HOST'] = $host;
							echo "Host défini sur $host\n";
						}
					} catch (\Exception $e) {
						// a améliorer
						echo $e->getMessage() . "\n";
					}
				}
			}
			$previous = $dir;
		}
		return false;
	}

	/**
	 * Indique si on est à la racine d’un site SPIP
	 * @return bool;
@@ -79,6 +132,13 @@ class Spip {
		return $this->exists;
	}

	/**
	 * Place le dossier de travail au bon endroit
	 */
	public function chdir() {
		chdir($this->getDirectory());
	}

	/**
	 * Démarre SPIP
	 */
@@ -205,7 +265,7 @@ class Spip {
		}

		$cwd = getcwd();
		chdir($this->directory);
		$this->chdir();
		$this->preparerPourInstallation();
		require_once $starter;
		chdir($cwd);
+10 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -153,4 +153,14 @@ class Sql {
		}
		return $sqlite;
	}

	public function getAdresseSite() {
		/** @var \PDO $pdo */
		$pdo = $this->getPdo();
		$query = $pdo->prepare('SELECT valeur FROM spip_meta WHERE nom=:nom');
		$query->bindValue(':nom', 'adresse_site', \PDO::PARAM_STR);
		$query->execute();
		$adr = $query->fetchColumn();
		return trim($adr);
	}
}
 No newline at end of file
+1 −1

Fichier modifié.

Contient uniquement des modifications d'espaces.