#!/bin/bash # slink_cd v 1.13 (c) Steve McIntyre # Released under GPL 31 Mar 1999 # See the file COPYING for license details # Greatly influenced by the older Makefile system in the Hamm debian-cd package # ############################################################################## # # Read the README! IMPORTANT STUFF HERE! # ############################################################################## # Version number, to be used later SLINKCD_VERSION=1.13 SLINKCD_SITE="http://www.chiark.greenend.org.uk/~stevem/DebianCD/" ########################################################################### # Default options - we check for these in the environment first, so it # is possible to drive this script entirely without changing these if # you so desire. Where this really comes into its own is in automating # the process for multiple architectures - try a script that sets the # environment appropriately, then calls this for each architecture, # something like: # # ARCH=i386 TDIR=~/i386-tmp OUT=~/i386-out ./slink_cd # ARCH=m68k TDIR=~/m68k-tmp OUT=~/m68k-out ./slink_cd # ARCH=alpha TDIR=~/alpha-tmp OUT=~/alpha-out ./slink_cd # ARCH=sparc TDIR=~/sparc-tmp OUT=~/sparc-out ./slink_cd # # It's not pretty but it should work... (TM) :-) - look at the included # "arch" script for an example. ########################################################################### # Grab current directory for later use. Can be over-ridden by $BASEDIR # in the environment BASEDIR=${BASEDIR:-$PWD} # Architecture to build images for (i386, alpha, m68k, sparc, powerpc so far). # Default, will be overridden by other options - use m68k, alpha or i386 on # commandline to change ARCH=${ARCH:-i386} # Top level location of Debian mirror MIRROR=${MIRROR:-/home/ftp/debian} # Location of non-US mirror NONUS=${NONUS:-$MIRROR/non-US} # Path to use with mkisofs/mkhybrid MKISOFS=${MKISOFS:-"mkhybrid"} # Options to use with mkisofs/mkhybrid - one of these should do you # If you're using i386 then -J will be added later to add Joliet stuff # * Why can't Windows read RockRidge like any sensible OS? * #MKISOFS_OPTS=${MKISOFS_OPTS:-"-a -r -T"} # For normal users MKISOFS_OPTS=${MKISOFS_OPTS:-"-a -r -F -T"} # For sym-link farmers. # Also make sure you have a patched mkhybrid - read the README # TDIR must be on the same partition as the mirror for hard links trick # to work TDIR=${TDIR:-~stevem/slinkcd} # Target directory for output ISO images OUT=${OUT:-$MIRROR/local/images} # Sparc (maybe other?) boot directory from where to grab the SILO boot loader BOOTDIR=${BOOTDIR:-/boot} . $BASEDIR/vecho # Local definitions for vecho, vvecho, vvvecho # Default debug level VERBOSE=0 DATE=`date +%Y%m%d` # Parse options if [ $# -gt 0 ] ; then while [ $# -gt 0 ] do case "$1"x in "-v"x) VERBOSE=$[ $VERBOSE + 1 ] shift 1 ;; "clean"x) CLEAN=1 shift 1 ;; "genlist"x) GENLIST=1 shift 1 ;; "tree"x) TREE=1 shift 1 ;; "genlinks"x) GENLINKS=1 shift 1 ;; "flatten"x) FLATTEN=1 shift 1 ;; "md5check"x) MD5CHECK=1 shift 1 ;; "packages"x) PACKAGES=1 shift 1 ;; "boot"x) BOOT=1 shift 1 ;; "extras"x) EXTRAS=1 shift 1 ;; "md5list"x) MD5LIST=1 shift 1 ;; "images"x) IMAGES=1 IMAGE1=1 IMAGE2=1 IMAGE3=1 IMAGE4=1 IMAGESMADE=1 shift 1 ;; "image1"x) IMAGE1=1 IMAGESMADE=1 shift 1 ;; "image2"x) IMAGE2=1 IMAGESMADE=1 shift 1 ;; "image3"x) IMAGE3=1 IMAGESMADE=1 shift 1 ;; "image4"x) IMAGE4=1 IMAGESMADE=1 shift 1 ;; "image5"x) IMAGE5=1 IMAGESMADE=1 shift 1 ;; "imagesums"x) IMAGESUMS=1 shift 1 ;; "alpha"x) ARCH=alpha shift 1 ;; "sparc"x) ARCH=sparc shift 1 ;; "powerpc"x) ARCH=powerpc shift 1 ;; "m68k"x) ARCH=m68k shift 1 ;; "i386"x) ARCH=i386 shift 1 ;; "single_disk"x) SINGLE_DISK=1 shift 1 ;; "force_deps"x) FORCE_DEPENDS=1 shift 1 ;; "non-US"x|"non-us"x) # Only set this if we have a location for it... if [ "$NONUS"x != ""x ] ; then NU=1 fi shift 1 ;; "non-free"x) NF=1 shift 1 ;; *) echo \"$1\": invalid option. exit 1 ;; esac done else CLEAN=1 GENLIST=1 TREE=1 GENLINKS=0 FLATTEN=1 MD5CHECK=1 PACKAGES=1 BOOT=1 EXTRAS=1 MD5LIST=1 IMAGE1=0 IMAGE2=0 IMAGE3=0 IMAGE4=0 IMAGE5=0 IMAGESUMS=0 NU=0 NF=0 SINGLE_DISK=0 fi if [ "$IMAGES"x = "1"x -a "$NF"x = "1"x ] ; then IMAGE5=1 fi error=0 vecho VERBOSE=$VERBOSE vecho CLEAN=$CLEAN vecho GENLIST=$GENLIST vecho TREE=$TREE vecho GENLINKS=$GENLINKS vecho FLATTEN=$FLATTEN vecho MD5CHECK=$MD5CHECK vecho PACKAGES=$PACKAGES vecho BOOT=$BOOT vecho EXTRAS=$EXTRAS vecho MD5LIST=$MD5LIST vecho IMAGES=$IMAGES vecho IMAGE1=$IMAGE1 vecho IMAGE2=$IMAGE2 vecho IMAGE3=$IMAGE3 vecho IMAGE4=$IMAGE4 vecho IMAGE5=$IMAGE5 vecho IMAGESUMS=$IMAGESUMS vecho ARCH=$ARCH vecho MIRROR=$MIRROR vecho NONUS=$NONUS vecho MKISOFS=$MKISOFS vecho TDIR=$TDIR vecho OUT=$OUT vecho BASEDIR=$BASEDIR vecho NU=$NU vecho NF=$NF vecho SINGLE_DISK=$SINGLE_DISK # Sort out non-US link - this should be done better... if [ "$NU"x = "1"x ] ; then vecho Checking for non-US link in $MIRROR/dists/slink if [ ! -L $MIRROR/dists/slink/non-US -a ! -d $MIRROR/dists/slink/non-US ] ; then vecho "Does not exist; trying to make one" (cd $MIRROR/dists/slink && ln -s $NONUS/dists/slink/non-US >/dev/null 2>&1 ) # Redirect errors - people may have a read-only mirror... fi fi # Cope with relative paths; some people insist on using them. vecho Checking TDIR is set OK # Does it exist? if [ ! -e $TDIR ] ; then vecho "$TDIR does not exist - making it" mkdir $TDIR if [ $? -gt 0 ] ; then echo "Temporary directory $TDIR does not exist and we cannot create it." echo "Exit." exit 1 fi fi pushd $TDIR >/dev/null if [ $? -gt 0 ] ; then echo "Error in directory $TDIR" echo "Exit." exit 1 fi TDIR=$PWD popd >/dev/null vecho TDIR is now $TDIR vecho Checking MIRROR is set OK # Does it exist? if [ ! -e $MIRROR ] ; then echo "Mirror directory $MIRROR does not exist" echo "Exit." exit 1 fi if [ "$NU"x = "1"x ] ; then vecho Checking NONUS is set OK # Does it exist? if [ ! -e $NONUS ] ; then echo "non-US Mirror directory $NONUS does not exist" echo "Exit." exit 1 fi fi vecho Checking OUT is set OK # Does it exist? if [ ! -e $OUT ] ; then vecho "$OUT does not exist - making it" mkdir $OUT if [ $? -gt 0 ] ; then echo "Image directory $OUT does not exist and we cannot create it." echo "Exit." exit 1 fi fi pushd $OUT >/dev/null if [ $? -gt 0 ] ; then echo "Error in directory $OUT" echo "Exit." exit 1 fi OUT=$PWD popd >/dev/null vecho OUT is now $OUT # Check the user has done as told - make sure we're on the same # partition as the mirror unless we have been told to "genlinks" if [ "$GENLINKS"x != "1"x -a "$TREE"x = "1"x ] ; then vecho Checking that TDIR is on the same partition as the mirror. MIRRORPART=`df $MIRROR | grep -v ilesystem | awk '{print $1}'` vvecho MIRROR is on $MIRRORPART TMPPART=`df $TDIR | grep -v ilesystem | awk '{print $1}'` vvecho TDIR is on $TMPPART if [ "$MIRRORPART"x = "$TMPPART"x ] ; then vecho "Good - they match." else echo "Read the instructions, the temporary dir specified must be on the" echo "same partition as the mirror unless you specify \"genlinks\" to make a sym-link" echo "farm" echo "$TMPPART != $MIRRORPART" exit 1 fi fi # Check to see if we're being asked to create md5sums for non-existent images if [ "$IMAGESMADE"x != "1"x -a "$IMAGESUMS"x = "1"x ] ; then echo "To create md5sums of CD images you first need to create the images!" echo "Try again, either adding an image creation option (image[12345x])" echo "or removing the \"imagesums\" option" echo "Exit." exit 1 fi # If we're doing genlinks then check we have the required -F option # for mkhybrid if [ "$GENLINKS"x = "1"x ] ; then if ! (echo "$MKISOFS_OPTS" | grep -q \\-F ) ; then echo "If you are using the \"genlinks\" option then you also need to use a patched" echo "mkhybrid/mkisofs and add the \"-F\" flag to the command line for it. See the" echo "README file for more details." echo "Exit." exit 1 fi fi # Set up for later; non-free and non-US will be added as necessary SECTLIST="main" # List of sections DISKLIST="1 2 3 4" # List of all disks BINLIST="1 2" # List of disks containing binaries if [ "$SINGLE_DISK"x = "1"x ] ; then # Sanity check... if [ "$NU"x = "1"x -o "$NF"x = "1"x ] ; then echo 'single_disk option is not compatible with either non-free or non-US.' echo Exit. exit 1 fi if [ "$IMAGE2"x = "1"x -o "$IMAGE3"x = "1"x -o "$IMAGE3" = "1"x -o "$IMAGE4"x = "1"x ] ; then echo 'single_disk option is not compatible with creation of CD images other than #1.' echo Exit. exit 1 fi DISKLIST="1" BINLIST="1" else SECTLIST="$SECTLIST contrib" fi if [ "$NU"x = "1"x ] ; then SECTLIST="$SECTLIST non-US" fi if [ "$NF"x = "1"x ] ; then SECTLIST="$SECTLIST non-free" DISKLIST="$DISKLIST 5" BINLIST="$BINLIST 5" fi vecho "About to run to create disk(s) $DISKLIST and section(s) $SECTLIST" # Sanity check for combinations of options - creating sym-links then # flattening them isn't just silly, it's stupid... if [ "$GENLINKS"x = "1"x -a "$FLATTEN"x = "1"x ] ; then echo "The \"genlinks\" and \"flatten\" options are incompatible." echo "Exit." exit 1 fi if [ $error -eq 0 ] ; then if [ "$CLEAN"x = "1"x ] ; then echo CLEAN: vecho Removing old directories if [ "$VERBOSE" -gt 1 ] ; then rm -rvf $TDIR else rm -rf $TDIR fi mkdir $TDIR fi fi vecho "Making working copies of config files, converting ARCH to $ARCH" if [ -e $TDIR/slink1.list ] ; then vecho "You already appear to have them. I therefore assume the ones in" vecho "$TDIR are correct and I will leave them alone. If you" vecho "want to generate new ones, delete the file \"slink1.list\" in" vecho "$TDIR and try again." else for i in $DISKLIST do for TYPE in list info volid extras optional do if [ -e slink$i.$TYPE ] ; then vecho " slink$i.$TYPE" cat slink$i.$TYPE | sed "s/ARCH/$ARCH/g" >$TDIR/slink$i.$TYPE fi done done vecho " mkisofsrc" cat mkisofsrc | sed "s/ARCH/$ARCH/g" >$TDIR/.mkisofs ln -s .mkisofs $TDIR/.mkisofsrc vecho " slink1.needed" slice master if [ $? -gt 0 ] ; then echo "\"slice master\" failed - do you have the slice package installed?" echo Exit. exit 1 fi echo "# Do not edit this file - it is automatically generated." >$TDIR/slink1.needed echo "# Edit \"master\" instead." >>$TDIR/slink1.needed cat master.$ARCH | awk -F':' ' /Packages:/ {packages++; next} /.+.+/ {if(packages) {print $1}} ' |sort |uniq >>$TDIR/slink1.needed rm master.* vecho " slink1.useful" slice useful if [ $? -gt 0 ] ; then echo "\"slice useful\" failed - do you have the slice package installed?" echo Exit. exit 1 fi echo "# Do not edit this file - it is automatically generated." >$TDIR/slink1.useful echo "# Edit \"useful\" instead." >>$TDIR/slink1.useful cat useful.$ARCH | awk -F':' ' /.+.+/ {print $1} ' |sort |uniq >>$TDIR/slink1.useful rm useful.* # Check for non-US entries in these files - if we mention it then fix it... if [ "$NU"x != "1"x ] ; then vecho "non-US option not given, so removing non-US references from file lists" for file in $TDIR/slink*.list do mv $file $file.1 vecho " $file" grep -v non-US $file.1 >$file done fi fi if [ $error -eq 0 ] ; then if [ "$GENLIST"x = "1"x ] ; then echo GENLIST: $BASEDIR/mklist "$MIRROR" "$BASEDIR" "$TDIR" "$ARCH" "$VERBOSE" cd $TDIR # Now combine the lists if [ ! -e slink1.list ] ; then echo mklist step failed - $TDIR/slink1.list not found echo Exit. exit 1 fi if [ ! -e list/OUT1 ] ; then echo mklist step failed - $TDIR/list/OUT1 not found echo Exit. exit 1 fi mv slink1.list slink1.list.orig cat slink1.list.orig | grep -v main/binary- >slink1.list cat list/OUT1 | sed 's/dists\/frozen/dists\/slink/g;s/dists\/stable/dists\/slink/g' >>slink1.list rm slink1.list.orig if [ "$SINGLE_DISK"x != "1"x ] ; then # Now combine the lists if [ ! -e slink2.list ] ; then echo mklist step failed - $TDIR/slink2.list not found echo Exit. exit 1 fi if [ ! -e list/OUT2 ] ; then echo mklist step failed - $TDIR/list/OUT2 not found echo Exit. exit 1 fi mv slink2.list slink2.list.orig cat slink2.list.orig | grep -v main/binary- >slink2.list cat list/OUT2 | sed 's/dists\/frozen/dists\/slink/g;s/dists\/stable/dists\/slink/g' >>slink2.list rm slink2.list.orig fi fi fi # Make sym-link farm for those people that need it... if [ $error -eq 0 ] ; then if [ "$GENLINKS"x = "1"x ] ; then echo GENLINKS: vecho Making sym-link farm of parts of $MIRROR under $TDIR/tmp-mirror cd $TDIR mkdir tmp-mirror cd tmp-mirror cp -pRs $MIRROR/dists $MIRROR/doc $MIRROR/README* $MIRROR/hamm $MIRROR/indices $MIRROR/ls* $MIRROR/project $MIRROR/tools . # Copy non-US separately if necessary... if [ -L $MIRROR/dists/slink/non-US ] ; then vecho Adding non-US rm dists/slink/non-US mkdir dists/slink/non-US cp -dpRs $NONUS/slink/* dists/slink/non-US fi cd dists/slink vecho Putting binary-all links in find . | $BASEDIR/mklinks $VERBOSE MIRROR=$TDIR/tmp-mirror fi fi # Make initial tree(s) if [ $error -eq 0 ] ; then if [ "$TREE"x = "1"x ] ; then echo TREE: cd $TDIR # First of all the general stuff to go on all disks. for i in $DISKLIST do vecho Disk $i vecho " Make directories" mkdir -p $TDIR/slink$i/dists/slink mkdir -p $TDIR/slink$i/.disk # Oops. We're copying the dists stuff into the root # directory, the boot-floppies install stuff wants it in # /debian. Simple fix... cd $TDIR/slink$i ln -s . debian # Set up symlinks so things may work. cd dists ln -s slink stable # Frozen no longer needed # ln -s slink frozen cd stable cd $TDIR vecho " Copy info file" (cat slink$i.info | awk '{printf("%s",$0)}'; echo $DATE) \ >slink$i/.disk/info vecho " Copy release notes" cp $MIRROR/dists/slink/main/Release-Notes slink$i vecho " Copy README.1ST" echo "This Debian CD was created by slink_cd version $SLINKCD_VERSION on $DATE" >slink$i/README.1ST echo "slink_cd is available from $SLINKCD_SITE">>slink$i/README.1ST echo "This disc is labelled" >>slink$i/README.1ST echo "" >>slink$i/README.1ST cat slink$i/.disk/info >>slink$i/README.1ST if [ -e $BASEDIR/README.multicd ] ; then vecho " Copy README.multicd" cat $BASEDIR/README.multicd >>slink$i/README.multicd fi todos slink$i/README.1ST cd $MIRROR vecho " Create tree" for file in `cat $TDIR/slink$i.list` do cp -dpRPl $file $TDIR/slink$i done done cd $TDIR # And now the arch-specific stuff, NOT to go on the source disks. for i in $BINLIST do vecho Disk $i vecho " Make binary directories" for SECT in $SECTLIST do mkdir -p slink$i/dists/slink/$SECT/binary-$ARCH mkdir -p slink$i/dists/slink/$SECT/binary-all done vecho " Finish README.1ST" echo "" >>slink$i/README.1ST if [ -e $BASEDIR/README.1ST.$ARCH ] ; then cat $BASEDIR/README.1ST.$ARCH >>slink$i/README.1ST fi if [ -e $BASEDIR/README.$ARCH ] ; then vecho " Copy README.$ARCH" cat $BASEDIR/README.$ARCH >>slink$i/README.$ARCH fi done # Add the Release files, munging if necessary for i in $BINLIST do vecho Disk $i vecho " add Release files" for SECT in $SECTLIST do if [ -e slink$i/dists/slink/$SECT/binary-$ARCH/Release ] ; then rm -f slink$i/dists/slink/$SECT/binary-$ARCH/Release fi if [ -d slink$i/dists/slink/$SECT/binary-$ARCH ] ; then if [ -e slink$i/dists/slink/$SECT/binary-$ARCH/Release ] ; then cat $MIRROR/dists/slink/$SECT/binary-$ARCH/Release \ | sed 's/frozen/stable/g' \ > slink$i/dists/slink/$SECT/binary-$ARCH/Release fi fi done done # Add sym-links for the upgrade stuff if we have it. if [ "$ARCH"x = "i386"x ] ; then vecho "Disk 1" vecho " upgrade-2.0-i386" (cd $TDIR/slink1 && ln -s dists/stable/main/upgrade-2.0-i386) vecho " upgrade-older-i386" (cd $TDIR/slink1 && ln -s dists/stable/main/upgrade-older-i386) fi fi fi # Fix the crypt++el_2.84-2.deb brokenness in non-US - temporary workaround... if [ "$NU"x = "1"x ] ; then vecho "Looking for broken crypt++el_2.84-2.deb link in non-US..." cd $TDIR/slink2/dists/slink/non-US/binary-$ARCH if [ -L crypt++el_2.84-2.deb ] ; then link=`ls -l crypt++el_2.84-2.deb | awk '{print $11}'` if [ "$link"x != "../binary-all/crypt++el_2.84-2.deb"x ] ; then vecho "Fixing it" vecho rm crypt++el_2.84-2.deb rm crypt++el_2.84-2.deb vecho ln -s ../binary-all/crypt++el_2.84-2.deb ln -s ../binary-all/crypt++el_2.84-2.deb vecho cd ../binary-all cd ../binary-all vecho ln -s $NONUS/hamm/binary-all/crypt++el_2.84-2.deb ln -s $NONUS/hamm/binary-all/crypt++el_2.84-2.deb else vecho "You do not have it - good" fi fi fi # Generate the list of files we have cd $TDIR rm -f binary targz diffgz dsc vecho Generating file list: vecho ' *.deb' for i in $BINLIST do vecho " slink$i" find slink$i -name *.deb >>binary done vecho ' *.tar.gz' for i in $DISKLIST do vecho " slink$i" find slink$i -name *.tar.gz >>targz done vecho ' *.diff.gz' for i in $DISKLIST do vecho " slink$i" find slink$i -name *.diff.gz >>diffgz done vecho ' *.dsc' for i in $DISKLIST do vecho " slink$i" find slink$i -name *.dsc >>dsc done # Now we need to flatten out links pointing outside the tree if [ $error -eq 0 ] ; then if [ "$FLATTEN"x = "1"x ] ; then echo FLATTEN: vecho Flattening external symlinks # This is done in perl. cat binary targz diffgz dsc | $BASEDIR/flatten "$MIRROR" "$NONUS" "$VERBOSE" fi fi # Now do a check for the MD5 sums of all the packages before creating # the CD images. To avoid the pain of coping with different paths, # cheat and make sym-links to the real files and compare against # munged pathnames from the Packages files if [ $error -eq 0 ] ; then if [ "$MD5CHECK"x = "1"x ] ; then echo MD5CHECK: # First grab all the details from the appropriate Packages files vecho Creating MD5 list of packages for comparison cd $MIRROR/dists/slink # build the list of packages files to read (either compressed or not) for SECT in $SECTLIST do dir=$SECT/binary-$ARCH if [ -e $dir/Packages ] ; then PFILES="$PFILES $dir/Packages" elif [ -e $dir/Packages.gz ]; then PFILES="$PFILES $dir/Packages.gz" else echo "WARNING: no Packages file(s) found for $dir." fi done # -f on zcat allows uncompressed files to be processed as well # We find the local list of packages as otherwise the # single_disk hack will fail, because of missing files that # would have gone on other discs. Unfortunately this means we # won't be able to detect missing files... Suggestions? echo " binary" (cat $TDIR/binary | sed 's/.*\///g;s/_.*//g' ; cat $BASEDIR/EOP; zcat -f $PFILES) \ | grep -v '^#' |awk ' /END_OF_PROCESSING/ { yes_done++ ; next } /.*/ { if(!yes_done) { yes[$1]=1 ; next } } /^Package:/ {package=$2} /^Filename:/ {filename[package]=$2} /^MD5sum:/ {md5sum[package]=$2; gsub(".*/","",filename[package]); if(yes[package]) { printf("%32.32s %s\n",md5sum[package],filename[package]) } } ' >$TDIR/debcheck_disks.1 cd $TDIR # Now the sym-links vecho Creating package sym-links rm -rf md5 mkdir md5 # Use the list we already generated earlier... for file in `cat binary` do ln -sf ../$file md5 done # Compare vecho Comparing sums cd md5 md5sum -c ../debcheck_disks.1 vecho Checking file sizes find . -follow -size 0 >../sizecheck_disks.1 if [ -s ../sizecheck_disks.1 ] ; then echo " Awooga!" echo " Awooga!" echo " Awooga!" echo " The following files are of zero size:" cat ../sizecheck_disks.1 echo "This is fatal. Exit." exit 1 fi cd .. rm -rf md5 echo " source" # Now check source - use the .dsc files vecho Creating MD5 list of source files for comparison cat `cat dsc` | awk ' /^-----BEGIN PGP SIGNATURE/ {in_list=0} { if(in_list) {printf("%32.32s %s\n",$1,$3)} } /^Files:/ {in_list=1} ' >$TDIR/debcheck_disks.2 # Now the sym-links vecho Creating source file sym-links if [ -d md5 ] ; then rm -rf md5 fi mkdir md5 # Use the list we already generated earlier... for file in `cat targz diffgz` do ln -sf ../$file md5 done # Compare vecho Comparing sums cd md5 md5sum -c ../debcheck_disks.2 vecho Checking file sizes find . -follow -size 0 >../sizecheck_disks.2 if [ -s ../sizecheck_disks.2 ] ; then echo " Awooga!" echo " Awooga!" echo " Awooga!" echo " The following files are of zero size:" cat ../sizecheck_disks.2 echo "This is fatal. Exit." exit 1 fi cd .. rm -rf md5 # Next we need to look at the boot-disks vecho Checking boot disks areas: for dir in `find $TDIR | grep disks-$ARCH$` do cd $dir vecho $dir... for dir1 in * do cd $dir1 vecho $dir/$dir1... if [ -e md5sum.txt ] ; then md5sum -c md5sum.txt else echo WARNING: no md5sum.txt file found in $dir/$dir1 fi cd .. done done fi fi if [ $error -eq 0 ] ; then if [ "$PACKAGES"x = "1"x ] ; then echo PACKAGES: cd $TDIR rm -vf Packages-{main,contrib,non-US,non-free}.[12345] # Create Packages and Packages.cd files to go on the CDs # First lists by section and CD for i in $BINLIST do echo Creating Packages-main for disc $i if [ ! -e $MIRROR/indices/override.slink.gz ] ; then echo "Override file $MIRROR/indices/override.slink.gz not found. We cannot" echo "generate our Packages file(s) without this file. Check you are mirroring the" echo "indices/ directory" echo "Exit." exit 1 fi (cd $TDIR/slink$i/dists/stable/main && \ dpkg-scanpackages -m "`cat $TDIR/slink$i/.disk/info`" \ binary-$ARCH $MIRROR/indices/override.slink.gz \ dists/stable/main/ > $TDIR/Packages-main.$i) if [ "$SINGLE_DISK"x != "1"x ] ; then echo Creating Packages-contrib for disc $i if [ ! -e $MIRROR/indices/override.slink.contrib.gz ] ; then echo "Override file $MIRROR/indices/override.slink.contrib.gz not found. We cannot" echo "generate our Packages file(s) without this file. Check you are mirroring the" echo "indices/ directory" echo "Exit." exit 1 fi (cd $TDIR/slink$i/dists/stable/contrib && \ dpkg-scanpackages -m "`cat $TDIR/slink$i/.disk/info`" \ binary-$ARCH $MIRROR/indices/override.slink.contrib.gz \ dists/stable/contrib/ > $TDIR/Packages-contrib.$i) fi if [ "$NU"x = "1"x ] ; then echo Creating Packages-non-US for disc $i # Hmmm, we have a problem here. My non-US mirror has the # override file in $NONUS/indices but open has it in # $MIRROR/indices (and with a different filename!!!) # Check for both in turn... OVER_NU=/foo # default catch-all if [ -e $NONUS/indices/override.slink.nonus ] ; then OVER_NU=$NONUS/indices/override.slink.nonus elif [ -e $NONUS/indices/override.slink.nonus.gz ] ; then OVER_NU=$NONUS/indices/override.slink.nonus.gz elif [ -e $MIRROR/indices/override.non-us.slink ] ; then OVER_NU=$MIRROR/indices/override.non-us.slink elif [ -e $MIRROR/indices/override.non-us.slink.gz ] ; then OVER_NU=$MIRROR/indices/override.non-us.slink.gz fi if [ ! -e "$OVER_NU" ] ; then echo "Override file "$OVER_NU" not found. We cannot" echo "generate our Packages file(s) without this file. Check you are mirroring the" echo "indices/ directory" echo "Exit." exit 1 fi (cd $TDIR/slink$i/dists/stable/non-US && \ dpkg-scanpackages -m "`cat $TDIR/slink$i/.disk/info`" \ binary-$ARCH $OVER_NU \ dists/stable/non-US/ > $TDIR/Packages-non-US.$i) fi if [ "$NF"x = "1"x ] ; then echo Creating Packages-non-free for disc $i if [ ! -e $MIRROR/indices/override.slink.non-free.gz ] ; then echo "Override file $MIRROR/indices/override.slink.non-free.gz not found. We cannot" echo "generate our Packages file(s) without this file. Check you are mirroring the" echo "indices/ directory" echo "Exit." exit 1 fi (cd $TDIR/slink$i/dists/stable/non-free && \ dpkg-scanpackages -m "`cat $TDIR/slink$i/.disk/info`" \ binary-$ARCH $MIRROR/indices/override.slink.non-free.gz \ dists/stable/non-free/ > $TDIR/Packages-non-free.$i) fi done echo "Checking dependencies" echo " CD #1" >/tmp/foo $BASEDIR/pkg-order --nocheck-conflicts --nooutput-order --installed-packages /tmp/foo $TDIR/Packages-main.1 >$TDIR/pkg-order.1 2>&1 if [ $? -gt 0 ] ; then echo "Dependencies of CD #1 cannot be met:" cat $TDIR/pkg-order.1 if [ "$FORCE_DEPENDS"x != "1"x ] ; then echo Exit. exit 1 fi else echo " seems OK" fi if [ "$SINGLE_DISK"x != "1"x ] ; then echo " All CDs" # Use sed here to fix broken package Depends: line cat $TDIR/Packages* | sed 's/^Suggests:\ metro-motif-devel\ (2/Suggests:\ metro-motif-devel\ (=\ 2/g' >$TDIR/Packages-all $BASEDIR/pkg-order --nocheck-conflicts --nooutput-order --check-recommends --installed-packages /tmp/foo $TDIR/Packages-all >$TDIR/pkg-order.2 2>&1 if [ $? -gt 0 ] ; then echo Dependencies of the CD set cannot be met: if [ "$NF"x = 1 -a "$NU"x = 1 ] ; then echo "As all sections have been covered, this is fatal..." if [ "$FORCE_DEPENDS"x != "1"x ] ; then echo Exit. exit 1 fi else echo "Not all sections have been included on the CD, so this is not fatal." echo "However, some packages (especially in the contrib section) will not install" echo "correctly." fi fi fi # Copy the generated Packages files into place on the # appropriate disks, then the Contents files for i in $BINLIST do # First of all, create normal-type Packages files for SECT in $SECTLIST do rm -f slink$i/dists/stable/$SECT/binary-$ARCH/Packages* cat Packages-$SECT.$i | \ grep -v ^X-Medium \ >slink$i/dists/stable/$SECT/binary-$ARCH/Packages cat Packages-$SECT.$i | grep -v ^X-Medium | \ gzip -9 >slink$i/dists/stable/$SECT/binary-$ARCH/Packages.gz done # Now the Packages.cd files vecho slink$i # Be slightly clever here - only copy Packages data for # disc nos. less than or equal to the one we're on - disc # 1 will not know about discs 2,5 but 5 will know about # both the others. The user should insert the last binary # disc they have for initial installation. for j in $BINLIST do if [ $j -le $i ] ; then for SECT in $SECTLIST do if [ -e Packages-$SECT.$j ] ; then vecho " Packages-$SECT.$j" cat Packages-$SECT.$j >> \ slink$i/dists/stable/$SECT/binary-$ARCH/Packages.cd cat Packages-$SECT.$j | gzip -9 >> \ slink$i/dists/stable/$SECT/binary-$ARCH/Packages.cd.gz fi done fi done vecho " Contents-$ARCH.gz" cp -pl $MIRROR/dists/slink/Contents-$ARCH.gz slink$i/dists/stable done fi fi # Now fix the missing bits if [ $error -eq 0 ] ; then if [ "$BOOT"x = "1"x ] ; then echo BOOT: vecho "Making bootable images for $ARCH..." cd $TDIR mkdir -m 755 slink1/install (cd slink1/dists/stable/main/disks-$ARCH/current/ ; \ cp *.txt *.html $TDIR/slink1/install ) (cd slink1/doc; for file in ../install/*.{html,txt}; do ln -s $file; done) # Hack for bootable disks rm -rf boot1 boot2 mkdir -p boot1/boot case "$ARCH"x in "i386"x|"sparc"x|"m68k"x|"alpha"x) vecho "ARCH is $ARCH, we know what to do. Continuing..." $BASEDIR/boot-$ARCH $MIRROR $BASEDIR $TDIR $ARCH $VERBOSE $BOOTDIR if [ $? -gt 0 ] ; then echo "boot-$ARCH failed. Exit." exit 1 fi ;; *) echo "Oops! We don't know what to do with $ARCH disks yet" echo "Leaving bootable CDs alone, you'll need to make boot" echo "floppies by hand to install." ;; esac fi fi # define extra mkisofs flags for CD image creation # (this part cannot fit in the above section because it is not required to run # slink_cd with *both* BOOT & IMAGEx options enabled at one time) cd $TDIR case "$ARCH"x in "i386"x) if [ -d boot1 ]; then MKISOFS_OPTS_DISC1="-J -b boot/resc1440.bin -c boot/boot.catalog boot1" fi if [ -d boot2 ]; then MKISOFS_OPTS_DISC2="-J -b boot/resc1440tecra.bin -c boot/boot.catalog boot2" fi ;; "sparc"x) if [ -d boot1 ]; then MKISOFS_OPTS_DISC1="boot1" # move install tree to correct location if [ -d $TDIR/slink1/install ] ; then vecho "Moving install to boot1" rm -rf $TDIR/boot1/install || true mv $TDIR/slink1/install $TDIR/boot1 fi fi ;; "m68k"x) if [ -d boot1 ]; then MKISOFS_OPTS_DISC1="-b install/bvme6000/resc1440.bin -c install/bvme6000/boot.catalog" fi ;; "alpha"x) if [ -d boot1 ]; then MKISOFS_OPTS_DISC1="-J boot1" fi ;; esac if [ $error -eq 0 ] ; then if [ "$EXTRAS"x = "1"x ] ; then echo EXTRAS: # Copy some extras onto disks to fill them, e.g. newest 2.1 and # 2.2 kernels and netscape vecho Copying extras onto disks: cd $TDIR for i in $DISKLIST do if [ -f $TDIR/slink$i.extras ] ; then vecho " slink$i extras:" mkdir slink$i/extras cp -R `cat $TDIR/slink$i.extras` slink$i/extras else vecho " slink$i has no extras" fi done fi fi if [ $error -eq 0 ] ; then if [ "$MD5LIST"x = "1"x ] ; then echo MD5LIST: vecho "Generating md5sums for contents of each disk:" for i in $DISKLIST do cd $TDIR/slink$i vecho " Disk $i" find . -follow -type f | grep -v "\./md5sum" | grep -v "/dists/stable" | xargs md5sum > md5sum.txt done # Generate some sizes here. Unfortunately no use at all if we're # using a sym-link farm... if [ "$GENLINKS" != "1"x ] ; then vecho "Generating sizes of the trees" cd $TDIR du -l >du fi fi fi if [ $error -eq 0 ] ; then # Add HFS flags for m68k/powerpc for macs if [ "$ARCH"x = "powerpc"x -o "$ARCH"x = "m68k"x ] ; then MKISOFS_OPTS="--netatalk -j -hfs -probe -map $BASEDIR/hfs.map $MKISOFS_OPTS" fi cd $TDIR if [ ! -d $OUT ] ; then mkdir -p $OUT fi if [ "$IMAGE1"x = "1"x ] ; then echo IMAGE1: VOLID1=`cat $TDIR/slink1.volid` vecho "Making image of slink1 to $OUT/slink1-$ARCH.raw" vecho $MKISOFS $MKISOFS_OPTS -V "$VOLID1" \ -o $OUT/slink1-$ARCH.raw $MKISOFS_OPTS_DISC1 slink1 $MKISOFS $MKISOFS_OPTS -V "$VOLID1" \ -o $OUT/slink1-$ARCH.raw $MKISOFS_OPTS_DISC1 slink1 fi if [ "$IMAGE2"x = "1"x ] ; then echo IMAGE2: VOLID2=`cat $TDIR/slink2.volid` vecho "Making image of slink2 to $OUT/slink2-$ARCH.raw" vecho $MKISOFS $MKISOFS_OPTS -V "$VOLID2" \ -o $OUT/slink2-$ARCH.raw $MKISOFS_OPTS_DISC2 slink2 $MKISOFS $MKISOFS_OPTS -V "$VOLID2" \ -o $OUT/slink2-$ARCH.raw $MKISOFS_OPTS_DISC2 slink2 fi if [ "$IMAGE3"x = "1"x ] ; then echo IMAGE3: VOLID3=`cat $TDIR/slink3.volid` vecho "Making image of slink3 to $OUT/slink3.raw" vecho $MKISOFS $MKISOFS_OPTS -V "$VOLID3" \ -o $OUT/slink3.raw $MKISOFS_OPTS_DISC3 slink3 $MKISOFS $MKISOFS_OPTS -V "$VOLID3" \ -o $OUT/slink3.raw $MKISOFS_OPTS_DISC3 slink3 fi if [ "$IMAGE4"x = "1"x ] ; then echo IMAGE4: VOLID4=`cat $TDIR/slink4.volid` vecho "Making image of slink4 to $OUT/slink4.raw" vecho $MKISOFS $MKISOFS_OPTS -V "$VOLID4" \ -o $OUT/slink4.raw $MKISOFS_OPTS_DISC4 slink4 $MKISOFS $MKISOFS_OPTS -V "$VOLID4" \ -o $OUT/slink4.raw $MKISOFS_OPTS_DISC4 slink4 fi if [ "$IMAGE5"x = "1"x ] ; then echo IMAGE5: VOLID5=`cat $TDIR/slink5.volid` vecho "Making image of slink5 to $OUT/slink5-$ARCH.raw" if [ "$NF"x = "1"x ] ; then vecho $MKISOFS $MKISOFS_OPTS -V "$VOLID5" \ -o $OUT/slink5-$ARCH.raw $MKISOFS_OPTS_DISC5 slink5 $MKISOFS $MKISOFS_OPTS -V "$VOLID5" \ -o $OUT/slink5-$ARCH.raw $MKISOFS_OPTS_DISC5 slink5 fi fi fi # post-process of generated images (eg. to make the CD image bootable on sparc) if [ $error -eq 0 ] ; then if [ "$IMAGE1"x = "1"x ] ; then if [ "$ARCH"x = "alpha"x ] ; then vecho "Making slink1 image bootable" isomarkboot $OUT/slink1-$ARCH.raw /boot/bootlx /dists/slink/main/disks-al/1999-03-/root1440.bin fi if [ "$ARCH"x = "sparc"x ] ; then # temporary mount point (eg. for silo to create the # bootable CD image) only needed for Sparc so far... vecho Checking for temporary mount point for SILO mountpoint=/var/tmp/slink_cd.mnt if [ -d $mountpoint ]; then umount $mountpoint || true else mkdir -p $mountpoint fi vecho "Making slink1 image bootable" EXECARCH=`dpkg --print-installation-architecture` if [ "$EXECARCH"x = "sparc"x ]; then siloprog=silo elif [ "$EXECARCH"x = "i386"x ]; then siloprog=intelsilo fi if [ -n "$siloprog" ]; then cd1=/boot/debian.txt cd2=/install/linux-a.out cd3=/install/linux-2.2.1-a.out cd4=/install/linux-2.2.1-sun4u-a.out cd5=/install/root.bin echo "mount -o loop $OUT/slink1-$ARCH.raw $mountpoint" mount -o loop $OUT/slink1-$ARCH.raw $mountpoint vecho $siloprog -r $mountpoint -c $OUT/slink1-$ARCH.raw \ -C /boot/silo.conf -l $cd1,$cd2,$cd3,$cd4,$cd5 $siloprog -r $mountpoint -c $OUT/slink1-$ARCH.raw \ -C /boot/silo.conf -l $cd1,$cd2,$cd3,$cd4,$cd5 umount $mountpoint else echo "Don't know how to make the sparc bootable image on $EXECARCH system!" fi fi fi fi if [ "$IMAGESUMS"x = "1"x ] ; then echo IMAGESUMS: # Let's make md5sums of the images for people who may be # downloading them cd $OUT >MD5SUMS vecho Generating md5sums for the CD images: for file in *.raw do vecho " $file" md5sum $file >>MD5SUMS done fi