Форум программистов, компьютерный форум, киберфорум
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
Показов 4036 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru