tags 267168 patch
thanks

Since I posted many buggy codes :-( , I post the working one here.
(The bottom of BTS for cdrom-detect.)

This should solve most of cdrom-detect bug reports :-)

I reported success for Dell DMA case on 265636 using this patch.

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

maxmount=2      # max counts of the mounting tries
imount=0        # mount counter
mounted=0       # 0=initial, 1=detection in progress, 2=mounted
while true
do
    log "Searching for Debian installation media..."
    if [ ! -e /cdrom ] ; then
        mkdir /cdrom 2>/dev/null || true
    elif [ "$mounted" = "1" ]; then
        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
            mounted=0
            continue
        else
            fail "Retry of cdrom detect refused."
        fi
    elif [ -e /cdrom/.disk/info ] ; then
        log "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 from Release file.
        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
            fi
        done
        # For DMA related mount errors. (RR extension)
        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 "Exit main loop after approving mounted CD."
        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
    
    # Start detecting and mounting cdrom
    if [ "$imount" -ge "$maxmount" ] ; then
        fail "Tried to mount media $imount times and failed."
    fi
    imount=$((${imount}+1))
    log "Loop $imount out of $maxmount"
    mounted=1

    log "Try to detect a cdrom automatically by devfs."
    # This cdrom detection can be disabled by CDROM_DEVICES=none
    if [ -n "$CDROM_DEVICES" ]; then
        devices="$CDROM_DEVICES"
    elif [ -d /dev/cdroms ]; then
        devices=$(echo /dev/cdroms/*|grep -Fv '*' || true)
    else
        devices=""
    fi
    if [ -n "$devices" ] && [ "$devices" != "none" ]; 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"
                umount /cdrom 2>/dev/null || true
                mounted=0
            fi
        done
        continue
    fi
 
    log "Try to mount a driver floppy since no auto-cdrom device found."
    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
            imount=$((${imount}-1))
            mounted=2
            continue
        fi
    fi
    
    log "Try to mount a cdrom on old non-devfs hardwares manually."
    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"
            umount /cdrom 2>/dev/null || true
            imount=$((${imount}-1))
            mounted=0
        fi
        continue
    fi
    fail "No media detected: auto-cdrom, floppy, manual-cdrom."
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