Package: cdrom-detect
Version: 1.61
Severity: normal
Tags: patch

Dear Debian Install System Team,

Debian installer returns to the main menu at apt-setup-udeb
when we mount ISO image on /cdrom by hand.

http://anonscm.debian.org/cgit/d-i/cdrom-detect.git/tree/debian/cdrom-detect.postinst#n83
> # Is a cdrom already mounted? If so, assume it's the right one.
> mount | grep -q 'on /cdrom' && set_suite_and_codename && exit 0
> if [ -e /cdrom/.disk/info ]; then
>         CDNAME=$(cat /cdrom/.disk/info)
>         log "Detected CD '$CDNAME'"
>         set_suite_and_codename
>         exit 0
> fi

If there is an already mounted /cdrom directory, the installer skips
the rest of the commands, especially:

http://anonscm.debian.org/cgit/d-i/cdrom-detect.git/tree/debian/cdrom-detect.postinst#n268
> # Hey, we're done
> db_subst cdrom-detect/success cdname "$CDNAME"
> db_input low cdrom-detect/success || [ $? -eq 30 ]
> db_go
>
> anna-install apt-mirror-setup || true
> if [ ! -e /cdrom/.disk/base_installable ]; then
>         log "Base system not installable from CD, requesting choose-mirror"
>         anna-install choose-mirror || true
> else
>         anna-install apt-cdrom-setup || true
>
>         # Install <codename>-support udeb (if available).
>         db_get cdrom/codename
>         anna-install $RET-support || true
> fi

This missing configuration causes an error at:

https://anonscm.debian.org/cgit/d-i/apt-setup.git/tree/generators/50mirror#n58
> db_metaget apt-setup/use/netinst description

Error message (with 'set -x'):

> + db_metaget apt-setup/use/netinst description
(snip)
> + RET=10 apt-setup/use/netinst doesn't exist
> + return 10

This error prevents further installation.
Archived Bug#636145 might be the same issue. (see Message #22 and #27)


This is similar to Bug#594344:

Message #14
> I wonder, though, if some of the other steps later on (after the exit 0 when a
> premounted /cdrom is found) might be also useful to do, such as validating the
> Release file, precaching, and falling back to looking for a mirror when all
> else fails.  But this patch will at least allow debian-installer-launcher to
> work in what I hope is a fairly unintrusive way.

Unfortunately, that kind of issue happened.

A patch sequence attached.
I feel this "maybe-intrusive" way is the best, however,
I can write another fix if you don't feel so.

Note: We may need to ask the user some questions and set some
variables for other installations, in addition to this fix.


Confirmed on: debian-testing-amd64-netinst.iso (daily, today)
on qemu-kvm with -cdrom option.

1. Before cdrom-detect, execute:
     # mkdir /cdrom
     # mount -t iso9660 /dev/cdrom /cdrom
2. Continue the installation as usual.
3. At apt-setup-udeb, the installer returns to the main menu.
4. Activating "Configure the package manager" gets the same result.


Best regards,
  Hiroshi Ohkubo


-- 
Hiroshi Ohkubo
<ohkubo...@gmail.com>
From 13904ed6c79d18dbb32673b2c2f1f95c48e4fadc Mon Sep 17 00:00:00 2001
From: Hiroshi Ohkubo <ohkubo...@gmail.com>
Date: Sat, 13 Feb 2016 14:48:22 +0900
Subject: [PATCH 1/3] Revert commit 9191d29

Revert "Set cdrom/suite and cdrom/codename
when premounted /cdrom found. Closes: #594344."

The bug will be fixed by the next commit,
as long as another one.

This reverts commit 9191d29c5b20c3216078fc9a4979a556cb2f7c89.

Signed-off-by: Hiroshi Ohkubo <ohkubo...@gmail.com>
---
 debian/cdrom-detect.postinst | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/debian/cdrom-detect.postinst b/debian/cdrom-detect.postinst
index 6bf2454..da7dadf 100755
--- a/debian/cdrom-detect.postinst
+++ b/debian/cdrom-detect.postinst
@@ -39,24 +39,6 @@ try_mount() {
 	return $ret
 }
 
-# Set the suite and codename used by base-installer and base-config
-# to the suite/codename that is on the CD. In case there are multiple
-# suites, prefer the one in default-release.
-set_suite_and_codename() {
-	for dir in $(cat /etc/default-release) $(ls -1 /cdrom/dists/); do
-		relfile="/cdrom/dists/$dir/Release"
-		if [ -e $relfile ]; then
-			suite=$(sed -n 's/^Suite: *//p' "$relfile")
-			codename=$(sed -n 's/^Codename: *//p' "$relfile")
-			log "Detected CD with '$suite' ($codename) distribution"
-			db_set cdrom/suite "$suite"
-			db_set cdrom/codename "$codename"
-
-			break
-		fi
-	done
-}
-
 OS=$(udpkg --print-os)
 case "$OS" in
 	kfreebsd)
