Самописный аналог a2ensite, a2dissite на bash для CentOS с расширенными функциями (on, off, del, list, configtest, graceful)
Так сложилось, что, когда я только начинал свою деятельность, мне в "наследство" достались сервера с установленным CentOS на борту. Ни навыков, ни знаний, чтобы принять решение о смене системы (и нужно ли это?) у меня не было, поэтому всё осталось как есть. Тем не менее, администрировать виртуальные хосты пришлось сразу, соответственно, изучать всё, что связанно в веб-серверами. Много читал, что есть в семействе Debian, отличная от CentOS, структура папок: sites-enabled, sites-available. И есть интересный инструмент, чтобы включать и выключать виртуальные хосты и модули в apache. Отлично! Значит сделаем так же!
На этом всё закончилось =) Разумеется, такого "инструмента" в системе не оказалось и я, думаю, как и все, кто искал, но не нашёл, но привык, стал делать всё ручками. Со временем, разумеется, рука набилась, и проблем это не вызывало. Но! Надоело! =)
Мой скрипт позволяет включать и выключать виртуальные хосты, просматривать список конфигурационных файлов в папках sites-enabled и sites-available, а так же удалять файлы конфигураций из sites-available. Долго описывать не стану. Внизу есть видео примера работы этого скрипта, но могу сказать точно - мне стало ГОРАЗДО удобнее.
Кстати, работать он должен не только на CentOS, но и на любом linux, где есть подобная система папок. Сам лично проверил работу на CentOS 5/6/7.
К сути. На примере CentOS. Всё, что Вам нужно - создать две папки sites-available и sites-enabled:
mkdir /etc/httpd/sites-available/ mkdir /etc/httpd/sites-enabled/
Далее, добавляем строку в настройки apache:
echo "Include sites-enabled/*.conf" >> /etc/httpd/conf/httpd.conf
Качаем скрипт в любую папку, куда Вам удобно. Например, /root/scripts/myscripts/ и отсюда же включаем скрипт в "системных утилитах":
wget http://alexxkn.ru/downloads/a2mng.sh ln -s `pwd`/a2mng.sh /usr/bin/a2mng
Всё. Теперь, где бы Вы не находились (в смысле папки), достаточно ввести a2mng и управлять виртуальными хостами.
Синтаксис:
a2mng [action] [host]
Actions:
- on [host] - включить виртуальный хост;
- off [host] - выключить виртуальный хост;
- del [host] - удалить файл конфигурации виртуального хоста;
- list (-l) [on|off] - посмотреть список файлов виртуальных хостов в sites-enabled или sites-available;
- graceful - перечитать конфигурационные файлы;
- cf (configtest) - проверка корректности конфигурации.
Буду очень рад всем комментариям, ошибкам и предложениям! Удачи!
P.S. Ниже ссылка на файл. В спойлере код самого скрипта.
#!/bin/bash # # Apache manage virtualhost for Centos # Version 2.1.1 by http://alexxkn.ru ## Define variables httpdFolderAvailableHosts="/etc/httpd/sites-available" httpdFolderEnabledHosts="/etc/httpd/sites-enabled" commandViewEnableHosts=`ls -l ${httpdFolderEnabledHosts} | sed -e '1,1d' | awk '{print"\033[1;34m"$9"\033[0m", $10, $11}'` commandViewAvailableHosts=`ls -l ${httpdFolderAvailableHosts} | sed -e '1,1d' | awk '{print$9, $10, $11}'` httpdConfigTest="apachectl configtest" httpdGraceful="apachectl graceful" ## Start script commandAction="$1" verifyCommandAction="0" while [ "${verifyCommandAction}" -ne "1" ]; do verifyCommandAction="1" if [[ "${commandAction}" =~ (^[oO][nN]$|^[oO][fF][fF]$|^[dD][eE][lL]$|^[-][lL]$|^[lL][iI][sS][tT]$|^[cC][fF]$|^[cC][oO][nN][fF][iI][gG][tT][eE][sS][tT]$|[gG][rR][aA][cC][eE][fF][uU][lL]) ]]; then verifyCommandAction="1" case $commandAction in [oO][nN]) hostParameterName="$2" while [ -z ${hostParameterName} ]; do echo -e "\E[1mPlease, type name of the host for manage (without extension .conf).\E[0m" read -r hostParameterName done availableHosts=`ls ${httpdFolderAvailableHosts} | sed s#.conf## | grep ^${hostParameterName}$` enabledHosts=`ls ${httpdFolderEnabledHosts} | sed s#.conf## | grep ^${hostParameterName}$` if [ "$hostParameterName" = "$availableHosts" ]; then if [ "$hostParameterName" = "$enabledHosts" ]; then echo -e "\E[1mHost \E[34m$hostParameterName\E[39m is already enabled!\E[0m" else # Enable host echo -e "\E[1mEnabling \E[34m${hostParameterName}\E[39m...\E[0m" cd ${httpdFolderEnabledHosts} > /dev/null ln -s ${httpdFolderAvailableHosts}/${hostParameterName}.conf 2>&1 cd - > /dev/null checkHttpdConf=`${httpdConfigTest} 2>&1` if [[ "$checkHttpdConf" != "Syntax OK" ]]; then echo -e "\E[1m`$httpdConfigTest`\E[0m" rm -rf ${httpdFolderEnabledHosts}/${hostParameterName}.conf 2>&1 exit else echo -en "\E[1mApache configtest: \E[0m" && echo -n "`$httpdConfigTest`" `$httpdGraceful` echo -e "\E[1mApache graceful OK\E[0m" fi fi else echo -e "\E[1mThere is no host in \E[34m${httpdFolderAvailableHosts}\E[39m with name \E[34m$hostParameterName\E[0m" fi ;; [oO][fF][fF]) hostParameterName="$2" while [ -z ${hostParameterName} ]; do echo -e "\E[1mPlease, type name of the host for manage (without extension .conf).\E[0m" read -r hostParameterName done availableHosts=`ls ${httpdFolderAvailableHosts} | sed s#.conf## | grep ^${hostParameterName}$` enabledHosts=`ls ${httpdFolderEnabledHosts} | sed s#.conf## | grep ^${hostParameterName}$` if [ "$hostParameterName" = "$enabledHosts" ]; then # Disable host echo -e "\E[1mDisabling \E[34m${hostParameterName}\E[39m...\E[0m" rm -f ${httpdFolderEnabledHosts}/${hostParameterName}.conf 2>&1 checkHttpdConf=`${httpdConfigTest} 2>&1` if [[ "$checkHttpdConf" != "Syntax OK" ]]; then echo -e "\E[1m`$httpdConfigTest`\E[0m" exit else echo -en "\E[1mApache configtest: \E[0m" && echo -n "`$httpdConfigTest`" `$httpdGraceful` echo -e "\E[1mApache graceful OK\E[0m" fi else echo -e "\E[1mThere is no host in \E[34m${httpdFolderEnabledHosts}\E[39m with name \E[34m$hostParameterName\E[0m" fi ;; [dD][eE][lL]) hostParameterName="$2" while [ -z "${hostParameterName}" ]; do echo -e "\E[1mPlease, type name of the host for manage (without extension .conf).\E[0m" read -r hostParameterName done availableHosts=`ls ${httpdFolderAvailableHosts} | sed s#.conf## | grep ^${hostParameterName}$` enabledHosts=`ls ${httpdFolderEnabledHosts} | sed s#.conf## | grep ^${hostParameterName}$` if [ "$hostParameterName" = "$availableHosts" ]; then if [ "$hostParameterName" = "$enabledHosts" ]; then verifyAnswerDel="0" while [[ "$verifyAnswerDel" -eq "0" ]]; do verifyAnswerDel="1" echo -e "\E[1mFirst you must disable host! Do you want to do it? [y/n]: \E[0m" read -r responseDeleteHost case $responseDeleteHost in [yY]|[yY][eE][sS]) verifyAnswerDel="1" echo -e "\E[1mDisabling \E[34m${hostParameterName}\E[39m...\E[0m" rm -f ${httpdFolderEnabledHosts}/${hostParameterName}.conf 2>&1 checkHttpdConf=`${httpdConfigTest} 2>&1` if [[ "$checkHttpdConf" != "Syntax OK" ]]; then echo -e "\E[1m`$httpdConfigTest`\E[0m" exit else echo -en "\E[1mApache configtest: \E[0m" && echo -n "`$httpdConfigTest`" `$httpdGraceful` echo -e "\E[1mApache graceful OK\E[0m" fi ;; [nN]|[nN][oO]) verifyAnswerDel="1" echo "Exit" exit ;; *) verifyAnswerDel="0" echo -e '\E[1mType "y" or "n".\E[0m' continue ;; esac done fi # Delete host echo -e "\E[1mDeleting \E[34m${hostParameterName}\E[39m from \E[34m${httpdFolderAvailableHosts}\E[39m...\E[0m" rm -f ${httpdFolderAvailableHosts}/${hostParameterName}.conf 2>&1 echo -e "\E[1m\E[34m${hostParameterName}\E[39m has been removed\E[0m" else # Check host is enable if [ "$hostParameterName" = "$enabledHosts" ]; then verifyAnswerDel="0" while [[ "$verifyAnswerDel" -eq "0" ]]; do verifyAnswerDel="1" echo -e "\E[1mYou have \E[34m${hostParameterName}\E[39m in \E[34m${httpdFolderEnabledHosts}\E[39m, but nave not in \E[34m${httpdFolderAvailableHosts}\E[39m! This is very bad. Do you want to delete it?\E[0m" read -r responseDeleteHost case $responseDeleteHost in [yY]|[yY][eE][sS]) verifyAnswerDel="1" echo -e "\E[1mDelete host from \E[34m${httpdFolderEnabledHosts}\E[39m was selected\E[0m" rm -f ${httpdFolderEnabledHosts}/${hostParameterName}.conf 2>&1 checkHttpdConf=`${httpdConfigTest} 2>&1` if [[ "$checkHttpdConf" != "Syntax OK" ]]; then echo -e "\E[1m`$httpdConfigTest`\E[0m" exit else echo -en "\E[1mApache configtest: \E[0m" && echo -n "`$httpdConfigTest`" `$httpdGraceful` echo -e "\E[1mApache graceful OK\E[0m" fi ;; [nN]|[nN][oO]) verifyAnswerDel="1" echo "Exit" exit ;; *) verifyAnswerDel="0" echo -e '\E[1mType "y" or "n".\E[0m' continue ;; esac done echo -e "\E[1mThere is no \E[34m${hostParameterName}\E[39m in \E[34m${httpdFolderAvailableHosts}\E[39m\E[0m" fi fi ;; [-][lL]|[lL][iI][sS][tT]) parametrViewHosts="$2" verifyParametrViewHosts="0" while [ "${verifyParametrViewHosts}" -ne "1" ]; do verifyParametrViewHosts="1" if [[ "${parametrViewHosts}" =~ (^[oO][nN]$|^[oO][fF][fF]$) ]]; then verifyParametrViewHosts="1" case $parametrViewHosts in [oO][nN]) echo echo "${commandViewEnableHosts}" ;; [oO][fF][fF]) echo echo "${commandViewAvailableHosts}" ;; esac else echo -e "\E[1mSelect the type of hosts for viewing: enables (\E[34mon\E[39m), or available (\E[34moff\E[39m).\E[0m" verifyParametrViewHosts="0" read -r parametrViewHosts fi done ;; [cC][fF]|[cC][oO][nN][fF][iI][gG][tT][eE][sS][tT]) echo -e "\E[1m`$httpdConfigTest`\E[0m" ;; [gG][rR][aA][cC][eE][fF][uU][lL]) echo -e "\E[1m`$httpdGraceful`\E[0m" ;; esac else echo -e "\E[1mPlease, type the command to manage virtual hosts: \E[34mon\E[39m, \E[34moff\E[39m, \E[34mdel\E[39m, \E[34mconfigtest (or cf)\E[39m, \E[34mgraceful\E[39m or \E[34mlist (or -l)\E[39m.\E[0m" verifyCommandAction="0" read -r commandAction fi done
Добавить комментарий