diff options
Diffstat (limited to 'methods/disk.install')
-rw-r--r-- | methods/disk.install | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/methods/disk.install b/methods/disk.install new file mode 100644 index 000000000..a14cc3994 --- /dev/null +++ b/methods/disk.install @@ -0,0 +1,127 @@ +#!/bin/sh + +set -e +vardir="$1" +method=$2 +option=$3 + +cd "$vardir/methods/disk" + +. ./shvar.$option + +xit=1 +trap ' + if [ -n "$umount" ] + then + umount "$umount" >/dev/null 2>&1 + fi + exit $xit +' 0 + +if [ -n "$p_blockdev" ] +then + umount="$p_mountpoint" + mount -rt "$p_fstype" -o nosuid,nodev "$p_blockdev" "$p_mountpoint" +fi + +if [ -n "$p_nfs" ] +then + umount="$p_mountpoint" + mount -rt nfs "$p_nfs" -o nosuid,nodev "$p_mountpoint" +fi + +case "$p_mountpoint" in +*/ ) binaryprefix="$p_mountpoint" ;; +'' ) binaryprefix="" ;; +* ) binaryprefix="$p_mountpoint/" ;; +esac + +predep="$vardir/predep-package" +while true +do + set +e + dpkg --predep-package >"$predep" + rc=$? + set -e + if test $rc = 1; then break; fi + test $rc = 0 + + perl -e ' + ($binaryprefix,$predep) = @ARGV; + $binaryprefix =~ s,/*$,/, if length($binaryprefix); + open(P,"< $predep") || die "cannot open $predep: $!\n"; + while (<P>) { + s/\s*\n$//; + $package= $_ if s/^Package: //i; + @filename= split(/ /,$_) if s/^Filename: //i; + @msdosfilename= split(/ /,$_) if s/^MSDOS-Filename: //i; + } + length($package) || die "internal error - no package"; + @filename || die "internal error - no filename"; + @filename==@msdosfilename || !@filename || !@msdosfilename || + die "internal error - mismatch >@filename< >@msdosfilename<"; + @invoke=(); $|=1; + for ($i=0; $i<=$#filename; $i++) { + $ppart= $i+1; + print "Looking for part $ppart of $package ... "; + if (-f "$binaryprefix$filename[$i]") { + $print= $filename[$i]; + $invoke= "$binaryprefix$filename[$i]"; + } elsif (-f "$binaryprefix$msdosfilename[$i]") { + $print= $msdosfilename[$i]; + $invoke= "$binaryprefix$msdosfilename[$i]"; + } else { + $base= $filename[$i]; $base =~ s,.*/,,; + $msdosbase= $msdosfilename[$i]; $msdosbase =~ s,.*/,,; + defined($c= open(X,"-|")) || + die "failed to fork for find: $!\n"; + if (!$c) { + exec("find", length($binaryprefix) + ? $binaryprefix : ".","-follow", + "-name",$base,"-o","-name",$msdosbase); + die "failed to exec find: $!\n"; + } + while (chop($invoke= <X>)) { last if -f $invoke; } + $print= $invoke; + if (substr($print,0,length($binaryprefix)+1) eq + "$binaryprefix/") { + $print= substr($print,length($binaryprefix)); + } + } + if (!length($invoke)) { + print STDERR " + +Oh dear, I need to install or upgrade $package, but I don'\''t see +the appropriate file(s) anywhere. I'\''m expecting version $version or +later, as that is listed in the Packages file. + +Perhaps you downloaded it with an unexpected name, or something. +In any case, you must find the file(s) and then either place it with +the correct filename(s) (as listed in the Packages file or in +/var/lib/dpkg/available) and rerun the installation, or upgrade the +package by using `dpkg --install --auto-deconfigure'\'' by hand. + +"; + exit(1); + } + print "$print\n"; + push(@invoke,$invoke); + } + print "Running dpkg -iB for $package ...\n"; + exec("dpkg","-iB","--",@invoke); + die "failed to exec dpkg: $!\n"; + ' -- "$binaryprefix$p_main_binary" "$predep" +done + +for f in main ctb nf lcl +do + eval 'this_binary=$p_'$f'_binary' + if [ -z "$this_binary" ]; then continue; fi + echo Running dpkg -iGROEB "$binaryprefix$this_binary" + dpkg -iGROEB "$binaryprefix$this_binary" +done + +echo -n 'Installation OK. Hit RETURN. ' +read response + +xit=0 |