Montador de imágenes ISO

Nombre: mntiso
Autor: Luis Moreno Rodriguez
Lenguaje: Bash
Licencia: GPL

Monta de forma automática imágenes ISO usando los dispositivos /dev/loop. Es capaz de montar varias imágenes a la vez ya que busca cuales son los dispositivos loop que no están siendo usados. También puede montar una misma imagen varias veces usando automáticamente distintas carpetas de montaje.

El script siempre mostrará donde se monta cada imagen; por defecto las imágenes son montadas de forma independiente en la carpeta "mounted_ISO" en el directorio home del usuario. Este aspecto se puede configurar fácilmente editando una variable en el script.

Soporta paths relativos y absolutos.

mntiso imagen_iso
#!/bin/bash

# AUTOR: Luis Moreno Rodriguez          2009

function mount_iso () {
    # path where all iso files are mounted in diferent folders
    local MOUNT_DIR=$HOME/mounted_ISO

    if [ $# = 0 ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
        echo -e "Mount ISO files using /dev/loop's devices. All files are mounted in $MOUNT_DIR, in diferent folders with the names of iso files. Supports relative and absolute paths. Usage 'mntiso isofile1 isofile2...'"
        return
    fi

    for F in $*; do
        if [ ! -f "$F" ]; then echo "$F is not valid file"; fi
    done

    if ! lsmod | grep loop &>/dev/null; then
        echo "The loop module is not loaded, to load type 'modprobe loop'"; return
    fi

    if [ ! -d $MOUNT_DIR ]; then mkdir $MOUNT_DIR; fi

    # delete residual folders of old and not mounted ISO files
    MOUNT_POINTS=`ls $MOUNT_DIR/`
    for i in $MOUNT_POINTS; do
#TODO: debo mirar si no esta en mtab, no si esta vacio
        if [ -d $MOUNT_DIR/$i ] && [ `ls $MOUNT_DIR/$i | wc -l` -eq 0 ]; then rm -rf $MOUNT_DIR/$i; fi
    done

    local MAX_MOUNTS=`ls /dev/loop? | wc -l`
    local NUM_MOUNTED=`cat /etc/mtab | grep /dev/loop | wc -l`

    # loop; diferent ISOs
    for F in $*; do
        if [ $NUM_MOUNTED -eq $MAX_MOUNTS ]; then
            echo -e "You can't mount more ISO files. You need umount some ISO; there are mounted $NUM_MOUNTED ISO files and the maximum allowed is $MAX_MOUNTS"; return
        fi

        local ISO=${F##*/} # the iso file to mount; without path
        local MOUNT_POINT=$MOUNT_DIR/${ISO%.*} #without .iso extension

        # loop; probe with all loops devices; /dev/loop0 /dev/loop1 ..... /dev/loopN
        for d in `ls /dev/loop?`; do

            # if device is not in use
            if ! cat /etc/mtab | grep $d &>/dev/null; then

                echo -ne "\nmounting $ISO using $d device... "
                mkdir -p ${MOUNT_POINT}_${d##*/}
           
                if mount -o ro,loop=$d -t iso9660 $F ${MOUNT_POINT}_${d##*/}; then
                    echo -e "done!\nfor unmount type 'umount ${MOUNT_POINT}_${d##*/}'"
                    NUM_MOUNTED=`expr $NUM_MOUNTED + 1`
                else
                    rm -rf ${MOUNT_POINT}_${d##*/}
                    echo -e "ERROR!"
                fi
                break
            fi
        done
    done
}

mount_iso $*