#!/bin/bash
# Publish a newer blank repository in place of an existing one
# Run this on the stratum 1 (oasis-replica), only in time of emergency

ME="`basename $0`"
MYDIR="`dirname $0`"
case "`hostname -s`" in
    *-itb) 
	STRATUM0=oasis-itb.opensciencegrid.org
	STRATUM1=oasis-replica-itb.opensciencegrid.org
	;;
    *)
	STRATUM0=oasis.opensciencegrid.org
	STRATUM1=oasis-replica.opensciencegrid.org
	;;
esac

usage()
{
    echo "Usage: $ME repositoryname" >&2
    exit 1
}

if [ $# != 1 ]; then
    usage
fi

REPO="$1"

if [ ! -f /srv/cvmfs/$REPO/.cvmfspublished ]; then
    echo "/srv/cvmfs/$REPO/.cvmfspublished does not exist" >&2
    usage
fi

if [ -f /cvmfs/$REPO/intentionally_blank ]; then
    echo "$REPO already blanked (/cvmfs/$REPO/intentionally_blank exists)" >&2
    exit 2
fi

set -e

REVISION="`cat -v /srv/cvmfs/$REPO/.cvmfspublished|sed -n '/^S/{s/^S//p;q;}'`"
let REVISION+=5
echo "Blank $REPO revision will be set to $REVISION"
# subtract 1 because we will be doing an extra publish
let REVISION-=1

NOW="`date +%Y%m%d%H%M%S`"
REPODIRS="/srv/cvmfs /etc/cvmfs/repositories.d /var/spool/cvmfs /oasissrv/cvmfs"
for D in $REPODIRS; do
    echo "Renaming $D/$REPO to $D/.$REPO.$NOW"
    mv $D/$REPO $D/.$REPO.$NOW
done

# restore if fails
trap "echo;echo Failed, restoring; set +e; set -x; cvmfs_server rmfs -f $REPO; for D in $REPODIRS; do rm -rf \$D/$REPO; mv \$D/.$REPO.$NOW \$D/$REPO; done" 0

echo "Making $REPO"
# need to have apache view match actual view during this
ln -s /srv/cvmfs/$REPO /oasissrv/cvmfs/$REPO
cvmfs_server mkfs -o root -w http://localhost:8080/cvmfs/$REPO $REPO
rm -f /etc/httpd/conf.d/cvmfs.$REPO.conf
echo "CVMFS_AUFS_WARNING=false" >>/etc/cvmfs/repositories.d/$REPO/server.conf
cvmfs_server transaction $REPO
mv /cvmfs/$REPO/new_repository /cvmfs/$REPO/intentionally_blank
PUBLISHREV=""
if cvmfs_server 2>&1 |grep -q -- "-n manual revision number"; then
    # -n option introduced in cvmfs-2.1.20 and -a option required same time
    PUBLISHREV="-a blank.$NOW -n $REVISION"
fi
cvmfs_server publish $PUBLISHREV $REPO

echo "Flushing cache of /cvmfs/$REPO/.cvmfswhitelist"
wget -qO/dev/null --header="Pragma: no-cache" http://localhost:8000/cvmfs/$REPO/.cvmfswhitelist

echo 
echo "Attempting to add $REPO on $STRATUM0"
OASISCMD="$MYDIR/add_osg_repository http://$STRATUM1:8000/cvmfs/$REPO"
if ! ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no $STRATUM0 $OASISCMD; then
    echo "Could not ssh to $STRATUM0 so run the following by hand there" 2>&1
    echo "  $OASISCMD" 2>&1
    echo -n "and then hit return to continue: " 2>&1
    read ANS
fi

wget --header="Pragma: no-cache" -O/srv/cvmfs/$REPO/.cvmfswhitelist "http://$STRATUM0:8000/cvmfs/$REPO/.cvmfswhitelist"
rm -f /etc/cvmfs/keys/$REPO.pub
cp /etc/cvmfs/keys/opensciencegrid.org.pub /etc/cvmfs/keys/$REPO.pub
if [ "$PUBLISHREV" = "" ]; then
    $MYDIR/set_repository_property revision $REVISION $REPO
else
    # show that publish works with new whitelist and key
    cvmfs_server transaction $REPO
    cvmfs_server publish $REPO
fi
trap 0
echo "Blanking of $REPO completed successfully"
