#!/usr/bin/perl
##
## mirror-http <URI> <opzioni-supplementari>
##
## Mantiene una copia speculare dell'URI indicato.
## In generale, l'URI deve essere una pagina HTML.
##
#
# URI di partenza.
#
$punto_di_partenza = $ARGV[0];
#
if ($punto_di_partenza eq "")
  {
    print STDOUT ("mirror-http URI [OPZIONI_SUPPLEMENTARI]\n");
    exit (1);
  }
#
# Directory corrente.
#
$pwd = `pwd`;
chomp ($pwd);
#
# Opzioni per wget.
#
$op_normali = "--mirror --no-parent -nH";
$op_supplementari = $ARGV[1];
#
# Elenco attuale.
#
@elenco_attuale = ();
$i_attuale = 0;
#
# Elenco preesistente.
#
@elenco_preesistente = ();
$i_preesistente = 0;
#
# File trovato.
#
$file_trovato = 0;
#
# Record letto.
#
$riga = "";
#
# Avvia wget e preleva l'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 (si trova delimitato
        # da Ť`ť e Ť'ť).
        #
        $riga =~ m|`(.*)?'|;
        #
        # Accumula nell'array.
        #
        $elenco_attuale[$#elenco_attuale+1] = $1;
      }
    #
    # Riemette tutte le informazioni generate da wget.
    #
    print STDOUT ("$riga");
  }
#
# Chiude il flusso 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 flusso 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 file system locale.
#
for ($i_preesistente = 0 ;
     $i_preesistente <= $#elenco_preesistente ;
     $i_preesistente++)
  {
    #
    # Azzera la variabile booleana 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");
#
