#!/usr/bin/perl
#=======================================================================
# Copyright (c) 1998-1999 Daniele Giacomini daniele@pluto.linux.it
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#=======================================================================
# mirror-http <URL> <opzioni-supplementari>
#
# Mantiene una copia speculare dell'URL indicato.
# In generale, l'URL deve essere una pagina HTML.
#=======================================================================

#-----------------------------------------------------------------------
# URL di partenza.
#-----------------------------------------------------------------------
$punto_di_partenza = $ARGV[0];

#-----------------------------------------------------------------------
# Directory corrente.
#-----------------------------------------------------------------------
$pwd = `pwd`;
chomp ( $pwd );

#-----------------------------------------------------------------------
# Opzioni per wget.
#-----------------------------------------------------------------------
$op_normali = "--mirror --no-parent -nH";
$op_supplementari = $ARGV[1];

#-----------------------------------------------------------------------
# Elenco attuali.
#-----------------------------------------------------------------------
@elenco_attuale = ();
$i_attuale = 0;

#-----------------------------------------------------------------------
# Elenco preesistente.
#-----------------------------------------------------------------------
@elenco_preesistente = ();
$i_preesistente = 0;

#-----------------------------------------------------------------------
# File trovato.
#-----------------------------------------------------------------------
$file_trovato = 0;

#-----------------------------------------------------------------------
# Record letto.
#-----------------------------------------------------------------------
$riga = "";

#-----------------------------------------------------------------------
# Avvia wget e preleva lo standard output.
#-----------------------------------------------------------------------
open ( WGET,
    "/usr/bin/wget $op_normali $op_supplementari $punto_di_partenza 2>&1 |" );

#-----------------------------------------------------------------------
# Legge il risultato delle operazioni di wget e ne estrae i nomi dei
# file aggiornati.
#-----------------------------------------------------------------------
while ( $riga = <WGET> ) {

    #-------------------------------------------------------------------
    # Se la riga letta contiene il simbolo =>, allora contiene
    # l'informazione su un file aggiornato.
    #-------------------------------------------------------------------
    if ( $riga =~ m|=>| ) {
    
	#---------------------------------------------------------------
	# La riga contiene il percorso di un file locale che  stato
	# aggiornato: occorre estrarre questo nome.
	#---------------------------------------------------------------
	$riga =~ m|`(.*)?'|;
	
	#---------------------------------------------------------------
	# Accumula nell'array.
	#---------------------------------------------------------------
	$elenco_attuale[$#elenco_attuale+1] = $1;

    }

    #-------------------------------------------------------------------
    # Riemette tutte le informazioni generate da wget.
    #-------------------------------------------------------------------
    print STDOUT "$riga";
}

#-----------------------------------------------------------------------
# Chiude il filehandle abbinato all'esecuzione di wget.
#-----------------------------------------------------------------------
close ( WGET );

#-----------------------------------------------------------------------
# Avvia find per elencare i file esistenti effettivamente dopo
# l'aggiornamento con wget.
#-----------------------------------------------------------------------
open ( FIND, "/usr/bin/find . -type f -print |" );

#-----------------------------------------------------------------------
# Legge il risultato di find e accumula i nomi dei file.
#-----------------------------------------------------------------------
while ( $riga = <FIND> ) {

    #-------------------------------------------------------------------
    # Se la riga letta contiene il simbolo ./ iniziale, allora
    # contiene l'informazione su un file esistente.
    #-------------------------------------------------------------------
    if ( $riga =~ m|^\./| ) {
    
	#---------------------------------------------------------------
	# La riga contiene il percorso di un file locale:
	# occorre estrarre questo nome togliendo il prefisso ./.
	#---------------------------------------------------------------
	$riga =~ m|^\./(.*)|;
	
	#---------------------------------------------------------------
	# Accumula nell'array.
	#---------------------------------------------------------------
	$elenco_preesistente[$#elenco_preesistente+1] = $1;
    }
}

#-----------------------------------------------------------------------
# Chiude il filehandle abbinato all'esecuzione di find.
#-----------------------------------------------------------------------
close ( FIND );

#-----------------------------------------------------------------------
# Scandisce i due array alla ricerca di file che devono essere
# cancellati.
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
# Scandisce prima l'array contenente i file che esistono fisicamente
# nel filesystem locale.
#-----------------------------------------------------------------------
for (
	$i_preesistente = 0 ;
        $i_preesistente <= $#elenco_preesistente ;
	$i_preesistente++
    ) {

    #-------------------------------------------------------------------
    # Azzera il flag che serve a indicare quando un file deve rimanere.
    #-------------------------------------------------------------------
    $file_trovato = 0;

    #-------------------------------------------------------------------
    # Per ogni elemento dell'array, scandisce l'array contenente
    # l'elenco dei file aggiornati.
    #-------------------------------------------------------------------
    for (
	$i_attuale = 0 ;
        $i_attuale <= $#elenco_attuale ;
	$i_attuale++
    ) {

	#---------------------------------------------------------------
	# Verifica se i nomi corrispondono.
	#---------------------------------------------------------------
	if ( $elenco_preesistente[$i_preesistente]
	    eq $elenco_attuale[$i_attuale] ) {

    	    #-----------------------------------------------------------
	    # Il file deve rimanere, e questo ciclo interno termina.
    	    #-----------------------------------------------------------
	    $file_trovato = 1;
	    last;
	}
    }

    #-------------------------------------------------------------------
    # Verifica se deve cancellare il file.
    #-------------------------------------------------------------------
    if ( ! $file_trovato ) {

        #---------------------------------------------------------------
        # Cancella il file.
        #---------------------------------------------------------------
        unlink $elenco_preesistente[$i_preesistente];

        #---------------------------------------------------------------
        # Segnala l'eliminazione
        #---------------------------------------------------------------
        print STDOUT
	    "eliminato: $pwd/$elenco_preesistente[$i_preesistente]\n";

    }
}

#-----------------------------------------------------------------------
# Elimina le directory vuote.
#-----------------------------------------------------------------------
system ( "/usr/bin/find . -type d -exec rmdir \\{\\} \\; 2> /dev/null" );

#======================================================================

