Сегодня поговорим о программе, которая будет создавать локальные хосты. Это очень удобно. Для каждого проекта отдельный хост. Использовать мы будет bash, директории хостов будут храниться в /sites/.
Поехали!
Создадим директорию /sites
sudo mkdir /sites
Давайте будем хранить нашу программу в директории /usr/bin/. Создадим поддиректорию createhost
sudo mkdir /usr/bin/createhost
Теперь создадим шаблон, по которому будет создаваться файл настроек. Воспользуемся файлом 000-default, который находится в /etc/apache2/sites-enabled/
sudo cp /etc/apache2/sites-enabled/000-default /usr/bin/createhost/host.tpl
Нам придется немного отредактировать полученный шаблон. Воспользуемся редактором vim ( или nano).
sudo vim /usr/bin/createhost/host.tpl
Нам надо поставить специальные метки, которые в будущем будут заменяться на имя хоста. Вот мой шаблон:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName {NAME}
DocumentRoot /sites/{NAME}
<Directory /sites/{NAME}/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/{NAME}_error.log
CustomLog ${APACHE_LOG_DIR}/{NAME}_access.log combined
</VirtualHost>
Сохраним. Шаблон готов.
Займемся написанием самого скрипта. Как уже было сказано, использовать мы будем bash.
Bash | 1
| sudo vim /usr/bin/createhost/createhost.sh |
|
Как вы могли заметить, многие операции проходят от имени суперпользователя. Давайте проверим, является ли пользователь суперпользователем. Суперпользователь имеет нулевой айди в системе. Воспользуемся этим.
Bash | 1
2
3
| if [ "$UID" -ne 0 ]; then
echo 'access denied'; exit
fi |
|
Как мы будем передавать имя нового хоста? Давайте так:
./createhost.sh hostname
Проверим, передал ли пользователь нам имя хоста
Bash | 1
2
3
| if [ -z $1 ]; then
exit
fi |
|
Пришло время проверить на существование хоста.
Проверяем директорию ./sites
Bash | 1
2
3
| if [ -d /sites/$1 ]; then
echo $1' exists in /sites/ directory';exit
fi |
|
Проверяем директорию /etc/apache2/sites-enabled/
Bash | 1
2
3
| if [ -f /etc/apache2/sites-enabled/$1 ]; then
echo $1' exists in sites-enabled directory';
fi |
|
Теперь хорошо бы проверить файл hosts. Тут все немного посложнее. Воспользуемя командой grep. Если grep что-то нашел в файле, вернет 0. Есть еще один момент - очень не красиво будет, если эта программа выведет на экран результат своей работы. Как же это исправить? Да все очень просто. В Linux есть замечательная "черная дыра" - /dev/null. Перенаправим вывод программы в дыру:
Bash | 1
| grep -e "$1" /etc/hosts >> /dev/null |
|
Теперь проверим, какой код вернула программа (если я не ошибаюсь, почти все программы при положительном результате возвращают 0 ).
Bash | 1
2
3
| if [ $? -eq 0 ]; then
echo $1' exists in hosts file';
fi |
|
Переменная $? хранит результат выполнения последней программы. Если grep вернул 0 значит хост был найден в этом файле.
Все, с проверками мы покончили. Давайте теперь создадим директорию с именем хоста:
Создадим там файл index.html, чтобы можно было сразу проверить работоспособность хоста.
Bash | 1
| echo "<h1>Hello from $1</h1>" > /sites/$1/index.html |
|
Пришло время заняться настройкой апача. Для работы с шаблоном мы будем использовать программу sed. Почитайте о ней в интернете. Замечательная программа. Очень помогает при решении некоторых задачь.
Bash | 1
| sed -e "s;{NAME};$1;" /usr/bin/createhost/host.tpl > /etc/apache2/sites-enabled/$1 |
|
Все, с апачем мы закончили. Перейдем к файлу hosts. Добавим в конец файла наш хост.
Bash | 1
| echo "127.0.0.1 $1" >> /etc/hosts |
|
Теперь пришло время перегрузить апач.
Bash | 1
| /etc/init.d/apache2 reload |
|
Результат перезагрузки можно тоже направить в "черную дыру".
Bash | 1
| /etc/init.d/apache2 reload >> /dev/null |
|
Но тогда хорошо бы добавить еще одну проверку после перезагрузки
Bash | 1
2
3
4
5
| if [ $? -eq 0 ]; then
echo "http://$1/ created!"
else
echo "Error"
fi |
|
Все, наша программа готова. Закрываем редактор и меняем права на файл нашей программы:
chmod +x /usr/bin/createhost/createhost.sh
Пробуем создать хост
dmitry@dmitry:/$ cd /usr/bin/createhost/
dmitry@dmitry:/usr/bin/createhost$ ./createhost.sh
access denied
dmitry@dmitry:/usr/bin/createhost$ sudo ./createhost.sh
dmitry@dmitry:/usr/bin/createhost$ sudo ./createhost.sh cyberforum
http://cyberforum/ created!
Проверяем... Да, мы создали хост.
Приложение
createhost.sh
Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| #!/bin/bash
if [ "$UID" -ne 0 ]; then
echo 'access denied'; exit
fi
if [ -z $1 ]; then
exit
fi
if [ -d /sites/$1 ]; then
echo $1' exists in /sites/ directory';exit
fi
if [ -f /etc/apache2/sites-enabled/$1 ]; then
echo $1' exists in sites-enabled directory';exit
fi
grep -e "$1" /etc/hosts >> /dev/null
if [ $? -eq 0 ]; then
echo $1' exists in hosts file';exit
fi
mkdir /sites/$1
echo "<h1>Hello from $1</h1>" > /sites/$1/index.html
sed -e "s;{NAME};$1;" /usr/bin/createhost/host.tpl > /etc/apache2/sites-enabled/$1
echo "127.0.0.1 $1" >> /etc/hosts
/etc/init.d/apache2 reload >> /dev/null
if [ $? -eq 0 ]; then
echo "http://$1/ created!"
else
echo "Error"
fi |
|
host.tpl
Код:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName {NAME}
DocumentRoot /sites/{NAME}
<Directory /sites/{NAME}/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/{NAME}_error.log
CustomLog ${APACHE_LOG_DIR}/{NAME}_access.log combined
</VirtualHost>
В следующий раз попробуем реализовать программу удаления хостов. |