Script grafico per montare immagini ISO

Mar, 01/02/2005 - 02:11

Script grafico per montare immagini ISO

Inviato da paulatz 4 commenti

Questo è un semplice script per bash che permette di montare con una comoda interfaccia grafica un file contenente un'immagine ISO.

Per chi non conosce questa possibilità specifico che il file viene montato in "loopback" cioè utilizzando una funzione del kernel che permette di trattare un semplice file come se fosse un dispositivo fisico.

Gli unici requisiti sono la presenza di kdialog e di konqueror e la presenza di una riga in /etc/fstab che permetta di montare in loopback. Questa è la mia riga di /etc/fstab

/tmp/loop.iso /media/loop iso9660 ro,noexec,user,nosuid,loop 0 0

Le opzioni permesse sono:
-h un breve aiuto;
-u si limita a smontare eventuali files montati;
-e elenca i codici d'errore restituiti.

Lo script è nato come un auto-esercizio sull'utilizzo di if.. else.. fi in bash. Tuttavia dovrebbe contenere abbastanza commenti da essere comprensibile a chiunque abbia una infarinatura di bash.
Questo script non è prefetto. Ad esmpio può non funzionare se /etc/fstab contiene più di una riga contenente l'opzione loop
#!/bin/bash
# Copyright (C) 2004 by Lorenzo Paulatto
# paulatz [AT] email.it
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License.

# Questa stringa viene restituita da "file" quando si esamina una immagine ISO
ISO_ID_STRING="ISO 9660 CD-ROM filesystem data"

# Funzione che stampa i messaggi d'errore
error_message () {
echo "***" "$1" >&2
kdialog --title KLM\ Errore! --error "$1"
}

# Restituisce il messaggio d'aiuto
print_synopsis () {
echo "\
Uso: $0 [OPZIONI] [DIRECTORY|FILE]

Monta in loopbak il FILE oppure richiede di aprire un file a partire
dalla directory corrente o da DIRECTORY.
Richiede che kdialog e konqueror siano installati e nella PATH.
Richiede la presenza di una riga relativa al montaggio di filesystems
in loopback in fstab; ad esempio:
/tmp/loop.iso /mnt/loop iso9660 loop,user,noexec,nosuid,noauto 0 0

Opzioni:
-h --help Stampa questo messaggio ed esce.
-e --errors Stampa i codici di errore ed esce.
-u --umount Smonta il filesystem, se montato, ed esce senza richiedere
conferma"
exit 0
}

# Resituisce i codici d'errore
print_errors () {
echo "\
Codici d'errore:
1: Il file specificato non esiste.
2: Il file specificato non è un'immagine ISO.
3: Il posto in cui creare il simlink all'immagine ISO è occupato.
4: Il file /etc/fstab non contiene una linea per montare i filesystem in loop.
5: Il mount point specificato in /etc/fstab è inesistente.
6: Il punto di mount è occupato
7: Impossibile creare il simlink
8: Impossibile montare il file
9: Nessun file specificato"

exit 0
}

# Se l'argomento specificato è una directory allora verrà usato
# come directory iniziale per la selezione del file ISO
START_DIR="."
if test "x$1" != "x" && test -d "$1"; then
START_DIR="$1"
fi

# Se l'argomento specificato è -h oppure --help stampa
# il messaggio d'aiuto ed esce.
if echo $1|grep -F -- '-h
--help' 1>/dev/null 2>/dev/null ; then
print_synopsis
fi

# Se l'argomento specificato è -e oppure --error stampa
# il messaggio d'aiuto ed esce.
if echo $1|grep -F -- '-e
--error' 1>/dev/null 2>/dev/null ; then
print_errors
fi

# I software utilizzati:
ERROR="/opt/kde3/bin/kdialog --title Errore! --error"
YESNO="/opt/kde3/bin/kdialog --yesno"
KONQUEROR="/opt/kde3/bin/konqueror"

# Ricavo da /etc/fstab la posizione dell'immagine ISO e il punto di montaggio
echo -n "Estraggo le informazioni da /etc/fstab -> " >&2
FSTAB_INFO="`grep '[ \t,]loop[ \t,]' /etc/fstab`"
LINK="`echo $FSTAB_INFO|awk '{ print $1}'`"
MOUNT_POINT="`echo $FSTAB_INFO|awk '{ print $2}'`"

# E controllo che le informazioni siano valide
if test "x$LINK" = "x"; then
error_message File\ \/etc\/fstab\ non\ valido\!
exit 4
elif test "x$MOUNT_POINT" = "x"; then
error_message File\ \/etc\/fstab\ non\ valido\!
exit 4
elif test ! -d "$MOUNT_POINT"; then
error_message File\ \/etc\/fstab\ non\ valido\!\\n\ Punto\ di\ mount\ inesistente\!
exit 5
fi
echo -n "Posso montare \"$LINK\" su \"$MOUNT_POINT\" -> " >&2

# Se c'è già un file montato devo smontarlo
if mount|grep "$MOUNT_POINT" 1>/dev/null 2>/dev/null ; then
# Controllo che sia possibile smontarlo
if umount "$MOUNT_POINT" 1>/dev/null 2>/dev/null ; then
echo -n "Libero il punto di montaggio -> " >&2

# Se è stata usata l'opzione "-u" esco direttamente
if echo $1|grep -F -- '-u
--umount' 1>/dev/null 2>/dev/null ; then
echo "Fatto!" >&2
exit 0
fi

# Altrimenti chiedo se devo montarene un'altro
if $YESNO Monto\ un\ altro\ file\? 1>/dev/null 2>/dev/null ; then
true
else
echo "Fatto!" >&2
exit 0
fi
else
error_message Punto\ di\ mount\ occupato\!
exit 6
fi
fi

# Se è stata usata l'opzione "-u" e sono ancora qui devo uscire!
if echo $1|grep -F -- '-u
--umount' 1>/dev/null 2>/dev/null ; then
echo "Filesystem non montato." >&2
exit 0
fi

# Se esiste già il $LINK lo cancello
if test -w "$LINK"; then
if rm -f "$LINK" 1>/dev/null 2>/dev/null; then
echo -n "Cancello il simlink precedente -> " >&2
# Se non posso cancellarlo protesto ed esco
else
error_message Non\ posso\ cancellare\ il\ link\ temporaneo\!
exit 3
fi
fi

# Se l'argomento specificato è un'immagine ISO valida utilizzo quella
if test "x$1" != "x" && test -e "$1" && file "$1" |grep "$ISO_ID_STRING" 1>/dev/null 2>/dev/null ; then
ISO="$1"
echo -n "File \"$ISO\" trovato -> " >&2
else
# Altrimenti chiedo di aprire un file ISO
echo -n "Richiedo un file ISO -> " >&2
ISO=`kdialog --title "Selezionare una immagine ISO" --getopenfilename "$START_DIR" "*.iso *.bin *.img"`
# Controllo che sia stato scelto un file
if test "x$ISO" = "x" ; then
error_message Nessun\ file\ specificato\!
exit 9
fi
# Controllo che il file esista
if test -e "$ISO"; then
echo -n "File \"$ISO\" trovato -> " >&2
else
error_message File\ non\ trovato\!
exit 1
fi

# Controllo che il file sia una immagine ISO
if file "$ISO" |grep "$ISO_ID_STRING" 1>/dev/null 2>/dev/null ; then
echo -n "File ISO valido -> " >&2
else
error_message Non\ è\ un\'immagine\ ISO\ valida\!
exit 2
fi
fi

# Creo un simlink a $ISO in $LINK
if ln -s "$ISO" "$LINK" 1>/dev/null 2>/dev/null; then
echo -n "Creo il simlink di \"$ISO\" in \"$LINK\" -> " >&2
else
error_message Impossibile\ creare\ il\ link\!
exit 7
fi

# Finalmente monto il file in loop
if mount "$MOUNT_POINT" 1>/dev/null 2>/dev/null; then
echo -n "Monto \"$MOUNT_POINT\" -> " >&2
else
error_message Impossibile\ montare\ il\ file\!
exit 8
fi

# Apro una finestra di konqueror in $MOUNT_POINT
echo -n "Avvio "\`$KONQUEROR \"$MOUNT_POINT\"\'" -> " >&2
"$KONQUEROR" "$MOUNT_POINT" 1>/dev/null 2>/dev/null &

echo 'Successo!' >&2
exit 0


In:



Commenti

Ritratto di Federico
#1

Inviato da Federico il Dom, 06/02/2005 - 21:20.

È una guida ?

Più che di una guida si tratta di un'utility Wink
Posso dire che è ben commentata e segue uno stile professionale.

Inoltre grazie a te ho scoperto kdialog, mi vergogno a dirlo ma non lo conoscevo e mi serviva proprio Laughing



Ritratto di paulatz
#2

Inviato da paulatz il Mer, 30/03/2005 - 17:51.

Re: È una guida ?

Ti ringrazio Big Grin .

ATTENZIONE
VERSIONE AGGIORNATA, corretto un bug e funzionamento mooolto più veloce, la trovate qui.

Nella guida è andata persa la formattazione verticale, la versione originale del file è qui.



Ritratto di Nighthack
#3

Inviato da Nighthack il Dom, 29/06/2008 - 16:49.

Re: È una guida ?

Sui link viene 404, not found,

SuSE RULEZZZZ 8-)



Ritratto di Mirko
#4

Inviato da Mirko il Dom, 29/06/2008 - 17:00.

Re: È una guida ?

No, non è una guida, è il sorgente di uno script