#!/bin/perl
#############################################################################
# #
# Justino Martinez 1998 (justino@jet.es) #
# #
# LsRemoto.cgi V1.0 #
#############################################################################
# Este script puede copiarse y modificarse siempre y cuando #
# no se borre ni modifique la cabecera ni este texto y se #
# deje constancia clara del nombre y direccion de la persona#
# que ha hecho las modificaciones y en que consisten estas. #
# No obstante el autor no se hace responsable de usos #
# malintencionados debido a modificaciones realizadas por #
# otras personas. #
#############################################################################
# #
# Funcion #
# #
# Permite navegar por los subdirectorios y ver su contenido. Da el espacio #
# de disco ocupado por cada archivo y sus privilegios. Permite descargar los#
# archivos en el disco local mediante el script Download.cgi #
# #
# Funciona en combinacion con Tree.cgi y download.cgi, los cuales deben #
# hallarse en el mismo subdirectorio que este script #
# #
# OJO! Es peligroso que lo tengais a la vista si no quereis que nadie acceda#
# a esa informacion #
#############################################################################
# #
# Instalacion #
# #
# 1.- Copiar este archivo en en el disco del servidor #
# #
# 2.- Cambiar la variable $root que debe contener el path completo hasta #
# vuestro espacio de disco. Si vuestro servidor es Jet Internet #
# entonces la variable $root debe ser $root="/home/./usuario"; #
# donde usuario es vuestro nombre de usuario #
# #
# 3.- Cambiar la variable $serv que contiene la URL de vuestra pagina #
# #
# 4.- Dar el nombre de la imagen necesaria para realizar el grafico. #
# La variable que contienen ese nombre es $img_cuadro #
# #
# 5.- La variable $quien_soy debe contener el nombre de este script #
# #
# 6.- Dar permisos 755 a este archivo #
# #
# 7.- Copiar el Perl download.cgi en el mismo subdirectorio que este Perl y#
# darle permisos 755. Si cambiais el nombre del archivo download.cgi #
# debeis ponerlo en la variable $descarga #
# #
# 8.- Si quiereis poder hacer chequeos desde el directorio raiz debeis dar #
# a vuestro subdirectorio raiz permisos de al menos 715. Para hacerlo #
# debeis hacer un ftp a vuestra cuenta y listar el directorio raiz, #
# despues ejecutais chmod 755 . (con el punto) #
# #
#############################################################################
# #
# Ejemplo de llamada #
# #
# Desde vuestro navegador escribis la URL correspondiente a este archivo #
# junto con ?path donde path es el directorio que quereis chequear. #
# #
# Por ejemplo si sois el usuario pepe y quereis chequear el subdirectorio #
# /pepe/gifs/animales entonces debeis llamar al cgi usando #
# http://web.jet.es/pepe/cgi-bin/lsremoto.cgi?/gifs/animales #
# #
#############################################################################
#
# Variables que debeis cambiar
##########################################################
#
# Directorio raiz
#
$root = "/home/www/TR/cjav.org/ricosogorb/raiz";
# localizacion del servidor
#
$serv = "http://www.ricosogorb.cjav.org";
#---------- Estas variables solo hay que cambiarlas si
#---------- habeis renombrado los archivos correspondientes
# nombre de este script
#
$quien_soy = "lsremoto.cgi";
# nombre de la imagen que contiene el cuadro
#
$img_cuadro = "/home/www/TR/cjav.org/ricosogorb/raiz/cgi2/cuadro.gif";
# nombre del script que realiza la descarga desde
# el servidor hasta el cliente
#
$descarga = "/home/www/TR/cjav.org/ricosogorb/raiz/cgi2/download.cgi";
##############################################################
###### A partir de aqui no hay que cambiar nada ##############
##############################################################
# Separador UNIX
$separador ="/";
# Separador DOS $separador ="\\";
# Tomamos el argumento de la llamada (lo que va detras de ?)
# y generamos el path completo
#
$muestro=$ARGV[0];
# si no empieza por / se lo pongo
#
if ($muestro !~ /^\//) { $muestro = "/".$muestro; }
# si acaba en / se lo quito
#
if ($muestro =~ /\/$/) { chop($muestro); }
# si contiene /. lo quito
#
$muestro =~ s/\/\.//g;
# si no hay nada pongo /
#
if ($muestro eq "") {$muestro = "/";}
if ($ARGV[0] eq ""){
$path = $root;
} else {
$path = $root.$separador.$ARGV[0];
}
# Si ese path no existe o contiene cadenas del estilo .. --> Error y salimos
# Lo de evitar el .. es por razones de seguridad del servidor
#
if ((!-e $path)|($path=~ /\.\./)){
# print "Window-target: escondida\n";
print "Content-type:text/html \n\n";
print "
";
exit;
}
# $total = Total en bytes de todos los ficheros y directorios
# $subtotal = Total en bytes de lo que contiene cada subdirectorio
# $factor = factor para pasar a Kbytes
#
$total=0;
$subtotal=0;
$factor = 1024;
# La matriz @dire contendra los nombres de los subdirectorios
#
#@dire=($path);
# Empieza la pagina
#
print "Content-type:text/html \n\n";
print "";
print "\n";
print "Contenido de $muestro";
print "\n";
print "";
print "";
print "Path: $muestro
";
print "";
print "\n";
print "| Nombre | Privilegios | ";
print "Tamaño | ";
print "Acción | Última modificación | ";
print "Última consulta |
";
#
# leemos el subdirectorio
#
&leedir($path);
print "
\n";
# Empezamos el grafico
#
print "\n";
print "\n";
$todos = @contenido;
if ($todos > 0) {
print "
Gráfico comparativo
\n";
print "\n";
print "\n";
print "";
# Anchura maxima en pixels=400
# Escalamos los demas en funcion de su tamanyo respecto
# al directorio mas grande
#
$max = 0;
foreach $tamano (@contenido){
if ($tamano > $max) {
$max = $tamano;
}
}
$num_file = 0;
$alto = 15;
foreach $tamano (@contenido){
$ancho=int(400*$tamano/$max);
$x=$ordenados[$num_file];
print "| ";
print "$x | ";
print " $tamano";
print " | \n";
$num_file ++;
}
print " ";
print " |
";
print "";
print "Se han hallado $num_file ficheros y subdirectorios ";
print "ocupando un total de $total bytes ";
print "(aproximadamente $kas Kbytes)";
print "
";
} else {
print "No se muestra el gráfico comparativo ";
print "ya que sólo ";
print "se ha listado un subdirectorio ";
}
print "";
exit;
# Se acabo
#
####################################3
#
# Rutina que lee los directorios
#
sub leedir
{
# Pasamos al directorio actual y lo abrimos
#
$actual = @_[0];
chdir($actual);
opendir(CURDIR, ".") ||
die("No puedo abrir el subdirectorio");
# lo leemos
#
@ficheros = readdir(CURDIR);
# lo ordenamos por orden alfabetico
#
@ordenados = sort(@ficheros);
$subtotal=0;
foreach $file (@ordenados){
# tomamos el tamanyo del fichero
#
$tama= -s $file;
push(@contenido,$tama);
# Vemos las atributos para world
#
if (-r $file) {
$read="r";
} else {
$read="-";
}
if (-w $file) {
$write="w";
} else {
$write="-";
}
if (-x $file) {
$ex="x";
} else {
$ex="-";
}
# Numero de dias de antiguedad
# Comprobamos si es un directorio
#
$total = $total + $tama;
$dias_mod = &tiempo(-M $file);
$dias_con = &tiempo(-A $file);
if (-d $file){
# Sumamos su tamanyo
# al total y al subtotal. Lo presentamos en
# pantalla
#
if (($muestro ne "/")|($file ne "..")){
if ($file eq ".") {
$cadena="Directorio actual";
$cad2 = "Refrescar";
} else {
$cadena="Subdirectorio";
$cad2 = "Consultar";
}
if ($file eq "..") { $cadena = "Subir un nivel";}
$darlista = $quien_soy . "?". $muestro . $separador . $file;
$darlista =~ s/\/\//\//g;
print "| $file ($cadena)";
print " | $read$write$ex | ";
print "$tama | ";
if (-r $file){
print "$cad2";
} else { print "-----";}
print " | ";
print "$dias_mod | $dias_con |
\n";
}
} else {
# Si no es un subdirectorio hacemos lo mismo (mas o menos)
#
$noleer = "0";
if (-r $file) {$noleer="1";}
if ($muestro eq "/"){
$donde_esta = $serv. $separador . $file;
} else {
$donde_esta = $serv. $muestro . $separador . $file;
}
$que = $descarga."?".$root.$muestro.$separador.$file;
$que =~ s/\/\//\//g;
print "| ";
if ($noleer eq "0"){
print "$file";
} else {
print "$file";
}
print " | ";
print "$read$write$ex | $tama | ";
print "";
if ($noleer eq "0"){
print "-----";
} else {
print "Descargar";
}
print " | ";
print "$dias_mod | $dias_con |
\n";
}
}
# Pasamos a Kbytes el subtotal y lo escribimos
#
$kas = ($total-($total % $factor))/$factor;
print "| Total";
print " $total bytes ";
print "(aproximadamanete $kas Kbytes) |
";
close(CURDIR);
}
##########################################
# Pasa el tiempo a dias, horas y minutos
#
sub tiempo
{
local ($tmp,$dias,$horas,$minutos,$rdias,$rhoras,$rminutos,$final);
$tmp = @_[0];
$dias= int($tmp);
$rdias = $tmp-$dias;
$rhoras= 24*$rdias;
$horas = int($rhoras);
$rminutos = 60*($rhoras-$horas);
$minutos = int($rminutos);
if ($minutos < 10) { $minutos = "0".$minutos;}
$final = $minutos . "m";
if ($horas !=0) {
if ($horas < 10) { $horas = "0".$horas;}
$final = $horas . "h:" . $final;
if ($dias !=0) {$final= $dias . "d:" . $final;}
} else {
if ($dias != 0){ $final = $dias . "d:00h" . $final; }
}
return $final;
}