...

понедельник, 22 июля 2013 г.

CLI-комбайн для Plesk



В данной статье речь пойдет о панели управления хостингом Plesk и CLI-интерфейсах, однако, информация может быть полезна и в общем плане создания удобных CLI-приложений.

Так получается, что занимаясь администрированием панели управления хостингом Plesk, несмотря на веб-интерфейс, я все равно довольно много времени провожу в консоле. В конце концов, если я хочу поглядеть права на файл внутри домена vasya.com, не в file manager же идти. Если же взять боевой сервер под хорошей нагрузкой, то некоторые вещи еще сильнее хочется смотреть с консоли, вместо веб-интерфейса.



С одной стороны, занимаясь администрированием Unix/Linux систем на регулярной основе, привыкаешь использовать автокомлит, алиасы, начинаешь писать bash-скрипты для мелких рутинных задач. С другой стороны, если взглянуть на Plesk, то у него довольно богатый CLI-интерфейс, который встречается далеко не в каждой панели управления. Но странная вещь — пользоваться им, мягко говоря, не очень удобно, а для многих типичных административных задач он вообще оказывается бесполезен.


Желание как-то повлиять на ситуацию и провести некоторые улучшения в CLI зрело давно. Проводя половину времени в консоли, набираешь и набираешь очередные команды. Если взглянуть пристально на эти команды, то можно обратить внимание, что эти же самые команды встечаются в файле history и у других администраторов Plesk'а. А команды весьма и весьма многословные:



# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa
# /usr/local/psa/bin/domain ...
# /usr/local/psa/bin/sw-engine-pleskrun /usr/local...
# tail -f /var/log/sw-cp-server/error_log
...




Предыдущие упомянутые моменты послужили мотивацией попробовать что-то изменить. Кроме того, на решение повлияла в начале года попавшаяся мне книжка о создании command line приложений на Ruby (ее уже как-то пиарили на Хабре). Книжка, кстати, понравилась с тем, что воды там было по-минимуму, а в основном были примеры того, как делать хорошие консольные приложения. Не скажу, что узнал много нового, но книга именно систематизировала знания, разложив вещи по полочкам и послужив дополнительным стимулом применить эти знания.

Последним мотивирующим фактором было то, что хотелось сделать инструмент, который был бы полезен в ежедневной работе себе самому.


Так появилась консольная утилита с весьма очевидным названием — "plesk", которая была призвана упростить выполнение ряда частых операций в CLI. Утилита идет в штатной поставке Plesk 11.5.


Но вернемся немного к теории. Если поглядеть на утилиты Unix/Linux, то их можно условно разделить на два класса: простые команды и command suites. Когда количество опций начинает превышать разумный предел и есть возможность разбить инструментарий на отдельные области, в этот момент и наступает необходимость в формировании command suite. Пример простой команды — это ls (есть множество опций, но команда — одна), а примеры command suites — это git или svn (есть множество подкоманд).


В контексте Plesk'а одна из проблем выглядела следующим образом. В директории /usr/local/psa/bin/ расположено больше сотни различных утилит. Набирать префикс /usr/local/psa/bin/ каждый раз очень не хочется. Делать "cd /usr/local/psa/bin/" — тоже. Запихать /usr/local/psa/bin/ в PATH еще менее симпатичная идея, потому что в PATH будет хаос и нельзя будет понять то ли это стандартная утилита, то ли утилита из состава Plesk. Выкинуть старый CLI-интерфейс и написать абсолютно новый за ближайшие выходные — утопично как в плане времени, так и в плане поддержки обратной совместимости. Логичный ответ на эту проблему — делаем command suite wrapper'ом над стандартным интерфейсом. Утилиту /usr/local/psa/bin/domain будем вызывать как "plesk bin domain". Для того, чтобы не запоминать названия подкоманд утилиты plesk и доступных утилит из bin'а, добавим bash completion. Чтобы стало еще удобней, добавим bash completion и для команд/опций самих утилит из bin'а.


Раньше для того, чтобы создать клиента из консоли, я делал примерно следующее. Делал вызов справки и смотрел опции. Очень часто я помню примерные названия и понимаю, что хочу, но не точное написание конкретной опции:



# /usr/local/psa/bin/client -h
Usage: client command <login_name> ..
Available commands:
--create or -c <login_name> Creates a new customer account..




После этого набирал нужную мне команду (возвращаясь попутно к справочной информации, так как не все опции сразу удается запомнить):

# /usr/local/psa/bin/client --create ...




Теперь же вместо этого достаточно почаще нажимать Tab ;)

