function print_help {
    echo "Usage: `basename $0` command [options]"
    echo ""
    echo "Commands:"
    echo "  status [site]    return status information about site configurations"
    echo "  init <site>      initialize site structure"
    echo "  update <site>    update to new version"
    echo ""
}

function site_init {
    if [ ! $1 ]; then
        echo "ERROR: site parameter mandatory"
        exit 1
    fi
    CONF_PATH="$CONF_DIR/conf.d/$1.conf"
    if [ ! -f $CONF_PATH ]; then
        echo "Site configuration not found: " $1
        exit 1
    fi
    source $CONF_PATH
    if [ -f "$SITE_ROOT/w/public/index.php" ]; then
        echo "Cannot override an existing deployment: $SITE_ROOT/w"
        exit 1
    fi
    # cleanup previous broken deployment
    rm -rf $SITE_ROOT/slot0
    # create directory structure
    for dir in slot0 slot1; do
        mkdir -p $SITE_ROOT/$dir
        chown $FILE_OWNER:$FILE_GROUP $SITE_ROOT/$dir
    done
    target_dir="$SITE_ROOT/slot0"
    # fetch catalog and write actual version
    fetch_catalog
    RELEASE_VERSION=`catalog_get_version`
    echo $RELEASE_VERSION > $SITE_ROOT/slot0/release
    # fetch and extract release tarball
    umask 0027
    if [[ $SOURCE_TARBALL == http* ]]; then
        echo "Download from http!"
        curl $SOURCE_TARBALL | tar -xzv -C $target_dir --strip-components 1 --no-same-permissions
    else
        echo "extract from local file system"
        if [ ! -f $SOURCE_TARBALL ]; then
            echo "Source tarball not found: $SOURCE_TARBALL"
            exit 1
        fi
        tar -xzvf $SOURCE_TARBALL -C $target_dir --strip-components 1 --no-same-permissions
    fi
    chown -R $FILE_OWNER:$FILE_GROUP $target_dir
    umask 0022
    # link configuration files managed by puppet
    ln -sf /etc/openstackid/environment.php $target_dir/bootstrap/environment.php
    ln -sf /etc/openstackid/recaptcha.php $target_dir/app/config/packages/greggilbert/recaptcha/$LARAVEL_ENV/config.php
    ln -sf /etc/openstackid/database.php $target_dir/app/config/$LARAVEL_ENV/database.php
    ln -sf /etc/openstackid/log.php $target_dir/app/config/$LARAVEL_ENV/log.php
    # convert app/storage into symlink and set permissions
    mv $target_dir/app/storage $SITE_ROOT/
    chmod 02770 $SITE_ROOT/storage
    find $SITE_ROOT/storage/ -type d -exec chmod 0775 {} \;
    find $SITE_ROOT/storage/ -type f -exec chmod 0664 {} \;
    rm -rf $target_dir/app/storage
    ln -s $SITE_ROOT/storage $target_dir/app
    # populate application database
    cd $target_dir
    php artisan migrate --env=$LARAVEL_ENV
    php artisan db:seed --env=$LARAVEL_ENV
    # activate site
    rm -rf $SITE_ROOT/w
    ln -s $SITE_ROOT/slot0 $SITE_ROOT/w
}

function site_status {
    if [ ! $1 ]; then
        echo "ERROR: site parameter mandatory"
        exit 1
    fi
    CONF_PATH="$CONF_DIR/conf.d/$1.conf"
    if [ ! -f $CONF_PATH ]; then
        echo "Site configuration not found: $1"
        exit 0
    fi
    source $CONF_PATH
    if [ ! -f "$SITE_ROOT/w/public/index.php" ]; then
        if [ -d "$SITE_ROOT/slot0" ]; then
            echo "PENDING"
        else
            echo "N/A"
            exit 1
        fi
    else
        fetch_catalog
        REMOTE_VERSION=`catalog_get_version`
        RELEASE_VERSION=$(head -n 1 $SITE_ROOT/w/release)
        if [ "$REMOTE_VERSION" == "$RELEASE_VERSION" ]; then
            echo "INSTALLED [$RELEASE_VERSION]"
        else
            echo "UPDATE AVAILABLE [$RELEASE_VERSION-$REMOTE_VERSION]"
        fi
    fi
}

function fetch_catalog {
    curl --silent $SOURCE_ROOT > $SITE_ROOT/releases.lst
    grep -q "^<!DOCTYPE HTML PUBLIC" $SITE_ROOT/releases.lst
}

function catalog_get_version {
    RAW_LINE=`cat $SITE_ROOT/releases.lst | grep "$RELEASE_NAME" | sed "s/<[^>]\+>//g" | sed -r "s/^$RELEASE_NAME//"`
    RELEASE_DATE=`echo $RAW_LINE | awk '{ print $1 " " $2}'`
    echo $RELEASE_DATE
}

function site_update {
    if [ ! $1 ]; then
        echo "ERROR: missing site parameter"
        exit 1
    fi
    CONF_PATH="$CONF_DIR/conf.d/$1.conf"
    if [ ! -f $CONF_PATH ]; then
        echo "Site configuration not found: $1"
        exit 0
    fi
    source $CONF_PATH
    SITE_LINK=`readlink -f $SITE_ROOT/w`
    ACTIVE_SLOT=`basename $SITE_LINK`
    case $ACTIVE_SLOT in
        slot0)
            TARGET_SLOT='slot1'
            ;;
        slot1)
            TARGET_SLOT='slot0'
            ;;
        *)
            echo "Invalid active slot"
            exit 1
    esac
    echo "Target slot: $TARGET_SLOT"
    target_dir="$SITE_ROOT/$TARGET_SLOT"
    rm -rf $target_dir
    mkdir $target_dir
    # fetch catalog and write actual version
    fetch_catalog
    RELEASE_VERSION=`catalog_get_version`
    echo $RELEASE_VERSION > $target_dir/release
    # fetch and extract release tarball
    umask 0027
    if [[ $SOURCE_TARBALL == http* ]]; then
        echo "Download from http!"
        curl $SOURCE_TARBALL | tar -xzv -C $target_dir --strip-components 1 --no-same-permissions
    else
        echo "extract from local file system"
        if [ ! -f $SOURCE_TARBALL ]; then
            echo "Source tarball not found: $SOURCE_TARBALL"
            exit 1
        fi
        tar -xzvf $SOURCE_TARBALL -C $target_dir --strip-components 1 --no-same-permissions
    fi
    chown -R $FILE_OWNER:$FILE_GROUP $target_dir
    umask 0022
    # link configuration files managed by puppet
    ln -sf /etc/openstackid/environment.php $target_dir/bootstrap/environment.php
    ln -sf /etc/openstackid/recaptcha.php $target_dir/app/config/packages/greggilbert/recaptcha/$LARAVEL_ENV/config.php
    ln -sf /etc/openstackid/database.php $target_dir/app/config/$LARAVEL_ENV/database.php
    ln -sf /etc/openstackid/log.php $target_dir/app/config/$LARAVEL_ENV/log.php
    # link shared app/storage directory
    rm -rf $target_dir/app/storage
    ln -s $SITE_ROOT/storage $target_dir/app
    # populate application database
    cd $target_dir
    php artisan migrate --env=$LARAVEL_ENV
    # activate site
    rm -rf $SITE_ROOT/w
    ln -s $target_dir $SITE_ROOT/w
}