View | Details | Raw Unified | Return to bug 30547
Collapse All | Expand All

(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/changelog (-5 / +11 lines)
 Lines 1-3    Link Here 
1
univention-debootstrap (5.0.0-1) unstable; urgency=low
2
3
  * UCS-3.2 version bump (Bug #30547)
4
  * Update copyright to 2013.
5
  * debian/*.dirs: remove unneeded files.
6
  * Re-use debootstrap instead of using custom (unmodified) copy.
7
  * Fix spelling mistakes.
8
9
 -- Philipp Hahn <hahn@univention.de>  Fri, 12 Jul 2013 18:13:58 +0200
10
1
univention-debootstrap (4.0.3-5) unstable; urgency=low
11
univention-debootstrap (4.0.3-5) unstable; urgency=low
2
12
3
  * fixed missing /usr/share/debootstrap/functions-ucs3 (Bug #26179)
13
  * fixed missing /usr/share/debootstrap/functions-ucs3 (Bug #26179)
 Lines 104-110   univention-debootstrap (0.1.8) unstable; urgency=low Link Here 
104
114
105
  * remove ipchains from powerpc list
115
  * remove ipchains from powerpc list
106
116
107
 -- Stefan Gohmann <gohmann@univention.dunivention.de>  Fri, 10 Feb 2006 09:44:27 +0100
117
 -- Stefan Gohmann <gohmann@univention.de>  Fri, 10 Feb 2006 09:44:27 +0100
108
118
109
univention-debootstrap (0.1.6) unstable; urgency=low
119
univention-debootstrap (0.1.6) unstable; urgency=low
110
120
 Lines 129-135   univention-debootstrap (0.1.0) unstable; urgency=low Link Here 
129
  * initial release
139
  * initial release
130
140
131
 -- Stefan Gohmann <gohmann@univention.de>  Tue, 28 Aug 2003 13:49:40 +0200
141
 -- Stefan Gohmann <gohmann@univention.de>  Tue, 28 Aug 2003 13:49:40 +0200
132
133
Local variables:
134
mode: debian-changelog
135
End:
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/control (-2 / +1 lines)
 Lines 3-10   Section: univention Link Here 
3
Priority: optional
3
Priority: optional
4
Maintainer: Univention GmbH <packages@univention.de>
4
Maintainer: Univention GmbH <packages@univention.de>
5
Standards-Version: 3.5.5
5
Standards-Version: 3.5.5
6
Build-Depends: debootstrap,
6
Build-Depends: debhelper,
7
 debhelper,
8
 ucslint
7
 ucslint
9
8
10
Package: univention-debootstrap-3
9
Package: univention-debootstrap-3
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/copyright (-1 / +1 lines)
 Lines 1-4    Link Here 
1
Copyright 2001-2012 Univention GmbH
1
Copyright 2001-2013 Univention GmbH
2
2
3
http://www.univention.de/
3
http://www.univention.de/
4
4
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/dirs (-2 lines)
 Lines 1-2    Link Here 
1
usr/sbin
2
usr/share/debootstrap/scripts/
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/rules (-2 / +1 lines)
 Lines 3-9    Link Here 
3
# Univention Debootstrap
3
# Univention Debootstrap
4
#  rules file for the debian package
4
#  rules file for the debian package
5
#
5
#
6
# Copyright 2004-2012 Univention GmbH
6
# Copyright 2004-2013 Univention GmbH
7
#
7
#
8
# http://www.univention.de/
8
# http://www.univention.de/
9
#
9
#
 Lines 36-39   override_dh_auto_test: Link Here 
36
36
37
%:
37
%:
38
	dh $@
38
	dh $@
39
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/univention-debootstrap-3.dirs (-2 lines)
 Lines 1-2    Link Here 
1
usr/sbin
2
usr/share/debootstrap-ucs3/scripts/
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/univention-debootstrap-3.install (-1 / +1 lines)
Line 1    Link Here 
1
usr/* usr
1
usr
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/debian/univention-debootstrap-3.links (+1 lines)
1
usr/sbin/debootstrap	usr/sbin/debootstrap-ucs3
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/usr/sbin/debootstrap-ucs3 (-650 lines)
 Lines 1-650    Link Here 
1
#!/bin/bash -e
2
3
VERSION='1.0.26.26.201105181428'
4
5
unset TMP TEMP TMPDIR || true
6
7
# might not be exported if we're running from init=/bin/sh or similar
8
export PATH
9
10
###########################################################################
11
12
if [ -z "$DEBOOTSTRAP_DIR" ]; then
13
	if [ -x /debootstrap/debootstrap ]; then
14
		DEBOOTSTRAP_DIR=/debootstrap
15
	else
16
		DEBOOTSTRAP_DIR=/usr/share/debootstrap-ucs3
17
	fi
18
fi
19
20
DEVICES_TARGZ=$DEBOOTSTRAP_DIR/devices.tar.gz
21
22
. $DEBOOTSTRAP_DIR/functions
23
exec 4>&1
24
25
LANG=C
26
USE_COMPONENTS=main
27
KEYRING=""
28
VARIANT=""
29
30
DEF_MIRROR="http://ftp.us.debian.org/debian"
31
32
export LANG USE_COMPONENTS
33
umask 022
34
35
###########################################################################
36
37
## phases:
38
##   finddebs dldebs printdebs first_stage second_stage
39
40
RESOLVE_DEPS=true
41
42
WHAT_TO_DO="finddebs dldebs first_stage second_stage"
43
am_doing_phase () {
44
	# usage:   if am_doing_phase finddebs; then ...; fi
45
	local x;
46
	for x in "$@"; do
47
		if echo " $WHAT_TO_DO " | grep -q " $x "; then return 0; fi
48
	done
49
	return 1
50
}
51
52
###########################################################################
53
54
usage_err()
55
{
56
	info USAGE1 "usage: [OPTION]... <suite> <target> [<mirror> [<script>]]"
57
	info USAGE2 "Try \`${0##*/} --help' for more information."
58
	error "$@"
59
}
60
61
usage()
62
{
63
	echo "Usage: ${0##*/} [OPTION]... <suite> <target> [<mirror> [<script>]]"
64
	echo "Bootstrap Debian base system."
65
	echo
66
	cat <<EOF
67
      --help                 display this help and exit
68
      --version              display version information and exit
69
      --verbose              don't turn off the output of wget
70
71
      --download-only        download packages, but don't perform installation
72
      --print-debs           print the packages to be installed, and exit
73
74
      --arch=A               set the target architecture (use if no dpkg)
75
                               [ --arch=powerpc ]
76
77
      --include=A,B,C        adds specified names to the list of base packages
78
      --exclude=A,B,C        removes specified packages from the list
79
      --components=A,B,C     use packages from the listed components of the
80
                             archive
81
      --variant=X            use variant X of the bootstrap scripts
82
                             (currently supported variants: buildd, fakechroot,
83
                              scratchbox)
84
      --keyring=K            check Release files against keyring K
85
      --no-resolve-deps      don't try to resolve dependencies automatically
86
87
      --unpack-tarball=T     acquire .debs from a tarball instead of http
88
      --make-tarball=T       download .debs and create a tarball (tgz format)
89
      --second-stage-target=DIR
90
                             Run second stage in a subdirectory instead of root
91
                               (can be used to create a foreign chroot)
92
                               (requires --second-stage)
93
      --extractor=TYPE       override automatic .deb extractor selection
94
                               (supported: $EXTRACTORS_SUPPORTED)
95
      --boot-floppies        used for internal purposes by boot-floppies
96
      --debian-installer     used for internal purposes by debian-installer
97
      --private-key=file     read the private key from file
98
      --certificate=file     use the client certificate stored in file (PEM)
99
      --no-check-certificate do not check certificate against certificate authorities
100
EOF
101
}
102
103
###########################################################################
104
105
if [ -z "$PKGDETAILS" ]; then
106
	error 1 NO_PKGDETAILS "No pkgdetails available; either install perl, or build pkgdetails.c from source"
107
fi
108
109
###########################################################################
110
111
if [ $# != 0 ] ; then
112
    while true ; do
113
	case "$1" in
114
	    --help)
115
		usage
116
		exit 0
117
		;;
118
	    --version)
119
		echo "debootstrap $VERSION"
120
		exit 0
121
		;;
122
	    --boot-floppies)
123
		if [ -n "$USE_DEBIANINSTALLER_INTERACTION" ] ; then
124
			error 1 ARG_BFDI "Can only use one of --boot-floppies and --debian-installer"
125
		fi
126
		if ! (echo -n "" >&3) 2>/dev/null; then
127
			error 1 ARG_BFBYHAND "If running debootstrap by hand, don't use --boot-floppies"
128
		fi
129
		USE_BOOTFLOPPIES_INTERACTION=yes
130
		shift
131
		;;
132
	    --debian-installer)
133
		if [ -n "$USE_BOOTFLOPPIES_INTERACTION" ] ; then
134
			error 1 ARG_BFDI "Can only use one of --boot-floppies and --debian-installer"
135
		fi
136
		if ! (echo -n "" >&3) 2>/dev/null; then
137
			error 1 ARG_DIBYHAND "If running debootstrap by hand, don't use --debian-installer"
138
		fi
139
		USE_DEBIANINSTALLER_INTERACTION=yes
140
		shift
141
		;;
142
	    --foreign)
143
		WHAT_TO_DO="finddebs dldebs first_stage"
144
		shift
145
		;;
146
	    --second-stage)
147
		WHAT_TO_DO="second_stage"
148
		SECOND_STAGE_ONLY=true
149
		shift
150
		;;
151
	    --second-stage-target|--second-stage-target=?*)
152
		if [ "$SECOND_STAGE_ONLY" != "true" ] ; then
153
			error 1 STAGE2ONLY "option %s only applies in the second stage" "$1"
154
		fi
155
		if [ "$1" = "--second-stage-target" -a -n "$2" ] ; then
156
			CHROOTDIR="$2"
157
			shift 2
158
		elif [ "$1" != "${1#--second-stage-target=}" ]; then
159
			CHROOTDIR="${1#--second-stage-target=}"
160
			shift
161
		else
162
			error 1 NEEDARG "option requires an argument: %s" "$1"
163
		fi
164
		;;
165
	    --print-debs)
166
		WHAT_TO_DO="finddebs printdebs kill_target"
167
		shift
168
		;;
169
	    --download-only)
170
		WHAT_TO_DO="finddebs dldebs"
171
		shift
172
		;;
173
	    --make-tarball|--make-tarball=?*)
174
		WHAT_TO_DO="finddebs dldebs maketarball kill_target"
175
		if [ "$1" = "--make-tarball" -a -n "$2" ] ; then
176
			MAKE_TARBALL="$2"
177
			shift 2
178
		elif [ "$1" != "${1#--make-tarball=}" ]; then
179
			MAKE_TARBALL="${1#--make-tarball=}"
180
			shift
181
		else
182
			error 1 NEEDARG "option requires an argument %s" "$1"
183
		fi
184
		;;
185
	    --resolve-deps)
186
		# redundant, but avoids breaking compatibility
187
		RESOLVE_DEPS=true
188
		shift
189
		;;
190
	    --no-resolve-deps)
191
		RESOLVE_DEPS=false
192
		shift
193
		;;
194
	    --keep-debootstrap-dir)
195
		KEEP_DEBOOTSTRAP_DIR=true
196
		shift
197
		;;
198
	    --arch|--arch=?*)
199
		if [ "$1" = "--arch" -a -n "$2" ] ; then
200
			ARCH="$2"
201
			shift 2
202
                elif [ "$1" != "${1#--arch=}" ]; then
203
			ARCH="${1#--arch=}"
204
			shift
205
		else
206
			error 1 NEEDARG "option requires an argument %s" "$1"
207
		fi
208
		;;
209
	    --extractor|--extractor=?*)
210
		if [ "$1" = "--extractor" -a -n "$2" ] ; then
211
			EXTRACTOR_OVERRIDE="$2"
212
			shift 2
213
		elif [ "$1" != "${1#--extractor=}" ]; then
214
			EXTRACTOR_OVERRIDE="${1#--extractor=}"
215
			shift
216
		else
217
			error 1 NEEDARG "option requires an argument %s" "$1"
218
		fi
219
		if valid_extractor "$EXTRACTOR_OVERRIDE"; then
220
			if ! type "$EXTRACTOR_OVERRIDE" >/dev/null 2>&1; then
221
				error 1 MISSINGEXTRACTOR "The selected extractor cannot be found: %s" "$EXTRACTOR_OVERRIDE"
222
			fi
223
		else
224
			error 1 BADEXTRACTOR "%s: unknown extractor" "$EXTRACTOR_OVERRIDE"
225
		fi
226
		;;
227
	    --unpack-tarball|--unpack-tarball=?*)
228
		if [ "$1" = "--unpack-tarball" -a -n "$2" ] ; then
229
			UNPACK_TARBALL="$2"
230
			shift 2
231
		elif [ "$1" != "${1#--unpack-tarball=}" ]; then
232
			UNPACK_TARBALL="${1#--unpack-tarball=}"
233
			shift
234
		else
235
			error 1 NEEDARG "option requires an argument %s" "$1"
236
		fi
237
		if [ ! -f "$UNPACK_TARBALL" ] ; then
238
			error 1 NOTARBALL "%s: No such file or directory" "$UNPACK_TARBALL"
239
		fi
240
		;;
241
	    --include|--include=?*)
242
		if [ "$1" = "--include" -a -n "$2" ]; then
243
			additional="$2"
244
			shift 2
245
                elif [ "$1" != "${1#--include=}" ]; then
246
			additional="${1#--include=}"
247
			shift 1
248
		else
249
			error 1 NEEDARG "option requires an argument %s" "$1"
250
		fi
251
		additional="$(echo "$additional" | tr , " ")"
252
		;;
253
	    --exclude|--exclude=?*)
254
		if [ "$1" = "--exclude" -a -n "$2" ]; then
255
			exclude="$2"
256
			shift 2
257
                elif [ "$1" != "${1#--exclude=}" ]; then
258
			exclude="${1#--exclude=}"
259
			shift 1
260
		else
261
			error 1 NEEDARG "option requires an argument %s" "$1"
262
		fi
263
		exclude="$(echo "$exclude" | tr , " ")"
264
		;;
265
	    --verbose)
266
		verbose=true
267
		export verbose
268
		shift 1
269
		;;
270
	    --components|--components=?*)
271
		if [ "$1" = "--components" -a -n "$2" ]; then
272
			USE_COMPONENTS="$2"
273
			shift 2
274
                elif [ "$1" != "${1#--components=}" ]; then
275
			USE_COMPONENTS="${1#--components=}"
276
			shift 1
277
		else
278
			error 1 NEEDARG "option requires an argument %s" "$1"
279
		fi
280
		USE_COMPONENTS="$(echo "$USE_COMPONENTS" | tr , "|")"
281
		;;
282
	    --variant|--variant=?*)
283
		if [ "$1" = "--variant" -a -n "$2" ]; then
284
			VARIANT="$2"
285
			shift 2
286
                elif [ "$1" != "${1#--variant=}" ]; then
287
			VARIANT="${1#--variant=}"
288
			shift 1
289
		else
290
			error 1 NEEDARG "option requires an argument %s" "$1"
291
		fi
292
		;;
293
	    --keyring|--keyring=?*)
294
		if ! gpgv --version >/dev/null 2>&1; then
295
			error 1 NEEDGPGV "gpgv not installed, but required for Release verification"
296
		fi
297
		if [ "$1" = "--keyring" -a -n "$2" ]; then
298
			KEYRING="$2"
299
			shift 2
300
                elif [ "$1" != "${1#--keyring=}" ]; then
301
			KEYRING="${1#--keyring=}"
302
			shift 1
303
		else
304
			error 1 NEEDARG "option requires an argument %s" "$1"
305
		fi
306
		;;
307
	    --certificate|--certificate=?*)
308
		if [ "$1" = "--certificate" -a -n "$2" ]; then
309
			CERTIFICATE="--certificate=$2"
310
			shift 2
311
		elif [ "$1" != "${1#--certificate=}" ]; then
312
			CERTIFICATE="--certificate=${1#--certificate=}" 
313
			shift 1
314
		else
315
		       error 1 NEEDARG "option requires an argument %s" "$1" 
316
		fi
317
		;;
318
	    --private-key|--private-key=?*)
319
		if [ "$1" = "--private-key" -a -n "$2" ]; then
320
			PRIVATEKEY="--private-key=$2"
321
			shift 2
322
		elif [ "$1" != "${1#--private-key=}" ]; then
323
			PRIVATEKEY="--private-key=${1#--private-key=}" 
324
			shift 1
325
		else
326
		       error 1 NEEDARG "option requires an argument %s" "$1" 
327
		fi
328
		;;
329
	    --no-check-certificate)
330
		CHECKCERTIF="--no-check-certificate"
331
		shift
332
		;;
333
	    --*)
334
		error 1 BADARG "unrecognized or invalid option %s" "$1"
335
		;;
336
	    *)
337
		break
338
		;;
339
	esac
340
    done
341
fi
342
343
###########################################################################
344
345
if [ "$SECOND_STAGE_ONLY" = "true" ]; then
346
	SUITE=$(cat $DEBOOTSTRAP_DIR/suite)
347
	ARCH=$(cat $DEBOOTSTRAP_DIR/arch)
348
	if [ -e $DEBOOTSTRAP_DIR/variant ]; then
349
		VARIANT=$(cat $DEBOOTSTRAP_DIR/variant)
350
		SUPPORTED_VARIANTS="$VARIANT"
351
	fi
352
	if [ -z "$CHROOTDIR" ]; then
353
		TARGET=/
354
	else
355
		TARGET=$CHROOTDIR
356
	fi
357
	SCRIPT=$DEBOOTSTRAP_DIR/suite-script
358
else
359
	if [ -z "$1" ] || [ -z "$2" ]; then
360
		usage_err 1 NEEDSUITETARGET "You must specify a suite and a target."
361
	fi
362
	SUITE="$1"
363
	TARGET="$2"
364
	TARGET="${TARGET%/}"
365
	if [ "${TARGET#/}" = "${TARGET}" ]; then
366
		if [ "${TARGET%/*}" = "$TARGET" ] ; then
367
			TARGET="$(echo "`pwd`/$TARGET")"
368
		else
369
			TARGET="$(cd "${TARGET%/*}"; echo "`pwd`/${TARGET##*/}")"
370
		fi
371
	fi
372
373
	SCRIPT="$DEBOOTSTRAP_DIR/scripts/$1"
374
	if [ -n "$VARIANT" ] && [ -e "${SCRIPT}.${VARIANT}" ]; then
375
		SCRIPT="${SCRIPT}.${VARIANT}"
376
		SUPPORTED_VARIANTS="$VARIANT"
377
	fi
378
	if [ "$4" != "" ]; then
379
		SCRIPT="$4"
380
	fi
381
fi
382
383
###########################################################################
384
385
if [ "$ARCH" != "" ]; then
386
	true
387
elif [ -x /usr/bin/dpkg ] && \
388
     /usr/bin/dpkg --print-architecture >/dev/null 2>&1; then
389
	ARCH=`/usr/bin/dpkg --print-architecture`
390
elif type udpkg >/dev/null 2>&1 && \
391
     udpkg --print-architecture >/dev/null 2>&1; then
392
	ARCH=`/usr/bin/udpkg --print-architecture`
393
elif [ -e $DEBOOTSTRAP_DIR/arch ]; then
394
	ARCH=`cat $DEBOOTSTRAP_DIR/arch`
395
else
396
	error 1 WHATARCH "Couldn't work out current architecture"
397
fi
398
399
if [ "$TARGET" = "/" ]; then
400
	CHROOT_CMD=""
401
elif doing_variant scratchbox; then
402
	for config in ~/.scratchbox2/*/sb2.config;
403
	do
404
		export `grep ^SBOX_TARGET_ROOT= $config`
405
		if [ "x$SBOX_TARGET_ROOT" = "x$TARGET" ]; then
406
			SB2_TARGET=$(basename $(dirname $config))
407
		fi
408
	done
409
	[ "x$SB2_TARGET" != "x" ] || error 1 SBOXTARGETREQ "No scratchbox target configured for $TARGET"
410
	CHROOT_CMD="sb2 -eR -t $SB2_TARGET"
411
else
412
	CHROOT_CMD="chroot $TARGET"
413
fi
414
415
export ARCH SUITE TARGET CHROOT_CMD
416
417
if am_doing_phase first_stage second_stage; then
418
	if [ -x /usr/bin/id ] && [ `id -u` -ne 0 ]; then
419
		error 1 NEEDROOT "debootstrap can only run as root"
420
	fi
421
	# Ensure that we can create working devices and executables on the target.
422
	if ! check_sane_mount "$TARGET"; then
423
		error 1 NOEXEC "Cannot install into target '$TARGET' mounted with noexec or nodev"
424
	fi
425
fi
426
427
if [ ! -e "$SCRIPT" ]; then
428
	error 1 NOSCRIPT "No such script: %s" "$SCRIPT"
429
fi
430
431
###########################################################################
432
433
if [ "$TARGET" != "" ]; then
434
	mkdir -p "$TARGET/debootstrap"
435
fi
436
437
###########################################################################
438
439
# Use of fd's by functions/scripts:
440
#
441
#    stdin/stdout/stderr: used normally
442
#    fd 4: I:/W:/etc information
443
#    fd 5,6: spare for functions
444
#    fd 7,8: spare for scripts
445
446
if [ "$USE_DEBIANINSTALLER_INTERACTION" = yes ]; then
447
	#    stdout=stderr: full log of debootstrap run
448
	#    fd 3: I:/W:/etc information
449
	exec 4>&3
450
elif [ "$USE_BOOTFLOPPIES_INTERACTION" = yes ]; then
451
	#    stdout=stderr: full log of debootstrap run
452
	#    fd 3: I:/W:/etc information
453
	exec 4>&3
454
elif am_doing_phase printdebs; then
455
	#    stderr: I:/W:/etc information
456
	#    stdout: debs needed
457
	exec 4>&2
458
else
459
	#    stderr: used in exceptional circumstances only
460
	#    stdout: I:/W:/etc information
461
	#    $TARGET/debootstrap/debootstrap.log: full log of debootstrap run
462
	exec 4>&1
463
	exec >>"$TARGET/debootstrap/debootstrap.log"
464
	exec 2>&1
465
fi
466
467
###########################################################################
468
469
if [ "$UNPACK_TARBALL" ]; then
470
	if [ "${UNPACK_TARBALL#/}" = "$UNPACK_TARBALL" ]; then
471
		error 1 TARPATH "Tarball must be given a complete path"
472
	fi
473
	if [ "${UNPACK_TARBALL%.tar}" != "$UNPACK_TARBALL" ]; then
474
		(cd "$TARGET" && tar -xf "$UNPACK_TARBALL")
475
	elif [ "${UNPACK_TARBALL%.tgz}" != "$UNPACK_TARBALL" ]; then
476
		(cd "$TARGET" && zcat "$UNPACK_TARBALL" | tar -xf -)
477
	else
478
		error 1 NOTTAR "Unknown tarball: must be either .tar or .tgz"
479
	fi
480
fi
481
482
###########################################################################
483
484
. "$SCRIPT"
485
486
if [ "$SECOND_STAGE_ONLY" = "true" ]; then
487
	MIRRORS=null:
488
else
489
	MIRRORS="$DEF_MIRROR"
490
	if [ "$3" != "" ]; then
491
		MIRRORS="$3"
492
		MIRRORS="${MIRRORS%/}"
493
	fi
494
fi
495
496
export MIRRORS
497
498
ok=false
499
for v in $SUPPORTED_VARIANTS; do
500
	if doing_variant $v; then ok=true; fi
501
done
502
if ! $ok; then
503
	error 1 UNSUPPVARIANT "unsupported variant"
504
fi
505
506
###########################################################################
507
508
if am_doing_phase finddebs; then
509
	if [ "$FINDDEBS_NEEDS_INDICES" = "true" ] || \
510
	   [ "$RESOLVE_DEPS" = "true" ]; then
511
		download_indices
512
		GOT_INDICES=true
513
	fi
514
515
	work_out_debs
516
517
	base=$(without "$base $additional" "$exclude")
518
519
	if [ "$RESOLVE_DEPS" = true ]; then
520
		requiredX=$(echo $(echo $required | tr ' ' '\n' | sort | uniq))
521
		baseX=$(echo $(echo $base | tr ' ' '\n' | sort | uniq))
522
523
		baseN=$(without "$baseX" "$requiredX")
524
		baseU=$(without "$baseX" "$baseN")
525
526
		if [ "$baseU" != "" ]; then
527
			info REDUNDANTBASE "Found packages in base already in required: %s" "$baseU"
528
			sleep 5
529
		fi
530
531
		info RESOLVEREQ "Resolving dependencies of required packages..."
532
		required=$(resolve_deps $requiredX)
533
		info RESOLVEBASE "Resolving dependencies of base packages..."
534
		base=$(resolve_deps $baseX)
535
		base=$(without "$base" "$required")
536
537
		requiredX=$(without "$required" "$requiredX")
538
		baseX=$(without "$base" "$baseX")
539
		if [ "$requiredX" != "" ]; then
540
			info NEWREQUIRED "Found additional required dependencies: %s" "$requiredX"
541
			sleep 5
542
		fi
543
		if [ "$baseX" != "" ]; then
544
			info NEWBASE "Found additional base dependencies: %s" "$baseX"
545
			sleep 5
546
		fi
547
	fi
548
549
	all_debs="$required $base"
550
fi
551
552
if am_doing_phase printdebs; then
553
	echo "$all_debs"
554
fi
555
556
if am_doing_phase dldebs; then
557
	if [ "$GOT_INDICES" != "true" ]; then
558
		download_indices
559
	fi
560
	download $all_debs
561
fi
562
563
if am_doing_phase maketarball; then
564
	(cd $TARGET;
565
	 tar czf - var/lib/apt var/cache/apt) >$MAKE_TARBALL
566
fi
567
568
if am_doing_phase first_stage; then
569
	choose_extractor
570
571
	# first stage sets up the chroot -- no calls should be made to
572
	# "chroot $TARGET" here; but they should be possible by the time it's
573
	# finished
574
	first_stage_install
575
576
	if ! am_doing_phase second_stage; then
577
		cp "$0"				 "$TARGET/debootstrap/debootstrap"
578
		cp $DEBOOTSTRAP_DIR/functions	 "$TARGET/debootstrap/functions"
579
		cp $SCRIPT			 "$TARGET/debootstrap/suite-script"
580
		echo "$ARCH"			>"$TARGET/debootstrap/arch"
581
		echo "$SUITE"			>"$TARGET/debootstrap/suite"
582
		[ "" = "$VARIANT" ] ||
583
		echo "$VARIANT"			>"$TARGET/debootstrap/variant"
584
		echo "$required"		>"$TARGET/debootstrap/required"
585
		echo "$base"			>"$TARGET/debootstrap/base"
586
587
		chmod 755 "$TARGET/debootstrap/debootstrap"
588
	fi
589
fi
590
591
if am_doing_phase second_stage; then
592
	if [ "$SECOND_STAGE_ONLY" = true ]; then
593
		required="$(cat $DEBOOTSTRAP_DIR/required)"
594
		base="$(cat $DEBOOTSTRAP_DIR/base)"
595
		all_debs="$required $base"
596
	fi
597
598
	# second stage uses the chroot to clean itself up -- has to be able to
599
	# work from entirely within the chroot (in case we've booted into it,
600
	# possibly over NFS eg)
601
602
	second_stage_install
603
604
	# create sources.list
605
	# first, kill debootstrap.invalid sources.list
606
	if [ -e "$TARGET/etc/apt/sources.list" ]; then
607
		rm -f "$TARGET/etc/apt/sources.list"
608
	fi
609
	if [ "${MIRRORS#http*://}" != "$MIRRORS" ]; then
610
		setup_apt_sources "${MIRRORS%% *}"
611
		mv_invalid_to "${MIRRORS%% *}"
612
	else
613
		setup_apt_sources "$DEF_MIRROR"
614
		mv_invalid_to "$DEF_MIRROR"
615
	fi
616
617
	if [ -e "$TARGET/debootstrap/debootstrap.log" ]; then
618
		if [ "$KEEP_DEBOOTSTRAP_DIR" = true ]; then
619
			cp "$TARGET/debootstrap/debootstrap.log" "$TARGET/var/log/bootstrap.log"
620
		else
621
			# debootstrap.log is still open as stdout/stderr and needs
622
			# to remain so, but after unlinking it some NFS servers
623
			# implement this by a temporary file in the same directory,
624
			# which makes it impossible to rmdir that directory.
625
			# Moving it instead works around the problem.
626
			mv "$TARGET/debootstrap/debootstrap.log" "$TARGET/var/log/bootstrap.log"
627
		fi
628
	fi
629
	sync
630
631
	if [ "$KEEP_DEBOOTSTRAP_DIR" = true ]; then
632
		if [ -x "$TARGET/debootstrap/debootstrap" ]; then
633
			chmod 644 "$TARGET/debootstrap/debootstrap"
634
		fi
635
	else
636
		rm -rf "$TARGET/debootstrap"
637
	fi
638
fi
639
640
if am_doing_phase kill_target; then
641
	if [ "$KEEP_DEBOOTSTRAP_DIR" != true ]; then
642
		info KILLTARGET "Deleting target directory"
643
		rm -rf "$TARGET"
644
	fi
645
fi
646
647
if [ -n "$USE_BOOTFLOPPIES_INTERACTION" ] ; then
648
	echo "I: debootstrap: Successfully completed" # goes to /dev/tty4
649
	sleep 1 || true # give the user a second to see the success notice.
650
fi
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/usr/share/debootstrap-ucs3/functions (-1462 lines)
 Lines 1-1462    Link Here 
1
############################################################### smallutils
2
3
smallyes() {
4
	YES="${1-y}"
5
	while echo "$YES" 2>/dev/null ; do : ; done
6
}
7
8
############################################################### interaction
9
10
error () {
11
	# <error code> <name> <string> <args>
12
	local err="$1"
13
	local name="$2"
14
	local fmt="$3"
15
	shift; shift; shift
16
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
17
		(echo "E: $name"
18
		for x in "$@"; do echo "EA: $x"; done
19
		echo "EF: $fmt") >&4
20
	else
21
		(printf "E: $fmt\n" "$@") >&4
22
	fi
23
	exit $err
24
}
25
26
warning () {
27
	# <name> <string> <args>
28
	local name="$1"
29
	local fmt="$2"
30
	shift; shift
31
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
32
		(echo "W: $name"
33
		for x in "$@"; do echo "WA: $x"; done
34
		echo "WF: $fmt") >&4
35
	else
36
		printf "W: $fmt\n" "$@" >&4
37
	fi
38
}
39
40
info () {
41
	# <name> <string> <args>
42
	local name="$1"
43
	local fmt="$2"
44
	shift; shift
45
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
46
		(echo "I: $name"
47
		for x in "$@"; do echo "IA: $x"; done
48
		echo "IF: $fmt") >&4
49
	else
50
		printf "I: $fmt\n" "$@" >&4
51
	fi
52
}
53
54
PROGRESS_NOW=0
55
PROGRESS_END=0
56
PROGRESS_NEXT=""
57
PROGRESS_WHAT=""
58
59
progress_next () {
60
	PROGRESS_NEXT="$1"
61
}
62
63
wgetprogress () {
64
	[ ! "$verbose" ] && QSWITCH="-q"
65
	local ret=0
66
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ] && [ "$PROGRESS_NEXT" ]; then
67
		wget "$@" 2>&1 >/dev/null | $PKGDETAILS "WGET%" $PROGRESS_NOW $PROGRESS_NEXT $PROGRESS_END >&3
68
		ret=$?
69
	elif [ "$USE_BOOTFLOPPIES_INTERACTION" ] && [ "$PROGRESS_NEXT" ]; then
70
		wget "$@" 2>&1 >/dev/null | $PKGDETAILS "WGET%" $PROGRESS_NOW $PROGRESS_NEXT $PROGRESS_END "$PROGRESS_WHAT" >&3
71
		ret=$?
72
	else
73
		wget $QSWITCH "$@" 
74
		ret=$?
75
	fi
76
	return $ret
77
}
78
79
progress () {
80
	# <now> <end> <name> <string> <args>
81
	local now="$1"
82
	local end="$2"
83
	local name="$3"
84
	local fmt="$4"
85
	shift; shift; shift; shift
86
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
87
		PROGRESS_NOW="$now"
88
		PROGRESS_END="$end"
89
		PROGRESS_NEXT=""
90
		(echo "P: $now $end $name"
91
		for x in "$@"; do echo "PA: $x"; done
92
		echo "PF: $fmt") >&3
93
	elif [ "$USE_BOOTFLOPPIES_INTERACTION" ]; then
94
		PROGRESS_NOW="$now"
95
		PROGRESS_END="$end"
96
		PROGRESS_WHAT="`printf "$fmt" "$@"`"
97
		PROGRESS_NEXT=""
98
		printf "P: %s %s %s\n" $now $end "$PROGRESS_WHAT" >&3
99
	fi
100
}
101
102
dpkg_progress () {
103
	# <now> <end> <name> <desc> UNPACKING|CONFIGURING
104
	local now="$1"
105
	local end="$2"
106
	local name="$3"
107
	local desc="$4"
108
	local action="$5"
109
	local expect=
110
111
	if [ "$action" = UNPACKING ]; then
112
		expect=half-installed
113
	elif [ "$action" = CONFIGURING ]; then
114
		expect=half-configured
115
	fi
116
117
	dp () {
118
		now="$(($now + ${1:-1}))"
119
	}
120
121
	exitcode=0
122
	while read status pkg qstate; do
123
		if [ "$status" = "EXITCODE" ]; then
124
			exitcode="$pkg"
125
			continue
126
		fi
127
		[ "$qstate" = "$expect" ] || continue
128
		case $qstate in
129
		    half-installed)
130
			dp; progress "$now" "$end" "$name" "$desc"
131
			info "$action" "Unpacking %s..." "${pkg%:}"
132
			expect=unpacked
133
			;;
134
		    unpacked)
135
			expect=half-installed
136
			;;
137
		    half-configured)
138
			dp; progress "$now" "$end" "$name" "$desc"
139
			info "$action" "Configuring %s..." "${pkg%:}"
140
			expect=installed
141
			;;
142
		    installed)
143
			expect=half-configured
144
			;;
145
		esac
146
	done
147
	return $exitcode
148
}
149
150
############################################################# set variables
151
152
default_mirror () {
153
	DEF_MIRROR="$1"
154
}
155
156
FINDDEBS_NEEDS_INDICES=false
157
finddebs_style () {
158
	case "$1" in
159
	    hardcoded)
160
		;;
161
	    from-indices)
162
		FINDDEBS_NEEDS_INDICES=true
163
		;;
164
	    *)
165
		error 1 BADFINDDEBS "unknown finddebs style"
166
		;;
167
	 esac
168
}
169
170
mk_download_dirs () {
171
	if [ $DLDEST = "apt_dest" ]; then
172
		mkdir -p "$TARGET/$APTSTATE/lists/partial"
173
		mkdir -p "$TARGET/var/cache/apt/archives/partial"
174
	fi
175
}
176
177
download_style () {
178
	case "$1" in
179
	    apt)
180
		if [ "$2" = "var-state" ]; then
181
			APTSTATE=var/state/apt
182
		else
183
			APTSTATE=var/lib/apt
184
		fi
185
		DLDEST=apt_dest
186
		export APTSTATE DLDEST DEBFOR
187
		;;
188
	    *)
189
		error 1 BADDLOAD "unknown download style"
190
		;;
191
	esac
192
}
193
194
########################################################## variant handling
195
196
doing_variant () {
197
	if [ "$1" = "$VARIANT" ]; then return 0; fi
198
	if [ "$1" = "-" ] && [ "$VARIANT" = "" ]; then return 0; fi
199
	return 1
200
}
201
202
SUPPORTED_VARIANTS="-"
203
variants () {
204
	SUPPORTED_VARIANTS="$*"
205
	for v in $*; do
206
		if doing_variant "$v"; then return 0; fi
207
	done
208
	error 1 UNSUPPVARIANT "unsupported variant"
209
}
210
211
################################################# work out names for things
212
213
mirror_style () {
214
	case "$1" in
215
	    release)
216
		DOWNLOAD_INDICES=download_release_indices
217
		DOWNLOAD_DEBS=download_release
218
		;;
219
	    main)
220
		DOWNLOAD_INDICES=download_main_indices
221
		DOWNLOAD_DEBS=download_main
222
		;;
223
	    *)
224
		error 1 BADMIRROR "unknown mirror style"
225
		;;
226
	esac
227
	export DOWNLOAD_INDICES
228
	export DOWNLOAD_DEBS
229
}
230
231
check_md5 () {
232
	# args: dest md5 size
233
	local expmd5="$2"
234
	local expsize="$3"
235
	relmd5=`md5sum < "$1" | sed 's/ .*$//'`
236
	relsize=`wc -c < "$1"`
237
	if [ "$expsize" -ne "$relsize" ] || [ "$expmd5" != "$relmd5" ]; then
238
		return 1
239
	fi
240
	return 0
241
}
242
243
get () {
244
	# args: from dest 'nocache'
245
	# args: from dest [md5sum size] [alt {md5sum size type}]
246
	local displayname
247
	if [ "${2%.deb}" != "$2" ]; then
248
		displayname="$(echo "$2" | sed 's,^.*/,,;s,_.*$,,')"
249
	else
250
		displayname="$(echo "$1" | sed 's,^.*/,,')"
251
	fi
252
253
	if [ -e "$2" ]; then
254
		if [ -z "$3" ]; then
255
			return 0
256
		elif [ "$3" = nocache ]; then
257
			rm -f "$2"
258
		else
259
			info VALIDATING "Validating %s" "$displayname"
260
			if check_md5 "$2" "$3" "$4"; then
261
				return 0
262
			else
263
				rm -f "$2"
264
			fi
265
		fi
266
	fi
267
	# Drop 'nocache' option
268
	if [ "$3" = nocache ]; then
269
		set "$1" "$2"
270
	fi
271
272
	if [ "$#" -gt 5 ]; then
273
		local st=3
274
		if [ "$5" = "-" ]; then st=6; fi
275
		local order="$(a=$st; while [ "$a" -le $# ]; do eval echo \"\${$(($a+1))}\" $a;
276
		a=$(($a + 3)); done | sort -n | sed 's/.* //')"
277
	else
278
		local order=3
279
	fi
280
	for a in $order; do
281
		local md5="$(eval echo \${$a})"
282
		local siz="$(eval echo \${$(( $a+1 ))})"
283
		local typ="$(eval echo \${$(( $a+2 ))})"
284
		local from
285
		local dest
286
287
		case "$typ" in
288
		    bz2) from="$1.bz2"; dest="$2.bz2" ;;
289
		    gz)  from="$1.gz"; dest="$2.gz" ;;
290
		    *)   from="$1"; dest="$2" ;;
291
		esac
292
293
		if [ "${dest#/}" = "$dest" ]; then
294
			dest="./$dest"
295
		fi
296
		local dest2="$dest"
297
		if [ -d "${dest2%/*}/partial" ]; then
298
			dest2="${dest2%/*}/partial/${dest2##*/}"
299
		fi
300
301
		info RETRIEVING "Retrieving %s" "$displayname"
302
		if ! just_get "$from" "$dest2"; then continue; fi
303
		if [ "$md5" != "" ]; then
304
			info VALIDATING "Validating %s" "$displayname"
305
			if check_md5 "$dest2" "$md5" "$siz"; then
306
				md5=""
307
			fi
308
		fi
309
		if [ -z "$md5" ]; then
310
			[ "$dest2" = "$dest" ] || mv "$dest2" "$dest"
311
			case "$typ" in
312
			    gz)  gunzip "$dest" ;;
313
			    bz2) bunzip2 "$dest" ;;
314
			esac
315
			return 0
316
		else
317
			warning CORRUPTFILE "%s was corrupt" "$from"
318
		fi
319
	done
320
	return 1
321
}
322
323
just_get () {
324
	# args: from dest
325
	local from="$1"
326
	local dest="$2"
327
	mkdir -p "${dest%/*}"
328
	if [ "${from#null:}" != "$from" ]; then
329
		error 1 NOTPREDL "%s was not pre-downloaded" "${from#null:}"
330
	elif [ "${from#http://}" != "$from" ] || [ "${from#ftp://}" != "$from" ]; then
331
		# http/ftp mirror
332
		if wgetprogress -O "$dest" "$from"; then
333
			return 0
334
		elif [ -s "$dest" ]; then
335
			local iters=0
336
			while [ "$iters" -lt 3 ]; do
337
				warning RETRYING "Retrying failed download of %s" "$from"
338
				if wgetprogress -c -O "$dest" "$from"; then break; fi
339
				iters="$(($iters + 1))"
340
			done
341
		else
342
			rm -f "$dest"
343
			return 1
344
		fi
345
	elif [ "${from#https://}" != "$from" ] ; then
346
		# http/ftp mirror
347
		if wgetprogress $CHECKCERTIF $CERTIFICATE $PRIVATEKEY -O "$dest" "$from"; then
348
			return 0
349
		elif [ -s "$dest" ]; then
350
			local iters=0
351
			while [ "$iters" -lt 3 ]; do
352
				warning RETRYING "Retrying failed download of %s" "$from"
353
				if wgetprogress $CHECKCERTIF $CERTIFICATE $PRIVATEKEY -c -O "$dest" "$from"; then break; fi
354
				iters="$(($iters + 1))"
355
			done
356
		else
357
			rm -f "$dest"
358
			return 1
359
		fi
360
	elif [ "${from#file:}" != "$from" ]; then
361
		local base="${from#file:}"
362
		if [ "${base#//}" != "$base" ]; then
363
			base="/${from#file://*/}"
364
		fi
365
		if [ -e "$base" ]; then
366
			cp "$base" "$dest"
367
			return 0
368
		else
369
			return 1
370
		fi
371
	elif [ "${from#ssh:}" != "$from" ]; then
372
		local ssh_dest="$(echo $from | sed -e 's#ssh://##' -e 's#/#:/#')"
373
		if [ -n "$ssh_dest" ]; then
374
			scp "$ssh_dest" "$dest"
375
			return 0
376
		else
377
			return 1
378
		fi
379
	else
380
		error 1 UNKNOWNLOC "unknown location %s" "$from"
381
	fi
382
}
383
384
download () {
385
	mk_download_dirs
386
	"$DOWNLOAD_DEBS" $(echo "$@" | tr ' ' '\n' | sort)
387
}
388
389
download_indices () {
390
	mk_download_dirs
391
	"$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort)
392
}
393
394
debfor () {
395
	(while read pkg path; do
396
		for p in "$@"; do
397
			[ "$p" = "$pkg" ] || continue;
398
			echo "$path"
399
		done
400
	 done <"$TARGET/debootstrap/debpaths"
401
	)
402
}
403
404
apt_dest () {
405
	# args:
406
	#   deb package version arch mirror path
407
	#   pkg suite component arch mirror path
408
	#   rel suite mirror path
409
	case "$1" in
410
	    deb)
411
		echo "/var/cache/apt/archives/${2}_${3}_${4}.deb" | sed 's/:/%3a/'
412
		;;
413
	    pkg)
414
		local m="$5"
415
		m="debootstrap.invalid"
416
		#if [ "${m#http://}" != "$m" ]; then
417
		#	m="${m#http://}"
418
		#elif [ "${m#file://}" != "$m" ]; then
419
		#	m="file_localhost_${m#file://*/}"
420
		#elif [ "${m#file:/}" != "$m" ]; then
421
		#	m="file_localhost_${m#file:/}"
422
		#fi
423
424
		printf "%s" "$APTSTATE/lists/"
425
		echo "${m}_$6" | sed 's/\//_/g'
426
		;;
427
	    rel)
428
		local m="$3"
429
		m="debootstrap.invalid"
430
		#if [ "${m#http://}" != "$m" ]; then
431
		#	m="${m#http://}"
432
		#elif [ "${m#file://}" != "$m" ]; then
433
		#	m="file_localhost_${m#file://*/}"
434
		#elif [ "${m#file:/}" != "$m" ]; then
435
		#	m="file_localhost_${m#file:/}"
436
		#fi
437
		printf "%s" "$APTSTATE/lists/"
438
		echo "${m}_$4" | sed 's/\//_/g'
439
		;;
440
	esac
441
}
442
443
################################################################## download
444
445
get_release_md5 () {
446
	local reldest="$1"
447
	local path="$2"
448
	sed -n '/^[Mm][Dd]5[Ss][Uu][Mm]/,/^[^ ]/p' < "$reldest" | \
449
		while read a b c; do
450
			if [ "$c" = "$path" ]; then echo "$a $b"; fi
451
		done | head -n 1
452
}
453
454
download_release_sig () {
455
	local m1="$1"
456
	local reldest="$2"
457
	local relsigdest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release.gpg")"
458
459
	if [ -n "$KEYRING" ]; then
460
		progress 0 100 DOWNRELSIG "Downloading Release file signature"
461
		progress_next 50
462
		get "$m1/dists/$SUITE/Release.gpg" "$relsigdest" nocache ||
463
			error 1 NOGETRELSIG "Failed getting release signature file %s" \
464
			"$m1/dists/$SUITE/Release.gpg"
465
		progress 50 100 DOWNRELSIG "Downloading Release file signature"
466
467
		info RELEASESIG "Checking Release signature"
468
		# Don't worry about the exit status from gpgv; parsing the output will
469
		# take care of that.
470
		(gpgv --status-fd 1 --keyring "$KEYRING" --ignore-time-conflict \
471
		 "$relsigdest" "$reldest" || true) | read_gpg_status
472
		progress 100 100 DOWNRELSIG "Downloading Release file signature"
473
	fi
474
}
475
476
download_release_indices () {
477
	local m1="${MIRRORS%% *}"
478
	local reldest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release")"
479
	progress 0 100 DOWNREL "Downloading Release file"
480
	progress_next 100
481
	get "$m1/dists/$SUITE/Release" "$reldest" nocache ||
482
		error 1 NOGETREL "Failed getting release file %s" "$m1/dists/$SUITE/Release"
483
484
	TMPCOMPONENTS="$(sed -n 's/Components: *//p' "$reldest")"
485
	for c in $TMPCOMPONENTS ; do
486
		eval "
487
		case \"\$c\" in
488
		    $USE_COMPONENTS)
489
			COMPONENTS=\"\$COMPONENTS \$c\"
490
			;;
491
		esac
492
		"
493
	done
494
	COMPONENTS="$(echo $COMPONENTS)"
495
496
	if [ -z "$COMPONENTS" ]; then
497
		mv "$reldest" "$reldest.malformed"
498
		error 1 INVALIDREL "Invalid Release file, no valid components"
499
	fi
500
	progress 100 100 DOWNREL "Downloading Release file"
501
502
	download_release_sig "$m1" "$reldest"
503
504
	local totalpkgs=0
505
	for c in $COMPONENTS; do
506
		local subpath="$c/binary-$ARCH/Packages"
507
		local bz2md="`get_release_md5 "$reldest" "$subpath.bz2"`"
508
		local gzmd="`get_release_md5 "$reldest" "$subpath.gz"`"
509
		local normmd="`get_release_md5 "$reldest" "$subpath"`"
510
		local md=
511
		if [ "$normmd" != "" ]; then
512
			md="$normmd"
513
		elif [ -x /bin/bunzip2 ] && [ "$bz2md" != "" ]; then
514
			md="$bz2md"
515
		elif [ -x /bin/gunzip ] && [ "$gzmd" != "" ]; then
516
			md="$gzmd"
517
		fi
518
		if [ "$md" != "" ]; then
519
			totalpkgs="$(( $totalpkgs + ${md#* } ))"
520
		else
521
			mv "$reldest" "$reldest.malformed"
522
			error 1 MISSINGRELENTRY "Invalid Release file, no entry for %s" "$subpath"
523
		fi
524
	done
525
526
	local donepkgs=0
527
	local pkgdest
528
	progress 0 $totalpkgs DOWNPKGS "Downloading Packages files"
529
	for c in $COMPONENTS; do
530
		local subpath="$c/binary-$ARCH/Packages"
531
		local path="dists/$SUITE/$subpath"
532
		local bz2md="`get_release_md5 "$reldest" "$subpath.bz2"`"
533
		local gzmd="`get_release_md5 "$reldest" "$subpath.gz"`"
534
		local normmd="`get_release_md5 "$reldest" "$subpath"`"
535
		local ext=
536
		local md=
537
		if [ "$normmd" != "" ]; then
538
			ext="$ext $normmd ."
539
			md="$normmd"
540
		fi
541
		if [ -x /bin/bunzip2 ] && [ "$bz2md" != "" ]; then
542
			ext="$ext $bz2md bz2"
543
			md="${md:-$bz2md}"
544
		fi
545
		if [ -x /bin/gunzip ] && [ "$gzmd" != "" ]; then
546
			ext="$ext $gzmd gz"
547
			md="${md:-$gzmd}"
548
		fi
549
		progress_next "$(($donepkgs + ${md#* }))"
550
		for m in $MIRRORS; do
551
			pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
552
			if get "$m/$path" "$pkgdest" $ext; then break; fi
553
		done
554
		if [ ! -f "$pkgdest" ]; then
555
			error 1 COULDNTDL "Couldn't download %s" "$path"
556
		fi
557
		donepkgs="$(($donepkgs + ${md#* }))"
558
		progress $donepkgs $totalpkgs DOWNPKGS "Downloading Packages files"
559
	done
560
}
561
562
get_package_sizes () {
563
	# mirror pkgdest debs..
564
	local m="$1"; shift
565
	local pkgdest="$1"; shift
566
	$PKGDETAILS PKGS "$m" "$pkgdest" "$@" | (
567
		newleft=""
568
		totaldebs=0
569
		countdebs=0
570
		while read p details; do
571
			if [ "$details" = "-" ]; then
572
				newleft="$newleft $p"
573
			else
574
				size="${details##* }";
575
				totaldebs="$(($totaldebs + $size))"
576
				countdebs="$(($countdebs + 1))"
577
			fi
578
		done
579
		echo "$countdebs $totaldebs$newleft"
580
	)
581
}
582
583
# note, leftovers come back on fd5 !!
584
download_debs () {
585
	local m="$1"
586
	local pkgdest="$2"
587
	shift; shift
588
589
	$PKGDETAILS PKGS "$m" "$pkgdest" "$@" | (
590
		leftover=""
591
		while read p ver arc mdup fil md5 size; do
592
			if [ "$ver" = "-" ]; then
593
				leftover="$leftover $p"
594
			else
595
				progress_next "$(($dloaddebs + $size))"
596
				local debdest="$($DLDEST deb "$p" "$ver" "$arc" "$m" "$fil")"
597
				if get "$m/$fil" "$TARGET/$debdest" "$md5" "$size"; then
598
					dloaddebs="$(($dloaddebs + $size))"
599
					echo >>$TARGET/debootstrap/debpaths "$p $debdest"
600
				else
601
					warning COULDNTDL "Couldn't download package %s" "$p"
602
				fi
603
			fi
604
		done
605
		echo >&5 ${leftover# }
606
	)
607
}
608
609
download_release () {
610
	local m1="${MIRRORS%% *}"
611
612
	local numdebs="$#"
613
614
	local countdebs=0
615
	progress $countdebs $numdebs SIZEDEBS "Finding package sizes"
616
617
	local totaldebs=0
618
	local leftoverdebs="$*"
619
	for c in $COMPONENTS; do
620
		if [ "$countdebs" -ge "$numdebs" ]; then break; fi
621
622
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
623
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
624
		if [ ! -e "$pkgdest" ]; then continue; fi
625
626
		info CHECKINGSIZES "Checking component %s on %s..." "$c" "$m1"
627
628
		leftoverdebs="$(get_package_sizes "$m1" "$pkgdest" $leftoverdebs)"
629
630
		countdebs=$(($countdebs + ${leftoverdebs%% *}))
631
		leftoverdebs=${leftoverdebs#* }
632
633
		totaldebs=${leftoverdebs%% *}
634
		leftoverdebs=${leftoverdebs#* }
635
636
		progress $countdebs $numdebs SIZEDEBS "Finding package sizes"
637
	done
638
639
	if [ "$countdebs" -ne "$numdebs" ]; then
640
		error 1 LEFTOVERDEBS "Couldn't find these debs: %s" "$leftoverdebs"
641
	fi
642
643
	local dloaddebs=0
644
645
	progress $dloaddebs $totaldebs DOWNDEBS "Downloading packages"
646
	:>$TARGET/debootstrap/debpaths
647
648
	pkgs_to_get="$*"
649
	for c in $COMPONENTS; do
650
	    local path="dists/$SUITE/$c/binary-$ARCH/Packages"
651
	    for m in $MIRRORS; do
652
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
653
		if [ ! -e "$pkgdest" ]; then continue; fi
654
		pkgs_to_get="$(download_debs "$m" "$pkgdest" $pkgs_to_get 5>&1 1>&6)"
655
		if [ -z "$pkgs_to_get" ]; then break; fi
656
	    done 6>&1
657
	    if [ -z "$pkgs_to_get" ]; then break; fi
658
	done
659
	progress $dloaddebs $totaldebs DOWNDEBS "Downloading packages"
660
	if [ "$pkgs_to_get" != "" ]; then
661
		error 1 COULDNTDLPKGS "Couldn't download packages: %s" "$pkgs_to_get"
662
	fi
663
}
664
665
download_main_indices () {
666
	local m1="${MIRRORS%% *}"
667
	local comp="${USE_COMPONENTS}"
668
	progress 0 100 DOWNMAINPKGS "Downloading Packages file"
669
	progress_next 100
670
671
	if [ -z "$comp" ]; then comp=main; fi
672
	COMPONENTS="$(echo $comp | tr '|' ' ')"
673
674
	export COMPONENTS
675
	for m in $MIRRORS; do
676
	    for c in $COMPONENTS; do
677
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
678
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
679
		if [ -x /bin/gunzip ] && get "$m/${path}.gz" "${pkgdest}.gz"; then
680
			rm -f "$pkgdest"
681
			gunzip "$pkgdest.gz"
682
		elif get "$m/$path" "$pkgdest"; then
683
			true
684
		fi
685
	    done
686
	done
687
	progress 100 100 DOWNMAINPKGS "Downloading Packages file"
688
}
689
690
download_main () {
691
	local m1="${MIRRORS%% *}"
692
693
	:>$TARGET/debootstrap/debpaths
694
	for p in "$@"; do
695
	    for c in $COMPONENTS; do
696
		local details=""
697
		for m in $MIRRORS; do
698
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
699
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
700
			if [ ! -e "$pkgdest" ]; then continue; fi
701
			details="$($PKGDETAILS PKGS "$m" "$pkgdest" "$p")"
702
			if [ "$details" = "$p -" ]; then
703
				details=""
704
				continue
705
			fi
706
			size="${details##* }"; details="${details% *}"
707
			md5="${details##* }"; details="${details% *}"
708
			local debdest="$($DLDEST deb $details)"
709
			if get "$m/${details##* }" "$TARGET/$debdest" "$md5" "$size"; then
710
				echo >>$TARGET/debootstrap/debpaths "$p $debdest"
711
				details="done"
712
				break
713
			fi
714
		done
715
		if [ "$details" != "" ]; then
716
			break
717
		fi
718
	    done
719
	    if [ "$details" != "done" ]; then
720
		error 1 COULDNTDL "Couldn't download %s" "$p"
721
	    fi
722
	done
723
}
724
725
###################################################### deb choosing support
726
727
get_debs () {
728
	local field="$1"
729
	shift
730
	local m1 c
731
	for m1 in $MIRRORS; do
732
		for c in $COMPONENTS; do
733
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
734
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
735
			echo $("$PKGDETAILS" FIELD "$field" "$m1" "$pkgdest" "$@" | sed 's/ .*//')
736
		done
737
	done
738
}
739
740
################################################################ extraction
741
742
EXTRACTORS_SUPPORTED="dpkg-deb ar"
743
744
# Native dpkg-deb based extractors
745
extract_dpkg_deb_field () {
746
	local pkg="$1"
747
	local field="$2"
748
749
	dpkg-deb -f "$pkg" "$field"
750
}
751
752
extract_dpkg_deb_data () {
753
	local pkg="$1"
754
755
	dpkg-deb --fsys-tarfile "$pkg" | tar -xf -
756
}
757
758
# Raw .deb extractors
759
extract_ar_deb_field () {
760
	local pkg="$1"
761
	local field="$2"
762
763
	ar -p "$pkg" control.tar.gz | zcat |
764
	    tar -O -xf - control ./control 2>/dev/null |
765
	    grep -i "^$field:" | sed -e 's/[^:]*: *//' | head -n 1
766
}
767
768
extract_ar_deb_data () {
769
	local pkg="$1"
770
	local tarball=$(ar -t "$pkg" | grep "^data.tar.[bgx]z")
771
772
	case "$tarball" in
773
		data.tar.gz) cat_cmd=zcat ;;
774
		data.tar.bz2) cat_cmd=bzcat ;;
775
		data.tar.xz) cat_cmd=xzcat ;;
776
		*) error 1 UNKNOWNDATACOMP "Unknown compression type for %s in %s" "$tarball" "$pkg" ;;
777
	esac
778
779
	if type $cat_cmd >/dev/null 2>&1; then
780
		ar -p "$pkg" "$tarball" | $cat_cmd | tar -xf -
781
	else
782
		error 1 UNPACKCMDUNVL "The $cat_cmd is not available on the system"
783
	fi
784
}
785
786
valid_extractor () {
787
	local extractor="$1"
788
789
	for E in $EXTRACTORS_SUPPORTED; do
790
		if [ "$extractor" = "$E" ]; then
791
			return 0
792
		fi
793
	done
794
795
	return 1
796
}
797
798
choose_extractor () {
799
	local extractor
800
801
	if [ -n "$EXTRACTOR_OVERRIDE" ]; then
802
		extractor="$EXTRACTOR_OVERRIDE"
803
	elif type dpkg-deb >/dev/null 2>&1; then
804
		extractor="dpkg-deb"
805
	else
806
		extractor="ar"
807
	fi
808
809
	info CHOSENEXTRACTOR "Chosen extractor for .deb packages: %s" "$extractor"
810
	case "$extractor" in
811
	dpkg-deb)
812
		extract_deb_field () { extract_dpkg_deb_field "$@"; }
813
		extract_deb_data () { extract_dpkg_deb_data "$@"; }
814
		;;
815
	ar)
816
		extract_deb_field () { extract_ar_deb_field "$@"; }
817
		extract_deb_data () { extract_ar_deb_data "$@"; }
818
		;;
819
	esac
820
}
821
822
extract () { (
823
	cd "$TARGET"
824
	local p=0 cat_cmd
825
	for pkg in $(debfor "$@"); do
826
		p="$(($p + 1))"
827
		progress "$p" "$#" EXTRACTPKGS "Extracting packages"
828
		packagename="$(echo "$pkg" | sed 's,^.*/,,;s,_.*$,,')"
829
		info EXTRACTING "Extracting %s..." "$packagename"
830
		extract_deb_data "./$pkg"
831
	done
832
); }
833
834
in_target_nofail () {
835
	if ! $CHROOT_CMD "$@" 2>/dev/null; then
836
		true
837
	fi
838
	return 0
839
}
840
841
in_target_failmsg () {
842
	local code="$1"
843
	local msg="$2"
844
	local arg="$3"
845
	shift; shift; shift
846
	if ! $CHROOT_CMD "$@"; then
847
		warning "$code" "$msg" "$arg"
848
		return 1
849
	fi
850
	return 0
851
}
852
853
in_target () {
854
	in_target_failmsg IN_TARGET_FAIL "Failure trying to run: %s" "$CHROOT_CMD $*" "$@"
855
}
856
857
###################################################### standard setup stuff
858
859
conditional_cp () {
860
	if [ ! -e "$2/$1" ]; then
861
		if [ -L "$1" ] && [ -e "$1" ]; then
862
			cat "$1" >"$2/$1"
863
		elif [ -e "$1" ]; then
864
			cp -a "$1" "$2/$1"
865
		fi
866
	fi
867
}
868
869
mv_invalid_to () {
870
	local m="$1"
871
	m="$(echo "${m#http://}" | tr '/' '_' | sed 's/_*//')"
872
	(cd "$TARGET/$APTSTATE/lists"
873
	 for a in debootstrap.invalid_*; do
874
		 mv "$a" "${m}_${a#*_}"
875
	 done
876
	)
877
}
878
879
setup_apt_sources () {
880
	mkdir -p "$TARGET/etc/apt"
881
	for m in "$@"; do
882
		local cs=""
883
		for c in $COMPONENTS; do
884
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
885
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
886
			if [ -e "$pkgdest" ]; then cs="$cs $c"; fi
887
		done
888
		if [ "$cs" != "" ]; then echo "deb $m $SUITE$cs"; fi
889
	done > "$TARGET/etc/apt/sources.list"
890
}
891
892
setup_etc () {
893
	mkdir -p "$TARGET/etc"
894
895
	conditional_cp /etc/resolv.conf "$TARGET"
896
	conditional_cp /etc/hostname "$TARGET"
897
898
	if [ "$DLDEST" = apt_dest ] && [ ! -e "$TARGET/etc/apt/sources.list" ]; then
899
		setup_apt_sources "http://debootstrap.invalid/"
900
	fi
901
}
902
903
UMOUNT_DIRS=
904
905
umount_exit_function () {
906
	for dir in $UMOUNT_DIRS; do
907
		umount "$TARGET/${dir#/}" || true
908
	done
909
}
910
911
umount_on_exit () {
912
	if [ "$UMOUNT_DIRS" ]; then
913
		UMOUNT_DIRS="$UMOUNT_DIRS $1"
914
	else
915
		UMOUNT_DIRS="$1"
916
		on_exit umount_exit_function
917
	fi
918
}
919
920
clear_mtab () {
921
	if [ -f "$TARGET/etc/mtab" ] && [ ! -h "$TARGET/etc/mtab" ]; then
922
		rm -f "$TARGET/etc/mtab"
923
	fi
924
}
925
926
setup_proc () {
927
	case "$ARCH" in
928
	    kfreebsd-*)
929
		umount_on_exit /dev
930
		umount_on_exit /proc
931
		umount "$TARGET/proc" 2>/dev/null || true
932
		in_target mount -t linprocfs proc /proc
933
		;;
934
	    hurd-*)
935
		;;
936
	    *)
937
		umount_on_exit /dev/pts
938
		umount_on_exit /dev/shm
939
		umount_on_exit /proc/bus/usb
940
		umount_on_exit /proc
941
		umount "$TARGET/proc" 2>/dev/null || true
942
		in_target mount -t proc proc /proc
943
		if [ -d "$TARGET/sys" ] && \
944
		   grep -q '[[:space:]]sysfs' /proc/filesystems 2>/dev/null; then
945
			umount_on_exit /sys
946
			umount "$TARGET/sys" 2>/dev/null || true
947
			in_target mount -t sysfs sysfs /sys
948
		fi
949
		on_exit clear_mtab
950
		;;
951
	esac
952
	umount_on_exit /lib/init/rw
953
}
954
955
setup_proc_fakechroot () {
956
	rm -rf "$TARGET/proc"
957
	ln -s /proc "$TARGET"
958
}
959
960
setup_devices () {
961
	case "$ARCH" in
962
	    kfreebsd-*)
963
		in_target mount -t devfs devfs /dev ;;
964
	    hurd-*)
965
		setup_devices_hurd ;;
966
	    *)
967
		if [ -e "$DEVICES_TARGZ" ]; then
968
			zcat "$DEVICES_TARGZ" | (cd "$TARGET"; tar -xf -)
969
		else
970
			if [ -e /dev/.devfsd ] ; then
971
				in_target mount -t devfs devfs /dev
972
			else
973
				error 1 NODEVTGZ "no %s. cannot create devices" "$DEVICES_TARGZ"
974
			fi
975
		fi
976
		;;
977
	esac
978
}
979
980
setup_devices_hurd () {
981
	mkdir -p "$TARGET/servers/socket"
982
	/bin/settrans -cfk "$TARGET/servers/socket/1" /hurd/pflocal
983
	/bin/settrans -cf "$TARGET/servers/socket/2" /hurd/pfinet
984
	/bin/settrans -cfk "$TARGET/servers/exec" /hurd/exec
985
	/bin/settrans -cf "$TARGET/servers/crash-suspend" /hurd/crash --suspend
986
	/bin/settrans -cf "$TARGET/servers/crash-kill" /hurd/crash --kill
987
	/bin/settrans -cf "$TARGET/servers/crash-dump-core" /hurd/crash --dump-core
988
	/bin/settrans -cf "$TARGET/servers/password" /hurd/password
989
	/bin/settrans -cf "$TARGET/servers/default-pager" /hurd/proxy-defpager
990
	ln -fs crash-kill "$TARGET/servers/crash"
991
	ln -fs 1 "$TARGET/servers/socket/local"
992
	ln -fs 2 "$TARGET/servers/socket/inet"
993
	(cd "$TARGET/dev"; /sbin/MAKEDEV fd std ptyp ptyq vcs tty1 tty2 tty3 tty4 tty5 tty6)
994
}
995
996
setup_devices_fakechroot () {
997
	rm -rf "$TARGET/dev"
998
	ln -s /dev "$TARGET"
999
}
1000
1001
setup_dselect_method () {
1002
	case "$1" in
1003
	    apt)
1004
		mkdir -p "$TARGET/var/lib/dpkg"
1005
		echo "apt apt" > "$TARGET/var/lib/dpkg/cmethopt"
1006
		chmod 644 "$TARGET/var/lib/dpkg/cmethopt"
1007
		;;
1008
	    *)
1009
		error 1 UNKNOWNDSELECT "unknown dselect method"
1010
		;;
1011
	esac
1012
}
1013
1014
################################################################ pkgdetails
1015
1016
# NOTE
1017
# For the debootstrap udeb, pkgdetails is provided by the bootstrap-base
1018
# udeb, so the pkgdetails API needs to be kept in sync with that.
1019
1020
if [ -x /usr/bin/perl ]; then
1021
	PKGDETAILS=pkgdetails_perl
1022
1023
	pkgdetails_field () {
1024
		# uniq field mirror Packages values...
1025
		perl -le '
1026
$unique = shift @ARGV; $field = lc(shift @ARGV); $mirror = shift @ARGV;
1027
$cnt = length(@ARGV);
1028
%fields = map { $_, 0 } @ARGV;
1029
while (<STDIN>) {
1030
	chomp;
1031
	next if (/^ /);
1032
	if (/^([^:]*:)\s*(.*)$/) {
1033
		$f = lc($1); $v = $2;
1034
		$pkg = $v if ($f eq "package:");
1035
		$ver = $v if ($f eq "version:");
1036
		$arc = $v if ($f eq "architecture:");
1037
		$fil = $v if ($f eq "filename:");
1038
		$md5 = $v if ($f eq "md5sum:");
1039
		$siz = $v if ($f eq "size:");
1040
		$val = $v if ($f eq $field);
1041
	} elsif (/^$/) {
1042
		if (defined $val && defined $fields{$val}) {
1043
			$cnt++;
1044
			printf "%s %s %s %s %s %s %s\n",
1045
			 $pkg, $ver, $arc, $mirror, $fil, $md5, $siz;
1046
			if ($unique) {
1047
				delete $fields{$val};
1048
				last if (--$cnt <= 0);
1049
			}
1050
		}
1051
		undef $val;
1052
	}
1053
}
1054
for $v (keys %fields) {
1055
	printf ("%s -\n", $v) if ($unique);
1056
}
1057
' "$@"
1058
	}
1059
1060
	pkgdetails_perl () {
1061
		if [ "$1" = "WGET%" ]; then
1062
			shift;
1063
			perl -e '
1064
$v = 0;
1065
while (read STDIN, $x, 1) {
1066
	if ($x =~ m/\d/) {
1067
		$v *= 10;
1068
		$v += $x;
1069
	} elsif ($x eq "%") {
1070
		printf "P: %d %d%s\n", int($v / 100.0 * ($ARGV[1] - $ARGV[0]) + $ARGV[0]), $ARGV[2], ($#ARGV == 3 ? " $ARGV[3]" : "");
1071
		$v = 0;
1072
	} else {
1073
		$v = 0;
1074
	}
1075
}' "$@"
1076
		elif [ "$1" = "GETDEPS" ]; then
1077
			local pkgdest="$2"; shift; shift
1078
			perl -e '
1079
while (<STDIN>) {
1080
	chomp;
1081
	$in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
1082
	$in = 0 if (/^$/);
1083
	if ($in and (/^Depends: (.*)$/ or /^Pre-Depends: (.*)$/)) {
1084
		for $d (split /\s*,\s*/, $1) {
1085
			$d =~ s/\s*[|].*$//;
1086
			$d =~ s/\s*[(].*[)]\s*//;
1087
			print "$d\n";
1088
		}
1089
	}
1090
}' <"$pkgdest" "$@" | sort | uniq
1091
		elif [ "$1" = "PKGS" ]; then
1092
			local m="$2"
1093
			local p="$3"
1094
			shift; shift; shift
1095
			pkgdetails_field 1 Package: "$m" "$@" < "$p"
1096
		elif [ "$1" = "FIELD" ]; then
1097
			local f="$2"
1098
			local m="$3"
1099
			local p="$4"
1100
			shift; shift; shift; shift
1101
			pkgdetails_field 0 "$f" "$m" "$@" < "$p"
1102
		elif [ "$1" = "STANZAS" ]; then
1103
			local pkgdest="$2"; shift; shift
1104
			perl -e '
1105
my $accum = "";
1106
while (<STDIN>) {
1107
	$accum .= $_;
1108
	$in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
1109
	if ($in and /^$/) {
1110
		print $accum;
1111
		if (substr($accum, -1) != "\n") {
1112
			print "\n\n";
1113
		} elsif (substr($accum, -2, 1) != "\n") {
1114
			print "\n";
1115
		}
1116
		$in = 0;
1117
	}
1118
	$accum = "" if /^$/;
1119
}' <"$pkgdest" "$@"
1120
		fi
1121
	}
1122
elif [ -e "/usr/lib/debootstrap/pkgdetails" ]; then
1123
	PKGDETAILS="/usr/lib/debootstrap/pkgdetails"
1124
elif [ -e "$DEBOOTSTRAP_DIR/pkgdetails" ]; then
1125
	PKGDETAILS="$DEBOOTSTRAP_DIR/pkgdetails"
1126
else
1127
	PKGDETAILS=""
1128
fi
1129
1130
##################################################### dependency resolution
1131
1132
resolve_deps () {
1133
	local m1="${MIRRORS%% *}"
1134
1135
	# XXX: I can't think how to deal well with dependency resolution and
1136
	#      lots of Packages files. -- aj 2005/06/12
1137
1138
	c="${COMPONENTS%% *}"
1139
	local path="dists/$SUITE/$c/binary-$ARCH/Packages"
1140
	local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
1141
1142
	local PKGS="$*"
1143
	local ALLPKGS="$PKGS";
1144
	local ALLPKGS2="";
1145
	while [ "$PKGS" != "" ]; do
1146
		PKGS=$("$PKGDETAILS" GETDEPS "$pkgdest" $PKGS)
1147
		PKGS=$("$PKGDETAILS" PKGS REAL "$pkgdest" $PKGS | sed -n 's/ .*REAL.*$//p')
1148
		ALLPKGS2=$(echo "$PKGS $ALLPKGS" | tr ' ' '\n' | sort | uniq)
1149
		PKGS=$(without "$ALLPKGS2" "$ALLPKGS")
1150
		ALLPKGS="$ALLPKGS2"
1151
	done
1152
	echo $ALLPKGS
1153
}
1154
1155
setup_available () {
1156
	local m1="${MIRRORS%% *}"
1157
1158
	for c in $COMPONENTS; do
1159
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
1160
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
1161
		# XXX: What if a package is in more than one component?
1162
		# -- cjwatson 2009-07-29
1163
		"$PKGDETAILS" STANZAS "$pkgdest" "$@"
1164
	done >"$TARGET/var/lib/dpkg/available"
1165
1166
	for pkg; do
1167
		echo "$pkg install"
1168
	done | in_target dpkg --set-selections
1169
}
1170
1171
get_next_predep () {
1172
	local stanza="$(in_target_nofail dpkg --predep-package)"
1173
	[ "$stanza" ] || return 1
1174
	echo "$stanza" | grep '^Package:' | sed 's/^Package://; s/^ *//'
1175
}
1176
1177
################################################################### helpers
1178
1179
# Return zero if it is possible to create devices and execute programs in
1180
# this directory. (Both may be forbidden by mount options, e.g. nodev and
1181
# noexec respectively.)
1182
check_sane_mount () {
1183
	mkdir -p "$1"
1184
1185
	case "$ARCH" in
1186
	    kfreebsd-*|hurd-*)
1187
		;;
1188
	    *)
1189
		mknod "$1/test-dev-null" c 1 3 || return 1
1190
		if ! echo test > "$1/test-dev-null"; then
1191
			rm -f "$1/test-dev-null"
1192
			return 1
1193
		fi
1194
		rm -f "$1/test-dev-null"
1195
		;;
1196
	esac
1197
1198
	cat > "$1/test-exec" <<EOF
1199
#! /bin/sh
1200
:
1201
EOF
1202
	chmod +x "$1/test-exec"
1203
	if ! "$1/test-exec"; then
1204
		rm -f "$1/test-exec"
1205
		return 1
1206
	fi
1207
	rm -f "$1/test-exec"
1208
1209
	return 0
1210
}
1211
1212
read_gpg_status () {
1213
	badsig=
1214
	unkkey=
1215
	validsig=
1216
	while read prefix keyword keyid rest; do
1217
		[ "$prefix" = '[GNUPG:]' ] || continue
1218
		case $keyword in
1219
		    BADSIG)	badsig="$keyid" ;;
1220
		    NO_PUBKEY)	unkkey="$keyid" ;;
1221
		    VALIDSIG)	validsig="$keyid" ;;
1222
		esac
1223
	done
1224
	if [ "$validsig" ]; then
1225
		info VALIDRELSIG "Valid Release signature (key id %s)" "$validsig"
1226
	elif [ "$badsig" ]; then
1227
		error 1 BADRELSIG "Invalid Release signature (key id %s)" "$badsig"
1228
	elif [ "$unkkey" ]; then
1229
		error 1 UNKNOWNRELSIG "Release signed by unknown key (key id %s)" "$unkkey"
1230
	else
1231
		error 1 SIGCHECK "Error executing gpgv to check Release signature"
1232
	fi
