#!/usr/bin/env bash # ------------- # - TODO: # - - Support postgres databases # - - Deleting maildomain on mailserver # ------------- working_dir="$(dirname $(realpath $0))" conf_file="${working_dir}/conf/handle_domain_on_webserver.conf" log_dir="${working_dir}/log" tmp_log_file="$(mktemp)" backup_date="$(date +%Y-%m-%d-%H%M)" delete_mode=false only_show=false only_check=false print_warnings=false # ------------- # - Variable settings # ------------- # ------------- # --- 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 # ------------- # - Some checks # ------------- if [[ "$(basename $0)" = "show_domain_on_webserver.sh" ]] ; then only_show=true elif [[ "$(basename $0)" = "check_domain_on_webserver.sh" ]] ; then only_check=true print_warnings=true elif [[ "$(basename $0)" = "delete_domain_related_configurations.sh" ]] ; then delete_mode=true print_warnings=true else fatal "Run one of the related scripts \033[1mshow_domain_on_webserver.sh\033[m,\n \033[1mcheck_domain_on_webserver.sh\\033[m or \033[1mdelete_domain_related_configurations.sh\033[m." fi # - 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-enabled" ]]; then _apache_vhost_dir="/etc/apache2/sites-enabled" fi # - Try to find apache websites base directory # - if [[ -d "/var/www/html/projekte" ]]; then _apache_web_base_dir="/var/www/html/projekte" elif [[ -d "/var/www/html" ]]; then _apache_web_base_dir="/var/www/html" elif [[ -d "/var/www" ]]; then _apache_web_base_dir="/var/www" fi clear echo "" echo -e "\033[32mRunning script \033[1m"$(basename $0)"\033[m .." echo "" # ------------- # - Load Settings from configuration file handle_domain_on_webserver.conf # ------------- if $delete_mode ; then echononl " Loading configuration settings from $(basename ${conf_file}).." if [[ -f "$conf_file" ]]; then source "$conf_file" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed fatal "$(cat $tmp_log_file)" fi else echo_failed fatal "Configuration file \033[1m$conf_file\033[m not found!" fi [[ -n "$DNS_MASTER_SERVER" ]] || fatal "Master Nameserver ist not set (Parameter DNS_MASTER_SERVER)!" include_slave_dns=true [[ -n "$DNS_SLAVE_SERVER" ]] || include_slave_dns=false [[ -n "$DNS_SSH_USER" ]] || DNS_SSH_USER="manage-bind" [[ -n "$DNS_SSH_PORT" ]] || DNS_SSH_PORT="22" [[ -n "$DNS_SSH_KEY" ]] || DNS_SSH_KEY="/root/.ssh/id_rsa-dns1" [[ -n "$SCRIPT_get_domain_by_hostname" ]] || SCRIPT_get_domain_by_hostname="/root/bin/bind/bind_get_domain_by_hostname.sh" [[ -n "$SCRIPT_remove_master_domain" ]] || SCRIPT_remove_master_domain="/root/bin/bind/bind_remove_domain_on_master.sh" [[ -n "$SCRIPT_remove_slave_domain" ]] || SCRIPT_remove_slave_domain="/root/bin/bind/bind_remove_domain_on_slave.sh" [[ -n "$MYSQL_CREDENTIAL_ARGS" ]] || MYSQL_CREDENTIAL_ARGS="-u root -S /run/mysqld/mysqld.sock" fi # ------------- # - Some prior checks # ------------- if $delete_mode ; then ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_MASTER_SERVER "ls" > /dev/null 2>&1 if [[ $? -gt 0 ]] ;then fatal "Nameserver \"$DNS_MASTER_SERVER\" is not reachable vis ssh!" fi ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_MASTER_SERVER "sudo $SCRIPT_get_domain_by_hostname check" > /dev/null 2>&1 if [[ $? -gt 0 ]] ;then fatal "Failed to access \033[1m$SCRIPT_get_domain_by_hostname\033[m on Nameserver \"$DNS_MASTER_SERVER\"!" fi ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_MASTER_SERVER "sudo $SCRIPT_remove_master_domain check" > /dev/null 2>&1 if [[ $? -gt 0 ]] ;then fatal "Failed to access \033[1m$SCRIPT_remove_master_domain\033[m on Nameserver \"$DNS_MASTER_SERVER\"!" fi if $include_slave_dns ; then ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_SLAVE_SERVER "ls" > /dev/null 2>&1 if [[ $? -gt 0 ]] ;then fatal "Nameserver \"$DNS_SLAVE_SERVER\" is not reachable vis ssh!" fi ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_SLAVE_SERVER "sudo $SCRIPT_remove_slave_domain check" > /dev/null 2>&1 if [[ $? -gt 0 ]] ;then fatal "Failed to access \033[1m$SCRIPT_remove_slave_domain\033[m on Nameserver \"$DNS_SLAVE_SERVER\"!" fi fi fi 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 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\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 "" echo -e "\033[32m--\033[m" echo "" echo "Insert Base Directory Apache Websites" echo "" echo "" apache_web_base_dir= if [ -z "$_apache_web_base_dir" ]; then echononl "Base Directory Apache Websites: " read apache_web_base_dir while [[ "X$apache_web_base_dir" = "X" ]] ; do echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n" echononl "Base Directory Apache Websites: " read apache_web_base_dir done else echononl "Base Directory Apache Websites [${_apache_web_base_dir}]: " read apache_web_base_dir if [[ "X$apache_web_base_dir" = "X" ]] ; then apache_web_base_dir="$_apache_web_base_dir" fi fi echo "" echo "" echo -e "\033[32m\033[1m====================\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 -e "\033[1m$_domain\033[m" else echo -e " \033[1m$_domain\033[m" fi counter=$((counter+1)) done unset counter 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 -e " Base Directory Apache Websites.........: \033[1m$apache_web_base_dir\033[m" if $delete_mode ; then echo "" echo -e " Master Nameserver supporting websites..: \033[1m$DNS_MASTER_SERVER\033[m" echo -e " Slave Nameserver supporting websites...: \033[1m$DNS_SLAVE_SERVER\033[m" echo "" echo -e " SSH User to access Nameserver..........: \033[1m$DNS_SSH_USER\033[m" echo -e " SSH Port to access Nameserver..........: \033[1m$DNS_SSH_PORT\033[m" echo -e " SSH Key to access Nameserver...........: \033[1m$DNS_SSH_KEY\033[m" echo "" echo -e " Remote Script to get zone..............: \033[1m$SCRIPT_get_domain_by_hostname\033[m" echo -e " Remote Script to remove master zone....: \033[1m$SCRIPT_remove_master_domain\033[m" echo -e " Remote Script to remove slave zone.....: \033[1m$SCRIPT_remove_slave_domain\033[m" fi echo "" echo "" #warn "To continue with te above Setting type uppercase 'YES'." 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." fi if $delete_mode ; then # - Create Log directory for permanent log files # - echo "" echononl " Create Log directory '$log_dir' for permanent log files" if [[ ! -d "$log_dir" ]]; then mkdir "$log_dir" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed fatal $(cat $tmp_log_file) fi else echo_skipped fi main_log=${log_dir}/main-${backup_date}.log > $main_log echo "# ==========" >> $main_log echo "# - Start Script $(basename $0) with following Parameters" >> $main_log echo "# ==========" >> $main_log echo "" >> $main_log declare -i counter=1 for _domain in "${domain_req_for_del_arr[@]}" ; do if [[ $counter -eq 1 ]] ; then echo -e "# - Domain(s)................................: $_domain" >> $main_log else echo -e "# - $_domain" >> $main_log fi counter=$((counter+1)) done unset counter echo "# -" >> $main_log echo "# - Apache Vhosts Directory..................: $apache_vhost_dir" >> $main_log echo "# - Base directory apache websites...........: $apache_web_base_dir" >> $main_log echo "# -" >> $main_log echo "" echo "# - Master Nameserver supporting websites....: $DNS_MASTER_SERVER" >> $main_log echo "# - Slave Nameserver supporting websites.....: $DNS_SLAVE_SERVER" >> $main_log echo "# -" >> $main_log echo "# - SSH User to access Nameserver............: $DNS_SSH_USER" >> $main_log echo "# - SSH Port to access Nameserver............: $DNS_SSH_PORT" >> $main_log echo "# - SSH Key to access Nameserver.............: $DNS_SSH_KEY" >> $main_log echo "# -" >> $main_log echo "# - Remote Script to get zone................: $SCRIPT_get_domain_by_hostname" >> $main_log echo "# - Remote Script to remove master zone......: $SCRIPT_remove_master_domain" >> $main_log echo "# - Remote Script to remove slave zone.......: $SCRIPT_remove_slave_domain" >> $main_log #echo "" >> $main_log #echo "apache_vhost_dir=\"$apache_vhost_dir\"" >> $main_log #echo "DNS_MASTER_SERVER=\"$DNS_MASTER_SERVER\"" >> $main_log #echo "DNS_SLAVE_SERVER=\"$DNS_SLAVE_SERVER\"" >> $main_log #echo "DNS_SSH_USER=\"$DNS_SSH_USER\"" >> $main_log #echo "DNS_SSH_PORT=\"$DNS_SSH_PORT\"" >> $main_log #echo "DNS_SSH_KEY=\"$DNS_SSH_KEY\"" >> $main_log #echo "SCRIPT_get_domain_by_hostname=\"$SCRIPT_get_domain_by_hostname\"" >> $main_log #echo "SCRIPT_remove_master_domain=\"$SCRIPT_remove_master_domain\"" >> $main_log 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 # - 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 dehydrated_name_marked_for_del_arr declare -a dehydrated_name_req_for_del_arr dehydrated_domains_file="/var/lib/dehydrated/domains.txt" 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 A_record_marked_for_del_arr declare -a AAAA_record_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 declare -a msg_exclude_db_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=() site_cms_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 [[ ${#apache_additional_vhost_dirs[@]} -gt 0 ]] ; then for _dir in ${apache_additional_vhost_dirs[@]} ; do if [[ -z "$_vhost_files" ]]; then _vhost_files="$(grep -l -d skip -E "^\s*(ServerName|ServerAlias)\s+.*${domain}" \ ${apache_vhost_dir}/${_dir}/* 2> /dev/null)" else _vhost_files="$_vhost_files $(grep -l -d skip -E "^\s*(ServerName|ServerAlias)\s+.*${domain}" \ ${apache_vhost_dir}/${_dir}/* 2> /dev/null)" fi done fi 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)" _basename_vhost_file="${_vhost_file:$index_subdir_apache_vhost_dir}" 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 amd type of CMS # --- for _doc_root in "${documentroot_arr[@]}" ; do site_cms="Unknown" file_to_check="$(dirname $_doc_root)/db.inc.php" file_to_check_mediawiki="${_doc_root}/LocalSettings.php" file_to_check_wordpress="${_doc_root}/wp-config.php" file_to_check_drupal="${_doc_root}/sites/default/settings.php" file_to_check_typo3="${_doc_root}/typo3conf/LocalConfiguration.php" file_to_check_redaxo="${_doc_root}/redaxo/include/master.inc.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 if [[ -f "${_doc_root}/includes/DefaultSettings.php" ]]; then version_search_string='\$wgVersion\s+=' cms_version="$(grep -i -E "^\s*$version_search_string" "${_doc_root}/includes/DefaultSettings.php" 2> /dev/null \ | awk -F '=' '{print$2}' \ | awk -F ';' '{print$1}'\ | tail -1)" # - Remove leading whitespace characters cms_version="${cms_version#"${cms_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters cms_version="${cms_version%"${cms_version##*[![:space:]]}"}" # - Rmove trailing semicolon characters cms_version="${cms_version%"${cms_version##*[!;]}"}" # - Remove trailing whitespace characters cms_version="${cms_version#"${cms_version%%[!\']*}"}" # - Remove trailing inverted comma characters cms_version="${cms_version%"${cms_version##*[!\']}"}" fi site_cms="MediaWiki $cms_version" elif [[ -r "$file_to_check_wordpress" ]] && [[ ! -d "$file_to_check_wordpress" ]] ; then db_search_string="define\('DB_NAME'" _found=false if grep -i -q -E "^\s*$db_search_string" $file_to_check_wordpress > /dev/null 2>&1 ; then database="$(grep -i -E "^\s*$db_search_string" $file_to_check_wordpress 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:]]}"}" # - Rmove trailing semicolon characters database="${database%"${database##*[!;]}"}" # - Remove trailing whitespace characters database="${database#"${database%%[!\']*}"}" # - Remove trailing inverted comma characters database="${database%"${database##*[!\']}"}" _found=true fi if [[ -f "${_doc_root}/wp-includes/version.php" ]]; then version_search_string='\$wp_version\s+=' cms_version="$(grep -i -E "^\s*$version_search_string" ${_doc_root}/wp-includes/version.php 2> /dev/null \ | awk -F '=' '{print$2}' \ | tail -1 )" # - Remove leading whitespace characters cms_version="${cms_version#"${cms_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters cms_version="${cms_version%"${cms_version##*[![:space:]]}"}" # - Rmove trailing semicolon characters cms_version="${cms_version%"${cms_version##*[!;]}"}" # - Remove trailing whitespace characters cms_version="${cms_version#"${cms_version%%[!\']*}"}" # - Remove trailing inverted comma characters cms_version="${cms_version%"${cms_version##*[!\']}"}" fi site_cms="WordPress $cms_version" elif [[ -r "$file_to_check_drupal" ]] && [[ ! -d "$file_to_check_drupal" ]] ; then db_search_string="'database'\s+=>" _found=false if grep -i -q -E "^\s*$db_search_string" $file_to_check_drupal > /dev/null 2>&1 ; then database="$(grep -i -E "^\s*$db_search_string" $file_to_check_drupal 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:]]}"}" # - Rmove trailing semicolon characters database="${database%"${database##*[!;]}"}" # - Remove trailing whitespace characters database="${database#"${database%%[!\']*}"}" # - Remove trailing inverted comma characters database="${database%"${database##*[!\']}"}" _found=true fi if [[ -f "${_doc_root}/includes/bootstrap.inc" ]] ; then version_search_string="define\('VERSION'" cms_version="$(grep -i -E "^\s*$version_search_string" ${_doc_root}/includes/bootstrap.inc 2> /dev/null \ | awk -F ',' '{print$2}' \ | awk -F ')' '{print$1}' \ | tail -1 )" # - Remove leading whitespace characters cms_version="${cms_version#"${cms_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters cms_version="${cms_version%"${cms_version##*[![:space:]]}"}" # - Rmove trailing semicolon characters cms_version="${cms_version%"${cms_version##*[!;]}"}" # - Remove trailing whitespace characters cms_version="${cms_version#"${cms_version%%[!\']*}"}" # - Remove trailing inverted comma characters cms_version="${cms_version%"${cms_version##*[!\']}"}" fi site_cms="Drupal $cms_version" elif [[ -r "$file_to_check_typo3" ]] && [[ ! -d "$file_to_check_typo3" ]] ; then db_search_string="'database'\s+=>" _found=false if grep -i -q -E "^\s*$db_search_string" $file_to_check_typo3 > /dev/null 2>&1 ; then database="$(grep -i -E "^\s*$db_search_string" $file_to_check_typo3 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:]]}"}" # - Rmove trailing semicolon characters database="${database%"${database##*[!;]}"}" # - Remove trailing whitespace characters database="${database#"${database%%[!\']*}"}" # - Remove trailing inverted comma characters database="${database%"${database##*[!\']}"}" _found=true fi if [[ -f "${_doc_root}/typo3_src/ChangeLog" ]] ; then version_search_string='\[RELEASE\]\s+Release\s+of\s+TYPO3' cms_version="$(grep -i -m 1 -E "$version_search_string" ${_doc_root}/typo3_src/ChangeLog 2> /dev/null \ | grep -o -E "\s+[0-9]+.[0-9]+.[0-9]+\s+")" # - Remove leading whitespace characters cms_version="${cms_version#"${cms_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters cms_version="${cms_version%"${cms_version##*[![:space:]]}"}" fi site_cms="Typo3 $cms_version" elif [[ -r "$file_to_check_redaxo" ]] && [[ ! -d "$file_to_check_redaxo" ]] ; then db_search_string="\\\$REX\['DB'\]\['1'\]\['NAME'\]\s+=" _found=false if grep -i -q -E "^\s*$db_search_string" $file_to_check_redaxo > /dev/null 2>&1 ; then database="$(grep -i -E "^\s*$db_search_string" $file_to_check_redaxo 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 fi main_version_search_string="\\\$REX\['VERSION'\]\s+=" if grep -i -q -E "^\s*$main_version_search_string" $file_to_check_redaxo > /dev/null 2>&1 ; then main_version="$(grep -i -E "^\s*$main_version_search_string" $file_to_check_redaxo 2> /dev/null \ | awk -F '=' '{print$2}' \ | tail -1 )" # - Remove leading whitespace characters main_version="${main_version#"${main_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters main_version="${main_version%"${main_version##*[![:space:]]}"}" # - Rmove trailing semicolon characters main_version="${main_version%"${main_version##*[!;]}"}" # - Remove trailing whitespace characters main_version="${main_version#"${main_version%%[!\']*}"}" # - Remove trailing inverted comma characters main_version="${main_version%"${main_version##*[!\']}"}" # - Remove leading single quote main_version="${main_version#"${main_version%%[!\']*}"}" # - Remove trailing single quote main_version="${main_version%"${main_version##*[!\']}"}" # - Remove leading double quote main_version="${main_version#"${main_version%%[!\"]*}"}" # - Remove trailing double quote main_version="${main_version%"${main_version##*[!\"]}"}" sub_version_search_string="\\\$REX\['SUBVERSION'\]\s+=" if grep -i -q -E "^\s*$sub_version_search_string" $file_to_check_redaxo > /dev/null 2>&1 ; then sub_version="$(grep -i -E "^\s*$sub_version_search_string" $file_to_check_redaxo 2> /dev/null \ | awk -F '=' '{print$2}' \ | tail -1 )" # - Remove leading whitespace characters sub_version="${sub_version#"${sub_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters sub_version="${sub_version%"${sub_version##*[![:space:]]}"}" # - Rmove trailing semicolon characters sub_version="${sub_version%"${sub_version##*[!;]}"}" # - Remove trailing whitespace characters sub_version="${sub_version#"${sub_version%%[!\']*}"}" # - Remove trailing inverted comma characters sub_version="${sub_version%"${sub_version##*[!\']}"}" # - Remove leading single quote sub_version="${sub_version#"${sub_version%%[!\']*}"}" # - Remove trailing single quote sub_version="${sub_version%"${sub_version##*[!\']}"}" # - Remove leading double quote sub_version="${sub_version#"${sub_version%%[!\"]*}"}" # - Remove trailing double quote sub_version="${sub_version%"${sub_version##*[!\"]}"}" minor_version_search_string="\\\$REX\['MINORVERSION'\]\s+=" if grep -i -q -E "^\s*$minor_version_search_string" $file_to_check_redaxo > /dev/null 2>&1 ; then minor_version="$(grep -i -E "^\s*$minor_version_search_string" $file_to_check_redaxo 2> /dev/null \ | awk -F '=' '{print$2}' \ | tail -1 )" # - Remove leading whitespace characters minor_version="${minor_version#"${minor_version%%[![:space:]]*}"}" # - Remove trailing whitespace characters minor_version="${minor_version%"${minor_version##*[![:space:]]}"}" # - Rmove trailing semicolon characters minor_version="${minor_version%"${minor_version##*[!;]}"}" # - Remove trailing whitespace characters minor_version="${minor_version#"${minor_version%%[!\']*}"}" # - Remove trailing inverted comma characters minor_version="${minor_version%"${minor_version##*[!\']}"}" # - Remove leading single quote minor_version="${minor_version#"${minor_version%%[!\']*}"}" # - Remove trailing single quote minor_version="${minor_version%"${minor_version##*[!\']}"}" # - Remove leading double quote minor_version="${minor_version#"${minor_version%%[!\"]*}"}" # - Remove trailing double quote minor_version="${minor_version%"${minor_version##*[!\"]}"}" else minor_version="?" fi else sub_version="?" minor_version="?" fi cms_version="${main_version}.${sub_version}.$minor_version" fi site_cms="REDAXO $cms_version" 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 site_cms="Kontext" fi if $_found ; then database_arr+=("${database}:${_doc_root}") #if ! containsElement "$database" "${database_req_for_del_arr[@]}" ; then # database_req_for_del_arr+=("${database}") #fi if ! containsElement "${database}:${_doc_root}" "${database_req_for_del_arr[@]}" ; then database_req_for_del_arr+=("${database}:${_doc_root}") fi #site_cms="Kontext" else __msg="No database found for documentroot directory ${_doc_root}" msg_missing_database_arr+=("$__msg") fi if [[ -n "$site_cms" ]] ; then if ! containsElement "${site_cms}:${_doc_root}" "${site_cms_arr[@]}" ; then site_cms_arr+=("${site_cms}:${_doc_root}") fi 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 "" echo " Type of CMS:" for _val in "${site_cms_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 # ----- # - 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 || $only_show ; then rm -f $tmp_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") _dehydrated_name="$(grep ServerName $(realpath ${apache_vhost_dir})/$_vhost_file | awk '{print$2}' | sort -u)" if [[ -n "$_dehydrated_name" ]] \ && grep -q -E "^\s*$_dehydrated_name" $dehydrated_domains_file 2> /dev/null ; then if ! containsElement "$_dehydrated_name" "${dehydrated_name_req_for_del_arr[@]}" ; then dehydrated_name_req_for_del_arr+=("$_dehydrated_name") fi fi 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 # - Entier in dehydrated domains file marked for deletion" # - echo "" echo " Entries in dehydrated's domain.txt file requested for deletion" if [[ ${#dehydrated_name_req_for_del_arr[@]} -gt 0 ]]; then for _domain_entry in ${dehydrated_name_req_for_del_arr[@]} ; do echo " $_domain_entry" done else echo -e " *** \033[33mNo domain entry in dehydrated's domain file is requested 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 - This may take some time" 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. # - 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 _dir in ${apache_additional_vhost_dirs[@]} ; do 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}/$_dir -mindepth 1 -maxdepth 1 -type f -print0) done 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+=("$(realpath ${_doc_root}):${_vhost_file}") fi done for _doc_root in ${docroot_req_for_del_arr[@]} ; do _not_in_use_by_others=true _realpath_doc_root="$(realpath $_doc_root)" for _val in ${_all_document_root_dirs_arr[@]} ; do IFS=':' read -a _val_arr <<< "$_val" if [[ "${_val_arr[0]}" = "$_realpath_doc_root" ]] ; then __tmp_vhost_file=${_val_arr[1]} __realpath_apache_vhost_dir="$(realpath "$apache_vhost_dir")" __index_subdir_realpath_apache_vhost_dir="$(expr ${#__realpath_apache_vhost_dir} + 1)" __vhost_file="${__tmp_vhost_file:$__index_subdir_realpath_apache_vhost_dir}" if ! containsElement "$__vhost_file" "${vhost_file_marked_for_del_arr[@]}" ; then _not_in_use_by_others=false __msg="The DocumentRoot directory \033[1m${_doc_root}\033[m is also used by vhost configuration file \033[1m$__vhost_file\033[m But this file isn't marked for deletion. So also the DocumentRoot will not marked for deletion." msg_exclude_doc_root_from_del_arr[${#msg_exclude_doc_root_from_del_arr[@]}]="$__msg" break fi 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 Databases" echo -e "\033[32m\033[1m------\033[m" # ========== # - Databses # ========== # - Check if database can savely be marked for deletion. That is, if documentroot # - is alaos marked for deletion. # - if [[ ${#database_req_for_del_arr[@]} -gt 0 ]]; then _tmp_arr=() for _val in "${database_req_for_del_arr[@]}" ; do IFS=':' read -a _val_arr <<< "${_val}" if containsElement "${_val_arr[1]}" "${docroot_marked_for_del_arr[@]}" ; then if ! containsElement "${_val_arr[0]}" "${_tmp_arr[@]}" ; then #if ! containsElement "${_val_arr[0]}:${_val_arr[1]}" "${database_marked_for_del_arr[@]}" ; then database_marked_for_del_arr+=("${_val_arr[0]}:${_val_arr[1]}") _tmp_arr+=("${_val_arr[0]}") fi else __msg="Database \033[1m${_val_arr[0]}\033[m is in use by DocumentRoot directory \033[1m${_val_arr[1]}\033[m, but this directory is NOT marked for deletion. So also the database is not marked for deletion" msg_exclude_db_from_del_arr[${#msg_exclude_db_from_del_arr[@]}]="$__msg" fi done fi # - Databases(s) requested for deletion # - echo "" echo " Databases(s) requested for deletion" _printed_arr=() if [[ ${#database_req_for_del_arr[@]} -gt 0 ]]; then for _val in "${database_req_for_del_arr[@]}" ; do IFS=':' read -a _val_arr <<< "${_val}" if ! containsElement "${_val_arr[0]}" "${_printed_arr[@]}" ; then echo " ${_val_arr[0]}" fi _printed_arr+=("${_val_arr[0]}") done else echo -e " *** \033[33mNo Database is requested for deletion\033[m ***" fi # - Databases marked for deletion # - echo "" echo " Database(s) marked for deletion" if [[ ${#database_marked_for_del_arr[@]} -gt 0 ]]; then for _val in "${database_marked_for_del_arr[@]}" ; do IFS=':' read -a _val_arr <<< "${_val}" echo " ${_val_arr[0]}" done else echo -e " *** \033[33mNo Database is marked for deletion\033[m ***" fi # ----- # - Warn about Databases, which will not be marked for deletion. # ----- CUR_IFS=$IFS IFS='' msg="" declare -i _counter=1 if [[ ${#msg_exclude_db_from_del_arr[@]} -gt 0 ]] ; then for _msg in ${msg_exclude_db_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 - This may take some time, perhaps some minutes.." 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 sleep 1 zone="$(ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_MASTER_SERVER "sudo $SCRIPT_get_domain_by_hostname $domain" 2> /dev/null)" if [[ $? -gt 0 ]] ;then if [[ $? -eq 10 ]] ; then error "\033[1m$domain\033[m is not a valid hostname/domain" elif [[ $? -eq 11 ]]; then error "\033[1m$domain\033[m is not supported by \033[1m$domain\033[m." elif [[ $? -eq 12 ]] ; then error "\033[1m$domain\033[m is supported but \033[1m$domain\033[m is not the master." else error "Unknow error on accessing \033[1m$SCRIPT_get_domain_by_hostname\033[m on Nameserver \"$DNS_MASTER_SERVER\"!" fi fi if [[ "$zone" = "$domain" ]]; then domain_marked_for_del_arr+=("$domain") else _a_record="$(dig +short \@$DNS_MASTER_SERVER $domain A)" _aaaa_record="$(dig +short \@$DNS_MASTER_SERVER $domain AAAA)" if [[ -n "$_a_record" ]] || [[ -n "$_aaaa_record" ]] ; then __msg="\033[37m\033[1m$domain\033[m itself is not a zone, but has an 'A' or 'AAAA' record on Nameserver \033[37m\033[1m$DNS_MASTER_SERVER\033[m. $domain is not marked for deletion." if [[ -n "$_a_record" ]]; then A_record_marked_for_del_arr+=("$domain") fi if [[ -n "$_aaaa_record" ]]; then AAAA_record_marked_for_del_arr+=("$domain") fi else _a_record="$(dig +short $domain A)" _aaaa_record="$(dig +short $domain AAAA)" if [[ -n "$_a_record" ]] || [[ -n "$_aaaa_record" ]] ; then __msg="\033[37m\033[1m$domain\033[m itself is not a zone, also no 'A' or 'AAAA' record was found on Nameserver \033[37m\033[1m$DNS_MASTER_SERVER\033[m, but exist on an other another Nameserver. $domain is not marked for deletion." else __msg="\033[37m\033[1m$domain\033[m itself is not a zone, also no 'A' or 'AAAA' record was found on Nameserver \033[37m\033[1m$DNS_MASTER_SERVER\033[m. $domain is not marked for deletion." fi fi msg_exclude_domain_from_del_arr[${#msg_exclude_domain_from_del_arr[@]}]="$__msg" fi 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 echo "" echo -e "\033[1m====================\033[m" info "For each 'Summary' kategory, you will be requested to confirm deletions. Type uppercase 'YES' to continue." echo -e "\033[1m====================\033[m" echo "" echo -e -n "\033[1mContinue:\033[m " read OK echo "" if [[ "$OK" != "YES" ]] ; then fatal "Abort by user request - Answer as not 'YES'" fi apache_needs_restart=false delete_vhost_file=false if [[ ${#vhost_file_marked_for_del_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[32m------\033[m" echo -e "Remove VHost Configuration from Webservice" echo -e "\033[32m------\033[m" for _vhost_file in ${vhost_file_marked_for_del_arr[@]} ; do echo " $_vhost_file" done apache_needs_restart=true OK="" echo "" echo "Type 'y' to continue 'n' or any other key to skip removal of VHost configurations" echo echo -e -n "\033[1mContinue removing VHost Configurations [y/n]:\033[m " read OK while [[ "X${OK}X" = "XX" ]] ; do echo "" echo -e -n "\033[1mContinue removing VHost Configurations [y/n]:\033[m " read OK done if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then echo "" echo "" >> $main_log echo "" >> $main_log echo "# ======" >> $main_log echo "# - Remove VHost Configuration from Webservice" >> $main_log echo "# -">> $main_log for _vhost_file in ${vhost_file_marked_for_del_arr[@]} ; do echo "# - $_vhost_file" >> $main_log done echo "# ======" >> $main_log echononl " Backup existing VHost Configuration directory" if [[ -d "$apache_vhost_base_dir" ]]; then echo "" >> $main_log echo "# - Backup existing VHost Configuration directory" >> $main_log echo "# -" >> $main_log echo "cp -a \"$apache_vhost_base_dir" "${apache_vhost_base_dir}.$backup_date\"" >> $main_log 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 # - Respect apache2 from debian package system # - if [[ "$(basename $apache_vhost_base_dir)" = "sites-available" ]]; then _delete_dir="${apache_vhost_base_dir}/DELETED" else _delete_dir="${apache_vhost_dir}/DELETED" fi echononl " Create sub-directory 'DELETED'" if [[ ! -d "$_delete_dir" ]] ; then echo "" >> $main_log echo "# - Create sub-directory 'DELETED'" >> $main_log echo "# -" >> $main_log echo "mkdir \"$_delete_dir\"" >> $main_log mkdir "$_delete_dir" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi else echo_skipped fi echo "" for _vhost_file in ${vhost_file_marked_for_del_arr[@]} ; do # - Respect apache2 from debian package system # - _vhost_file_to_move="${apache_vhost_dir}/$_vhost_file" if [[ "$(basename $apache_vhost_dir)" = "sites-enabled" ]]; then _vhost_file_to_move="$(realpath ${apache_vhost_dir}/$_vhost_file)" echo "" >> $main_log echo "# - Delete Symlink '${apache_vhost_dir}/$_vhost_file'" >> $main_log echo "# -" >> $main_log echo "rm \"${apache_vhost_dir}/$_vhost_file\"" >> $main_log echononl " Delete Symlink '${apache_vhost_dir}/$_vhost_file'" rm "${apache_vhost_dir}/$_vhost_file" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi fi echo "" >> $main_log echo "# - Removing VHost configuration '$(basename $_vhost_file_to_move)'" >> $main_log echo "# -" >> $main_log echo "mv \"$_vhost_file_to_move\" \"$_delete_dir\"" >> $main_log echononl " Removing VHost configuration \033[1m$(basename $_vhost_file_to_move)\033[m" _dehydrated_name="$(grep ServerName $_vhost_file_to_move | awk '{print$2}' | sort -u)" mv "$_vhost_file_to_move" "$_delete_dir" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok if containsElement "$_dehydrated_name" "${dehydrated_name_req_for_del_arr[@]}" ; then if ! containsElement "$_dehydrated_name" "${dehydrated_name_marked_for_del_arr[@]}" ; then dehydrated_name_marked_for_del_arr+=("$_dehydrated_name") fi fi else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi done # for _vhost_file in ${vhost_file_marked_for_del_arr[@]} echo "" fi else echo "" echo -e "\033[32m------\033[m" echo -e "*** \033[33mNo VHost configuration files are marked for deletion\033[m ***" echo -e "\033[32m------\033[m" fi if [[ ${#dehydrated_name_marked_for_del_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[32m------\033[m" echo -e "Remove Entries from dehydrated's domains.txt file?" echo -e "\033[32m------\033[m" for _dehydrated_enty in ${dehydrated_name_marked_for_del_arr[@]} ; do echo " $_dehydrated_enty" done OK="" echo "" echo "Type 'y' to continue 'n' or any other key to skip removal for domain entries" echo echo -e -n "\033[1mContinue removing concerning entries from dehydrated's domains.txt file [y/n]:\033[m " read OK while [[ "X${OK}X" = "XX" ]] ; do echo "" echo -e -n "\033[1mContinue removing concerning entries from dehydrated's domains.txt file [y/n]:\033[m " read OK done if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then echononl " Backup existing domains.txt file" if [[ -d "$apache_vhost_base_dir" ]]; then echo "" >> $main_log echo "# - Backup existing domains.txt file" >> $main_log echo "# -" >> $main_log echo "cp -a \"$dehydrated_domains_file" "${dehydrated_domains_file}.$backup_date\"" >> $main_log cp -a "$dehydrated_domains_file" "${dehydrated_domains_file}.$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 for _dehydrated_enty in ${dehydrated_name_marked_for_del_arr[@]} ; do echo "# - Removing '$_dehydrated_enty' from dehydrated's domains.txt file." >> $main_log echo "# -" >> $main_log echo "sed -i \"/$_dehydrated_enty/d\" $dehydrated_domains_file" >> $main_log echononl " Removing \033[1m$_dehydrated_enty\033[m from dehydrated's domains.txt file." sed -i "/$_dehydrated_enty/d" $dehydrated_domains_file > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi done fi else echo "" echo -e "\033[32m------\033[m" echo -e "*** \033[33mNo domain entry in dehydrated's domain file is marked for deletion\033[m ***" echo -e "\033[32m------\033[m" fi if [[ ${#docroot_marked_for_del_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[32m------\033[m" echo -e "Remove DocumentRoot directories" echo -e "\033[32m------\033[m" for _doc_root in ${docroot_marked_for_del_arr[@]} ; do echo " $_doc_root" done OK="" echo "" echo "Type 'y' to continue 'n' or any other key to skip removal of DocumentRoot directories" echo echo -e -n "\033[1mContinue removing DocumentRoot directories [y/n]:\033[m " read OK while [[ "X${OK}X" = "XX" ]] ; do echo "" echo -e -n "\033[1mContinue removing DocumentRoot directories [y/n]:\033[m " read OK done if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then echo "" echo "" >> $main_log echo "" >> $main_log echo "# ======" >> $main_log echo "# - Remove DocumentRoot directories" >> $main_log echo "# -">> $main_log for _doc_root in ${docroot_marked_for_del_arr[@]} ; do echo "# - $_doc_root" >> $main_log done echo "# ======" >> $main_log _delete_dir="${apache_web_base_dir}/DELETED" echononl " Create sub-directory 'DELETED'" if [[ ! -d "$_delete_dir" ]] ; then echo "" >> $main_log echo "# - Create sub-directory 'DELETED'" >> $main_log echo "# -" >> $main_log echo "mkdir \"$_delete_dir\"" >> $main_log mkdir "$_delete_dir" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi else echo_skipped fi for _doc_root in ${docroot_marked_for_del_arr[@]} ; do _dir_to_remove="$(dirname $_doc_root)" if [[ -e "${_delete_dir}/$(basename $_dir_to_remove)" ]] ; then echo "" >> $main_log echo "# - Backup existing file '${_delete_dir}/$(basename $_dir_to_remove)'" >> $main_log echo "# -" >> $main_log echo "mv \"${_delete_dir}/$(basename $_dir_to_remove)\" \"${_delete_dir}/$(basename $_dir_to_remove).$backup_date\"" >> $main_log echononl " Backup existing file '${_delete_dir}/$(basename $_dir_to_remove)'" mv "${_delete_dir}/$(basename $_dir_to_remove)" "${_delete_dir}/$(basename $_dir_to_remove).$backup_date" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi fi echo "" >> $main_log echo "# - Removing DocumentRoot directory '$(basename $_dir_to_remove)'" >> $main_log echo "# -" >> $main_log echo "mv \"$_dir_to_remove\" \"$_delete_dir\"" >> $main_log echononl " Removing DocumentRoot directory \033[1m$(basename $_dir_to_remove)\033[m" mv "$_dir_to_remove" "$_delete_dir" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi done fi else echo "" echo -e "\033[32m------\033[m" echo -e "*** \033[33mNo DocumentRoot directories are marked for deletion\033[m ***" echo -e "\033[32m------\033[m" fi if [[ ${#database_marked_for_del_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[32m------\033[m" echo -e "Remove (MySQL) Databases" echo -e "\033[32m------\033[m" for _val in "${database_marked_for_del_arr[@]}" ; do IFS=':' read -a _val_arr <<< "${_val}" echo " ${_val_arr[0]}" done OK="" echo "" echo "Type 'y' to continue 'n' or any other key to skip removal of Databases" echo echo -e -n "\033[1mContinue removing Databases [y/n]:\033[m " read OK while [[ "X${OK}X" = "XX" ]] ; do echo "" echo -e -n "\033[1mContinue removing Databases [y/n]:\033[m " read OK done if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then echo "" echo "" >> $main_log echo "" >> $main_log echo "# ======" >> $main_log echo "# - Remove (MySQL) Databases" >> $main_log echo "# -">> $main_log for _val in "${database_marked_for_del_arr[@]}" ; do IFS=':' read -a _val_arr <<< "${_val}" echo "# - ${_val_arr[0]}" >> $main_log done echo "# ======" >> $main_log _backup_dir="${apache_web_base_dir}/DELETED/$(basename $(dirname ${_val_arr[1]}))" echononl " Create Backup directory '$_backup_dir'.." if [[ ! -d "$_backup_dir" ]]; then echo "" >> $main_log echo "# - Create '$_backup_dir'" >> $main_log echo "# -" >> $main_log echo "mkdir \"$_backup_dir\"" >> $main_log mkdir "$_backup_dir" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi else echo_skipped fi for _val in "${database_marked_for_del_arr[@]}" ; do IFS=':' read -a _val_arr <<< "${_val}" echo "" >> $main_log echo "# - Backup Backup Database '${_val_arr[0]}'" >> $main_log echo "# -" >> $main_log echo "mysqldump $MYSQL_CREDENTIAL_ARGS --opt ${_val_arr[0]} | gzip > \"${_backup_dir}/${_val_arr[0]}-${backup_date}.sql.gz\"" >> $main_log echononl " Backup Database '${_val_arr[0]}'.." mysqldump $MYSQL_CREDENTIAL_ARGS --opt ${_val_arr[0]} 2> $tmp_log_file | gzip > "${_backup_dir}/${_val_arr[0]}-${backup_date}.sql.gz" 2>> $tmp_log_file if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi echo "" >> $main_log echo "# - Remove Database '${_val_arr[0]}'" >> $main_log echo "# -" >> $main_log echo "mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e \"DROP DATABASE ${_val_arr[0]}\"" >> $main_log echononl " Remove Database '${_val_arr[0]}'" mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e "DROP DATABASE ${_val_arr[0]}" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi echo "" >> $main_log echo "# - Cleanup table mysql.db from Database '${_val_arr[0]}'" >> $main_log echo "# -" >> $main_log echo "mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e \"USE mysql; DELETE FROM db WHERE Db = ' ${_val_arr[0]}'\"" >> $main_log echononl " Cleanup table mysql.db from Database '${_val_arr[0]}'" mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e "USE mysql; DELETE FROM db WHERE Db = '${_val_arr[0]}'" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi # - Try to remove concerning User from table mysql.user # - # - do it only if the user meets the following facts # - - user's name is the same as the database name # - - user does not appear in table mysql.db # - echononl " Drop User '${_val_arr[0]}' from table 'mysql.user'" _count_user_tbl_db=$(mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e "USE mysql; SELECT count(User) from db WHERE User = '${_val_arr[0]}'" ) if [[ $? -eq 0 ]] && [[ $_count_user_tbl_db -eq 0 ]]; then echo "" >> $main_log echo "# - Drop User '${_val_arr[0]}' from table 'mysql.user'" >> $main_log echo "# -" >> $main_log echo "mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e \"USE mysql; DELETE FROM user WHERE User = '${_val_arr[0]}'\"" >> $main_log mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e "USE mysql; DELETE FROM user WHERE User = '${_val_arr[0]}'" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi else echo_skipped fi # if [[ $? -eq 0 ]] && [[ $_count_user_tbl_user -eq 1 ]]; then echo "" >> $main_log echo "# - FLUSH PRIVILEGES" >> $main_log echo "# -" >> $main_log echo "mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e \"FLUSH PRIVILEGES\"" >> $main_log echononl " FLUSH PRIVILEGES" mysql $MYSQL_CREDENTIAL_ARGS -N -s -A -e "FLUSH PRIVILEGES" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi done fi else echo "" echo -e "\033[32m------\033[m" echo -e "*** \033[33mNo Database is marked for deletion\033[m ***" echo -e "\033[32m------\033[m" fi if [[ ${#domain_marked_for_del_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[32m------\033[m" echo -e "Remove Domain - this may take some time" echo -e "\033[32m------\033[m" for _domain in "${domain_marked_for_del_arr[@]}" ; do echo " $_domain" done OK="" echo "" echo "Type 'y' to continue 'n' or any other key to skip removal of Domains" echo echo -e -n "\033[1mContinue removing Domains [y/n]:\033[m " read OK while [[ "X${OK}X" = "XX" ]] ; do echo "" echo -e -n "\033[1mContinue removing Domains [y/n]:\033[m " read OK done if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then echo "" echo "" >> $main_log echo "" >> $main_log echo "# ======" >> $main_log echo "# - Remove Domains" >> $main_log echo "# -">> $main_log for _domain in "${domain_marked_for_del_arr[@]}" ; do echo "# - $_domain" >> $main_log done echo "# ======" >> $main_log for _domain in "${domain_marked_for_del_arr[@]}" ; do echo "" >> $main_log echo "# - Remove Zone '$_domain' from Nameserver $DNS_MASTER_SERVER (master)" >> $main_log echo "# -" >> $main_log cat <> $main_log ssh -q -p $DNS_SSH_PORT \\ -o BatchMode=yes \\ -o StrictHostKeyChecking=no \\ -i $DNS_SSH_KEY \\ -l $DNS_SSH_USER \\ $DNS_MASTER_SERVER "sudo $SCRIPT_remove_master_domain -d $_domain" EOF echononl " Remove Zone '$_domain' from '$DNS_MASTER_SERVER' (master)" ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_MASTER_SERVER "sudo $SCRIPT_remove_master_domain -d $_domain" > $tmp_log_file 2>&1 if [[ $? -eq 0 ]]; then echo_ok else echo_failed error "$(cat $tmp_log_file)" echo "Error: $(cat $tmp_log_file)" >> $main_log fi if $include_slave_dns ; then echo "" >> $main_log echo "# - Remove Zone '$_domain' from Nameserver $DNS_SLAVE_SERVER (slave)" >> $main_log echo "# -" >> $main_log cat <> $main_log ssh -q -p $DNS_SSH_PORT \\ -o BatchMode=yes \\ -o StrictHostKeyChecking=no \\ -i $DNS_SSH_KEY \\ -l $DNS_SSH_USER \\ $DNS_SLAVE_SERVER "sudo $SCRIPT_remove_slave_domain -d $_domain" EOF echononl " Remove Zone '$_domain' from '$DNS_SLAVE_SERVER' (slave)" ssh -q -p $DNS_SSH_PORT \ -o BatchMode=yes \ -o StrictHostKeyChecking=no \ -i $DNS_SSH_KEY \ -l $DNS_SSH_USER \ $DNS_SLAVE_SERVER "sudo $SCRIPT_remove_slave_domain -d $_domain" > $tmp_log_file 2>&1 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 $include_slave_dns done # for _domain in "${domain_marked_for_del_arr[@]}" fi else echo "" echo -e "\033[32m------\033[m" echo -e "*** \033[33mNo Domain is marked for deletion\033[m ***" echo -e "\033[32m------\033[m" fi #if [[ ${#A_record_marked_for_del_arr[@]} -gt 0 ]] || [[ ${#AAAA_record_marked_for_del_arr[@]} -gt 0 ]] ; then # echo "" # echo -e "\033[32m------\033[m" # echo -e "Remove Records from zone file" # echo -e "\033[32m------\033[m" # # for _record in "${A_record_marked_for_del_arr[@]}" ; do # echo " A Record for $_domain" # done # for _record in "${AAAA_record_marked_for_del_arr[@]}" ; do # echo " AAAA Record for $_domain" # done # # OK="" # echo "" # echo "Type 'y' to continue 'n' or any other key to skip removal of Domains" # echo # echo -e -n "\033[1mContinue removing records from zone file [y/n]:\033[m " # read OK # while [[ "X${OK}X" = "XX" ]] ; do # echo "" # echo -e -n "\033[1mContinue removing Domains [y/n]:\033[m " # read OK # done # # if [[ "${OK,,}" = 'yes' ]] || [[ "${OK,,}" = 'y' ]]; then # echo "" # for _record in "${A_record_marked_for_del_arr[@]}" ; do # echo -e " Removing A Record for \033[1m$_domain\033[m" # done # for _record in "${AAAA_record_marked_for_del_arr[@]}" ; do # echo -e " Removing AAAA Record for \033[1m$_domain\033[m" # done # # fi # ##else ## echo "" ## echo -e "*** \033[33mNo Domain is marked for deletion\033[m ***" #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 "" >> $main_log echo "# - Graceful Restart Apache Webservice" >> $main_log echo "# -" >> $main_log echo "apachectl graceful" >> $main_log 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