[Debconf-devel] Bug#929417: debconf: Readline frontend should check that stdin is a tty (to fix Docker build freezes)

Tianon Gravi tianon at debian.org
Fri Apr 17 00:56:58 BST 2020


On Wed, 22 May 2019 23:36:43 -0400 (EDT) Anders Kaseorg <andersk at mit.edu> wrote:
> When building a Debian- or Ubuntu-based Docker container, installing
> perl (so that Term::Readline is available) and a package that asks a
> Debconf question causes the build to freeze with an interactive readline
> prompt that cannot be answered:
>   ...
> Docker builds are noninteractive, of course, and stdin is connected to 
> /dev/null.  What seems to have happened here is that apt created a pty and 
> connected stdout and stderr to it, but left stdin connected to /dev/null. 
> The Readline frontend checked that there’s a controlling tty (there is), 
> but failed to check that stdin is a tty (it’s not).  So it proceeded to 
> wait for input from a tty that will never provide it.
> 
> (Obviously one can set DEBIAN_FRONTEND=noninteractive as a workaround, but 
> that shouldn’t be necessary, and is in fact discouraged: 
> https://docs.docker.com/engine/faq/#why-is-debian_frontendnoninteractive-discouraged-in-dockerfiles 
> because it’s often set in ways that persist for longer than intended.)

Friendly ping? :)
Would it be helpful if someone were to make the attached patch into a
Merge Request on Salsa for easier review?

As a bit of added versioning information, this affects Debian Stretch
(1.5.61) and newer, but Debian Jessie (1.5.56+deb8u1) is unaffected
(and over in Ubuntu land, Xenial is unaffected at 1.5.58ubuntu2, but
Bionic at 1.5.66ubuntu1 and newer *is* affected).

I'm not sure what changed this behavior between Jessie and Stretch
(possibly something outside the debconf package?), but the relevant
debdiff for debconf is relatively small (~400 lines if one excludes
translation updates), so I've attached that here in case it's helpful.

♥,
- Tianon
  4096R / B42F 6819 007F 00F8 8E36  4FD4 036A 9C25 BF35 7DD4
-------------- next part --------------
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/bash_completion debconf-1.5.61/bash_completion
--- debconf-1.5.56+deb8u1/bash_completion	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/bash_completion	2015-11-07 19:17:02.000000000 -0800
@@ -1,4 +1,4 @@
-have debconf-show &&
+_have debconf-show &&
 _debconf_show()
 {
         local cur
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/Config.pm debconf-1.5.61/Debconf/Config.pm
--- debconf-1.5.56+deb8u1/Debconf/Config.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/Config.pm	2015-07-12 10:35:31.000000000 -0700
@@ -59,7 +59,7 @@
 	my $text=shift;
 	my $hash=shift;
 
-	$text =~ s/\${([^}]+)}/$ENV{$1}/eg;
+	$text =~ s/\$\{([^}]+)\}/$ENV{$1}/eg;
 	
 	my %ret;
 	my $i;
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/Element/Editor/Multiselect.pm debconf-1.5.61/Debconf/Element/Editor/Multiselect.pm
--- debconf-1.5.56+deb8u1/Debconf/Element/Editor/Multiselect.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/Element/Editor/Multiselect.pm	2015-11-07 18:11:17.000000000 -0800
@@ -13,7 +13,7 @@
 
 =head1 DESCRIPTION
 
-Presents a list of choices to be selected amoung. Multiple selection is
+Presents a list of choices to be selected among. Multiple selection is
 allowed.
 
 =head1 METHODS
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/Element/Editor/Select.pm debconf-1.5.61/Debconf/Element/Editor/Select.pm
--- debconf-1.5.56+deb8u1/Debconf/Element/Editor/Select.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/Element/Editor/Select.pm	2015-11-07 18:11:19.000000000 -0800
@@ -13,7 +13,7 @@
 
 =head1 DESCRIPTION
 
-Presents a list of choices to be selected amoung.
+Presents a list of choices to be selected among.
 
 =head2 METHODS
 
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/Element/Teletype/Boolean.pm debconf-1.5.61/Debconf/Element/Teletype/Boolean.pm
--- debconf-1.5.56+deb8u1/Debconf/Element/Teletype/Boolean.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/Element/Teletype/Boolean.pm	2015-11-07 18:36:34.000000000 -0800
@@ -40,6 +40,13 @@
 		$default=$n;
 	}
 