@@ -81,11 +63,10 @@ case "$OS" in
 esac
  
 # Is a cdrom already mounted? If so, assume it's the right one.
-mount | grep -q 'on /cdrom' && set_suite_and_codename && exit 0
+mount | grep -q 'on /cdrom' && exit 0
 if [ -e /cdrom/.disk/info ]; then
 	CDNAME=$(cat /cdrom/.disk/info)
 	log "Detected CD '$CDNAME'"
-	set_suite_and_codename
 	exit 0
 fi
 
@@ -253,7 +234,21 @@ for pooldir in /cdrom/pool/*/*; do
 done
 db_progress STOP
 
-set_suite_and_codename
+# Set the suite and codename used by base-installer and base-config
+# to the suite/codename that is on the CD. In case there are multiple
+# suites, prefer the one in default-release.
+for dir in $(cat /etc/default-release) $(ls -1 /cdrom/dists/); do
+	relfile="/cdrom/dists/$dir/Release"
+	if [ -e $relfile ]; then
+		suite=$(sed -n 's/^Suite: *//p' "$relfile")
+		codename=$(sed -n 's/^Codename: *//p' "$relfile")
+		log "Detected CD with '$suite' ($codename) distribution"
+		db_set cdrom/suite "$suite"
+		db_set cdrom/codename "$codename"
+
+		break
+	fi
+done
 
 if [ -z "$suite" ]; then
 	log "Error reading Release file; unable to determine distribution"
-- 
2.1.4

From 26fe9b02f794efa467fc952fab0ff42fdad96b57 Mon Sep 17 00:00:00 2001
From: Hiroshi Ohkubo <ohkubo...@gmail.com>
Date: Sat, 13 Feb 2016 14:57:10 +0900
Subject: [PATCH 2/3] Don't exit when premounted /cdrom found

Return from newly extracted detect_and_mount_cdrom instead.

Signed-off-by: Hiroshi Ohkubo <ohkubo...@gmail.com>
---
 debian/cdrom-detect.postinst | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/debian/cdrom-detect.postinst b/debian/cdrom-detect.postinst
index da7dadf..5f5cf1a 100755
--- a/debian/cdrom-detect.postinst
+++ b/debian/cdrom-detect.postinst
@@ -62,12 +62,13 @@ case "$OS" in
 		
 esac
  
+detect_and_mount_cdrom() {
 # Is a cdrom already mounted? If so, assume it's the right one.
-mount | grep -q 'on /cdrom' && exit 0
+mount | grep -q 'on /cdrom' && return 0
 if [ -e /cdrom/.disk/info ]; then
 	CDNAME=$(cat /cdrom/.disk/info)
 	log "Detected CD '$CDNAME'"
-	exit 0
+	return 0
 fi
 
 hw-detect cdrom-detect/detect_progress_title || true
@@ -95,7 +96,7 @@ while true; do
 	devices="$(list-devices cd; list-devices maybe-usb-floppy)"
 	for device in $devices; do
 		if try_mount $device $CDFS; then
-			break 2
+			return 0
 		fi
 	done
 	
@@ -103,11 +104,11 @@ while true; do
 	for device in $devices; do
 		if try_mount $device $CDFS; then
 			db_set cdrom-detect/hybrid true
-			break 2
+			return 0
 		fi
 		if try_mount $device $FATFS; then
 			db_set cdrom-detect/usb-hdd true
-			break 2
+			return 0
 		fi
 	done
 
@@ -194,7 +195,7 @@ while true; do
 		if mount -t $CDFS -o $OPTIONS $device /cdrom; then
 			log "CD-ROM mount succeeded: device=$device fstype=$CDFS"
 			db_set cdrom-detect/cdrom_fs $CDFS
-			break
+			return 0
 		else
 			log "CD-ROM mount failed: device=$device fstype=$CDFS"
 			fail
@@ -203,6 +204,8 @@ while true; do
 		fail
 	fi
 done
+}
+detect_and_mount_cdrom
 
 # Check for unetbootin files
 UNETBOOTIN_FILES="ubnfilel.txt ubninit ubnkern ubnpathl.txt"
-- 
2.1.4

