| Current Path : /home/etiennec/www/f1f54/ |
| Current File : /home/etiennec/www/f1f54/teleporter.tar |
git.php 0000666 00000007445 15250307627 0006065 0 ustar 00 <?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.php 0000666 00000010404 15250307627 0010600 0 ustar 00 <?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.php 0000666 00000012045 15250307627 0006251 0 ustar 00 <?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.php 0000666 00000010402 15250307627 0010600 0 ustar 00 <?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.php 0000666 00000006213 15250307627 0006100 0 ustar 00 <?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
);
}