+	# If this is not terse mode, we want to print out choices. Since we
+	# only have two choices, though, we use a compact display format.
+	my $description=$this->question->description;
+	if (Debconf::Config->terse eq 'false') {
+		$description.=" [$y/$n]";
+	}
+
 	my $value='';
 
 	while (1) {
@@ -47,7 +54,7 @@
 		$_=$this->frontend->prompt(
 			default => $default,
 			completions => [$y, $n],
-			prompt => $this->question->description,
+			prompt => $description,
 			question => $this->question,
 		);
 		return unless defined $_;
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/FrontEnd/Readline.pm debconf-1.5.61/Debconf/FrontEnd/Readline.pm
--- debconf-1.5.56+deb8u1/Debconf/FrontEnd/Readline.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/FrontEnd/Readline.pm	2015-11-07 18:17:49.000000000 -0800
@@ -27,7 +27,7 @@
 
 =item promptdefault
 
-Set if the varient of readline being used is so lame that it cannot display
+Set if the variant of readline being used is so lame that it cannot display
 defaults, so the default must be part of the prompt instead.
 
 =back
@@ -172,7 +172,7 @@
 
 The function uses named parameters.
 
-Completion amoung available choices is supported. For this to work, if
+Completion among available choices is supported. For this to work, if
 a reference to an array of all possible completions is passed in.
 
 =cut
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/Question.pm debconf-1.5.61/Debconf/Question.pm
--- debconf-1.5.56+deb8u1/Debconf/Question.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/Question.pm	2015-07-12 10:35:14.000000000 -0700
@@ -132,7 +132,7 @@
 	my $variable;
 	my $varval;
 	my $escape;
-	while ($rest =~ m/^(.*?)(\\)?\${([^{}]+)}(.*)$/sg) {
+	while ($rest =~ m/^(.*?)(\\)?\$\{([^{}]+)\}(.*)$/sg) {
 		$result.=$1;  # copy anything before the variable
 		$escape=$2;
 		$variable=$3;
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/Debconf/Template.pm debconf-1.5.61/Debconf/Template.pm
--- debconf-1.5.56+deb8u1/Debconf/Template.pm	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/Debconf/Template.pm	2015-07-12 17:13:40.000000000 -0700
@@ -76,10 +76,15 @@
 	if ($Debconf::Db::templates->exists($template) and
 	    $Debconf::Db::templates->owners($template)) {
 		# If a question matching this template already exists in
-		# the db, add the owner to it. This handles shared owner
-		# questions.
-		my $q=Debconf::Question->get($template);
-		$q->addowner($owner, $type) if $q;
+		# the db, add the owner to it; otherwise, create one. This
+		# handles shared owner questions.
+		if ($Debconf::Db::config->exists($template)) {
+			my $q=Debconf::Question->get($template);
+			$q->addowner($owner, $type) if $q;
+		} else {
+			my $q=Debconf::Question->new($template, $owner, $type);
+			$q->template($template);
+		}
 
 		# See if the template claims to own any questions that
 		# cannot be found. If so, the db is corrupted; attempt to
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/debian/changelog debconf-1.5.61/debian/changelog
--- debconf-1.5.56+deb8u1/debian/changelog	2017-06-17 04:27:16.000000000 -0700
+++ debconf-1.5.61/debian/changelog	2017-05-21 10:08:30.000000000 -0700
@@ -1,10 +1,57 @@
-debconf (1.5.56+deb8u1) jessie; urgency=medium
+debconf (1.5.61) unstable; urgency=medium
 
   [ Niko Tyni ]
   * Use File::Temp instead of the deprecated POSIX::tmpnam() in
     Debconf::TmpFile (closes: #863071).
 
- -- Colin Watson <cjwatson at debian.org>  Sat, 17 Jun 2017 12:27:07 +0100
+ -- Colin Watson <cjwatson at debian.org>  Sun, 21 May 2017 18:08:30 +0100
+
+debconf (1.5.60) unstable; urgency=medium
+
+  [ Christian Perrier ]
+  * French manpages translation. Thanks to Baptiste Jammet.
+    Closes: #849394
+
+ -- Colin Watson <cjwatson at debian.org>  Fri, 20 Jan 2017 12:58:59 +0000
+
+debconf (1.5.59) unstable; urgency=medium
+
+  * Use HTTPS for Vcs-* URLs, and link to cgit rather than gitweb.
+  * Set source format to 3.0 (native).
+  * frontend: Load templates when we're being run from any maintainer
+    script, not just preinst/postinst (closes: #817083).
+
+ -- Colin Watson <cjwatson at debian.org>  Fri, 11 Mar 2016 10:59:28 +0000
+
+debconf (1.5.58) unstable; urgency=medium
+
+  * Don't update po/debconf.pot unless doing so changes something other than
+    the POT-Creation-Date header.  The basic approach here is from gettext,
+    though implemented a bit more simply since we can assume perl.
+  * Show choices for teletype/readline boolean questions (closes: #802840).
+  * Move bash completion file to /usr/share/bash-completion/completions/.
+
+ -- Colin Watson <cjwatson at debian.org>  Sun, 08 Nov 2015 03:27:10 +0000
+
+debconf (1.5.57) unstable; urgency=medium
+
+  [ Colin Watson ]
+  * Drop alternative Suggests on gnome-utils (closes: #792219).  It hasn't
+    existed since squeeze, it dropped gdialog in 2003, and debconf only
+    supported gdialog for about three weeks in 1999 anyway.
+  * Escape braces in regexes to avoid deprecation warning with Perl 5.22
+    (closes: #786705).
+  * When creating a new template and finding that it already exists in the
+    database, ensure that a question of the same name exists too (closes:
+    #518322, #779920).
+
+  [ Jérémy Bobbio ]
+  * Use UTC when running xgettext for build reproducibility. Closes: #783255
+
+  [ Debconf translations ]
+  * Brazilian Portuguese (Adriano Rafael Gomes). Closes: #785464
+
+ -- Colin Watson <cjwatson at debian.org>  Thu, 16 Jul 2015 12:33:36 +0100
 
 debconf (1.5.56) unstable; urgency=medium
 
@@ -2036,7 +2083,7 @@
 debconf (1.4.30) unstable; urgency=low
 
   * Fix and update German translation. Thanks, Michael Piefel. Closes: #260572
-  * Update Basque templates translation. Thanks, Piarres Beobide Egaña.
+  * Update Basque templates translation. Thanks, Piarres Beobide Egaña.
     Closes: #260678
 
  -- Joey Hess <joeyh at debian.org>  Sat, 24 Jul 2004 02:41:35 -0400
@@ -2069,7 +2116,7 @@
 
 debconf (1.4.26) unstable; urgency=low
 
-  * Add Basqe translation by Piarres Beobide Egaña. Closes: #247321
+  * Add Basqe translation by Piarres Beobide Egaña. Closes: #247321
   * German translation update. Closes: #251731
   * Catalan translation update. Closes: #251786
   * Remove soi-unsightly trailing blanks in debconf-show output.
@@ -2567,7 +2614,7 @@
 
 debconf (1.2.40) unstable; urgency=low
 
-  * Spanish translation update from Carlos Valdivia Yagüe. Closes: #196672
+  * Spanish translation update from Carlos Valdivia Yagüe. Closes: #196672
 
  -- Joey Hess <joeyh at debian.org>  Mon,  9 Jun 2003 12:44:13 -0400
 
@@ -2937,7 +2984,7 @@
 debconf (1.1.29) unstable; urgency=low
 
   * Allow stacked dbdrivers with readonly databases on top.
-  * Patch from Michel Dänzer to put the hostname in the gnome window title.
+  * Patch from Michel Dänzer to put the hostname in the gnome window title.
     Closes: #141235
 
  -- Joey Hess <joeyh at debian.org>  Tue,  3 Sep 2002 12:24:55 -0400
@@ -3029,7 +3076,7 @@
   * Directory DbDriver is pure virtual now; I had to move exists and iterator
     out of it, and it is fairly useless by itself.
   * Seems that LDAP has no end of quoting problems, and Dagfinn Ilmari
-    Mannsåker sent in a patch to update more of them (changes the schema again
+    Mannsåker sent in a patch to update more of them (changes the schema again
     amoung other things). Closes: #152477
   * Stop leaking priority fields into the config database.
 
@@ -3057,7 +3104,7 @@
     of this type into it, use debconf-copydb to copy your existing databases
     into the new ones, and then make the new ones be used by default.
 
-  * Applied a patch from ilmari at ping.uio.no (Dagfinn Ilmari Mannsåker) to the
+  * Applied a patch from ilmari at ping.uio.no (Dagfinn Ilmari Mannsåker) to the
     LDAP dbdriver to change fields to IA5 text, skipping empty fields.
     Closes: #139779
   * Made more vocal about use of capitalized frontend names, which are
@@ -3436,7 +3483,7 @@
   * Another French update.
   * Danish translation by Morten Brix Pedersen <morten at wtf.dk>
   * frontend: don't glob unnecessarily, Closes: #117077
-  * Michel Dänzer <daenzer at debian.org> figured out how to turn off the gnome
+  * Michel Dänzer <daenzer at debian.org> figured out how to turn off the gnome
     session manager warnings. Closes: #116087
   * Turns out that the gnome frontend ARGV stomping was not being backed out
     if gtk failed to init due to a bad DISPLAY. Fixed that, which probably
@@ -3942,7 +3989,7 @@
 
   * A typo in debconf-getlang was making it incorrectly mark some things as
     fuzzy. Fumitoshi UKAI pointed out the fix, Closes: #97475
-  * Some Spanish updates by Carlos Valdivia Yagüe.
+  * Some Spanish updates by Carlos Valdivia Yagüe.
 
  -- Joey Hess <joeyh at debian.org>  Mon, 14 May 2001 15:17:31 -0400
 
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/debian/control debconf-1.5.61/debian/control
--- debconf-1.5.56+deb8u1/debian/control	2017-06-16 15:22:14.000000000 -0700
+++ debconf-1.5.61/debian/control	2017-05-21 10:07:55.000000000 -0700
@@ -5,9 +5,9 @@
 Uploaders: Colin Watson <cjwatson at debian.org>
 Standards-Version: 3.9.5
 Build-Depends-Indep: perl (>= 5.10.0-16), python (>= 2.6.6-3~), python3 (>= 3.1.2-8), gettext (>= 0.13), libintl-perl, libqtgui4-perl
-Build-Depends: debhelper (>= 7.2.11~), po-debconf, po4a (>= 0.23)
-Vcs-Git: git://anonscm.debian.org/debconf/debconf.git
-Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debconf/debconf.git;a=summary
+Build-Depends: debhelper (>= 8.1.0~), po-debconf, po4a (>= 0.23)
+Vcs-Git: https://anonscm.debian.org/git/debconf/debconf.git
+Vcs-Browser: https://anonscm.debian.org/cgit/debconf/debconf.git
 X-Python-Version: >= 2.6
 
 Package: debconf
@@ -18,7 +18,7 @@
 Replaces: debconf-tiny
 Depends: ${misc:Depends}
 Recommends: apt-utils (>= 0.5.1), debconf-i18n
-Suggests: debconf-doc, debconf-utils, whiptail | dialog | gnome-utils, libterm-readline-gnu-perl, libgtk2-perl (>= 1:1.130), libnet-ldap-perl, perl, libqtgui4-perl, libqtcore4-perl
+Suggests: debconf-doc, debconf-utils, whiptail | dialog, libterm-readline-gnu-perl, libgtk2-perl (>= 1:1.130), libnet-ldap-perl, perl, libqtgui4-perl, libqtcore4-perl
 Architecture: all
 Multi-Arch: foreign
 Description: Debian configuration management system
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/debian/debconf.dirs debconf-1.5.61/debian/debconf.dirs
--- debconf-1.5.56+deb8u1/debian/debconf.dirs	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/debian/debconf.dirs	2015-11-07 19:02:00.000000000 -0800
@@ -1,2 +1,2 @@
 etc/apt/apt.conf.d
-etc/bash_completion.d
+usr/share/bash-completion/completions
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/debian/maintscript debconf-1.5.61/debian/maintscript
--- debconf-1.5.56+deb8u1/debian/maintscript	1969-12-31 16:00:00.000000000 -0800
+++ debconf-1.5.61/debian/maintscript	2015-11-07 19:00:35.000000000 -0800
@@ -0,0 +1 @@
+rm_conffile /etc/bash_completion.d/debconf 1.5.58~
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/debian/rules debconf-1.5.61/debian/rules
--- debconf-1.5.56+deb8u1/debian/rules	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/debian/rules	2015-11-07 19:23:43.000000000 -0800
@@ -26,7 +26,10 @@
 override_dh_install:
 	dh_install
 	cp debian/apt.conf debian/debconf/etc/apt/apt.conf.d/70debconf
-	cp bash_completion debian/debconf/etc/bash_completion.d/debconf
+	cp bash_completion \
+		debian/debconf/usr/share/bash-completion/completions/debconf
+	ln -s debconf \
+		debian/debconf/usr/share/bash-completion/completions/debconf-show
 
 override_dh_installchangelogs:
 	# Changelog reduction hack for debconf. Only include top 100 entries.
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/debian/source/format debconf-1.5.61/debian/source/format
--- debconf-1.5.56+deb8u1/debian/source/format	1969-12-31 16:00:00.000000000 -0800
+++ debconf-1.5.61/debian/source/format	2016-01-27 03:00:13.000000000 -0800
@@ -0,0 +1 @@
+3.0 (native)
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/frontend debconf-1.5.61/frontend
--- debconf-1.5.56+deb8u1/frontend	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/frontend	2016-03-08 02:16:29.000000000 -0800
@@ -96,6 +96,15 @@
 $frontend->default_title($package) if length $package and !$no_title;
 $frontend->info(undef);
 
+# Load any associated templates if we're being run from a package maintainer
+# script.
+if ($ARGV[0] =~/^(.*[.\/])(?:preinst|postinst|prerm|postrm)$/) {
+	my $base=$1;
+	my $templates=$base."templates";
+	Debconf::Template->load($templates, $package)
+		if -e $templates;
+}
+
 # See if the preinst or postinst of the package is being run, and if there
 # is a config script associated with this package. If so, run it first as a
 # confmodule (also loading the templates). This is a bit of a nasty hack, that
@@ -106,11 +115,6 @@
 if ($ARGV[0] =~/^(.*[.\/])(?:postinst|preinst)$/) {
 	my $base=$1;
 
-	# Load templates, if any.
-	my $templates=$base."templates";
-	Debconf::Template->load($templates, $package)
-		if -e $templates;
-
 	# Run config script, if any.
 	my $config=$base."config";
 	if (-e $config) {
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/po/Makefile debconf-1.5.61/po/Makefile
--- debconf-1.5.56+deb8u1/po/Makefile	2017-06-16 15:22:02.000000000 -0700
+++ debconf-1.5.61/po/Makefile	2015-11-07 18:00:08.000000000 -0800
@@ -16,10 +16,22 @@
 
 debconf.pot: $(POTFILES)
 	@echo "Rebuilding the pot file"
-	xgettext $(POTFILES) -o debconf.pot -Lperl
+	TZ=UTC xgettext $(POTFILES) -o debconf.pot.new -Lperl
+	if [ -f debconf.pot ]; then \
+		./remove-potcdate.pl < debconf.pot > debconf.1po && \
+		./remove-potcdate.pl < debconf.pot.new > debconf.2po && \
+		if cmp debconf.1po debconf.2po >/dev/null 2>&1; then \
+			rm -f debconf.1po debconf.2po debconf.pot.new; \
+		else \
+			rm -f debconf.1po debconf.2po && \
+			mv debconf.pot.new debconf.pot; \
+		fi; \
+	else \
+		mv debconf.pot.new debconf.pot; \
+	fi
 
 clean:
-	rm -f $(MOFILES) messages messages.mo
+	rm -f $(MOFILES) debconf.pot.new messages messages.mo
 
 %.mo: %.po
 	msgfmt -o $@ $<
diff -Nru --exclude '*.po' --exclude '*.pot' debconf-1.5.56+deb8u1/po/remove-potcdate.pl debconf-1.5.61/po/remove-potcdate.pl
--- debconf-1.5.56+deb8u1/po/remove-potcdate.pl	1969-12-31 16:00:00.000000000 -0800
+++ debconf-1.5.61/po/remove-potcdate.pl	2015-11-07 17:56:58.000000000 -0800
@@ -0,0 +1,11 @@
+#! /usr/bin/perl -n
+
+BEGIN {
+    $seen_potcdate = 0;
+}
+
+if (not $seen_potcdate and /^"POT-Creation-Date: .*"/) {
+    $seen_potcdate = 1;
+    next;
+}
+print;


More information about the Debconf-devel mailing list