From 3befa4d1e65c9471f9321339c088b90c834b6be0 Mon Sep 17 00:00:00 2001
From: Hiroshi Ohkubo <ohkubo...@gmail.com>
Date: Sat, 13 Feb 2016 15:02:41 +0900
Subject: [PATCH 3/3] Cosmetic fix

* Define detect_and_mount_cdrom earlier
* Indent
* Remove trailing spaces

Signed-off-by: Hiroshi Ohkubo <ohkubo...@gmail.com>
---
 debian/cdrom-detect.postinst | 289 ++++++++++++++++++++++---------------------
 1 file changed, 145 insertions(+), 144 deletions(-)

diff --git a/debian/cdrom-detect.postinst b/debian/cdrom-detect.postinst
index 5f5cf1a..0c92e8e 100755
--- a/debian/cdrom-detect.postinst
+++ b/debian/cdrom-detect.postinst
@@ -39,6 +39,150 @@ try_mount() {
 	return $ret
 }
 
+detect_and_mount_cdrom() {
+	# Is a cdrom already mounted? If so, assume it's the right one.
+	mount | grep -q 'on /cdrom' && return 0
+	if [ -e /cdrom/.disk/info ]; then
+		CDNAME=$(cat /cdrom/.disk/info)
+		log "Detected CD '$CDNAME'"
+		return 0
+	fi
+
+	hw-detect cdrom-detect/detect_progress_title || true
+
+	log "Searching for Debian installation media..."
+
+	mkdir /cdrom 2>/dev/null || true
+
+	# Need to wait for the usb device scan to complete
+	if [ "$OS" = "linux" ]; then
+	  for count in 1 2 3 4 5 6 8 9 10; do
+	    devices="$(list-devices cd; list-devices maybe-usb-floppy)"
+	    log "Devices: '$devices'"
+	    if [ -n "$devices" ]; then
+	      break 2
+	    else
+	      sleep 1
+	    fi
+	  done
+	fi
+
+	while true; do
+		WRONG=
+
+		devices="$(list-devices cd; list-devices maybe-usb-floppy)"
+		for device in $devices; do
+			if try_mount $device $CDFS; then
+				return 0
+			fi
+		done
+
+		devices="$(list-devices usb-partition)"
+		for device in $devices; do
+			if try_mount $device $CDFS; then
+				db_set cdrom-detect/hybrid true
+				return 0
+			fi
+			if try_mount $device $FATFS; then
+				db_set cdrom-detect/usb-hdd true
+				return 0
+			fi
+		done
+
+
+		if [ "$WRONG" ]; then
+			db_input critical cdrom-detect/wrong-cd || [ $? -eq 30 ]
+			db_go
+			fail
+		fi
+
+		# If a device was detected but the mount failed, ask for the CD.
+		if [ -n "$devices" ]; then
+			db_input critical cdrom-detect/retry || [ $? -eq 30 ]
+			db_go
+			db_get cdrom-detect/retry
+			if [ "$RET" = "true" ]; then
+				log "Unmounting CD just to be sure"
+				umount /cdrom 2>/dev/null || true
+				continue
+			else
+				fail
+			fi
+		fi
+
+		# If no device was detected, perhaps a driver floppy is needed.
+		if [ -e /usr/lib/debian-installer/retriever/media-retriever ]; then
+			db_input critical cdrom-detect/load_media
+			db_go
+			db_get cdrom-detect/load_media
+			if [ "$RET" = true ]; then
+				anna media-retriever
+				hw-detect cdrom-detect/detect_progress_title || true
+				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
+
+		if [ "$RET" = true ]; then
+			case "$OS" in
+				linux)
+					modules=none
+					for i in $(ls -1 /lib/modules/*/kernel/drivers/cdrom/ | \
+						   sed 's/\.ko$//' | sed 's/\.o$//'); do
+						modules="$modules, $i"
+					done
+
+					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
+					if [ "$RET" != none ]; then
+						modprobe $RET
+					fi
+					;;
+				kfreebsd)
+					modules=none
+					for i in $(ls -1 /lib/modules/$(uname -r)/ | \
+						   sed 's/\.ko$//'); do
+						modules="$modules, $i"
+					done
+
+					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
+					if [ "$RET" != none ]; then
+						kldload $RET
+					fi
+					;;
+			esac
+
+			db_input critical cdrom-detect/cdrom_device || [ $? -eq 30 ]
+			db_go
+
+			db_get cdrom-detect/cdrom_device
+			device="$RET"
+
+			if mount -t $CDFS -o $OPTIONS $device /cdrom; then
+				log "CD-ROM mount succeeded: device=$device fstype=$CDFS"
+				db_set cdrom-detect/cdrom_fs $CDFS
+				return 0
+			else
+				log "CD-ROM mount failed: device=$device fstype=$CDFS"
+				fail
+			fi
+		else
+			fail
+		fi
+	done
+}
+
 OS=$(udpkg --print-os)
 case "$OS" in
 	kfreebsd)
@@ -59,152 +203,9 @@ case "$OS" in
 	*)
 		log "Unknown OS '$OS', exiting"
 		exit 0
-		
-esac
- 
-detect_and_mount_cdrom() {
-# Is a cdrom already mounted? If so, assume it's the right one.
-mount | grep -q 'on /cdrom' && return 0
-if [ -e /cdrom/.disk/info ]; then
-	CDNAME=$(cat /cdrom/.disk/info)
-	log "Detected CD '$CDNAME'"
-	return 0
-fi
-
-hw-detect cdrom-detect/detect_progress_title || true
-
-log "Searching for Debian installation media..."
-
-mkdir /cdrom 2>/dev/null || true
-
-# Need to wait for the usb device scan to complete
-if [ "$OS" = "linux" ]; then
-  for count in 1 2 3 4 5 6 8 9 10; do
-    devices="$(list-devices cd; list-devices maybe-usb-floppy)"
-    log "Devices: '$devices'"
-    if [ -n "$devices" ]; then
-      break 2
-    else
-      sleep 1
-    fi
-  done
-fi
 
-while true; do
-	WRONG=
-
-	devices="$(list-devices cd; list-devices maybe-usb-floppy)"
-	for device in $devices; do
-		if try_mount $device $CDFS; then
-			return 0
-		fi
-	done
-	
-	devices="$(list-devices usb-partition)"
-	for device in $devices; do
-		if try_mount $device $CDFS; then
-			db_set cdrom-detect/hybrid true
-			return 0
-		fi
-		if try_mount $device $FATFS; then
-			db_set cdrom-detect/usb-hdd true
-			return 0
-		fi
-	done
-
-
-	if [ "$WRONG" ]; then
-		db_input critical cdrom-detect/wrong-cd || [ $? -eq 30 ]
-		db_go
-		fail
-	fi
-
-	# If a device was detected but the mount failed, ask for the CD.
-	if [ -n "$devices" ]; then
-		db_input critical cdrom-detect/retry || [ $? -eq 30 ]
-		db_go
-		db_get cdrom-detect/retry
-		if [ "$RET" = "true" ]; then
-			log "Unmounting CD just to be sure"
-			umount /cdrom 2>/dev/null || true
-			continue
-		else
-			fail
-		fi
-	fi
- 
-	# If no device was detected, perhaps a driver floppy is needed.
-	if [ -e /usr/lib/debian-installer/retriever/media-retriever ]; then
-		db_input critical cdrom-detect/load_media
-		db_go
-		db_get cdrom-detect/load_media
-		if [ "$RET" = true ]; then
-			anna media-retriever
-			hw-detect cdrom-detect/detect_progress_title || true
-			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
-
-	if [ "$RET" = true ]; then
-		case "$OS" in
-			linux)
-				modules=none
-				for i in $(ls -1 /lib/modules/*/kernel/drivers/cdrom/ | \
-					   sed 's/\.ko$//' | sed 's/\.o$//'); do
-					modules="$modules, $i"
-				done  
-
-				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
-				if [ "$RET" != none ]; then
-					modprobe $RET
-				fi
-				;;
-			kfreebsd)
-				modules=none
-				for i in $(ls -1 /lib/modules/$(uname -r)/ | \
-					   sed 's/\.ko$//'); do
-					modules="$modules, $i"
-				done
-
-				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
-				if [ "$RET" != none ]; then
-					kldload $RET
-				fi
-				;;
-		esac
-
-		db_input critical cdrom-detect/cdrom_device || [ $? -eq 30 ]
-		db_go
-
-		db_get cdrom-detect/cdrom_device
-		device="$RET"
+esac
 
-		if mount -t $CDFS -o $OPTIONS $device /cdrom; then
-			log "CD-ROM mount succeeded: device=$device fstype=$CDFS"
-			db_set cdrom-detect/cdrom_fs $CDFS
-			return 0
-		else
-			log "CD-ROM mount failed: device=$device fstype=$CDFS"
-			fail
-		fi
-	else
-		fail
-	fi
-done
-}
 detect_and_mount_cdrom
 
 # Check for unetbootin files
-- 
2.1.4

Reply via email to