356 lines
10 KiB
Bash
Executable File
356 lines
10 KiB
Bash
Executable File
#!/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*<VirtualHost\s+[0-9.]+:443" $_file> /dev/null 2>&1 ; then
|
|
https_ipv4=true
|
|
fi
|
|
if grep -i -E "^\s*<VirtualHost\s+\[[a-f0-9:]+\]:443>" $_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*</VirtualHost>" > /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*<VirtualHost\s+$ipv4:80" > /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 "<VirtualHost $ipv4:80>" >> $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 "</VirtualHost>" >> $target_dir/${_basename_file}
|
|
echo "" >> $target_dir/${_basename_file}
|
|
echo "<VirtualHost $ipv4:443>" >> $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 "</VirtualHost>" >> $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 "<VirtualHost [$ipv6]:80>" >> $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 "</VirtualHost>" >> $target_dir/${_basename_file}
|
|
echo "" >> $target_dir/${_basename_file}
|
|
echo "<VirtualHost [$ipv6]:443>" >> $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 "</VirtualHost>" >> $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
|