3 # $NetBSD: pkg.sh,v 1.2 2002/07/26 13:15:28 agc Exp $
6 # Copyright (c) 2002 Alistair G. Crooks. All rights reserved.
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
11 # 1. Redistributions of source code must retain the above copyright
12 # notice, this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 # notice, this list of conditions and the following disclaimer in the
15 # documentation and/or other materials provided with the distribution.
16 # 3. All advertising materials mentioning features or use of this software
17 # must display the following acknowledgement:
18 # This product includes software developed by Alistair G. Crooks
19 # for the NetBSD project.
20 # 4. The name of the author may not be used to endorse or promote
21 # products derived from this software without specific prior written
24 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
25 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
28 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
30 # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76 chmodprog=/usr/bin/chmod
79 mkdirprog=/usr/bin/mkdir
81 sedprog=/usr/xpg4/bin/sed
97 if test -d $PKG_DBDIR/$1; then
100 d="`echo $PKG_DBDIR/${1}-*`"
105 case "$DIGESTPROG" in
106 "") DIGESTPROG=/usr/pkg/bin/digest ;;
109 "") PKG_DBDIR=/var/db/pkg ;;
111 case "$PKG_DIGEST" in
112 "") PKG_DIGEST=sha1 ;;
115 ALLDIGESTS="sha1 sha512"
118 *pkg_create) cmd=create ;;
119 *pkg_delete) cmd=delete ;;
120 *pkg_info) cmd=info ;;
121 *pkg.sh|*pkg) cmd=$1; shift ;;
126 if [ $# -lt 1 ]; then
127 echo "Usage: pkg create ..." > /dev/stderr
131 BUILDINFOFILE="" # done
132 BUILDVERSIONFILE="" # done
135 DISPLAYFILE="" # done
140 installfile="" # done
141 deinstallfile="" # done
150 allsizefile="" # done
151 thissizefile="" # done
155 while [ $# -gt 0 ]; do
157 -B) BUILDINFOFILE="$2"; shift ;;
158 -C) CONFLICTS="$2"; shift ;;
159 -D) DISPLAYFILE="$2"; shift ;;
160 -I) realprefix="$2"; shift ;;
161 -L) srcdir="$2"; shift ;;
163 -P) PREREQS="$PREREQS $2"; shift ;;
165 -S) allsizefile="$2"; shift ;;
166 -U) updatefilecache=no ;;
167 -V) echo $version; exit 0 ;;
168 -X) excludefrom="$excludefrom $2"; shift ;;
169 -b) BUILDVERSIONFILE="$2"; shift ;;
171 -*) comment="`echo $2 | $sedprog -e 's|^-||'`"; shift ;;
172 *) comment=`$catprog $2` ;;
175 -d) DESCRFILE=$2; shift ;;
176 -f) plist="$2"; shift ;;
178 -i) installfile="$2"; shift ;;
179 -k) deinstallfile="$2"; shift ;;
180 -l) relsymlinks=yes ;;
181 -m) mtreefile="$2"; shift ;;
182 -p) PREFIX="$2"; shift ;;
183 -r) requirements="$2"; shift ;;
184 -s) thissizefile="$2"; shift ;;
195 if [ ! -d $PKG_DBDIR/$PKGNAME ]; then
196 $mkdirprog $PKG_DBDIR/$PKGNAME
199 if [ -f "$BUILDINFOFILE" ]; then
200 $cpprog $BUILDINFOFILE $PKG_DBDIR/$PKGNAME/+BUILD_INFO
202 if [ -f "$BUILDVERSIONFILE" ]; then
203 $cpprog $BUILDVERSIONFILE $PKG_DBDIR/$PKGNAME/+BUILD_VERSION
205 echo $comment > $PKG_DBDIR/$PKGNAME/+COMMENT
206 $cpprog $DESCRFILE $PKG_DBDIR/$PKGNAME/+DESC
208 case "$installfile" in
210 *) $cpprog $installfile $PKG_DBDIR/$PKGNAME/+INSTALL ;;
212 case "$deinstallfile" in
214 *) $cpprog $deinstallfile $PKG_DBDIR/$PKGNAME/+DEINSTALL ;;
216 case "$DISPLAYFILE" in
218 *) $cpprog $DISPLAYFILE $PKG_DBDIR/$PKGNAME/+DISPLAY ;;
220 case "$allsizefile" in
222 *) $cpprog $allsizefile $PKG_DBDIR/$PKGNAME/+SIZE_ALL ;;
224 case "$thissizefile" in
226 *) $cpprog $thissizefile $PKG_DBDIR/$PKGNAME/+SIZE_PKG ;;
229 export PREFIX PKGNAME CONFLICTS PREREQS DIGESTPROG PKG_DIGEST
233 if (ENVIRON["CONFLICTS"] != "") {
234 cflc = split(ENVIRON["CONFLICTS"], cflv);
235 for (i = 1 ; i <= cflc ; i++)
236 printf("@pkgcfl %s\n", cflv[i])
238 if (ENVIRON["PREREQS"] != "") {
239 prec = split(ENVIRON["PREREQS"], prev);
240 for (i = 1 ; i <= prec ; i++)
241 printf("@pkgdep %s\n", prev[i])
243 prefix = ENVIRON["PREFIX"];
244 printf("@name %s\n@cwd %s\n", ENVIRON["PKGNAME"], prefix) }
245 /^@(comment|dirrm|src)/ { print $0; next }
246 /^@(un)?exec/ { last = filename; gsub(".*/", "", last); gsub("%f", last);
247 fc = split(filename, fv, "/"); fn = prefix; for (i = 1 ; i < fc ; i++) fn = fn "/" fv[i]; gsub("%B", fn);
248 gsub("%F", filename);
249 gsub("%D", prefix); print $0; next }
250 { filename = $0; printf("%s\n@comment MD5:", $0); cmd = sprintf("'$catprog' %s/%s | %s %s", prefix, $0, ENVIRON["DIGESTPROG"], ENVIRON["PKG_DIGEST"]); system(cmd) }
251 ' < $plist > $PKG_DBDIR/$PKGNAME/+CONTENTS
253 # construct the digests of all the metafiles
254 echo "#! /bin/sh" > $PKG_DBDIR/$PKGNAME/+VERIFY
255 echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
256 echo 'case $# in' >> $PKG_DBDIR/$PKGNAME/+VERIFY
257 echo '0) ;;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
258 echo '*) cd '$PKG_DBDIR/$PKGNAME ';;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
259 echo 'esac' >> $PKG_DBDIR/$PKGNAME/+VERIFY
260 echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
261 echo "$awkprog '" >> $PKG_DBDIR/$PKGNAME/+VERIFY
262 echo 'BEGIN { ex = 0 }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
263 echo 'END { exit(ex) }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
264 echo '/^@cwd/ { prefix = $2; next }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
265 echo '/^@/ { next }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
266 echo ' {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
267 echo ' for (done = 0 ; !done ; ) {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
268 echo ' filename = prefix "/" $0;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
269 echo ' getline;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
270 echo ' if ($0 ~ /^@comment (MD5|SHA1):/) {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
271 echo ' alg = dig = $2;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
272 echo ' gsub(":.*", "", alg);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
273 echo ' gsub("[A-Za-z0-9]*:", "", dig);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
274 echo ' cmd = sprintf("s=`'$catprog' %s | '$DIGESTPROG' %s`; if test \"%s\" != \"$s\"; then echo \"Checksum mismatch (%s): expected %s, got $s\"; fi", filename, alg, dig, filename, dig);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
275 echo ' if (system(cmd) != 0) ex = 1' >> $PKG_DBDIR/$PKGNAME/+VERIFY
276 echo ' done = 1;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
277 echo ' }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
278 echo ' }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
279 echo "}' +CONTENTS" >> $PKG_DBDIR/$PKGNAME/+VERIFY
280 echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
281 echo "$awkprog '" >> $PKG_DBDIR/$PKGNAME/+VERIFY
282 echo "BEGIN { ex = 0 }" >> $PKG_DBDIR/$PKGNAME/+VERIFY
283 echo "END { exit(ex) }" >> $PKG_DBDIR/$PKGNAME/+VERIFY
284 echo " {" >> $PKG_DBDIR/$PKGNAME/+VERIFY
285 echo 'cmd = sprintf("s=`'$catprog' %s | '$DIGESTPROG' %s`; if test \"%s\" != \"$s\"; then echo \"Checksum mismatch (%s): expected %s, got $s\"; fi", $1, $2, $3, $1, $3);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
286 echo "if (system(cmd) != 0) ex = 1" >> $PKG_DBDIR/$PKGNAME/+VERIFY
287 echo "}' << filesEOF" >> $PKG_DBDIR/$PKGNAME/+VERIFY
288 # construct the digests of all the metafiles
289 for f in +BUILD_INFO +BUILD_VERSION +COMMENT +CONTENTS +DEINSTALL +DESC +DISPLAY +INSTALL +SIZE_ALL +SIZE_PKG; do
290 if [ -f $PKG_DBDIR/$PKGNAME/$f ]; then
291 for dig in $ALLDIGESTS; do
292 echo "$f $dig `$catprog $PKG_DBDIR/$PKGNAME/$f | $DIGESTPROG $dig`" >> $PKG_DBDIR/$PKGNAME/+VERIFY
296 echo "filesEOF" >> $PKG_DBDIR/$PKGNAME/+VERIFY
297 $chmodprog 0755 $PKG_DBDIR/$PKGNAME/+VERIFY
299 # change absolute symlinks to relative ones
300 case "$relsymlinks" in
301 yes) for f in `$awkprog '
302 $1 == "prefix" { prefix = $2; next }
303 $1 == "file" { printf("%s/%s\n", prefix, $0) }
304 ' < $PKG_DBDIR/$PKGNAME/+INVENTORY`; do
306 target="`ls -al $1 | awk '{ print $11 }'`"
308 /*) echo $prefix $target $f | /usr/bin/awk '
310 pc = split($1, pv, "/");
311 tc = split($2, tv, "/");
312 for (i = tc - pc + 2 ; i <= tc ; i++)
313 linkname = linkname "../";
314 for (i = pc + 1 ; i <= tc ; i++)
315 linkname = linkname "/" tv[i];
316 cmd = sprintf("'$rmprog' -f %s && '$lnprog' -s %s %s", $3, linkname, $3);
336 while [ $# -gt 0 ]; do
343 -p) prefix=$2; shift ;;
351 if [ -f $d/+REQUIRED_BY ]; then
360 no) echo "pkg_delete: package $pkg is required by other packages:"
361 $catprog $d/+REQUIRED_BY
362 echo "pkg_delete: 1 package deletion failed"
368 yes) if [ -f $d/+VERIFY ]; then
399 if [ $# -eq 0 ]; then
402 while [ $# -gt 0 ]; do
411 -a) allpackages=yes ;;
412 -b) buildversion=yes ;;
428 yes) echo $version; exit 0 ;;
431 yes) echo "-F is unimplemented" ;;
434 yes) echo "-e is unimplemented" ;;
436 case "$allpackages" in
437 yes) pkglist="`(cd $PKG_DBDIR; ls -d *-*)`" ;;
440 for pkg in $pkglist; do
443 yes) $catprog $d/+BUILD_INFO ;;
446 yes) if [ -f $d/+DISPLAY ]; then
451 yes) echo "`echo $d | $sedprog -e 's|.*/||'` `$catprog $d/+COMMENT`" ;;
455 /^@cwd/ { prefix = $2 }
457 { printf("%s/%s\n", prefix, $0) }
460 case "$buildversion" in
461 yes) $catprog $d/+BUILD_VERSION ;;
464 yes) $catprog $d/+COMMENT ;;
467 yes) $catprog $d/+DESC ;;
470 yes) if [ -f $d/+INSTALL ]; then
475 yes) if [ -f $d/+DEINSTALL ]; then
476 $catprog $d/+DEINSTALL
480 yes) $awkprog '/^@pkgdep/ { print $2 }' < $d/+CONTENTS ;;
483 yes) $awkprog '/^@cwd/ { print $2; exit }' < $d/+CONTENTS ;;
486 yes) if [ -f $d/+REQUIRED_BY ]; then
487 $catprog $d/+REQUIRED_BY
491 yes) $catprog $d/+SIZE_ALL
494 yes) $catprog $d/+SIZE_PKG
500 if [ $# -lt 1 ]; then
501 echo "Usage: pkg show type packages" > /dev/stderr
510 "") echo "No such package ($pkg)" ;;
514 $catprog $d/+SIZE_ALL ;;
516 $awkprog '/^@blddep/ { print $2 }' $d/+CONTENTS ;;
518 $catprog $d/+COMMENT ;;
519 description|desc|descr)
522 if [ -f $d/+DEINSTALL ]; then
523 $catprog $d/+DEINSTALL
526 if [ -f $d/+DISPLAY ]; then
531 /^@cwd/ { prefix = $2 }
533 { printf("%s/%s\n", prefix, $0) }
536 echo "`echo $d | $sedprog -e 's|.*/||'` `$catprog $d/+COMMENT`" ;;
538 $catprog $d/+BUILD_INFO ;;
540 if [ -f $d/+INSTALL ]; then
544 $awkprog '/^@cwd/ { print $2 }' $d/+CONTENTS ;;
546 $awkprog '/^@pkgdep/ { print $2 }' $d/+CONTENTS ;;
548 $catprog $d/+SIZE_PKG ;;
550 $catprog $d/+BUILD_VERSION ;;
552 echo "Unknown type \"$showtype\""
564 *) echo "$0: \"$cmd\" not found"