Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Небольшой графический пользовательский интерфейс для Irssi

Оригинал: A Little GUI for Your CLI
Автор: Shawn Powers
Дата публикации: 28 мая, 2014 г.
Перевод: Н.Ромоданов
Дата перевода: июнь 2014 г.

Я попробовал пользоваться почти всеми клиентскими приложениями IRC, которые доступны как в Linux, так и в OS X (я в течение своего рабочего дня пользуюсь обеими платформами). Независимо от того, сколько раз я пытался найти приложения с графическим интерфейсом, который отвечал бы моим потребностям, я всегда возвращался к Irssi (прим.пер.: Irssi — IRC-клиент для Linux и других UNIX-подобных систем; сейчас также доступен для операционной системы Windows). Он работает очень хорошо и я могу получить к нему доступ отовсюду (рис. 1). Благодаря тому, что мой Raspberry Pi размещен на площадке у провайдера в Австрии (сервис colocation), я всегда могу зайти в систему и никогда не пропущу ни одного сообщения. К сожалению, одно, что я хочу, чтобы было в Irssi, это всплывающее уведомление, которое появлялось бы всякий раз, когда кто-то посылает мне сообщение или упоминает меня в канале. Поэтому я решил добавить к Irssi небольшой графический пользовательский интерфейс. Это оказалось очень здорово, и, как выяснилось, работало очень хорошо.

Рис.1. Я, на самом деле, чуть-чуть прокрутил немного вверх с тем, чтобы скриншот можно было безопасно опубликовать в журнале!

Если вы работаете с Irssi локально, сидя перед машиной с Linux, то этот процесс намного проще. Поскольку моя машина, подключаемая к Irssi, находится на другом континенте, процесс немного сложнее, но и гораздо более интересный. Для того, чтобы в графическом пользовательском интерфейсе локально получать уведомления об упоминании моего пользовательского имени где-то удаленно, мне нужно выполнить несколько вещей:

  1. Я должен получить доступ к Irssi для того, чтобы генерировать какие-либо события и/или записи в журнале, когда я упоминаюсь в канале IRC или запросе.
  2. Я должен в реальном времени проанализировать эту информацию и передать ее в мою локальную машину через Интернет.
  3. Мне нужно, опять же в реальном времени, отобразить всплывающее окно графического интерфейса на моей локальной машине, когда события происходят удаленно.
  4. Мне нужно независимо от того, на каком компьютере я нахожусь (в моем случае, это означает, в Linux или в OS X), иметь возможность отключиться и вновь подключиться к сессии экрана и получить графические уведомления, предназначенные для меня.

К счастью, в Linux присутствуют все инструментальные средства, которые мне нужны, и с помощью несложного скрипта я могу получить рабочую систему.

Шаг 1: События Irssi

Очевидно, я не первый, кому нужна система графических уведомлений для Irssi, и, к счастью Торстен Лимьешs (Thorsten Leemhuis) поделился со всеми пользователями своим плагином для Irssi. Вы можете скачать плагин по ссылке http://www.leemhuis.info/files/fnotify/fnotify и, поскольку он выпущен под лицензией GPL, вы можете пользоваться им по своему усмотрению.

Для того, чтобы использовать сценарий, сохраните его как файл fnotify.pl в вашем каталоге ~/.irssi/scripts/, в котором работает Irssi. Что касается меня, то это на моем сервере, удаленно работающим в Австрии. После того, как файл будет сохранен, вы можете загрузить скрпт, набрав следующее:

/script load fnotify.pl

из приложения Irssi. Если вы хотите, чтобы файл fnotify.pl загружаться автоматически каждый раз, когда запускается Irssi (я рекомендую так сделать), создайте символическую ссылку в каталоге автозапуска внутри каталога скриптов. Чтобы это сделать это, введите следующее:

mkdir ~/.irssi/scripts/autorun (если он еще не существует)
ln -s ~/.irssi/scripts/fnotify.pl ~/.irssi/scripts/autorun/fnotify.pl

Тогда файл fnotify должен загружаться всякий раз, когда запускается Irssi. Чтобы убедиться, что все работает правильно, пусть кто-нибудь упомянет о вас в канале IRC канале и проверьте, что в файл ~ /.irssi/fnotify записано сообщение.

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

Локальное графическое уведомление

Это часть уравнения, довольно проста. Большинство дистрибутивов Linux поставляются с какой-нибудь системой уведомлений. Я предпочитаю среду GNOME, поэтому я выбираю для использования libnotify, или, точнее, команду notify-send, которая, когда она выполняется из командной строки или из скрипта, создает всплывающее графическое окно. Пользователи KDE могут с аналогичным результатом пользоваться программой kdialog, а пользователи OS X могли бы попробовать Terminal Notifier, который можно получить по адресу размещенное по адресу https://github.com/alloy/terminal-notifier.

Проверьте из командной строки Linux, набрав для этого команду notify-send:

notify-send "Test Title" "Sample message..."

Это должно привести к появлению окна libnotify с заголовком и сообщением (рис. 2). Если вы используете KDE (или OS X), команда будет аналогичной, но вы должны знать ее точный синтаксис. Кроме того, можно настроить программу так, чтобы выдавались пользовательские иконки, изменялось время, в течение которого будет показывается всплывающее окно, и даже изменить системный приоритет уведомления. Я, на самом деле, использую иконку Pidgin для окна уведомлений, только потому, что я использовал Pidgin так долго, что эта иконка у меня ассоциируется с чатом.

Рис.2. Действительно всплывающее системное окно выглядит довольно гладко.

Дистанционное fnotify, локальное libnotify

Это та часть уравнения, которая в течение долгого времени ставила меня в тупик. Я создал дистанционное X-туннелирование через SSH, но поскольку в Irssi не было нативного всплывающего графического окна, отсутствовали X-ы для туннелирования. Я также знал, что если я через SSH подключусь моему серверу дистанционно, то любые команды, которые запущу, должны выполняться на удаленном сервере. К счастью, после достаточного поиска в сети и размышлений я кое-что узнал: можно запустить программу дистанционно не только в командной оболочке под SSH! Я никогда не считал, что это возможно, но в этом, конечно, есть некоторый смысл.

Знание о том, что я могу запустить программу через SSH на удаленном сервере и получить результат ее работы на моей локальной машине, были превращены в простой скрипт, который берет текст из fnotify и перенаправлет его через конвейер в libnotify. Я должен отметить, что гораздо легче сделать дистанционный доступ через SSH в том случае, если вы настроите пару ключей для того, чтобы избежать необходимости вводить пароль. Можно выполнить команды в интерактивном режиме, но вы потеряете много в автоматизации. У меня есть простой видео-учебник по созданию пары ключей SSH: https://www.youtube.com/watch?v=R65HTJeObkI.

Вот мой скрипт; позже я его объясню:

#!/bin/bash
# Location: /usr/local/bin/irc_notify
(ssh spowers@my.remote.server.com \
-o PermitLocalCommand=no -o ServerAliveInterval=30 \
"> .irssi/fnotify; tail -f .irssi/fnotify" |
while read title message; do
notify-send -u critical -i pidgin "${title}" "${message}";
done)

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

Скрипт делает следующее:

  1. Скрипт запускает SSH с парой параметров. Я добавил параметр ServerAliveInterval=30, поскольку в моем случае для соединения SSH через некоторое время возникает тайм-аут. Это сводит весь смысл скрипта на нет, так что смысл данного параметра состоит в поддержке соединения.
  2. Я указываю, что программа SSH должна запускать на удаленном компьютере вместо того, чтобы запускать командную оболочку, что происходит по умолчанию. Вообще то, я делаю две вещи: во-первых, очищаю файл fnotify в .irssi, а, во-вторых, запускаю команду tail -f для того же самого файла. Я очищаю файл для того, чтобы он не был слишком длинным, но если вы хотите вести учет всех ваших сообщений, вы можете этого не делать — это не повлияет на работу скрипта.
  3. Команда tail -f является командой, которая постоянно работает и делает новые записи в указанный файл в командной строке. Она обычно используется для просмотра журнальных файлов, но для данного случая она прекрасно подходит. Каждый раз, когда кто-нибудь упоминает мое имя пользователя, команда tail -f выдает сообщение на экране.
  4. Обратите внимание в конце этой строки на символ конвейера (|) - который перенаправляет результат к программе, следующей за ним, вместо того, чтобы выдавать его на экран. В данном случае результат работы команды tail -f перенаправляется в цикл while, в котором считывается текст из двух различных переменных. С помощью команды read title message формируется первое слово в переменной $title (обычно имя лица, отправившего мне сообщение), а остальная часть сообщения помещается в переменную $message.
  5. Затем цикл while запускает команду notify-send с переменными, указанными выше, после чего цикл приостанавливается, ожидая следующие данные из команды tail, работающей дистанционно под SSH. Чтобы завершить программу, вы можете нажать ^C. Но на самом деле я это также автоматизировал - подробнее об этом чуть позже.

