I found bug.

If no IDE existed, it used to assign:
   devices='/dev/cdroms/*'
That is bad.  That section (needs to be)

    # Auto detect CDROM by devfs
    if [ -d /dev/cdroms ]; then
        devices=$(echo /dev/cdroms/*|grep -v '*' || true)
    else
        devices=""
    fi

Also 
    if [ -n "$devices" ]; then
needs to be moved up before
    for device in $devices

Some more code cleanings ...

By the way, it does not detect firewire CD now.

Osamu







#! /bin/sh

set -e
. /usr/share/debconf/confmodule
#set -x

log() {
    logger -t cdrom-detect "$@"
}

fail () {
    log "$@"
    db_input critical cdrom-detect/failure || [ $? -eq 30 ]
    db_go
    # redundant but to be sure
    umount /cdrom 2>/dev/null || true
    exit 1
}

hw-detect cdrom-detect/detect_progress_title || true

log "Searching for Debian installation media..."
maxmount=2      # max count of the mount try
imount=0        # mount counter
mounted=0       # 0=initial, 1=detection in progress, 2=mounted
while true
do
    if [ "$imount" -gt "$maxmount" ] ; then
        fail "Tried to mount CD $maxmount times and failed."
    fi
    log "main loop: $imount out of $maxmount"
    # Is a cdrom (image) already mounted at /cdrom?  Sanity check! 
    if [ ! -e /cdrom ] ; then
        # First run of cdrom-detect
        mkdir /cdrom 2>/dev/null || true
    elif [ "$mounted" = "1" ]; then
        # If a device was detected but the mount failed, ask for the CD.
        log "CDROM device was detected but the mount failed."
        db_input critical cdrom-detect/retry || [ $? -eq 30 ]
        db_go
        db_get cdrom-detect/retry
        if [ "$RET" = "true" ]; then
            imount=$((${imount}-1))
            mounted=0
            continue
        else
            fail "a device was detected but the mount failed."
        fi
    elif [ -e /cdrom/.disk/info ] ; then
        # Sanity check of CD before aproving mounted CD
        CDNAME=`cat /cdrom/.disk/info`
        log "Detected CD '$CDNAME'"
# Set the suite used by base-installer and base-config to
# the suite that is on the CD. This assumes that there will
# be no more than one distribution on the CD, and that one of the
# testing, stable, or unstable links will point to it. Since the
# CDs currently have many links, parse the Release file to get the
# actual suite name to use.
        for distlink in stable testing unstable ; do
            relfile=/cdrom/dists/$distlink/Release
            if [ -e $relfile ] ; then
                suite=$(sed -n 's/^Suite: *//p' $relfile)
                log "Detected CD with '$suite' distribution"
                db_set mirror/suite $suite
                break # for distlink loop
            fi
        done
        if [ "X" = "X${suite}" ]; then
            log "Could not determine the package 'suite'. Is the cdrom OK?"
            umount /cdrom 2>/dev/null || true
            mounted=1
            continue
        elif [ ! -e "/cdrom/dists/$suite/Release" ]; then
            log "No such file '/cdrom/dists/$suite/Release'. Is the cdrom OK?"
            umount /cdrom 2>/dev/null || true
            mounted=1
            continue
        fi
        log "successful mount, exit main loop."
        break

    elif mount | grep -q 'on /cdrom ' ; then
        log "The available CD is not a Debian CD!"
        umount /cdrom 2>/dev/null || true
        db_input critical cdrom-detect/wrong-cd || [ $? -eq 30 ]
        db_go
        imount=$((${imount}-1))
        mounted=0
        continue
    fi
    # mount CD
    imount=$((${imount}+1))
    mounted=1

    # Auto detect CDROM by devfs
    if [ -d /dev/cdroms ]; then
        devices=$(echo /dev/cdroms/*|grep -v '*' || true)
    else
        devices=""
    fi
    if [ -n "$devices" ]; then
        for device in $devices
        do
            if mount -t iso9660 -o ro,exec $device /cdrom; then
                log "CDROM-mount succeeded: device=$device"
                mounted=2
                db_set cdrom-detect/cdrom_device $device
                break # for device loop
            else
                log "CDROM-mount failed (error=$?): device=$device"
                log "Unmounting CD just to be sure."
                umount /cdrom 2>/dev/null || true
            fi
        done
        continue
    fi
 
    # Mount floppy if CD auto detect fails
    # If no device was detected, perhaps a driver floppy is needed.
    if [ -e /usr/lib/debian-installer/retriever/floppy-retriever ]; then
        db_input critical cdrom-detect/load_floppy
        db_go
        db_get cdrom-detect/load_floppy
        if [ "$RET" = true ]; then
            anna floppy-retriever
            hw-detect cdrom-detect/detect_progress_title || true
            mounted=2
            continue
        fi
    fi
    
    # Otherwise manual configuration may be needed
    db_input critical cdrom-detect/manual_config || [ $? -eq 30 ]
    db_go
    db_get cdrom-detect/manual_config

    modules=none
    for i in `ls -1 /lib/modules/*/kernel/drivers/cdrom/ | sed 's/\.ko$//' | sed 
's/\.o$//'`
    do
        modules="$modules, $i"
    done
    
    if [ "$RET" = "true" ]; then
        db_subst cdrom-detect/cdrom_module choices "$modules"
        db_input critical cdrom-detect/cdrom_module || [ $? -eq 30 ]
        db_go

        db_get cdrom-detect/cdrom_module
        module="$RET"

        db_input critical cdrom-detect/cdrom_device || [ $? -eq 30 ]
        db_go

        db_get cdrom-detect/cdrom_device
        device="$RET"

        if [ "$module" != "none" ]; then
            modprobe $module
        fi
        if mount -t iso9660 -o ro,exec $device /cdrom; then
            log "CDROM-mount succeeded: device=$device"
            db_set cdrom-detect/cdrom_device $device
            mounted=2
            db_set cdrom-detect/cdrom_device $device
        else
            log "CDROM-mount failed (error=$?): device=$device"
            log "Unmounting CD just to be sure and giving it up."
            umount /cdrom 2>/dev/null || true
        fi
        continue
    else
        fail "Manual CD mount refused."
    fi
    mounted=0
done


# Ask for eject to be installed into /target/, to be able to use it in
# the prebaseconfig script.
apt-install eject || true

# Hey, we're done
db_subst cdrom-detect/success cdname "$CDNAME"
db_input low cdrom-detect/success || [ $? -eq 30 ]
db_go

exit 0

Reply via email to