improve behaviour under VPC, fixes from nicolas tittley.
[minix.git] / commands / scripts / packman.sh
blob773d3a598fddb566ed23cf4a2173e4b57ed31215
1 #!/bin/sh
3 TAG=`uname -p`-`uname -r`.`uname -v`
4 PACKDIR=`uname -p`/`uname -r`.`uname -v`
5 RC=/usr/etc/rc.package
6 CDDIR=PACKAGES
7 CDMP=/mnt
8 CDPACK=${CDMP}/install/packages
9 CDSRC=${CDMP}/install/package-sources
10 SRC=/usr/bigsrc
11 LISTFILE=/etc/packages-$TAG
12 LISTURL=http://www.minix3.org/packages/$PACKDIR/List
13 TMPDIR=/usr/tmp/packages
14 mkdir -p $TMPDIR
15 URL1=http://www.minix3.org/packages/$PACKDIR
16 SRCURL1=http://www.minix3.org/software
17 PATH=/bin:/sbin:/usr/bin:/usr/sbin
18 pack=""
19 cdpackages=""
20 netpackages=""
21 cdmounted=""
23 if [ ! "$PAGER" ]
24 then PAGER=more
27 if [ "$1" = -y ]
28 then YESMODE=1
29 PAGER=cat
32 myread()
34 if [ "$YESMODE" ]
35 then echo "all"
36 else read ans
37 echo $ans
41 myexit()
43 if [ -n "$cdmounted" -a -n "$pack" ]
44 then
45 umount $pack || true
48 exit $1
51 # can we execute bunzip2?
52 if bunzip2 --help 2>&1 | grep usage >/dev/null
53 then BUNZIP2=bunzip2
54 else BUNZIP2=smallbunzip2
57 if id | fgrep "uid=0(" >/dev/null
58 then :
59 else echo "Please run $0 as root."
60 myexit 1
63 chmod 700 $TMPDIR
65 if [ -f "$RC" ]
66 then . "$RC"
69 cd /
71 # Make sure there is a $SRC dir
72 if [ ! -d "$SRC" ]
73 then mkdir $SRC || myexit 1
76 # Is there a usable CD to install packages from?
77 if [ -n "$cddrive" ]
78 then pack=${cddrive}p2
79 umount $pack >/dev/null 2>&1 || true
80 echo "Checking for CD in $pack."
81 if mount -r $pack $CDMP 2>/dev/null
82 then fn="$CDPACK/List"
83 echo "Found."
84 cdmounted=1
85 cdpackages=$fn
86 if [ ! -f $cdpackages ]
87 then cdpackages=""
88 echo "No package list found on CD in $fn."
90 else echo "Not found."
92 else echo "Don't know where the install CD is. You can set it in $RC."
95 TMPF=$TMPDIR/.list.$$
96 rm -f $TMPF
97 rm -f $TMPDIR/.* # Remove any remaining .postinstall script or .list*
99 # Check for network packages too
100 if ( : </dev/tcp ) 2>/dev/null
101 then echo -n "Update package list from network? (Y/n) "
102 y=`myread`
103 if [ "$y" != n -a "$y" != N ]
104 then echo "Fetching package list from $LISTURL."
105 urlget $LISTURL >$TMPF && mv $TMPF $LISTFILE || echo "Update not successful."
107 netpackages=$LISTFILE
108 if [ ! -f "$netpackages" -o ! `cat "$netpackages" 2>/dev/null | wc -l | awk '{ print $1 }'` -gt 1 ]
109 then netpackages=""
111 else echo "No working network detected."
114 # Is there at least one package type?
115 if [ ! -n "$netpackages" -a ! -n "$cdpackages" ]
116 then echo "No packages found."
117 myexit 1
120 # Is there more than one package type?
121 if [ -n "$netpackages" -a -n "$cdpackages" ]
122 then echo -n "Would you like to install from (C)D or (N)etwork? [C] "
123 whichsrc=`myread`
124 if [ "$whichsrc" = N -o "$whichsrc" = n ]
125 then unset cdpackages
126 else unset netpackages
130 if [ -n "$netpackages" ]
131 then source=net
132 else source=cdrom
135 cont=y
136 while [ "$cont" = y ]
137 do cd $TMPDIR
138 echo ""
139 echo "Showing you a list of packages using $PAGER. Press q when"
140 echo "you want to leave the list."
141 echo -n "Press RETURN to continue.."
142 xyzzy=`myread`
143 echo "Package list:"
144 ( echo "No.|Package|Description"
146 if [ -f "$netpackages" -a "$source" = net ]
147 then cat $netpackages
149 if [ -f "$cdpackages" -a "$source" = cdrom ]
150 then cat $cdpackages
152 ) | sort -f -t'|' +0 | awk '{ n++; printf "%d|%s\n", n, $0 }'
153 ) >$TMPF
154 highest="`wc -l $TMPF | awk '{ print $1 - 1 }'`"
155 awk -F'|' <$TMPF '{ printf "%3s %-15s %s\n", $1, $2, $3 }' | $PAGER
156 echo "Format examples: '3', '3,6', '3-9', '3-9,11-15', 'all'"
157 echo -n "Package(s) to install (RETURN or q to exit)? "
158 packnolist=`myread`
159 if [ "$packnolist" = "" -o "$packnolist" = "q" ]
160 then myexit 0
162 if [ "$packnolist" = all ]
163 then packnolist=1-$highest
165 IFS=','
166 set $packnolist
167 echo -n "Get source(s) too? (y/N) "
168 getsources=`myread`
169 for packrange in $packnolist
171 # Get a-b range.
172 IFS='-'
173 set $packrange
174 start=$1
175 if [ $# = 2 ]
176 then end=$2
177 else end=$1
179 IFS=' '
180 # use awk to make the range list
181 for packno in `awk </dev/null "BEGIN { for(i=$start; i<=$end; i++) { printf \"%d \", i } }"`
183 ok=y
184 pat="^$packno|"
185 if [ "`grep -c $pat $TMPF`" -ne 1 ]
186 then if [ "$packno" ]
187 then echo "$packno: Wrong package number."
189 ok=n
191 if [ $ok = y ]
192 then
193 packagename="`grep $pat $TMPF | awk -F'|' '{ print $2 }'`"
194 file=$packagename.tar.bz2
196 echo ""
198 if [ -f $file -a ! "$YESMODE" ]
199 then echo "Skipping $file - it's already in $TMPDIR."
200 echo "Remove that file if you want to re-retrieve and install this package."
201 else
202 case $source in
203 net*) echo "Retrieving $packno ($packagename) from primary location into $TMPDIR .."
204 srcurl=""
205 if urlget $URL1/$file >$file
206 then echo "Retrieved ok. Installing .."
207 packit $file && echo Installed ok.
208 srcurl=$SRCURL1/$file
209 else echo "Retrieval failed."
211 if [ "$getsources" = y -o "$getsources" = Y ]
212 then ( cd $SRC || myexit 2
213 srcfile=${packagename}-src.tar.bz2
214 echo "Retrieving source from $srcurl .."
215 urlget $srcurl >$srcfile || myexit 3
216 echo "Source retrieved in $SRC/$srcfile."
217 $BUNZIP2 -dc $srcfile | tar xf - >/dev/null || myexit 3
218 echo "Source unpacked in $SRC."
222 cdrom*)
223 if [ -f $CDPACK/$file ]
224 then echo "Installing from $CDPACK/$file .."
225 packit $CDPACK/$file && echo Installed ok.
226 else echo "$CDPACK/$file not found."
228 srcfile=$CDSRC/${packagename}.tar.bz2
229 if [ -f $srcfile -a "$getsources" = y ]
230 then
231 ( cd $SRC || myexit 2
232 $BUNZIP2 -dc $srcfile | tar xf - || myexit 3
233 echo "Source $srcfile unpacked in $SRC."
237 esac
239 else cont=n
241 done # Iterate package range
242 done # Iterate package range list
243 done
245 rm -f $TMPDIR/.* # Remove any remaining .postinstall script or .list*
246 myexit 0