install 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #!/bin/sh
  2. set -e
  3. vardir="$1"
  4. method=$2
  5. option=$3
  6. cd "$vardir/methods/$method"
  7. . ./shvar.$option
  8. #debug() { echo "DEBUG: $@"; }
  9. debug() { true; }
  10. iarch=`dpkg --print-installation-architecture`
  11. ismulti() { test -e "$1/.disk/info" || test -e "$1$2/.disk/info"; }
  12. # 1/ mountpoint
  13. # 2/ hierarchy
  14. getdisklabel () {
  15. debug "$1" "$2"
  16. if [ -f $1/.disk/info ]
  17. then
  18. echo -n `head -1 "$1/.disk/info"`
  19. else
  20. if [ -f $1$2/.disk/info ]
  21. then
  22. echo -n `head -1 "$1$2/.disk/info"`
  23. else
  24. echo -n 'Non-Debian disc'
  25. fi
  26. fi
  27. }
  28. xit=1
  29. do_umount() {
  30. if [ "$method" = "multi_mount" ]
  31. then
  32. echo /bin/true
  33. return
  34. fi
  35. if [ -n "$umount" ]; then
  36. echo umount "$umount"
  37. #">/dev/null" "2>&1"
  38. fi
  39. }
  40. do_mount() {
  41. if [ "$method" = "multi_mount" ]
  42. then
  43. echo /bin/true
  44. return
  45. fi
  46. if [ ! -b "$p_blockdev" ]
  47. then
  48. loop=",loop"
  49. fi
  50. if [ -n "$p_blockdev" ]
  51. then
  52. umount="$p_mountpoint"
  53. echo mount -rt iso9660 -o nosuid,nodev${loop} "$p_blockdev" "$p_mountpoint"\; umount="$p_mountpoint"
  54. fi
  55. if [ -n "$p_nfs" ]
  56. then
  57. umount="$p_mountpoint"
  58. echo mount -rt nfs "$p_nfs" -o nosuid,nodev "$p_mountpoint"\; umount="$p_mountpoint"
  59. fi
  60. #if [ -n "$p_multi" -a -n "$p_multi_contentsfile" ]; then
  61. #echo "This is disk "
  62. #echo " "`getdisklabel "${p_mountpoint}" "${p_hierbase}"`
  63. #fi
  64. }
  65. trap 'eval `do_umount`; exit $xit' 0
  66. eval `do_mount`
  67. predep="$vardir/predep-package"
  68. while true
  69. do
  70. thisdisk="`getdisklabel ${p_mountpoint} ${p_hierbase}`"
  71. set +e
  72. dpkg --predep-package >"$predep"
  73. rc=$?
  74. set -e
  75. if test $rc = 1; then break; fi
  76. test $rc = 0
  77. perl -e '
  78. ($binaryprefix,$predep,$thisdisk) = @ARGV;
  79. open(P,"< $predep") || die "cannot open $predep: $!\n";
  80. while (<P>) {
  81. s/\s*\n$//;
  82. $package= $_ if s/^Package: //i;
  83. /^X-Medium:\s+(.*)\s*/ and $medium = $1;
  84. @filename= split(/ /,$_) if s/^Filename: //i;
  85. @msdosfilename= split(/ /,$_) if s/^MSDOS-Filename: //i;
  86. }
  87. length($package) || die "internal error - no package";
  88. @filename || die "internal error - no filename";
  89. @filename==@msdosfilename || !@filename || !@msdosfilename ||
  90. die "internal error - mismatch >@filename< >@msdosfilename<";
  91. if ($medium && ($medium ne $thisdisk)) {
  92. print "
  93. This is
  94. $thisdisk
  95. However, $package is expected on disc:
  96. $medium
  97. Please change the discs and press <RETURN>.
  98. ";
  99. exit(1);
  100. }
  101. @invoke=(); $|=1;
  102. for ($i=0; $i<=$#filename; $i++) {
  103. $ppart= $i+1;
  104. print "Looking for part $ppart of $package ... ";
  105. if (-f "$binaryprefix$filename[$i]") {
  106. $print= $filename[$i];
  107. $invoke= "$binaryprefix$filename[$i]";
  108. } elsif (-f "$binaryprefix$msdosfilename[$i]") {
  109. $print= $msdosfilename[$i];
  110. $invoke= "$binaryprefix$msdosfilename[$i]";
  111. } else {
  112. $base= $filename[$i]; $base =~ s,.*/,,;
  113. $msdosbase= $msdosfilename[$i]; $msdosbase =~ s,.*/,,;
  114. defined($c= open(X,"-|")) ||
  115. die "failed to fork for find: $!\n";
  116. if (!$c) {
  117. exec("find", length($binaryprefix)
  118. ? $binaryprefix : ".","-follow",
  119. "-name",$base,"-o","-name",$msdosbase);
  120. die "failed to exec find: $!\n";
  121. }
  122. while (chop($invoke= <X>)) { last if -f $invoke; }
  123. $print= $invoke;
  124. if (substr($print,0,length($binaryprefix)+1) eq
  125. "$binaryprefix/") {
  126. $print= substr($print,length($binaryprefix));
  127. }
  128. }
  129. if (!length($invoke)) {
  130. print STDERR "
  131. Oh dear, I need to install or upgrade $package, but I don'\''t see
  132. the appropriate file(s) anywhere. I'\''m expecting version $version or
  133. later, as that is listed in the Packages.cd file.
  134. Perhaps you downloaded it with an unexpected name, or something.
  135. In any case, you must find the file(s) and then either place it with
  136. the correct filename(s) (as listed in the Packages.cd file or in
  137. /var/lib/dpkg/available) and rerun the installation, or upgrade the
  138. package by using `dpkg --install --auto-deconfigure'\'' by hand.
  139. ";
  140. exit(1);
  141. }
  142. print "$print\n";
  143. push(@invoke,$invoke);
  144. }
  145. print "Running dpkg -iB for $package ...\n";
  146. exec("dpkg","-iB","--",@invoke);
  147. die "failed to exec dpkg: $!\n";
  148. ' -- "$p_mountpoint$p_hierbase" "$predep" "$thisdisk"
  149. done
  150. perl -e '
  151. $SIG{INT} = sub { cd $vardir; unlink <tmp/*>; exit 1; };
  152. $| = 1;
  153. my ($vardir, $mountpoint, $hierbase, $mount, $umount) = @ARGV;
  154. my $line;
  155. my $AVAIL = "$vardir/methods/multicd/available";
  156. my $STATUS = "$vardir/status";
  157. my %Installed, %Filename, %Medium;
  158. print "Get currently installed package versions...";
  159. open(IN, "$STATUS") or die "Cannot open $STATUS: $!\n";
  160. $line = 0;
  161. { local $/ = "";
  162. while (<IN>) {
  163. my %status;
  164. my @pstat;
  165. $line++ % 20 or print ".";
  166. s/\n\s+/ /g;
  167. %status = ("", split /^(\S*?):\s*/m, $_);
  168. map { chomp $status{$_}; $status{$_} =~ s/^\s*(.*?)\s*$/$1/;} keys %status;
  169. @pstat = split(/ /, $status{Status});
  170. next unless ($pstat[0] eq "install");
  171. if ($pstat[2] eq "config-files" || $pstat[2] eq "not-installed") {
  172. $Installed{$status{Package}} = "0.0";
  173. } else {
  174. $Installed{$status{Package}} = $status{Version} || "" ;
  175. }
  176. }; }
  177. print "\nGot ", scalar keys %Installed, " installed/pending packages\n";
  178. print "Scanning available packages...";
  179. $line = 0;
  180. open(IN, "$AVAIL") or die("Cannot open $AVAIL: $!\n");
  181. { local $/ = "";
  182. while (<IN>) {
  183. my $updated;
  184. $line++ % 20 or print ".";
  185. s/\n\s+/ /g;
  186. %avail = ("", split /^(\S*?):\s*/m, $_);
  187. map { chomp $avail{$_}; $avail{$_} =~ s/^\s*(.*?)\s*$/$1/;} keys %avail;
  188. next unless defined $Installed{$avail{Package}};
  189. system "dpkg", "--compare-versions", $avail{Version}, "gt", $Installed{$avail{Package}};
  190. $updated = ($? == 0);
  191. #print "$avail{Package}(" . ($updated ? "+" : "=") . ") ";
  192. $updated or next;
  193. $Filename{$avail{Package}} = $avail{Filename};
  194. next unless defined $avail{"X-Medium"};
  195. ${Medium{$avail{"X-Medium"}}} or ${Medium{$avail{"X-Medium"}}} = [];
  196. push @{${Medium{$avail{"X-Medium"}}}}, $avail{Package};
  197. }; };
  198. print "\n";
  199. if (@_ = keys(%Medium)) {
  200. print "You will need the following distribution disc(s):\n",
  201. join (", ", @_), "\n";
  202. }
  203. foreach $need (sort @_) {
  204. if (-r "$mountpoint/.disk/info") {
  205. open(IN, "$mountpoint/.disk/info") or die("$mountpoint/.disk/info: $!\n");
  206. } else {
  207. open(IN, "$mountpoint/$hierbase/.disk/info") or die("$mountpoint/$hierbase/.disk/info: $!\n");
  208. }
  209. $disk = <IN>; chomp $disk; close(IN);
  210. print "Processing disc\n $need\n";
  211. while ($disk ne $need) {
  212. print "Wrong disc. This is disc\n $disk\n";
  213. print "However, I need disc\n $need\n";
  214. print "Please change the discs and press <RETURN>\n";
  215. system($umount);
  216. <STDIN>;
  217. system($mount); $? and warn("Cannot mount $mount\n");
  218. } continue {
  219. if (-r "$mountpoint/.disk/info") {
  220. open(IN, "$mountpoint/.disk/info") or die("$mountpoint/.disk/info: $!\n");
  221. } else {
  222. open(IN, "$mountpoint/$hierbase/.disk/info") or die("$mountpoint/$hierbase/.disk/info: $!\n");
  223. }
  224. $disk = <IN>; chomp $disk; close(IN);
  225. }
  226. -d "tmp" || mkdir "tmp", 0755 or die("Cannot mkdir tmp: $!\n");
  227. unlink <tmp/*>;
  228. print "creating symlinks...\n";
  229. foreach (@{$Medium{$need}}) {
  230. ($basename = $Filename{$_}) =~ s/.*\///;
  231. symlink "$mountpoint/$hierbase/$Filename{$_}",
  232. "tmp/$basename";
  233. }
  234. chdir "tmp" or die "Cannot chdir to tmp: $!\n";
  235. system "dpkg", "-iGROEB", ".";
  236. unlink <*>;
  237. chdir "..";
  238. if ($?) {
  239. print "\nThe dpkg run produced errors. Please tell me, if I should\n",
  240. "continue with the next CD. [Y/n]: ";
  241. $ans = <STDIN>;
  242. exit 1 if $ans =~ /^n/i;
  243. $ouch = $?;
  244. }
  245. }
  246. exit $ouch;
  247. ' "$vardir" "$p_mountpoint" "$p_hierbase" "`do_mount`" "`do_umount`"
  248. echo -n 'Installation OK. Hit RETURN. '
  249. read response
  250. xit=0
  251. # vim:ts=4:sw=4:aw:ai: