debian-cd-clone/update-cd

308 lines
7.8 KiB
Bash
Executable File

#!/bin/bash
#
# $Id$
#
# (c) Steve McIntyre <stevem@chiark.greenend.org.uk> Released under
# GNU GPL v2 1st January 2001
#
# Quick and dirty script to create update CDs for people to upgrade
# from an initial stable release (r0) to the latest point release level
#
set -e
# Configuration goes here.
# Where is your mirror?
MIRROR_NORM=/org/cdbuilder.debian.org/src/ftp/debian
MIRROR_AMD64=/org/cdbuilder.debian.org/src/ftp/debian-amd64/debian
# 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=0
# What release version is this?
VER=4.0r1
# Is this an official CD?
OFFICIAL=Official
# OFFICIAL="Unofficial snapshot"
# Path to use with mkisofs/mkhybrid
#MKISOFS=${MKISOFS:-"mkhybrid"}
MKISOFS=$PWD/../mkisofs/usr/bin/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=/org/cdbuilder.debian.org/src/deb-cd/tmp/etch-update/cd-work
# Building etch cd set ...
CODENAME=etch
# Path where the images will be written
OUT=/org/cdbuilder.debian.org/src/deb-cd/tmp/etch-update/cd-out
# Location(s) for the snapshot(s)
SNAPSHOT='Debian=http://us.cdimage.debian.org/cdimage/snapshot/Debian/ --try-last'
# Type of disc image, cd or dvd (lower case)
if [ "$1"x = ""x ] ; then
TYPE=cd
else
TYPE=$1
fi
case $TYPE in
cd|CD)
TYPE=cd
TYPEUP=CD;;
dvd|DVD)
TYPE=dvd
TYPEUP=DVD;;
*)
echo "Specify a disk type..."
exit 1;;
esac
# 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=/home/deb-cd/r0-r1.diff
if [ "$TYPE" = "cd" ] ; then
CDSIZE=610 # megabytes, leaving space for metadata
else
CDSIZE=4300 # megabytes, leaving space for metadata
fi
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
FIRSTVER=`echo $VER | sed 's?r.*$?r0?g'`
VERSPACE=`echo $VER | sed 's?r? r?g'`
CAPCODE=`perl -e "print ucfirst("$CODENAME")"`
export FIRSTVER VERSPACE CAPCODE
if [ "$ARCHLIST"x = ""x ] ; then
ARCHLIST="alpha amd64 arm hppa i386 ia64 mips mipsel powerpc s390 sparc source" # amd64 # all dealt with specially
else
ARCHLIST=$@
fi
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=`dirname $FILE`
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 [ ! -d $OUT/$THISARCH/iso-$TYPE ] ; then
mkdir -p $OUT/$THISARCH/iso-$TYPE
fi
if [ $JTE = 1 ] ; then
if [ ! -d $OUT/$THISARCH/jigdo-$TYPE ] ; then
mkdir -p $OUT/$THISARCH/jigdo-$TYPE
fi
${MKISOFS} -J -r -V "Debian $VER update $TYPEUP" -o \
$OUT/$THISARCH/iso-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.iso \
-jigdo-jigdo $OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.jigdo \
-jigdo-template $OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$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"
$BASEDIR/tools/jigdo_cleanup \
$OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.jigdo \
debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.iso \
$OUT debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.template \
"Debian GNU/Linux $VERSPACE - $OFFICIAL $THISARCH $FIRSTVER->$VER update $TYPEUP #$THISNUM"
echo $SNAPSHOT >> $OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.jigdo
else
${MKISOFS} -J -r -V "Debian $VER update $TYPEUP" -o \
$OUT/iso-$TYPE/$CODENAME-update-$THISARCH-$TYPEUP-$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
MIRROR=$MIRROR_NORM
rm -f $UPD/md5-check
$GRAB_MD5 $MIRROR $THISARCH $CODENAME $CODENAME $UPD/md5-check
if [ "$NONUS"x != ""x ] ; then
$GRAB_MD5 $NONUS $THISARCH $CODENAME $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 $TYPEUP$CDNUM for source (part $THISNUM)"
else
echo "Creating $TYPEUP$CDNUM for binary-$THISARCH (part $THISNUM)"
fi
mkdir $UPD/CD$CDNUM $UPD/CD$CDNUM/.disk
INFO="Debian GNU/Linux $VER Update $TYPEUP $DATE: $THISARCH $TYPEUP $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