Жизнь в консоли — Управляем Gajim из командной строки
Gajim — это популярный и активно развивающийся Jabber-клиент, написанный на Python. К слову, он обладает очень неплохой поддержкой всевозможных вкусностей и полезностей Jabber по сравнению со многими другими клиентами. Одной из таких полезностей является возможность управления им из командной строки при помощи D-Bus — системы межпроцессного взаимодействия.
Управление из командной строки не означает, что Gajim имеет консольный интерфейс. Он по-прежнему будет располагаться на рабочем столе в виде окошка. Просто из консоли можно будет отправлять ему какие-либо команды. Собственно, команд поддерживается немного, но для каких-то простейших действий должно хватить.
В состав пакета с Gajim входит консольная утилитка gajim-remote, которая как раз и предназначена для отправки команд основной программе. Если вызвать её без параметров, она покажет список поддерживаемых действий. Вот наиболее интересные:
Попробуем теперь применить это на практике. Напишем скрипт, меняющий сообщение статуса на случайную цитату из fortunes. (Для тех, кто ещё не знает, fortunes — это консольная программа, выдающая случайную цитату из довольно объемной базы.)
Для этого в бесконечном цикле будем вызывать gajim-remote, передавая ему при помощи обратных кавычек результат выполнения команды fortunes. Между вызовами поставим паузу 5 минут (5?60=300 с).
У этой команды есть небольшой недостаток — нужно всё время держать терминал открытым. Для того, чтобы решить эту проблему, можно просто записать команду в текстовый файл, а потом запустить следующим образом:
Амперсанд в конце запустит выполнение скрипта в фоне. Можно также создать правило для cron — тогда вообще не придется что-либо запускать.
Другое возможное применение — отправка кому-то сообщения по расписанию. Например, при помощи такой команды:
Ровно в 10:00 пользователю будет отправлено сообщение «Hello» (если, конечно, Gajim будет в этот момент запущен).
Итак, даже этот небольшой набор команд в сочетании с инструментами командной строки позволяет сделать что-то полезное.
Если работа gajim-remote покажется слишком медленной, можно воспользоваться, например, командой dbus-send или qdbus для отправки сообщения напрямую через D-Bus.
Список предоставляемых функций можно посмотреть при помощи команды
Вызвать же функцию можно так:
Работает намного быстрее gajim-remote, но приходится явно указывать, кому мы шлём команды.
Управление из командной строки не означает, что Gajim имеет консольный интерфейс. Он по-прежнему будет располагаться на рабочем столе в виде окошка. Просто из консоли можно будет отправлять ему какие-либо команды. Собственно, команд поддерживается немного, но для каких-то простейших действий должно хватить.
В состав пакета с Gajim входит консольная утилитка gajim-remote, которая как раз и предназначена для отправки команд основной программе. Если вызвать её без параметров, она покажет список поддерживаемых действий. Вот наиболее интересные:
- check_gajim_running — проверить, запущен ли Gajim (результат — True или False),
- list_accounts — список учётных записей,
- list_contacts [учётные записи] — список контактов в учётных записях,
- contact_info — информация о пользователе с указанным JID,
- account_info <учётная запись> — показать информацию об одной из учётных записей Gajim,
- add_contact [учётные записи] — добавить контакт в ростер,
- remove_contact [учётные записи] — удалить учётную запись из ростера,
- change_status <статус> [сообщение] [учётные записи] — изменить статус с возможностью указания сообщения и учётной записи (если не указать — будет изменен статус всех учётных записей),
- get_status [учётные записи] — получить статус указанных учётных записей,
- get_status_message [учётные записи] — получить сообщение статуса указанных учётных записей,
- get_unread_msgs_number — количество непрочитанных сообщений,
- handle_uri [учётные записи] — обработать ссылку вида «xmpp://»,
- join_room <комната> [ник] [пароль:] [учётные записи] — присоединиться к конференции,
- send_chat_message <сообщение> [PGP-ключ] [учётные записи] — отправить сообщение в чат,
- send_file <файл> [учётные записи] — отправить файл,
- send_groupchat_message <сообщение> [учётные записи] — отправить сообщение в конференцию,
- send_single_message <тема> <сообщение> [PGP-ключ] [учётные записи] — отправить одиночное сообщение,
- open_chat [учётные записи] — открыть чат с указанным контактом,
- start_chat <учётные записи> — открыть чат для заданной учётной записи (появится окно ввода JID),
- toggle_roster_appearance — показать/скрыть окошко ростера.
Попробуем теперь применить это на практике. Напишем скрипт, меняющий сообщение статуса на случайную цитату из fortunes. (Для тех, кто ещё не знает, fortunes — это консольная программа, выдающая случайную цитату из довольно объемной базы.)
Для этого в бесконечном цикле будем вызывать gajim-remote, передавая ему при помощи обратных кавычек результат выполнения команды fortunes. Между вызовами поставим паузу 5 минут (5?60=300 с).
while true; do gajim-remote change_status "online" "`fortune`"; sleep 300; done
У этой команды есть небольшой недостаток — нужно всё время держать терминал открытым. Для того, чтобы решить эту проблему, можно просто записать команду в текстовый файл, а потом запустить следующим образом:
bash changestatus.sh &
Амперсанд в конце запустит выполнение скрипта в фоне. Можно также создать правило для cron — тогда вообще не придется что-либо запускать.
Другое возможное применение — отправка кому-то сообщения по расписанию. Например, при помощи такой команды:
echo "gajim-remote send_chat_message [email protected] 'Hello'" | at 10:00
Ровно в 10:00 пользователю будет отправлено сообщение «Hello» (если, конечно, Gajim будет в этот момент запущен).
Итак, даже этот небольшой набор команд в сочетании с инструментами командной строки позволяет сделать что-то полезное.
Если работа gajim-remote покажется слишком медленной, можно воспользоваться, например, командой dbus-send или qdbus для отправки сообщения напрямую через D-Bus.
Список предоставляемых функций можно посмотреть при помощи команды
qdbus org.gajim.dbus /org/gajim/dbus/RemoteObject
Вызвать же функцию можно так:
qdbus org.gajim.dbus /org/gajim/dbus/RemoteObject toggle_roster_appearance
Работает намного быстрее gajim-remote, но приходится явно указывать, кому мы шлём команды.
Кросспост