18.11.2014 Views

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Команда «qdbus org.kde.yakuake»<br />

несколько сервисов на шине, которыми она будет владеть,<br />

пока не освободит их. До момента освобождения ни одно<br />

другое приложение не сможет занять уже занятый сервис.<br />

Сервисы именуются аналогично интерфейсам.<br />

С помощью сервисов можно реализовать автоматический<br />

запуск необходимых приложений при поступлении<br />

сообщений. Для этого нужно включить автоактивацию и в<br />

настройках D-Bus сопоставить с сервисом определенное<br />

приложение, тогда D-Bus запустит приложение при поступлении<br />

сообщения на тот или иной сервис. При завершении<br />

программы освобождаются все зарегистрированные при ее<br />

запуске сервисы.<br />

В D-Bus у каждого объекта свое уникальное имя. Имя объекта<br />

напоминает путь в файловой системе, например, org/kde/<br />

kspread/sheets/1/cells/1/1. Обычно путь имеет какую-нибудь<br />

смысловую нагрузку. Например, в данном случае мы обращаемся<br />

к ячейке 1:1 на первом листе электронной книги<br />

KSpread. Но имена могут быть совершенно бессмысленными,<br />

например, /com/appl1/c5444sf956a. Тут все зависит от<br />

фантазии разработчиков.<br />

На этом скучная часть статьи закончилась, и можно приступать<br />

к практике.<br />

D-BUS И СКРИНСЕЙВЕРЫ<br />

Начнем с самых простых трюков, связанных с D-Bus и<br />

скринсейверами. Заблокировать экран можно следующей<br />

командой:<br />

$ qdbus org.kde.krunner /ScreenSaver Lock<br />

Иногда напрягает, что хранитель экрана вообще запускается.<br />

Ну не нужен он мне. Конечно, в настройках KDE его<br />

можно отключить, но раз сегодня мы говорим о D-Bus, то<br />

тебе пригодится следующая команда:<br />

$ qdbus org.kde.krunner /ScreenSaver \<br />

SimulateUserActivity<br />

Кстати, в некоторых случаях X-сервер может потушить<br />

экран. Чтобы обойти эту «фичу», нужно ввести команду:<br />

$ xset dpms 0 0 0<br />

Первый 0 — это время в секундах до гашения монитора без<br />

его выключения, второй 0 — это время до перехода в режим<br />

ожидания, а третий — время до выключения монитора.<br />

Вообще, вместо команды xset можно править xorg.conf, но<br />

учитывая, что в современных дистрибутивах он отсутствует,<br />

лучше все-таки использовать команду xset.<br />

Вернемся к методу SimulateUserActivity. Метод, как следует<br />

из его названия, имитирует активность пользователя. Его<br />

нужно вызывать периодически. Но не будешь же ты вводить<br />

приведенную выше команду, скажем, каждые 30 секунд?<br />

Тогда можно набросать небольшой сценарий:<br />

#!/bin/bash<br />

$* &<br />

while jobs | grep -q Running<br />

do<br />

qdbus org.kde.krunner /ScreenSaver \<br />

SimulateUserActivity<br />

sleep 30<br />

done<br />

Сценарию нужно передать командную строку. Да, именно<br />

командную строку, тогда скрипт запустит приложение и<br />

будет имитировать активность пользователя. Сохрани<br />

сценарий как /usr/bin/simulate. После этого установи права<br />

доступа и запускай:<br />

$ sudo chmod +x /usr/bin/simulate<br />

$ simulate mplayer film.avi<br />

Действительно, у MPlayer есть параметр '-stopxscreensaver',<br />

но у других проигрывателей подобного<br />

параметра может и не оказаться.<br />

ТРЮКИ С БУФЕРОМ ОБМЕНА<br />

В Windows я использовал довольно неплохой менеджер<br />

закачек — FlashGet. Он активировался, как только в буфере<br />

обмена появлялась ссылка. Всплывало окно, где нужно<br />

было либо подтвердить закачку, либо отказаться от нее.<br />

Сейчас мы попробуем реализовать подобный мониторинг<br />

буфера обмена в Linux с помощью D-Bus. Следующая<br />

команда выводит содержимое клипборда:<br />

$ qdbus org.kde.klipper /klipper \<br />

getClipboardContents<br />

Теперь напишем простенький сценарий, выводящий содержимое<br />

буфера обмена, если в нем есть URL (для простоты<br />

мы будем учитывать только http://):<br />

#!/bin/bash<br />

while true<br />

do<br />

if qdbus org.kde.klipper /klipper<br />

getClipboardContents | egrep -q '^(http://)'<br />

then<br />

qdbus org.kde.klipper /klipper<br />

getClipboardContents<br />

fi<br />

sleep 1<br />

done<br />

Скрипт не делает ничего сверхъестественного. Сначала запускается<br />

бесконечный цикл (прервать выполнение можно<br />

либо нажатием , либо закрытием окна терминала),<br />

затем анализируется содержимое буфера обмена. Если оно<br />

содержит URL (строку, начинающуюся с http://), то сценарий<br />

просто выводит содержимое клипборда, а затем засыпает на<br />

секунду. Чтобы сценарий закачивал файл, нужно модифицировать<br />

его так:<br />

…<br />

then<br />

in='qdbus org.kde.klipper /klipper \<br />

getClipboardContents'<br />

INFO<br />

info<br />

• D-Bus<br />

интегрируется во<br />

многие рабочие<br />

среды и доступна<br />

для GLib, GCJ (Java),<br />

Mono, Qt и Python.<br />

• KDE4 полностью<br />

переведен на D-Bus.<br />

• Когда приложение<br />

подключается<br />

к шине, оно<br />

должно указать,<br />

какие сообщения<br />

желает получать.<br />

Приложение будет<br />

получать только<br />

те сообщения,<br />

которые ему<br />

нужно, а проблему<br />

фильтрации D-Bus<br />

берет на себя.<br />

WARNING<br />

warning<br />

• Если возникла<br />

ошибка «dbus: UUID<br />

file ‘/var/lib/dbus/<br />

machine-id’ contains<br />

invalid hex data»,<br />

исправить ситуацию<br />

поможет команда:<br />

$ dbus-uuidgen ><br />

/var/lib/dbus/<br />

machine-id<br />

HTTP://WWW<br />

links<br />

• www.freedesktop.<br />

org — сайт D-Bus<br />

• dbus.freedesktop.<br />

org/doc/dbus-tutorial.<br />

html — руководство<br />

по D-Bus<br />

• xmms2.org/wiki/<br />

MPRIS#D-Bus —<br />

XMMS-2 и D-Bus<br />

• dkws.org.ua — сайт<br />

автора<br />

XÀÊÅÐ 09 /140/ 10 097

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!