#!/usr/bin/env bash _date=`date +%Y-%m-%d-%H%M` vhost_dir=/usr/local/apache2/conf/vhosts target_dir=$vhost_dir #target_dir=/root/tmp ipv4=83.223.86.82 ipv6="2a01:30:0:13:26f:6dff:feb9:9d11" _cert_default=/usr/local/apache2/conf/server-bundle.crt _key_default=/usr/local/apache2/conf/server.key file_suffixes="conf mod_php php-fpm mod_fcgid mod_php redirect" ## --- Some functions ## --- ## - 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 } 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 "" echo -e "fataler Fehler: $*" echo "" echo -e "\t\033[31m\033[1mInstalllation wird abgebrochen\033[m\033[m" echo "" exit 1 } error(){ echo "" echo -e "\t[ \033[31m\033[1mFehler\033[m ]: $*" echo "" } warn (){ echo "" echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*" echo "" } info (){ echo "" echo -e "\t[ \033[32m\033[1mInfo\033[m ]: $*" echo "" } echo_done() { echo -e "\033[75G[ \033[32mdone\033[m ]" } echo_ok() { echo -e "\033[75G[ \033[32mok\033[m ]" } echo_warning() { echo -e "\033[75G[ \033[33m\033[1mwarn\033[m ]" } echo_failed(){ echo -e "\033[75G[ \033[1;31mfailed\033[m ]" } echo_skipped() { echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]" } echo "" if [[ "$vhost_dir" = "$target_dir" ]]; then cp -a $vhost_dir ${vhost_dir}.$_date vhost_dir=${vhost_dir}.$_date fi declare -a vhost_arr_tmp while IFS='' read -r -d '' _file ; do [[ -h "$_file" ]] && continue vhost_arr_tmp+=("$_file") done < <(find $vhost_dir -mindepth 1 -maxdepth 1 -type f -print0) # - Sort array # - IFS=$'\n' vhost_arr=($(sort <<<"${vhost_arr_tmp[*]}")) unset IFS declare -a file_suffixe_arr for _suffix in $file_suffixes ; do file_suffixe_arr+=("$_suffix") done declare -i number=0 declare -a file_already_ok_arr declare -a file_not_converted_arr declare -a file_ipv4_ok_arr declare -a file_ipv6_ok_arr for _file in ${vhost_arr[@]} ; do # - For testing # - #if [[ $number -gt 3 ]]; then # break #fi echononl " Working on $(basename $_file) .." if [[ "$(basename $_file)" =~ ^00 ]] ; then echo_skipped info "File $(basename $_file) left unchanged" file_not_converted_arr+=("$_file") continue fi _found=false for _suffix in ${file_suffixe_arr[@]} ; do if [[ "$_suffix" = "${_file##*.}" ]]; then _found=true break fi done if ! $_found ; then echo_failed error "File $(basename $_file) was not edited. Wrong suffix \"${_file##*.}\"" file_not_converted_arr+=("$_file") continue fi _basename_file=$(basename $_file) https_ipv4=false https_ipv6=false if grep -i -E "^\s* /dev/null 2>&1 ; then https_ipv4=true fi if grep -i -E "^\s*" $_file> /dev/null 2>&1 ; then https_ipv6=true fi if $https_ipv4 && $https_ipv6 ; then file_already_ok_arr+=("$_file") echo_skipped info "File $(basename $_file) already converted.." continue fi if $https_ipv4 ; then file_ipv4_ok_arr+=("$_file") fi if $https_ipv6 ; then file_ipv6_ok_arr+=("$_file") fi > $target_dir/${_basename_file}.80 > $target_dir/${_basename_file}.443 > $target_dir/${_basename_file} server_name_found=false server_name= vhost_ipv4_80=false found_custom_log=false ssl_cert_found=false ssl_key_found=false ssl_cert=$_cert_default ssl_key=$_key_default server_aliases_arr=() while IFS='' read -r _line || [[ -n $_line ]] ; do if echo "$_line" | grep -i -E "^\s*" > /dev/null 2>&1 ; then vhost_ipv4_80=false fi if ! $ssl_cert_found && echo "$_line" | grep -E "^\s*SSLCertificateFile\s+" > /dev/null 2>&1 ; then ssl_cert_found=true ssl_cert=$(echo $_line | awk '{print$2}') fi if ! $ssl_key_found && echo "$_line" | grep -E "^\s*SSLCertificateKeyFile\s+" > /dev/null 2>&1 ; then ssl_key_found=true ssl_key=$(echo $_line | awk '{print$2}') fi if echo $_line | grep -e "^\s*ServerAlias" > /dev/null 2>&1 ; then server_alias_tmp=$(echo $_line | sed -e "s/ServerAlias//" | sed "s/^\s*//" | sed "s/\s*$//") if [[ ${#server_aliases_arr[@]} -eq 0 ]] ; then for _alias in $server_alias_tmp ; do server_aliases_arr+=("$_alias") done else for _alias in $server_alias_tmp ; do containsElement "$_alias" "${server_aliases_arr[@]}" && continue server_aliases_arr+=("$_alias") done fi fi if $vhost_ipv4_80 ; then if echo "$_line" | grep -i -E "^\s*CustomLog\s+" > /dev/null 2>&1 && ! $found_custom_log ; then echo " SSLEngine on" >> $target_dir/${_basename_file}.443 echo "" >> $target_dir/${_basename_file}.443 echo " SSLCertificateFile $ssl_cert" >> $target_dir/${_basename_file}.443 echo " SSLCertificateKeyFile $ssl_key" >> $target_dir/${_basename_file}.443 echo "" >> $target_dir/${_basename_file}.443 found_custom_log=true fi echo "$_line" >> $target_dir/${_basename_file}.80 echo "$_line" >> $target_dir/${_basename_file}.443 fi if echo "$_line" | grep -i -E "^\s* /dev/null 2>&1 ; then vhost_ipv4_80=true fi if ! $server_name_found && echo "$_line" | grep -E "^\s*ServerName\s+" > /dev/null 2>&1 ; then server_name_found=true server_name=$(echo $_line | awk '{print$2}') fi done < "$_file" if [[ -z "$(cat $target_dir/${_basename_file}.80)" ]] ; then echo_failed error "File $(basename $_file) was not edited. Maybe no Configuration (for IPv4) found!" file_not_converted_arr+=("$_file") continue fi let number++ if [[ "$ssl_cert" != "$_cert_default" ]]; then perl -i -n -p -e "s#^(\s*)SSLCertificateFile\s+.*#\1SSLCertificateFile $ssl_cert#" \ $target_dir/${_basename_file}.443 fi if [[ "$ssl_key" != "$_key_default" ]]; then perl -i -n -p -e "s#^(\s*)SSLCertificateKeyFile\s+.*#\1SSLCertificateKeyFile $ssl_key#" \ $target_dir/${_basename_file}.443 fi # - Delete empty lines at the beginning # - while [[ "$(head -n 1 $target_dir/${_basename_file}.80)" =~ ^\s*$ ]] ; do sed -i '1d' $target_dir/${_basename_file}.80 done while [[ "$(head -n 1 $target_dir/${_basename_file}.443)" =~ ^\s*$ ]] ; do sed -i '1d' $target_dir/${_basename_file}.443 done # - Delete empty lines at the end # - while [[ "$(tail -n 1 $target_dir/${_basename_file}.80)" =~ ^\s*$ ]] ; do sed -i '$ d' $target_dir/${_basename_file}.80 done while [[ "$(tail -n 1 $target_dir/${_basename_file}.443)" =~ ^\s*$ ]] ; do sed -i '$ d' $target_dir/${_basename_file}.443 done echo "# --- $server_name" > $target_dir/${_basename_file} for _alias in "${server_aliases_arr[@]}" ; do echo "# --- $_alias" >> $target_dir/${_basename_file} done echo "" >> $target_dir/$(basename $_file) echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} cat $target_dir/${_basename_file}.80 >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} cat $target_dir/${_basename_file}.443 >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} perl -i -n -p -e "s#^(\s*)CustomLog\s+/var/log/apache2/ipv4_requests.log\s+.*#\1CustomLog /var/log/apache2/ipv6_requests.log base_requests#" $target_dir/${_basename_file}.443 perl -i -n -p -e "s#^(\s*)CustomLog\s+/var/log/apache2/ipv4_requests.log\s+.*#\1CustomLog /var/log/apache2/ipv6_requests.log base_requests#" $target_dir/${_basename_file}.80 echo "# ---" >> $target_dir/${_basename_file} echo "# --- IPv6" >> $target_dir/${_basename_file} echo "# ---" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} cat $target_dir/${_basename_file}.80 >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} cat $target_dir/${_basename_file}.443 >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} echo "" >> $target_dir/${_basename_file} rm $target_dir/${_basename_file}.80 rm $target_dir/${_basename_file}.443 echo_done done echo if [[ ${#file_already_ok_arr[@]} -gt 0 ]] ; then echo "" echo -e "\033[32m\033[1mFiles left unchanged\033[m:" for _file in ${file_already_ok_arr[@]} ; do echo " $(basename $_file)" done fi echo "" if [[ ${#file_ipv4_ok_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[33m\033[1mIPv6 support was added on files\033[m:" for _file in ${file_ipv4_ok_arr[@]} ; do echo " $(basename $_file)" done fi #if [[ ${#file_ipv6_ok_arr[@]} -gt 0 ]]; then # echo "" # echo -e "\033[37m\033[1mOriginally, no IPv4 support.\n\033[31m\033[1mFiles not converted:\033[m" # for _file in ${file_ipv6_ok_arr[@]} ; do # echo " $(basename $_file)" # done #fi if [[ ${#file_not_converted_arr[@]} -gt 0 ]]; then echo "" echo -e "\033[31m\033[1mFiles ot converted\033[m:" for _file in ${file_not_converted_arr[@]}; do echo " $(basename $_file)" done fi echo "" exit 0