Your IP : 216.73.216.20


Current Path : /home/e/t/i/etiennec/www/f1f54/
Upload File :
Current File : /home/e/t/i/etiennec/www/f1f54/teleporter.tar

git.php000066600000007445152503076270006065 0ustar00<?php
/**
 * Gestion du téléporteur GIT. 
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Teleporteur
 */
 
/**
 * Téléporter et déballer un composant GIT
 * 
 * Déployer un repository GIT depuis une source et une révision données
 *
 * @param string $methode
 *     Méthode de téléportation : http|git|svn|...
 * @param string $source
 *     URL de la source GIT
 * @param string $dest
 *     Chemin du répertoire de destination
 * @param array $options
 *     Tableau d'options. Index possibles :
 *     - revision => 'ae89'
 *     - branche => 'xxx'
 * @return bool
 *     True si l'opération réussie, false sinon.
 */
function teleporter_git_dist($methode,$source,$dest,$options=array()){

	$branche = (isset($options['branche'])?$options['branche']:'master');
	if (is_dir($dest)){
		$infos = teleporter_git_read($dest,array('format'=>'assoc'));
		if (!$infos){
			spip_log("Suppression de $dest qui n'est pas au format GIT","teleport");
			$old = teleporter_nettoyer_vieille_version($dest);
		}
		elseif ($infos['source']!==$source) {
			spip_log("Suppression de $dest qui n'est pas sur le bon repository GIT","teleport");
			$old = teleporter_nettoyer_vieille_version($dest);
		}
		elseif (!isset($options['revision'])
		  OR $options['revision']!=$infos['revision']){
			$command = "git checkout ".escapeshellarg($branche);
			teleporter_git_exec($dest,$command);
			$command = "git pull --all";
			teleporter_git_exec($dest,$command);

			if (isset($options['revision'])){
				$command = "git checkout ".escapeshellarg($options['revision']);
				teleporter_git_exec($dest,$command);
			}
			else {
				$command = "git checkout ".escapeshellarg($branche);
				teleporter_git_exec($dest,$command);
			}
		}
		else {
			spip_log("$dest deja sur GIT $source Revision ".$options['revision'],"teleport");
		}
	}

	if (!is_dir($dest)){
		$command = "git clone ";
		$command .= escapeshellarg($source)." ".escapeshellarg($dest);
		teleporter_git_exec($dest,$command);
		if (isset($options['revision'])){
			$command = "git checkout ".escapeshellarg($options['revision']);
			teleporter_git_exec($dest,$command);
		}
	}

	// verifier que tout a bien marche
	$infos = teleporter_git_read($dest);
	if (!$infos) return false;

	return true;
}

/**
 * Lire l'état GIT du repository
 *
 * Retourne les informations GIT d'un répertoire donné
 * 
 * @param string $dest
 *     Chemin du répertoire à tester
 * @param array $options
 *     Tableau d'options
 * @return string|bool|array
 *     - Chaîne vide si pas un dépot GIT
 *     - False si erreur sur le dépot GIT
 *     - array sinon. Tableau avec 3 index :
 *     -- source : Source du dépot GIT à cette destination
 *     -- revision : Révision du dépot
 *     -- dest : Répertoire du dépot.
 */
function teleporter_git_read($dest, $options=array()) {

	if (!is_dir("$dest/.git"))
		return "";

	$curdir = getcwd();
	chdir($dest);

	exec("git remote -v",$output);
	$output = implode("\n",$output);

	$source = "";
	if (preg_match(",(\w+://.*)\s+\(fetch\)$,Uims",$output,$m))
		$source = $m[1];
	elseif (preg_match(",([^@\s]+@[^:\s]+:.*)\s+\(fetch\)$,Uims",$output,$m))
		$source = $m[1];

	if (!$source){
		chdir($curdir);
		return "";
	}

	$source = $m[1];

	exec("git log -1",$output);
	$hash = explode(" ",reset($output));
	$hash = end($hash);

	// [TODO] lire la branche ?
	chdir($curdir);

	if (preg_match(",[^0-9a-f],i",$hash))
		return false;

	return array(
		'source' => $source,
		'revision' => substr($hash,0,7),
		'dest' => $dest
	);
}


