#!/bin/bash
#======================================================================
# Copyright (c) 1997 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.
#======================================================================
#
# SlackwareTrace
#
# Script interattivo da utilizzare per installare un programma
# normale in modo da aggiornare il sistema di gestione dei pacchetti
# installati della distribuzione Linux Slackware.
#
# I comandi necessari per l'installazione sono dati attraverso
# lo script stesso che provvede a confrontare il file system
# prima e dopo l'installazione.
#
# Viene generato automaticamente un file all'interno di
# ``/var/log/packages'' in modo da rendere possibile l'ispezione
# e l'eventuale rimozione dell'installazione da parte
# di ``pkgtool''.
#
# Questo script deve essere utilizzato come utente ``root'',
# quando nessun'altra attivita' viene svolta.
#
#======================================================================

#======================================================================
# Variabili.
#======================================================================

    #------------------------------------------------------------------
    # Nome per un file temporaneo utilizzato per ricevere le risposte
    # all'esecuzione del comando ``dialog --inputbox''.
    #------------------------------------------------------------------
    RISPOSTA="/tmp/risposta"
    #------------------------------------------------------------------
    # Nome per un file temporaneo contenente l'elenco dei file presenti
    # nel filesystem PRIMA.
    #------------------------------------------------------------------
    ELENCO_FILE_PRIMA="/tmp/elenco_PRIMA"
    #------------------------------------------------------------------
    # Nome per un file temporaneo contenente l'elenco dei file presenti
    # nel filesystem DOPO.
    #------------------------------------------------------------------
    ELENCO_FILE_DOPO="/tmp/elenco_DOPO"
    #------------------------------------------------------------------
    # Nome per un file temporaneo contenente l'elenco dei file aggiunti
    # nel filesystem dopo le operazioni di installazione.
    #------------------------------------------------------------------
    ELENCO_FILE_AGGIUNTI="/tmp/elenco_AGGIUNTI"
    #------------------------------------------------------------------
    # Variabile utilizzata per ricevere i comandi.
    #------------------------------------------------------------------
    COMANDO=""
    #------------------------------------------------------------------
    # Variabile utilizzata per ricevere il nome del pacchetto.
    #------------------------------------------------------------------
    PACCHETTO=""
    #------------------------------------------------------------------
    # Variabile utilizzata per ricevere la descrizione del pacchetto.
    #------------------------------------------------------------------
    DESCRIZIONE=""
    #------------------------------------------------------------------
    # Variabile utilizzata per salvare il prompt.
    #------------------------------------------------------------------
    SALVA_PROMPT=$PS1

