Pull to refresh

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

Reading time8 min
Views3.2K

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# ибо шелла там небыло.

Скачать
Tags:
Hubs:
+4
Comments14

Articles

Change theme settings