/**
 * Exécuter une commande GIT
 *
 * @param string $dest
 *     Répertoire de destination
 * @param string $command
 *     Commande à exécuter
 * @return void
 */
function teleporter_git_exec($dest,$command) {
	spip_log("{$dest}:{$command}","teleport");
	$curdir = getcwd();
	chdir($dest);
	exec($command);
	chdir($curdir);
}
http_deballe_zip.php000066600000010404152503076270010600 0ustar00<?php
/**
 * Gestion du téléporteur HTTP \ Zip. 
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Teleporteur
 */
 

/**
 * Déballer le fichier au format zip dans le répertoire $dest
 * en utilisant le dossier temporaire $tmp si besoin
 *
 * @param string $archive
 *     Chemin du fichier zip
 * @param string $dest
 *     Répertoire où on veut décompresser
 * @param string $tmp
 *     Répertoire de stockage temporaire
 * @return bool|string
 *     Répertoire où a été décompressé le zip, false sinon.
 */
function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){
	$status = teleporter_http_charger_zip(
		array(
			'archive' => $archive, // normalement l'url source mais on l'a pas ici
			'fichier' => $archive,
			'dest' => $dest,
			'tmp' => $tmp,
			'extract' => true,
			'root_extract' => true, # extraire a la racine de dest
		)
	);
	// le fichier .zip est la et bien forme
	if (is_array($status)
	  AND is_dir($status['target'])) {
		return $status['target'];
	}
	// fichier absent
	else if ($status == -1) {
		spip_log("dezip de $archive impossible : fichier absent","teleport"._LOG_ERREUR);
		return false;
	}
	// fichier la mais pas bien dezippe
	else {
		spip_log("probleme lors du dezip de $archive","teleport"._LOG_ERREUR);
		return false;
	}
}


/**
 * Charger un zip à partir d'un tableau d'options descriptives
 *
 * @param array $quoi
 *     Tableau d'options
 * @return array|bool|int|string
 *     En cas de réussite, Tableau décrivant le zip, avec les index suivant :
 *     - files : la liste des fichiers présents dans le zip,
 *     - size : la taille décompressée
 *     - compressed_size : la taille compressée
 *     - dirname : répertoire où les fichiers devront être décompréssés
 *     - tmpname : répertoire temporaire où les fichiers sont décompressés
 *     - target : cible sur laquelle décompresser les fichiers...
 */
function teleporter_http_charger_zip($quoi = array()){
	if (!$quoi)
		return false;

	foreach (array(	'remove' => 'spip',
					'rename' => array(),
					'edit' => array(),
					'root_extract' => false, # extraire a la racine de dest ?
					'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur')
				)
				as $opt=>$def) {
		isset($quoi[$opt]) || ($quoi[$opt] = $def);
	}

	if (!@file_exists($fichier = $quoi['fichier']))
		return 0;

	include_spip('inc/pclzip');
	$zip = new PclZip($fichier);
	$list = $zip->listContent();

	$racine = http_deballe_recherche_racine($list);
	$quoi['remove'] = $racine;

	// si pas de racine commune, reprendre le nom du fichier zip
	// en lui enlevant la racine h+md5 qui le prefixe eventuellement
	// cf action/charger_plugin L74
	if (!strlen($nom = basename($racine)))
		$nom = preg_replace(",^h[0-9a-f]{8}-,i","",basename($fichier, '.zip'));

	$dir_export = $quoi['root_extract']
		? $quoi['dest']
		: $quoi['dest'] . $nom;
	$dir_export = rtrim($dir_export,'/').'/';

	$tmpname = $quoi['tmp'].$nom.'/';

	// choisir la cible selon si on veut vraiment extraire ou pas
	$target = $quoi['extract'] ? $dir_export : $tmpname;

	// ici, il faut vider le rep cible si il existe deja, non ?
	if (is_dir($target))
		supprimer_repertoire($target);

	// et enfin on extrait
	$ok = $zip->extract(
		PCLZIP_OPT_PATH,
			$target
		,
		PCLZIP_OPT_SET_CHMOD, _SPIP_CHMOD,
		PCLZIP_OPT_REPLACE_NEWER,
		PCLZIP_OPT_REMOVE_PATH, $quoi['remove']
	);
	if ($zip->error_code < 0) {
		spip_log('charger_decompresser erreur zip ' . $zip->error_code .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR);
		return //$zip->error_code
			$zip->errorName(true);
	}

	spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport");

	$size = $compressed_size = 0;
	$removex = ',^'.preg_quote($quoi['remove'], ',').',';
	foreach ($list as $a => $f) {
		$size += $f['size'];
		$compressed_size += $f['compressed_size'];
		$list[$a] = preg_replace($removex,'',$f['filename']);
	}

	// Indiquer par un fichier install.log
	// a la racine que c'est chargeur qui a installe ce plugin
	ecrire_fichier($target.'install.log',
		"installation: charger_plugin\n"
		."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n"
		."source: ".$quoi['archive']."\n"
	);


	return array(
		'files' => $list,
		'size' => $size,
		'compressed_size' => $compressed_size,
		'dirname' => $dir_export,
		'tmpname' => $tmpname,
		'target' => $target,
	);
}
http.php000066600000012045152503076270006251 0ustar00<?php
/**
 * Gestion du téléporteur HTTP. 
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Teleporteur
 */
 
/**
 * Téléporter et déballer un composant HTTP
 * 
 * @param string $methode
 *   Méthode de téléportation : http|git|svn|...
 * @param string $source
 *     URL de la source HTTP
 * @param string $dest
 *     Chemin du répertoire de destination
 * @param array $options
 *     Tableau d'options.
 *     Doit au moins avoir l'index :
 *     - dir_tmp : Indique un répertoire temporaire pour stocker
 *       les fichiers. Par exemple défini avec : sous_repertoire(_DIR_CACHE, 'chargeur');
 * @return bool|string
 *     Texte d'erreur si erreur,
 *     True si l'opération réussie.
 */
function teleporter_http_dist($methode,$source,$dest,$options=array()){

	$tmp = $options['dir_tmp'];
	# on ne se contente pas du basename qui peut etre un simple v1
	# exemple de l'url http://nodeload.github.com/kbjr/Git.php/zipball/v0.1.1-rc
	$fichier = $tmp . (basename($dest)."-".substr(md5($source),0,8)."-".basename($source));

	$res = teleporter_http_recuperer_source($source,$fichier);
	if (!is_array($res))
		return $res;

	list($fichier,$extension) = $res;
	if (!$deballe = charger_fonction("http_deballe_".preg_replace(",\W,","_",$extension),"teleporter",true))
		return _T('svp:erreur_teleporter_format_archive_non_supporte',array('extension' => $extension));

	$old = teleporter_nettoyer_vieille_version($dest);

	if (!$target = $deballe($fichier, $dest, $tmp)){
		// retablir l'ancien sinon
		if ($old)
			rename($old,$dest);
		return _T('svp:erreur_teleporter_echec_deballage_archive',array('fichier' => $fichier));
	}

	return true;
}

/**
 * Récupérer la source et détecter son extension
 *
 * @param string $source
 *     URL de la source HTTP
 * @param string $dest_tmp
 *     Répertoire de destination
 * @return array|string
 *     - Texte d'erreur si une erreur survient,
 *     - Liste sinon (répertoire de destination temporaire, extension du fichier source)
 */
function teleporter_http_recuperer_source($source,$dest_tmp){

	# securite : ici on repart toujours d'une source neuve
	if (file_exists($dest_tmp))
		spip_unlink($dest_tmp);

	$extension = "";

	# si on ne dispose pas encore du fichier
	# verifier que le zip en est bien un (sans se fier a son extension)
	#	en chargeant son entete car l'url initiale peut etre une simple
	# redirection et ne pas comporter d'extension .zip
	include_spip('inc/distant');
	$head = recuperer_page($source, false, true, 0);

	if (preg_match(",^Content-Type:\s*?(.*)$,Uims",$head,$m)
		AND include_spip('base/typedoc')){
		$mime = $m[1];
		// passer du mime a l'extension !
		if ($e = array_search($mime,$GLOBALS['tables_mime']))
			$extension = $e;
	}

	if (!$extension
	  // cas des extensions incertaines car mime-type ambigu
	  OR in_array($extension,array('bin','gz'))){
		if (preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)['\"]?$,Uims",$head,$m)
		  AND $e=teleporter_http_extension($m[1])){
			$extension = $e;
		}
		// au cas ou, si le content-type n'est pas la
		// mais que l'extension est explicite
		else{
			$extension = teleporter_http_extension($source);
		}
	}

	# format de fichier inconnu
	if (!$extension) {
		spip_log("Type de fichier inconnu pour la source $source","teleport"._LOG_ERREUR);
		return _T('svp:erreur_teleporter_type_fichier_inconnu',array('source' => $source));
	}

	$dest_tmp = preg_replace(";\.[\w]{2,3}$;i","",$dest_tmp).".$extension";

	include_spip('inc/distant');
	$dest_tmp = copie_locale($source,'force',$dest_tmp);
	if (!$dest_tmp
	  OR !file_exists($dest_tmp = _DIR_RACINE . $dest_tmp)) {
		spip_log("Chargement impossible de la source $source","teleport"._LOG_ERREUR);
		return _T('svp:erreur_teleporter_chargement_source_impossible',array('source' => $source));
	}

	return array($dest_tmp,$extension);
}

/**
 * Retrouve l'extension d'un fichier 
 *
 * @note
 *     Retourne tgz pour un fichier .tar.gz
 * 
 * @param string $file
 *     Chemin du fichier
 * @return string
 *     Extension du fichier, sinon vide
**/
function teleporter_http_extension($file){
	$e = pathinfo($file, PATHINFO_EXTENSION);

	// cas particuliers : redresser .tar.gz
	if ($e=='gz'
		AND preg_match(',tar\.gz,i',$file))
		$e = 'tgz';

	return $e;
}

/**
 * Cherche la plus longue racine commune à tous les fichiers
 *
 * @param array $list
 *     Liste de chemin de fichiers
 * @return string
 *     Chemin commun entre tous les fichiers
**/
function http_deballe_recherche_racine($list){
	// on cherche la plus longue racine commune a tous les fichiers
	// pour l'enlever au deballage
	$max_n = 999999;
	$paths = array();
	foreach($list as $n) {
		$p = array();
		foreach(explode('/', $n['filename']) as $n => $x) {
			if ($n>$max_n)
				continue;
			$sofar = join('/',$p);
			$paths[$n][$sofar]++;
			$p[] = $x;
		}
		$max_n = min($n,$max_n);
	}

	$total = $paths[0][''];
	$i = 0;
	while (isset($paths[$i])
	AND count($paths[$i]) <= 1
	AND array_values($paths[$i]) == array($total))
		$i++;

	$racine = '';
	if ($i){
		$racine = array_keys($paths[$i-1]);
		$racine = array_pop($racine).'/';
	}

	return $racine;
}
http_deballe_tgz.php000066600000010402152503076270010600 0ustar00<?php
/**
 * Gestion du téléporteur HTTP \ Tar. 
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Teleporteur
 */


/**
 * Déballer le fichier au format tgz dans le répertoire $dest
 * en utilisant le dossier temporaire $tmp si besoin
 *
 * @param string $archive
 *     Chemin du fichier tgz
 * @param string $dest
 *     Répertoire où on veut décompresser
 * @param string $tmp
 *     Répertoire de stockage temporaire
 * @return bool|string
 *     Répertoire où a été décompressé le tgz, false sinon.
 */
function teleporter_http_deballe_tgz_dist($archive, $dest, $tmp){

	$status = teleporter_http_charger_tgz(
		array(
			'archive' => $archive, // normalement l'url source mais on l'a pas ici
			'fichier' => $archive,
			'dest' => $dest,
			'tmp' => $tmp,
			'extract' => true,
			'root_extract' => true, # extraire a la racine de dest
		)
	);
	// le fichier .zip est la et bien forme
	if (is_array($status)
	  AND is_dir($status['target'])) {
		return $status['target'];
	}
	// fichier absent
	else if ($status == -1) {
		spip_log("dezip de $archive impossible : fichier absent","teleport"._LOG_ERREUR);
		return false;
	}
	// fichier la mais pas bien dezippe
	else {
		spip_log("probleme lors du dezip de $archive","teleport"._LOG_ERREUR);
		return false;
	}
}



/**
 * Charger un tgz à partir d'un tableau d'options descriptives
 *
 * @param array $quoi
 *     Tableau d'options
 * @return array|bool|int|string
 *     En cas de réussite, Tableau décrivant le zip, avec les index suivant :
 *     - files : la liste des fichiers présents dans le zip,
 *     - size : la taille décompressée
 *     - compressed_size : la taille compressée
 *     - dirname : répertoire où les fichiers devront être décompréssés
 *     - tmpname : répertoire temporaire où les fichiers sont décompressés
 *     - target : cible sur laquelle décompresser les fichiers...
 */
function teleporter_http_charger_tgz($quoi = array()){
	if (!$quoi)
		return false;

	foreach (array(	'remove' => '',
					'rename' => array(),
					'edit' => array(),
					'root_extract' => false, # extraire a la racine de dest ?
					'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur')
				)
				as $opt=>$def) {
		isset($quoi[$opt]) || ($quoi[$opt] = $def);
	}

	if (!@file_exists($fichier = $quoi['fichier']))
		return 0;

	include_spip('inc/pcltar');

	$racine = '';
	if ($list = PclTarList($fichier)){
		$racine = http_deballe_recherche_racine($list);
		$quoi['remove'] = $racine;
	}
	else {
		spip_log('charger_decompresser erreur lecture liste tar ' . PclErrorString() .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR);
		return PclErrorString();
	}

	// si pas de racine commune, reprendre le nom du fichier zip
	// en lui enlevant la racine h+md5 qui le prefixe eventuellement
	// cf action/charger_plugin L74
	if (!strlen($nom = basename($racine)))
		$nom = preg_replace(",^h[0-9a-f]{8}-,i","",basename($fichier, '.zip'));

	$dir_export = $quoi['root_extract']
		? $quoi['dest']
		: $quoi['dest'] . $nom;
	$dir_export = rtrim($dir_export,'/').'/';

	$tmpname = $quoi['tmp'].$nom.'/';

	// choisir la cible selon si on veut vraiment extraire ou pas
	$target = $quoi['extract'] ? $dir_export : $tmpname;

	// ici, il faut vider le rep cible si il existe deja, non ?
	if (is_dir($target))
		supprimer_repertoire($target);

	$ok = PclTarExtract($fichier,$target,$quoi['remove']);
	if ($ok == 0) {
		spip_log('charger_decompresser erreur tar ' . PclErrorString() .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR);
		return PclErrorString();
	}

	spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport");

	$size = $compressed_size = 0;
	$removex = ',^'.preg_quote($quoi['remove'], ',').',';
	foreach ($list as $a => $f) {
		$size += $f['size'];
		$compressed_size += $f['compressed_size'];
		$list[$a] = preg_replace($removex,'',$f['filename']);
	}

	// Indiquer par un fichier install.log
	// a la racine que c'est chargeur qui a installe ce plugin
	ecrire_fichier($target.'install.log',
		"installation: charger_plugin\n"
		."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n"
		."source: ".$quoi['archive']."\n"
	);


	return array(
		'files' => $list,
		'size' => $size,
		'compressed_size' => $compressed_size,
		'dirname' => $dir_export,
		'tmpname' => $tmpname,
		'target' => $target,
	);
}
svn.php000066600000006213152503076270006100 0ustar00<?php
/**
 * Gestion du téléporteur HTTP. 
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Teleporteur
 */
 
/**
 * Téléporter et déballer un composant SVN
 * 
 * Déployer un repository SVN depuis une source et une révision données
 *
 * @param string $methode
 *     Méthode de téléportation : http|git|svn|...
 * @param string $source
 *     URL de la source SVN
 * @param string $dest
 *     Chemin du répertoire de destination
 * @param array $options
 *     Tableau d'options. Index possibles :
 *     - revision => 'nnn'
 *     - literal => --ignore-externals
 * @return bool
 *     True si l'opération réussie, false sinon.
 */
function teleporter_svn_dist($methode,$source,$dest,$options=array()){
	if (is_dir($dest)){
		$infos = teleporter_svn_read($dest);
		if (!$infos){
			spip_log("Suppression de $dest qui n'est pas au format SVN","teleport");
			$old = teleporter_nettoyer_vieille_version($dest);
		}
		elseif ($infos['source']!==$source) {
			spip_log("Suppression de $dest qui n'est pas sur le bon repository SVN","teleport");
			$old = teleporter_nettoyer_vieille_version($dest);
		}
		elseif (!isset($options['revision'])
		  OR $options['revision']!=$infos['revision']){
			$command = "svn up ";
			if (isset($options['revision']))
				$command .= escapeshellarg("-r".$options['revision'])." ";
			if (isset($options['ignore-externals']))
				$command .= "--ignore-externals ";

			$command .= escapeshellarg($dest);
			spip_log($command,"teleport");
			exec($command);
		}
		else {
			// Rien a faire !
			spip_log("$dest deja a jour (Revision ".$options['revision']." SVN de $source)","teleport");
		}
	}

	if (!is_dir($dest)){
		$command = "svn co ";
		if (isset($options['revision']))
			$command .= escapeshellarg("-r".$options['revision'])." ";
		if (isset($options['ignore-externals']))
			$command .= "--ignore-externals ";
		$command .= escapeshellarg($source)." ".escapeshellarg($dest);
		spip_log($command,"teleport");
		exec($command);
	}

	// verifier que tout a bien marche
	$infos = teleporter_svn_read($dest);
	if (!$infos) return false;

	return true;
}

/**
 * Lire source et révision d'un répertoire SVN
 * et reconstruire la ligne de commande
 * 
 * @param string $dest
 *     Chemin du répertoire SVN
 * @param array $options
 *     Options
 * @return array|string
 *     Chaîne vide si pas SVN ou erreur de lecture,
 *     Tableau sinon avec les index :
 *     - source : URL de la source SVN
 *     - revision : numéro de la révision SVN
 *     - dest : Chemin du répertoire
 */
function teleporter_svn_read($dest,$options=array()){

	if (!is_dir("$dest/.svn"))
		return "";

	// on veut lire ce qui est actuellement deploye
	// et reconstituer la ligne de commande pour le deployer
	exec("svn info ".escapeshellarg($dest),$output);
	$output = implode("\n",$output);

	// URL
	// URL: svn://trac.rezo.net/spip/spip
	if (!preg_match(",^URL[^:\w]*:\s+(.*)$,Uims",$output,$m))
		return "";
	$source = $m[1];

	// Revision
	// Revision: 18763
	if (!preg_match(",^R..?vision[^:\w]*:\s+(\d+)$,Uims",$output,$m))
		return "";

	$revision = $m[1];

	return array(
		'source' => $source,
		'revision' => $revision,
		'dest' => $dest
	);
}