Сам скрипт достаточно постой, но в нем можно перепутать, какие его части выполняются дистанционно, а какие — локально. Как только я узнал, что программа SSH может запустить на удаленной системе любую программу, а не только командную оболочку, концепция скрипта обрела смысл. Будем надеяться, что и для вас.

Собираем все вместе

Теперь у вас есть система, которая будет уведомлять вас, когда кто-то упоминает ваше имя в работающей сессии Irssi. Я предполагаю, что вы запустите Irssi в сессии экрана или tmux с тем, чтобы вы могли подключаться и отключаться тогда, когда это будет необходимо. Т.к. я подключаюсь с различных машин, я расскажу, как я это делаю. Для упрощения я, однако, написал второй скрипт, который устанавливает SSH-соединение, обслуживающее уведомления, а затем через SSH перенаправляет меня на сервере. Потом, когда я отключиться от интерактивной сессии SSH, он также уничтожает это соединение. Я вызываю этот скрипт из описанной выше команды irc_notify и приведенного ниже скрипта просто как irc. Когда я хочу использовать IRC, я из командной строки набираю irc, а все уведомления поступают автоматически. Скрипт irc имеет следующий вид:

#!/bin/bash
# Location: /usr/local/bin/irc
#
# Для того, чтобы избежать дублирования уведомлений, 
# уничтожаются все сессии fnotify, которые могут работать
kill $(ps aux | grep [f]notify | awk '{print $2}') > 
 ↪/dev/null &2>1
irc_notify &
ssh spowers@my.remote.server.com
# Уничтожаются все текущие сессии fnotify с тем, чтобы не 
# появлялось окно уведомлений, когда я не подключен к IRC
kill $(ps aux | grep [f]notify | awk '{print $2}')

В скрипте действительно нет ничего сложного, но строки с командой kill нужно несколько пояснить. Я запускаю ps aux, а затем - grep для fnotify для того, чтобы убедиться, что пользуюсь правильной сессией SSH. К сожалению, когда grep работает в конкретных условиях, вы также получите реальный процесс grep. Если воспользоваться регулярным выражением [f]notify, то будет возвращен только процесс SSH. Тогда, второе поле является идентификатором процесса (PID), поэтому я использую awk для того, чтобы получить только эту информацию и уничтожаю процесс по его номеру.

Я использую эту команду дважды: один раз перед запуском интерактивного сеанса SSH для того, чтобы убедиться, что скрипт уведомлений еще не запущен, а затем один раз после того, как я отключаюсь, для того, чтобы убрать все за собой. В идеальном случае первая инструкция kill никогда не найдет ничего, что нужно уничтожить, поскольку мой скрипт все за собой убирает, но иногда дела идут не так как надо. Мне нравится, что я не получу дубликаты уведомлений из-за многочисленных работающих сценариев fnotify.

Кроссплатформенность и более

Я регулярно использую скрипты на обоих системах Linux и OS X. Я понятия не имею, есть ли что-нибдь, что позволит использовать графические всплывающие окна на Windows, но я думаю, что скриптовая часть будет работать в среде Cygwin. Мне не нужно было это проверять на Windows, но мне было бы интересно услышать об этом, если у вас это заработало.

Я люблю пользоваться программой Irssi для общения через IRC, и теперь, когда у меня для этой программы есть система графических уведомлений, я, наверное, начну использовать Bitlbee и для других протоколов обмена мгновенными сообщениями, что сделает Irssi действительно моим единственным инструментом для общения в чате. Я надеюсь, что этот урок создания скриптов вдохновляет вас сделать гораздо больше, чем достиг я — в системе Linux единственным ограничивающим фактором является ваше воображение!