DBusを使用したシステムイベントのスクリプト処理

Dbusはプロセス間通信ツールです。 言い換えれば、あるプログラムが別のプログラムに「注文を与える」ことを可能にするツール。

DBusを使用してコマンドラインからさまざまなプログラムを管理する方法をネット上で簡単に見つけることができます。 しかし、他のプログラムからの信号を追跡する方法のトピックはほとんど公開されていません。 この記事では、この不正を修正し、Dbus経由でシステムから受信したイベントを処理する例を分析します。



Dbusのプログラミング言語へのバインドに加えて、コマンドラインから使用できるコンソールプログラムがいくつかあります。



また、DBusを使用する場合、qdbusviewerプログラムは興味深いものです。これは、DBusをサポートするシステム内の既存のプログラムを学習できるグラフィカルアプリケーションです。



そして、約束の例。



タスク:インターネットへの接続を確立するときに、Yandex.Diskクライアントを起動するスクリプトを作成します。

qdbusviewerを起動し、ネットワークステータスの変化を報告できるサービスを探します。 [システムバス]タブに、サービスorg.freedesktop.NetworkManagerが表示されます。 このサービスでパス/ org / freedesktop / NetworkManagerをたどると、org.freedesktop.NetworkManagerインターフェースを実装するオブジェクトが見つかります。 このインターフェイスにはStateChanged信号があります。 チェック:信号を右クリックして、[接続]を選択します。 ネットワークインターフェイスを切断し、接続すると、ネットワークの状態を報告する着信信号が表示されます。 必要なもの。

これで、コマンドラインで同じ結果が得られます。 dbus-monitorコマンドを使用します。 コマンドラインで入力します。

dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged"
      
      





ここで、オプション--systemは、システムバスをリッスンする命令です。 引用符は、対象の信号のフィルターを示しています。 サービスorg.freedesktop.NetworkManager、path / org / freedesktop / NetworkManagerおよびStateChangedのシグナル。

ネットワークインターフェイスを切断、接続します。 ネットワークステータスを変更するプロセスでは、コンソールにすべての新しい行が表示されます。

 signal sender=org.freedesktop.DBus -> dest=:1.540 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired string ":1.540" signal sender=:1.2 -> dest=(null destination) serial=1870 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 20 signal sender=:1.2 -> dest=(null destination) serial=1883 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 40 signal sender=:1.2 -> dest=(null destination) serial=1899 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 70
      
      





各受信信号に対して、2行が出力されます。 1つ目はシグナルの説明、2つ目は引数の値です。 ところで、信号にもっと引数がある場合、より多くの行があります。

実験的に決定された、接続されたネットワークのステータスは70の値に対応します。

厳密に言えば、 NM_STATEドキュメントの定数値を見る必要があります(リンクについてはavalakに感謝します



次に、受信した信号を処理し、YandexDisk起動コマンドを作成する必要があります。 コマンドラインで入力します。

 dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged" | sed -u -n 's/ uint32 70/yandex-disk start/p'
      
      





前のコマンドラインを追加しました| sed -u -n 's / uint32 70 / yandex-disk start / p' ここでは、sedプログラムを使用してdbus-monitorから受信した各行を処理します。 -uオプションは、バッファを遅延させることなく、結果をすぐに出力するようにsedに指示します。 -nオプションは、明示的なコマンドがあるまで何も表示しません。 単一引用符で囲まれたコマンドは、sedプログラムに対して示されます。文字列内のフレーズ「uint32 70」をフレーズ「yandex-disk start」に置き換えて、結果を表示します。 このようなコマンドはテキストを変換します

 signal sender=org.freedesktop.DBus -> dest=:1.540 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired string ":1.540" signal sender=:1.2 -> dest=(null destination) serial=1870 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 20 signal sender=:1.2 -> dest=(null destination) serial=1883 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 40 signal sender=:1.2 -> dest=(null destination) serial=1899 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 70 signal sender=:1.2 -> dest=(null destination) serial=1870 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 20 signal sender=:1.2 -> dest=(null destination) serial=1883 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 40 signal sender=:1.2 -> dest=(null destination) serial=1899 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged uint32 70
      
      







 yandex-disk start yandex-disk start
      
      





つまり、ネットワークへの各接続で、yandex-disk startコマンドが生成されます。



最後に、最終バージョン:

 dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged" | sed -u -n 's/ uint32 70/yandex-disk start/p' | sh
      
      





生成されたYandex.Diskコマンドを実行のために送信します。



ファイルに保存

 #!/bin/bash dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged" | sed -u -n 's/ uint32 70/yandex-disk start/p' | sh
      
      





ファイルを実行可能にします。 そして、自動実行に追加します。 これで、インターネットに接続すると、Yandex.Diskクライアントが自動的に起動します。



同様に、DBusをサポートするアプリケーションの信号を処理できます。



この記事では、DBusを使用してさまざまなアプリケーションからの信号の処理を自動化する可能性を検討しました。 コンソールで信号を監視するには、dbus-monitorプログラムを使用します。 このプログラムを使用すると、すべてのサービスのすべての信号としてキャッチし、興味のあるものだけを除外できます。

いくつかの例:



dbus-monitorは、受信信号ごとに複数の行を表示します。 信号の最初の説明、引き数の後続の値。

次に、受信した信号を処理します。



All Articles