Сделать этот проект меня побудила лень. Лень разбираться с проблемами с моим прозрачным прокси, который периодически тупит. Чаще всего помогает перезапуск Tor, иногда приходится перезапускать всю свою связку Bind9+Squid+Privoxy в отдельном netns, т.к. они у меня одним unit'ом поднимаются. И сделать это не так-то просто, ведь ssh-ключ с телефона на сервер перекидывать мне тоже лень. То есть, я, условно, не дождавшись новых картинок в ленте Instagram'а, подключался ssh-клиентом к рабочему ПК, с него заходил на сервер и только тогда мог от руки вбить команды перезапуска.
Но вот сегодня я решил, что пора прекращать это терпеть, и будет круто перезапускать эти сервисы одной кнопкой. Лучше двумя, т.к. Tor перезапускается заметно быстрее моего монструозного unit'а, а закрывает вопрос в 90% случаев. В этот момент я и нарисовал приложенную схему:
Тут можно увидеть три домена данной схемы: WEB, в который я собрался тыкать пальцем, CLI, который должен быть мозгом всей схемы, и сами демоны, на которые я буду воздействовать на примере Tor. Стрелочками указано направление воздействия. Стрелочки, идущие в морду, обозначают сбор информации для отображения в самой морде, однако я пока не придумал: какую информацию я бы хотел видеть.
При подборе инструментов реализации я шёл по пути наименьшего сопротивления. Для WEB это хрестоматийный стек технологий: HTML, JS, CSS, PHP. По задумке, WEB должен получать мой клик и вызывать CLI с нужными аргументами. При этом весь WEB помещается в корневом каталоге виртуального веб-сервера.
Для CLI я использовал свой любимый инструмент для ситуаций, когда речь заходит про "высокая скорость разработки" и "взаимодействие с системой" — Python. Как видно на схеме, CLI попилен на две части. Сделано это по следующим причинам:
- Упрощение интерфейса. Из PHP очень легко вызвать скрипт на Python, из Python очень легко обмениваться обычными TCP-пакетами с текстовыми командами.
- Разграничение прав. Я не хочу запускать веб-сервер из-под суперпользователя.
- Оставляю за собой право, всё-таки, использовать эту утилиту в консоли. Ведь, если я сижу с ПК, мне будет гораздо удобнее просто выполнить команду, чем целиться мышкой/пальцем по кнопкам и прочим свистулькам для педиков. А транспорт в виде TCP позволяет иметь CLIent на одной машине, а сервер — на другой.
Сам же сервер на Python запускается таким же unit'ом systemd и ждёт команды от клиентской части. Каждая команда сверяется со списком разрешённых к перезапуску демонов. Как только команда service отдаст контроль вызывающему скрипту, весть об успешности операции возвращается в морду тем же путём.
В целом, у этого pet-проекта есть потанцевал стать чем-то больше: его можно научить запускать самые разные команды, ещё и останется возможность их контроллировать, аутентифицировать и т.д. Правда, пока я не выкладывал исходники в открытый доступ. На всякий случай.
Видео я вам тоже не приготовил: не знаю что снимать. Но могу показать скриншоты: