Самописный аналог 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. Ниже ссылка на файл. В спойлере код самого скрипта.

Spoiler: Highlight to view

#!/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

Приложение: 

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image