#======================================================================
# Inizio.
#======================================================================

    #------------------------------------------------------------------
    # Verifica la quantit di argomenti.
    #------------------------------------------------------------------
    if [ $# != 0 ]
    then
	echo "Questo script  completamente interattivo e quindi non \
utilizza alcun argomento."
	exit 1
    fi
    #------------------------------------------------------------------
    # Verifica che l'utente sia 'root'.
    #------------------------------------------------------------------
    if [ $UID != 0 ]
    then
	echo "Questo script pu essere utilizzato solo dall'utente \
'root'."
	exit 1
    fi
    #------------------------------------------------------------------
    # Salva la situazione del filesystem PRIMA.
    # Sono esclusi i percorsi ``/tmp'' e ``/proc''.
    #------------------------------------------------------------------
    reset
    echo "---------------------------------------------------"
    echo " in corso la scansione del filesystem per "
    echo "determinare la situazione iniziale dei file esistenti."
    echo ""
    echo "Attendere prego..."
    echo "---------------------------------------------------"
    find \
/ -path "/proc" -prune -o -path "/tmp" -prune -o -path "/mnt" -prune \
-o -print | sort > $ELENCO_FILE_PRIMA
    #------------------------------------------------------------------
    # Avvia una subshell per l'esecuzione dei comandi necessari
    # all'installazione. Si comincia dall'avvisare l'utente.
    #------------------------------------------------------------------
    reset
    dialog --msgbox \
"Attenzione! Sta per essere avviata una subshell per\
\n\
l'esecuzione dei comandi necessari all'installazione\
\n\
del software.\
\n\
Di solito si tratta di eseguire qualcosa di molto simile\
\n\
a 'make install'.\
\n\
\n\
Al termine si dovr tornare allo script utilizzando\
\n\
il comando exit." \
18 70
    #------------------------------------------------------------------
    # Modifica il prompt.
    #------------------------------------------------------------------
    PS1=\
"Eseguire i comandi necessari a compiere l'installazione \
quindi utilizzare il comando exit per tornare allo script.\
\n\
$0>"
    export PS1
    #------------------------------------------------------------------
    # Avvia la subshell.
    #------------------------------------------------------------------
    /bin/sh
    #------------------------------------------------------------------
    # Ripristina il prompt.
    #------------------------------------------------------------------
    PS1=$SALVA_PROMPT
    export PS1
    #------------------------------------------------------------------
    # Salva la situazione del filesystem DOPO.
    # Sono esclusi i percorsi ``/tmp'' e ``/proc''.
    #------------------------------------------------------------------
    reset
    echo "---------------------------------------------------"
    echo " in corso la scansione del filesystem per "
    echo "determinare la nuova situazione dei file esistenti."
    echo ""
    echo "Attendere prego..."
    echo "---------------------------------------------------"
    find \
/ -path "/proc" -prune -o -path "/tmp" -prune -o -path "/mnt" -prune \
-o -print | sort > $ELENCO_FILE_DOPO
    #------------------------------------------------------------------
    # Confronta i due file ed emette solo le righe del secondo elenco
    # che non appaiono nel primo.
    # Salva il risultato in un altro file temporaneo.
    #------------------------------------------------------------------
    comm -13 \
$ELENCO_FILE_PRIMA $ELENCO_FILE_DOPO > $ELENCO_FILE_AGGIUNTI
    #------------------------------------------------------------------
    # Verifica che il file generato non sia vuoto.
    #------------------------------------------------------------------
    if [ -z "`cat $ELENCO_FILE_AGGIUNTI`" ]
    then
	#--------------------------------------------------------------
	# Non ha trovato alcun file in pi rispetto alla
	# situazione precedente. Lo script avvisa e termina.
	#--------------------------------------------------------------
	reset
	dialog --msgbox \
"Non  stato aggiunto alcun file.\
\n\
Non verr fatta alcuna registrazione di questa installazione." \
7 70
	exit 2
    fi
    #------------------------------------------------------------------
    # Richiede il nome del pacchetto.
    #------------------------------------------------------------------
    while [ 0 ]                                               # FOREVER
    do
	reset
	dialog --inputbox \
"Inserisci il nome da usare per identificare questo pacchetto.\
\n\
Per seguire la convenzione usata dalla procedura di installazione\
\n\
Slackware, si possono usare solo otto caratteri.\
\n\
Il nome del pacchetto servir per creare un file contenere le\
\n\
informazioni sul pacchetto, di conseguenza, occorre rispettare le\
\n\
regole per i nomi dei file.\
\n\
\n\
\n\
<Ok> prosegue,\
\n\
<Cancel> ripete la richiesta." \
17 70 2> $RISPOSTA
	#--------------------------------------------------------------
	# Controlla la risposta data dall'utente.
	#--------------------------------------------------------------
	if [ $? = 0 ]
	then
	    #----------------------------------------------------------
	    # La risposta  stata un OK e quindi prosegue.
	    #----------------------------------------------------------
	    PACCHETTO=`cat $RISPOSTA`
	else
	    #----------------------------------------------------------
	    # La risposta  stata un CANCEL e quindi ripete il loop.
	    #----------------------------------------------------------
	    continue
	fi
	#--------------------------------------------------------------
	# Controlla che il nome non sia gi utilizzato.
	#--------------------------------------------------------------
	if [ -e "/var/log/packages/$PACCHETTO" ]
	then
	    #----------------------------------------------------------
	    # Il nome esiste gi. Ripete il loop.
	    #----------------------------------------------------------
	    reset
	    dialog --msgbox \
"Attenzione! il nome $PACCHETTO  gi stato usato.\
\n\
Se ne deve inserire un altro."\
6 70
	    continue
	fi
	#--------------------------------------------------------------
	# Controlla che il nome sia accettabile tentando di creare
	# un file con quello.
	#--------------------------------------------------------------
	rm "/tmp/$PACCHETTO"
	echo "prova" > "/tmp/$PACCHETTO"
	#--------------------------------------------------------------
	# Se  riuscito a a creare il file, tutto dovrebbe
	# essere in ordine.
	#--------------------------------------------------------------
	if [ -e "/tmp/$PACCHETTO" ]
	then
	    #----------------------------------------------------------
	    # Il nome  valido.
	    #----------------------------------------------------------
	    echo "ok" > /dev/null
	else
	    #----------------------------------------------------------
	    # Il nome non  valido. Ripete il loop.
	    #----------------------------------------------------------
	    reset
	    dialog --msgbox \
"Attenzione! il nome $PACCHETTO non  valido.\
\n\
Se ne deve inserire un altro." \
7 70
	    continue
	fi
	#--------------------------------------------------------------
	# Se sono stati superati tutti gli ostacoli, il loop viene
	# interrotto.
	#--------------------------------------------------------------
	break
    done
    #------------------------------------------------------------------
    # Finalmente  stato inserito il nome del pacchetto.
    # Si passa ora alla sua descrizione.
    #------------------------------------------------------------------
    while [ 0 ]                                               # FOREVER
    do
	reset
	dialog --inputbox \
"Inserisci una breve descrizione del pacchetto.\
\n\
\n\
\n\
<Ok> prosegue,\
\n\
<Cancel> ripete la richiesta." \
12 70 2> $RISPOSTA
	#--------------------------------------------------------------
	# Controlla la risposta data dall'utente.
	#--------------------------------------------------------------
	if [ $? = 0 ]
	then
	    #----------------------------------------------------------
	    # La risposta  stata un OK e quindi prosegue.
	    #----------------------------------------------------------
	    DESCRIZIONE=`cat $RISPOSTA`
	else
	    #----------------------------------------------------------
	    # La risposta  stata un CANCEL e quindi ripete il loop.
	    #----------------------------------------------------------
	    continue
	fi
	#--------------------------------------------------------------
	# Se sono stati superati tutti gli ostacoli, il loop viene
	# interrotto.
	#--------------------------------------------------------------
	break
    done
    #------------------------------------------------------------------
    # Scrive il file del pacchetto.
    #------------------------------------------------------------------
    echo "PACKAGE NAME:     $PACCHETTO" > /var/log/packages/$PACCHETTO
    echo "COMPRESSED PACKAGE SIZE:" >> /var/log/packages/$PACCHETTO
    echo "UNCOMPRESSED PACKAGE SIZE:" >> /var/log/packages/$PACCHETTO
    echo "PACKAGE LOCATION:" >> /var/log/packages/$PACCHETTO
    echo "PACKAGE DESCRIPTION:" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO: $DESCRIZIONE" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO
    echo "$PACCHETTO:" >> /var/log/packages/$PACCHETTO
    echo "FILE LIST:" >> /var/log/packages/$PACCHETTO
    cat $ELENCO_FILE_AGGIUNTI >> /var/log/packages/$PACCHETTO
    #------------------------------------------------------------------
    # Avvisa l'utente della conclusione dell'operazione.
    #------------------------------------------------------------------
    reset
    dialog --msgbox \
"La registrazione del pacchetto $PACCHETTO  terminata." \
5 70

#======================================================================
# Fine.
#======================================================================
