mirror-new-cd
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this file, if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
# Assumes previous cd in the series has already been processed
usage_message () {
echo "Usage: $(basename $0) [options] \\
cd-iso-directory cd-contents-directory version-string \\
cd-name cd-mirror-dir iso-name"
echo ""
echo "Options:
[-v|--verbose]
[-b|--old-base-dir old-cd-iso-dir]
[-c|--old-contents-dir old-contents-dir]
[-o|--old-version old-version]
[-n|--old-name old-cd-name]
[-i|--old-iso old-iso-name]
[-f|--from-iso] (Assume iso's already created, don't use jigdo)
[-e|--extracd] (Don't add cd files to mirror, e.g. xfce is duplicates)
[-t|--test-param]
"
}
pushd () {
OLDCURDIR="$(pwd)"
cd "$1"
}
popd () {
cd "$OLDCURDIR"
}
PARSEDPARAMS=$(getopt --options "vb:c:to:n:i:fe" --longoptions "verbose,old-base-dir:,old-contents-dir:,test-param,old-version:,old-name:,old-iso:,from-iso,extracd" --name "$0" --shell sh -- "$@")
if [ $? != 0 ]; then
echo "Aborting..." >&2
exit 1
fi
TESTPARAM=FALSE
VERBOSE=FALSE
FROMISO=FALSE
EXTRACD=FALSE
OLDCDBASEDIR=
OLDCONTENTSDIR=
OLDVERSION=
OLDNAME=
OLDISO=
VERBOSE_ARG=
OLDBASE_ARG=
OLDCONTENTS_ARG=
OLDCDNAME_ARG=
OLDISO_ARG=
OLDVERSION_ARG=
UPDATE=FALSE
eval set -- "$PARSEDPARAMS"
while true; do
case "$1" in
--verbose|-v)
VERBOSE=TRUE
echo "Verbose messages enabled"
VERBOSE_ARG="$1"
shift
;;
--old-base-dir|-b)
OLDCDBASEDIR=$(readlink --no-newline --canonicalize-existing "$2")
if [ -z "$OLDCDBASEDIR" ]; then
usage_message
echo "Old ISO directory '$2' missing (dangling symlink?)" >&2
exit 1
fi
UPDATE=TRUE
OLDBASE_ARG="$1"" ""$2"
shift 2
;;
--old-contents-dir|-c)
OLDCONTENTSDIR=$(readlink --no-newline --canonicalize-existing "$2")
if [ -z "$OLDCDBASEDIR" ]; then
usage_message
echo "Old contents directory '$2' missing (dangling symlink?)" >&2
exit 1
fi
UPDATE=TRUE
OLDCONTENTS_ARG="$1"" ""$2"
shift 2
;;
-f|--from-iso)
FROMISO=TRUE
shift
;;
-e|--extracd)
EXTRACD=TRUE
shift
;;
--test-param|-t)
TESTPARAM=TRUE
shift
;;
-o|--old-version)
OLDVERSION="$2"
OLDVERSION_ARG="$1"" ""$2"
UPDATE=TRUE
shift 2
;;
-n|--old-name)
OLDCDNAME="$2"
UPDATE=TRUE
shift 2
;;
-i|--old-iso)
OLDISONAME="$2"
UPDATE=TRUE
shift 2
;;
--)
shift
break
;;
*)
echo "$0: Internal error parsing parameters!" >&2
exit 1
;;
esac
done
CDBASEDIR=$(readlink --no-newline --canonicalize-existing "$1")
if [ -z "$CDBASEDIR" ]; then
usage_message
echo "Unknown cd base directory" >&2
exit 1
fi
CONTENTSDIR=$(readlink --no-newline --canonicalize-existing "$2")
if [ -z "$CONTENTSDIR" ]; then
usage_message
echo "Unknown directory for CD contents" >&2
exit 1
fi
VERSION="$3"
if [ -z "$VERSION" ]; then
usage_message
echo "Unknown version" >&2
exit 1
fi
NAME="$4"
if [ -z "$NAME" ]; then
usage_message
echo "Unknown cd name" >&2
exit 1
fi
CDTYPE=$(echo $NAME | cut -f1 -d-)
CDNUM=""
if [ "$CDTYPE" = "CD" ]; then
CDNUM="$(echo $NAME | cut -f2 -d-)"
fi
if [ "$CDTYPE" = "CD" ] && [ -z "$CDNUM" ]; then
echo "I don't know how to process a CD with this type of name" >&2
exit 1
fi
MIRRORDIR=$(readlink --no-newline --canonicalize-existing "$5")
if [ -z "$MIRRORDIR" ]; then
usage_message
echo "Unknown mirror directory" >&2
exit 1
fi
ISONAME="$6"
if [ -z "$ISONAME" ]; then
usage_message
echo "Unknown ISO image name" >&2
exit 1
fi
if [ "$UPDATE" = "TRUE" ]; then
if [ -z "$OLDCDBASEDIR" ]; then
OLDCDBASEDIR="$CDBASEDIR"
fi
if [ -z "$OLDCONTENTSDIR" ]; then
OLDCONTENTSDIR="$CONTENTDIRS"
fi
if [ -z "$OLDVERSION" ]; then
OLDVERSION="$VERSION"
fi
if [ -z "$OLDCDNAME" ]; then
usage_message
echo "Old CD name is required when doing updates" >&2
exit 1
fi
if [ -z "$OLDISONAME" ]; then
usage_message
echo "Old ISO name is required when doing updates" >&2
exit 1
fi
fi
if [ "$VERBOSE" = "TRUE" ] || [ "$TESTPARAM" = "TRUE" ]; then
echo "CDBASEDIR=$CDBASEDIR"
echo "CONTENTSDIR=$CONTENTSDIR"
echo "OLDCDBASEDIR=$OLDCDBASEDIR"
echo "OLDCONTENTSDIR=$OLDCONTENTSDIR"
echo "VERSION=$VERSION"
echo "NAME=$NAME"
echo "MIRRORDIR=$MIRRORDIR"
echo "ISONAME=$ISONAME"
echo "OLDVERSION=$OLDVERSION"
echo "OLDISONAME=$OLDISONAME"
echo "TESTPARAM=$TESTPARAM"
echo "VERBOSE=$VERBOSE"
echo "UPDATE=$UPDATE"
echo "FROMISO=$FROMISO"
echo ""
echo "Done parsing parameters"
fi
if [ "$TESTPARAM" = "TRUE" ]; then
exit 0
fi
if [ "$VERBOSE" = "TRUE" ]; then
echo "mkdir -p $CONTENTSDIR/$VERSION/$NAME"
fi
VERBOSE_ARG=
[ "$VERBOSE" = "TRUE" ] && VERBOSE_ARG="--verbose"
if [ "$UPDATE" = "TRUE" ]; then
echo " Getting and updating to $ISONAME"
else
echo " Getting and adding $ISONAME"
fi
pushd "$CDBASEDIR"/cd-"$VERSION" || exit 1
if [ "$FROMISO" != "TRUE" ]; then
JIGDOBASE=$(basename "$ISONAME" .iso)
ln -s "$CDBASEDIR"/cd-jigdo-"$VERSION"/"$JIGDOBASE"".jigdo" . || exit 1
ln -s "$CDBASEDIR"/cd-jigdo-"$VERSION"/"$JIGDOBASE"".template" . || exit 1
[ "$VERBOSE" = "TRUE" ] && echo "Creating iso using jigdo"
RETFILE=$(mktemp -t 'jigdo-ret.XXXXXXXX')
echo "" | jigdo-lite --noask "$JIGDOBASE"".jigdo" 2>&1 | tee -a $RETFILE
if [ -z "$(tail $RETFILE | grep 'OK: Checksums match, image is good!')" ]; then
echo "Jigdo failed!"
exit 1
fi
[ "$VERBOSE" = "TRUE" ] && echo "Removing jigdo symlinks from iso directory"
rm -f "$JIGDOBASE"".jigdo" || exit 1
rm -f "$JIGDOBASE"".template" || exit 1
fi
if [ "$EXTRACD" != "TRUE" ]; then
pool-addcd "$CDBASEDIR" "$CONTENTSDIR" "$VERSION" "$NAME" "$MIRRORDIR" "$ISONAME" "$VERBOSE_ARG" || exit 1
if [ "$CDTYPE" = "CD" ] && [ $CDNUM -eq 1 ] || [ "$OLDNAME" = "CD-0" ]; then
if [ "$UPDATE" = "TRUE" ]; then
echo " First CD and we've successfully added, therefore we're done."
fi
exit 0
fi
if [ "$UPDATE" = "TRUE" ]; then
pool-delcd "$OLDCDBASEDIR" "$OLDCONTENTSDIR" "$OLDVERSION" "$OLDCDNAME" "$OLDISONAME" "$VERBOSE_ARG" || exit 1
[ "$VERBOSE" = "TRUE" ] && echo "Removing dangling symlinks"
if [ "$VERBOSE" = "TRUE" ]; then
symlinks -dr "$MIRRORDIR" || exit 1
else
symlinks -dr "$MIRRORDIR" >/dev/null || exit 1
fi
# if [ "$VERBOSE" = "TRUE" ]; then
# while [ -n "$(ps auxw | grep '$CDBASEDIR'/cd-'$OLDVERSION'/'$OLDISONAME' | grep -v grep)" ]; do
# echo "Waiting for fuseiso to release iso"
# sleep 60
# done
# else
# while [ -n "$(ps auxw | grep '$CDBASEDIR'/cd-'$OLDVERSION'/'$OLDISONAME' | grep -v grep)" ]; do
# sleep 60
# done
# fi
[ "$VERBOSE" = "TRUE" ] && echo "Removing old version of the CD one less in sequence than this one."
rm -f "$OLDCDBASEDIR"/cd-"$OLDVERSION"/"$OLDISONAME" || exit 1
[ "$VERBOSE" = "TRUE" ] && echo "Done upgrading $NAME"
else
[ "$VERBOSE" = "TRUE" ] && echo "Done adding $NAME"
fi
else # if [ "EXTRACD" = "TRUE" ]; then
if [ "$UPDATE" = "TRUE" ]; then
[ "$VERBOSE" = "TRUE" ] && echo "Removing old version of the CD."
rm -f "$OLDCDBASEDIR"/cd-"$OLDVERSION"/"$OLDISONAME" || exit 1
fi
fi
popd || exit 1
exit 0