#!/usr/bin/perl -w

# SYNOPSIS
#     Upload-O-Matic [-h] [-F] [-f] <mon_fichier> [-u] <Dir_upload> [-d] <ma_description>
#                    [-u] [-l] <mon_login> [-p] <mon_password>
#
# DESCRIPTION 
#      Ce ch'tit programme est destiné aux mainteneurs de
#     madchat.org, pour leur faciliter l'upload de fichier sur le
#     repositery. Ce script a été complétement ré-écrit, l'idée de
#     départ provient de Cykl[o].
#
# OPTION
#
#     Voir le fichier ~src/Help ou option -h
#
# DEPENDANCES
#     Les modules nécessaires au lancement de l'application sont :
#               * Net::FTP
#               * Getopt::Std
#    Ce sont des modules _standards_ 
#
# AUTEUR
#    Nicolas Bareil (Alias offset) <nbareil@free.fr>
#    http://www.madloutre.org/~offset
#    Id-CVS : $Id: Upload-O-Matic-v2.0.pl,v 1.4 2001/11/10 14:11:53 offset Exp $

use strict ;
use Net::FTP ;
use Getopt::Std ;
use vars qw/$opt_f $opt_F $opt_d $opt_h $opt_u $opt_v $opt_l $opt_p $opt_u $opt_U/;

getopts("f:d:Fhvr:l:p:u:U");

# ETAPE 0 : RAPPEL, NOTICE

Version() if ($opt_v);
sub Version { print "Upload-O-Matic version 2.0 \n\n"; };

if ($opt_F) {
    print "<!> Attention <!>\n";
    print "Tu as choisi l'option -F, alors fais gaffe à ce que tu fais\n";
    print "Le .htaccess sera informé par une ligne que tu as décidé de forcer.\n\n";
}

if ($opt_h) {
    Notice();
    Options();
    
    die "Aucune option donnée\n";
}

sub Notice {
    Version() ;
    print "Nicolas Bareil <nbareil\@madchat.org>\n";
    print "http://www.madloutre.org/~offset\n\n";

    print "Licence GPL (http://www.fsf.org)\n";
}

sub Options {
  print <<'END';
 OPTIONS

     -U
            Vous n'aimez pas taper vos mots de passe
          en aveugle ? C'est pas très sécure, mais
          vous faites ce que vous voulez.
 
     -F
            Cette option vous permet de forcer les 
          vérifications effectuées. A n'utiliser
          qu'à bon escient. La bonne tenue du site
          ne tient qu'à vous. Si le .htaccess est
          down, le site est down.

     -f  <mon_fichier>
            Indique le chemin vers le fichier à 
          uploader. Cette option est facultative, si
          vous ne la mettez pas, le programme vous demandera
          sur STDIN.
     
     -u <repertoire>
            Indique le répertoire distant où le
          fichier va etre uploadé. Attention !
          Apache a pour racine /www, donc pour 
          mettre des documents disponibles sur le
          site, il faut absolument les mettre sur
          /www/kelkechose

     -d <ma_description>
            C'est ici que vous mettez votre 
          description du fichier. Faites gaffe, ce
          fichier est très sensible pour le 
          fonctionnement du site.

     -l <mon_login>
            Le login qui va etre utilisé lors de 
          la connection avec le serveur FTP.
 
     -p <mon_password>
         Le password qui va etre utilisé lors 
       de la connection avec le serveur FTP.

     -v
         Affiche la version, et la notice légale.

     -h
         Affiche le résumé des options.
END
}

# ETAPE 1 : VERIFICATION DU FICHIER
my $file ;

if ( $opt_f ) {
    Verification_fichier( $opt_f) unless $opt_F ;
    $file = $opt_f;
    
} else {
    print "Fichier à envoyer : ";
    chomp ($file = <STDIN>);
    Verification_fichier( $file) unless $opt_F;
}

# ETAPE 2 : PRISE D'INFORMATION POUR LE TRANSFERT FTP
my ($dir_upload, $tmp);

my ($login, $mdp, $host_ftp);


if ($opt_u) {
    $dir_upload = $opt_u ;
    
} else {
    print "Le fichier doit etre envoyé dans quel répertoire FTP : ";
    chomp ($dir_upload = <STDIN>);   
}

