[AlternC-dev] Re: [lautre-techos] tar.gz bureau lautre3

Retour à l'archive de la liste
Le site d'AlternC
Google Custom Search

Pierre THIERRY pierre.thierry at moine-fou.org
Jeu 16 Oct 07:30:36 CEST 2003


> BohwaZ wrote:
>> Je suis aux regrets de vous annoncer que le téléchargement d'un
>> dossier dans le gestionnaire de fichiers sur le bureau de lautre3 ne
>> fonctionne pas le moindre du monde [...] Au passage ça ne marche pas
>> sur heberge.info non plus, est-ce que ça serait un bug d'alternC?
> oui :) il faudrait développer cette page en perl car php est
> interrompu (30s) si le fichier est tros gros.

Bon, comme je n'ai pas accès, au CVS, je poste ici ce que j'ai pu faire.
En faisant le script Perl, j'en ai profité pour faire un lifting du code
PHP :

- mutualisation du code, une fonction de base DownloadDir est appelée
  avec les arguments ad hoc par les quatre fonctions
  Download{Z,TGZ,TBZ,ZIP},
- conformité HTTP : Content-Transfer-Encoding n'existe pas pour HTTP,
  je l'ai remplacé par un Content-Encoding pour les trois tar

Par contre, je n'ai pas de machine dispo avec AlternC, ça n'est pas
testé... Je n'ai pas de woody où je puisse faire de tests AlternC pour
l'instant, mais si quelqu'un me laisse un accès sur un bécane, je finis
de débugger presto (ça a été écrit d'une traite, et je n'ai jamais, à ma
connaissance, écris d'une traite quelque chose qui marche du premier
coup...).

> De plus, il faudrait limiter l'accès à cette page pour que ca ne
> puisse pas plomber le serveur :)

Ça, je ne me suis par contre pas du tout penché dessus. :-/

Préliminairement,
le Moine Fou
-- 
pierre.thierry at moine-fou.org
OpenPGP 0xD9D50D8A
-------------- section suivante --------------
diff -ru alternc-pre-1.0/bureau/admin/bro_tgzdown.php alternc-pre-1.0.new/bureau/admin/bro_tgzdown.php
--- alternc-pre-1.0/bureau/admin/bro_tgzdown.php	2003-03-26 18:41:29.000000000 +0100
+++ alternc-pre-1.0.new/bureau/admin/bro_tgzdown.php	2003-10-16 07:19:47.000000000 +0200
@@ -29,19 +29,11 @@
 */
 require_once("../class/config.php");
 
-$p=$bro->GetPrefs();
-switch ($p["downfmt"]) {
-	case 0:
-		$bro->DownloadTGZ();
-		break;
-	case 1:
-		$bro->DownloadTBZ();
-		break;
-	case 2:
-		$bro->DownloadZIP();
-		break;
-	case 3:
-		$bro->DownloadZ();
-		break;
-}
+$p = $bro->GetPrefs();
+$types = array('tar.gz', 'tar.bz2', 'zip', 'tar.Z');
+$type = $types[$p["downfmt"]];
+$login = $mem->user["login"];
+
+header('HTTP/1.1 303 See Other');
+header("Location: bro_dirdown.pl?login=$login&type=$type&dir=");
 ?>
diff -ru alternc-pre-1.0/bureau/class/m_bro.php alternc-pre-1.0.new/bureau/class/m_bro.php
--- alternc-pre-1.0/bureau/class/m_bro.php	2003-08-19 22:00:39.000000000 +0200
+++ alternc-pre-1.0.new/bureau/class/m_bro.php	2003-10-16 07:19:48.000000000 +0200
@@ -562,17 +562,35 @@
   }
 
   /* ----------------------------------------------------------------- */
-  /** Echo d'un flux .tar.Z contenant tout le contenu du dossier $dir
+  /** Fonction de base pour les téléchargements de dossier
+   * @param string $command commande réalisant la mise en archive
+   * @param string $ext extension de l'archive
+   * @param string $subtype sous-type du type MIME application/*
    * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
    * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
    */
-  function DownloadZ($dir="") {
+  function DownloadDir($command, $ext = '', $subtype = 'octet-stream', $encoding = '', $dir, = '') {
     global $mem;
-    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tar.Z");
-    header("Content-Type: application/x-Z");
-    header("Content-Transfer-Encoding: binary");
-    $d=escapeshellarg(substr($this->convertabsolute($dir,0),1));
-    passthru("/bin/tar -cZ -C /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/ $d");
+    $login = $mem->user["login"];
+    $letter = substr($login,0,1);
+    
+    header("Content-Disposition: attachment; filename=$login$ext");
+    header("Content-Type: application/$subtype");
+    if (strlen($encoding)) {
+        header("Content-Encoding: $encoding");
+    }
+    $d = escapeshellarg(substr($this->convertabsolute($dir,0),1));
+    passthru("$command /var/alternc/html/$letter/$login/$d");
+  }
+
+
+  /* ----------------------------------------------------------------- */
+  /** Echo d'un flux .tar.Z contenant tout le contenu du dossier $dir
+   * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
+   * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
+   */
+  function DownloadZ($dir = "") {
+    $this->DownloadDir("/bin/tar -cZ -C", ".tar.Z", "x-tar", "compress", $dir);
   }
 
   /* ----------------------------------------------------------------- */
@@ -580,13 +598,8 @@
    * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
    * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
    */
-  function DownloadTGZ($dir="") {
-    global $mem;
-    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tgz");
-    header("Content-Type: application/x-tgz");
-    header("Content-Transfer-Encoding: binary");
-    $d=escapeshellarg(substr($this->convertabsolute($dir,0),1));
-    passthru("/bin/tar -cz -C /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/ $d");
+  function DownloadTGZ($dir = "") {
+    $this->DownloadDir("/bin/tar -cz -C", ".tar.gz", "x-tar", "gzip", $dir);
   }
 
 
@@ -595,13 +608,8 @@
    * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
    * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
    */
-  function DownloadTBZ($dir="") {
-    global $mem;
-    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tar.bz2");
-    header("Content-Type: application/x-bzip2");
-    header("Content-Transfer-Encoding: binary");
-    $d=escapeshellarg(substr($this->convertabsolute($dir,0),1));
-    passthru("/bin/tar -cj -C /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/ $d");
+  function DownloadTBZ($dir = "") {
+    $this->DownloadDir("/bin/tar -cj -C", ".tar.bz2", "x-tar", "x-bzip2", $dir);
   }
 
   /* ----------------------------------------------------------------- */
@@ -609,13 +617,8 @@
    * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
    * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
    */
-  function DownloadZIP($dir="") {
-    global $mem;
-    header("Content-Disposition: attachment; filename=".$mem->user["login"].".zip");
-    header("Content-Type: application/x-zip");
-    header("Content-Transfer-Encoding: binary");
-    $d=escapeshellarg($this->convertabsolute("/var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/".$dir,0));
-    passthru("/usr/bin/zip -r - /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/$d");
+  function DownloadZIP($dir = "") {
+    $this->DownloadDir("/usr/bin/zip -r -", ".zip", "zip", "", $dir);
   }
 
   /* ----------------------------------------------------------------- */
-------------- section suivante --------------
#!/usr/bin/perl

use strict;
use warnings;
no warnings qw(uninitialized);

use CGI;

my $query = new CGI;

sub GetCgiParams {
	my $cgi = shift;
	return (
		DIR => $cgi->param('dir'),
		TYPE => $cgi->param('type'),
		LOGIN => $cgi->param('login'),
	);
}
		
my %params = GetCgiParams($query);
my $directory = $params{'DIR'};
my $type = $params{'TYPE'};
my $login = $params{'LOGIN'};

sub DownloadDir {
	my ($login, $command, $ext, $subtype, $encoding, $dir) = @_;
	$subtype = 'octet-stream' unless $subtype;
	
	print "Content-Disposition: attachment; filename=$login$ext\n";
	print "Content-Type: application/$subtype\n";
	print "Content-Encoding: $encoding\n" if $encoding;

	my $letter = substr($login, 0, 1);
	my $d = escapeshellarg(substr($this->convertabsolute($dir, 0),1));
	exec "$command /var/alternc/html/$letter/$login/$d";
}

my @args;
SWITCH: for ($type) {
	/tar.gz|tgz/i && @args = ("/bin/tar -cz -C", ".tar.gz", "x-tar", "gzip");
	/tar.z/i && @args = ("/bin/tar -cZ -C", ".tar.Z", "x-tar", "compress");
	/tar.bzip2/i && @args = ("/bin/tar -cj -C", ".tar.bz2", "x-tar", "x-bzip2");
	/zip/i && @args = ("/usr/bin/zip -r -", ".zip", "zip", "");
}

DownloadDir($login, @args, $dir);
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: non disponible
Type: application/pgp-signature
Taille: 189 octets
Desc: non disponible
URL: <http://lists.alternc.org/arch/dev/attachments/20031016/5a587ab8/attachment.pgp>
-------------- section suivante --------------
_______________________________________________
Dev mailing list
Dev at alternc.org
http://alternc.org/cgi-bin/mailman/listinfo/dev


Plus d'informations sur la liste de diffusion Dev