Скрипт для работы с виртуальными хостами apache2 на локале

    0. Intro


    Для чего это все? Цели было 2:
    1. избавиться от рутины ковыряния в консоли и файлах
    2. получить экспы в разработке shell-скриптов.

    1. Что это такое?


    Ниже будет представлен скрипт, для работы с виртуальными хостами апача под кубунтой для локальной машины только. Для сервера врядли сгодится. Не для этих целей писался.

    Итак, что же это такое?

    Скрипт позволяет создавать, удалять, активировать и деактивировать хосты на машине, экономя при этом наше время. То есть, не нужно что-то прописывать, ковыряться в конфигах, кидать симлинки и прочее перезапускание сервера лишь для этой цели. Всего лишь одна команда в консоли может сократить время в разы. Поехали! )

    2. Краткий хелп


    Скрипт принимает след. аргументы:
    vhost (add|del|enable|disable) vhostname

    Соответственно, по командам (в скобках алиасы):
    — add (create) — создать хост, создать базовую файловую структуру и активировать его*.
    — del (delete, rm) — удалить только хост с конфигами.
    — delall — удалить хост и конфиги, и удалить все файлы для этого сайта**
    — enable (on) — добавить к апачу хост. (просто кидаются линки в sites-enabled).
    — disable (off) — отключить хост (конфиги остаются)

    Пример:
    sudo vhost add test.lan
    sudo vhost rm test.lan

    Рут нужен для того, что бы записываться в /etc/hosts и перезапуска апача.

    * Структура папок является таковой, какую использую я. Вверху скрипта есть переменные, в которых определяется, где хранятся ваши сайты.

    ** Только, если выдержана общая структура.
    Например: хост называется test.lan, а файлы лежат в /home/user/www/test.lan. В этом случае удалится эта папка с содержимым.

    3. The source of world.


    #!/bin/bash
    projects="/home/alex/web/www";
    hosts="/home/alex/web/hosts";
    enabled_hosts='/etc/apache2/sites-enabled';
    user=$(whoami);
    action=$1;
    name=$2
    db=$3;

    add_folders() {
        mkdir -p "$projects/$name/www";
        mkdir -p "$projects/$name/logs"
        mkdir -p "$projects/$name/tmp"
        chown -R $user\: "$projects/$name/"
        chmod -R 777 "$projects/$name";
    }

    add_host() {
        echo "
    <VirtualHost $name:80>
        ServerAdmin webmaster@localhost
        ServerName $name
        ServerAlias www.$name
        DocumentRoot $projects/$name/www
        ErrorLog $projects/$name/logs/error.log
        CustomLog $projects/$name/logs/access.log combined
        DirectoryIndex index.php index.htm index.html
        LogLevel debug
    </VirtualHost>"
    > $hosts/$name
        
        ln -s $hosts/$name $enabled_hosts/$name
        
        echo "127.0.0.1        $name" >> /etc/hosts
    }

    add_index_file() {
        echo "<html>
    <body>
        <h1>$name works!</h1>
    </body>
    </html>"
    > $projects/$name/www/index.htm
    }

    create_host() {
        if [ -z $name ]; then
            echo 'No name for vhost given.';
            exit 1;
        fi
        
        if [ -f "$hosts/$name" ]; then
            echo 'Virtual host already exists.';
            exit 0;
        fi
        
        echo 'All is ok, fast forward -->';
        add_folders;
        echo '* Folders created';
        add_host;
        echo '* Host created';
        add_index_file;
        
        reload_apache;
    }

    delete_host() {
        if [ -z $name ]; then
            echo 'No name for vhost given. Exit.';
            exit 1;
        fi
        
        if [ -f "$hosts/$name" ]; then
            echo "Remove vhost $name? (y/n)";
            read confirm;
        
            if [ $confirm = 'y' ]; then
                echo "* Removing vhost file from $hosts/$name";
                rm $hosts/$name
                
                echo "* Removing link from $enabled_hosts/$name"
                rm $enabled_hosts/$name
                
                echo "* Cleaning up /etc/hosts"
                sed "/$name/d" /etc/hosts > /tmp/tmp-hosts;
                mv -f /tmp/tmp-hosts /etc/hosts
                
                echo "* Vhost $name removed";
                
                reload_apache;
            else
                echo "Skipped.";
            fi
        else
            echo 'No such vhost.';
            exit;
        fi
    }

    delete_all() {
        if [ -z $name ]; then
            echo 'No name for vhost given. Exit.';
        exit 1;
        fi
        
        if [ -f "$hosts/$name" ]; then
            echo "Remove vhost $name?";
            echo "This action will remove all files and directories from this project (y/n)";
        read confirm;
        
        if [ $confirm = 'y' ]; then
            echo "* Removing files and directories from $projects/$name";
        rm -rf $projects/$name
        
        echo "* Removing vhost file from $hosts/$name";
        rm $hosts/$name
        
        echo "* Removing link from $enabled_hosts/$name"
        rm $enabled_hosts/$name
        
        echo "* Cleaning up /etc/hosts"
        sed "/$name/d" /etc/hosts > /tmp/tmp-hosts;
        mv -f /tmp/tmp-hosts /etc/hosts
        
        echo "* Done. The matrix has project $name";
        
        reload_apache;
        else
            echo "Skipped.";
        fi
        else
            echo 'No such vhost.';
        exit;
        fi
    }

    enable_host() {
        if [ -f "$hosts/$name" ]; then
            ln -s $hosts/$name $enabled_hosts/$name
            echo "127.0.0.1        $name" >> /etc/hosts
            
            reload_apache;
        else
            echo 'No such vhost.';
        fi
    }

    disable_host() {
        if [ -f "$enabled_hosts/$name" ]; then
            echo '* Removing symlink for current host...';
            rm /etc/apache2/sites-enabled/$name
            echo '* Updating /etc/hosts';
            sed "/$name/d" /etc/hosts > /tmp/tmp-hosts;
            mv -f /tmp/tmp-hosts /etc/hosts
            
            reload_apache;
            echo '* Done'
        else
            echo 'No such vhost.';
        fi
    }

    show_help() {
        echo 'Available actions:
        create - creates a new project. Includes folder structure and database (optional).
        delete - delete all project files and drops database (optional). Asks for confirmation.
        enable - enables selected virtual host.
        disable - disables selected virtual host
        help - shows this message.'
    ;    
    }

    reload_apache() {
        service apache2 reload
    }

    if [ $(whoami) != "root" ]; then
        echo 'You must be root.'
        exit 1;
    fi
        
    case $action in
        create)
            create_host;
        ;;
        add)
            create_host;
        ;;
        rm)
            delete_host;
        ;;
        del)
            delete_host;
        ;;
        delete)
            delete_host;
        ;;
        delall)
            delete_all;
        ;;
        on)
            enable_host;
        ;;
        enable)
            enable_host;
        ;;
        off)
            disable_host;
        ;;
        disable)
            disable_host;
        ;;
        help)
            show_help;
        ;;
        *)
            echo "Usage: `basename $0` (create|delete|enable|disable) vhostname";
            exit 0;
        ;;
    esac
        


    * This source code was highlighted with Source Code Highlighter.


    4. Outro


    Приму к сведению любые советы, так как в таких шелл-скриптах я еще новичек.

    p\s: для подсветки использовал цвета для C# ибо шелла там небыло.

    Скачать
    Поделиться публикацией

    Комментарии 14

      +1
      Что сразу бросается в глаза: вместо echo надёжнее использовать вот такую конструкцию
      cat < $filename
      line1
      line2
      line3
      EOF
        0
        Хабр скушал значок :)
        Исправленное:
        cat << EOF > $filename
        line1
        line2
        line3
        EOF
        
          0
          ага, спасибо. не обращайте внимание на первый камент ) ответил раньше, чем вы исправились )
        0
        эт в каком месте уместнее будет?
          0
          не самые хорошие настройки Apache
          при выключенных сетевых интерфейсах работать не будет
          лучьше делать так:

          в httpd.conf
          Listen 80
          NameVirtualHost localhost
          ServerName localhost

          в виртуальных хостах прописываем
          <VirtualHost localhost>
          ServerName $name

          всё остальное по вкусу
            0
            О! И hosts править не нужно?
              0
              нет, всё равно нужно
              хотя можно поставить dns сервер и hosts можно не править
                +1
                Упс, глупость ляпнул.
            0
            Такой же скрипт в моем хозяйстве. Могу посоветовать запускать его по incron. Создаешь директорию, а у тебя уже все базовые файлы созданы и хост прописан. Никаких телодвижений :)
              0
              Для локального сервера в 95% случаев хватает один раз прописать VirtualHost с VirtualDocumentRoot вместо DocumentRoot и не париться. Для создания нового сайта достаточно просто папку создать и все. Не нужно запускать никаких скриптов и тем более перезапускать апач каждый раз.

              А для специфических настроек лучше конечено вручную сделать VirtualHost, потом то они и специфичные.
                0
                ещё заюзайте a2ensite|a2dissite, а то как-то избыточненько.
                  0
                  1. апач не нужно «перезапускать» для применения конфигов — достаточно сделать graceful.
                  2.вы видимо не в курсе про a2ensite,a2enmod?
                    0
                    а он и не перезапускается. обратите внимание 'service apache2 reload'.
                    всегото заново считать конфиги.
                    0
                    А еще можно и конфиги Nginx Заодно генерить =)) Так будет тру скрипт. И в идеале вынести шаблоны конфигов в отдельные файлы.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое