[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: reload virtual host средствами php
OmanDebian
Всем привет! Есть задача написать некую штуковину которая будет заставлять перечитывать апач свои виртуальные хосты, данная вещь должна вызываться из php в виде класса, ну например $this->блабла->блабла('reload'); что там дальше будет уже второстепенно, будет ли его релоадить баш, сишный скрипт и т.д.
Апач висит на xampp, перечитывает виртуальные хосты в терминале вот такой командой /opt/lampp/lampp reload, ну и в общем упираюсь я в права, не дает мне мне сделать это обычной exec функцией. Много что перепробовал и копался в исходниках как webmin, ну в общем не хватает мне мозга это сделать. Не прошу помощи за бесплатно, пишите цену. Также нужен будет мануал по установки или настройки вашего скрипта (объяснение).
AllesKlar
Apache - это обычный сервис (на языке народностей Гейтс - служба)
Следовательно, тебе всего лишь нужно написать скрипт, который будет перестартовывать службу (иначе изменения в конфигах не вступят в силу)
И вопрос тут не в скрпте, а, как ты уже правильно заметил, в правах.
Тебе нужно дать пользователю, под которым запущен апач дать права на перезапуск службы apache2.x
Как это сделать - лучше спросить на форуме мелкомягких-админов

_____________
[продано копирайтерам]
OmanDebian
AllesKlar
Благодарю за ответ, присваивать права на управление апачем с того пользователя который сидит сам на апаче тобиш на 80 порту это не безопасно)
killer8080
OmanDebian
речь идёт о винде или линуксе?
OmanDebian
Linux centos 6
killer8080
OmanDebian
тогда просто скомпили на C простой пускач, с захардкоденой командой перезапуска апача. Установи его владельца рутом, выстави SUID бит, группу выстави тем пользователем, под которым будет работать PHP, права на запуск только владельцу и группе. И всё, вызывай его из PHP.
OmanDebian
Эмм у меня нулевое знание Си)), с баш так делал но не пускает все равно. Если можно есть пример что должно быть внутри файла на Си, скомпилить я думаю смогу
killer8080
Цитата (OmanDebian @ 31.05.2015 - 00:48)
Эмм у меня нулевое знание Си)), с баш так делал но не пускает все равно. Если можно есть пример что должно быть внутри файла на Си, скомпилить я думаю смогу

на баш нельзя ставить suid, он ставится только на бинарники
ну самое простое
int main() {
system("/opt/lampp/lampp reload");
}

сохраняешь это в файл допустим restart.c
компилим
gcc restart.c -o restart

если все нормально, после компиляции появится файл с именем restart.
Ну а с chown chmod-ами думаю сам разберёшся
OmanDebian
killer8080 Благодарю! Завтра попробую и отпишусь
killer8080
OmanDebian
учти что после вызова перезагрузке дальнейшая работа php скрипта может прерваться из-за перезагрузки апача
OmanDebian
Вроде не должно, он сам то не перезагружается а перечитывает конфигурации, но хотя не знаю) не мне спорить
AllesKlar
OmanDebian
Цитата
Апач висит на xampp

Цитата
Linux centos 6

blink.gif Даже предположить не мог

_____________
[продано копирайтерам]
killer8080
Цитата (OmanDebian @ 31.05.2015 - 01:10)
Вроде не должно, он сам то не перезагружается а перечитывает конфигурации, но хотя не знаю) не мне спорить

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



Спустя 14 минут, 35 секунд killer8080 написал(а):
самому стало интересно, потестил, все таки рестарт рубит все процессы не дожидаясь завершения, что в общем то естественно.
OmanDebian
Итак друзья я сделал больше чем хотел, объединив 2-е мысли 2-х людей за это им низки поклон. killer8080 с форума phpforum.su и DeepVarvar с форума forum.php.su.
Итак что же я сделал:
Установил утилиту Inotify которая которая может отслеживать изменение в фалах или каталогах.
создал файла update.sh и задал на наго пользователя из под которого работает apache в моем случае это daemon, со следующим содержимым:

#!/bin/sh
while inotifywait -e modify /domain; do
if tail -n1 /domain | grep 1; then
/restart.c
fi
done

Где:
while inotifywait -e modify /domain; запускает некий цикл который мониторит всегда файл domain
if tail -n1 /domain | grep 1; Проверяет наличия появившейся 1 в данном файле
Если появилась единица то /restart.c

Создал файл restart.c с содержимым

int main() {
system("/opt/lampp/lampp reload");
}

скомпилил командой gcc restart.c -o restart

Дал права только для root что прямого доступа другие не получили

Далее запускаем скрип обычным php exec('./update.sh'), все пошел мониторинг файла domain, теперь всегда скрипт update.sh ждет изменения в файле domain.

Далее на другом сервере из под обычного php по ftp правлю файл domain пишу в его 1 и та да! Срабатывает update.sh, и дальше он запускает restart.c.
Все готово! Осталось только привести это в нужный вид, ибо это черновой рабочий вариант. Мы получили возможность даже удаленного reload виртуальных хостов, т.е. управлять перезагрузкой с абсолютно другого сервера.
Сразу хочу сказать что данная штуковина не работает если включен selinux (долго парился по чему же не работает), пока не разобрался как мне разрешить это все в selinux по этому пока что его отключил.
killer8080
Цитата (OmanDebian @ 31.05.2015 - 11:34)
Если появилась единица то /restart.c

restart.c это исходник, запускать нужно restart
Цитата (OmanDebian @ 31.05.2015 - 11:34)
Дал права только для root что прямого доступа другие не получили

а как же ты его тогда из php запускаешь? user posted image
Вообще я подразумевал так (здесь www-data юзер под которым исполняется php скрипт)
# gcc restart.c -o restart && chown root:www-data restart && chmod 4110 restart

суть была в suid-е, запускает программу обычный пользователь, а работает она под root-ом
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.