mirror-new-cd-set
# 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.
usage_message () {
echo "Usage: $(basename $0) [options] \\
cd-iso-directory cd-contents-directory version-string \\
cd-mirror-dir cd-name-field"
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-field old-name-field] (e.g. pos of xfce in iso for xfce CD)
[-j|--jigdo-url URL-with-jigdo-files]
[-f|--from-iso] (Assume iso's already created, don't use jigdo)
[-t|--test-param]
"
}
pushd () {
OLDCURDIR="$(pwd)"
cd "$1"
return $?
}
popd () {
cd "$OLDCURDIR"
return $?
}
docmd () {
[ "$VERBOSE" = "TRUE" ] && echo $@
"$@" || exit 1
}
PARSEDPARAMS=$(getopt --options "vb:c:j:ptfo:n:" --longoptions "verbose,old-base-dir:,old-contents-dir:,jigdo-url:,test-param,from-iso,old-version:,old-name-field:" --name "$0" --shell sh -- "$@")
if [ $? != 0 ]; then
echo "Aborting..." >&2
exit 1
fi
TESTPARAM=FALSE
JIGDOURL=
VERBOSE=FALSE
OLDCDBASEDIR=
OLDCONTENTSDIR=
OLDVERSION=
OLDNAMEFIELD=
VERBOSE_ARG=
OLDBASE_ARG=
OLDCONTENTS_ARG=
OLDVERSION_ARG=
OLDNAME_ARG=
EXTRACD_ARG=
OLDISO_ARG=
FROMISO_ARG=
UPDATE=FALSE
FROMISO=FALSE
EXTRACD=FALSE
OLDNAME=
OLDISO=
eval set -- "$PARSEDPARAMS"
while true; do
case "$1" in
-v|--verbose)
VERBOSE=TRUE
echo "Verbose messages enabled"
VERBOSE_ARG="$1"
shift
;;
-b|--old-base-dir)
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
OLDBASE_ARG="$1"" ""$2"
UPDATE=TRUE
shift 2
;;
-c|--old-contents-dir)
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
OLDCONTENTS_ARG="$1"" ""$2"
UPDATE=TRUE
shift 2
;;
-j|--jigdo-url)
JIGDOURL=$2
shift 2
;;
-t|--test-param)
TESTPARAM=TRUE
shift
;;
-f|--from-iso)
FROMISO=TRUE
FROMISO_ARG="$1"
shift
;;
-o|--old-version)
OLDVERSION="$2"
OLDVERSION_ARG="$1"" ""$2"
UPDATE=TRUE
shift 2
;;
-n|--old-name-field)
OLDNAMEFIELD="$2"
UPDATE=TRUE
;;
--)
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
fi
if [ -z "$4" ]; then
usage_message
echo "No mirror directory specified" >&2
exit 1
fi
MIRRORDIR=$(readlink --no-newline --canonicalize-existing "$4")
if [ -z "$MIRRORDIR" ]; then
usage_message
echo "Unknown mirror directory (doesn't exist?)" >&2
exit 1
fi
NAMEFIELD=$5
if [ -z "$NAMEFIELD" ] || [ $NAMEFIELD -le 0 ]; then
usage_message
echo "Bad number for cd-name field" >&2
exit 1
fi
if [ -z "$OLDCDBASEDIR" ]; then
OLDCDBASEDIR="$CDBASEDIR"
fi
if [ -z "$OLDCONTENTSDIR" ]; then
OLDCONTENTSDIR="$CONTENTDIRS"
fi
if [ -z "$OLDVERSION" ]; then
OLDVERSION="$VERSION"
fi
if [ -z "$OLDNAMEFIELD" ]; then
OLDNAMEFIELD="$NAMEFIELD"
fi
if [ "$FROMISO" = "TRUE" ] && [ -n "$JIGDOURL" ]; then
usage_message
echo "Can't supply a jigdo url when we're not using jigdos" >&2
exit 1
fi
if [ "$VERBOSE" = "TRUE" ] || [ "$TESTPARAM" = "TRUE" ]; then
echo "CDBASEDIR=$CDBASEDIR"
echo "CONTENTSDIR=$CONTENTSDIR"
echo "VERSION=$VERSION"
echo "MIRRORDIR=$MIRRORDIR"
echo "NAMEFIELD=$NAMEFIELD"
echo "OLDVERSION=$OLDVERSION"
echo "OLDNAMEFIELD=$OLDNAMEFIELD"
echo "OLDCDBASEDIR=$OLDCDBASEDIR"
echo "OLDCONTENTSDIR=$OLDCONTENTSDIR"
echo "JIGDOURL=$JIGDOURL"
echo "FROMISO=$FROMISO"
echo "UPDATE=$UPDATE"
echo "TESTPARAM=$TESTPARAM"
echo "VERBOSE=$VERBOSE"
echo ""
echo "Done parsing parameters"
fi
if [ "$TESTPARAM" = "TRUE" ]; then
exit 0
fi
mkdir -p $CONTENTSDIR/$VERSION || exit 1
if [ "$FROMISO" = "TRUE" ]; then
pushd "$CDBASEDIR/cd-$VERSION" || exit 1
BASEEXT=".iso"
else
if [ -n "$JIGDOURL" ]; then
if [ ! -x "$CDBASEDIR/cd-jigdo-$VERSION" ]; then
mkdir -p "$CDBASEDIR/cd-jigdo-$VERSION"
fi
fi
pushd "$CDBASEDIR/cd-jigdo-$VERSION" || exit 1
BASEEXT=".jigdo"
if [ -n "$JIGDOURL" ]; then
echo "Downloading jigdo files"
if [ "$VERBOSE" = "TRUE" ]; then
wget -O- "$JIGDOURL" | grep 'a href="' | grep -v 'index.html' | sed -e 's/.*href="\(.*\)".*/\1/' | wget --base="$JIGDOURL" -i- || exit 1
else
wget --quiet -O- "$JIGDOURL" | grep 'a href="' | grep -v 'index.html' | sed -e 's/.*href="\(.*\)".*/\1/' | wget --quiet --base="$JIGDOURL" -i- || exit 1
fi
fi
fi
determine_old_isoname() {
if [ "$UPDATE" = "TRUE" ]; then
SKIPNHALF=TRUE
if [ "$CDTYPE" != "CD" ]; then
if [ "$CDTYPE" = "xfce+lxde" ]; then
if [ -n "echo $OLDVERSION | grep 4.0" ]; then
OLDNAME="xfce-CD-1"
else
OLDNAME="$NAME"
fi
FINDNAME="*$OLDNAME"".iso"
elif [ "$CDTYPE" = "update" ]; then
OLDNAME="$NAME"
FINDNAME="*update-*-$UPDATENAME"".iso"
elif [ "$CDTYPE" = "etchnhalf" ]; then
OLDNAME="$NAME"
FINDNAME="*etchnhalf-*-$NHALFNAME"".iso"
SKIPNHALF=FALSE
else
OLDNAME="$NAME"
FINDNAME="*$OLDNAME"".iso"
fi
if [ "$SKIPNALF" = "TRUE" ]; then
GREPV="grep -v 'nhalf'"
else
GREPV="cat -"
fi
FINDRESULT=$(find "$OLDCDBASEDIR"/cd-"$OLDVERSION" -name "$FINDNAME" | $GREPV)
if [ -n "$FINDRES" ]; then
OLDISO=$(basename $FINDRESULT)
if [ ! -r "$CDBASEDIR/cd-$VERSION/$iso" ] && [ "$FROMISO" != "TRUE" ]; then
NOFINDNAME="WARNING: Couldn't find old ISO matching $FINDNAME"
elif [ "$FROMISO" = "TRUE" ] && [ -r "$CDBASEDIR/cd-$VERSION/$iso" ]; then
NOFINDNAME="WARNING: Couldn't find old ISO matching $FINDNAME"
else
NOFINDNAME=""
fi
[ -n "$NOFINDNAME" ] && echo "$NOFINDNAME" >&2
OLDISO=""
fi
if [ -z "$OLDISO" ]; then
OLDNAME="CD-0"
OLDISO="ignore.iso"
fi
else
if [ "$CDNUM" -eq 1 ]; then
OLDNAME="CD-0"
OLDISO="ignore.iso"
elif [ "$1" != "LAST" ]; then
OLDNAME="CD-""$(expr $CDNUM - 1)"
OLDISO=$(basename $(find "$OLDCDBASEDIR"/cd-"$OLDVERSION" -name "*$OLDNAME"".iso"))
else
OLDNAME="$NAME"
OLDISO=$(basename $(find "$OLDCDBASEDIR"/cd-"$OLDVERSION" -name "*$OLDNAME"".iso"))
fi
fi
OLDNAME_ARG="--old-name $OLDNAME"
OLDISO_ARG="--old-iso $OLDISO"
fi
}
for basefile in $(ls *$BASEEXT | sort -n -t- -k $(expr $NAMEFIELD + 1)); do
BASENAME="$(basename $basefile $BASEEXT)"
NAME="$(echo $(basename $basefile $BASEEXT) | cut -f$NAMEFIELD- -d-)"
CDTYPE=$(echo $NAME | cut -f1 -d-)
if [ "$CDTYPE" != "CD" ]; then
EXTRACD=TRUE
EXTRACD_ARG="--extracd"
UPDATECD="$(echo $BASENAME | cut -f2 -d- )"
NHALFCD="$(echo $BASENAME | cut -f3 -d- )"
if [ "$UPDATECD" = "update" ]; then
CDNUM="$(echo $NAME | cut -f3 -d-)"
UPDATENAME="$NAME"
NAME="update-CD-$CDNUM"
CDTYPE="update"
elif [ "$NHALFCD" = "etchnhalf" ]; then
CDTYPE="etchnhalf"
CDNUM="$(echo $NAME | cut -f3 -d-)"
if [ -z "$CDNUM" ]; then
CDNUM=1
fi
if [ $CDNUM -le 0 ]; then
CDNUM=1
fi
NHALFNAME="$NAME"
NAME="etchnhalf-$(echo $(basename $basefile $BASEEXT) | cut -f'$(expr $NAMEFIELD + 1)'- -d-)"
else
CDNUM=1
fi
else
CDNUM="$(echo $NAME | cut -f2 -d-)"
if [ -z "$CDNUM" ] || [ $CDNUM -le 0 ]; then
echo "$BASENAME: I don't know how to process a CD with this type of name" >&2
exit 1
fi
fi
determine_old_isoname
iso="$BASENAME"".iso"
if [ "$VERBOSE" = "TRUE" ]; then
echo "BASENAME=$BASENAME"
echo "NAME=$NAME"
echo "CDTYPE=$CDTYPE"
echo "CDNUM=$CDNUM"
echo "OLDNAME=$OLDNAME"
echo "iso=$iso"
echo "OLDISO=$OLDISO"
echo ""
fi
ACTION="Adding"
if [ "$UPDATE" = "TRUE" ]; then
ACTION="Updating"
fi
if [ ! -r "$CDBASEDIR/cd-$VERSION/$iso" ] && [ "$FROMISO" != "TRUE" ]; then
echo "$ACTION $NAME"
docmd mirror-new-cd $VERBOSE_ARG $OLDBASE_ARG $OLDCONTENTS_ARG $OLDNAME_ARG $OLDISO_ARG $OLDVERSION_ARG $FROMISO_ARG $EXTRACD_ARG $CDBASEDIR $CONTENTSDIR $VERSION $NAME $MIRRORDIR "$iso"
elif [ "$FROMISO" = "TRUE" ] && [ -r "$CDBASEDIR/cd-$VERSION/$iso" ]; then
echo "$ACTION $NAME"
docmd mirror-new-cd $VERBOSE_ARG $OLDBASE_ARG $OLDCONTENTS_ARG $OLDNAME_ARG $OLDISO_ARG $OLDVERSION_ARG $EXTRACD_ARG $FROMISO_ARG $CDBASEDIR $CONTENTSDIR $VERSION $NAME $MIRRORDIR "$iso" $OLDVERSION
elif [ "$FROMISO" = "TRUE" ] && [ ! -r "$CDBASEDIR/cd-$VERSION/$iso" ]; then echo "Missing $iso" >&2
exit 1
else
echo "Skipping $iso, it already exists" >&2
fi
OLDNAME_ARG=
OLDISO_ARG=
EXTRACD_ARG=
EXTRACD=FALSE
done
OLDISO=""
determine_old_isoname LAST
if [ -n "$OLDISO" ] && [ "$OLDISO" != "ignore.iso" ] && [ "$UPDATE" = "TRUE" ]; then
docmd pool-delcd "$OLDCDBASEDIR" "$OLDCONTENTSDIR" "$OLDVERSION" "$OLDCDNAME" "$OLDISONAME" "$VERBOSE_ARG" || exit 1
[ "$VERBOSE" = "TRUE" ] && echo "Removing dangling symlinks"
if [ "$VERBOSE" = "TRUE" ]; then
docmd symlinks -dr "$MIRRORDIR" || exit 1
else
symlinks -dr "$MIRRORDIR" >/dev/null || exit 1
fi
docmd rm -f "$OLDCDBASEDIR"/cd-"$OLDVERSION"/"$OLDISO" || exit 1
fi
popd
docmd sudo aufs-remount
echo "Done"
exit 0