#!/bin/bash # # vhost-stack # https://git.stack-source.com/msb/vhost-stack # Copyright (c) 2022 Matthew Saunders Brown # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # any script that includes this conf file will force user to be root if [ "$USER" != "root" ]; then exec sudo -u root $0 $@ fi # constants FPM_MAX=4 JAIL_USER=1 WRITE_INFO=1 # functions function vhost::set-virtualhostArray () { cd /srv/www virtualhostArray=(`ls -1|grep -v ^html$`) } function vhost::set-phpVersion () { PHP_MAJOR_VERSION=`php -r "echo PHP_MAJOR_VERSION;"` PHP_MINOR_VERSION=`php -r "echo PHP_MINOR_VERSION;"` phpVersion=$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION } function vhost::set-phpVersionArray () { mapfile -t phpVersionArray < <( /usr/bin/update-alternatives --list php-fpm.sock | sed "s|/run/php/php||g" | cut -d \- -f 1 ) } function vhost::set-opensslpass () { if [[ -f "/root/.vhost.ini" ]]; then opensslpass=`grep -E '^opensslpass\s?=' /root/.vhost.ini | cut -d = -f 2 | tr -d ' '` else install --owner=root --group=root --mode=640 /dev/null /root/.vhost.ini opensslpass=`/usr/bin/pwgen 16 1` echo "opensslpass = $opensslpass" >> /root/.vhost.ini fi } # crude but good enough domain name format validation function vhost::validate_domain () { local my_domain=$1 if [[ $my_domain =~ ^(([a-zA-Z0-9](-?[a-zA-Z0-9])*)\.)+[a-zA-Z]{2,}$ ]] ; then return 0 else return 1 fi } function vhost:getoptions () { local OPTIND while getopts "cd:f:i:m:o:p:u:j:hnvw:x:" opt ; do case "${opt}" in h ) # display help and exit help exit ;; c ) # cvs - output in cvs format cvs=true ;; d ) # domain name (virtualhost) to act on domain=${OPTARG,,} if ! vhost::validate_domain $domain; then echo "ERROR: $domain is not a valid domain name." exit 1 fi ;; f ) # php-fpm version fpm=${OPTARG} vhost::set-phpVersionArray if [[ ! " ${phpVersionArray[@]} " =~ " ${fpm} " ]]; then echo "Invalid PHP-FPM version." exit 1 fi ;; i ) # User ID (UID) for new user uid=${OPTARG} ;; m ) # macro - Apache mod_macro name macro=${OPTARG} ;; o ) # option - usually applied to previously specified variable # e.g. could be subdomain or alias depending on the macro defined option=${OPTARG} ;; p ) # password password=${OPTARG} ;; u ) # username username=${OPTARG,,} ;; j ) # jail - Whether or not to jail the user. 0 = no, 1 = yes. jail=${OPTARG} if [[ $jail != "0" ]] && [[ $jail != "1" ]]; then echo "ERROR: Invalid jail setting: -j $jail." exit 1 fi ;; n ) # dry-run dryrun=true ;; v ) # verbose verbose=true ;; w ) # write - store data in file write=${OPTARG} if [[ $write != "0" ]] && [[ $write != "1" ]]; then echo "ERROR: Invalid write setting: -w $write" exit 1 fi ;; x ) # php-fpm pm.max_children fpmmax=${OPTARG} if [[ $fpmmax != +([[:digit:]]) ]] || [[ $fpmmax -eq 0 ]]; then echo "ERROR: $fpmax for -x max_children not a valid number." exit fi ;; \? ) echo "Invalid option: $OPTARG" exit 1 ;; : ) echo "Invalid option: $OPTARG requires an argument" exit 1 ;; esac done shift $((OPTIND-1)) } # check for local config, which can be used to override any of the above if [[ -f /usr/local/etc/vhost.conf ]]; then source /usr/local/etc/vhost.conf fi