#!/bin/bash
### nginx_ensite--- Bash script to enable or disable a site innginx.
### Copyright (C)2010, 2015 António P. P. Almeida ### Author: António P. P. Almeida### Permission is hereby granted,freeof charge, to any person obtaining a
### copy of this software and associated documentation files (the"Software"),
### to dealinthe 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 todoso, subject to the following conditions:
### The above copyright notice and this permission notice shall be includedin### all copies or substantial portions of the Software.
### Except as containedinthis notice, the name(s) of the above copyright
### holders shall not be usedinadvertising or otherwise to promote the sale,
### use or other dealingsinthis 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.
SCRIPTNAME=${0##*/}
## The nginx binary. Checkif we're root or not. If we are get the
## path to nginx. If not hardcode the path.if [ $(id -u) -eq 0 ]; thenIS_ROOT=1NGINX=$(command -v nginx) || exit 1
elseSTATUS=0NGINX=/usr/sbin/nginxfi## Default valueforthe configuration directory.
NGINX_CONF_DIR=/usr/local/nginx/conffunctionprint_usage() {echo "$SCRIPTNAME [-c default: /usr/local/nginx/conf] [ -s default: nginx] "}
## Extract the startup program name from a given argument. If it's a
## path to nginx then add the '-s reload'to the name. Otherwise just
## return the given argument.
## $1: the program name.
## Returns the proper startup program name,functionget_startup_program_name() {
local value="$1"[[ $1 =~ [[:alnum:]/-]*nginx$ ]] && value="$1 -s reload"
echo "$value"}
## The default start up program is nginx.
STARTUP_PROGRAM_NAME=$(get_startup_program_name nginx)
## Create the relative path to the vhostfile.
## $1: configuration filename (usually the vhost)
## $2: available sites directory name (usually sites-available)
## Returns the relative path from the sites-enabled directory.functionmake_relative_path() {
printf'../%.0s%s/%s' $(eval echo {0..$(expr length "${1//[^\/]/}")}) $2 $1}
## 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!" >&2print_usage
exit2
fi## Check the number of arguments.if [ $# -lt 1 -o $# -gt 5 ]; thenprint_usage>&2exit3
fi## Parse the getops arguments.while getopts c:s: OPT; do
case $OPT inc|+c)
NGINX_CONF_DIR=$(realpath "$OPTARG")if [[ ! -d $NGINX_CONF_DIR ]]; then
echo "$NGINX_CONF_DIR directory not found." >&2exit3
fi;;
s|+s)
STARTUP_PROGRAM_NAME=$(get_startup_program_name "$OPTARG")
;;*)
print_usage>&2exit4;;esac
done
shift $(( OPTIND - 1))
OPTIND=1## The pathsforboth nginx configuration files and the sites
## configuration files and symbolic link destinations.
AVAILABLE_SITES_PATH="$NGINX_CONF_DIR/sites-available"ENABLED_SITES_PATH="$NGINX_CONF_DIR/sites-enabled"## Check the number of arguments.if [ $# -ne 1 ]; thenprint_usage>&2exit3
elseSITE_AVAILABLE=$(make_relative_path "$1" ${AVAILABLE_SITES_PATH##*/})
## If enabling the'default' site then make sure that it's the
## first to be loaded.if [ "$1" == "default" ]; thenSITE_ENABLED="$ENABLED_SITES_PATH/default"
elseSITE_ENABLED="$ENABLED_SITES_PATH/$1"
fi## Checkifthe 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
## Test for a well formed configuration only when we are
## root.
if [ -n "$IS_ROOT" ]; then
echo "Testing nginx configuration..."
$NGINX -t && STATUS=0
fi
## Check the config testing status and if the link exists already.
if [ $STATUS ] && [ -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
if [ $STATUS ]; then
echo -n "Site $1 has been enabled."
printf '\nRun "%s" to apply the changes.\n' "$STARTUP_PROGRAM_NAME"
exit 0
else
exit 5
fi
else
echo "Site configuration file $1 not found." >&2
exit 6
fi
;;
DISABLE)
if [ "$1" = "default" ] ; then
if [ -h "$ENABLED_SITES_PATH/default" ] ; then
SITE_ENABLED="$ENABLED_SITES_PATH/default"
fi
fi
if [ -h $SITE_ENABLED ]; then
rm $SITE_ENABLED
echo -n "Site $1 has been disabled."
printf '\nRun "%s" to apply the changes.\n' "$STARTUP_PROGRAM_NAME"
exit 0
else
echo "Site $1 doesn't exist." >&2
exit 7
fi
;;
esac