# plesk bin cl<TAB>
client client_pref cloning
# plesk bin client --create<TAB>
--create --create-gapps-account




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

Следующий аспект — это shortcuts для частонабираемых, но длинных команд.


Вместо того, чтобы набирать довольно длинную команду для попадания в консольный MySQL-клиент:



# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa




Теперь достаточно набрать:

# plesk db




Иногда возникает необходимость узнать версию Plesk'а на машине. Архитектуру машины. Имя дистрибутива. Да и версию микроапдейта, если установлен, узнать не помешает. Для этого придется набрать немало команд:

# cat /etc/issue
CentOS release 5.9 (Final)..

# cat /usr/local/psa/version
11.5.22 CentOS 5 115130325.19

# cat /usr/local/psa/.revision
319415

# uname -a
Linux hp-demo...

# cat /root/.autoinstaller/microupdates.xml
...




Теперь достаточно набрать одну небольшую команду и получить всю информацию разом:

# plesk version
Product version: 11.5.30 Update #6
Update date: 2013/07/19 07:42
Build date: 2013/07/11 12:00
Build target: Debian 6.0
Revision: 323071
Architecture: 32-bit
Wrapper version: 1.0




Но простых shortcut'ов мало, поэтому идем дальше. Допустим нам хочется поглядеть содержимое той или иной таблицы. Достаточно набрать:

# plesk db show misc
+-------------------------------------+----------------------------------------------------------------+
| param | val |
+-------------------------------------+----------------------------------------------------------------+
| FullHostName | unknown |
| actionlog_rot_num_periods | 30 |
...




Если вывод превышает размер экрана, то будет использован постраничный просмотр. Те кто пользовался svn log и git log поймут, о какой разнице идет речь. Добиться такого поведения можно, например, используя команду " | less --quit-if-one-screen --no-init".

У панели есть различные конфигурационные файлы. Упростить их открытие на редактирование тоже можно:



# plesk conf panel.ini




И мы уже находимся в Vim и можем вносить изменения. Достигается это с помощью обычного proc_open.

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



# plesk log --all
Log files: /usr/local/psa/var/log/maillog /var/log/sw-cp-server/..

==> /usr/local/psa/var/log/maillog <==
Jul 22 17:25:43 ay postfix/anvil[25376]: statistics: max connection count 1 for (smtp:1.164.98.84) at Jul 22 17:22:21
..

==> /var/log/sw-cp-server/error_log <==

==> /usr/local/psa/admin/logs/httpsd_access_log <==

...




Свежий взгляд на старые проблемы дает интересные результаты. В 370 строчек кода wrapper'а уместилось довольно много идей в стремлении упростить те или иные моменты.

Еще один важный — это документация.


Если вызвать утилиту без параметров, то должна быть выдана краткая справка. Однако справка точно не должна быть вида "Usage: command [options]" (этим страдают некоторые из штатных утилит Plesk'а). Все-таки немного подробностей не помешает, а именно — перечисление опций, список подкоманд, если есть. Для command suites должна присутствовать подкоманда help и возможность выполнить command help subcommand. По сути это некоторая замена мануалу с возможность фильтрации информации. И конечно же, true Unix-утилита обязательно должна иметь man-страничку. Да, теперь можно набрать, "man plesk" :) Вообще, именно благодаря man'ам, пользователь может изучить тонкости работы утилиты и получить дополнительную информацию, такую как примеры использования, комбинации опций и т.п. Если вы задались целью создать собственный command suite, то не забудьте о usage, help subcommand и man page. Хоть написание справки — одно из нелюбимых программистами занятий.


Возвращаясь к утилите "plesk". У любого человека есть возможность поучаствовать в ее развитии. Plesk разрабатывает очень небольшая команда разработчиков. С другой стороны, администраторов пользующихся Plesk'ом — на несколько порядков больше. Так как утилита призвана в первую очередь упростить жизнь в CLI для администраторов, то она идет с открытым исходным кодом, а репозиторий-mirror есть на GitHub — github.com/sibprogrammer/plesk-ctl Если у вас есть какая-то замечательная идея и вы можете ее воплотить, то есть шанс, что этот функционал окажется в upstream'е. Чтобы минимизировать зависимости, утилита была написана на PHP — языке, используемом для работы веб-интерфейса панели (хоть я и ярый сторонник Ruby и JS :)). С другой стороны, PHP довольно популярен, поэтому выбор этого языка может только поспособствовать развитию утилиты.


P.S. Для любителей визуального восприятия — презентация на SlideShare.



This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий