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