Add script 'add_proxy_parameter_to_vhost_configuration.sh'.

This commit is contained in:
Christoph 2024-04-24 16:33:39 +02:00
parent 5c9eae7f3e
commit 068c241353

View File

@ -0,0 +1,465 @@
#!/usr/bin/env bash
script_name="$(basename $(realpath $0))"
working_dir="$(dirname $(realpath $0))"
conf_file="${working_dir}/conf/${script_name%%.*}.conf"
tmp_log_file="$(mktemp)"
backup_date="$(date +%Y-%m-%d-%H%M)"
# -------------
# - Variable settings
# -------------
declare -a vhost_php_fpm_file_arr=()
apache_needs_restart=false
if [[ -f "/usr/local/apache2/conf/httpd.conf" ]]; then
_HTTPD_CONF_FILE="/usr/local/apache2/conf/httpd.conf"
elif [[ -f "/etc/apache2/apache2.conf" ]]; then
_HTTPD_CONF_FILE="/etc/apache2/apache2.conf"
else
_HTTPD_CONF_FILE=''
fi
if [[ -f "${_HTTPD_CONF_FILE}" ]] && $(grep -q -i -E "^\s*Timeout\s+" "${_HTTPD_CONF_FILE}") ; then
_TIMEOUT="$(grep -i -E "^\s*timeout\s+" "${_HTTPD_CONF_FILE}"| awk '{print$2}' | head -1)"
else
_TIMEOUT=60
fi
if [[ -f "${_HTTPD_CONF_FILE}" ]] && $(grep -q -i -E "^\s*ProxyTimeout\s+" "${_HTTPD_CONF_FILE}") ; then
PROXY_TIMEOUT="$(grep -i -E "^\s*ProxyTimeout\s+" "${_HTTPD_CONF_FILE}"| awk '{print$2}' | head -1)"
else
PROXY_TIMEOUT=${_TIMEOUT}
fi
# -------------
# --- Some functions
# -------------
clean_up() {
# Perform program exit housekeeping
rm -f $tmp_log_file
exit $1
}
# - Check if a given array (parameter 2) contains a given string (parameter 1)
# -
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
stringContain() {
[ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]
}
# - Remove leading/trailling whitespaces
# -
trim() {
local var="$*"
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
echo -n "$var"
}
echononl(){
echo X\\c > /tmp/shprompt$$
if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then
echo -e -n "$*\\c" 1>&2
else
echo -e -n "$*" 1>&2
fi
rm /tmp/shprompt$$
}
fatal(){
echo ""
if [[ -n "$*" ]] ; then
echo -e " [ \033[31m\033[1mFatal\033[m ]: $*"
echo ""
fi
echo -e " \033[31m\033[1mScript will be interrupted.\033[m\033[m"
echo ""
clean_up 1
}
error(){
echo ""
echo -e " [ \033[31m\033[1mFehler\033[m ]: $*"
echo ""
}
warn (){
echo ""
echo -e " [ \033[33m\033[1mWarning\033[m ]: $*"
echo ""
}
info (){
echo ""
echo -e " [ \033[32m\033[1mInfo\033[m ]: $*"
echo ""
}
echo_done() {
echo -e "\033[80G[ \033[32mdone\033[m ]"
}
echo_ok() {
echo -e "\033[80G[ \033[32mok\033[m ]"
}
echo_warning() {
echo -e "\033[80G[ \033[33m\033[1mwarn\033[m ]"
}
echo_failed(){
echo -e "\033[80G[ \033[1;31mfailed\033[m ]"
}
echo_skipped() {
echo -e "\033[80G[ \033[37mskipped\033[m ]"
}
trap clean_up SIGHUP SIGINT SIGTERM
# - Try to find apache vhost configuration directory
# -
if [[ -d "/usr/local/apache2/conf/vhosts" ]]; then
if [[ -d "/usr/local/apache2/conf/vhosts/0" ]]; then
_apache_vhost_dir="/usr/local/apache2/conf/vhosts/0"
else
_apache_vhost_dir="/usr/local/apache2/conf/vhosts"
fi
elif [[ -d "/etc/apache2/sites-enabled" ]]; then
_apache_vhost_dir="/etc/apache2/sites-enabled"
fi
clear
echo ""
echo -e "\033[32mRunning script \033[1m"$(basename $0)"\033[m .."
echo ""
echo ""
echo ""
echo -e "\033[32m--\033[m"
echo ""
echo "Insert Apache VHost directory.."
echo ""
echo ""
apache_vhost_dir=
if [ -z "$_apache_vhost_dir" ]; then
echononl "Apache VHost directory: "
read apache_vhost_dir
while [[ "X$apache_vhost_dir" = "X" ]] ; do
echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n"
echononl "Apache VHost directory: "
read apache_vhost_dir
done
else
echononl "Apache VHost directory [${_apache_vhost_dir}]: "
read apache_vhost_dir
if [[ "X$apache_vhost_dir" = "X" ]] ; then
apache_vhost_dir="$_apache_vhost_dir"
fi
fi
index_subdir_apache_vhost_dir="$(expr ${#apache_vhost_dir} + 1)"
if [[ "$(basename $apache_vhost_dir)" = 'sites-enabled' ]]; then
apache_vhost_base_dir="$(dirname $apache_vhost_dir)/sites-available"
elif [[ "$(basename $apache_vhost_dir)" =~ vhost ]]; then
apache_vhost_base_dir="$apache_vhost_dir"
elif [[ "$(basename $(dirname $apache_vhost_dir))" =~ vhost ]]; then
apache_vhost_base_dir="$(dirname $apache_vhost_dir)"
fi
declare -i _num=1
while IFS='' read -r -d '' fq_name ; do
dirname="$(basename "$fq_name")"
[[ "$dirname" = "DELETED" ]] && continue
[[ "$dirname" = "BAK" ]] && continue
[[ "$dirname" = "MAINTENANCE" ]] && continue
[[ "$dirname" =~ ^Moved ]] && continue
if [[ $_num -eq 1 ]]; then
_apache_additional_vhost_dirs="$(basename "$dirname")"
else
_apache_additional_vhost_dirs="$_apache_additional_vhost_dirs $(basename "$dirname")"
fi
((_num++))
done < <(find $apache_vhost_dir -mindepth 1 -maxdepth 1 -type d -print0)
echo ""
echo ""
echo -e "\033[32m--\033[m"
echo ""
echo "If there are additional apache vhost directories, enter them here .."
echo ""
echo -e "\033[33m\033[1mNotice\033[m:"
echo -e " only first level subdiirectories of \033[1m$apache_vhost_dir\033[m"
echo -e " are posible values."
echo ""
echo "Blank seperated list of directories"
echo ""
echo -e "Type:"
echo -e " \033[33m\033[1mNone\033[m\033[15Gfor no further vhost directoties"
echo -e " \033[33m\033[1m<RETURN>\033[m\033[15Gto accept the default inside the square brackets"
echo ""
apache_additional_vhost_dirs=
if [ -z "$_apache_additional_vhost_dirs" ]; then
echononl "Additional Apache VHost directory [None]: "
read apache_additional_vhost_dirs
if [[ -z "trim($apache_additional_vhost_dirs)" ]] ; then
apache_additional_vhost_dirs="None"
elif [[ "${apache_additional_vhost_dirs,,}" = 'none' ]] ; then
apache_additional_vhost_dirs="None"
fi
else
echononl "Additional Apache VHost directories [${_apache_additional_vhost_dirs}]: "
read apache_additional_vhost_dirs
if [[ "${apache_additional_vhost_dirs,,}" = 'none' ]] ; then
apache_additional_vhost_dirs="None"
elif [[ -z "$(trim $apache_additional_vhost_dirs)" ]] ; then
apache_additional_vhost_dirs="$_apache_additional_vhost_dirs"
fi
fi
if [[ -n "$apache_additional_vhost_dirs" ]] && [[ "$apache_additional_vhost_dirs" != "None" ]]; then
declare -a apache_additional_vhost_dir_arr=()
for _dir in $apache_additional_vhost_dirs ; do
if [[ -d "${apache_vhost_dir}/$_dir" ]] ; then
apache_additional_vhost_dir_arr+=("$_dir")
else
warn "$_dir is not a subdirectory of ${apache_vhost_dir}.\n\n \033[33m\033[1mIgnoring directory $_dir\033[m.."
fi
done
fi
echo ""
echo "apache_additional_vhost_dirs: $apache_additional_vhost_dirs"
echo ""
echo ""
echo -e " Apache Vhosts Directory................: \033[1m$apache_vhost_dir\033[m"
if [[ ${#apache_additional_vhost_dir_arr[@]} -gt 0 ]] ; then
declare -i counter=1
echo -en " Additional VHost Directories...........:\033[1m"
for _dir in ${apache_additional_vhost_dir_arr[@]} ; do
if [[ $counter -eq 1 ]] ; then
echo -e " \033[1m$_dir\033[m"
else
echo -e " \033[1m$_dir\033[m"
fi
counter=$((counter+1))
done
echo ""
fi
echo ""
echo ""
echo -e -n "\033[1mContinue with above settings? [y/n]:\033[m "
read OK
while [[ "X${OK}X" = "XX" ]] ; do
echo ""
echo -e -n "\033[1mContinue with above settings? [y/n]:\033[m "
read OK
done
if [[ "${OK,,}" != 'yes' ]] && [[ "${OK,,}" != 'y' ]]; then
fatal "Abort by user request."
else
echo ""
fi
echononl " Backup existing VHost Configuration directory"
if [[ -d "$apache_vhost_base_dir" ]]; then
cp -a "$apache_vhost_base_dir" "${apache_vhost_base_dir}.$backup_date" > $tmp_log_file 2>&1
if [[ $? -eq 0 ]]; then
echo_ok
else
echo_failed
error "$(cat $tmp_log_file)"
fi
else
echo_skipped
fi
echo ""
echononl " Create vhost file array.."
for _pgp_fpm_file in $(ls ${apache_vhost_dir}/*.php-fpm) ; do
vhost_php_fpm_file_arr+=("${_pgp_fpm_file}")
done
if [[ ${#apache_additional_vhost_dir_arr[@]} -gt 0 ]] ; then
for _dir in ${apache_additional_vhost_dir_arr[@]} ; do
for _pgp_fpm_file in $(ls ${apache_vhost_dir}/${_dir}/*.php-fpm) ; do
vhost_php_fpm_file_arr+=("${_pgp_fpm_file}")
done
done
fi
if [[ ${#vhost_php_fpm_file_arr[@]} -gt 0 ]] ; then
echo_ok
else
echo_skipped
warn "No vhost configuration file found!"
clean_up 1
fi
_found_unchanged_part_follows_pipe=false
echononl " Replace SetHandler part that follows the pipe.."
for vhost_php_fpm_file in ${vhost_php_fpm_file_arr[@]} ; do
$(grep -q -E "^\s*SetHandler\s+.*fcgi://php/" "${vhost_php_fpm_file}" 2> /dev/null) && continue
_found_unchanged_part_follows_pipe=true
apache_needs_restart=true
perl -i -n -p -e "s#fcgi://127.0.0.1#fcgi://php/#" ${vhost_php_fpm_file}
done
if $_found_unchanged_part_follows_pipe ; then
echo_ok
else
echo_skipped
fi
echo ""
regex_file_match_end="[[:space:]]*</FilesMatch>"
if [[ ${#vhost_php_fpm_file_arr[@]} -gt 0 ]] ; then
for vhost_php_fpm_file in ${vhost_php_fpm_file_arr[@]} ; do
echononl " Change vhost file \033[1m${vhost_php_fpm_file}\033[m"
if $(grep -q -E "^\s*<Proxy\s+\"fcgi://php/\">" "${vhost_php_fpm_file}" 2> /dev/null) ; then
echo_skipped
continue
fi
apache_needs_restart=true
mv "${vhost_php_fpm_file}" "/tmp"
> "${vhost_php_fpm_file}"
_found=false
while IFS= read -r line || [[ -n "$line" ]]; do
echo "${line}" >> "${vhost_php_fpm_file}"
if ! $_found && [[ $line =~ $regex_file_match_end ]] ; then
cat <<EOF >> "${vhost_php_fpm_file}"
# Define a matching worker.
# The part that is matched to the SetHandler is the part that
# follows the pipe. If you need to distinguish, "localhost; can
# be anything unique.
#
<Proxy "fcgi://php/">
# Recycle connections to the fastcgi dispatcher (PHP FPM).
#
# Use persistent connections to reduce the constant overhead of setting
# up new connections
#
ProxySet enablereuse=on
# max - the most proxied request per server
#
# max = pm.max_children / max number of servers
# = pm.max_children / (MaxRequestWorkers / ThreadsPerChild)
#
ProxySet max=16
# Forces the module to flush every chunk of data received from the FCGI backend
# as soon as it receives it, without buffering.
#
ProxySet flushpackets=on
# connectiontimeout
#
# Connect timeout in seconds. The number of seconds Apache httpd waits for the
# creation of a connection to the backend to complete. By adding a postfix of ms,
# the timeout can be also set in milliseconds.
#
ProxySet connectiontimeout=5
# timeout
#
# Socket timeout in seconds. The number of seconds Apache httpd waits for data
# sent by / to the backend.
#
#ProxySet timeout=${PROXY_TIMEOUT}
fi
</Proxy>
EOF
_found=true
fi
done <"/tmp/$(basename "${vhost_php_fpm_file}")"
if [[ $? -eq 0 ]]; then
echo_ok
else
echo_failed
error "$(cat $tmp_log_file)"
fi
done
fi
if $apache_needs_restart ; then
echo ""
echo -e "\033[32m------\033[m"
echo -e "Restart Apache Webservice"
echo -e "\033[32m------\033[m"
OK=""
echo ""
echo "Type 'y' to continue 'n' or any other key to skip removal of Domains"
echo
echo -e -n "\033[1mRestart Apache Webservice [y/n]:\033[m "
read OK
while [[ "X${OK}X" = "XX" ]] ; do
echo ""
echo -e -n "\033[1mRestart Apache Webservice [y/n]:\033[m "
read OK
done
if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then
echo ""
echononl " Graceful restart Apache Webservice.."
apachectl graceful
if [[ $? -eq 0 ]]; then
echo_ok
else
echo_failed
error "$(cat $tmp_log_file)"
echo "Error: $(cat $tmp_log_file)" >> $main_log
fi
fi # if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then
fi # if $apache_needs_restart
echo ""
clean_up 0