Форум программистов, компьютерный форум, киберфорум
Dimedrol
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Программа createhost. Создаем хосты без лишних телодвижений

Запись от Dimedrol размещена 03.04.2012 в 12:57
Обновил(-а) Dimedrol 08.04.2012 в 21:09

Сегодня поговорим о программе, которая будет создавать локальные хосты. Это очень удобно. Для каждого проекта отдельный хост. Использовать мы будет 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 значит хост был найден в этом файле.
Все, с проверками мы покончили. Давайте теперь создадим директорию с именем хоста:

Bash
1
mkdir /sites/$1
Создадим там файл 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>

В следующий раз попробуем реализовать программу удаления хостов.
Размещено в Linux
Показов 1194 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.