unless ( ($dir_upload =~ /^\/www/m) || ( $opt_F) ) {
    print STDERR "Attention ! Etes vous sur de vouloir uploader dans $dir_upload ? [o/n] "; 
    chomp($tmp = <STDIN>);  
    die "T'as pas d'avenir mon gars...\n" if ($tmp  =~ /[^oOyY]/m ) ;
}

$host_ftp = "ftp.madchat.org";

print "[$host_ftp]\n";

if ($opt_l) {
    $login = $opt_l ;
} else {
    print "\tLogin : ";
    chomp( $login = <STDIN>);
}

if ($opt_p) {
    $mdp = $opt_p ;
} else {
    print "\tPassword : ";
    system "stty -echo" unless ($opt_U);
    chomp($mdp = <STDIN>);
    system "stty echo"  unless ($opt_U);
    print "\n" unless ($opt_U);
    
}

# ETAPE 3 : CREATION DE LA LIGNE .HTACCESS
my ($description, $htaccess, $basename);

if ($opt_d) {
    $description = $opt_d ;
} else {
    print "\tDescription : ";
    chomp( $description = <STDIN>);
}

die "Il y a des caractères interdits dans la description" if ( $description =~ /\"/m);
die "Je ne peux accepter une description nulle\n" if (($description eq "") || $opt_F);

# Solution crado pour trouver le nom du fichier.
my @tmp = split(/\//, $file);
$basename = pop(@tmp);

$htaccess = "AddDescription \"${description}\" $basename\n";

# ETAPE 4 : ON RECAPITULE

print "Récapitulatif :\n";
print "Le fichier _${file}_ va prendre son envol vers _${dir_upload}_ sur $host_ftp\n";
print "La ligne ci-dessous sera ajouté au .htaccess\n\t$htaccess\n";

# ETAPE 3 : TRANSFERT DES FICHIERS
my $ftp ;

$ftp = Net::FTP->new($host_ftp)             or die "Impossible de se connecter à $host_ftp : $@\n";
$ftp->login($login, $mdp)                   or die "Identification incorrect : $@\n";
$ftp->cwd ($dir_upload)                     or die "Impossible d'accéder au répertoire $dir_upload : $@\n";      
$ftp->put($file)	                    or die "Impossible d'uploader le fichier $file : $@\n";
$ftp->cwd('/www')                           or die "Impossible d'accéder à la racine : $@\n";
$ftp->get('.htaccess', 'htaccess')          or die "Impossible de télécharger le fichier /.htaccess : $@\n";
$ftp->put('htaccess', '.htaccess.backup')    or die "Impossible d'uploader le fichier $file : $@\n";


open(FD, ">> htaccess") or die "Impossible d'ouvrir le fichier htaccess : $!";
print FD "# Cette ligne a été ajouté de force par Upload-O-Matic-2.0\n" if ($opt_F);
print FD $htaccess ;
close (FD);

$ftp->put('htaccess', '.htaccess') or die "Impossible d'uploader le fichier .htaccess : $@\n";

unlink('htaccess');

#
#
# ILE AUX FONCTIONS
#
#

# Verification_fichier()
#
# Cette fonction se charge de vérifier le fichier à uploader :
#   - Existence
#   - Permission ok
#   - Type du fichier
#
# Argument entrant : Le nom du fichier.
# Code de retour   : 0 si ok
#
sub Verification_fichier {
    my $file = pop @_ ; 
    
    my $status;
    
    
    
    print "Vérification du fichier en cours...\n";
    
    print "\tFichier existant... ";
    $status = -1 ;
    $status = 0 if -e $file ;
    
    if ( $status == -1 ) {
	print "Non !\n";
	die "Impossible de travailler dans des conditions pareilles : Fichier indiponible.\n";
    } else {
	print "Oui\n";
    }
    
    print "\tVérification des permissions... ";
    
    $status = -1 ;
    $status = 0 if -r $file ;
    
    if ( $status == -1 ) {
	print "Echec !\n";
	die "Vous n'avez pas les permissions nécessaires pour lire ce fichier.\n";
    } else {
	print "Autorisée\n";
    }
    
    print "Type du fichier... ";
    $status = -1 ;
    
    $status = 0 if -f $file ;
    
    if ($status == -1 ) {
	print "Binaire\n";
	print STDERR "\t\t**** Attention ! Ce fichier est binaire. Faites gaffe (Virus, compatibilité...)\n";
    } else {
	print "Texte\n";
    }
    
    print "Vérification terminée avec succès.\n";
    
}

