123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #!/bin/sh
- #
- # Copyright © 1995-1998 Ian Jackson <ijackson@chiark.greenend.org.uk>
- # Copyright © 1998 Heiko Schlittermann <hs@schlittermann.de>
- #
- # This is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <https://www.gnu.org/licenses/>.
- set -e
- vardir="$1"
- method=$2
- option=$3
- cd "$vardir/methods/$method"
- . ./shvar.$option
- #debug() { echo "DEBUG: $@"; }
- debug() { true; }
- iarch=`dpkg --print-architecture`
- ismulti() { test -e "$1/.disk/info" || test -e "$1$2/.disk/info"; }
- # 1/ mountpoint
- # 2/ hierarchy
- getdisklabel () {
- debug "$1" "$2"
- if [ -f $1/.disk/info ]
- then
- echo -n `head -1 "$1/.disk/info"`
- else
- if [ -f $1$2/.disk/info ]
- then
- echo -n `head -1 "$1$2/.disk/info"`
- else
- echo -n 'Non-Debian disc'
- fi
- fi
- }
- xit=1
- do_umount() {
- if [ "$method" = "multi_mount" ]
- then
- echo true
- return
- fi
- if [ -n "$umount" ]; then
- echo umount "$umount"
- #">/dev/null" "2>&1"
- fi
- }
- do_mount() {
- if [ "$method" = "multi_mount" ]
- then
- echo true
- return
- fi
- if [ ! -b "$p_blockdev" ]
- then
- loop=",loop"
- fi
- if [ -n "$p_blockdev" ]
- then
- umount="$p_mountpoint"
- echo mount -rt iso9660 -o nosuid,nodev${loop} "$p_blockdev" "$p_mountpoint"\; umount="$p_mountpoint"
- fi
- if [ -n "$p_nfs" ]
- then
- umount="$p_mountpoint"
- echo mount -rt nfs "$p_nfs" -o nosuid,nodev "$p_mountpoint"\; umount="$p_mountpoint"
- fi
- #if [ -n "$p_multi" -a -n "$p_multi_contentsfile" ]; then
- #echo "This is disk "
- #echo " "`getdisklabel "${p_mountpoint}" "${p_hierbase}"`
- #fi
- }
- trap 'eval `do_umount`; exit $xit' 0
- eval `do_mount`
- predep="$vardir/predep-package"
- while true
- do
- thisdisk="`getdisklabel ${p_mountpoint} ${p_hierbase}`"
- set +e
- dpkg --predep-package >"$predep"
- rc=$?
- set -e
- if test $rc = 1; then break; fi
- test $rc = 0
- perl -e '
- ($binaryprefix,$predep,$thisdisk) = @ARGV;
- open(P, "< $predep") or die "cannot open $predep: $!\n";
- while (<P>) {
- s/\s*\n$//;
- $package= $_ if s/^Package: //i;
- /^X-Medium:\s+(.*)\s*/ and $medium = $1;
- @filename= split(/ /,$_) if s/^Filename: //i;
- @msdosfilename= split(/ /,$_) if s/^MSDOS-Filename: //i;
- }
- die "internal error - no package" if length($package) == 0;
- die "internal error - no filename" if not @filename;
- die "internal error - mismatch >@filename< >@msdosfilename<"
- if @filename && @msdosfilename &&
- @filename != @msdosfilename;
- if ($medium && ($medium ne $thisdisk)) {
- print "
- This is
- $thisdisk
- However, $package is expected on disc:
- $medium
- Please change the discs and press <RETURN>.
- ";
- exit(1);
- }
- @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,.*/,,;
- $c = open(X, "-|"));
- if (not defined $c) {
- die "failed to fork for find: $!\n";
- }
- if (!$c) {
- exec("find", "-L",
- length($binaryprefix) ? $binaryprefix : ".",
- "-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)) {
- warn "
- 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.cd 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.cd 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";
- ' -- "$p_mountpoint$p_hierbase" "$predep" "$thisdisk"
- done
- perl -e '
- $SIG{INT} = sub { cd $vardir; unlink <tmp/*>; exit 1; };
- $| = 1;
- my ($vardir, $mountpoint, $hierbase, $mount, $umount) = @ARGV;
- my $line;
- my $AVAIL = "$vardir/methods/multicd/available";
- my $STATUS = "$vardir/status";
- my %Installed, %Filename, %Medium;
- print "Get currently installed package versions...";
- open(IN, "$STATUS") or die "cannot open $STATUS: $!\n";
- $line = 0;
- { local $/ = "";
- while (<IN>) {
- my %status;
- my @pstat;
- $line++ % 20 or print ".";
- s/\n\s+/ /g;
- %status = ("", split /^(\S*?):\s*/m, $_);
- map { chomp $status{$_}; $status{$_} =~ s/^\s*(.*?)\s*$/$1/;} keys %status;
- @pstat = split(/ /, $status{Status});
- next unless ($pstat[0] eq "install");
- if ($pstat[2] eq "config-files" || $pstat[2] eq "not-installed") {
- $Installed{$status{Package}} = "0.0";
- } else {
- $Installed{$status{Package}} = $status{Version} || "" ;
- }
- }; }
- print "\nGot ", scalar keys %Installed, " installed/pending packages\n";
- print "Scanning available packages...";
- $line = 0;
- open(IN, "$AVAIL") or die("Cannot open $AVAIL: $!\n");
- { local $/ = "";
- while (<IN>) {
- my $updated;
- $line++ % 20 or print ".";
- s/\n\s+/ /g;
- %avail = ("", split /^(\S*?):\s*/m, $_);
- map { chomp $avail{$_}; $avail{$_} =~ s/^\s*(.*?)\s*$/$1/;} keys %avail;
- next unless defined $Installed{$avail{Package}};
- system "dpkg", "--compare-versions", $avail{Version}, "gt", $Installed{$avail{Package}};
- $updated = ($? == 0);
- #print "$avail{Package}(" . ($updated ? "+" : "=") . ") ";
- $updated or next;
- $Filename{$avail{Package}} = $avail{Filename};
- next unless defined $avail{"X-Medium"};
- ${Medium{$avail{"X-Medium"}}} or ${Medium{$avail{"X-Medium"}}} = [];
- push @{${Medium{$avail{"X-Medium"}}}}, $avail{Package};
- }; };
- print "\n";
- if (@_ = keys(%Medium)) {
- print "You will need the following distribution disc(s):\n",
- join (", ", @_), "\n";
- }
- foreach $need (sort @_) {
- if (-r "$mountpoint/.disk/info") {
- open(IN, "$mountpoint/.disk/info") or die("$mountpoint/.disk/info: $!\n");
- } else {
- open(IN, "$mountpoint/$hierbase/.disk/info") or die("$mountpoint/$hierbase/.disk/info: $!\n");
- }
- $disk = <IN>; chomp $disk; close(IN);
- print "Processing disc\n $need\n";
- while ($disk ne $need) {
- print "Wrong disc. This is disc\n $disk\n";
- print "However, I need disc\n $need\n";
- print "Please change the discs and press <RETURN>\n";
- system($umount);
- <STDIN>;
- system($mount);
- $? and warn("cannot mount $mount\n");
- } continue {
- if (-r "$mountpoint/.disk/info") {
- open(IN, "$mountpoint/.disk/info") or die("$mountpoint/.disk/info: $!\n");
- } else {
- open(IN, "$mountpoint/$hierbase/.disk/info") or die("$mountpoint/$hierbase/.disk/info: $!\n");
- }
- $disk = <IN>; chomp $disk; close(IN);
- }
- -d "tmp" || mkdir "tmp", 0755 or die("Cannot mkdir tmp: $!\n");
- unlink <tmp/*>;
- print "creating symlinks...\n";
- foreach (@{$Medium{$need}}) {
- ($basename = $Filename{$_}) =~ s/.*\///;
- symlink "$mountpoint/$hierbase/$Filename{$_}",
- "tmp/$basename";
- }
- chdir "tmp" or die "cannot chdir to tmp: $!\n";
- system "dpkg", "-iGROEB", ".";
- unlink <*>;
- chdir "..";
- if ($?) {
- print "\nThe dpkg run produced errors. Please tell me, if I should\n",
- "continue with the next CD. [Y/n]: ";
- $ans = <STDIN>;
- exit 1 if $ans =~ /^n/i;
- $ouch = $?;
- }
- }
- exit $ouch;
- ' "$vardir" "$p_mountpoint" "$p_hierbase" "`do_mount`" "`do_umount`"
- echo -n 'Installation OK. Hit RETURN. '
- read response
- xit=0
|