home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / lib / dpkg / methods / disk / setup < prev    next >
Text File  |  1999-03-02  |  15KB  |  575 lines

  1. #!/bin/sh
  2.  
  3. set -e
  4. vardir="$1"
  5. method=$2
  6. option=$3
  7.  
  8. cd "$vardir/methods/disk"
  9. tp=/var/run/ddm$$
  10.  
  11. iarch=`dpkg --print-installation-architecture`
  12.  
  13. xit=1
  14. trap '
  15.     rm -f $tp.?
  16.     if [ -n "$umount" ]
  17.     then
  18.         umount "$umount" >/dev/null 2>&1
  19.     fi
  20.     exit $xit
  21. ' 0
  22.  
  23. if ls -d "$tp.?" >/dev/null 2>&1
  24. then
  25.     rm $tp.?
  26. fi
  27.  
  28. yesno () {
  29.     while true
  30.     do
  31.         echo -n "$2 [$1]  "
  32.         read response
  33.         if [ -z "$response" ]
  34.         then
  35.             response="$1"
  36.         fi
  37.         case "$response" in
  38.         [Nn]*)    yesno=no ; return ;;
  39.         [Yy]*)    yesno=yes ; return ;;
  40.         esac
  41.     done
  42. }
  43.  
  44. getblockdev () {
  45.     mountpoint="$vardir/methods/mnt"
  46.     if [ -z "$defaultdevice" ]
  47.     then
  48.         defaultdevice="$newdefaultdevice"
  49.     elif [ "$defaultdevice" != "$newdefaultdevice" ]
  50.     then
  51.         echo \
  52.     "Last time you specified installation from $defaultdevice."
  53.     fi
  54.     promptstring="$1"
  55.     while [ -z "$blockdevice" ]
  56.     do
  57.         echo -n "$promptstring [$defaultdevice]:  "
  58.         read response
  59.         if [ -z "$response" ]
  60.         then
  61.             response="$defaultdevice"
  62.         fi
  63.         if ! [ -b "$response" ]
  64.         then
  65.             echo "$response is not a block device."; continue
  66.         fi
  67.         tryblockdevice="$response"
  68.         if [ $option = cdrom ]
  69.         then
  70.             fstype=iso9660
  71.         elif [ $option = harddisk ]
  72.         then
  73.             blockbase="`echo \"$tryblockdevice\" | sed -e 's/[0-9]\{1,\}$//'`"
  74.             set +e
  75.             echo -e "p\nq\n" | fdisk "$blockbase" 2>/dev/null >$tp.f
  76.             set -e
  77.             proposeddevice="$tryblockdevice" perl -ne '
  78. next unless /^ *Device +Boot +Begin +Start +End +Blocks +Id +System *$/i .. !/\S/;
  79. next unless s:^/\S+:: && $& eq $ENV{"proposeddevice"};
  80. next unless s/^ +(\* +)?\d+ +\d+ +\d+ +\d+\+? +//;
  81. next unless m/^([0-9a-f]{1,2}) /i;
  82. %types= ( "1","msdos", "4","msdos", "6","msdos", "7","hpfs", "80","minix",
  83.           "81","minix", "83","ext2" );
  84. print $types{$1}; exit(0);    ' <$tp.f >$tp.m
  85.             defaultfstype="`cat $tp.m`"
  86.             if [ -n "$defaultfstype" ]
  87.             then
  88.                 cat <<END
  89. The partition table for $blockbase claims that $tryblockdevice
  90. contains filesystem type $defaultfstype.
  91. END
  92.                 if ! grep "    $defaultfstype$" /proc/filesystems >/dev/null
  93.                 then
  94.                     echo \
  95.     "Your kernel does not appear to support that filesystem type."
  96.                     defaultfstype=""
  97.                 fi
  98.             fi
  99.             echo -n "Supported filesystems: "
  100.             sed -e 's/^.*    / /' /proc/filesystems | tr '\n' ' '
  101.             echo -n "
  102. Enter filesystem type (for $tryblockdevice) [$defaultfstype]:  "
  103.             read fstype
  104.             if [ -z "$fstype" ]
  105.             then
  106.                 fstype="$defaultfstype"
  107.             fi
  108.         fi
  109.         umount="$mountpoint"
  110.         if mount -rt "$fstype" -o nosuid,nodev "$tryblockdevice" "$mountpoint"
  111.         then
  112.             echo
  113.             blockdevice="$tryblockdevice"
  114.         else
  115.             umount=""
  116.             echo \
  117.     "Unable to mount $tryblockdevice on $mountpoint, type $fstype."
  118.         fi
  119.     done
  120. }
  121.  
  122. outputparam () {
  123.     echo "$2" | sed -e "s/'/'\\\\''/; s/^/$1='/; s/$/'/" >&3
  124. }
  125.  
  126. intrkey="`stty -a | sed -n 's/.*intr = \([^;]*\);.*/\1/p'`"
  127. echo "
  128. If you make a mistake, use the interrupt key ($intrkey) to abort.
  129. "
  130.  
  131. # State variables, `best first'
  132. #  {main,ctb,nf,nus,lcl}_{packages,binary}
  133. #   Empty before we've found them or if they're not available,
  134. #   set to the relevant bit under mountpoint otherwise.
  135. #  hierbase
  136. #   A directory containing a Debian FTP site mirror tree for ONE distribution.
  137. #    eg /pub/debian/dists/stable
  138. #  mountpoint
  139. #   The mountpoint for the filesystem containing the stuff
  140. #   empty or unset if we don't know yet, or if we haven't mounted anything;
  141. #   may also be empty if `directory' was set.
  142. #  blockdevice
  143. #   The actual block device to mount.
  144. #  fstype
  145. #   The filesystem type to use.
  146. #  defaultdevice
  147. #   The default block device to mount.
  148.  
  149. if [ -f shvar.$option ]
  150. then
  151.     . ./shvar.$option
  152.     defaultdevice="$p_blockdev"
  153.     defaultnfsserver="$p_nfsserver"
  154.     defaultnfsrempath="$p_nfsrempath"
  155. fi
  156.  
  157. if [ $option = cdrom ]
  158. then
  159.     mount >$tp.m
  160.     sed -n 's/ ([^)]*)$//; s/^[^ ]* on //; s/ type iso9660$//p' <$tp.m >$tp.l
  161.     ncdroms=`wc -l <$tp.l`
  162.     if [ $ncdroms -gt 1 ]
  163.     then
  164.         response=""
  165.         while [ -z "$response" ]
  166.         do
  167.             echo \
  168.     'Several CD-ROMs (or other ISO9660 filesystems) are mounted:'
  169.             egrep 'type iso9660 \([^)]*\)$' <$tp.m | nl
  170.             echo -n \
  171.     'Is it any of these ?  Type a number, or `n'\'' for none.  '
  172.             read response
  173.             response="`echo \"$response\" | sed -e 's/[     ]*$//'`"
  174.             if expr "$response" : '[0-9][0-9]*$' >/dev/null && \
  175.                [ $response -ge 1 -a $response -le $ncdroms ]
  176.             then
  177.                 mountpoint="`sed -n $response'p' <$tp.l`"
  178.                 echo
  179.             elif expr "$response" : '[Nn]' >/dev/null
  180.             then
  181.                 mountpoint=""
  182.             else
  183.                 response=""
  184.             fi
  185.         done
  186.     elif [ $ncdroms = 1 ]
  187.     then
  188.         mountpoint="`cat $tp.l`"
  189.         perl -ne 'print if s/ type iso9660 \([^)]*\)$// && s/ on .*$//;' \
  190.             <$tp.m >$tp.d
  191.         blockdevice="`cat $tp.d`"
  192.         yesno yes \
  193.     "I see a CD-ROM: $blockdevice, mounted on $mountpoint.  Is it the right one ?"
  194.         if [ $yesno = no ]
  195.         then
  196.             echo 'Unmounting it ...'
  197.             umount="$mountpoint"
  198.             while true
  199.             do
  200.                 echo -n \
  201.     'Please insert the right disc, and hit return:  '
  202.                 read response
  203.                 if mount -rt iso9660 -o nosuid,nodev \
  204.                     "$blockdevice" "$mountpoint"
  205.                 then
  206.                     echo
  207.                     break
  208.                 fi
  209.             done
  210.         fi
  211.     fi
  212.     if [ -z "$mountpoint" ]
  213.     then
  214.         if [ -b /dev/cdrom ]
  215.         then
  216.             echo \
  217.     'I see that /dev/cdrom exists and is a block device.'
  218.             newdefaultdevice=/dev/cdrom
  219.         fi
  220.         getblockdev 'Insert the CD-ROM and enter the block device name'
  221.     fi
  222. fi
  223.  
  224. if [ $option = nfs ]
  225. then
  226.     mountpoint="$vardir/methods/mnt"
  227.     while [ -z "$nfsserver" ]
  228.     do
  229.         echo -n \
  230. "What is the name of the NFS server ? [$defaultnfsserver]  "
  231.         read response
  232.         if [ -z "$response" -a -n "$defaultnfsserver" ]
  233.         then
  234.             response="$defaultnfsserver"
  235.         fi
  236.         if [ -z "$response" ]; then continue; fi
  237.         if [ -x /usr/bin/rpcinfo ]
  238.         then
  239.             if rpcinfo -u "$response" mountd >/dev/null
  240.             then
  241.                 nfsserver="$response"
  242.             else
  243.                 echo "$response appears not to be an NFS server."
  244.             fi
  245.         elif [ -x /bin/ping ]
  246.         then
  247.             if ping -q -c 1 "$response" | grep -q ', 1 packets received'
  248.             then
  249.                 nfsserver="$response"
  250.             else
  251.                 echo "$response appears to be down or nonexistent."
  252.             fi
  253.         else
  254.             echo \
  255. "(I can't check that now because there is no /usr/bin/rpcinfo or /bin/ping.)"
  256.             nfsserver="$response"
  257.         fi
  258.     done
  259.     while [ -z "$nfsrempath" ]
  260.     do
  261.         echo -n "
  262. What is the pathname on the NFS server of the filesystem with
  263. the Debian files? [$defaultnfsrempath]  "
  264.         read response
  265.         if [ -z "$response" -a -n "$defaultnfsrempath" ]
  266.         then
  267.             response="$defaultnfsrempath"
  268.         else
  269.             response="`echo \"$response\" | sed -e 's:/$::; s:^/*:/:'`"
  270.         fi
  271.         umount="$mountpoint"
  272.         if mount -rt nfs -o nosuid,nodev "$nfsserver:$response" "$mountpoint"
  273.         then
  274.             echo
  275.             nfsrempath="$response"
  276.         else
  277.             umount=""
  278.             echo \
  279. "Unable to mount NFS filesystem $nfsserver:$response."
  280.         fi
  281.     done
  282.     nfs="$nfsserver:$nfsrempath"
  283. fi
  284.  
  285. if [ $option = harddisk ]
  286. then
  287.     set +e
  288.     echo -e 'p\nq\n' | fdisk /dev/hda 2>/dev/null >$tp.f
  289.     if [ $? != 0 ]
  290.     then
  291.         echo -e 'p\nq\n' | fdisk /dev/sda 2>/dev/null >$tp.f
  292.     fi
  293.     set -e
  294.     perl -ne '
  295. next unless /^ *Device +Boot +Begin +Start +End +Blocks +Id +System *$/i .. !/\S/;
  296. next unless / [146] +DOS \d+-bit \S+$/;
  297. next unless m:^/\S+:;
  298. print $&;        ' <$tp.f >$tp.d
  299.     newdefaultdevice="`cat $tp.d`"
  300.     echo "
  301. I need to know which disk partition contains the distribution files;
  302. disk partitions are specified by the block device name in Linux."
  303.     if [ -n "$newdefaultdevice" ]
  304.     then
  305.         echo \
  306. "By the way, $newdefaultdevice looks like a DOS partition."
  307.     fi
  308.     getblockdev "Enter the partition's block device name"
  309. fi
  310.  
  311. if [ -n "$mountpoint" ]
  312. then
  313.     # We must have $mountpoint
  314.     if [ $option = cdrom ]
  315.     then
  316.         echo \
  317. 'All directory names should be entered relative to the root of the CD-ROM.
  318. '
  319.     elif [ $option = nfs ]
  320.     then
  321.         echo \
  322. "All directory names should be entered relative to the root of the NFS
  323. filesystem, ie relative to $nfsrempath on the server.
  324. "
  325.     else
  326.         echo \
  327. "All directory names should be entered relative to the root of the
  328. $fstype filesystem on $blockdevice.
  329. "
  330.     fi
  331. fi
  332.  
  333. while true
  334. do
  335.     if [ $option = cdrom ]
  336.     then
  337.         echo \
  338. "I would like to know where on the CD-ROM the top level of the Debian
  339. distribution is (eg. 'dists/stable') - this directory usually contains the 
  340. Packages-Master file.
  341.  
  342. If the CD-ROM is badly organised and doesn't have a straightforward copy of
  343. the distribution you may answer \`none' and we'll go through the parts
  344. I need individually."
  345.     else
  346.         echo \
  347. "In order to make it easy for me to find the relevant files I'd ideally
  348. like to install from a straightforward copy of the Debian distribution.
  349. To use this I'll need to know where the top level of that copy of the
  350. distribution is (eg. 'debian/dists/stable') - this directory usually 
  351. contains the Packages-Master file.
  352.  
  353. If you do not have a straightforward copy of the distribution available
  354. just answer \`none' and we'll go through the parts I need individually."
  355.     fi
  356.     defhierbase=none
  357. # maybe ask for debian/dists and then show and ask for available dists 
  358. # eg. {stable,frozen,unstable,bo,hamm,slink}
  359.     if [ -n "$p_hierbase" ]
  360.     then
  361.         if [ -d "$mountpoint/$p_hierbase/main/binary-$iarch" ]
  362.         then
  363.             echo "
  364. Last time you said \`$p_hierbase', and that looks plausible."
  365.             defhierbase="$p_hierbase"
  366.         else
  367.             echo "
  368. Last time you said \`$p_hierbase', but that doesn't look plausible,
  369. since \`$p_hierbase/main/binary-$iarch' doesn't seem to exist."
  370.         fi
  371.     fi
  372.     if [ none = "$defhierbase" ]
  373.     then
  374.         if [ -d "$mountpoint/debian/dists/stable/main/binary-$iarch" ]
  375.         then
  376.             echo "
  377. \`/debian/dists/stable' exists and looks plausible, so that's the default."
  378.             defhierbase=/debian/dists/stable
  379.         elif [ -d "$mountpoint/dists/stable/main/binary-$iarch" ]
  380.         then
  381.             echo "
  382. \`/dists/stable' exists and looks plausible, so that's the default."
  383.             defhierbase=/dists/stable
  384.         fi
  385.     fi
  386.     echo -n \
  387. "Distribution top level ? [$defhierbase]  "
  388.     read response
  389.     if [ -z "$response" ]
  390.     then
  391.         response="$defhierbase"
  392.     fi
  393.     if [ none = "$response" ]
  394.     then
  395.         hierbase=""
  396.         break
  397.     elif [ -d "$mountpoint/$response/main/binary-$iarch" ]
  398.     then
  399.         hierbase="`echo \"$response\" | sed -e 's:/*$::; s:^/*:/:'`"
  400.         break
  401.     fi
  402.     echo \
  403. "$response/main/binary-$iarch does not exist.
  404. "
  405. done
  406.  
  407.  
  408. case "$hierbase" in
  409. /* )    ;;
  410. '' )    ;;
  411. * )    hierbase="/$hierbase" ;;
  412. esac
  413.  
  414. check_binary () {
  415.     # args: area-in-messages directory
  416.     # eg:   main             "$hierbase/main/binary-$iarch"
  417.     # checks wether $2 contains *.deb
  418.     if ! [ -d "$mountpoint$2/" ]
  419.     then
  420.         echo "\`$2' does not exist."
  421.         return
  422.     fi
  423.  
  424.     if ! ( find "$mountpoint$2/" -follow -name '*.deb' -print \
  425.             | head -1 ) 2>/dev/null  | grep . >/dev/null
  426.     then
  427.         echo "\`$2' does not contain any *.deb packages.  Hmmpf."
  428.         return
  429.     fi
  430.     echo "Using \`$2' as $1 binary dir."
  431.     this_binary="$2"
  432. }
  433.  
  434. find_area () {
  435.     # args: area-in-messages area-in-vars subdirectory-in-hier
  436.     #       last-time-binary last-time-packages
  437.     # eg:   main             main         main
  438.     #       "$p_main_binary" "$p_main_packages"
  439.  
  440.     this_binary=''
  441.     this_packages=''
  442.     if [ -n "$hierbase" ]
  443.     then
  444.         check_binary $1 "$hierbase/$3/binary-$iarch"
  445.     fi
  446.  
  447.     if [ $option = cdrom -a $2 = nf -a -z "$this_binary" ]
  448.     then
  449.         echo '
  450. Note: most CD-ROM distributions of Debian do not include programs
  451. available in the `non-free'\'' directory of the distribution site.
  452. This is because these programs have copyrights that prevent
  453. distribution for profit on a CD-ROM - ie they are not free software.
  454. If you wish to install these programs you'\''ll have to get them from an
  455. alternative source.'
  456.     elif [ $2 = lcl -a -z "$this_binary" ]
  457.     then
  458.         echo '
  459. Note: By default there is no `local'\'' directory. It is intended for 
  460. packages you made yourself.'
  461.     fi
  462.     while [ -z "$this_binary" ]
  463.     do
  464.         defaultbinary="$4"
  465.         echo "
  466. Which directory contains the *.deb packages from the $1 distribution
  467. area (this directory is named \`$3/binary-$iarch' on the distribution site) ?
  468. Say \`none' if this area is not available."
  469.         if [ $2 != main -a -z "$defaultbinary" ]
  470.         then
  471.             defaultbinary=none
  472.         fi
  473.         echo -n \
  474. "Enter _$1_ binary dir. [$4]
  475.  ?  "
  476.         read response
  477.         if [ -z "$response" -a -n "$defaultbinary" ]
  478.         then
  479.             response="$defaultbinary"
  480.         fi
  481.         if [ none = "$response" ]
  482.         then
  483.             break
  484.         fi
  485.         case "$response" in
  486.         '' | none)    continue        ;;
  487.         esac
  488.         check_binary $1 "`echo \"$response\" | sed -e 's:/$::; s:^/*:/:'`"
  489.     done
  490.     if [ -n "$this_binary" ]
  491.     then
  492.         for f in Packages.gz packages.gz Packages packages
  493.         do
  494.             if [ -f "$mountpoint/$this_binary/$f" ]
  495.             then
  496.                 echo "Using \`$this_binary/$f' for $1."
  497.                 this_packages="$this_binary/$f"
  498.                 break
  499.             fi
  500.         done
  501.         while [ -z "$this_packages" ]
  502.         do
  503.             echo -n "
  504. I can't find the $1 \`Packages' file.  The information in the
  505. \`Packages' file is important for package selection during new
  506. installations, and is very useful for upgrades.
  507.  
  508. If you overlooked it when downloading you should do get it now and
  509. return to this installation procedure when you have done so: you will
  510. find one Packages file and one Packages.gz file -- either will do --
  511. in the \`binary-$iarch' subdirectory of each area on the FTP sites and
  512. CD-ROMs.  Alternatively (and this will be rather slow) I can scan the
  513. packages in the distribution area - say \`scan' if you want me to do so.
  514.  
  515. You need a separate Packages file from each of the distribution areas
  516. you wish to install.
  517.  
  518. Where is the _$1_ \`Packages' file (if none is available, say \`none')
  519. [$5]
  520.  ?  "
  521.             read response
  522.             if [ -z "$response" -a -n "$5" ]
  523.             then
  524.                 response="$5"
  525.             fi
  526.             case "$response" in
  527.             '')        continue            ;;
  528.             none)        break                ;;
  529.             scan)        this_packages=scan        ;;
  530.             /*)        this_packages="$response"    ;;
  531.             *)        this_packages="/$response"    ;;
  532.             esac
  533.         done
  534.     fi
  535.     eval $2'_binary="$this_binary"'
  536.     eval $2'_packages="$this_packages"'
  537. }
  538.  
  539. find_area main main main "$p_main_binary" "$p_main_packages"
  540. find_area contrib ctb contrib "$p_ctb_binary" "$p_ctb_packages"
  541. find_area non-free nf non-free "$p_nf_binary" "$p_nf_packages"
  542. find_area non-US nus non-US "$p_nus_binary" "$p_nus_packages"
  543. find_area local lcl local "$p_lcl_binary" "$p_lcl_packages"
  544.  
  545. echo -n '
  546. Hit RETURN to continue.  '
  547. read response
  548.  
  549. exec 3>shvar.$option.new
  550.  
  551. outputparam p_blockdev "$blockdevice"
  552. outputparam p_fstype "$fstype"
  553. outputparam p_mountpoint "$mountpoint"
  554. outputparam p_nfsserver "$nfsserver"
  555. outputparam p_nfsrempath "$nfsrempath"
  556. outputparam p_nfs "$nfs"
  557. outputparam p_hierbase "$hierbase"
  558.  
  559. outputparam p_main_packages "$main_packages"
  560. outputparam p_main_binary "$main_binary"
  561. outputparam p_ctb_packages "$ctb_packages"
  562. outputparam p_ctb_binary "$ctb_binary"
  563. outputparam p_nf_packages "$nf_packages"
  564. outputparam p_nf_binary "$nf_binary"
  565. outputparam p_nus_packages "$nus_packages"
  566. outputparam p_nus_binary "$nus_binary"
  567. outputparam p_lcl_packages "$lcl_packages"
  568. outputparam p_lcl_binary "$lcl_binary"
  569.  
  570. mv shvar.$option.new shvar.$option
  571.  
  572. xit=0
  573.  
  574.  
  575.