1233
}
1234
1235
without () {
1236
	# usage:  without "a b c" "a d" -> "b" "c"
1237
	(echo $1 | tr ' ' '\n' | sort | uniq;
1238
	 echo $2 $2 | tr ' ' '\n') | sort | uniq -u | tr '\n' ' '
1239
	echo
1240
}
1241
1242
# Formerly called 'repeat', but that's a reserved word in zsh.
1243
repeatn () {
1244
	local n="$1"
1245
	shift
1246
	while [ "$n" -gt 0 ]; do
1247
		if "$@"; then
1248
			break
1249
		else
1250
			n="$(( $n - 1 ))"
1251
			sleep 1
1252
		fi
1253
	done
1254
	if [ "$n" -eq 0 ]; then return 1; fi
1255
	return 0
1256
}
1257
1258
N_EXIT_THINGS=0
1259
exit_function () {
1260
	local n=0
1261
	while [ "$n" -lt "$N_EXIT_THINGS" ]; do
1262
		(eval $(eval echo \${EXIT_THING_$n}) 2>/dev/null || true)
1263
		n="$(( $n + 1 ))"
1264
	done
1265
	N_EXIT_THINGS=0
1266
}
1267
1268
trap "exit_function" 0
1269
trap "exit 129" 1
1270
trap "error 130 INTERRUPTED \"Interrupt caught ... exiting\"" 2
1271
trap "exit 131" 3
1272
trap "exit 143" 15
1273
1274
on_exit () {
1275
	eval `echo EXIT_THING_${N_EXIT_THINGS}=\"$1\"`
1276
	N_EXIT_THINGS="$(( $N_EXIT_THINGS + 1 ))"
1277
}
1278
1279
############################################################## fakechroot tools
1280
1281
install_fakechroot_tools () {
1282
	mv "$TARGET/sbin/ldconfig" "$TARGET/sbin/ldconfig.REAL"
1283
	echo \
1284
"#!/bin/sh
1285
echo
1286
echo \"Warning: Fake ldconfig called, doing nothing\"" > "$TARGET/sbin/ldconfig"
1287
	chmod 755 "$TARGET/sbin/ldconfig"
1288
1289
	echo \
1290
"/sbin/ldconfig
1291
/sbin/ldconfig.REAL
1292
fakechroot" >> "$TARGET/var/lib/dpkg/diversions"
1293
1294
	mv "$TARGET/usr/bin/ldd" "$TARGET/usr/bin/ldd.REAL"
1295
	cat << 'END' > "$TARGET/usr/bin/ldd"
1296
#!/usr/bin/perl
1297
1298
# fakeldd
1299
#
1300
# Replacement for ldd with usage of objdump
1301
#
1302
# (c) 2003-2005 Piotr Roszatycki <dexter@debian.org>, BSD
1303
1304
1305
my %libs = ();
1306
1307
my $status = 0;
1308
my $dynamic = 0;
1309
my $biarch = 0;
1310
1311
my $ldlinuxsodir = "/lib";
1312
my @ld_library_path = qw(/usr/lib /lib);
1313
1314
1315
sub ldso($) {
1316
	my ($lib) = @_;
1317
	my @files = ();
1318
1319
	if ($lib =~ /^\//) {
1320
	    $libs{$lib} = $lib;
1321
	    push @files, $lib;
1322
	} else {
1323
	    foreach my $ld_path (@ld_library_path) {
1324
		next unless -f "$ld_path/$lib";
1325
		my $badformat = 0;
1326
		open OBJDUMP, "objdump -p $ld_path/$lib 2>/dev/null |";
1327
	 	while (my $line = <OBJDUMP>) {
1328
		    if ($line =~ /file format (\S*)$/) {
1329
				$badformat = 1 unless $format eq $1;
1330
				last;
1331
		    }
1332
		}
1333
		close OBJDUMP;
1334
		next if $badformat;
1335
		$libs{$lib} = "$ld_path/$lib";
1336
		push @files, "$ld_path/$lib";
1337
	    }
1338
	    objdump(@files);
1339
	}
1340
}
1341
1342
1343
sub objdump(@) {
1344
	my (@files) = @_;
1345
	my @libs = ();
1346
1347
	foreach my $file (@files) {
1348
	    open OBJDUMP, "objdump -p $file 2>/dev/null |";
1349
	    while (my $line = <OBJDUMP>) {
1350
		$line =~ s/^\s+//;
1351
		my @f = split (/\s+/, $line);
1352
		if ($line =~ /file format (\S*)$/) {
1353
		    if (not $format) {
1354
			$format = $1;
1355
			if ($unamearch eq "x86_64" and $format eq "elf32-i386") {
1356
			    my $link = readlink "/lib/ld-linux.so.2";
1357
			    if ($link =~ /^\/emul\/ia32-linux\//) {
1358
				$ld_library_path[-2] = "/emul/ia32-linux/usr/lib";
1359
				$ld_library_path[-1] = "/emul/ia32-linux/lib";
1360
			    }
1361
			} elsif ($unamearch =~ /^(sparc|sparc64)$/ and $format eq "elf64-sparc") {
1362
			    $ldlinuxsodir = "/lib64";
1363
			    $ld_library_path[-2] = "/usr/lib64";
1364
			    $ld_library_path[-1] = "/lib64";
1365
			}
1366
		    } else {
1367
			next unless $format eq $1;
1368
		    }
1369
		}
1370
		if (not $dynamic and $f[0] eq "Dynamic") {
1371
		    $dynamic = 1;
1372
		}
1373
		next unless $f[0] eq "NEEDED";
1374
		if ($f[1] =~ /^ld-linux(\.|-)/) {
1375
		    $f[1] = "$ldlinuxsodir/" . $f[1];
1376
		}
1377
		if (not defined $libs{$f[1]}) {
1378
		    $libs{$f[1]} = undef;
1379
		    push @libs, $f[1];
1380
		}
1381
	    }
1382
	    close OBJDUMP;
1383
	}
1384
1385
	foreach my $lib (@libs) {
1386
	    ldso($lib);
1387
	}
1388
}
1389
1390
1391
if ($#ARGV < 0) {
1392
	print STDERR "fakeldd: missing file arguments\n";
1393
	exit 1;
1394
}
1395
1396
while ($ARGV[0] =~ /^-/) {
1397
	my $arg = $ARGV[0];
1398
	shift @ARGV;
1399
	last if $arg eq "--";
1400
}
1401
1402
open LD_SO_CONF, "/etc/ld.so.conf";
1403
while ($line = <LD_SO_CONF>) {
1404
	chomp $line;
1405
	unshift @ld_library_path, $line;
1406
}
1407
close LD_SO_CONF;
1408
1409
unshift @ld_library_path, split(/:/, $ENV{LD_LIBRARY_PATH});
1410
1411
$unamearch = `/bin/uname -m`;
1412
chomp $unamearch;
1413
1414
foreach my $file (@ARGV) {
1415
	my $address;
1416
	%libs = ();
1417
	$dynamic = 0;
1418
1419
	if ($#ARGV > 0) {
1420
		print "$file:\n";
1421
	}
1422
1423
	if (not -f $file) {
1424
		print STDERR "ldd: $file: No such file or directory\n";
1425
		$status = 1;
1426
		next;
1427
	}
1428
1429
	objdump($file);
1430
1431
	if ($dynamic == 0) {
1432
		print "\tnot a dynamic executable\n";
1433
		$status = 1;
1434
	} elsif (scalar %libs eq "0") {
1435
		print "\tstatically linked\n";
1436
	}
1437
1438
	if ($format =~ /^elf64-/) {
1439
		$address = "0x0000000000000000";
1440
	} else {
1441
		$address = "0x00000000";
1442
	}
1443
1444
	foreach $lib (keys %libs) {
1445
		if ($libs{$lib}) {
1446
			printf "\t%s => %s (%s)\n", $lib, $libs{$lib}, $address;
1447
		} else {
1448
			printf "\t%s => not found\n", $lib;
1449
		}
1450
	}
1451
}
1452
1453
exit $status;
1454
END
1455
	chmod 755 "$TARGET/usr/bin/ldd"
1456
1457
	echo \
1458
"/usr/bin/ldd
1459
/usr/bin/ldd.REAL
1460
fakechroot" >> "$TARGET/var/lib/dpkg/diversions"
1461
1462
}
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/usr/share/debootstrap-ucs3/functions-ucs3 (-1462 lines)
 Lines 1-1462    Link Here 
1
############################################################### smallutils
2
3
smallyes() {
4
	YES="${1-y}"
5
	while echo "$YES" 2>/dev/null ; do : ; done
6
}
7
8
############################################################### interaction
9
10
error () {
11
	# <error code> <name> <string> <args>
12
	local err="$1"
13
	local name="$2"
14
	local fmt="$3"
15
	shift; shift; shift
16
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
17
		(echo "E: $name"
18
		for x in "$@"; do echo "EA: $x"; done
19
		echo "EF: $fmt") >&4
20
	else
21
		(printf "E: $fmt\n" "$@") >&4
22
	fi
23
	exit $err
24
}
25
26
warning () {
27
	# <name> <string> <args>
28
	local name="$1"
29
	local fmt="$2"
30
	shift; shift
31
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
32
		(echo "W: $name"
33
		for x in "$@"; do echo "WA: $x"; done
34
		echo "WF: $fmt") >&4
35
	else
36
		printf "W: $fmt\n" "$@" >&4
37
	fi
38
}
39
40
info () {
41
	# <name> <string> <args>
42
	local name="$1"
43
	local fmt="$2"
44
	shift; shift
45
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
46
		(echo "I: $name"
47
		for x in "$@"; do echo "IA: $x"; done
48
		echo "IF: $fmt") >&4
49
	else
50
		printf "I: $fmt\n" "$@" >&4
51
	fi
52
}
53
54
PROGRESS_NOW=0
55
PROGRESS_END=0
56
PROGRESS_NEXT=""
57
PROGRESS_WHAT=""
58
59
progress_next () {
60
	PROGRESS_NEXT="$1"
61
}
62
63
wgetprogress () {
64
	[ ! "$verbose" ] && QSWITCH="-q"
65
	local ret=0
66
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ] && [ "$PROGRESS_NEXT" ]; then
67
		wget "$@" 2>&1 >/dev/null | $PKGDETAILS "WGET%" $PROGRESS_NOW $PROGRESS_NEXT $PROGRESS_END >&3
68
		ret=$?
69
	elif [ "$USE_BOOTFLOPPIES_INTERACTION" ] && [ "$PROGRESS_NEXT" ]; then
70
		wget "$@" 2>&1 >/dev/null | $PKGDETAILS "WGET%" $PROGRESS_NOW $PROGRESS_NEXT $PROGRESS_END "$PROGRESS_WHAT" >&3
71
		ret=$?
72
	else
73
		wget $QSWITCH "$@" 
74
		ret=$?
75
	fi
76
	return $ret
77
}
78
79
progress () {
80
	# <now> <end> <name> <string> <args>
81
	local now="$1"
82
	local end="$2"
83
	local name="$3"
84
	local fmt="$4"
85
	shift; shift; shift; shift
86
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
87
		PROGRESS_NOW="$now"
88
		PROGRESS_END="$end"
89
		PROGRESS_NEXT=""
90
		(echo "P: $now $end $name"
91
		for x in "$@"; do echo "PA: $x"; done
92
		echo "PF: $fmt") >&3
93
	elif [ "$USE_BOOTFLOPPIES_INTERACTION" ]; then
94
		PROGRESS_NOW="$now"
95
		PROGRESS_END="$end"
96
		PROGRESS_WHAT="`printf "$fmt" "$@"`"
97
		PROGRESS_NEXT=""
98
		printf "P: %s %s %s\n" $now $end "$PROGRESS_WHAT" >&3
99
	fi
100
}
101
102
dpkg_progress () {
103
	# <now> <end> <name> <desc> UNPACKING|CONFIGURING
104
	local now="$1"
105
	local end="$2"
106
	local name="$3"
107
	local desc="$4"
108
	local action="$5"
109
	local expect=
110
111
	if [ "$action" = UNPACKING ]; then
112
		expect=half-installed
113
	elif [ "$action" = CONFIGURING ]; then
114
		expect=half-configured
115
	fi
116
117
	dp () {
118
		now="$(($now + ${1:-1}))"
119
	}
120
121
	exitcode=0
122
	while read status pkg qstate; do
123
		if [ "$status" = "EXITCODE" ]; then
124
			exitcode="$pkg"
125
			continue
126
		fi
127
		[ "$qstate" = "$expect" ] || continue
128
		case $qstate in
129
		    half-installed)
130
			dp; progress "$now" "$end" "$name" "$desc"
131
			info "$action" "Unpacking %s..." "${pkg%:}"
132
			expect=unpacked
133
			;;
134
		    unpacked)
135
			expect=half-installed
136
			;;
137
		    half-configured)
138
			dp; progress "$now" "$end" "$name" "$desc"
139
			info "$action" "Configuring %s..." "${pkg%:}"
140
			expect=installed
141
			;;
142
		    installed)
143
			expect=half-configured
144
			;;
145
		esac
146
	done
147
	return $exitcode
148
}
149
150
############################################################# set variables
151
152
default_mirror () {
153
	DEF_MIRROR="$1"
154
}
155
156
FINDDEBS_NEEDS_INDICES=false
157
finddebs_style () {
158
	case "$1" in
159
	    hardcoded)
160
		;;
161
	    from-indices)
162
		FINDDEBS_NEEDS_INDICES=true
163
		;;
164
	    *)
165
		error 1 BADFINDDEBS "unknown finddebs style"
166
		;;
167
	 esac
168
}
169
170
mk_download_dirs () {
171
	if [ $DLDEST = "apt_dest" ]; then
172
		mkdir -p "$TARGET/$APTSTATE/lists/partial"
173
		mkdir -p "$TARGET/var/cache/apt/archives/partial"
174
	fi
175
}
176
177
download_style () {
178
	case "$1" in
179
	    apt)
180
		if [ "$2" = "var-state" ]; then
181
			APTSTATE=var/state/apt
182
		else
183
			APTSTATE=var/lib/apt
184
		fi
185
		DLDEST=apt_dest
186
		export APTSTATE DLDEST DEBFOR
187
		;;
188
	    *)
189
		error 1 BADDLOAD "unknown download style"
190
		;;
191
	esac
192
}
193
194
########################################################## variant handling
195
196
doing_variant () {
197
	if [ "$1" = "$VARIANT" ]; then return 0; fi
198
	if [ "$1" = "-" ] && [ "$VARIANT" = "" ]; then return 0; fi
199
	return 1
200
}
201
202
SUPPORTED_VARIANTS="-"
203
variants () {
204
	SUPPORTED_VARIANTS="$*"
205
	for v in $*; do
206
		if doing_variant "$v"; then return 0; fi
207
	done
208
	error 1 UNSUPPVARIANT "unsupported variant"
209
}
210
211
################################################# work out names for things
212
213
mirror_style () {
214
	case "$1" in
215
	    release)
216
		DOWNLOAD_INDICES=download_release_indices
217
		DOWNLOAD_DEBS=download_release
218
		;;
219
	    main)
220
		DOWNLOAD_INDICES=download_main_indices
221
		DOWNLOAD_DEBS=download_main
222
		;;
223
	    *)
224
		error 1 BADMIRROR "unknown mirror style"
225
		;;
226
	esac
227
	export DOWNLOAD_INDICES
228
	export DOWNLOAD_DEBS
229
}
230
231
check_md5 () {
232
	# args: dest md5 size
233
	local expmd5="$2"
234
	local expsize="$3"
235
	relmd5=`md5sum < "$1" | sed 's/ .*$//'`
236
	relsize=`wc -c < "$1"`
237
	if [ "$expsize" -ne "$relsize" ] || [ "$expmd5" != "$relmd5" ]; then
238
		return 1
239
	fi
240
	return 0
241
}
242
243
get () {
244
	# args: from dest 'nocache'
245
	# args: from dest [md5sum size] [alt {md5sum size type}]
246
	local displayname
247
	if [ "${2%.deb}" != "$2" ]; then
248
		displayname="$(echo "$2" | sed 's,^.*/,,;s,_.*$,,')"
249
	else
250
		displayname="$(echo "$1" | sed 's,^.*/,,')"
251
	fi
252
253
	if [ -e "$2" ]; then
254
		if [ -z "$3" ]; then
255
			return 0
256
		elif [ "$3" = nocache ]; then
257
			rm -f "$2"
258
		else
259
			info VALIDATING "Validating %s" "$displayname"
260
			if check_md5 "$2" "$3" "$4"; then
261
				return 0
262
			else
263
				rm -f "$2"
264
			fi
265
		fi
266
	fi
267
	# Drop 'nocache' option
268
	if [ "$3" = nocache ]; then
269
		set "$1" "$2"
270
	fi
271
272
	if [ "$#" -gt 5 ]; then
273
		local st=3
274
		if [ "$5" = "-" ]; then st=6; fi
275
		local order="$(a=$st; while [ "$a" -le $# ]; do eval echo \"\${$(($a+1))}\" $a;
276
		a=$(($a + 3)); done | sort -n | sed 's/.* //')"
277
	else
278
		local order=3
279
	fi
280
	for a in $order; do
281
		local md5="$(eval echo \${$a})"
282
		local siz="$(eval echo \${$(( $a+1 ))})"
283
		local typ="$(eval echo \${$(( $a+2 ))})"
284
		local from
285
		local dest
286
287
		case "$typ" in
288
		    bz2) from="$1.bz2"; dest="$2.bz2" ;;
289
		    gz)  from="$1.gz"; dest="$2.gz" ;;
290
		    *)   from="$1"; dest="$2" ;;
291
		esac
292
293
		if [ "${dest#/}" = "$dest" ]; then
294
			dest="./$dest"
295
		fi
296
		local dest2="$dest"
297
		if [ -d "${dest2%/*}/partial" ]; then
298
			dest2="${dest2%/*}/partial/${dest2##*/}"
299
		fi
300
301
		info RETRIEVING "Retrieving %s" "$displayname"
302
		if ! just_get "$from" "$dest2"; then continue; fi
303
		if [ "$md5" != "" ]; then
304
			info VALIDATING "Validating %s" "$displayname"
305
			if check_md5 "$dest2" "$md5" "$siz"; then
306
				md5=""
307
			fi
308
		fi
309
		if [ -z "$md5" ]; then
310
			[ "$dest2" = "$dest" ] || mv "$dest2" "$dest"
311
			case "$typ" in
312
			    gz)  gunzip "$dest" ;;
313
			    bz2) bunzip2 "$dest" ;;
314
			esac
315
			return 0
316
		else
317
			warning CORRUPTFILE "%s was corrupt" "$from"
318
		fi
319
	done
320
	return 1
321
}
322
323
just_get () {
324
	# args: from dest
325
	local from="$1"
326
	local dest="$2"
327
	mkdir -p "${dest%/*}"
328
	if [ "${from#null:}" != "$from" ]; then
329
		error 1 NOTPREDL "%s was not pre-downloaded" "${from#null:}"
330
	elif [ "${from#http://}" != "$from" ] || [ "${from#ftp://}" != "$from" ]; then
331
		# http/ftp mirror
332
		if wgetprogress -O "$dest" "$from"; then
333
			return 0
334
		elif [ -s "$dest" ]; then
335
			local iters=0
336
			while [ "$iters" -lt 3 ]; do
337
				warning RETRYING "Retrying failed download of %s" "$from"
338
				if wgetprogress -c -O "$dest" "$from"; then break; fi
339
				iters="$(($iters + 1))"
340
			done
341
		else
342
			rm -f "$dest"
343
			return 1
344
		fi
345
	elif [ "${from#https://}" != "$from" ] ; then
346
		# http/ftp mirror
347
		if wgetprogress $CHECKCERTIF $CERTIFICATE $PRIVATEKEY -O "$dest" "$from"; then
348
			return 0
349
		elif [ -s "$dest" ]; then
350
			local iters=0
351
			while [ "$iters" -lt 3 ]; do
352
				warning RETRYING "Retrying failed download of %s" "$from"
353
				if wgetprogress $CHECKCERTIF $CERTIFICATE $PRIVATEKEY -c -O "$dest" "$from"; then break; fi
354
				iters="$(($iters + 1))"
355
			done
356
		else
357
			rm -f "$dest"
358
			return 1
359
		fi
360
	elif [ "${from#file:}" != "$from" ]; then
361
		local base="${from#file:}"
362
		if [ "${base#//}" != "$base" ]; then
363
			base="/${from#file://*/}"
364
		fi
365
		if [ -e "$base" ]; then
366
			cp "$base" "$dest"
367
			return 0
368
		else
369
			return 1
370
		fi
371
	elif [ "${from#ssh:}" != "$from" ]; then
372
		local ssh_dest="$(echo $from | sed -e 's#ssh://##' -e 's#/#:/#')"
373
		if [ -n "$ssh_dest" ]; then
374
			scp "$ssh_dest" "$dest"
375
			return 0
376
		else
377
			return 1
378
		fi
379
	else
380
		error 1 UNKNOWNLOC "unknown location %s" "$from"
381
	fi
382
}
383
384
download () {
385
	mk_download_dirs
386
	"$DOWNLOAD_DEBS" $(echo "$@" | tr ' ' '\n' | sort)
387
}
388
389
download_indices () {
390
	mk_download_dirs
391
	"$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort)
392
}
393
394
debfor () {
395
	(while read pkg path; do
396
		for p in "$@"; do
397
			[ "$p" = "$pkg" ] || continue;
398
			echo "$path"
399
		done
400
	 done <"$TARGET/debootstrap/debpaths"
401
	)
402
}
403
404
apt_dest () {
405
	# args:
406
	#   deb package version arch mirror path
407
	#   pkg suite component arch mirror path
408
	#   rel suite mirror path
409
	case "$1" in
410
	    deb)
411
		echo "/var/cache/apt/archives/${2}_${3}_${4}.deb" | sed 's/:/%3a/'
412
		;;
413
	    pkg)
414
		local m="$5"
415
		m="debootstrap.invalid"
416
		#if [ "${m#http://}" != "$m" ]; then
417
		#	m="${m#http://}"
418
		#elif [ "${m#file://}" != "$m" ]; then
419
		#	m="file_localhost_${m#file://*/}"
420
		#elif [ "${m#file:/}" != "$m" ]; then
421
		#	m="file_localhost_${m#file:/}"
422
		#fi
423
424
		printf "%s" "$APTSTATE/lists/"
425
		echo "${m}_$6" | sed 's/\//_/g'
426
		;;
427
	    rel)
428
		local m="$3"
429
		m="debootstrap.invalid"
430
		#if [ "${m#http://}" != "$m" ]; then
431
		#	m="${m#http://}"
432
		#elif [ "${m#file://}" != "$m" ]; then
433
		#	m="file_localhost_${m#file://*/}"
434
		#elif [ "${m#file:/}" != "$m" ]; then
435
		#	m="file_localhost_${m#file:/}"
436
		#fi
437
		printf "%s" "$APTSTATE/lists/"
438
		echo "${m}_$4" | sed 's/\//_/g'
439
		;;
440
	esac
441
}
442
443
################################################################## download
444
445
get_release_md5 () {
446
	local reldest="$1"
447
	local path="$2"
448
	sed -n '/^[Mm][Dd]5[Ss][Uu][Mm]/,/^[^ ]/p' < "$reldest" | \
449
		while read a b c; do
450
			if [ "$c" = "$path" ]; then echo "$a $b"; fi
451
		done | head -n 1
452
}
453
454
download_release_sig () {
455
	local m1="$1"
456
	local reldest="$2"
457
	local relsigdest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release.gpg")"
458
459
	if [ -n "$KEYRING" ]; then
460
		progress 0 100 DOWNRELSIG "Downloading Release file signature"
461
		progress_next 50
462
		get "$m1/dists/$SUITE/Release.gpg" "$relsigdest" nocache ||
463
			error 1 NOGETRELSIG "Failed getting release signature file %s" \
464
			"$m1/dists/$SUITE/Release.gpg"
465
		progress 50 100 DOWNRELSIG "Downloading Release file signature"
466
467
		info RELEASESIG "Checking Release signature"
468
		# Don't worry about the exit status from gpgv; parsing the output will
469
		# take care of that.
470
		(gpgv --status-fd 1 --keyring "$KEYRING" --ignore-time-conflict \
471
		 "$relsigdest" "$reldest" || true) | read_gpg_status
472
		progress 100 100 DOWNRELSIG "Downloading Release file signature"
473
	fi
474
}
475
476
download_release_indices () {
477
	local m1="${MIRRORS%% *}"
478
	local reldest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release")"
479
	progress 0 100 DOWNREL "Downloading Release file"
480
	progress_next 100
481
	get "$m1/dists/$SUITE/Release" "$reldest" nocache ||
482
		error 1 NOGETREL "Failed getting release file %s" "$m1/dists/$SUITE/Release"
483
484
	TMPCOMPONENTS="$(sed -n 's/Components: *//p' "$reldest")"
485
	for c in $TMPCOMPONENTS ; do
486
		eval "
487
		case \"\$c\" in
488
		    $USE_COMPONENTS)
489
			COMPONENTS=\"\$COMPONENTS \$c\"
490
			;;
491
		esac
492
		"
493
	done
494
	COMPONENTS="$(echo $COMPONENTS)"
495
496
	if [ -z "$COMPONENTS" ]; then
497
		mv "$reldest" "$reldest.malformed"
498
		error 1 INVALIDREL "Invalid Release file, no valid components"
499
	fi
500
	progress 100 100 DOWNREL "Downloading Release file"
501
502
	download_release_sig "$m1" "$reldest"
503
504
	local totalpkgs=0
505
	for c in $COMPONENTS; do
506
		local subpath="$c/binary-$ARCH/Packages"
507
		local bz2md="`get_release_md5 "$reldest" "$subpath.bz2"`"
508
		local gzmd="`get_release_md5 "$reldest" "$subpath.gz"`"
509
		local normmd="`get_release_md5 "$reldest" "$subpath"`"
510
		local md=
511
		if [ "$normmd" != "" ]; then
512
			md="$normmd"
513
		elif [ -x /bin/bunzip2 ] && [ "$bz2md" != "" ]; then
514
			md="$bz2md"
515
		elif [ -x /bin/gunzip ] && [ "$gzmd" != "" ]; then
516
			md="$gzmd"
517
		fi
518
		if [ "$md" != "" ]; then
519
			totalpkgs="$(( $totalpkgs + ${md#* } ))"
520
		else
521
			mv "$reldest" "$reldest.malformed"
522
			error 1 MISSINGRELENTRY "Invalid Release file, no entry for %s" "$subpath"
523
		fi
524
	done
525
526
	local donepkgs=0
527
	local pkgdest
528
	progress 0 $totalpkgs DOWNPKGS "Downloading Packages files"
529
	for c in $COMPONENTS; do
530
		local subpath="$c/binary-$ARCH/Packages"
531
		local path="dists/$SUITE/$subpath"
532
		local bz2md="`get_release_md5 "$reldest" "$subpath.bz2"`"
533
		local gzmd="`get_release_md5 "$reldest" "$subpath.gz"`"
534
		local normmd="`get_release_md5 "$reldest" "$subpath"`"
535
		local ext=
536
		local md=
537
		if [ "$normmd" != "" ]; then
538
			ext="$ext $normmd ."
539
			md="$normmd"
540
		fi
541
		if [ -x /bin/bunzip2 ] && [ "$bz2md" != "" ]; then
542
			ext="$ext $bz2md bz2"
543
			md="${md:-$bz2md}"
544
		fi
545
		if [ -x /bin/gunzip ] && [ "$gzmd" != "" ]; then
546
			ext="$ext $gzmd gz"
547
			md="${md:-$gzmd}"
548
		fi
549
		progress_next "$(($donepkgs + ${md#* }))"
550
		for m in $MIRRORS; do
551
			pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
552
			if get "$m/$path" "$pkgdest" $ext; then break; fi
553
		done
554
		if [ ! -f "$pkgdest" ]; then
555
			error 1 COULDNTDL "Couldn't download %s" "$path"
556
		fi
557
		donepkgs="$(($donepkgs + ${md#* }))"
558
		progress $donepkgs $totalpkgs DOWNPKGS "Downloading Packages files"
559
	done
560
}
561
562
get_package_sizes () {
563
	# mirror pkgdest debs..
564
	local m="$1"; shift
565
	local pkgdest="$1"; shift
566
	$PKGDETAILS PKGS "$m" "$pkgdest" "$@" | (
567
		newleft=""
568
		totaldebs=0
569
		countdebs=0
570
		while read p details; do
571
			if [ "$details" = "-" ]; then
572
				newleft="$newleft $p"
573
			else
574
				size="${details##* }";
575
				totaldebs="$(($totaldebs + $size))"
576
				countdebs="$(($countdebs + 1))"
577
			fi
578
		done
579
		echo "$countdebs $totaldebs$newleft"
580
	)
581
}
582
583
# note, leftovers come back on fd5 !!
584
download_debs () {
585
	local m="$1"
586
	local pkgdest="$2"
587
	shift; shift
588
589
	$PKGDETAILS PKGS "$m" "$pkgdest" "$@" | (
590
		leftover=""
591
		while read p ver arc mdup fil md5 size; do
592
			if [ "$ver" = "-" ]; then
593
				leftover="$leftover $p"
594
			else
595
				progress_next "$(($dloaddebs + $size))"
596
				local debdest="$($DLDEST deb "$p" "$ver" "$arc" "$m" "$fil")"
597
				if get "$m/$fil" "$TARGET/$debdest" "$md5" "$size"; then
598
					dloaddebs="$(($dloaddebs + $size))"
599
					echo >>$TARGET/debootstrap/debpaths "$p $debdest"
600
				else
601
					warning COULDNTDL "Couldn't download package %s" "$p"
602
				fi
603
			fi
604
		done
605
		echo >&5 ${leftover# }
606
	)
607
}
608
609
download_release () {
610
	local m1="${MIRRORS%% *}"
611
612
	local numdebs="$#"
613
614
	local countdebs=0
615
	progress $countdebs $numdebs SIZEDEBS "Finding package sizes"
616
617
	local totaldebs=0
618
	local leftoverdebs="$*"
619
	for c in $COMPONENTS; do
620
		if [ "$countdebs" -ge "$numdebs" ]; then break; fi
621
622
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
623
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
624
		if [ ! -e "$pkgdest" ]; then continue; fi
625
626
		info CHECKINGSIZES "Checking component %s on %s..." "$c" "$m1"
627
628
		leftoverdebs="$(get_package_sizes "$m1" "$pkgdest" $leftoverdebs)"
629
630
		countdebs=$(($countdebs + ${leftoverdebs%% *}))
631
		leftoverdebs=${leftoverdebs#* }
632
633
		totaldebs=${leftoverdebs%% *}
634
		leftoverdebs=${leftoverdebs#* }
635
636
		progress $countdebs $numdebs SIZEDEBS "Finding package sizes"
637
	done
638
639
	if [ "$countdebs" -ne "$numdebs" ]; then
640
		error 1 LEFTOVERDEBS "Couldn't find these debs: %s" "$leftoverdebs"
641
	fi
642
643
	local dloaddebs=0
644
645
	progress $dloaddebs $totaldebs DOWNDEBS "Downloading packages"
646
	:>$TARGET/debootstrap/debpaths
647
648
	pkgs_to_get="$*"
649
	for c in $COMPONENTS; do
650
	    local path="dists/$SUITE/$c/binary-$ARCH/Packages"
651
	    for m in $MIRRORS; do
652
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
653
		if [ ! -e "$pkgdest" ]; then continue; fi
654
		pkgs_to_get="$(download_debs "$m" "$pkgdest" $pkgs_to_get 5>&1 1>&6)"
655
		if [ -z "$pkgs_to_get" ]; then break; fi
656
	    done 6>&1
657
	    if [ -z "$pkgs_to_get" ]; then break; fi
658
	done
659
	progress $dloaddebs $totaldebs DOWNDEBS "Downloading packages"
660
	if [ "$pkgs_to_get" != "" ]; then
661
		error 1 COULDNTDLPKGS "Couldn't download packages: %s" "$pkgs_to_get"
662
	fi
663
}
664
665
download_main_indices () {
666
	local m1="${MIRRORS%% *}"
667
	local comp="${USE_COMPONENTS}"
668
	progress 0 100 DOWNMAINPKGS "Downloading Packages file"
669
	progress_next 100
670
671
	if [ -z "$comp" ]; then comp=main; fi
672
	COMPONENTS="$(echo $comp | tr '|' ' ')"
673
674
	export COMPONENTS
675
	for m in $MIRRORS; do
676
	    for c in $COMPONENTS; do
677
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
678
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
679
		if [ -x /bin/gunzip ] && get "$m/${path}.gz" "${pkgdest}.gz"; then
680
			rm -f "$pkgdest"
681
			gunzip "$pkgdest.gz"
682
		elif get "$m/$path" "$pkgdest"; then
683
			true
684
		fi
685
	    done
686
	done
687
	progress 100 100 DOWNMAINPKGS "Downloading Packages file"
688
}
689
690
download_main () {
691
	local m1="${MIRRORS%% *}"
692
693
	:>$TARGET/debootstrap/debpaths
694
	for p in "$@"; do
695
	    for c in $COMPONENTS; do
696
		local details=""
697
		for m in $MIRRORS; do
698
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
699
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
700
			if [ ! -e "$pkgdest" ]; then continue; fi
701
			details="$($PKGDETAILS PKGS "$m" "$pkgdest" "$p")"
702
			if [ "$details" = "$p -" ]; then
703
				details=""
704
				continue
705
			fi
706
			size="${details##* }"; details="${details% *}"
707
			md5="${details##* }"; details="${details% *}"
708
			local debdest="$($DLDEST deb $details)"
709
			if get "$m/${details##* }" "$TARGET/$debdest" "$md5" "$size"; then
710
				echo >>$TARGET/debootstrap/debpaths "$p $debdest"
711
				details="done"
712
				break
713
			fi
714
		done
715
		if [ "$details" != "" ]; then
716
			break
717
		fi
718
	    done
719
	    if [ "$details" != "done" ]; then
720
		error 1 COULDNTDL "Couldn't download %s" "$p"
721
	    fi
722
	done
723
}
724
725
###################################################### deb choosing support
726
727
get_debs () {
728
	local field="$1"
729
	shift
730
	local m1 c
731
	for m1 in $MIRRORS; do
732
		for c in $COMPONENTS; do
733
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
734
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
735
			echo $("$PKGDETAILS" FIELD "$field" "$m1" "$pkgdest" "$@" | sed 's/ .*//')
736
		done
737
	done
738
}
739
740
################################################################ extraction
741
742
EXTRACTORS_SUPPORTED="dpkg-deb ar"
743
744
# Native dpkg-deb based extractors
745
extract_dpkg_deb_field () {
746
	local pkg="$1"
747
	local field="$2"
748
749
	dpkg-deb -f "$pkg" "$field"
750
}
751
752
extract_dpkg_deb_data () {
753
	local pkg="$1"
754
755
	dpkg-deb --fsys-tarfile "$pkg" | tar -xf -
756
}
757
758
# Raw .deb extractors
759
extract_ar_deb_field () {
760
	local pkg="$1"
761
	local field="$2"
762
763
	ar -p "$pkg" control.tar.gz | zcat |
764
	    tar -O -xf - control ./control 2>/dev/null |
765
	    grep -i "^$field:" | sed -e 's/[^:]*: *//' | head -n 1
766
}
767
768
extract_ar_deb_data () {
769
	local pkg="$1"
770
	local tarball=$(ar -t "$pkg" | grep "^data.tar.[bgx]z")
771
772
	case "$tarball" in
773
		data.tar.gz) cat_cmd=zcat ;;
774
		data.tar.bz2) cat_cmd=bzcat ;;
775
		data.tar.xz) cat_cmd=xzcat ;;
776
		*) error 1 UNKNOWNDATACOMP "Unknown compression type for %s in %s" "$tarball" "$pkg" ;;
777
	esac
778
779
	if type $cat_cmd >/dev/null 2>&1; then
780
		ar -p "$pkg" "$tarball" | $cat_cmd | tar -xf -
781
	else
782
		error 1 UNPACKCMDUNVL "The $cat_cmd is not available on the system"
783
	fi
784
}
785
786
valid_extractor () {
787
	local extractor="$1"
788
789
	for E in $EXTRACTORS_SUPPORTED; do
790
		if [ "$extractor" = "$E" ]; then
791
			return 0
792
		fi
793
	done
794
795
	return 1
796
}
797
798
choose_extractor () {
799
	local extractor
800
801
	if [ -n "$EXTRACTOR_OVERRIDE" ]; then
802
		extractor="$EXTRACTOR_OVERRIDE"
803
	elif type dpkg-deb >/dev/null 2>&1; then
804
		extractor="dpkg-deb"
805
	else
806
		extractor="ar"
807
	fi
808
809
	info CHOSENEXTRACTOR "Chosen extractor for .deb packages: %s" "$extractor"
810
	case "$extractor" in
811
	dpkg-deb)
812
		extract_deb_field () { extract_dpkg_deb_field "$@"; }
813
		extract_deb_data () { extract_dpkg_deb_data "$@"; }
814
		;;
815
	ar)
816
		extract_deb_field () { extract_ar_deb_field "$@"; }
817
		extract_deb_data () { extract_ar_deb_data "$@"; }
818
		;;
819
	esac
820
}
821
822
extract () { (
823
	cd "$TARGET"
824
	local p=0 cat_cmd
825
	for pkg in $(debfor "$@"); do
826
		p="$(($p + 1))"
827
		progress "$p" "$#" EXTRACTPKGS "Extracting packages"
828
		packagename="$(echo "$pkg" | sed 's,^.*/,,;s,_.*$,,')"
829
		info EXTRACTING "Extracting %s..." "$packagename"
830
		extract_deb_data "./$pkg"
831
	done
832
); }
833
834
in_target_nofail () {
835
	if ! $CHROOT_CMD "$@" 2>/dev/null; then
836
		true
837
	fi
838
	return 0
839
}
840
841
in_target_failmsg () {
842
	local code="$1"
843
	local msg="$2"
844
	local arg="$3"
845
	shift; shift; shift
846
	if ! $CHROOT_CMD "$@"; then
847
		warning "$code" "$msg" "$arg"
848
		return 1
849
	fi
850
	return 0
851
}
852
853
in_target () {
854
	in_target_failmsg IN_TARGET_FAIL "Failure trying to run: %s" "$CHROOT_CMD $*" "$@"
855
}
856
857
###################################################### standard setup stuff
858
859
conditional_cp () {
860
	if [ ! -e "$2/$1" ]; then
861
		if [ -L "$1" ] && [ -e "$1" ]; then
862
			cat "$1" >"$2/$1"
863
		elif [ -e "$1" ]; then
864
			cp -a "$1" "$2/$1"
865
		fi
866
	fi
867
}
868
869
mv_invalid_to () {
870
	local m="$1"
871
	m="$(echo "${m#http://}" | tr '/' '_' | sed 's/_*//')"
872
	(cd "$TARGET/$APTSTATE/lists"
873
	 for a in debootstrap.invalid_*; do
874
		 mv "$a" "${m}_${a#*_}"
875
	 done
876
	)
877
}
878
879
setup_apt_sources () {
880
	mkdir -p "$TARGET/etc/apt"
881
	for m in "$@"; do
882
		local cs=""
883
		for c in $COMPONENTS; do
884
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
885
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
886
			if [ -e "$pkgdest" ]; then cs="$cs $c"; fi
887
		done
888
		if [ "$cs" != "" ]; then echo "deb $m $SUITE$cs"; fi
889
	done > "$TARGET/etc/apt/sources.list"
890
}
891
892
setup_etc () {
893
	mkdir -p "$TARGET/etc"
894
895
	conditional_cp /etc/resolv.conf "$TARGET"
896
	conditional_cp /etc/hostname "$TARGET"
897
898
	if [ "$DLDEST" = apt_dest ] && [ ! -e "$TARGET/etc/apt/sources.list" ]; then
899
		setup_apt_sources "http://debootstrap.invalid/"
900
	fi
901
}
902
903
UMOUNT_DIRS=
904
905
umount_exit_function () {
906
	for dir in $UMOUNT_DIRS; do
907
		umount "$TARGET/${dir#/}" || true
908
	done
909
}
910
911
umount_on_exit () {
912
	if [ "$UMOUNT_DIRS" ]; then
913
		UMOUNT_DIRS="$UMOUNT_DIRS $1"
914
	else
915
		UMOUNT_DIRS="$1"
916
		on_exit umount_exit_function
917
	fi
918
}
919
920
clear_mtab () {
921
	if [ -f "$TARGET/etc/mtab" ] && [ ! -h "$TARGET/etc/mtab" ]; then
922
		rm -f "$TARGET/etc/mtab"
923
	fi
924
}
925
926
setup_proc () {
927
	case "$ARCH" in
928
	    kfreebsd-*)
929
		umount_on_exit /dev
930
		umount_on_exit /proc
931
		umount "$TARGET/proc" 2>/dev/null || true
932
		in_target mount -t linprocfs proc /proc
933
		;;
934
	    hurd-*)
935
		;;
936
	    *)
937
		umount_on_exit /dev/pts
938
		umount_on_exit /dev/shm
939
		umount_on_exit /proc/bus/usb
940
		umount_on_exit /proc
941
		umount "$TARGET/proc" 2>/dev/null || true
942
		in_target mount -t proc proc /proc
943
		if [ -d "$TARGET/sys" ] && \
944
		   grep -q '[[:space:]]sysfs' /proc/filesystems 2>/dev/null; then
945
			umount_on_exit /sys
946
			umount "$TARGET/sys" 2>/dev/null || true
947
			in_target mount -t sysfs sysfs /sys
948
		fi
949
		on_exit clear_mtab
950
		;;
951
	esac
952
	umount_on_exit /lib/init/rw
953
}
954
955
setup_proc_fakechroot () {
956
	rm -rf "$TARGET/proc"
957
	ln -s /proc "$TARGET"
958
}
959
960
setup_devices () {
961
	case "$ARCH" in
962
	    kfreebsd-*)
963
		in_target mount -t devfs devfs /dev ;;
964
	    hurd-*)
965
		setup_devices_hurd ;;
966
	    *)
967
		if [ -e "$DEVICES_TARGZ" ]; then
968
			zcat "$DEVICES_TARGZ" | (cd "$TARGET"; tar -xf -)
969
		else
970
			if [ -e /dev/.devfsd ] ; then
971
				in_target mount -t devfs devfs /dev
972
			else
973
				error 1 NODEVTGZ "no %s. cannot create devices" "$DEVICES_TARGZ"
974
			fi
975
		fi
976
		;;
977
	esac
978
}
979
980
setup_devices_hurd () {
981
	mkdir -p "$TARGET/servers/socket"
982
	/bin/settrans -cfk "$TARGET/servers/socket/1" /hurd/pflocal
983
	/bin/settrans -cf "$TARGET/servers/socket/2" /hurd/pfinet
984
	/bin/settrans -cfk "$TARGET/servers/exec" /hurd/exec
985
	/bin/settrans -cf "$TARGET/servers/crash-suspend" /hurd/crash --suspend
986
	/bin/settrans -cf "$TARGET/servers/crash-kill" /hurd/crash --kill
987
	/bin/settrans -cf "$TARGET/servers/crash-dump-core" /hurd/crash --dump-core
988
	/bin/settrans -cf "$TARGET/servers/password" /hurd/password
989
	/bin/settrans -cf "$TARGET/servers/default-pager" /hurd/proxy-defpager
990
	ln -fs crash-kill "$TARGET/servers/crash"
991
	ln -fs 1 "$TARGET/servers/socket/local"
992
	ln -fs 2 "$TARGET/servers/socket/inet"
993
	(cd "$TARGET/dev"; /sbin/MAKEDEV fd std ptyp ptyq vcs tty1 tty2 tty3 tty4 tty5 tty6)
994
}
995
996
setup_devices_fakechroot () {
997
	rm -rf "$TARGET/dev"
998
	ln -s /dev "$TARGET"
999
}
1000
1001
setup_dselect_method () {
1002
	case "$1" in
1003
	    apt)
1004
		mkdir -p "$TARGET/var/lib/dpkg"
1005
		echo "apt apt" > "$TARGET/var/lib/dpkg/cmethopt"
1006
		chmod 644 "$TARGET/var/lib/dpkg/cmethopt"
1007
		;;
1008
	    *)
1009
		error 1 UNKNOWNDSELECT "unknown dselect method"
1010
		;;
1011
	esac
1012
}
1013
1014
################################################################ pkgdetails
1015
1016
# NOTE
1017
# For the debootstrap udeb, pkgdetails is provided by the bootstrap-base
1018
# udeb, so the pkgdetails API needs to be kept in sync with that.
1019
1020
if [ -x /usr/bin/perl ]; then
1021
	PKGDETAILS=pkgdetails_perl
1022
1023
	pkgdetails_field () {
1024
		# uniq field mirror Packages values...
1025
		perl -le '
1026
$unique = shift @ARGV; $field = lc(shift @ARGV); $mirror = shift @ARGV;
1027
$cnt = length(@ARGV);
1028
%fields = map { $_, 0 } @ARGV;
1029
while (<STDIN>) {
1030
	chomp;
1031
	next if (/^ /);
1032
	if (/^([^:]*:)\s*(.*)$/) {
1033
		$f = lc($1); $v = $2;
1034
		$pkg = $v if ($f eq "package:");
1035
		$ver = $v if ($f eq "version:");
1036
		$arc = $v if ($f eq "architecture:");
1037
		$fil = $v if ($f eq "filename:");
1038
		$md5 = $v if ($f eq "md5sum:");
1039
		$siz = $v if ($f eq "size:");
1040
		$val = $v if ($f eq $field);
1041
	} elsif (/^$/) {
1042
		if (defined $val && defined $fields{$val}) {
1043
			$cnt++;
1044
			printf "%s %s %s %s %s %s %s\n",
1045
			 $pkg, $ver, $arc, $mirror, $fil, $md5, $siz;
1046
			if ($unique) {
1047
				delete $fields{$val};
1048
				last if (--$cnt <= 0);
1049
			}
1050
		}
1051
		undef $val;
1052
	}
1053
}
1054
for $v (keys %fields) {
1055
	printf ("%s -\n", $v) if ($unique);
1056
}
1057
' "$@"
1058
	}
1059
1060
	pkgdetails_perl () {
1061
		if [ "$1" = "WGET%" ]; then
1062
			shift;
1063
			perl -e '
1064
$v = 0;
1065
while (read STDIN, $x, 1) {
1066
	if ($x =~ m/\d/) {
1067
		$v *= 10;
1068
		$v += $x;
1069
	} elsif ($x eq "%") {
1070
		printf "P: %d %d%s\n", int($v / 100.0 * ($ARGV[1] - $ARGV[0]) + $ARGV[0]), $ARGV[2], ($#ARGV == 3 ? " $ARGV[3]" : "");
1071
		$v = 0;
1072
	} else {
1073
		$v = 0;
1074
	}
1075
}' "$@"
1076
		elif [ "$1" = "GETDEPS" ]; then
1077
			local pkgdest="$2"; shift; shift
1078
			perl -e '
1079
while (<STDIN>) {
1080
	chomp;
1081
	$in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
1082
	$in = 0 if (/^$/);
1083
	if ($in and (/^Depends: (.*)$/ or /^Pre-Depends: (.*)$/)) {
1084
		for $d (split /\s*,\s*/, $1) {
1085
			$d =~ s/\s*[|].*$//;
1086
			$d =~ s/\s*[(].*[)]\s*//;
1087
			print "$d\n";
1088
		}
1089
	}
1090
}' <"$pkgdest" "$@" | sort | uniq
1091
		elif [ "$1" = "PKGS" ]; then
1092
			local m="$2"
1093
			local p="$3"
1094
			shift; shift; shift
1095
			pkgdetails_field 1 Package: "$m" "$@" < "$p"
1096
		elif [ "$1" = "FIELD" ]; then
1097
			local f="$2"
1098
			local m="$3"
1099
			local p="$4"
1100
			shift; shift; shift; shift
1101
			pkgdetails_field 0 "$f" "$m" "$@" < "$p"
1102
		elif [ "$1" = "STANZAS" ]; then
1103
			local pkgdest="$2"; shift; shift
1104
			perl -e '
1105
my $accum = "";
1106
while (<STDIN>) {
1107
	$accum .= $_;
1108
	$in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
1109
	if ($in and /^$/) {
1110
		print $accum;
1111
		if (substr($accum, -1) != "\n") {
1112
			print "\n\n";
1113
		} elsif (substr($accum, -2, 1) != "\n") {
1114
			print "\n";
1115
		}
1116
		$in = 0;
1117
	}
1118
	$accum = "" if /^$/;
1119
}' <"$pkgdest" "$@"
1120
		fi
1121
	}
1122
elif [ -e "/usr/lib/debootstrap/pkgdetails" ]; then
1123
	PKGDETAILS="/usr/lib/debootstrap/pkgdetails"
1124
elif [ -e "$DEBOOTSTRAP_DIR/pkgdetails" ]; then
1125
	PKGDETAILS="$DEBOOTSTRAP_DIR/pkgdetails"
1126
else
1127
	PKGDETAILS=""
1128
fi
1129
1130
##################################################### dependency resolution
1131
1132
resolve_deps () {
1133
	local m1="${MIRRORS%% *}"
1134
1135
	# XXX: I can't think how to deal well with dependency resolution and
1136
	#      lots of Packages files. -- aj 2005/06/12
1137
1138
	c="${COMPONENTS%% *}"
1139
	local path="dists/$SUITE/$c/binary-$ARCH/Packages"
1140
	local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
1141
1142
	local PKGS="$*"
1143
	local ALLPKGS="$PKGS";
1144
	local ALLPKGS2="";
1145
	while [ "$PKGS" != "" ]; do
1146
		PKGS=$("$PKGDETAILS" GETDEPS "$pkgdest" $PKGS)
1147
		PKGS=$("$PKGDETAILS" PKGS REAL "$pkgdest" $PKGS | sed -n 's/ .*REAL.*$//p')
1148
		ALLPKGS2=$(echo "$PKGS $ALLPKGS" | tr ' ' '\n' | sort | uniq)
1149
		PKGS=$(without "$ALLPKGS2" "$ALLPKGS")
1150
		ALLPKGS="$ALLPKGS2"
1151
	done
1152
	echo $ALLPKGS
1153
}
1154
1155
setup_available () {
1156
	local m1="${MIRRORS%% *}"
1157
1158
	for c in $COMPONENTS; do
1159
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
1160
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
1161
		# XXX: What if a package is in more than one component?
1162
		# -- cjwatson 2009-07-29
1163
		"$PKGDETAILS" STANZAS "$pkgdest" "$@"
1164
	done >"$TARGET/var/lib/dpkg/available"
1165
1166
	for pkg; do
1167
		echo "$pkg install"
1168
	done | in_target dpkg --set-selections
1169
}
1170
1171
get_next_predep () {
1172
	local stanza="$(in_target_nofail dpkg --predep-package)"
1173
	[ "$stanza" ] || return 1
1174
	echo "$stanza" | grep '^Package:' | sed 's/^Package://; s/^ *//'
1175
}
1176
1177
################################################################### helpers
1178
1179
# Return zero if it is possible to create devices and execute programs in
1180
# this directory. (Both may be forbidden by mount options, e.g. nodev and
1181
# noexec respectively.)
1182
check_sane_mount () {
1183
	mkdir -p "$1"
1184
1185
	case "$ARCH" in
1186
	    kfreebsd-*|hurd-*)
1187
		;;
1188
	    *)
1189
		mknod "$1/test-dev-null" c 1 3 || return 1
1190
		if ! echo test > "$1/test-dev-null"; then
1191
			rm -f "$1/test-dev-null"
1192
			return 1
1193
		fi
1194
		rm -f "$1/test-dev-null"
1195
		;;
1196
	esac
1197
1198
	cat > "$1/test-exec" <<EOF
1199
#! /bin/sh
1200
:
1201
EOF
1202
	chmod +x "$1/test-exec"
1203
	if ! "$1/test-exec"; then
1204
		rm -f "$1/test-exec"
1205
		return 1
1206
	fi
1207
	rm -f "$1/test-exec"
1208
1209
	return 0
1210
}
1211
1212
read_gpg_status () {
1213
	badsig=
1214
	unkkey=
1215
	validsig=
1216
	while read prefix keyword keyid rest; do
1217
		[ "$prefix" = '[GNUPG:]' ] || continue
1218
		case $keyword in
1219
		    BADSIG)	badsig="$keyid" ;;
1220
		    NO_PUBKEY)	unkkey="$keyid" ;;
1221
		    VALIDSIG)	validsig="$keyid" ;;
1222
		esac
1223
	done
1224
	if [ "$validsig" ]; then
1225
		info VALIDRELSIG "Valid Release signature (key id %s)" "$validsig"
1226
	elif [ "$badsig" ]; then
1227
		error 1 BADRELSIG "Invalid Release signature (key id %s)" "$badsig"
1228
	elif [ "$unkkey" ]; then
1229
		error 1 UNKNOWNRELSIG "Release signed by unknown key (key id %s)" "$unkkey"
1230
	else
1231
		error 1 SIGCHECK "Error executing gpgv to check Release signature"
1232
	fi
1233
}
1234
1235
without () {
1236
	# usage:  without "a b c" "a d" -> "b" "c"
1237
	(echo $1 | tr ' ' '\n' | sort | uniq;
1238
	 echo $2 $2 | tr ' ' '\n') | sort | uniq -u | tr '\n' ' '
1239
	echo
1240
}
1241
1242
# Formerly called 'repeat', but that's a reserved word in zsh.
1243
repeatn () {
1244
	local n="$1"
1245
	shift
1246
	while [ "$n" -gt 0 ]; do
1247
		if "$@"; then
1248
			break
1249
		else
1250
			n="$(( $n - 1 ))"
1251
			sleep 1
1252
		fi
1253
	done
1254
	if [ "$n" -eq 0 ]; then return 1; fi
1255
	return 0
1256
}
1257
1258
N_EXIT_THINGS=0
1259
exit_function () {
1260
	local n=0
1261
	while [ "$n" -lt "$N_EXIT_THINGS" ]; do
1262
		(eval $(eval echo \${EXIT_THING_$n}) 2>/dev/null || true)
1263
		n="$(( $n + 1 ))"
1264
	done
1265
	N_EXIT_THINGS=0
1266
}
1267
1268
trap "exit_function" 0
1269
trap "exit 129" 1
1270
trap "error 130 INTERRUPTED \"Interrupt caught ... exiting\"" 2
1271
trap "exit 131" 3
1272
trap "exit 143" 15
1273
1274
on_exit () {
1275
	eval `echo EXIT_THING_${N_EXIT_THINGS}=\"$1\"`
1276
	N_EXIT_THINGS="$(( $N_EXIT_THINGS + 1 ))"
1277
}
1278
1279
############################################################## fakechroot tools
1280
1281
install_fakechroot_tools () {
1282
	mv "$TARGET/sbin/ldconfig" "$TARGET/sbin/ldconfig.REAL"
1283
	echo \
1284
"#!/bin/sh
1285
echo
1286
echo \"Warning: Fake ldconfig called, doing nothing\"" > "$TARGET/sbin/ldconfig"
1287
	chmod 755 "$TARGET/sbin/ldconfig"
1288
1289
	echo \
1290
"/sbin/ldconfig
1291
/sbin/ldconfig.REAL
1292
fakechroot" >> "$TARGET/var/lib/dpkg/diversions"
1293
1294
	mv "$TARGET/usr/bin/ldd" "$TARGET/usr/bin/ldd.REAL"
1295
	cat << 'END' > "$TARGET/usr/bin/ldd"
1296
#!/usr/bin/perl
1297
1298
# fakeldd
1299
#
1300
# Replacement for ldd with usage of objdump
1301
#
1302
# (c) 2003-2005 Piotr Roszatycki <dexter@debian.org>, BSD
1303
1304
1305
my %libs = ();
1306
1307
my $status = 0;
1308
my $dynamic = 0;
1309
my $biarch = 0;
1310
1311
my $ldlinuxsodir = "/lib";
1312
my @ld_library_path = qw(/usr/lib /lib);
1313
1314
1315
sub ldso($) {
1316
	my ($lib) = @_;
1317
	my @files = ();
1318
1319
	if ($lib =~ /^\//) {
1320
	    $libs{$lib} = $lib;
1321
	    push @files, $lib;
1322
	} else {
1323
	    foreach my $ld_path (@ld_library_path) {
1324
		next unless -f "$ld_path/$lib";
1325
		my $badformat = 0;
1326
		open OBJDUMP, "objdump -p $ld_path/$lib 2>/dev/null |";
1327
	 	while (my $line = <OBJDUMP>) {
1328
		    if ($line =~ /file format (\S*)$/) {
1329
				$badformat = 1 unless $format eq $1;
1330
				last;
1331
		    }
1332
		}
1333
		close OBJDUMP;
1334
		next if $badformat;
1335
		$libs{$lib} = "$ld_path/$lib";
1336
		push @files, "$ld_path/$lib";
1337
	    }
1338
	    objdump(@files);
1339
	}
1340
}
1341
1342
1343
sub objdump(@) {
1344
	my (@files) = @_;
1345
	my @libs = ();
1346
1347
	foreach my $file (@files) {
1348
	    open OBJDUMP, "objdump -p $file 2>/dev/null |";
1349
	    while (my $line = <OBJDUMP>) {
1350
		$line =~ s/^\s+//;
1351
		my @f = split (/\s+/, $line);
1352
		if ($line =~ /file format (\S*)$/) {
1353
		    if (not $format) {
1354
			$format = $1;
1355
			if ($unamearch eq "x86_64" and $format eq "elf32-i386") {
1356
			    my $link = readlink "/lib/ld-linux.so.2";
1357
			    if ($link =~ /^\/emul\/ia32-linux\//) {
1358
				$ld_library_path[-2] = "/emul/ia32-linux/usr/lib";
1359
				$ld_library_path[-1] = "/emul/ia32-linux/lib";
1360
			    }
1361
			} elsif ($unamearch =~ /^(sparc|sparc64)$/ and $format eq "elf64-sparc") {
1362
			    $ldlinuxsodir = "/lib64";
1363
			    $ld_library_path[-2] = "/usr/lib64";
1364
			    $ld_library_path[-1] = "/lib64";
1365
			}
1366
		    } else {
1367
			next unless $format eq $1;
1368
		    }
1369
		}
1370
		if (not $dynamic and $f[0] eq "Dynamic") {
1371
		    $dynamic = 1;
1372
		}
1373
		next unless $f[0] eq "NEEDED";
1374
		if ($f[1] =~ /^ld-linux(\.|-)/) {
1375
		    $f[1] = "$ldlinuxsodir/" . $f[1];
1376
		}
1377
		if (not defined $libs{$f[1]}) {
1378
		    $libs{$f[1]} = undef;
1379
		    push @libs, $f[1];
1380
		}
1381
	    }
1382
	    close OBJDUMP;
1383
	}
1384
1385
	foreach my $lib (@libs) {
1386
	    ldso($lib);
1387
	}
1388
}
1389
1390
1391
if ($#ARGV < 0) {
1392
	print STDERR "fakeldd: missing file arguments\n";
1393
	exit 1;
1394
}
1395
1396
while ($ARGV[0] =~ /^-/) {
1397
	my $arg = $ARGV[0];
1398
	shift @ARGV;
1399
	last if $arg eq "--";
1400
}
1401
1402
open LD_SO_CONF, "/etc/ld.so.conf";
1403
while ($line = <LD_SO_CONF>) {
1404
	chomp $line;
1405
	unshift @ld_library_path, $line;
1406
}
1407
close LD_SO_CONF;
1408
1409
unshift @ld_library_path, split(/:/, $ENV{LD_LIBRARY_PATH});
1410
1411
$unamearch = `/bin/uname -m`;
1412
chomp $unamearch;
1413
1414
foreach my $file (@ARGV) {
1415
	my $address;
1416
	%libs = ();
1417
	$dynamic = 0;
1418
1419
	if ($#ARGV > 0) {
1420
		print "$file:\n";
1421
	}
1422
1423
	if (not -f $file) {
1424
		print STDERR "ldd: $file: No such file or directory\n";
1425
		$status = 1;
1426
		next;
1427
	}
1428
1429
	objdump($file);
1430
1431
	if ($dynamic == 0) {
1432
		print "\tnot a dynamic executable\n";
1433
		$status = 1;
1434
	} elsif (scalar %libs eq "0") {
1435
		print "\tstatically linked\n";
1436
	}
1437
1438
	if ($format =~ /^elf64-/) {
1439
		$address = "0x0000000000000000";
1440
	} else {
1441
		$address = "0x00000000";
1442
	}
1443
1444
	foreach $lib (keys %libs) {
1445
		if ($libs{$lib}) {
1446
			printf "\t%s => %s (%s)\n", $lib, $libs{$lib}, $address;
1447
		} else {
1448
			printf "\t%s => not found\n", $lib;
1449
		}
1450
	}
1451
}
1452
1453
exit $status;
1454
END
1455
	chmod 755 "$TARGET/usr/bin/ldd"
1456
1457
	echo \
1458
"/usr/bin/ldd
1459
/usr/bin/ldd.REAL
1460
fakechroot" >> "$TARGET/var/lib/dpkg/diversions"
1461
1462
}
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/usr/share/debootstrap-ucs3/scripts/ucs3 (-195 lines)
 Lines 1-195    Link Here 
1
. /usr/share/debootstrap/functions-ucs3
2
3
mirror_style main
4
download_style apt
5
finddebs_style from-indices
6
variants - buildd fakechroot minbase scratchbox
7
8
if doing_variant fakechroot; then
9
	test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started"
10
fi
11
12
case $ARCH in
13
	alpha|ia64) LIBC="libc6.1" ;;
14
	kfreebsd-*) LIBC="libc0.1" ;;
15
	hurd-*)     LIBC="libc0.3" ;;
16
	*)          LIBC="libc6" ;;
17
esac
18
19
work_out_debs () {
20
	required="$(get_debs Priority: required)"
21
22
	if doing_variant - || doing_variant fakechroot; then
23
		#required="$required $(get_debs Priority: important)"
24
		#  ^^ should be getting debconf here somehow maybe
25
		base="$(get_debs Priority: important)"
26
	elif doing_variant buildd || doing_variant scratchbox; then
27
		base="apt $(get_debs Build-Essential: yes)"
28
	elif doing_variant minbase; then
29
		base="apt"
30
	fi
31
32
	if doing_variant fakechroot; then
33
		# ldd.fake needs binutils
34
		required="$required binutils"
35
	fi
36
}
37
38
first_stage_install () {
39
	extract $required
40
41
	mkdir -p "$TARGET/var/lib/dpkg"
42
	: >"$TARGET/var/lib/dpkg/status"
43
	: >"$TARGET/var/lib/dpkg/available"
44
45
	setup_etc
46
	if [ ! -e "$TARGET/etc/fstab" ]; then
47
		echo '# UNCONFIGURED FSTAB FOR BASE SYSTEM' > "$TARGET/etc/fstab"
48
		chown 0:0 "$TARGET/etc/fstab"; chmod 644 "$TARGET/etc/fstab"
49
	fi
50
51
	if doing_variant fakechroot; then
52
		setup_devices_fakechroot
53
	else
54
		setup_devices
55
	fi
56
57
	x_feign_install () {
58
		local pkg="$1"
59
		local deb="$(debfor $pkg)"
60
		local ver="$(extract_deb_field "$TARGET/$deb" Version)"
61
62
		mkdir -p "$TARGET/var/lib/dpkg/info"
63
64
		echo \
65
"Package: $pkg
66
Version: $ver
67
Status: install ok installed" >> "$TARGET/var/lib/dpkg/status"
68
69
		touch "$TARGET/var/lib/dpkg/info/${pkg}.list"
70
	}
71
72
	x_feign_install dpkg
73
}
74
75
second_stage_install () {
76
	x_core_install () {
77
		smallyes '' | in_target dpkg --force-depends --install $(debfor "$@")
78
	}
79
80
	p () {
81
		baseprog="$(($baseprog + ${1:-1}))"
82
	}
83
84
	if doing_variant fakechroot; then
85
		setup_proc_fakechroot
86
	elif doing_variant scratchbox; then
87
		true
88
	else
89
		setup_proc
90
		in_target /sbin/ldconfig
91
	fi
92
93
	DEBIAN_FRONTEND=noninteractive
94
	DEBCONF_NONINTERACTIVE_SEEN=true
95
	export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
96
97
	baseprog=0
98
	bases=7
99
100
	p; progress $baseprog $bases INSTCORE "Installing core packages" #1
101
	info INSTCORE "Installing core packages..."
102
103
	p; progress $baseprog $bases INSTCORE "Installing core packages" #2
104
	ln -sf mawk "$TARGET/usr/bin/awk"
105
	x_core_install base-files base-passwd
106
	p; progress $baseprog $bases INSTCORE "Installing core packages" #3
107
	x_core_install dpkg
108
109
	if [ ! -e "$TARGET/etc/localtime" ]; then
110
		ln -sf /usr/share/zoneinfo/UTC "$TARGET/etc/localtime"
111
	fi
112
113
	if doing_variant fakechroot; then
114
		install_fakechroot_tools
115
	fi
116
117
	p; progress $baseprog $bases INSTCORE "Installing core packages" #4
118
	x_core_install $LIBC
119
120
	p; progress $baseprog $bases INSTCORE "Installing core packages" #5
121
	x_core_install perl-base
122
123
	p; progress $baseprog $bases INSTCORE "Installing core packages" #6
124
	rm "$TARGET/usr/bin/awk"
125
	x_core_install mawk
126
127
	p; progress $baseprog $bases INSTCORE "Installing core packages" #7
128
	if doing_variant -; then
129
		x_core_install debconf
130
	fi
131
132
	baseprog=0
133
	bases=$(set -- $required; echo $#)
134
135
	info UNPACKREQ "Unpacking required packages..."
136
137
	exec 7>&1
138
139
	smallyes '' |
140
		(repeatn 5 in_target_failmsg UNPACK_REQ_FAIL_FIVE "Failure while unpacking required packages.  This will be attempted up to five times." "" \
141
		dpkg --status-fd 8 --force-depends --unpack $(debfor $required) 8>&1 1>&7 || echo EXITCODE $?) |
142
		dpkg_progress $baseprog $bases UNPACKREQ "Unpacking required packages" UNPACKING
143
144
	info CONFREQ "Configuring required packages..."
145
146
	mv "$TARGET/sbin/start-stop-daemon" "$TARGET/sbin/start-stop-daemon.REAL"
147
	echo \
148
"#!/bin/sh
149
echo
150
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/start-stop-daemon"
151
	chmod 755 "$TARGET/sbin/start-stop-daemon"
152
153
	setup_dselect_method apt
154
155
	smallyes '' |
156
		(in_target_failmsg CONF_REQ_FAIL "Failure while configuring required packages." "" \
157
		dpkg --status-fd 8 --configure --pending --force-configure-any --force-depends 8>&1 1>&7 || echo EXITCODE $?) |
158
		dpkg_progress $baseprog $bases CONFREQ "Configuring required packages" CONFIGURING
159
160
	baseprog=0
161
	bases="$(set -- $base; echo $#)"
162
163
	info UNPACKBASE "Unpacking the base system..."
164
165
	setup_available $required $base
166
	done_predeps=
167
	while predep=$(get_next_predep); do
168
		# We have to resolve dependencies of pre-dependencies manually because
169
		# dpkg --predep-package doesn't handle this.
170
		predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
171
		# XXX: progress is tricky due to how dpkg_progress works
172
		# -- cjwatson 2009-07-29
173
		p; smallyes '' |
174
		in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
175
		base=$(without "$base" "$predep")
176
		done_predeps="$done_predeps $predep"
177
	done
178
179
	smallyes '' |
180
		(repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages.  This will be re-attempted up to five times." "" \
181
		dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 || echo EXITCODE $?) |
182
		dpkg_progress $baseprog $bases UNPACKBASE "Unpacking base system" UNPACKING
183
184
	info CONFBASE "Configuring the base system..."
185
186
	smallyes '' |
187
		(repeatn 5 in_target_failmsg CONF_BASE_FAIL_FIVE "Failure while configuring base packages.  This will be re-attempted up to five times." "" \
188
		dpkg --status-fd 8 --force-confold --skip-same-version --configure -a 8>&1 1>&7 || echo EXITCODE $?) |
189
		dpkg_progress $baseprog $bases CONFBASE "Configuring base system" CONFIGURING
190
191
	mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon"
192
193
	progress $bases $bases CONFBASE "Configuring base system"
194
	info BASESUCCESS "Base system installed successfully."
195
}
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/usr/share/debootstrap/functions-ucs3 (-1462 lines)
 Lines 1-1462    Link Here 
1
############################################################### smallutils
2
3
smallyes() {
4
	YES="${1-y}"
5
	while echo "$YES" 2>/dev/null ; do : ; done
6
}
7
8
############################################################### interaction
9
10
error () {
11
	# <error code> <name> <string> <args>
12
	local err="$1"
13
	local name="$2"
14
	local fmt="$3"
15
	shift; shift; shift
16
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
17
		(echo "E: $name"
18
		for x in "$@"; do echo "EA: $x"; done
19
		echo "EF: $fmt") >&4
20
	else
21
		(printf "E: $fmt\n" "$@") >&4
22
	fi
23
	exit $err
24
}
25
26
warning () {
27
	# <name> <string> <args>
28
	local name="$1"
29
	local fmt="$2"
30
	shift; shift
31
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
32
		(echo "W: $name"
33
		for x in "$@"; do echo "WA: $x"; done
34
		echo "WF: $fmt") >&4
35
	else
36
		printf "W: $fmt\n" "$@" >&4
37
	fi
38
}
39
40
info () {
41
	# <name> <string> <args>
42
	local name="$1"
43
	local fmt="$2"
44
	shift; shift
45
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
46
		(echo "I: $name"
47
		for x in "$@"; do echo "IA: $x"; done
48
		echo "IF: $fmt") >&4
49
	else
50
		printf "I: $fmt\n" "$@" >&4
51
	fi
52
}
53
54
PROGRESS_NOW=0
55
PROGRESS_END=0
56
PROGRESS_NEXT=""
57
PROGRESS_WHAT=""
58
59
progress_next () {
60
	PROGRESS_NEXT="$1"
61
}
62
63
wgetprogress () {
64
	[ ! "$verbose" ] && QSWITCH="-q"
65
	local ret=0
66
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ] && [ "$PROGRESS_NEXT" ]; then
67
		wget "$@" 2>&1 >/dev/null | $PKGDETAILS "WGET%" $PROGRESS_NOW $PROGRESS_NEXT $PROGRESS_END >&3
68
		ret=$?
69
	elif [ "$USE_BOOTFLOPPIES_INTERACTION" ] && [ "$PROGRESS_NEXT" ]; then
70
		wget "$@" 2>&1 >/dev/null | $PKGDETAILS "WGET%" $PROGRESS_NOW $PROGRESS_NEXT $PROGRESS_END "$PROGRESS_WHAT" >&3
71
		ret=$?
72
	else
73
		wget $QSWITCH "$@" 
74
		ret=$?
75
	fi
76
	return $ret
77
}
78
79
progress () {
80
	# <now> <end> <name> <string> <args>
81
	local now="$1"
82
	local end="$2"
83
	local name="$3"
84
	local fmt="$4"
85
	shift; shift; shift; shift
86
	if [ "$USE_DEBIANINSTALLER_INTERACTION" ]; then
87
		PROGRESS_NOW="$now"
88
		PROGRESS_END="$end"
89
		PROGRESS_NEXT=""
90
		(echo "P: $now $end $name"
91
		for x in "$@"; do echo "PA: $x"; done
92
		echo "PF: $fmt") >&3
93
	elif [ "$USE_BOOTFLOPPIES_INTERACTION" ]; then
94
		PROGRESS_NOW="$now"
95
		PROGRESS_END="$end"
96
		PROGRESS_WHAT="`printf "$fmt" "$@"`"
97
		PROGRESS_NEXT=""
98
		printf "P: %s %s %s\n" $now $end "$PROGRESS_WHAT" >&3
99
	fi
100
}
101
102
dpkg_progress () {
103
	# <now> <end> <name> <desc> UNPACKING|CONFIGURING
104
	local now="$1"
105
	local end="$2"
106
	local name="$3"
107
	local desc="$4"
108
	local action="$5"
109
	local expect=
110
111
	if [ "$action" = UNPACKING ]; then
112
		expect=half-installed
113
	elif [ "$action" = CONFIGURING ]; then
114
		expect=half-configured
115
	fi
116
117
	dp () {
118
		now="$(($now + ${1:-1}))"
119
	}
120
121
	exitcode=0
122
	while read status pkg qstate; do
123
		if [ "$status" = "EXITCODE" ]; then
124
			exitcode="$pkg"
125
			continue
126
		fi
127
		[ "$qstate" = "$expect" ] || continue
128
		case $qstate in
129
		    half-installed)
130
			dp; progress "$now" "$end" "$name" "$desc"
131
			info "$action" "Unpacking %s..." "${pkg%:}"
132
			expect=unpacked
133
			;;
134
		    unpacked)
135
			expect=half-installed
136
			;;
137
		    half-configured)
138
			dp; progress "$now" "$end" "$name" "$desc"
139
			info "$action" "Configuring %s..." "${pkg%:}"
140
			expect=installed
141
			;;
142
		    installed)
143
			expect=half-configured
144
			;;
145
		esac
146
	done
147
	return $exitcode
148
}
149
150
############################################################# set variables
151
152
default_mirror () {
153
	DEF_MIRROR="$1"
154
}
155
156
FINDDEBS_NEEDS_INDICES=false
157
finddebs_style () {
158
	case "$1" in
159
	    hardcoded)
160
		;;
161
	    from-indices)
162
		FINDDEBS_NEEDS_INDICES=true
163
		;;
164
	    *)
165
		error 1 BADFINDDEBS "unknown finddebs style"
166
		;;
167
	 esac
168
}
169
170
mk_download_dirs () {
171
	if [ $DLDEST = "apt_dest" ]; then
172
		mkdir -p "$TARGET/$APTSTATE/lists/partial"
173
		mkdir -p "$TARGET/var/cache/apt/archives/partial"
174
	fi
175
}
176
177
download_style () {
178
	case "$1" in
179
	    apt)
180
		if [ "$2" = "var-state" ]; then
181
			APTSTATE=var/state/apt
182
		else
183
			APTSTATE=var/lib/apt
184
		fi
185
		DLDEST=apt_dest
186
		export APTSTATE DLDEST DEBFOR
187
		;;
188
	    *)
189
		error 1 BADDLOAD "unknown download style"
190
		;;
191
	esac
192
}
193
194
########################################################## variant handling
195
196
doing_variant () {
197
	if [ "$1" = "$VARIANT" ]; then return 0; fi
198
	if [ "$1" = "-" ] && [ "$VARIANT" = "" ]; then return 0; fi
199
	return 1
200
}
201
202
SUPPORTED_VARIANTS="-"
203
variants () {
204
	SUPPORTED_VARIANTS="$*"
205
	for v in $*; do
206
		if doing_variant "$v"; then return 0; fi
207
	done
208
	error 1 UNSUPPVARIANT "unsupported variant"
209
}
210
211
################################################# work out names for things
212
213
mirror_style () {
214
	case "$1" in
215
	    release)
216
		DOWNLOAD_INDICES=download_release_indices
217
		DOWNLOAD_DEBS=download_release
218
		;;
219
	    main)
220
		DOWNLOAD_INDICES=download_main_indices
221
		DOWNLOAD_DEBS=download_main
222
		;;
223
	    *)
224
		error 1 BADMIRROR "unknown mirror style"
225
		;;
226
	esac
227
	export DOWNLOAD_INDICES
228
	export DOWNLOAD_DEBS
229
}
230
231
check_md5 () {
232
	# args: dest md5 size
233
	local expmd5="$2"
234
	local expsize="$3"
235
	relmd5=`md5sum < "$1" | sed 's/ .*$//'`
236
	relsize=`wc -c < "$1"`
237
	if [ "$expsize" -ne "$relsize" ] || [ "$expmd5" != "$relmd5" ]; then
238
		return 1
239
	fi
240
	return 0
241
}
242
243
get () {
244
	# args: from dest 'nocache'
245
	# args: from dest [md5sum size] [alt {md5sum size type}]
246
	local displayname
247
	if [ "${2%.deb}" != "$2" ]; then
248
		displayname="$(echo "$2" | sed 's,^.*/,,;s,_.*$,,')"
249
	else
250
		displayname="$(echo "$1" | sed 's,^.*/,,')"
251
	fi
252
253
	if [ -e "$2" ]; then
254
		if [ -z "$3" ]; then
255
			return 0
256
		elif [ "$3" = nocache ]; then
257
			rm -f "$2"
258
		else
259
			info VALIDATING "Validating %s" "$displayname"
260
			if check_md5 "$2" "$3" "$4"; then
261
				return 0
262
			else
263
				rm -f "$2"
264
			fi
265
		fi
266
	fi
267
	# Drop 'nocache' option
268
	if [ "$3" = nocache ]; then
269
		set "$1" "$2"
270
	fi
271
272
	if [ "$#" -gt 5 ]; then
273
		local st=3
274
		if [ "$5" = "-" ]; then st=6; fi
275
		local order="$(a=$st; while [ "$a" -le $# ]; do eval echo \"\${$(($a+1))}\" $a;
276
		a=$(($a + 3)); done | sort -n | sed 's/.* //')"
277
	else
278
		local order=3
279
	fi
280
	for a in $order; do
281
		local md5="$(eval echo \${$a})"
282
		local siz="$(eval echo \${$(( $a+1 ))})"
283
		local typ="$(eval echo \${$(( $a+2 ))})"
284
		local from
285
		local dest
286
287
		case "$typ" in
288
		    bz2) from="$1.bz2"; dest="$2.bz2" ;;
289
		    gz)  from="$1.gz"; dest="$2.gz" ;;
290
		    *)   from="$1"; dest="$2" ;;
291
		esac
292
293
		if [ "${dest#/}" = "$dest" ]; then
294
			dest="./$dest"
295
		fi
296
		local dest2="$dest"
297
		if [ -d "${dest2%/*}/partial" ]; then
298
			dest2="${dest2%/*}/partial/${dest2##*/}"
299
		fi
300
301
		info RETRIEVING "Retrieving %s" "$displayname"
302
		if ! just_get "$from" "$dest2"; then continue; fi
303
		if [ "$md5" != "" ]; then
304
			info VALIDATING "Validating %s" "$displayname"
305
			if check_md5 "$dest2" "$md5" "$siz"; then
306
				md5=""
307
			fi
308
		fi
309
		if [ -z "$md5" ]; then
310
			[ "$dest2" = "$dest" ] || mv "$dest2" "$dest"
311
			case "$typ" in
312
			    gz)  gunzip "$dest" ;;
313
			    bz2) bunzip2 "$dest" ;;
314
			esac
315
			return 0
316
		else
317
			warning CORRUPTFILE "%s was corrupt" "$from"
318
		fi
319
	done
320
	return 1
321
}
322
323
just_get () {
324
	# args: from dest
325
	local from="$1"
326
	local dest="$2"
327
	mkdir -p "${dest%/*}"
328
	if [ "${from#null:}" != "$from" ]; then
329
		error 1 NOTPREDL "%s was not pre-downloaded" "${from#null:}"
330
	elif [ "${from#http://}" != "$from" ] || [ "${from#ftp://}" != "$from" ]; then
331
		# http/ftp mirror
332
		if wgetprogress -O "$dest" "$from"; then
333
			return 0
334
		elif [ -s "$dest" ]; then
335
			local iters=0
336
			while [ "$iters" -lt 3 ]; do
337
				warning RETRYING "Retrying failed download of %s" "$from"
338
				if wgetprogress -c -O "$dest" "$from"; then break; fi
339
				iters="$(($iters + 1))"
340
			done
341
		else
342
			rm -f "$dest"
343
			return 1
344
		fi
345
	elif [ "${from#https://}" != "$from" ] ; then
346
		# http/ftp mirror
347
		if wgetprogress $CHECKCERTIF $CERTIFICATE $PRIVATEKEY -O "$dest" "$from"; then
348
			return 0
349
		elif [ -s "$dest" ]; then
350
			local iters=0
351
			while [ "$iters" -lt 3 ]; do
352
				warning RETRYING "Retrying failed download of %s" "$from"
353
				if wgetprogress $CHECKCERTIF $CERTIFICATE $PRIVATEKEY -c -O "$dest" "$from"; then break; fi
354
				iters="$(($iters + 1))"
355
			done
356
		else
357
			rm -f "$dest"
358
			return 1
359
		fi
360
	elif [ "${from#file:}" != "$from" ]; then
361
		local base="${from#file:}"
362
		if [ "${base#//}" != "$base" ]; then
363
			base="/${from#file://*/}"
364
		fi
365
		if [ -e "$base" ]; then
366
			cp "$base" "$dest"
367
			return 0
368
		else
369
			return 1
370
		fi
371
	elif [ "${from#ssh:}" != "$from" ]; then
372
		local ssh_dest="$(echo $from | sed -e 's#ssh://##' -e 's#/#:/#')"
373
		if [ -n "$ssh_dest" ]; then
374
			scp "$ssh_dest" "$dest"
375
			return 0
376
		else
377
			return 1
378
		fi
379
	else
380
		error 1 UNKNOWNLOC "unknown location %s" "$from"
381
	fi
382
}
383
384
download () {
385
	mk_download_dirs
386
	"$DOWNLOAD_DEBS" $(echo "$@" | tr ' ' '\n' | sort)
387
}
388
389
download_indices () {
390
	mk_download_dirs
391
	"$DOWNLOAD_INDICES" $(echo "$@" | tr ' ' '\n' | sort)
392
}
393
394
debfor () {
395
	(while read pkg path; do
396
		for p in "$@"; do
397
			[ "$p" = "$pkg" ] || continue;
398
			echo "$path"
399
		done
400
	 done <"$TARGET/debootstrap/debpaths"
401
	)
402
}
403
404
apt_dest () {
405
	# args:
406
	#   deb package version arch mirror path
407
	#   pkg suite component arch mirror path
408
	#   rel suite mirror path
409
	case "$1" in
410
	    deb)
411
		echo "/var/cache/apt/archives/${2}_${3}_${4}.deb" | sed 's/:/%3a/'
412
		;;
413
	    pkg)
414
		local m="$5"
415
		m="debootstrap.invalid"
416
		#if [ "${m#http://}" != "$m" ]; then
417
		#	m="${m#http://}"
418
		#elif [ "${m#file://}" != "$m" ]; then
419
		#	m="file_localhost_${m#file://*/}"
420
		#elif [ "${m#file:/}" != "$m" ]; then
421
		#	m="file_localhost_${m#file:/}"
422
		#fi
423
424
		printf "%s" "$APTSTATE/lists/"
425
		echo "${m}_$6" | sed 's/\//_/g'
426
		;;
427
	    rel)
428
		local m="$3"
429
		m="debootstrap.invalid"
430
		#if [ "${m#http://}" != "$m" ]; then
431
		#	m="${m#http://}"
432
		#elif [ "${m#file://}" != "$m" ]; then
433
		#	m="file_localhost_${m#file://*/}"
434
		#elif [ "${m#file:/}" != "$m" ]; then
435
		#	m="file_localhost_${m#file:/}"
436
		#fi
437
		printf "%s" "$APTSTATE/lists/"
438
		echo "${m}_$4" | sed 's/\//_/g'
439
		;;
440
	esac
441
}
442
443
################################################################## download
444
445
get_release_md5 () {
446
	local reldest="$1"
447
	local path="$2"
448
	sed -n '/^[Mm][Dd]5[Ss][Uu][Mm]/,/^[^ ]/p' < "$reldest" | \
449
		while read a b c; do
450
			if [ "$c" = "$path" ]; then echo "$a $b"; fi
451
		done | head -n 1
452
}
453
454
download_release_sig () {
455
	local m1="$1"
456
	local reldest="$2"
457
	local relsigdest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release.gpg")"
458
459
	if [ -n "$KEYRING" ]; then
460
		progress 0 100 DOWNRELSIG "Downloading Release file signature"
461
		progress_next 50
462
		get "$m1/dists/$SUITE/Release.gpg" "$relsigdest" nocache ||
463
			error 1 NOGETRELSIG "Failed getting release signature file %s" \
464
			"$m1/dists/$SUITE/Release.gpg"
465
		progress 50 100 DOWNRELSIG "Downloading Release file signature"
466
467
		info RELEASESIG "Checking Release signature"
468
		# Don't worry about the exit status from gpgv; parsing the output will
469
		# take care of that.
470
		(gpgv --status-fd 1 --keyring "$KEYRING" --ignore-time-conflict \
471
		 "$relsigdest" "$reldest" || true) | read_gpg_status
472
		progress 100 100 DOWNRELSIG "Downloading Release file signature"
473
	fi
474
}
475
476
download_release_indices () {
477
	local m1="${MIRRORS%% *}"
478
	local reldest="$TARGET/$($DLDEST rel "$SUITE" "$m1" "dists/$SUITE/Release")"
479
	progress 0 100 DOWNREL "Downloading Release file"
480
	progress_next 100
481
	get "$m1/dists/$SUITE/Release" "$reldest" nocache ||
482
		error 1 NOGETREL "Failed getting release file %s" "$m1/dists/$SUITE/Release"
483
484
	TMPCOMPONENTS="$(sed -n 's/Components: *//p' "$reldest")"
485
	for c in $TMPCOMPONENTS ; do
486
		eval "
487
		case \"\$c\" in
488
		    $USE_COMPONENTS)
489
			COMPONENTS=\"\$COMPONENTS \$c\"
490
			;;
491
		esac
492
		"
493
	done
494
	COMPONENTS="$(echo $COMPONENTS)"
495
496
	if [ -z "$COMPONENTS" ]; then
497
		mv "$reldest" "$reldest.malformed"
498
		error 1 INVALIDREL "Invalid Release file, no valid components"
499
	fi
500
	progress 100 100 DOWNREL "Downloading Release file"
501
502
	download_release_sig "$m1" "$reldest"
503
504
	local totalpkgs=0
505
	for c in $COMPONENTS; do
506
		local subpath="$c/binary-$ARCH/Packages"
507
		local bz2md="`get_release_md5 "$reldest" "$subpath.bz2"`"
508
		local gzmd="`get_release_md5 "$reldest" "$subpath.gz"`"
509
		local normmd="`get_release_md5 "$reldest" "$subpath"`"
510
		local md=
511
		if [ "$normmd" != "" ]; then
512
			md="$normmd"
513
		elif [ -x /bin/bunzip2 ] && [ "$bz2md" != "" ]; then
514
			md="$bz2md"
515
		elif [ -x /bin/gunzip ] && [ "$gzmd" != "" ]; then
516
			md="$gzmd"
517
		fi
518
		if [ "$md" != "" ]; then
519
			totalpkgs="$(( $totalpkgs + ${md#* } ))"
520
		else
521
			mv "$reldest" "$reldest.malformed"
522
			error 1 MISSINGRELENTRY "Invalid Release file, no entry for %s" "$subpath"
523
		fi
524
	done
525
526
	local donepkgs=0
527
	local pkgdest
528
	progress 0 $totalpkgs DOWNPKGS "Downloading Packages files"
529
	for c in $COMPONENTS; do
530
		local subpath="$c/binary-$ARCH/Packages"
531
		local path="dists/$SUITE/$subpath"
532
		local bz2md="`get_release_md5 "$reldest" "$subpath.bz2"`"
533
		local gzmd="`get_release_md5 "$reldest" "$subpath.gz"`"
534
		local normmd="`get_release_md5 "$reldest" "$subpath"`"
535
		local ext=
536
		local md=
537
		if [ "$normmd" != "" ]; then
538
			ext="$ext $normmd ."
539
			md="$normmd"
540
		fi
541
		if [ -x /bin/bunzip2 ] && [ "$bz2md" != "" ]; then
542
			ext="$ext $bz2md bz2"
543
			md="${md:-$bz2md}"
544
		fi
545
		if [ -x /bin/gunzip ] && [ "$gzmd" != "" ]; then
546
			ext="$ext $gzmd gz"
547
			md="${md:-$gzmd}"
548
		fi
549
		progress_next "$(($donepkgs + ${md#* }))"
550
		for m in $MIRRORS; do
551
			pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
552
			if get "$m/$path" "$pkgdest" $ext; then break; fi
553
		done
554
		if [ ! -f "$pkgdest" ]; then
555
			error 1 COULDNTDL "Couldn't download %s" "$path"
556
		fi
557
		donepkgs="$(($donepkgs + ${md#* }))"
558
		progress $donepkgs $totalpkgs DOWNPKGS "Downloading Packages files"
559
	done
560
}
561
562
get_package_sizes () {
563
	# mirror pkgdest debs..
564
	local m="$1"; shift
565
	local pkgdest="$1"; shift
566
	$PKGDETAILS PKGS "$m" "$pkgdest" "$@" | (
567
		newleft=""
568
		totaldebs=0
569
		countdebs=0
570
		while read p details; do
571
			if [ "$details" = "-" ]; then
572
				newleft="$newleft $p"
573
			else
574
				size="${details##* }";
575
				totaldebs="$(($totaldebs + $size))"
576
				countdebs="$(($countdebs + 1))"
577
			fi
578
		done
579
		echo "$countdebs $totaldebs$newleft"
580
	)
581
}
582
583
# note, leftovers come back on fd5 !!
584
download_debs () {
585
	local m="$1"
586
	local pkgdest="$2"
587
	shift; shift
588
589
	$PKGDETAILS PKGS "$m" "$pkgdest" "$@" | (
590
		leftover=""
591
		while read p ver arc mdup fil md5 size; do
592
			if [ "$ver" = "-" ]; then
593
				leftover="$leftover $p"
594
			else
595
				progress_next "$(($dloaddebs + $size))"
596
				local debdest="$($DLDEST deb "$p" "$ver" "$arc" "$m" "$fil")"
597
				if get "$m/$fil" "$TARGET/$debdest" "$md5" "$size"; then
598
					dloaddebs="$(($dloaddebs + $size))"
599
					echo >>$TARGET/debootstrap/debpaths "$p $debdest"
600
				else
601
					warning COULDNTDL "Couldn't download package %s" "$p"
602
				fi
603
			fi
604
		done
605
		echo >&5 ${leftover# }
606
	)
607
}
608
609
download_release () {
610
	local m1="${MIRRORS%% *}"
611
612
	local numdebs="$#"
613
614
	local countdebs=0
615
	progress $countdebs $numdebs SIZEDEBS "Finding package sizes"
616
617
	local totaldebs=0
618
	local leftoverdebs="$*"
619
	for c in $COMPONENTS; do
620
		if [ "$countdebs" -ge "$numdebs" ]; then break; fi
621
622
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
623
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
624
		if [ ! -e "$pkgdest" ]; then continue; fi
625
626
		info CHECKINGSIZES "Checking component %s on %s..." "$c" "$m1"
627
628
		leftoverdebs="$(get_package_sizes "$m1" "$pkgdest" $leftoverdebs)"
629
630
		countdebs=$(($countdebs + ${leftoverdebs%% *}))
631
		leftoverdebs=${leftoverdebs#* }
632
633
		totaldebs=${leftoverdebs%% *}
634
		leftoverdebs=${leftoverdebs#* }
635
636
		progress $countdebs $numdebs SIZEDEBS "Finding package sizes"
637
	done
638
639
	if [ "$countdebs" -ne "$numdebs" ]; then
640
		error 1 LEFTOVERDEBS "Couldn't find these debs: %s" "$leftoverdebs"
641
	fi
642
643
	local dloaddebs=0
644
645
	progress $dloaddebs $totaldebs DOWNDEBS "Downloading packages"
646
	:>$TARGET/debootstrap/debpaths
647
648
	pkgs_to_get="$*"
649
	for c in $COMPONENTS; do
650
	    local path="dists/$SUITE/$c/binary-$ARCH/Packages"
651
	    for m in $MIRRORS; do
652
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
653
		if [ ! -e "$pkgdest" ]; then continue; fi
654
		pkgs_to_get="$(download_debs "$m" "$pkgdest" $pkgs_to_get 5>&1 1>&6)"
655
		if [ -z "$pkgs_to_get" ]; then break; fi
656
	    done 6>&1
657
	    if [ -z "$pkgs_to_get" ]; then break; fi
658
	done
659
	progress $dloaddebs $totaldebs DOWNDEBS "Downloading packages"
660
	if [ "$pkgs_to_get" != "" ]; then
661
		error 1 COULDNTDLPKGS "Couldn't download packages: %s" "$pkgs_to_get"
662
	fi
663
}
664
665
download_main_indices () {
666
	local m1="${MIRRORS%% *}"
667
	local comp="${USE_COMPONENTS}"
668
	progress 0 100 DOWNMAINPKGS "Downloading Packages file"
669
	progress_next 100
670
671
	if [ -z "$comp" ]; then comp=main; fi
672
	COMPONENTS="$(echo $comp | tr '|' ' ')"
673
674
	export COMPONENTS
675
	for m in $MIRRORS; do
676
	    for c in $COMPONENTS; do
677
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
678
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
679
		if [ -x /bin/gunzip ] && get "$m/${path}.gz" "${pkgdest}.gz"; then
680
			rm -f "$pkgdest"
681
			gunzip "$pkgdest.gz"
682
		elif get "$m/$path" "$pkgdest"; then
683
			true
684
		fi
685
	    done
686
	done
687
	progress 100 100 DOWNMAINPKGS "Downloading Packages file"
688
}
689
690
download_main () {
691
	local m1="${MIRRORS%% *}"
692
693
	:>$TARGET/debootstrap/debpaths
694
	for p in "$@"; do
695
	    for c in $COMPONENTS; do
696
		local details=""
697
		for m in $MIRRORS; do
698
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
699
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
700
			if [ ! -e "$pkgdest" ]; then continue; fi
701
			details="$($PKGDETAILS PKGS "$m" "$pkgdest" "$p")"
702
			if [ "$details" = "$p -" ]; then
703
				details=""
704
				continue
705
			fi
706
			size="${details##* }"; details="${details% *}"
707
			md5="${details##* }"; details="${details% *}"
708
			local debdest="$($DLDEST deb $details)"
709
			if get "$m/${details##* }" "$TARGET/$debdest" "$md5" "$size"; then
710
				echo >>$TARGET/debootstrap/debpaths "$p $debdest"
711
				details="done"
712
				break
713
			fi
714
		done
715
		if [ "$details" != "" ]; then
716
			break
717
		fi
718
	    done
719
	    if [ "$details" != "done" ]; then
720
		error 1 COULDNTDL "Couldn't download %s" "$p"
721
	    fi
722
	done
723
}
724
725
###################################################### deb choosing support
726
727
get_debs () {
728
	local field="$1"
729
	shift
730
	local m1 c
731
	for m1 in $MIRRORS; do
732
		for c in $COMPONENTS; do
733
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
734
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
735
			echo $("$PKGDETAILS" FIELD "$field" "$m1" "$pkgdest" "$@" | sed 's/ .*//')
736
		done
737
	done
738
}
739
740
################################################################ extraction
741
742
EXTRACTORS_SUPPORTED="dpkg-deb ar"
743
744
# Native dpkg-deb based extractors
745
extract_dpkg_deb_field () {
746
	local pkg="$1"
747
	local field="$2"
748
749
	dpkg-deb -f "$pkg" "$field"
750
}
751
752
extract_dpkg_deb_data () {
753
	local pkg="$1"
754
755
	dpkg-deb --fsys-tarfile "$pkg" | tar -xf -
756
}
757
758
# Raw .deb extractors
759
extract_ar_deb_field () {
760
	local pkg="$1"
761
	local field="$2"
762
763
	ar -p "$pkg" control.tar.gz | zcat |
764
	    tar -O -xf - control ./control 2>/dev/null |
765
	    grep -i "^$field:" | sed -e 's/[^:]*: *//' | head -n 1
766
}
767
768
extract_ar_deb_data () {
769
	local pkg="$1"
770
	local tarball=$(ar -t "$pkg" | grep "^data.tar.[bgx]z")
771
772
	case "$tarball" in
773
		data.tar.gz) cat_cmd=zcat ;;
774
		data.tar.bz2) cat_cmd=bzcat ;;
775
		data.tar.xz) cat_cmd=xzcat ;;
776
		*) error 1 UNKNOWNDATACOMP "Unknown compression type for %s in %s" "$tarball" "$pkg" ;;
777
	esac
778
779
	if type $cat_cmd >/dev/null 2>&1; then
780
		ar -p "$pkg" "$tarball" | $cat_cmd | tar -xf -
781
	else
782
		error 1 UNPACKCMDUNVL "The $cat_cmd is not available on the system"
783
	fi
784
}
785
786
valid_extractor () {
787
	local extractor="$1"
788
789
	for E in $EXTRACTORS_SUPPORTED; do
790
		if [ "$extractor" = "$E" ]; then
791
			return 0
792
		fi
793
	done
794
795
	return 1
796
}
797
798
choose_extractor () {
799
	local extractor
800
801
	if [ -n "$EXTRACTOR_OVERRIDE" ]; then
802
		extractor="$EXTRACTOR_OVERRIDE"
803
	elif type dpkg-deb >/dev/null 2>&1; then
804
		extractor="dpkg-deb"
805
	else
806
		extractor="ar"
807
	fi
808
809
	info CHOSENEXTRACTOR "Chosen extractor for .deb packages: %s" "$extractor"
810
	case "$extractor" in
811
	dpkg-deb)
812
		extract_deb_field () { extract_dpkg_deb_field "$@"; }
813
		extract_deb_data () { extract_dpkg_deb_data "$@"; }
814
		;;
815
	ar)
816
		extract_deb_field () { extract_ar_deb_field "$@"; }
817
		extract_deb_data () { extract_ar_deb_data "$@"; }
818
		;;
819
	esac
820
}
821
822
extract () { (
823
	cd "$TARGET"
824
	local p=0 cat_cmd
825
	for pkg in $(debfor "$@"); do
826
		p="$(($p + 1))"
827
		progress "$p" "$#" EXTRACTPKGS "Extracting packages"
828
		packagename="$(echo "$pkg" | sed 's,^.*/,,;s,_.*$,,')"
829
		info EXTRACTING "Extracting %s..." "$packagename"
830
		extract_deb_data "./$pkg"
831
	done
832
); }
833
834
in_target_nofail () {
835
	if ! $CHROOT_CMD "$@" 2>/dev/null; then
836
		true
837
	fi
838
	return 0
839
}
840
841
in_target_failmsg () {
842
	local code="$1"
843
	local msg="$2"
844
	local arg="$3"
845
	shift; shift; shift
846
	if ! $CHROOT_CMD "$@"; then
847
		warning "$code" "$msg" "$arg"
848
		return 1
849
	fi
850
	return 0
851
}
852
853
in_target () {
854
	in_target_failmsg IN_TARGET_FAIL "Failure trying to run: %s" "$CHROOT_CMD $*" "$@"
855
}
856
857
###################################################### standard setup stuff
858
859
conditional_cp () {
860
	if [ ! -e "$2/$1" ]; then
861
		if [ -L "$1" ] && [ -e "$1" ]; then
862
			cat "$1" >"$2/$1"
863
		elif [ -e "$1" ]; then
864
			cp -a "$1" "$2/$1"
865
		fi
866
	fi
867
}
868
869
mv_invalid_to () {
870
	local m="$1"
871
	m="$(echo "${m#http://}" | tr '/' '_' | sed 's/_*//')"
872
	(cd "$TARGET/$APTSTATE/lists"
873
	 for a in debootstrap.invalid_*; do
874
		 mv "$a" "${m}_${a#*_}"
875
	 done
876
	)
877
}
878
879
setup_apt_sources () {
880
	mkdir -p "$TARGET/etc/apt"
881
	for m in "$@"; do
882
		local cs=""
883
		for c in $COMPONENTS; do
884
			local path="dists/$SUITE/$c/binary-$ARCH/Packages"
885
			local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m" "$path")"
886
			if [ -e "$pkgdest" ]; then cs="$cs $c"; fi
887
		done
888
		if [ "$cs" != "" ]; then echo "deb $m $SUITE$cs"; fi
889
	done > "$TARGET/etc/apt/sources.list"
890
}
891
892
setup_etc () {
893
	mkdir -p "$TARGET/etc"
894
895
	conditional_cp /etc/resolv.conf "$TARGET"
896
	conditional_cp /etc/hostname "$TARGET"
897
898
	if [ "$DLDEST" = apt_dest ] && [ ! -e "$TARGET/etc/apt/sources.list" ]; then
899
		setup_apt_sources "http://debootstrap.invalid/"
900
	fi
901
}
902
903
UMOUNT_DIRS=
904
905
umount_exit_function () {
906
	for dir in $UMOUNT_DIRS; do
907
		umount "$TARGET/${dir#/}" || true
908
	done
909
}
910
911
umount_on_exit () {
912
	if [ "$UMOUNT_DIRS" ]; then
913
		UMOUNT_DIRS="$UMOUNT_DIRS $1"
914
	else
915
		UMOUNT_DIRS="$1"
916
		on_exit umount_exit_function
917
	fi
918
}
919
920
clear_mtab () {
921
	if [ -f "$TARGET/etc/mtab" ] && [ ! -h "$TARGET/etc/mtab" ]; then
922
		rm -f "$TARGET/etc/mtab"
923
	fi
924
}
925
926
setup_proc () {
927
	case "$ARCH" in
928
	    kfreebsd-*)
929
		umount_on_exit /dev
930
		umount_on_exit /proc
931
		umount "$TARGET/proc" 2>/dev/null || true
932
		in_target mount -t linprocfs proc /proc
933
		;;
934
	    hurd-*)
935
		;;
936
	    *)
937
		umount_on_exit /dev/pts
938
		umount_on_exit /dev/shm
939
		umount_on_exit /proc/bus/usb
940
		umount_on_exit /proc
941
		umount "$TARGET/proc" 2>/dev/null || true
942
		in_target mount -t proc proc /proc
943
		if [ -d "$TARGET/sys" ] && \
944
		   grep -q '[[:space:]]sysfs' /proc/filesystems 2>/dev/null; then
945
			umount_on_exit /sys
946
			umount "$TARGET/sys" 2>/dev/null || true
947
			in_target mount -t sysfs sysfs /sys
948
		fi
949
		on_exit clear_mtab
950
		;;
951
	esac
952
	umount_on_exit /lib/init/rw
953
}
954
955
setup_proc_fakechroot () {
956
	rm -rf "$TARGET/proc"
957
	ln -s /proc "$TARGET"
958
}
959
960
setup_devices () {
961
	case "$ARCH" in
962
	    kfreebsd-*)
963
		in_target mount -t devfs devfs /dev ;;
964
	    hurd-*)
965
		setup_devices_hurd ;;
966
	    *)
967
		if [ -e "$DEVICES_TARGZ" ]; then
968
			zcat "$DEVICES_TARGZ" | (cd "$TARGET"; tar -xf -)
969
		else
970
			if [ -e /dev/.devfsd ] ; then
971
				in_target mount -t devfs devfs /dev
972
			else
973
				error 1 NODEVTGZ "no %s. cannot create devices" "$DEVICES_TARGZ"
974
			fi
975
		fi
976
		;;
977
	esac
978
}
979
980
setup_devices_hurd () {
981
	mkdir -p "$TARGET/servers/socket"
982
	/bin/settrans -cfk "$TARGET/servers/socket/1" /hurd/pflocal
983
	/bin/settrans -cf "$TARGET/servers/socket/2" /hurd/pfinet
984
	/bin/settrans -cfk "$TARGET/servers/exec" /hurd/exec
985
	/bin/settrans -cf "$TARGET/servers/crash-suspend" /hurd/crash --suspend
986
	/bin/settrans -cf "$TARGET/servers/crash-kill" /hurd/crash --kill
987
	/bin/settrans -cf "$TARGET/servers/crash-dump-core" /hurd/crash --dump-core
988
	/bin/settrans -cf "$TARGET/servers/password" /hurd/password
989
	/bin/settrans -cf "$TARGET/servers/default-pager" /hurd/proxy-defpager
990
	ln -fs crash-kill "$TARGET/servers/crash"
991
	ln -fs 1 "$TARGET/servers/socket/local"
992
	ln -fs 2 "$TARGET/servers/socket/inet"
993
	(cd "$TARGET/dev"; /sbin/MAKEDEV fd std ptyp ptyq vcs tty1 tty2 tty3 tty4 tty5 tty6)
994
}
995
996
setup_devices_fakechroot () {
997
	rm -rf "$TARGET/dev"
998
	ln -s /dev "$TARGET"
999
}
1000
1001
setup_dselect_method () {
1002
	case "$1" in
1003
	    apt)
1004
		mkdir -p "$TARGET/var/lib/dpkg"
1005
		echo "apt apt" > "$TARGET/var/lib/dpkg/cmethopt"
1006
		chmod 644 "$TARGET/var/lib/dpkg/cmethopt"
1007
		;;
1008
	    *)
1009
		error 1 UNKNOWNDSELECT "unknown dselect method"
1010
		;;
1011
	esac
1012
}
1013
1014
################################################################ pkgdetails
1015
1016
# NOTE
1017
# For the debootstrap udeb, pkgdetails is provided by the bootstrap-base
1018
# udeb, so the pkgdetails API needs to be kept in sync with that.
1019
1020
if [ -x /usr/bin/perl ]; then
1021
	PKGDETAILS=pkgdetails_perl
1022
1023
	pkgdetails_field () {
1024
		# uniq field mirror Packages values...
1025
		perl -le '
1026
$unique = shift @ARGV; $field = lc(shift @ARGV); $mirror = shift @ARGV;
1027
$cnt = length(@ARGV);
1028
%fields = map { $_, 0 } @ARGV;
1029
while (<STDIN>) {
1030
	chomp;
1031
	next if (/^ /);
1032
	if (/^([^:]*:)\s*(.*)$/) {
1033
		$f = lc($1); $v = $2;
1034
		$pkg = $v if ($f eq "package:");
1035
		$ver = $v if ($f eq "version:");
1036
		$arc = $v if ($f eq "architecture:");
1037
		$fil = $v if ($f eq "filename:");
1038
		$md5 = $v if ($f eq "md5sum:");
1039
		$siz = $v if ($f eq "size:");
1040
		$val = $v if ($f eq $field);
1041
	} elsif (/^$/) {
1042
		if (defined $val && defined $fields{$val}) {
1043
			$cnt++;
1044
			printf "%s %s %s %s %s %s %s\n",
1045
			 $pkg, $ver, $arc, $mirror, $fil, $md5, $siz;
1046
			if ($unique) {
1047
				delete $fields{$val};
1048
				last if (--$cnt <= 0);
1049
			}
1050
		}
1051
		undef $val;
1052
	}
1053
}
1054
for $v (keys %fields) {
1055
	printf ("%s -\n", $v) if ($unique);
1056
}
1057
' "$@"
1058
	}
1059
1060
	pkgdetails_perl () {
1061
		if [ "$1" = "WGET%" ]; then
1062
			shift;
1063
			perl -e '
1064
$v = 0;
1065
while (read STDIN, $x, 1) {
1066
	if ($x =~ m/\d/) {
1067
		$v *= 10;
1068
		$v += $x;
1069
	} elsif ($x eq "%") {
1070
		printf "P: %d %d%s\n", int($v / 100.0 * ($ARGV[1] - $ARGV[0]) + $ARGV[0]), $ARGV[2], ($#ARGV == 3 ? " $ARGV[3]" : "");
1071
		$v = 0;
1072
	} else {
1073
		$v = 0;
1074
	}
1075
}' "$@"
1076
		elif [ "$1" = "GETDEPS" ]; then
1077
			local pkgdest="$2"; shift; shift
1078
			perl -e '
1079
while (<STDIN>) {
1080
	chomp;
1081
	$in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
1082
	$in = 0 if (/^$/);
1083
	if ($in and (/^Depends: (.*)$/ or /^Pre-Depends: (.*)$/)) {
1084
		for $d (split /\s*,\s*/, $1) {
1085
			$d =~ s/\s*[|].*$//;
1086
			$d =~ s/\s*[(].*[)]\s*//;
1087
			print "$d\n";
1088
		}
1089
	}
1090
}' <"$pkgdest" "$@" | sort | uniq
1091
		elif [ "$1" = "PKGS" ]; then
1092
			local m="$2"
1093
			local p="$3"
1094
			shift; shift; shift
1095
			pkgdetails_field 1 Package: "$m" "$@" < "$p"
1096
		elif [ "$1" = "FIELD" ]; then
1097
			local f="$2"
1098
			local m="$3"
1099
			local p="$4"
1100
			shift; shift; shift; shift
1101
			pkgdetails_field 0 "$f" "$m" "$@" < "$p"
1102
		elif [ "$1" = "STANZAS" ]; then
1103
			local pkgdest="$2"; shift; shift
1104
			perl -e '
1105
my $accum = "";
1106
while (<STDIN>) {
1107
	$accum .= $_;
1108
	$in = 1 if (/^Package: (.*)$/ && grep {$_ eq $1} @ARGV);
1109
	if ($in and /^$/) {
1110
		print $accum;
1111
		if (substr($accum, -1) != "\n") {
1112
			print "\n\n";
1113
		} elsif (substr($accum, -2, 1) != "\n") {
1114
			print "\n";
1115
		}
1116
		$in = 0;
1117
	}
1118
	$accum = "" if /^$/;
1119
}' <"$pkgdest" "$@"
1120
		fi
1121
	}
1122
elif [ -e "/usr/lib/debootstrap/pkgdetails" ]; then
1123
	PKGDETAILS="/usr/lib/debootstrap/pkgdetails"
1124
elif [ -e "$DEBOOTSTRAP_DIR/pkgdetails" ]; then
1125
	PKGDETAILS="$DEBOOTSTRAP_DIR/pkgdetails"
1126
else
1127
	PKGDETAILS=""
1128
fi
1129
1130
##################################################### dependency resolution
1131
1132
resolve_deps () {
1133
	local m1="${MIRRORS%% *}"
1134
1135
	# XXX: I can't think how to deal well with dependency resolution and
1136
	#      lots of Packages files. -- aj 2005/06/12
1137
1138
	c="${COMPONENTS%% *}"
1139
	local path="dists/$SUITE/$c/binary-$ARCH/Packages"
1140
	local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
1141
1142
	local PKGS="$*"
1143
	local ALLPKGS="$PKGS";
1144
	local ALLPKGS2="";
1145
	while [ "$PKGS" != "" ]; do
1146
		PKGS=$("$PKGDETAILS" GETDEPS "$pkgdest" $PKGS)
1147
		PKGS=$("$PKGDETAILS" PKGS REAL "$pkgdest" $PKGS | sed -n 's/ .*REAL.*$//p')
1148
		ALLPKGS2=$(echo "$PKGS $ALLPKGS" | tr ' ' '\n' | sort | uniq)
1149
		PKGS=$(without "$ALLPKGS2" "$ALLPKGS")
1150
		ALLPKGS="$ALLPKGS2"
1151
	done
1152
	echo $ALLPKGS
1153
}
1154
1155
setup_available () {
1156
	local m1="${MIRRORS%% *}"
1157
1158
	for c in $COMPONENTS; do
1159
		local path="dists/$SUITE/$c/binary-$ARCH/Packages"
1160
		local pkgdest="$TARGET/$($DLDEST pkg "$SUITE" "$c" "$ARCH" "$m1" "$path")"
1161
		# XXX: What if a package is in more than one component?
1162
		# -- cjwatson 2009-07-29
1163
		"$PKGDETAILS" STANZAS "$pkgdest" "$@"
1164
	done >"$TARGET/var/lib/dpkg/available"
1165
1166
	for pkg; do
1167
		echo "$pkg install"
1168
	done | in_target dpkg --set-selections
1169
}
1170
1171
get_next_predep () {
1172
	local stanza="$(in_target_nofail dpkg --predep-package)"
1173
	[ "$stanza" ] || return 1
1174
	echo "$stanza" | grep '^Package:' | sed 's/^Package://; s/^ *//'
1175
}
1176
1177
################################################################### helpers
1178
1179
# Return zero if it is possible to create devices and execute programs in
1180
# this directory. (Both may be forbidden by mount options, e.g. nodev and
1181
# noexec respectively.)
1182
check_sane_mount () {
1183
	mkdir -p "$1"
1184
1185
	case "$ARCH" in
1186
	    kfreebsd-*|hurd-*)
1187
		;;
1188
	    *)
1189
		mknod "$1/test-dev-null" c 1 3 || return 1
1190
		if ! echo test > "$1/test-dev-null"; then
1191
			rm -f "$1/test-dev-null"
1192
			return 1
1193
		fi
1194
		rm -f "$1/test-dev-null"
1195
		;;
1196
	esac
1197
1198
	cat > "$1/test-exec" <<EOF
1199
#! /bin/sh
1200
:
1201
EOF
1202
	chmod +x "$1/test-exec"
1203
	if ! "$1/test-exec"; then
1204
		rm -f "$1/test-exec"
1205
		return 1
1206
	fi
1207
	rm -f "$1/test-exec"
1208
1209
	return 0
1210
}
1211
1212
read_gpg_status () {
1213
	badsig=
1214
	unkkey=
1215
	validsig=
1216
	while read prefix keyword keyid rest; do
1217
		[ "$prefix" = '[GNUPG:]' ] || continue
1218
		case $keyword in
1219
		    BADSIG)	badsig="$keyid" ;;
1220
		    NO_PUBKEY)	unkkey="$keyid" ;;
1221
		    VALIDSIG)	validsig="$keyid" ;;
1222
		esac
1223
	done
1224
	if [ "$validsig" ]; then
1225
		info VALIDRELSIG "Valid Release signature (key id %s)" "$validsig"
1226
	elif [ "$badsig" ]; then
1227
		error 1 BADRELSIG "Invalid Release signature (key id %s)" "$badsig"
1228
	elif [ "$unkkey" ]; then
1229
		error 1 UNKNOWNRELSIG "Release signed by unknown key (key id %s)" "$unkkey"
1230
	else
1231
		error 1 SIGCHECK "Error executing gpgv to check Release signature"
1232
	fi
1233
}
1234
1235
without () {
1236
	# usage:  without "a b c" "a d" -> "b" "c"
1237
	(echo $1 | tr ' ' '\n' | sort | uniq;
1238
	 echo $2 $2 | tr ' ' '\n') | sort | uniq -u | tr '\n' ' '
1239
	echo
1240
}
1241
1242
# Formerly called 'repeat', but that's a reserved word in zsh.
1243
repeatn () {
1244
	local n="$1"
1245
	shift
1246
	while [ "$n" -gt 0 ]; do
1247
		if "$@"; then
1248
			break
1249
		else
1250
			n="$(( $n - 1 ))"
1251
			sleep 1
1252
		fi
1253
	done
1254
	if [ "$n" -eq 0 ]; then return 1; fi
1255
	return 0
1256
}
1257
1258
N_EXIT_THINGS=0
1259
exit_function () {
1260
	local n=0
1261
	while [ "$n" -lt "$N_EXIT_THINGS" ]; do
1262
		(eval $(eval echo \${EXIT_THING_$n}) 2>/dev/null || true)
1263
		n="$(( $n + 1 ))"
1264
	done
1265
	N_EXIT_THINGS=0
1266
}
1267
1268
trap "exit_function" 0
1269
trap "exit 129" 1
1270
trap "error 130 INTERRUPTED \"Interrupt caught ... exiting\"" 2
1271
trap "exit 131" 3
1272
trap "exit 143" 15
1273
1274
on_exit () {
1275
	eval `echo EXIT_THING_${N_EXIT_THINGS}=\"$1\"`
1276
	N_EXIT_THINGS="$(( $N_EXIT_THINGS + 1 ))"
1277
}
1278
1279
############################################################## fakechroot tools
1280
1281
install_fakechroot_tools () {
1282
	mv "$TARGET/sbin/ldconfig" "$TARGET/sbin/ldconfig.REAL"
1283
	echo \
1284
"#!/bin/sh
1285
echo
1286
echo \"Warning: Fake ldconfig called, doing nothing\"" > "$TARGET/sbin/ldconfig"
1287
	chmod 755 "$TARGET/sbin/ldconfig"
1288
1289
	echo \
1290
"/sbin/ldconfig
1291
/sbin/ldconfig.REAL
1292
fakechroot" >> "$TARGET/var/lib/dpkg/diversions"
1293
1294
	mv "$TARGET/usr/bin/ldd" "$TARGET/usr/bin/ldd.REAL"
1295
	cat << 'END' > "$TARGET/usr/bin/ldd"
1296
#!/usr/bin/perl
1297
1298
# fakeldd
1299
#
1300
# Replacement for ldd with usage of objdump
1301
#
1302
# (c) 2003-2005 Piotr Roszatycki <dexter@debian.org>, BSD
1303
1304
1305
my %libs = ();
1306
1307
my $status = 0;
1308
my $dynamic = 0;
1309
my $biarch = 0;
1310
1311
my $ldlinuxsodir = "/lib";
1312
my @ld_library_path = qw(/usr/lib /lib);
1313
1314
1315
sub ldso($) {
1316
	my ($lib) = @_;
1317
	my @files = ();
1318
1319
	if ($lib =~ /^\//) {
1320
	    $libs{$lib} = $lib;
1321
	    push @files, $lib;
1322
	} else {
1323
	    foreach my $ld_path (@ld_library_path) {
1324
		next unless -f "$ld_path/$lib";
1325
		my $badformat = 0;
1326
		open OBJDUMP, "objdump -p $ld_path/$lib 2>/dev/null |";
1327
	 	while (my $line = <OBJDUMP>) {
1328
		    if ($line =~ /file format (\S*)$/) {
1329
				$badformat = 1 unless $format eq $1;
1330
				last;
1331
		    }
1332
		}
1333
		close OBJDUMP;
1334
		next if $badformat;
1335
		$libs{$lib} = "$ld_path/$lib";
1336
		push @files, "$ld_path/$lib";
1337
	    }
1338
	    objdump(@files);
1339
	}
1340
}
1341
1342
1343
sub objdump(@) {
1344
	my (@files) = @_;
1345
	my @libs = ();
1346
1347
	foreach my $file (@files) {
1348
	    open OBJDUMP, "objdump -p $file 2>/dev/null |";
1349
	    while (my $line = <OBJDUMP>) {
1350
		$line =~ s/^\s+//;
1351
		my @f = split (/\s+/, $line);
1352
		if ($line =~ /file format (\S*)$/) {
1353
		    if (not $format) {
1354
			$format = $1;
1355
			if ($unamearch eq "x86_64" and $format eq "elf32-i386") {
1356
			    my $link = readlink "/lib/ld-linux.so.2";
1357
			    if ($link =~ /^\/emul\/ia32-linux\//) {
1358
				$ld_library_path[-2] = "/emul/ia32-linux/usr/lib";
1359
				$ld_library_path[-1] = "/emul/ia32-linux/lib";
1360
			    }
1361
			} elsif ($unamearch =~ /^(sparc|sparc64)$/ and $format eq "elf64-sparc") {
1362
			    $ldlinuxsodir = "/lib64";
1363
			    $ld_library_path[-2] = "/usr/lib64";
1364
			    $ld_library_path[-1] = "/lib64";
1365
			}
1366
		    } else {
1367
			next unless $format eq $1;
1368
		    }
1369
		}
1370
		if (not $dynamic and $f[0] eq "Dynamic") {
1371
		    $dynamic = 1;
1372
		}
1373
		next unless $f[0] eq "NEEDED";
1374
		if ($f[1] =~ /^ld-linux(\.|-)/) {
1375
		    $f[1] = "$ldlinuxsodir/" . $f[1];
1376
		}
1377
		if (not defined $libs{$f[1]}) {
1378
		    $libs{$f[1]} = undef;
1379
		    push @libs, $f[1];
1380
		}
1381
	    }
1382
	    close OBJDUMP;
1383
	}
1384
1385
	foreach my $lib (@libs) {
1386
	    ldso($lib);
1387
	}
1388
}
1389
1390
1391
if ($#ARGV < 0) {
1392
	print STDERR "fakeldd: missing file arguments\n";
1393
	exit 1;
1394
}
1395
1396
while ($ARGV[0] =~ /^-/) {
1397
	my $arg = $ARGV[0];
1398
	shift @ARGV;
1399
	last if $arg eq "--";
1400
}
1401
1402
open LD_SO_CONF, "/etc/ld.so.conf";
1403
while ($line = <LD_SO_CONF>) {
1404
	chomp $line;
1405
	unshift @ld_library_path, $line;
1406
}
1407
close LD_SO_CONF;
1408
1409
unshift @ld_library_path, split(/:/, $ENV{LD_LIBRARY_PATH});
1410
1411
$unamearch = `/bin/uname -m`;
1412
chomp $unamearch;
1413
1414
foreach my $file (@ARGV) {
1415
	my $address;
1416
	%libs = ();
1417
	$dynamic = 0;
1418
1419
	if ($#ARGV > 0) {
1420
		print "$file:\n";
1421
	}
1422
1423
	if (not -f $file) {
1424
		print STDERR "ldd: $file: No such file or directory\n";
1425
		$status = 1;
1426
		next;
1427
	}
1428
1429
	objdump($file);
1430
1431
	if ($dynamic == 0) {
1432
		print "\tnot a dynamic executable\n";
1433
		$status = 1;
1434
	} elsif (scalar %libs eq "0") {
1435
		print "\tstatically linked\n";
1436
	}
1437
1438
	if ($format =~ /^elf64-/) {
1439
		$address = "0x0000000000000000";
1440
	} else {
1441
		$address = "0x00000000";
1442
	}
1443
1444
	foreach $lib (keys %libs) {
1445
		if ($libs{$lib}) {
1446
			printf "\t%s => %s (%s)\n", $lib, $libs{$lib}, $address;
1447
		} else {
1448
			printf "\t%s => not found\n", $lib;
1449
		}
1450
	}
1451
}
1452
1453
exit $status;
1454
END
1455
	chmod 755 "$TARGET/usr/bin/ldd"
1456
1457
	echo \
1458
"/usr/bin/ldd
1459
/usr/bin/ldd.REAL
1460
fakechroot" >> "$TARGET/var/lib/dpkg/diversions"
1461
1462
}
(-)a/branches/ucs-3.2/ucs-3.2-0/base/univention-debootstrap/usr/share/debootstrap/scripts/ucs3 (-1 / +193 lines)
Line 0    Link Here 
0
- 
1
mirror_style main
2
download_style apt
3
finddebs_style from-indices
4
variants - buildd fakechroot minbase scratchbox
5
6
if doing_variant fakechroot; then
7
	test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started"
8
fi
9
10
case $ARCH in
11
	alpha|ia64) LIBC="libc6.1" ;;
12
	kfreebsd-*) LIBC="libc0.1" ;;
13
	hurd-*)     LIBC="libc0.3" ;;
14
	*)          LIBC="libc6" ;;
15
esac
16
17
work_out_debs () {
18
	required="$(get_debs Priority: required)"
19
20
	if doing_variant - || doing_variant fakechroot; then
21
		#required="$required $(get_debs Priority: important)"
22
		#  ^^ should be getting debconf here somehow maybe
23
		base="$(get_debs Priority: important)"
24
	elif doing_variant buildd || doing_variant scratchbox; then
25
		base="apt $(get_debs Build-Essential: yes)"
26
	elif doing_variant minbase; then
27
		base="apt"
28
	fi
29
30
	if doing_variant fakechroot; then
31
		# ldd.fake needs binutils
32
		required="$required binutils"
33
	fi
34
}
35
36
first_stage_install () {
37
	extract $required
38
39
	mkdir -p "$TARGET/var/lib/dpkg"
40
	: >"$TARGET/var/lib/dpkg/status"
41
	: >"$TARGET/var/lib/dpkg/available"
42
43
	setup_etc
44
	if [ ! -e "$TARGET/etc/fstab" ]; then
45
		echo '# UNCONFIGURED FSTAB FOR BASE SYSTEM' > "$TARGET/etc/fstab"
46
		chown 0:0 "$TARGET/etc/fstab"; chmod 644 "$TARGET/etc/fstab"
47
	fi
48
49
	if doing_variant fakechroot; then
50
		setup_devices_fakechroot
51
	else
52
		setup_devices
53
	fi
54
55
	x_feign_install () {
56
		local pkg="$1"
57
		local deb="$(debfor $pkg)"
58
		local ver="$(extract_deb_field "$TARGET/$deb" Version)"
59
60
		mkdir -p "$TARGET/var/lib/dpkg/info"
61
62
		echo \
63
"Package: $pkg
64
Version: $ver
65
Status: install ok installed" >> "$TARGET/var/lib/dpkg/status"
66
67
		touch "$TARGET/var/lib/dpkg/info/${pkg}.list"
68
	}
69
70
	x_feign_install dpkg
71
}
72
73
second_stage_install () {
74
	x_core_install () {
75
		smallyes '' | in_target dpkg --force-depends --install $(debfor "$@")
76
	}
77
78
	p () {
79
		baseprog="$(($baseprog + ${1:-1}))"
80
	}
81
82
	if doing_variant fakechroot; then
83
		setup_proc_fakechroot
84
	elif doing_variant scratchbox; then
85
		true
86
	else
87
		setup_proc
88
		in_target /sbin/ldconfig
89
	fi
90
91
	DEBIAN_FRONTEND=noninteractive
92
	DEBCONF_NONINTERACTIVE_SEEN=true
93
	export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
94
95
	baseprog=0
96
	bases=7
97
98
	p; progress $baseprog $bases INSTCORE "Installing core packages" #1
99
	info INSTCORE "Installing core packages..."
100
101
	p; progress $baseprog $bases INSTCORE "Installing core packages" #2
102
	ln -sf mawk "$TARGET/usr/bin/awk"
103
	x_core_install base-files base-passwd
104
	p; progress $baseprog $bases INSTCORE "Installing core packages" #3
105
	x_core_install dpkg
106
107
	if [ ! -e "$TARGET/etc/localtime" ]; then
108
		ln -sf /usr/share/zoneinfo/UTC "$TARGET/etc/localtime"
109
	fi
110
111
	if doing_variant fakechroot; then
112
		install_fakechroot_tools
113
	fi
114
115
	p; progress $baseprog $bases INSTCORE "Installing core packages" #4
116
	x_core_install $LIBC
117
118
	p; progress $baseprog $bases INSTCORE "Installing core packages" #5
119
	x_core_install perl-base
120
121
	p; progress $baseprog $bases INSTCORE "Installing core packages" #6
122
	rm "$TARGET/usr/bin/awk"
123
	x_core_install mawk
124
125
	p; progress $baseprog $bases INSTCORE "Installing core packages" #7
126
	if doing_variant -; then
127
		x_core_install debconf
128
	fi
129
130
	baseprog=0
131
	bases=$(set -- $required; echo $#)
132
133
	info UNPACKREQ "Unpacking required packages..."
134
135
	exec 7>&1
136
137
	smallyes '' |
138
		(repeatn 5 in_target_failmsg UNPACK_REQ_FAIL_FIVE "Failure while unpacking required packages.  This will be attempted up to five times." "" \
139
		dpkg --status-fd 8 --force-depends --unpack $(debfor $required) 8>&1 1>&7 || echo EXITCODE $?) |
140
		dpkg_progress $baseprog $bases UNPACKREQ "Unpacking required packages" UNPACKING
141
142
	info CONFREQ "Configuring required packages..."
143
144
	mv "$TARGET/sbin/start-stop-daemon" "$TARGET/sbin/start-stop-daemon.REAL"
145
	echo \
146
"#!/bin/sh
147
echo
148
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/start-stop-daemon"
149
	chmod 755 "$TARGET/sbin/start-stop-daemon"
150
151
	setup_dselect_method apt
152
153
	smallyes '' |
154
		(in_target_failmsg CONF_REQ_FAIL "Failure while configuring required packages." "" \
155
		dpkg --status-fd 8 --configure --pending --force-configure-any --force-depends 8>&1 1>&7 || echo EXITCODE $?) |
156
		dpkg_progress $baseprog $bases CONFREQ "Configuring required packages" CONFIGURING
157
158
	baseprog=0
159
	bases="$(set -- $base; echo $#)"
160
161
	info UNPACKBASE "Unpacking the base system..."
162
163
	setup_available $required $base
164
	done_predeps=
165
	while predep=$(get_next_predep); do
166
		# We have to resolve dependencies of pre-dependencies manually because
167
		# dpkg --predep-package doesn't handle this.
168
		predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
169
		# XXX: progress is tricky due to how dpkg_progress works
170
		# -- cjwatson 2009-07-29
171
		p; smallyes '' |
172
		in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
173
		base=$(without "$base" "$predep")
174
		done_predeps="$done_predeps $predep"
175
	done
176
177
	smallyes '' |
178
		(repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages.  This will be re-attempted up to five times." "" \
179
		dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 || echo EXITCODE $?) |
180
		dpkg_progress $baseprog $bases UNPACKBASE "Unpacking base system" UNPACKING
181
182
	info CONFBASE "Configuring the base system..."
183
184
	smallyes '' |
185
		(repeatn 5 in_target_failmsg CONF_BASE_FAIL_FIVE "Failure while configuring base packages.  This will be re-attempted up to five times." "" \
186
		dpkg --status-fd 8 --force-confold --skip-same-version --configure -a 8>&1 1>&7 || echo EXITCODE $?) |
187
		dpkg_progress $baseprog $bases CONFBASE "Configuring base system" CONFIGURING
188
189
	mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon"
190
191
	progress $bases $bases CONFBASE "Configuring base system"
192
	info BASESUCCESS "Base system installed successfully."
193
}

Return to bug 30547