#!/bin/bash

### nginx_ensite --- Bash script to enable or disable a site in nginx.

### Copyright (C) 2010 António P. P. Almeida <appa@perusio.net>

### Author: António P. P. Almeida <appa@perusio.net>

### Permission is hereby granted, free of charge, to any person obtaining a
### copy of this software and associated documentation files (the "Software"),
### to deal in the Software without restriction, including without limitation
### the rights to use, copy, modify, merge, publish, distribute, sublicense,
### and/or sell copies of the Software, and to permit persons to whom the
### Software is furnished to do so, subject to the following conditions:

### The above copyright notice and this permission notice shall be included in
### all copies or substantial portions of the Software.

### Except as contained in this notice, the name(s) of the above copyright
### holders shall not be used in advertising or otherwise to promote the sale,
### use or other dealings in this Software without prior written authorization.

### THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
### IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
### FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
### THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
### LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
### FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
### DEALINGS IN THE SOFTWARE.

## The nginx binary.
NGINX=$(which nginx)
[ -x $NGINX ] || exit 0

## The paths for both nginx configuration files and the sites
## configuration files and symbolic link destinations.
NGINX_CONF_DIR=/etc/nginx
AVAILABLE_SITES_PATH="$NGINX_CONF_DIR/sites-available"
ENABLED_SITES_PATH="$NGINX_CONF_DIR/sites-enabled"
AVAILABLE_SITES_DIR="sites-available"
SCRIPTNAME=${0##*/}

## Checking the type of action we will perform. Enabling or disabling.
ACTION=$(echo $SCRIPTNAME | awk '$0 ~ /dissite/ {print "DISABLE"} $0 ~ /ensite/ {print "ENABLE"} $0 !~ /(dis|en)site/ {print "UNKNOWN"}')

if [ "$ACTION" == "UNKNOWN" ]; then
    echo "$SCRIPTNAME: Unknown action!"
    print_usage
    exit 4
fi

function print_usage() {
    echo "$SCRIPTNAME <site name>"
}

make_relative_path() {
    printf ../%.0s $(eval echo {0..`expr length "${1//[^\/]/}"`})
    echo "$AVAILABLE_SITES_DIR/$1"
}

## Check the number of arguments.
if [ $# -ne 1 ]; then
    print_usage
    exit 1
else
    SITE_AVAILABLE=`make_relative_path "$1"`

    # If enabling the 'default' site then make sure that it's teh
    # first to be loaded.
    if [ $1 == "default" ]; then
        SITE_ENABLED="$ENABLED_SITES_PATH/000-default"
    else
        SITE_ENABLED="$ENABLED_SITES_PATH/$1"
    fi

    # Check if the directory where we will place the symlink exists. If not create it.
    [ -d ${SITE_ENABLED%/*} ] || mkdir -p ${SITE_ENABLED%/*}
fi

## Check that the file corresponding to site exists if enabling or
## that the symbolic link exists if disabling. Perform the desired
## action if possible. If not signal an error and exit.
case $ACTION in
    ENABLE)
        # Change to the directory where we will place the symlink so that we
        # see the relative path correctly.
        cd "${SITE_ENABLED%/*}";

        if [ -r $SITE_AVAILABLE ]; then
            if [ -h $SITE_ENABLED ]; then
                ## If already enabled say it and exit.
                echo "$1 is already enabled."
                exit 0
            else # symlink if not yet enabled
                ln -s $SITE_AVAILABLE $SITE_ENABLED
            fi
            ## Test for a well formed configuration.
            echo "Testing nginx configuration..."
            $NGINX -t && STATUS=0
            if [ $STATUS ]; then
                echo -n "Site $1 has been enabled. "
                echo "Run /etc/init.d/nginx reload to apply the changes."
                exit 0
            else
                exit 2
            fi
        else
            echo "Site configuration file $1 not found."
            exit 3
        fi
        ;;
    DISABLE)
        if [ -h $SITE_ENABLED ]; then
            rm $SITE_ENABLED
            echo -n "Site $1 has been disabled. "
            echo "Run /etc/init.d/nginx reload to apply the changes."
            exit 0
        else
            echo "Site $1 doesn't exist."
            exit 3
        fi
        ;;
esac
