#!/bin/bash # # $Id$ # # (c) Steve McIntyre Released under # GNU GPL v2 1st January 2001 # # Quick and dirty script to create update CDs for people to upgrade # from potato (2.2r0) to the latest release level # set -e # Configuration goes here. # Where is your mirror? MIRROR_NORM=/mirror/debian MIRROR_AMD64=/mirror/debian-amd64 # If you have a non-US mirror, where is it? Leave blank if you don't have one. # NONUS=${NONUS:-/mirror/debian-non-US} # Do you want non-free? 1 for yes, 0 for no NONFREE=1 # What release version is this? VER=3.1r1 # Path to use with mkisofs/mkhybrid #MKISOFS=${MKISOFS:-"mkhybrid"} MKISOFS=mkisofs # Use JTE extensions to mkisofs to make jigdo files? JTE=1 # The working directory to use. MUST be on the same partition as the mirror. TDIR=/mirror/sarge-update # Building woody cd set ... CODENAME=sarge # Path where the images will be written OUT=/mirror/sarge-update/r1 # Location of the diff file to use to determine the changes. If you leave # this blank, we'll try to determine the changes from the ChangeLog files, # which is probably less accurate. DIFF=/mirror/lists/$CODENAME/r0-r1.diff #~/r3.diff CDSIZE=620 # megabytes, leaving space for metadata REL=Debian"$VER" CLOG=dists/$CODENAME/ChangeLog NUCLOG=dists/$CODENAME/non-US/ChangeLog UPD=$TDIR/$CODENAME-update DATE=`date +%Y%m%d` BASEDIR=`pwd` SECTS="main non-free contrib" VERBOSE=2 GRAB_MD5=$BASEDIR/tools/grab_md5 export VERBOSE BASEDIR SECTS ARCHLIST="alpha arm hppa i386 ia64 m68k mips mipsel powerpc s390 sparc source" # amd64 # all dealt with specially export TDIR NONFREE NONUS VER MIRROR CODENAME OUT BASEDIR CDSIZE=$(($CDSIZE * 1024)) scanpackages=$BASEDIR/tools/scanpackages.old scansources=$BASEDIR/tools/scansources.old set_mkisofs_opts=$BASEDIR/tools/set_mkisofs_opts addfiles=$BASEDIR/tools/add_files create_control_files () { CDDIR=$1 shift ARCHES=$* echo " Creating control files for \"$ARCHES\" on $CDDIR" for ARCH in $ARCHES do case "$ARCH" in source) echo " source" for SECT in $SECTS do mkdir -p $CDDIR/dists/$CODENAME/$SECT/source mkdir -p $CDDIR/dists/$CODENAME/non-US/$SECT/source done cd $UPD $scansources $CDDIR >/dev/null 2>&1 ;; all) ;; *) echo " $ARCH" for SECT in $SECTS do mkdir -p $CDDIR/dists/$CODENAME/$SECT/binary-$ARCH mkdir -p $CDDIR/dists/$CODENAME/non-US/$SECT/binary-$ARCH done ARCH=$ARCH $scanpackages scan $CDDIR > /dev/null 2>&1 ARCH=$ARCH $scanpackages -noPackages.cd install $CDDIR > /dev/null 2>&1 rm -f $CDDIR/*.Packages* #>/dev/null 2>&1 ;; esac done } copy_file () { ROOTDIR=$1 shift FILE=$1 DIR=`echo $FILE | sed 's?/[-_\.A-Za-z0-9\+]*$??'` if [ ! -d $ROOTDIR/$DIR ] ; then mkdir -p $ROOTDIR/$DIR fi if [ -e $MIRROR/$FILE ] ; then cp -l $MIRROR/$FILE $ROOTDIR/$FILE elif [ -e $NONUS/$FILE ] ; then cp -l $NONUS/$FILE $ROOTDIR/$FILE else echo echo "File $FILE not found!" exit 1 fi } make_cd () { CDNUM=$1 shift THISNUM=$1 shift THISARCH=$1 shift SRCFILES=$1 shift ARCHFILES=$1 shift ALLFILES=$1 echo echo " Creating Packages and Sources files for CD$CDNUM" cd $UPD create_control_files CD$CDNUM $THISARCH echo " Creating image for CD$CDNUM ($SRCFILES source files, $ARCHFILES $ARCH debs, $ALLFILES all debs)" echo -n " " if [ $JTE = 1 ] ; then ${MKISOFS} -J -r -V "Debian $VER update CD" -o \ /dev/null \ -jigdo-jigdo $OUT/$CODENAME-update-$THISARCH-$THISNUM.jigdo \ -jigdo-template $OUT/$CODENAME-update-$THISARCH-$THISNUM.template \ -jigdo-map Debian=$MIRROR/ \ -jigdo-map Non-US=$NONUS/ \ -jigdo-force-md5 /pool/ \ -md5-list $UPD/md5-check \ $UPD/CD$CDNUM 2>&1 | grep "extents written" else ${MKISOFS} -J -r -V "Debian $VER update CD" -o \ $OUT/$CODENAME-update-$THISARCH-$THISNUM.raw \ $UPD/CD$CDNUM 2>&1 | grep "extents written" fi } echo Cleaning up rm -rf $UPD mkdir -p $UPD CDNUM=1 echo Creating file list if [ ! -e $DIFF ] ; then echo "NO DIFF FOUND. ABORT!" exit 1 fi cp $DIFF $UPD/list if [ "$NONUS"x == ""x ] ; then echo "Removing non-US files from the list" grep -v non-US $UPD/list > $UPD/list1 mv -f $UPD/list1 $UPD/list fi if [ "$NONFREE"x != "1"x ] ; then echo "Removing non-free files from the list" grep -v non-free $UPD/list > $UPD/list1 mv -f $UPD/list1 $UPD/list fi for THISARCH in $ARCHLIST do THISNUM=0 if [ $THISARCH = amd64 ] ; then MIRROR=$MIRROR_AMD64 else MIRROR=$MIRROR_NORM fi rm -f $UPD/md5-check $GRAB_MD5 $MIRROR $THISARCH $CODENAME $UPD/md5-check if [ "$NONUS"x != ""x ] ; then $GRAB_MD5 $NONUS $THISARCH $CODENAME $UPD/md5-check fi for file in `cat $UPD/list` do if [ ! -d $UPD/CD$CDNUM ] ; then echo cd $MIRROR THISNUM=$((THISNUM + 1)) if [ $THISARCH = "source" ] ; then echo "Creating CD$CDNUM for source (part $THISNUM)" else echo "Creating CD$CDNUM for binary-$THISARCH (part $THISNUM)" fi mkdir $UPD/CD$CDNUM $UPD/CD$CDNUM/.disk INFO="Debian GNU/Linux $VER Update CD $DATE: $THISARCH CD $THISNUM" echo $INFO > $UPD/CD$CDNUM/.disk/info SIZE_USED=0 SRCFILES=0 ARCHFILES=0 ALLFILES=0 fi SIZE_USED=`du -sk $UPD/CD$CDNUM | awk '{print $1}'` if [ $SIZE_USED -gt $CDSIZE ] ; then make_cd $CDNUM $THISNUM $THISARCH $SRCFILES $ARCHFILES $ALLFILES CDNUM=$(($CDNUM + 1)) continue fi case "$THISARCH" in source) case "$file" in *.gz|*.dsc) copy_file $UPD/CD$CDNUM $file SRCFILES=$(($SRCFILES + 1)) ;; esac echo -en "\r$SRCFILES copied" ;; *) case "$file" in *_$THISARCH.deb) copy_file $UPD/CD$CDNUM $file ARCHFILES=$(($ARCHFILES + 1)) ;; *_all.deb) copy_file $UPD/CD$CDNUM $file ALLFILES=$(($ALLFILES + 1)) ;; esac echo -en "\r$THISARCH:$ARCHFILES all:$ALLFILES copied" ;; esac done make_cd $CDNUM $THISNUM $THISARCH $SRCFILES $ARCHFILES $ALLFILES CDNUM=$(($CDNUM + 1)) done