#!/bin/sh SCRIPT_NAME="$(realpath "$0")" SCRIPT_PATH="$(dirname "$SCRIPT_NAME")" PATH="$SCRIPT_PATH/../share/bin/:$PATH" export SCRIPT_NAME export SCRIPT_PATH export PATH cd "$SCRIPT_PATH/../" . ./etc/config error() { if [ -n "$1" ]; then printf "%s\\n" "$1" >/dev/stderr fi exit 1 } exit_if_empty() { if [ -z "$1" ]; then error "$2" fi } usage() { cat << EOF USAGE: $0 [options] OPTIONS: -d The domain name -a Aliase(s) -m value Enable *http* or *https* -r Force redirection of http to https -p value Enable PHP with the given version (eg: 8.0) -u value Username in the system -i Enable script interactivity -h Show this help EOF } ####################### # Injection of params # ####################### ERROR=0 INTERACTIVE=1 SYSTEM_USER_USERNAME="web" PHP_ENABLED="yes" if [ -n "$1" ]; then INTERACTIVE=0 WEB_HTTP="no" WEB_HTTPS="no" WEB_HTTPS_FORCE="no" PHP_ENABLED="no" fi while getopts "hid:a:u:p:m:r" option; do case "$option" in d) DOMAIN="$OPTARG";; a) DOMAIN_ALIASES="$OPTARG";; u) SYSTEM_USER_USERNAME="web$(echo $OPTARG | sed 's/^web//')";; p) PHP_VERSION="$OPTARG" PHP_ENABLED="yes" ;; r) WEB_HTTPS_FORCE="yes";; m) if [ "$OPTARG" = "http" ]; then WEB_HTTP="yes" elif [ "$OPTARG" = "https" ]; then WEB_HTTPS="yes" fi ;; i) INTERACTIVE=1;; h) usage; exit 0;; :) ERROR=1;; ?) ERROR=1;; esac done if [ $ERROR -eq 1 ]; then error "Invalid parameter\\n$(usage)" fi export INTERACTIVE ########################## # Collect of information # ########################## TITLE="VHOST-MANAGER - NEW WEBSITE" DOMAIN="$(form_input -t "$TITLE" -l "Domain" -r -d "$DOMAIN")" exit_if_empty "$DOMAIN" "Aborded! (DOMAIN_EMPTY)" DOMAIN_ALIASES="$(form_input -t "$TITLE" -l "Aliase(s)" -d "$DOMAIN_ALIASES")" WEB_HTTP="$(form_yes_no -t "$TITLE" -l "Support of HTTP (recommended)" -d "$WEB_HTTP")" WEB_HTTPS="$(form_yes_no -t "$TITLE" -l "Support of HTTPS (recommended)" -d "$WEB_HTTPS")" if [ "$WEB_HTTP" = "yes" ] && [ "$WEB_HTTPS" = "yes" ]; then WEB_HTTPS_FORCE="$(form_yes_no -t "$TITLE" -l "Redirect HTTP to HTTPS (recommended)" -d "$WEB_HTTPS_FORCE")" else WEB_HTTPS_FORCE="no" fi DOCUMENT_ROOT="$(form_input -t "$TITLE" -l "Document root\n$WEB_ROOT_PATH/$DOMAIN/" -d "web/")" DOCUMENT_ROOT="$WEB_ROOT_PATH/$DOMAIN/$DOCUMENT_ROOT" PHP_ENABLED="$(form_yes_no -t "$TITLE" -l "Support of PHP" -d "$PHP_ENABLED")" if [ "$PHP_ENABLED" = "yes" ]; then COMMAND="form_choices -t \"$TITLE\"" if [ -n "$PHP_VERSION" ]; then COMMAND="$COMMAND -d \"$PHP_VERSION\"" fi COMMAND="$COMMAND -l \"Version of PHP\"" for VERSION in $PHP_VERSIONS; do VERSION_NORMALISED="$(echo "$VERSION" | tr -dc 1234567890)" eval "LABEL=\$PHP_${VERSION_NORMALISED}_LABEL" COMMAND="$COMMAND \"$VERSION\" \"$LABEL\"" done PHP_VERSION="$(eval "$COMMAND")" exit_if_empty "$PHP_VERSION" "Aborded! (PHP_VERSION_EMPTY)" fi USER_PASSWORD="$(tr -dc "0123456789!@#$%()[]*@<>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" < /dev/urandom | head -c 20)" SYSTEM_USER_USERNAME="$(form_input -t "$TITLE" -l "System username" -d "$SYSTEM_USER_USERNAME" -r)" SYSTEM_USER_PASSWORD=$( PASSWORD="$USER_PASSWORD" SALT=$(date +'%S') export PASSWORD export SALT crypt ) exit_if_empty "$SYSTEM_USER_USERNAME" "Aborded! (SYSTEM_USERNAME_EMPTY)" exit_if_empty "$MOD_FCGI" "Aborded! (MOD_FCGI_EMPTY)" ################ # Confirmation # ################ export DOMAIN export DOMAIN_ALIASES export DOCUMENT_ROOT export SYSTEM_USER_USERNAME export SYSTEM_USER_GROUP export PHP_ENABLED export MOD_FCGI export PHP_VERSION export WEB_HTTP export WEB_HTTPS export WEB_HTTPS_FORCE export WEB_ROOT_PATH export WEB_LOG_PATH export WEB_HTTPS_DEFAULT_CERT_PEM export WEB_HTTPS_DEFAULT_CERT_PRIVKEY export WEB_HTTPS_DEFAULT_CERT_CHAIN export WEB_BIND_ADDRESS if [ $INTERACTIVE -eq 0 ]; then CONTINUE="yes" else TMP_FILE="/tmp/vhost-add-$(tr -dc "qwertQWERTasdfgASDFGzxcvbZXCVB" < /dev/urandom | head -c 16)" touch "$TMP_FILE" chmod 600 "$TMP_FILE" template summary > "$TMP_FILE" whiptail --textbox "$TMP_FILE" --title "$TITLE - PREVIEW" 25 80 rm "$TMP_FILE" CONTINUE="$(form_yes_no -t "$TITLE" -l "Do you confirm?" -n)" fi if [ "$CONTINUE" = "no" ]; then printf "Aborded!\\n" exit 0 fi ############################### # User and directory creation # ############################### useradd -G "$SYSTEM_USER_GROUP" -s "$DEFAULT_SHELL" -m -p "$SYSTEM_USER_PASSWORD" -d "$WEB_ROOT_PATH/$DOMAIN" "$SYSTEM_USER_USERNAME" -k "$SKEL_PATH" chgrp www-data "$WEB_ROOT_PATH/$DOMAIN" chmod 750 "$WEB_ROOT_PATH/$DOMAIN" touch "$WEB_LOG_PATH/$DOMAIN.log" chmod 640 "$WEB_LOG_PATH/$DOMAIN.log" chgrp "$SYSTEM_USER_USERNAME" "$WEB_LOG_PATH/$DOMAIN.log" ####################### # Make configurations # ####################### SERVICES_TO_RELOAD="apache2" SYSTEM_USER_ID="$(id -u "$SYSTEM_USER_USERNAME")" PHP_FPM_PORT=$((SYSTEM_USER_ID + 12000)) export PHP_FPM_PORT if [ "$WEB_HTTP" = "yes" ]; then VHOST_FILE_SA="$APACHE_VHOST_SITES_AVAILABLE_PATH/${DOMAIN}.${WEB_HTTP_PORT}.conf" VHOST_FILE_SE="$APACHE_VHOST_SITES_ENABLED_PATH/${DOMAIN}.${WEB_HTTP_PORT}.conf" PORT=$WEB_HTTP_PORT template vhost-http > "$VHOST_FILE_SA" ln -rs "$VHOST_FILE_SA" "$VHOST_FILE_SE" fi if [ "$WEB_HTTPS" = "yes" ]; then VHOST_FILE_SA="$APACHE_VHOST_SITES_AVAILABLE_PATH/${DOMAIN}.${WEB_HTTPS_PORT}.conf" VHOST_FILE_SE="$APACHE_VHOST_SITES_ENABLED_PATH/${DOMAIN}.${WEB_HTTPS_PORT}.conf" PORT=$WEB_HTTPS_PORT template vhost-https > "$VHOST_FILE_SA" ln -rs "$VHOST_FILE_SA" "$VHOST_FILE_SE" fi if [ "$PHP_ENABLED" = "yes" ]; then PHP_VERSION_NORMALISED="$(echo "$PHP_VERSION" | tr -dc 1234567890)" eval "FPM_POOL_PATH=\$PHP_FPM${PHP_VERSION_NORMALISED}_POOL_PATH" eval "FPM_SERVICE=\$PHP_FPM${PHP_VERSION_NORMALISED}_SERVICE" SERVICES_TO_RELOAD="$SERVICES_TO_RELOAD $FPM_SERVICE" PHP_FPM_FILE="$FPM_POOL_PATH/${SYSTEM_USER_USERNAME}.conf" template php-fpm > "$PHP_FPM_FILE" fi for SERVICE in $SERVICES_TO_RELOAD; do service $SERVICE reload done export USER_PASSWORD TMP_FILE="/tmp/vhost-add-$(tr -dc "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" < /dev/urandom | head -c 16)" touch "$TMP_FILE" chmod 600 "$TMP_FILE" template result > "$TMP_FILE" if [ $INTERACTIVE -eq 1 ]; then whiptail --textbox "$TMP_FILE" --title "$TITLE - FINISH" 25 80 fi cat "$TMP_FILE" rm "$TMP_FILE"