diff options
author | dmcmahill <dmcmahill@pkgsrc.org> | 2001-04-27 18:16:41 +0000 |
---|---|---|
committer | dmcmahill <dmcmahill@pkgsrc.org> | 2001-04-27 18:16:41 +0000 |
commit | 3dd01e2422eecae4d8a1bd549e4cf375cae1842f (patch) | |
tree | 44b569fb94b433380ff8d5026e3f4a8849e2f796 | |
parent | 3e3f919615726846b00b69f85fbe4d1092d15d03 (diff) | |
download | pkgsrc-3dd01e2422eecae4d8a1bd549e4cf375cae1842f.tar.gz |
initial import of cdpack-1.0
cdpack is a small utility for creating ISO 9660 images for
a multi-CD binary package collection. The utility creates
ISO 9660 images for all the binary packages in a specified
directory. A choice of two algorithms is available for how
the packages are grouped. The "no duplication" algorithm
arranges the packages so any package on CD number `n' will
have all of its dependencies on CD numbers 1 through `n'.
The "no inter-CD depends" algorithm will place certain
packages on more than one CD to ensure that each CD is self
contained (all package dependencies are satisfied within
the single CD).
-rw-r--r-- | pkgtools/cdpack/Makefile | 44 | ||||
-rwxr-xr-x | pkgtools/cdpack/files/cdgen.awk | 426 | ||||
-rw-r--r-- | pkgtools/cdpack/files/cdpack.1 | 129 | ||||
-rwxr-xr-x | pkgtools/cdpack/files/cdpack.sh | 384 | ||||
-rw-r--r-- | pkgtools/cdpack/pkg/DESCR | 11 | ||||
-rw-r--r-- | pkgtools/cdpack/pkg/PLIST | 5 |
6 files changed, 999 insertions, 0 deletions
diff --git a/pkgtools/cdpack/Makefile b/pkgtools/cdpack/Makefile new file mode 100644 index 00000000000..26c09699799 --- /dev/null +++ b/pkgtools/cdpack/Makefile @@ -0,0 +1,44 @@ +# $NetBSD: Makefile,v 1.1.1.1 2001/04/27 18:16:41 dmcmahill Exp $ +# + +DISTNAME= cdpack-1.0 +CATEGORIES= pkgtools +MASTER_SITES= # empty +DISTFILES= # empty + +MAINTAINER= dmcmahill@netbsd.org +HOMEPAGE= http://www.netbsd.org +COMMENT= utility to create and multi-cd binary package collections + +# for mkisofs +DEPENDS+= cdrecord-*:../../sysutils/cdrecord + +WRKSRC= ${WRKDIR} +NO_CHECKSUM= yes +NO_PATCH= yes +NO_CONFIGURE= yes + +.include "../../mk/bsd.prefs.mk" + +.if ${OPSYS} == "SunOS" +# This doesn't create readable manual pages. "mandoc" should be added +# to zoularis. +NROFF= nroff -man +.else +NROFF= nroff -mandoc +.endif + +do-build: + ${SED} -e 's;@prefix@;${PREFIX};g' \ + -e 's;@progver@;${PKGVERSION};g' ${FILESDIR}/cdpack.sh > \ + ${WRKDIR}/cdpack + ${CHMOD} 755 ${WRKDIR}/cdpack + ${NROFF} ${FILESDIR}/cdpack.1 > ${WRKSRC}/cdpack.0 + +do-install: + ${INSTALL_SCRIPT} ${WRKSRC}/cdpack ${PREFIX}/bin + ${INSTALL_SCRIPT} ${FILESDIR}/cdgen.awk ${PREFIX}/libexec + ${INSTALL_MAN} ${FILESDIR}/cdpack.1 ${PREFIX}/man/man1 + ${INSTALL_MAN} ${WRKSRC}/cdpack.0 ${PREFIX}/man/cat1 + +.include "../../mk/bsd.pkg.mk" diff --git a/pkgtools/cdpack/files/cdgen.awk b/pkgtools/cdpack/files/cdgen.awk new file mode 100755 index 00000000000..9c460e80b10 --- /dev/null +++ b/pkgtools/cdpack/files/cdgen.awk @@ -0,0 +1,426 @@ +#!/usr/bin/awk -f +# $NetBSD: cdgen.awk,v 1.1.1.1 2001/04/27 18:16:42 dmcmahill Exp $ +# +# Copyright (c) 2001 Dan McMahill, All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Dan McMahill +# 4. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY DAN MCMAHILL +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +BEGIN { + +# ARGV[0] = program name +# ARGV[1] = packages directory (/usr/pkgsrc/packages/All) +# ARGV[2] = output directory +# ARGV[3] = Depends tree file. Has packages in tsort(1) input format. +# ARGV[4] = Depends order file. Has packages in tsort(1) output format. +# ARGV[5] = CD list. This script leaves a list of the CD directories in this file +# ARGV[6] = dup flag. "dup=yes" for package duplication, "dup=no" for no duplication. +# ARGV[7] = verbose flag. "verbose=yes" for verbose output +# ARGV[8] = xtra_size. How many kB are needed per CD for common files + + if (ARGC != 9){ + printf("%s: wrong number of arguments\n",ARGV[0]); + usage(); + exit(1); + } + + prog = "cdgen.awk"; + packages = ARGV[1]; + cddir = ARGV[2]; + deptree = ARGV[3]; + order = ARGV[4]; + cdlist = ARGV[5]; + xtra_size= ARGV[8]; + + if (ARGV[6] ~ "dup=yes"){ + dup=1; + } + else{ + dup=0; + } + if (ARGV[7] ~ "verbose=yes"){ + verbose=1; + } + else{ + verbose=0; + } + +# +# Make sure all required directories and files exist +# + cmd="test -d " packages ; + if(system(cmd) != 0){ + printf("%s: packages directory \"%s\" does not exist\n",prog,packages); + usage(); + exit(1); + } + + cmd="test -d " cddir ; + if(system(cmd) != 0){ + printf("%s: cd image directory \"%s\" does not exist\n",prog,cddir); + usage(); + exit(1); + } + + cmd="test -f " deptree ; + if(system(cmd) != 0){ + printf("%s: dependstree file \"%s\" does not exist\n",prog,deptree); + usage(); + exit(1); + } + + cmd="test -f " order ; + if(system(cmd) != 0){ + printf("%s: build order file \"%s\" does not exist\n",prog,order); + usage(); + exit(1); + } + + + now = strftime("%a %b %d %H:%M:%S %Z %Y"); + printf("%s starting %28s\n",prog,now); + +# +# Read in the build order. This gives the list of all possible +# packages (note that some may actually not be available as binary +# packages). The order is such that a package earlier in the list +# will never depend on a package lower on the list. +# + + printf("Reading the depends order from \"%s\".\n",order); + n=1; + while(getline < order > 0){ + pkgorder[n] = $1; + n++; + } + close(order); + npkgs = n-1; + printf("%d packages to go on CD-ROM!\n",npkgs); + + +# +# Read in the depends tree and flatten it. +# + printf("Reading depends tree\n"); + while(getline < deptree > 0){ + if ($2 in topdepends) + topdepends[$2] = topdepends[$2] " " $1 " " ; + else + topdepends[$2] = " " $1 " " ; + } + close(deptree); + +# Now recurse the tree to give a flattened depends list for each pkg + printf("Flattening depends tree\n"); + for (toppkg in topdepends){ + find_all_depends(toppkg); + } + + +# +# Next get the sizes of each of the binary pacakges if they +# exist. For those which don't exist, make a note of that. +# getsize() returns size in kB if the file exists, 0 otherwise. +# + printf("Loading binary package sizes\n"); + nonzero=0; + totsize=0; + for (n in pkgorder){ + pkgsize[pkgorder[n]] = getsize(pkgorder[n]); + if(pkgsize[pkgorder[n]] > 0){ + nonzero++; + } + else{ + printf("WARNING: binary package \"%s\" has zero size\n",pkgorder[n]); + } + totsize = totsize + pkgsize[pkgorder[n]]; + } + printf("%d binary packages are available (%g Mb)!\n",nonzero,totsize/1024); + +# +# Now we need to figure out which binary packages go on each +# CD. The way we'll do this is start taking packages in the order +# specified by 'pkgorder' until the first CD is full, then move +# to the second, etc. This way, we never have to reinsert a CD +# while installing pkgs. +# + printf("Figuring out which packages go on each CD\n"); + +# maximum kB for binary pkgs per CD. + maxcd=1024*620; + +# +# no package duplication +# + if (!dup){ + cdn=1; + pkgn=0; + cdtot[cdn]=xtra_size; + cdpkgs[cdn]=0; + + for (n=1; n<=npkgs ; n=n+1){ +# only process the package if it exists. + if (pkgsize[pkgorder[n]] > 0){ + if (cdtot[cdn] < (maxcd-pkgsize[pkgorder[n]]) ){ + cdtot[cdn] = cdtot[cdn] +pkgsize[pkgorder[n]]; + cdcontents[cdn":"pkgorder[n]] = 1; + pkgn = pkgn + 1; + } + else{ +# the CD is full + printf("cd number %d is full (%g Mb)\n",cdn, + cdtot[cdn]/1024); + cdpkgs[cdn] = pkgn; +# increment the CD counter + cdn = cdn + 1; + pkgn = 1; + cdtot[cdn] = xtra_size + pkgsize[pkgorder[n]]; + cdcontents[cdn":"pkgorder[n]] = 1; + } + } + } + cdpkgs[cdn] = pkgn; + printf("cd number %d is partially full (%g Mb)\n",cdn, + cdtot[cdn]/1024); + } + +# +# We will duplicate some packages to eliminate inter-CD dependencies. +# + else{ + cdn=1; + pkgn=0; + cdtot[cdn]=xtra_size; + cdpkgs[cdn]=0; + n=npkgs; + while (n > 0){ + if ( !pkg_done[pkgorder[n]]){ + size_needed = pkgsize[pkgorder[n]]; + deps_needed = 0; + split(alldepends[pkgorder[n]],pkgdeps); + for (dep in pkgdeps){ + if(!cdcontents[cdn":"pkgdeps[dep]]){ + size_needed = size_needed + pkgsize[pkgdeps[dep]]; + deps_needed++; + } + } + if (cdtot[cdn] + size_needed < maxcd){ + cdcontents[cdn":"pkgorder[n]] = 1; + pkg_done[pkgorder[n]] = 1; + for (dep in pkgdeps){ + cdcontents[cdn":"pkgdeps[dep]] = 1; + pkg_done[pkgdeps[dep]] = 1; + } + cdtot[cdn] = cdtot[cdn] + size_needed; + n--; + pkgn = pkgn + 1 + deps_needed; + } + else{ +# the CD is full + printf("cd number %d is full (%g Mb)\n",cdn, + cdtot[cdn]/1024); + cdpkgs[cdn] = pkgn; + cdn++; + cdtot[cdn] = xtra_size; + pkgn = 0; + } + } + else{ +# we've already done this pkg + n--; + } + + } + cdpkgs[cdn] = pkgn; + printf("cd number %d is partially full (%g Mb)\n",cdn, + cdtot[cdn]/1024); + } + +# remember how many cd's there are + ncd=cdn; + +# print some stats + if (dup){ + tot_cdpkgs=0; + for (cdn=1; cdn<=ncd; cdn=cdn+1){ + tot_cdpkgs = tot_cdpkgs + cdpkgs[cdn]; + } + printf("CD images with package duplication resulted in %d packages total\n",tot_cdpkgs); + printf("This is an increase of %d over the base %d packages\n",tot_cdpkgs-npkgs,npkgs); + } + +# +# Next, create a subdirectory for each CD and populate the directory +# with links to the actual binary pkgs +# + printf("Creating subdirectories for each CD and populating it with links\n"); + printf("to the binary packages and other required files.\n"); + for (cdn=1; cdn<=ncd; cdn=cdn+1){ + printf("----------- CD #%d ----------\n",cdn); + printf(" %3d binary packages\n",cdpkgs[cdn]); + outdir=cddir "/cd" cdn "/packages/All"; + cmd="test -d " outdir; + if(system(cmd) == 0){ + printf("%10s: output dir \"%s\" already exists.\n",prog,outdir); + printf("%10s please remove it.\n",""); + exit(1); + } + +# create output directory + cmd = "mkdir -p " outdir; + do_system(cmd); + +# populate it with the symlinks to the binary packages + for (n=1; n<=npkgs; n++){ + if (cdcontents[cdn":"pkgorder[n]]){ + cmd = "cd " outdir " && ln -s " packages "/" ; + cmd = cmd pkgorder[n] ".tgz"; + do_system(cmd); + } + } + +# add it to the cd list + printf("cd%d\n",cdn) > cdlist ; + + } + + close(cdlist); + + now = strftime("%a %b %d %H:%M:%S %Z %Y"); + printf("%s finished on %28s\n",prog,now); + + printf("\n"); + + exit 0 + } + +function getsize(name,cmd,sz){ + + cmd="test -f " packages "/" name ".tgz"; + if(system(cmd) == 0){ + cmd="du -k " packages "/" name ".tgz"; + cmd | getline ; + close(cmd); + sz=$1; + } + else{ + sz=0; + } + + return(sz); +} + +function do_system(cmd,rv){ + rv = system(cmd); + if (rv != 0){ + printf("Error: system(\"%s\") returned %d\n",cmd,rv); + exit(1); + } + return(0); +} + +# +# show usage +# +function usage(){ + printf("\nUsage:\n\n"); + printf("%10s -- Create directories for building binary package ISO images\n", + prog,prog); + printf("%10s packages images dependstree order cdlist\n",""); + printf("\n"); + printf("\n"); + +} + + +function find_all_depends(pkg,pkgreg,i,deps){ +# if we find the package already has been fully depended +# then return the depends list + if (pkg in alldepends){ +# printf("\t%s is already depended.\n",pkg); + return(alldepends[pkg]); + } + +# if we find the package listed in its own depends list, then +# return an empty list if we're going down the depends tree. +# When a package lists itself in the depends tree file, it simply +# is a place holder and means the package has no depends. However +# other packages may still depend upon it, so we need to keep looking. + if ( topdepends[pkg]~reg2str(pkg) ){ +# printf("\t%s depends on its self.\n",pkg); + alldepends[pkg] = " "; + return(alldepends[pkg]); + } + +# otherwise recursively gather depends that each of the depends +# has + pkgreg=reg2str(pkg); + split(topdepends[pkg],deps); + i=1; + alldepends[pkg] = " "; + while ( i in deps ){ +# don't add ourselves to the list (a possibility when going up the tree) + if (" "deps[i]" "!~pkgreg){ + alldepends[pkg] = alldepends[pkg] " " deps[i] " " find_all_depends(deps[i]); + } + i=i+1; + } + alldepends[pkg] = uniq(alldepends[pkg]); + return(alldepends[pkg]); +} + +# +# take a string which has special characters like '+' in it and +# escape them. Also put a space before and after since that's how +# we'll distinguish things like gnome from gnome-libs +# +function reg2str(reg){ + gsub(/\+/,"\\\+",reg); + gsub(/\./,"\\\.",reg); + reg = " "reg" "; + return(reg); +} + +# +# take the depends lists and uniq them. +# +function uniq(list,deps,i,ulist){ + +# split out the depends + split(list,deps); + + i=1; + ulist = " "; + while (i in deps){ + if (ulist !~reg2str(deps[i])){ + ulist = ulist deps[i]" "; + } + i++; + } + return(ulist); +} diff --git a/pkgtools/cdpack/files/cdpack.1 b/pkgtools/cdpack/files/cdpack.1 new file mode 100644 index 00000000000..3c504c0ac05 --- /dev/null +++ b/pkgtools/cdpack/files/cdpack.1 @@ -0,0 +1,129 @@ +.\" $NetBSD: cdpack.1,v 1.1.1.1 2001/04/27 18:16:42 dmcmahill Exp $ +.\" +.\" Copyright (c) 2001 Dan McMahill, All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by Dan McMahill +.\" 4. The name of the author may not be used to endorse or promote +.\" products derived from this software without specific prior written +.\" permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY DAN MCMAHILL +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +.\" POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd April 25, 2001 +.Dt CDPACK 1 +.Os NetBSD +.Sh NAME +.Nm cdpack +.Nd produce multi-CD binary package images +.Sh SYNOPSIS +.Nm "" +.Op -nvV +.Op -x extra_directory +.Ar packages_directory +.Ar cd_image_directory +.Sh DESCRIPTION +The +.Nm +utility produces ISO 9660 image files for +a multiple CD-ROM collection of binary packages. +.Pp +The +.Nm +utility extracts the dependency information from the binary +packages in the directory +.Ar packages_directory +specified on the command line. The dependency information is +used to determine which packages are placed on which CD. The +directory +.Ar cd_image_directory +is used as a staging area and the final ISO 9660 images are left in +that directory. A file, +.Ar README.txt +, will be left in the root of each CD image along with an index +file +.Ar .index +which lists the contents of each CD. +.Bl -tag -width "-x directory " +.It Fl n +Do not duplicate packages in order to prevent inter-CD dependencies. +The default without the +.Fl n +option will place a package and all of its dependencies on the same +CD. If a particular package is also required by pacakges on other +CD's, it will be placed there as well. +When the +.Fl n +option is used packages are not duplicated. This results in slightly +smaller ISO 9660 images. +.Nm +places packages which are lower in the dependency tree on lower +numbered CD-ROM's and packages which are higher on the higher numbered +CD-ROM's. In this fashion, a package on CD number n +will have all of its dependencies on CD numbers 1 through n +.It Fl v +Be verbose. Currently does not change things much. +.It Fl V +Print the program version number and exit. +.It Fl x Ar directory +Includes the contents of +.Ar directory +on each CD. +.El +.Pp +The +.Nm +utility exits 0 on success, and >0 if an error occurs. +.Sh EXAMPLES +This example takes all of the binary packages found in +/usr/pkgsrc/packages/All and creates cd images in +/u2/cdimages/cd{1,2,...}.iso. The directories +/u2/cdimages/cd{1,2,...} are used to create the ISO 9660 layouts. +.D1 cdpack /usr/pkgsrc/packages/All /u2/cdimages +.Pp +To include a common set of files on all CD's, place them in a +directory, /tmp/foo, in this example, and pass in the directory name +with the +.Fl x +option. +.Dl cdpack -x /tmp/foo /usr/pkgsrc/packages/All /u2/cdimages +.Sh ENVIRONMENT +.Nm +uses the fillowing environment variables if set. +.Bl -tag -width "TMPDIR" +.It Ev TMPDIR +Directory for holding temporary files during the image creation. +Defaults to +.Dq Li /tmp . +.El +.Sh SEE ALSO +.Xr mkisofs 1 +.Sh HISTORY +The +.Nm +utility first appeared in the +.Nx +packages collection in April, 2001. +.Sh AUTHOR +The +.Nm +utility was written by Dan McMahill (dmcmahill@netbsd.org). diff --git a/pkgtools/cdpack/files/cdpack.sh b/pkgtools/cdpack/files/cdpack.sh new file mode 100755 index 00000000000..1ff5c7abf66 --- /dev/null +++ b/pkgtools/cdpack/files/cdpack.sh @@ -0,0 +1,384 @@ +#!/bin/sh +# $NetBSD: cdpack.sh,v 1.1.1.1 2001/04/27 18:16:42 dmcmahill Exp $ +# +# Copyright (c) 2001 Dan McMahill, All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Dan McMahill +# 4. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY DAN MCMAHILL +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# $0 = program name +# $2 = packages directory (/usr/pkgsrc/packages/All) +# $3 = output directory + +prog=cdpack +progver=@progver@ + +TMPDIR=${TMPDIR:-/tmp} +TMP=${TMPDIR}/${prog}.$$ + +depf=$TMP/depf +depf2=$TMP/depf2 +deptree=$TMP/deptree +order=$TMP/order +cdlist=$TMP/cdlist +indexf=$TMP/indexf +readme=$TMP/readme +warnings=$TMP/warnings + +rm -fr $TMP +mkdir $TMP + +usage(){ + echo "$prog - generates ISO9660 images for a multi-cd binary package collection" + echo "Usage: $prog packages_directory cdimage_directory" + echo "Example: $prog /usr/pkgsrc/packages/netbsd-1.5/alpha/All /images/netbsd-1.5/alpha" +} + +clean_and_exit(){ + rm -fr $TMP + exit 1 +} + +DUP=yes +VERBOSE=no +VERSION=no +USE_XTRA=no + +while + test -n "$1" +do + case "$1" + in + # do not duplicate packages to avoid inter-CD dependencies + -n) DUP=no + shift + ;; + + # be verbose + -v) VERBOSE=yes + shift + ;; + + # display version + -V) VERSION=yes + shift + ;; + + # extra directory to go on each CD. + -x) extra=$2 + USE_XTRA=yes + shift 2 + ;; + + -*) echo "$prog: ERROR: $s is not a valid option" + usage + clean_and_exit + ;; + + *) ARGS="$ARGS $1" + shift + ;; + esac +done + +if [ $VERSION = "yes" ]; then + echo "$prog-$progver" + rm -fr $TMP + exit 0 +fi + +set -- $ARGS + +if [ $# -ne 2 ]; then + echo "$prog: wrong number of arguments" + usage + clean_and_exit +fi + +packages=$1 +cddir=$2 + +if [ $VERBOSE = "yes" ]; then + echo "Verbose output is on" +fi + +# +# Make sure all required directories and files exist +# + +if [ ! -d $packages ]; then + echo "$prog: packages directory \"$packages\" does not exist" + usage + clean_and_exit +fi + +if [ ! -d $cddir ]; then + echo "$prog: cd image directory \"$cddir\" does not exist" + usage + clean_and_exit +fi + +if [ "$USE_XTRA" = "yes" -a ! -d $extra ]; then + echo "$prog: extra directory \"$extra\" specified with -x does not exist" + usage + clean_and_exit +fi + +if [ "$USE_XTRA" = "yes" ]; then + case $extra in + /*) # do nothing, its an absolute path + ;; + *) extra=`pwd`/$extra + ;; + esac + XTRA_SIZE=`du -sk $extra | awk '{print $1}'` + if [ "$VERBOSE" = "yes" ]; then + echo "Extra directory full path name is \"$extra\". It contains $XTRA_SIZE kB." + fi +else + XTRA_SIZE=0 +fi + +echo " " +echo "$prog starting: `date`" +echo " " + +# +# go through all the binary packages and extract their run depends and +# also any package conflicts. +# +# $deptree = this file contains a tsort(1) run depends tree using +# binary package names. +# + +npkgs=0 +echo "Extracting all dependency information for the binary packages..." +for pkg in $packages/* +do + if [ -f $pkg ]; then + # extract the packge name + pkgname=`basename $pkg .tgz` + + # extract the packing list + cat $pkg | (cd $TMP; tar --fast-read -xzf - +CONTENTS) + + # extract the depends + deps=`awk '/^@pkgdep/ {printf("%s ",$2)}' $TMP/+CONTENTS` + + # extract any conflicts + cfls=`awk '/^@pkgcfl/ {printf("%s ",$2)}' $TMP/+CONTENTS` + + rm $TMP/+CONTENTS + + # store the results + echo "$pkgname | $deps | $cfls" >> $depf + + # also process all of the listed depends with + # 'pkg_admin lsbest' to handle glob patterns + bestdeps=" " + listed=no + if [ ! -z "$deps" ]; then + for dep in $deps + do + best=`/usr/sbin/pkg_admin lsbest "${packages}/${dep}"` + if [ ! -z "$best" ]; then + best=`basename $best .tgz` + bestdeps=$bestdeps" "$best + echo "$best $pkgname" >> $deptree + listed=yes + else + echo "WARNING: $pkgname depends on \"$dep\" which was not found" + echo "WARNING: $pkgname depends on \"$dep\" which was not found" >> $warnings + fi + done + fi + if [ "$listed" = "no" ]; then + # make sure we add ourselves to the tree if we have no depends or if the + # depends were not found + echo "$pkgname $pkgname" >> $deptree + fi + + echo "$pkgname | $bestdeps | $cfls" >> $depf2 + + npkgs=$(($npkgs + 1)) + else + # Don't bomb out on 1 package + echo "$prog: warning: $pkg not readable" + fi +done + +echo " " +echo "Finished extracting dependencies and conflicts for $npkgs binary packages" +echo " " + +# +# sort the packages in dependency order +# +mv $deptree ${deptree}.bak +sort -u ${deptree}.bak > ${deptree} +tsort $deptree > $order + +# +# Run the awk program which figures out which packages go on which CD. +# This program also creates subdirectories and populates them with +# links to the actual binary pacakges. +# +# packages = ARGV[1]; +# cddir = ARGV[2]; +# deptree = ARGV[3]; +# order = ARGV[4]; +# cdlist = ARGV[5]; +# +if [ "$VERBOSE" = "yes" ]; then + echo "awk -f cdgen.awk $packages $cddir $deptree $order $cdlist dup=$DUP" +fi +awk -f @prefix@/libexec/cdgen.awk $packages $cddir $deptree $order $cdlist dup=$DUP verbose=$VERBOSE $XTRA_SIZE + +if [ $? -ne 0 ]; then + echo "$prog: ERROR: cdgen.awk has failed" + clean_and_exit +fi + +# +# Generate a README +# +cat <<EOF > $readme +This CD-ROM collection contains NetBSD binary packages. For +information on the NetBSD package collection, please visit +http://www.netbsd.org/Documentation/software/packages.html. + +For more information about the NetBSD project, visit the +project homepage at http://www.netbsd.org + +EOF + +if [ "$DUP" = "yes" ]; then +cat <<EOF >> $readme +The packages on this CD have been arranged to eliminate all +inter-CD dependencies. In other words, each package on this +CD should have all of its dependencies (if they are allowed +to be provided on CD) present on the same CD. + +EOF +else + +cat <<EOF >> $readme +The packages on this CD have been arranged such that for a +given package on CD number n, all of the other required +packages are on CD number 1 through n. This allows the +user to make a single pass through the CD set when installing +a collection of packages. + +EOF +fi + +cat <<EOF >> $readme + +This README, along with the CD layout was created using the +cdpack program which is available as part of the NetBSD +packages collection at +ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/pkgtools/cdpack +. + +EOF + +# +# Generate an index file which lists the contents of each CD. +# + +echo "Creating CD Index File" + +for cdname in `cat $cdlist` +do + for pkg in ${cddir}/${cdname}/packages/All/* + do + echo "`basename $pkg` $cdname" >> $indexf + done +done +mv $indexf ${indexf}.tmp +sort ${indexf}.tmp > $indexf + +# +# Populate the cd's with the index file and readme +# actually copy these over since the originals will +# be deleted from their temporary directories +# +ncds=0 +for cdname in `cat $cdlist` +do + (cd ${cddir}/${cdname} && cp $indexf .index) + (cd ${cddir}/${cdname} && cp $readme README.txt) + + if [ $USE_XTRA = "yes" ]; then + for f in $extra/* + do + (cd ${cddir}/${cdname} && ln -sf $f) + done + fi + + ncds=$(($ncds + 1)) +done + +# +# Create the ISO Images +# +volid=PackagesCD +#mkisofs_flags="-f -l -r -J -L -volset-size $ncds -V $volid " +mkisofs_flags="-f -l -r -J -L " + +echo "Creating the ISO images" +cdn=1 +for cdname in `cat $cdlist` +do + echo "----------- $cdname ----------" + #mkisofs_flags2=" -volset-ID $cdname -volset-seqno $cdn " + mkisofs_flags2=" -V ${volid}$cdn " + echo "(cd ${cddir} && mkisofs $mkisofs_flags $mkisofs_flags2 -o ${cdname}.iso $cdname)" + ( cd ${cddir} && mkisofs $mkisofs_flags $mkisofs_flags2 -o ${cdname}.iso $cdname ) + if [ $? != 0 ]; then + echo "mkisofs failed" + clean_and_exit + fi + cdn=$(($cdn + 1)) +done + +echo "ISO Images are available in $cddir" + +if [ -f $warnings ]; then + echo "There were warnings generated:" + cat $warnings +fi + +echo " " +echo "$prog finished: `date`" +echo " " + +rm -fr $TMP + +exit 0 + diff --git a/pkgtools/cdpack/pkg/DESCR b/pkgtools/cdpack/pkg/DESCR new file mode 100644 index 00000000000..c3d1c47ffa1 --- /dev/null +++ b/pkgtools/cdpack/pkg/DESCR @@ -0,0 +1,11 @@ +cdpack is a small utility for creating ISO 9660 images for +a multi-CD binary package collection. The utility creates +ISO 9660 images for all the binary packages in a specified +directory. A choice of two algorithms is available for how +the packages are grouped. The "no duplication" algorithm +arranges the packages so any package on CD number `n' will +have all of its dependencies on CD numbers 1 through `n'. +The "no inter-CD depends" algorithm will place certain +packages on more than one CD to ensure that each CD is self +contained (all package dependencies are satisfied within +the single CD). diff --git a/pkgtools/cdpack/pkg/PLIST b/pkgtools/cdpack/pkg/PLIST new file mode 100644 index 00000000000..d3497b8173f --- /dev/null +++ b/pkgtools/cdpack/pkg/PLIST @@ -0,0 +1,5 @@ +@comment $NetBSD: PLIST,v 1.1.1.1 2001/04/27 18:16:41 dmcmahill Exp $ +bin/cdpack +libexec/cdgen.awk +man/man1/cdpack.1 +man/cat1/cdpack.0 |