- Разбираемся с D-BUS
- Почему система D-BUS уникальна
- Концепции D-BUS
- Почему следует использовать D-BUS
- Уровень событий ядра
- Добавление поддержки D-BUS в ваши приложения
- Использование API D-BUS для языка C
- Интерфейс Glib
- Заключение
- Управление Linux десктопом через D-Bus
- Используя D-Bus, вы можете персонализировать и автоматизировать ваш десктоп.
- Работа с D-Bus
- Какие приложения используют D-Bus?
- Работаем с D-Bus из командной строки
- Пишем скрипт для чтения Liferea ленты
- Без клавиатуры
- Проигрывание с помощью D-Bus
- Заключение
- Приложение
Разбираемся с D-BUS
Прикладные программы, ядро операционной системы и даже ваш мобильный телефон могут информировать вас о наступивших событиях, что позволит вам использовать ваш компьютер с максимальным удобством. В этой статье рассказывается о том, как работает D-BUS и как приложения могут использовать эту систему.
D-BUS представляет собой систему межпроцессного взаимодействия (IPC), предоставляющую простой и мощный механизм, с помощью которого приложения могут обмениваться друг с другом информацией и инициировать запросы служб. Система D-BUS была спроектирована с нуля в условиях необходимости удовлетворения запросов современных Linux-систем. Главной задачей D-BUS является замена таких систем удаленных вызовов объектов, как CORBA и DCOP, используемых в GNOME и KDE соответственно. В идеальном случае, система D-BUS может стать унифицированной и гибкой системой межпроцессного взаимодействия для обоих вышеупомянутых окружений рабочего стола, удовлетворяющей их нуждам и используемой для реализации новых возможностей.
D-BUS, как полнофункциональная система межпроцессного взаимодействия и удаленного вызова объектов, имеет ряд типичных применений. Во-первых, D-BUS может использоваться для классического межпроцессного взаимодействия, позволяющего одному процессу передать данные другому — как улучшенная реализация сокетов домена UNIX. Во-вторых, D-BUS может упростить отправку сообщений о событиях или сигналов в рамках системы, позволяя различным компонентам системы реагировать на события и в конечном итоге, улучшая интеграцию этих компонентов системы. Например, служба Bluetooth может отправить сигнал о входящем звонке, позволяя музыкальному проигрывателю приглушить звук до окончания разговора. Наконец, D-BUS позволяет производить запросы к службам и вызовы методов из других объектов — как CORBA, только без лишних сложностей.
Почему система D-BUS уникальна
Система D-BUS отлична от других систем межпроцессного взаимодействия по ряду причин. Во-первых, основной единицей межпроцессного взаимодействия в D-BUS является сообщение, а не поток данных. Таким образом, D-BUS разделяет данные взаимодействующих приложений на отдельные сообщения, состоящие из заголовков (метаданных) и полезной нагрузки (данных). Сообщений находятся в бинарном, типизированном, полностью выровненном и простом формате. Эта часть протокола унаследована из сетевых протоколов обмена данными. Этот подход резко отличается от подхода, используемого в других системах межпроцессного взаимодействия, где в подавляющем большинстве используются различные байтовые потоки, а не отдельные сообщения.
Во-вторых, в основе D-BUS лежит понятие шины. Простейшей формой взаимодействия процессов является передача данных от процесса к процессу. Тем не менее, D-BUS предоставляет системную службу, известную как служба системной шины сообщений, которая перенаправляет сообщения между процессами, работающими с конкретной шиной. Таким образом реализуется топология шины, позволяющая процессам передавать сообщения одному или нескольким приложениям одновременно. Приложения могут отправлять или ожидать приема различных событий на шине.
Последней уникальной возможностью является создание не одной, а сразу двух таких шин: шины системы и шины сессии. Шина системы является глобальной шиной, работающей на уровне системы. Все пользователи системы, имеющие соответствующие права, могут использовать эту шину, что вводит концепцию общесистемных событий. Шина сессии создается во время входа пользователя в систему и работает на уровне пользователя или сессии. Эта шина используется исключительно определенным пользователем в рамках определенной сессии как система межпроцессного взаимодействия и удаленного вызова объектов для пользовательских приложений.
Концепции D-BUS
Сообщения отправляются объектам. Адресация объектов производится при помощи путей, таких как /org/cups/printers/queue. Процессы, работающие с шинами, ассоциируются с объектами и реализуют интерфейсы этих объектов.
D-BUS поддерживает множество типов сообщений, таких как: сигналы, вызовы методов, возврат результатов вызовов методов и сообщения об ошибках. Под сигналами понимаются уведомления о наступлении определенных событий. Они являются простыми, асинхронными односторонними сообщениями. Сообщения с вызовами методов позволяют приложению отправить запрос на вызов метода удаленного объекта. Сообщения, возвращающие результат вызова методов, предоставляют значение, которое было возвращено в результате вызова метода. Сообщения об ошибках позволяют обрабатывать исключения в результате вызова методов.
В системе D-BUS используется полная типизация и возможно безопасное использование типов. И заголовок сообщения и полезные данные полностью типизированы. Поддерживаемые типы данных: байты (byte), булевые значения (Boolean), 32-битные целочисленные значения (32-bit integer), 32-битные беззнаковые целочисленные значения (32-bit unsigned integer), 64-битные целочисленные значения (64-bit integer), 64-битные беззнаковые целочисленные значения (64-bit unsigned integer), числа с плавающей точкой двойной точности (double-precision floating point) и строки(string). Специальный тип массива (array) позволяет группировать эти значения. Тип словаря (DICT) позволяет создавать пары ключ/значение.
Система D-BUS безопасна. Она реализует простой протокол, основанный на профилях SASL для аутентификации соединений приложений один-на-один. На уровне шин чтение и запись сообщений со стороны определенного интерфейса контролируется системой безопасности. Администратор может контролировать доступ любого интерфейса к шине. Служба D-BUS изначально проектировалась с учетом системы безопасности.
Почему следует использовать D-BUS
Все вышесказанное здорово звучит, но в чем же преимущества? Во-первых, концепция системной шины является нововведением. Одна шина, доступная всем компонентам системы, позволяет распространять сообщения начиная от событий ядра (смотрите раздел «Уровень событий ядра») и заканчивая высокоуровневыми приложениями в рамках системы. Linux со своими хорошо спроектированными интерфейсами и четко разделенными уровнями систем, не имел хорошей системы интеграции. Шина системы D-BUS улучшает интеграцию системных компонентов без нарушения хорошо зарекомендовавших себя правил разработки. Теперь такие события, как заполнение жесткого диска или опустошение очереди печати или даже разрядка батареи ноутбука могут сопровождаться всплывающей подсказкой в системном трее и событием, доступным заинтересованным в нем приложениям, позволяющим системе ответить и отреагировать на него соответствующим образом. Сигналы отправляются асинхронно без необходимости постоянной проверки доступности новых событий.
Уровень событий ядра
Под уровнем событий ядра понимается механизм обмена сообщениями между пространствами ядра и пользователя, реализуемый при помощи высокоскоростного netlink-сокета. Этот механизм связан с системой D-BUS и позволяет ядру генерировать сигналы D-BUS!
Уровень событий ядра связан с файловой системой sysfs, являющейся отображением внутренних объектов ядра (kobjects) и расположенной в /sysfs в современных дистрибутивах Linux. Каждая директория sysfs связана с объектом ядра (kobject), являющимся структурой ядра, предназначенной для внутреннего представления объектов; sysfs является иерархией объектов, экспортируемой из ядра в виде файловой системы.
Каждое событие уровня событий ядра моделируется таким образом, что в качестве инициатора приводится путь в файловой системе sysfs. Таким образом, события выглядят как инициированные объектами ядра. Пути из файловой системы sysfs легко приводятся к путям объектов D-BUS, связывая уровень событий ядра и систему D-BUS естественным образом. Уровень событий ядра был впервые представлен в ядре версии 2.6.10-rc1.
Во-вторых, шина сессий предоставляет механизмы межпроцессного взаимодействия и удаленного вызова процедур, предоставляя в перспективе унифицированную систему для GNOME и KDE. Целью D-BUS является создание системы с функциями CORBA, лучшей чем CORBA и системы с функциями DCOP, лучшей чем DCOP, удовлетворяя требованиям обоих проектов и в то же время, предоставляя дополнительные возможности.
К тому же, D-BUS обладает этими возможностями, оставаясь простой и эффективной системой.
Добавление поддержки D-BUS в ваши приложения
Основа системы D-BUS разработана на языке программирования C и ее API является обширным и довольно низкоуровневым. Существуют высокоуровневые API, используемые поверх этого API для различных языков программирования и компонентов, включая Glib, Python, Qt и Mono. Наряду с предоставлением API для различных языков программирования, высокоуровневые API предоставляют и поддержку функций, специфических для отдельных системных компонентов. Например, API для Glib представляют соединения D-BUS как объекты GObject и позволяют отправку сообщений для интеграции в цикл приема событий (Glib mainloop). Предпочтительным методом использования D-BUS в программе является использование высокоуровневых API для выбранного языка программирования и программного компонента для достижения удобства использования и повышения функциональности.
Давайте рассмотрим простейшие примеры использования D-BUS в ваших приложениях. Сначала рассмотрим API для языка C, затем перейдем к рассмотрению кода с использованием интерфейса Glib.
Использование API D-BUS для языка C
Этот код отправляет сигнал «Feathers» с адреса org.pirate.parrot.attr с полезной нагрузкой в виде двух полей, каждое из которых является строкой: «Shiny» и «Well Groomed». Любое приложение, работающее с системной шиной сообщений, с достаточными правами может выбрать эту службу и принять сигнал.
Интерфейс Glib
Glib (произносится как гии-либ) является базовой библиотекой GNOME. Gtk+ (API для создания графических интерфейсов приложений GNOME) и остальные компоненты GNOME используют функции Glib. Glib содержит ряд функций, повышающих удобство использования языка C, функции для поддержки кроссплатформенности, ряд функций для работы со строками и полную реализацию системы работы с объектами и типами — все это на чистом C.
В этом примере мы присоединились к шине пользователя. Этот вызов связывает соединение с циклом событий Glib, позволяя совершать операции ввода/вывода вместе с работой с сообщениями D-BUS.
В этот раз вместо отправки сигнала, давайте выполним вызов удаленного метода. Эта операция осуществляется при помощи двух функций. Первая функция вызывает удаленный метод, вторая — получает возвращенное значение.
Функция Peel принимает дин параметр в виде целого числа. Если метод возвратит значение, отличное от нуля, он корректно завершился и в переменной ret содержится значение, возвращенное этой функцией. Типы данных, которые принимает определенный метод, описываются при реализации метода. Например, мы не передавали тип DBUS_TYPE_STRING вместо типа DBUS_TYPE_INT32.
Главным преимуществом использования высокоуровневых API является интеграция в цикл приема событий, позволяющая разработчикам обрабатывать различные сообщения D-BUS вместе с операциями ввода-вывода и событиями пользовательского интерфейса. Заголовочный файл описывает ряд функций для интеграции D-BUS в цикл приема событий Glib.
Заключение
D-BUS является мощной и простой системой межпроцессного взаимодействия, которая с успехом улучшит интеграцию и расширит функциональность Linux-систем. Пользователи рано или поздно столкнутся со все большим количеством приложений, использующих D-BUS. Имея на руках эту статью, есть все основания рассматривать D-BUS не как ужасную зависимость, а как блестящую особенность системы. На интернет-ресурсах можно найти ряд примеров программ, использующих D-BUS. Разработчики со временем будут вынуждены добавлять поддержку D-BUS в свои приложения. Также существует ряд сайтов с описанием возможностей и примерами использования D-BUS. Конечно же, лучшим справочным материалом является исходный код, и, к счастью, его сейчас очень много.
Источник
Управление Linux десктопом через D-Bus
Используя D-Bus, вы можете персонализировать и автоматизировать ваш десктоп.
Каждая современная Linux среда рабочего стола использует D-Bus, систему, позволяющую программным приложениям общаться друг с другом. Благодаря D-Bus, ваш десктоп может быть настроен точно так, как вы хотите. В этой статье я привожу примеры некоторых возможностей D-Dus. Будьте готовы к модификации вашего десктопа.
D-Bus (Desktop Bus) — система межпроцессного взаимодействия (IPC system), которая позволяет приложениям в операционной системе общаться друг с другом. Создатели D-Bus построили свою систему с нуля, но находились под сильным влиянием системы DCOP (Desktop COmmunication Protocol) из среды KDE. В настоящее время D-Bus используется везде — в KDE 4 DCOP уступила D-Bus, а GNOME переходит на D-Bus вместо своей собственной системы Bonobo. Так что D-Bus стал независимым от десктопной среды механизмом межпроцессорного взаимодействия. ПО, которое использует D-Bus, незаметно интегрируется в ваш десктоп, независимо от того, какую среду вы используете. D-Bus является частью кросс-платформенного проекта freedesktop.org, главным участником которого является Red Hat.
D-Bus регистрирует каждую программу, имеющую сервисы, доступные для других приложений. Таким образом, эти приложения видят, какие сервисы доступны. Также, программы могут становиться доступными для событий системных сервисов (например, определять горячую замену железа).
D-Bus не разрешает прямую коммуникацию между процессами, а работает через шину. Системная шина обеспечивает маршрутизацию сообщений между процессами через себя, таким образом, процессы могут взаимодействовать с несколькими приложениями одновременно. Каждое приложение может посылать сообщения на шину или реагировать на события, получаемые через шину.
Обычно, D-Bus создает две шины: привилегированную системную шину и сессионную шину. Системная шина позволяет осуществлять широковещательное взаимодействие между процессами, имеющими необходимые права доступа. Ее главное назначение — доставка событий от HAL (Hardware Abstraction Layer) к процессам, работающим с аппаратными событиями. Таким аппаратным событием может быть обнаружение нового аппаратного устройства, или изменение в очереди печати. Вторая шина — сессионная, создается во время авторизации, и с ее помощью будут общаться приложения, с которыми работает пользователь.
Работа с D-Bus
Каждое приложение, работающее с D-Bus, располагает какими-то объектами, которые в основном мапируются на внутренние объекты GObject, C++ или Python. Одно приложение может послать сообщение определенному объекту из другого приложения. К каждому D-Bus объекту мы обращаемся через уникальное имя, которое выглядит как путь файловой системы. Для обеспечения уникальности имен, каждое имя D-Bus объекта обычно имеет префикс, специфичный для разработчика, например /org/kde или /com/redhat . В языке программирования Java для этих целей используются имена пакетов (например, org.sun ). D-Bus путь состоит из трех частей: имя сервиса, путь к объекту и интерфейс (я приведу примеры чуть позже в этой статье).
Итак, как же можно использовать D-Bus в своем собственном приложении? Основной API написан на С довольно низкого уровня. Он не задумывался для использования программистами приложений. Различные языки программирования и среды разработки, такие как GLib, Qt, Python, Ruby, Perl и Mono имеют надстроенные над этим API связующие слои. Я не буду углубляться в С или GLib (основаная библиотека в GNOME), но я приведу несколько примеров, написанных на скриптовых языках Python и Ruby, а так же примеры скриптов командной оболочки.
Какие приложения используют D-Bus?
На сайте проекта reedesktop.org имеется неполный список приложений, использующих D-Bus, и имена на шине для каждого приложения. Кстати, вы сами можете найти имена на шине D-Bus, используя некоторые интересные инструменты. Например, Qt имеет графический D-Bus браузер — qdbusviewer (Рисунок 1). В Ubuntu вы можете найти это приложение в пакете qt4-dev-tools . Несмотря на то, что оно является частью KDE, это приложение прекрасно работает и в других средах, включая GNOME.
Рисунок 1. QDBusViewer работающий в GNOME
Работая в qdbusviewer, вы видите две вкладки: Сессионная Шина и Системная Шина. В каждой вкладке левая панель показывает список имен сервисов. Если нажать на имя сервиса, то в правой панели появится информация о сервисе, список доступных методов и сигналов. Например, если вы нажмете на сервисе org.freedesktop.PowerManagement , и далее перейдете в правой панели вниз по иерархии — org/freedesktop/PowerManagement/ , то вы пройдете две части пути D-Bus: org.freedesktop.PowerManagement в левой панели является именем сервиса, а org/freedesktop/PowerManagement в правой панели является путем до объекта.
Путь до объекта в правой панели имеет еще одну последнюю часть — три так называемых интерфейса: org.freedesktop.DBus.Introspectable , org.freedesktop.DBus.Properties и org.freedesktop.PowerManagement . Каждый интерфейс реализует какие-то методы и сигналы. Это то, с чем вы можете взаимодействовать. Здесь мы заинтересованы в интерфейсе org.freedesktop.PowerManagement , он реализует действия связанные с управлением питанием. Нажав на него, мы видим список из всех доступных методов и сигналов. Если мы нажмем на метод Suspend, то компьютер заснет, и проснется только после нажатия кнопки питания.
Некоторые методы, такие как Shutdown, Reboot, Hibernate и Suspend, осуществляют действия, а другие методы выдают вам информацию о системе. Например, объект org.freedesktop.PowerManagement реализует такие методы как GetLowBattery, GetOnBattery, CanShutdown, и т.д. Если ваша система (лэптоп) работает от батареи, имеющей достаточный заряд, то нажимая на GetOnBattery, мы получаем «Arguments: true», а при нажатии на GetLowBattery, ответ — «Arguments: false».
Стоит упомянуть, что qdbusviewer показывает только имена сервисов, зарегистрированных на текущий момент. Например, если Pidgin не запущен, то программа просмотра не будет его отображать. Имейте это ввиду, исследуя D-Bus сервисы, доступные в вашей системе.
Если вы являетесь поклонником командной строки, то вам не нужно запускать qdbusviewer. Приложение qdbus, работающее из командной строки, предоставляет точно такую же информацию. Если вы запустите qdbus в терминале, то увидите список сервисов, доступных на сессионной шине. Если вы запустите его с флагом —system, то увидите сервисы, доступные системной шине. Если вы хотите узнать, какие объекты содержит сервис, запустите, например, следующую команду:
Для того что бы узнать, какие интерфейсы реализованы в объекте /org/freedesktop/PowerManagement , используйте:
Мы получим тот же самый список из методов и интерфейсов, что мы видели в qdbusviewer. Например, строку:
method bool org.freedesktop.PowerManagement.GetOnBattery()
bool означает, что этот метод возвращает булеву величину, со значением true или false. Если метод не возвращает величину, например org.freedesktop.PowerManagement.Suspend() , то вместо bool используется void.
Также qdbus позволяет нам вызывать эти методы напрямую. Например, если мы хотим вызвать метод Suspend, выполняем:
Работаем с D-Bus из командной строки
В оставшейся части статьи мы рассмотрим D-Bus функциональность некоторых популярных приложений, а также напишем скрипты для взаимодействия с этими приложениями и автоматизации ряда задач. Надеюсь, это вдохновит вас на взаимодействие с вашими собственными любимыми приложениями. Я буду использовать разные D-Bus инструменты и скриптовые языки для демонстрации различных способов работы с D-Bus.
Я уже упомянул первый способ работы с D-Bus: использование KDE программ qdbusviewer и qdbus. Если вы не работаете в KDE, то можете использовать программы командной строки dbus-send и dbus-monitor, для отсылки и мониторинга D-Bus сообщений, соответственно. Например, вы можете отправить систему в спящий режим, следующей командой:
Как мы видим, dbus-send вызовы практически идентичны вызовам qdbus. Единственное различие — это необходимость использовать —dest параметр для имени сервиса. Теперь давайте взглянем на что-нибудь новенькое. Если вы смотрите в своем браузере длинное видео на YouTube, то может активизироваться скринсейвер, так как Flash плагин не взаимодействует с остальной системой. С помощью D-Bus мы можем остановить это раздражающее поведение. Вот и волшебная команда:
С помощью этой команды мы вызываем Inhibit метод интерфейса org.gnome.ScreenSaver , с двумя аргументами. Первый аргумент — это имя приложения. Здесь я использую “YouTube”, но это может быть любое имя. Второй аргумент — это причина — остановка скринсейвера. dbus-send ожидает, что каждому аргументу будет предшествовать его тип (string, boolean, int16 и т.д.). В этом примере оба аргумента имеют строковой тип. Также я использую аргумент —print-reply потому, что мне нужно ответить на команду: Inhibit метод возвращает uint32 число, которое работает как куки, идентифицируюя запрос на остановку скринсейвера. Если мы хотим вновь запустить скринсейвер, то мы должны переслать этот куки в качестве аргумента:
С помощью этих двух команд, мы можем создать свой собственный скрипт командной оболочки для скринсейвера. Примечание: во время запуска первой команды вы должны сохранить куки в переменную или в файл, а затем заменить значение куки в команде, что выше.
Если вы отлаживаете D-Bus скрипт или наблюдаете за методами и сигналами других D-Bus приложений, то программа командной строки dbus-monitor очень вам в этом поможет. Просто запустите ее через терминал, и вы увидите всю D-Bus активность. dbus-monitor полезен для просмотра D-Bus активности в реальном времени. Если с вашей системой что-то происходит, например пропадает сеть, то на выходе dbus-monitor вы можете видеть как это сообщение поступает на шину D-Bus. Таким образом вы можете узнать какие сигналы или методы должны использоваться для работы с тем или иным событием.
dbus-monitor так же позволяет вам указать ряд выражений, определяющих за чем вы хотите наблюдать, например:
С помощью этого вы сможете наблюдать за всеми NetworkManager событиями . Я использовал аргумент —system потому, что NetworkManager использует системную шину.
Пишем скрипт для чтения Liferea ленты
Liferea лента имеет маленький, но интересный набор методов для работы с D-Bus. Наиболее интересный метод — это Subscribe, который позволяет вам добавить к Liferea поток из другого приложения. Одно из приложений, пользующиеся этим — FeedBag, расширение для Firefox, которое изменяет кнопку потока в адресной строке браузера: если вы нажимаете на кнопку, то подписка добавляется к Liferea, а не к Live Bookmarks. Работает FeedBag через вызов метода FeedBag org.gnome.feed.Reader.Subscribe . Тоже самое вы можете сделать и из терминала:
Liferea предоставляет скрипт, который делает точно тоже самое, но еще умеет обрабатывать ошибки.
Также, через D-Bus Liferea предоставляет некоторую информацию, которая может оказаться полезной если вы используете альтернативный оконный менеджер, не имеющий области уведомления для Liferea. Вы можете сами сварганить вашу собственную систему оповещения — просто запросите число новых и непрочитанных записей в Liferea и покажите выходные данные:
Без клавиатуры
Если вы хотите выполнить более сложные задания, чем вызов отдельных методов, то вы можете написать скрипт командной оболочки, содержащий dbus-send команды, или используйте язык более высокого уровня, для упрощения задачи. Существуют D-Bus привязки для Python, Ruby и Java языков.
В следующем примере, я реализую скрипт на Python, который меняет ваш статус в Pidgin на “Away from keyboard”, при активизации скринсейвера. Здесь имеются два аспекта D-Bus: скрипт ждет сигнала от скринсейвера, и затем он вызывает метод в Pidgin. Скрипт показан в листинге 1.
Листинг 1. pidgin_screensaver.py
Давайте разберем этот скрипт. Функция pidgin_status_func устанавливает ваш статус в Pidgin. Она получает объект im/pidgin/purple/PurpleObject и интерфейс im.pidgin.purple.PurpleInterface из сессионной шины. Далее, вызывается метод интерфейса. Он создает новый “saved status” тип, после проверки существования типа статус с именем “afk” (“afk” означает “Away From Keyboard”, и 5 — это вид “away” статуса).
Далее функция проверяет переменную state, которая является аргументом функции pidgin_status_func (я объясню, что означает этот аргумент далее). Если аргумент правдив, то сообщению нового статуса “afk” присваивается значение “Away from keyboard”, и статус активируется. В результате Pidgin показывает ваш статус как “afk», с сообщением “Away from keyboard”.
Теперь мы должны вызвать эту функцию вместе с активизацией скринсейвера. Поэтому, запускаем dbus.mainloop и соединяемся к сессионной шине. Далее добавляем приемник сигнала, который слушает сигнал ActiveChanged от интерфейса org.gnome.ScreenSaver . Если/когда сигнал срабатывает, он вызывает функцию pidgin_status_func . Так как сигнал ActiveChanged имеет булев аргумент, обозначающий текущее состояние заставки (1 — активная, 0 — не активная), то мы используем только один аргумент (state) в функции pidgin_status_func . Для постоянного прослушивания запускаем бесконечный цикл, работающий пока работает скрипт.
Pidgin имеет очень обширный D-Bus интерфейс; вы можете делать с помощью него практически все. Пусть этот пример послужит вам вдохновением для создания каких-нибудь креативных задач в Pidgin!
Проигрывание с помощью D-Bus
Давайте посмотрим на другой пример, на этот раз на Ruby. Мы создадим скрипт, который будет показывать текущую песню, играющую в Rhythmbox, вместо вашего статуса в Pidgin (Листинг 2).
Листинг 2. pidgin_rhythmbox.rb
Здесь мы видим команды такого же типа, как и в скрипте на Python: начинаем D-Bus сессию, определяем D-Bus сервис, объекты и интерфейс, и определяем приемник сигнала. Цикл постоянно работает для прослушивания D-Bus сигнала.
Конечно, все это можно немного привести в порядок. Например, на данный момент, в качестве статусного сообщения мы показываем только путь к файлу песни. Я предоставляю вам возможность самим заменить путь к файлу на соответствующий ID3 тег.
Заключение
Теперь, когда вы знаете как выполнять D-Bus запросы и как обрабатывать D-Bus сигналы, вы можете заняться автоматизированием заданий на вашем десктопе. Если вы опытный Linux пользователь, то D-Bus точно должен быть в вашем арсенале.
D-Bus содержит намного больше, чем я могу вам показать в этой статье, но с помощью qdbusviewer, qdbus, dbus-send и dbus-monitor, вы сможете освоить остальные возможности сами. Если вы хотите реализовать более сложные задачи по автоматизации, используя D-Bus, то хорошими помощниками вам могут стать языки Python и Ruby. Рассмотрите учебные пособия, упомянутые в приложении, и далее просто дайте волю своей фантазии.
Если вы разработчик программного обеспечения, то раздел, который мы не рассмотрели здесь, — это регистрация сервиса. Эта другая сторона рассказа о D-Bus. Если вы регистрируете сервис, то с помощью D-Bus вы можете предоставлять объекты для других приложений.
Приложение
Koen Vervloesem — с 2000-х — журналист-фрилансер, пишущий на тему бесплатного программного обеспечения и программного обеспечения с открытым кодом. Он является магистром компьютерных наук и философии, и не может решить, какая из сфер для него более интересна. Пока что он любит думать — «Я программирую, следовательно я существую».
Источник