diff --git a/check_domain_on_webserver.sh b/check_domain_on_webserver.sh new file mode 120000 index 0000000..ffd30eb --- /dev/null +++ b/check_domain_on_webserver.sh @@ -0,0 +1 @@ +handle_domain_on_webserver.sh \ No newline at end of file diff --git a/handle_domain_on_webserver.sh b/handle_domain_on_webserver.sh new file mode 100755 index 0000000..9960df1 --- /dev/null +++ b/handle_domain_on_webserver.sh @@ -0,0 +1,994 @@ +#!/usr/bin/env bash + +log_file="$(mktemp)" + +only_check_domains=false +print_warnings=true + +if [[ "$(basename $0)" = "check_domain_on_webserver.sh" ]] ; then + only_check_domains=true +elif [[ "$(basename $0)" = "show_domain_on_webserver.sh" ]] ; then + only_check_domains=true + print_warnings=false +fi + +# ------------- +# - Variable settings +# ------------- + + + +# ------------- +# --- Some functions +# ------------- + +clean_up() { + + # Perform program exit housekeeping + rm -f $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 + +# ------------- +# - Some checks +# ------------- + +# - Is 'systemd' supported on this system +# - +if [ "X`which systemd`" = "X" ]; then + systemd_exists=false +else + systemd_exists=true +fi + +[[ -n "$*" ]] && _domains="$*" + +# - +# - grep -i -d skip -h -E "^\s*include\s+.*\.conf" $_apache_vhost_base_dir | awk '{print$2}' +# - + +# - 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-available" ]]; then + _apache_vhost_dir="/etc/apache2/sites-available" +fi + + + +clear +echo "" +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo "Insert domain(s), you wish to delete database, webspace and webserver configurations for.." +echo "" +echo " Multi domains are supported - give a blank separated list" +echo "" +echo "" +domains= +if [ -z "$_domains" ]; then + echononl "Domain: " + read domains + while [ "X$domains" = "X" ] ; do + echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n" + echononl "Domain: " + read domains + done +else + echononl "Domain [${_domains}]: " + read domains + if [[ "X$domains" = "X" ]]; then + domains=$_domains + fi +fi + +declare -a domain_req_for_del_arr +declare -a domain_marked_for_del_arr +for _domain in $domains ; do + domain_req_for_del_arr+=("$_domain") +done + +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 + + +echo "" +echo "" +echo -e "\033[32m--\033[m" +echo "" +echo -n " Domain(s)............................: " +declare -i counter=1 +for _domain in "${domain_req_for_del_arr[@]}" ; do + if [[ $counter -eq 1 ]] ; then + echo "$_domain" + else + echo " $_domain" + fi + counter=$((counter+1)) +done +unset counter +echo "" +echo " Apache Vhosts Directory..............: $apache_vhost_dir" +echo "" +echo "" +warn "To continue with te above Setting type uppercase 'YES'." +echo -n "Continue: " +read OK +echo "" +if [[ "$OK" != "YES" ]] ; then + fatal "Abort by user request - Answer as not 'YES'" +fi + +# ----- +# - Gathering global settings +# ----- + + +# - Check if mod_php is installed. +# - +mod_php_installed=false +if $(httpd -M | grep -q -E "php[5-9]?_module" 2>/dev/null) ; then + mod_php_installed=true + if $(apachectl status | grep -q "PHP/" 2>/dev/null) ; then + MOD_PHP_VERSION="$(trim $(apachectl status | grep "PHP/" | cut -d '/' -f2))" + else + MOD_PHP_VERSION=" UNKNOWN" + warn "'mod_php' ist running, but i cannot dermin the PHP Version.\n 'apachectl status' does not work on this server." + fi +fi + + +#declare -a _all_vhost_files_arr +#declare -a _all_document_root_dirs_arr +#while IFS='' read -r -d '' filename ; do +# if ! containsElement "$(realpath $filename)" "${_all_vhost_files_arr[@]}" ; then +# _all_vhost_files_arr+=("$(realpath $filename)") +# fi +#done < <(find $apache_vhost_dir -mindepth 1 -maxdepth 1 -type f -print0) +# +#for _vhost_file in ${_all_vhost_files_arr[@]} ; do +# _doc_root="$(grep -E "\s*DocumentRoot\s+" $_vhost_file 2> /dev/null \ +# | awk '{print$2}' | sed 's/"//g' | sed 's/\/$//' | sort -u )" +# if [[ -n "${_doc_root}" ]]; then +# _all_document_root_dirs_arr+=("${_doc_root}:${_vhost_file}") +# fi +#done + +# - Associative Array(s) +# - +declare -A vhost_file_domain_arr + +# - Non associative Array(s) +# - +declare -a vhost_file_req_for_del_arr +declare -a vhost_file_marked_for_del_arr +declare -a no_vhost_config_found + +declare -a docroot_req_for_del_arr +declare -a docroot_marked_for_del_arr + +declare -a database_req_for_del_arr +declare -a database_marked_for_del_arr + +declare -a hostname_in_use_arr + +declare -a msg_exclude_vhost_file_from_del_arr +declare -a msg_exclude_doc_root_from_del_arr +declare -a msg_exclude_domain_from_del_arr + +for domain in "${domain_req_for_del_arr[@]}" ; do + + echo "" + echo -e "\033[32mGoing to inspect domain \033[1m${domain}\033[m:" + + # - Empty domain concerning arrays + # - + hostname_arr=() + vhost_file_arr=() + symlink_file_arr=() + activ_file_arr=() + inactiv_file_arr=() + documentroot_arr=() + + database_arr=() + msg_missing_database_arr=() + + msg_hostname_in_use_arr=() + + php_version_arr=() + php_version_active_arr=() + + + + # ----- + # - Get Vhost configuration for current domain + # ----- + + _vhost_files="$(grep -l -d skip -E "^\s*(ServerName|ServerAlias)\s+.*${domain}" $apache_vhost_dir/* 2> /dev/null)" + if [[ -z "$_vhost_files" ]]; then + error "No VHost Configuration found for domain \033[37m\033[1m${domain}\033[m." + + # - Delete current domain from array 'domain_req_for_del_arr' + # - + no_vhost_config_found+=("${domain}") + continue + fi + + echo "" + + for _vhost_file in $_vhost_files ; do + + _basename_vhost_file="$(basename $_vhost_file)" + + containsElement "$_basename_vhost_file" "${vhost_file_arr[@]}" && continue + vhost_file_arr+=("$_basename_vhost_file") + if [[ -z "${vhost_file_domain_arr["$domain"]}" ]] ; then + vhost_file_domain_arr["$domain"]="$_basename_vhost_file" + else + vhost_file_domain_arr["$domain"]="${vhost_file_domain_arr["$domain"]}:$_basename_vhost_file" + fi + + if ! containsElement "$_basename_vhost_file" "${vhost_file_req_for_del_arr[@]}" ; then + vhost_file_req_for_del_arr+=("$_basename_vhost_file") + fi + + if [[ "${_vhost_file##*.}" = "conf" ]]; then + if [[ -L "$_vhost_file" ]] ; then + symlink_file_arr+=("$_basename_vhost_file") + _vhost_file="$(realpath $_vhost_file)" + activ_file_arr+=("$(basename $(realpath $_vhost_file))") + + # - If this file was (wrongly) written befor into array 'inactiv_file_arr' (see below) + # - we will delete it from array here. + # - + if containsElement "$_basename_vhost_file" "${inactiv_file_arr[@]}" ; then + + new_array=() + for value in "${inactiv_file_arr[@]}" ; do + [[ $value != "$_basename_vhost_file" ]] && new_array+=($value) + done + inactiv_file_arr=("${new_array[@]}") + unset new_array + + fi + else + activ_file_arr+=("$_basename_vhost_file") + fi + else + # - If an activ configuration file will be added here. We + # - correct it some loops later (see above) + # - + inactiv_file_arr+=("$_basename_vhost_file") + fi + + + # ----- + # - Get hostnames of current vhost configuration file + # ----- + + # - Get Server Name + # - + _server_names=$(grep -i -E "^\s*ServerName" $_vhost_file | sed -e "s/ServerName//" | sed "s/^\s*//" | sed "s/\s*$//" | sort -u) + + if [[ -n "$_server_names" ]] ; then + for _server_name in $_server_names ; do + if [[ ${#hostname_arr[@]} -eq 0 ]] ; then + hostname_arr+=("$_server_name") + else + containsElement "$_server_name" "${hostname_arr[@]}" && continue + hostname_arr+=("$_server_name") + fi + done + fi + + # - Get Server Aliase + # - + _server_aliases=$(grep -i -E "^\s*ServerAlias" $_vhost_file | sed -e "s/ServerAlias//" | sed "s/^\s*//" | sed "s/\s*$//" | sort -u) + + if [[ -n "$_server_aliases" ]] ; then + for _server_alias in $_server_aliases ; do + if [[ ${#hostname_arr[@]} -eq 0 ]] ; then + hostname_arr+=("$_server_alias") + else + containsElement "$_server_alias" "${hostname_arr[@]}" && continue + hostname_arr+=("$_server_alias") + fi + done + fi + + + # - Are there any hostnames NOT concerning to domains, which are requested + # - to delete? + # - + __msg="" + for hostname in ${hostname_arr[@]} ; do + + _matched_domain=false + + for _other_domain in ${domain_req_for_del_arr[@]} ; do + + if [[ "$hostname" =~ ${_other_domain}$ ]] ; then + _matched_domain=true + break + fi + + done + + if ! $_matched_domain ; then + + _tld="${hostname##*.}" + _tmp_str="${hostname%.*}" + _maindomain="${_tmp_str##*.}" + + if ! containsElement "$_basename_vhost_file:${hostname}:${_maindomain}.${_tld}" "${hostname_in_use_arr[@]}" ; then + __msg="The Vhost configuration file \033[37m\033[1m$_basename_vhost_file\033[m contains + also hostname \033[33m${hostname}\033[m. But the concerning domain \033[33m${_maindomain}.${_tld}\033[m + is not requested for deletion." + msg_hostname_in_use_arr[${#msg_hostname_in_use_arr[@]}]="$__msg" + hostname_in_use_arr+=("$_basename_vhost_file:${hostname}:${_maindomain}.${_tld}") + fi + + fi + + done + + + + # ----- + # - Get documetroot of current VHost configuration file + # ---- + + _documentroot=$(grep -E "^\s*DocumentRoot" $_vhost_file 2> /dev/null | awk '{print$2}' | sed 's/"//g' | sed 's/\/$//' | sort -u) + if ! containsElement "$_documentroot" "${documentroot_arr[@]}" ; then + + documentroot_arr+=("$_documentroot") + + if ! containsElement "$_documentroot" "${docroot_req_for_del_arr[@]}" ; then + docroot_req_for_del_arr+=("$_documentroot") + fi + fi + + done # for _vhost_file in $_vhost_files + + + # --- + # - Get databases + # --- + for _doc_root in "${documentroot_arr[@]}" ; do + + file_to_check="$(dirname $_doc_root)/db.inc.php" + file_to_check_mediawiki="$(dirname $_doc_root)/htdocs/LocalSettings.php" + + _found=false + if [[ -r "$file_to_check_mediawiki" ]] && [[ ! -d "$file_to_check_mediawiki" ]] ; then + db_search_string='\$wgDBname' + #db_search_string='\$wgEnableUserEmail' + _found=false + if grep -i -q "$db_search_string" $file_to_check_mediawiki > /dev/null 2>&1 ; then + database="$(grep -i "$db_search_string" $file_to_check_mediawiki 2> /dev/null \ + | awk -F '=' '{print$2}' \ + | awk -F ';' '{print$1}'\ + | tail -1)" + + # - Remove leading whitespace characters + database="${database#"${database%%[![:space:]]*}"}" + # - Remove trailing whitespace characters + database="${database%"${database##*[![:space:]]}"}" + # - Remove leading single quote + database="${database#"${database%%[!\']*}"}" + # - Remove trailing single quote + database="${database%"${database##*[!\']}"}" + # - Remove leading double quote + database="${database#"${database%%[!\"]*}"}" + # - Remove trailing double quote + database="${database%"${database##*[!\"]}"}" + + + _found=true + fi + + elif [[ -r "$file_to_check" ]] && [[ ! -d "$file_to_check" ]]; then + db_search_strings='\$db_name \$mysql_db' + _found=false + for _string in $db_search_strings ; do + if grep -i -q -E "^\s*$_string" $file_to_check > /dev/null 2>&1 ; then + + database="$(grep -i -E "^\s*$_string" $file_to_check 2> /dev/null | awk -F '=' '{print$2}' | tail -1 )" + + # - Remove leading whitespace characters + database="${database#"${database%%[![:space:]]*}"}" + # - Remove trailing whitespace characters + database="${database%"${database##*[![:space:]]}"}" + # - Rmove trailing semicolon characters + database="${database%"${database##*[!;]}"}" + # - Remove trailing whitespace characters + database="${database#"${database%%[!\']*}"}" + # - Remove trailing inverted comma characters + database="${database%"${database##*[!\']}"}" + + _found=true + + break + fi + done + + if ! $_found ; then + file_to_check="${_doc_root}/includes/config.inc.php" + if [[ -f "$file_to_check" ]]; then + if grep -i -q -E "^\s*define\('DB_DATABASE'" $file_to_check > /dev/null 2>&1 ; then + database="$(grep -i -m 1 -E "^\s*define\('DB_DATABASE'" $file_to_check 2> /dev/null \ + | awk -F ',' '{print$2}' \ + | awk -F ')' '{print$1}' \ + | tail -1 )" + + + # - Remove leading whitespace characters + database="${database#"${database%%[![:space:]]*}"}" + # - Remove trailing whitespace characters + database="${database%"${database##*[![:space:]]}"}" + # - Remove leading single quote + database="${database#"${database%%[!\']*}"}" + # - Remove trailing single quote + database="${database%"${database##*[!\']}"}" + # - Remove leading double quote + database="${database#"${database%%[!\"]*}"}" + # - Remove trailing double quote + database="${database%"${database##*[!\"]}"}" + + _found=true + fi + fi + fi + + fi + + if $_found ; then + database_arr+=("${database}:${_doc_root}") + database_req_for_del_arr+=("${database}") + else + __msg="No database found for documentroot directory ${_doc_root}" + msg_missing_database_arr+=("$__msg") + fi + done + + + + # ----- + # - Get PHP version of current vhost configuration file + # ----- + for _file in ${vhost_file_arr[@]} ; do + _php_engine="" + _php_version="" + CUR_IFS=$IFS + IFS='' + if grep -q -E "^\s*(ProxyPassMatch|SetHandler).*php-[5-9]\.[0-9]+-" $apache_vhost_dir/$_file 2> /dev/null ; then + _php_engine="PHP FPM/FastCGI" + + if grep -q -E "^\s*(SetHandler).*php-[5-9]\.[0-9]+-" $apache_vhost_dir/$_file 2> /dev/null ; then + _php_fpm_socket="$(grep -E "^\s*(SetHandler).*php-[5-9]\.[0-9]+-" $apache_vhost_dir/$_file 2> /dev/null \ + | head -1 | cut -d ':' -f3 | cut -d'|' -f1)" + else + _php_fpm_socket= + fi + if [[ -S "$_php_fpm_socket" ]] ; then + _php_version="$(exec /usr/local/php-$(echo "$_php_fpm_socket" | grep -o -E "[5-9]\.[0-9]")/bin/php-cgi -v \ + | head -1 | awk '{print$2}')" + else + _php_version=" UNKNOWN" + fi + + elif grep -d skip -q -E "^\s*FCGIWrapper\s+.*\.php" $apache_vhost_dir/$_file 2> /dev/null ; then + _php_engine="PHP CGI/FastCGI" + + _fcgid_file="$(grep -E "^\s*FCGIWrapper\s+.*\.php" $apache_vhost_dir/$_file 2> /dev/null \ + | head -1 | awk '{print$2}')" + if [[ -f "$_fcgid_file" ]] ; then + _php_version="$($(grep "exec" $_fcgid_file | awk '{print$2}') -v | head -1 | awk '{print$2}')" + [[ -z "$_php_version" ]] && _php_version="unknown Version" + else + _php_version=" UNKNOWN" + fi + elif $mod_php_installed ; then + #_php_engine="Apache 2.0 Handler" + _php_engine="Apache Handler" + _php_version="$MOD_PHP_VERSION" + else + _php_engine="No PHP assigned" + fi + + if ! containsElement "$_file:${_php_engine}:$_php_version" "${php_version_arr[@]}" ; then + php_version_arr+=("$_file:${_php_engine}:$_php_version") + fi + if containsElement "$_file" "${activ_file_arr[@]}" ; then + php_version_active_arr+=("$_file:${_php_engine}:$_php_version") + fi + IFS=$CUR_IFS + done + + + + # ----- + # - Summary current domain + # ----- + + #echo -e " \033[32mSummary domain \033[1m${domain}\033[m:\n" + + echo " VHost files:" + for _file in ${vhost_file_arr[@]} ; do + echo -n " $_file" + if containsElement "$_file" "${symlink_file_arr[@]}" ; then + echo " (Symlink)" + elif containsElement "$_file" "${activ_file_arr[@]}" ; then + echo " (active)" + else + echo " (inactive)" + fi + done + echo "" + + CUR_IFS=$IFS + IFS='' + echo " PHP Versions (active):" + for _val in ${php_version_active_arr[@]} ; do + IFS=':' read -a _val_arr <<< "$_val" + echo -e " ${_val_arr[0]}:\033[55G\033[33m${_val_arr[1]} ${_val_arr[2]}\033[m" + done + echo "" + echo " PHP Versions (all):" + for _val in ${php_version_arr[@]} ; do + IFS=':' read -a _val_arr <<< "$_val" + echo -e " ${_val_arr[0]}:\033[55G${_val_arr[1]} ${_val_arr[2]}" + done + echo "" + IFS=$CUR_IFS + + + echo " Hostnames: " + for _hostname in ${hostname_arr[@]} ; do + echo " $_hostname" + done + echo "" + + + echo " DocumentRoot directories: " + for _doc_root in ${documentroot_arr[@]} ; do + echo " $_doc_root" + done + echo "" + + echo " Database(s):" + for _val in "${database_arr[@]}" ; do + IFS=':' read -a _val_arr <<< "$_val" + echo " ${_val_arr[0]} - ${_val_arr[1]}" + done + echo "" + + + if $print_warnings ; then + + # ----- + # - Warnings current documentroot + # ----- + + CUR_IFS=$IFS + IFS='' + msg="" + declare -i _counter=1 + if [[ ${#msg_hostname_in_use_arr[@]} -gt 0 ]] ; then + for _msg in ${msg_hostname_in_use_arr[@]} ; do + if [[ $_counter -eq 1 ]]; then + msg="$_msg" + else + msg="$msg\n\n $_msg" + fi + _counter=$((_counter+1)) + done + + warn "$msg" + fi + IFS=$CUR_IFS + + # - !! must be placed outside domain-loop + # - + #if [[ ${#documentroot_in_use_arr[@]} -gt 0 ]] ; then + # for _val in ${documentroot_in_use_arr[@]} ; do + # IFS=':' read -a _val_arr <<< "${_val}" + # echo "${_val_arr[0]} is also in use at VHost configuration file ${_val_arr[1]}!" + # done + #fi + + + # ----- + # - Warnings current database(s) + # ----- + + CUR_IFS=$IFS + IFS='' + msg="" + declare -i _counter=1 + if [[ ${#msg_missing_database_arr[@]} -gt 0 ]] ; then + for _msg in ${msg_missing_database_arr[@]} ; do + if [[ $_counter -eq 1 ]]; then + msg="$_msg" + else + msg="$msg\n\n $_msg" + fi + _counter=$((_counter+1)) + done + + warn "$msg" + fi + IFS=$CUR_IFS + + fi # if $print_warnings + +done + +if $only_check_domains ; then + + rm -f $log_file + echo "" + clean_up +fi + + + +echo "" +echo -e "\033[32m------\033[m" +echo -e "Summary VHost Configuration files" +echo -e "\033[32m------\033[m" + +# ========== +# - Vhost configuration files +# ========== + +for _vhost_file in ${vhost_file_req_for_del_arr[@]}; do + _found=false + for _val in ${hostname_in_use_arr[@]} ; do + IFS=':' read -a _val_arr <<< "${_val}" + if [[ "${_val_arr[0]}" = "$_vhost_file" ]] ; then + _found=true + + + __msg="The VHost configuration file \033[37m\033[1m${_vhost_file}\033[m is also + used at least by domain \033[33m${_val_arr[1]}\033[m. + But that domain isn't marked for deletion." + msg_exclude_vhost_file_from_del_arr[${#msg_exclude_vhost_file_from_del_arr[@]}]="$__msg" + + break + fi + done + if ! $_found ; then + vhost_file_marked_for_del_arr+=("$_vhost_file") + fi +done + +# - VHost configuration files requested for deletion +# - +echo "" +echo " VHost configuration files requested for deletion" +if [[ ${#vhost_file_req_for_del_arr[@]} -gt 0 ]]; then + for _vhost_file in ${vhost_file_req_for_del_arr[@]} ; do + echo " $_vhost_file" + done +else + echo -e " *** \033[33mNo VHost configuration files are requested for deletion\033[m ***" +fi + + +# - VHost configurtion files marked for deletion +# - +echo "" +echo " VHost configuration files marked for deletion" +if [[ ${#vhost_file_marked_for_del_arr[@]} -gt 0 ]]; then + for _vhost_file in ${vhost_file_marked_for_del_arr[@]} ; do + echo " $_vhost_file" + done +else + echo -e " *** \033[33mNo VHost configuration files are marked for deletion\033[m ***" +fi + +# ----- +# - Warn about VHost configurtion files not be marked for deletion. +# ----- + +CUR_IFS=$IFS +IFS='' +msg="" +declare -i _counter=1 +if [[ ${#msg_exclude_vhost_file_from_del_arr[@]} -gt 0 ]] ; then + for _msg in ${msg_exclude_vhost_file_from_del_arr[@]} ; do + if [[ $_counter -eq 1 ]]; then + msg="$_msg" + else + msg="$msg\n\n $_msg" + fi + _counter=$((_counter+1)) + done + + warn "$msg" +fi +IFS=$CUR_IFS + + +echo "" +echo -e "\033[32m------\033[m" +echo -e "Summary DocumentRoot directories" +echo -e "\033[32m------\033[m" + +# ========== +# - DocumentRoot directories +# ========== + + +# - Check for DocumetRoot directories that are in use by VHost configuration files NOT +# - marked for deletion. If found, do also NOT mark that DocumentRoot directory for +# - deletion. +# - +for _doc_root in ${docroot_req_for_del_arr[@]} ; do + _tmp_files="$(grep -l -d skip -E "\s*DocumentRoot\s+\"?${_doc_root}" $apache_vhost_dir/* 2> /dev/null)" + _not_in_use_by_others=true + for _tmp_file in $_tmp_files ; do + if ! containsElement "$(basename $_tmp_file)" "${vhost_file_marked_for_del_arr[@]}" ; then + _not_in_use_by_others=false + + __msg="The DocumentRoot directory \033[37m\033[1m${_doc_root}\033[m is also + used by vhost configuration file \033[33m${_tmp_file}\033[m. + But this file isn't marked for deletion." + msg_exclude_doc_root_from_del_arr[${#msg_exclude_doc_root_from_del_arr[@]}]="$__msg" + + + break + fi + done + + if $_not_in_use_by_others ; then + if ! containsElement "$_doc_root" "${docroot_marked_for_del_arr[@]}" ; then + docroot_marked_for_del_arr+=("${_doc_root}") + fi + fi +done + + +# - DocumentRoot directories requested for deletion +# - +echo "" +echo " DocumentRoot directories requested for deletion" +if [[ ${#docroot_req_for_del_arr[@]} -gt 0 ]]; then + for _doc_root in ${docroot_req_for_del_arr[@]} ; do + echo " $_doc_root" + done +else + echo -e " *** \033[33mNo DocumentRoot directories are requested for deletion\033[m ***" +fi + +# - DocumentRoot directories marked for deletion +# - +echo "" +echo " DocumentRoot directories marked for deletion" +if [[ ${#docroot_marked_for_del_arr[@]} -gt 0 ]]; then + for _doc_root in ${docroot_marked_for_del_arr[@]} ; do + echo " $_doc_root" + done +else + echo -e " *** \033[33mNo DocumentRoot directories are marked for deletion\033[m ***" +fi + +# ----- +# - Warn about DocumentRoot directories that connot be deleted it is referenced +# - by vhost configuration files NOT marked for deletion. +# ----- + +CUR_IFS=$IFS +IFS='' +msg="" +declare -i _counter=1 +if [[ ${#msg_exclude_doc_root_from_del_arr[@]} -gt 0 ]] ; then + for _msg in ${msg_exclude_doc_root_from_del_arr[@]} ; do + if [[ $_counter -eq 1 ]]; then + msg="$_msg" + else + msg="$msg\n\n $_msg" + fi + _counter=$((_counter+1)) + done + + warn "$msg" +fi +IFS=$CUR_IFS + + +echo "" +echo -e "\033[32m\033[1m------\033[m" +echo -e "Summary Domains" +echo -e "\033[32m\033[1m------\033[m" + + +# ========== +# - Domains +# ========== + + +# - Check if domain can savely be marked for deletion. That is, if no remaining +# - VHost configuration files contains hostname concerning that domain +# - +for domain in "${domain_req_for_del_arr[@]}" ; do + if containsElement "$domain" "${no_vhost_config_found[@]}" ; then + __msg="No VHost configuration present for domain \033[37m\033[1m${domain}\033[m. The domain is not + marked for deletion." + msg_exclude_domain_from_del_arr[${#msg_exclude_domain_from_del_arr[@]}]="$__msg" + continue + fi + _not_found=false + IFS=':' read -a _val_arr <<< "${vhost_file_domain_arr["$domain"]}" + for _vhost_file in "${_val_arr[@]}" ; do + if ! containsElement "$_vhost_file" "${vhost_file_marked_for_del_arr[@]}" ; then + _not_found=true + fi + done + if $_not_found ; then + __msg="At least VHost configuration File \033[33m${_vhost_file}\033[m for + domain \033[37m\033[1m${domain}\033[m is excluded from deletion. So also the domain + itself will not marked for deletion." + msg_exclude_domain_from_del_arr[${#msg_exclude_domain_from_del_arr[@]}]="$__msg" + else + domain_marked_for_del_arr+=("$domain") + fi +done + + +# - Domain(s) files requested for deletion +# - +echo "" +echo " Domain(s) requested for deletion" +if [[ ${#domain_req_for_del_arr[@]} -gt 0 ]]; then + for _domain in "${domain_req_for_del_arr[@]}" ; do + echo " $_domain" + done +else + echo -e " *** \033[33mNo Domain is requested for deletion\033[m ***" +fi + + +# - Domain(s) marked for deletion +# - +echo "" +echo " Domain(s) marked for deletion" +if [[ ${#domain_marked_for_del_arr[@]} -gt 0 ]]; then + for _domain in "${domain_marked_for_del_arr[@]}" ; do + echo " $_domain" + done +else + echo -e " *** \033[33mNo Domain is marked for deletion\033[m ***" +fi + +# ----- +# - Warn about Domains, which will not be marked for deletion. +# ----- + +CUR_IFS=$IFS +IFS='' +msg="" +declare -i _counter=1 +if [[ ${#msg_exclude_domain_from_del_arr[@]} -gt 0 ]] ; then + for _msg in ${msg_exclude_domain_from_del_arr[@]} ; do + if [[ $_counter -eq 1 ]]; then + msg="$_msg" + else + msg="$msg\n\n $_msg" + fi + _counter=$((_counter+1)) + done + + warn "$msg" +fi +IFS=$CUR_IFS + +rm -f $log_file +echo "" +clean_up diff --git a/show_domain_on_webserver.sh b/show_domain_on_webserver.sh new file mode 120000 index 0000000..ffd30eb --- /dev/null +++ b/show_domain_on_webserver.sh @@ -0,0 +1 @@ +handle_domain_on_webserver.sh \ No newline at end of file