dbus-broker - D-Bus メッセージ・ブローカーである。(D-Bus メッセージを仲介するアプリケーションである。)
dbus-broker [ OPTIONS ] dbus-broker --version dbus-broker --help
dbus-broker は、D-Bus メッセージ・バス仕様[1]の実装の1つである。各インスタンスは単一の、独立した(unique)メッセージ・バスを提供し、クライアントはこれに接続したり、これを通じてメッセージを送信したりすることができる。このブローカーは、D-Bus 仕様に基いて、メッセージの中継処理、アクセス制御、(シグナル等の)購読処理(subscription)、及びバスの制御を行う。
dbus-broker は「純粋な」(pure)実装であり、メッセージの中継処理しか実装していない。dbus-broker は自身を制御するプロセスを必要としており、このプロセスがバスの設定と全ての外部通信を実行する。dbus-broker-launch(1) は、そのようなコントローラーの1つであり、D-Bus の参考実装である dbus-daemon(1) との完全な互換性を持つよう狙って開発されている。メッセージ・バスを起動する方法については dbus-broker-launch(1) を見よ。
このマニュアル・ページは、dbus-broker とそのコントローラー(例えば dbus-broker-launch(1))との間のインターフェイスについても記述している。
以下のコマンド・ライン・オプションを使用することができる。ここに挙げられていないオプションを渡した場合、このブローカーは起動を拒否し、エラーで終了する。
dbus-broker の全てのインスタンスは、unix(7) ソケット1つを自身の親プロセスから引き継ぐ。このソケットはオプション --controller を使って必ず指定しなければならない。ブローカーはこのソケットを使って自身の親プロセス(あるいはこのソケットの反対側を所有する者、即ち「コントローラー」(The Controller))から制御コマンドを受け取る。このソケットは通常の D-Bus P2P 通信を用いる。このソケットで提供されるインターフェイスについては API の節で述べる。
初期状態では、ブローカーのインスタンスはアイドル状態である。別の言い方をすると、ブローカーを fork して exec した直後は、ブローカーの「管理すべきバス・ソケット」のリストは空であり、クライアントがブローカーに接続する術は無いということである。コントローラーは、コントローラー・インターフェイスを使って、待ち受けソケット(listener socket)を作成し、バス・ポリシーを指定し、アクティベート可能な名前を作成し、バス・イベントに対応しなければならない。
dbus-broker プロセスは、コマンド・ラインもしくはコントローラー・インターフェイスを通じて渡されたものを除き、外部の資源には一切アクセスしない。すなわち、このブローカーは、ファイル・システムへのアクセス、nss(5) の呼び出し、外部プロセスとの通信を一切行わない。それどころか、このブローカーは、コントローラーから渡されたソケット以外には、いかなる資源にもアクセスしない。これは実装によって保証されていることである。これは同時に、外部資源の獲得や外部通信が必要な場合、コントローラーがブローカーのためにそれらを全て実行する必要があるということをも意味する。
コマンド・ライン・オプション「--log」を使ってログ収集用の FD (ファイル記述子)を指定した場合、ブローカーはこの FD を通じて情報を記録することになる。利用できるログは2種類存在する。
ブローカーには、データを記録する際の厳格な決まりがある。ブローカーは、起動時と終了時に1つづつ、自身の設定と環境に関する情報の入ったメッセージを記録する。実行中には、ブローカーは予期せぬ状況が起きた場合にしかログを取らない。すなわち、ブローカーが実行時にログを取ったメッセージは全て、不具合のあるクライアントが引き起こしたものである。システムが適切に設定されていれば、実行時のログ・メッセージは一切発生しない。
ブローカーがログを取るのは次の場合である。
ブローカーは、以下に挙げる各ノードにおいて、それぞれ下記のインターフェイスを実装する。コントローラーはいつでもこれらのインターフェイスを呼び出すことができる。コントローラーの接続は信頼できるものと見做される。資源の勘定やアクセス制御は行わない。
コントローラー自身も、ブローカーが使用するインターフェイスを実装する必要がある。コントローラー側のインターフェイスの一覧は後の節で述べる。
#このバスに待ち受けソケット(listener socket)を1つ追加する。
#この待ち受けソケットはすでに待ち受けモード(listening mode)になっていなければならず、@socket で指定しなければならない。
#この呼び出しが返ると直ちに、このソケットにて、届いたクライアントの接続要求に対する処理が始まる。
#このリスナーは、コントローラーが @path で公開する。
#この経路(@path)は「/org/bus1/DBus/Listener/%」という型に合うものでなければならない。
#このソケットを通じて接続するクライント全てに対するポリシーは @policy で指定する。
#詳細は org.bus1.DBus.Listener.SetPolicy() を見よ。
#このシグナルは、org.freedesktop.DBus.UpdateActivationEnvironment() メソッドの実行を求めるクライアント・リクエストによって引き起こされる。
#このリスナー(待ち受けソケット)を解放する。
#このリスナーはブローカーによって直ちに削除され、以後、このリスナーで接続を受け付けることはなくなる。
#このリスナーを通して接続しているクライアントは全て強制的に接続を切断される。
#この待ち受けソケットに対するポリシーを @policy に変更する。
#ポリシーの構文は、今はまだ変更される可能性があるものであり、不安定である。
#この「アクティベート可能な名前」を解放する。
#この名前は、このメソッドの直接の効果としてブローカーによって直ちに削除される。
#クライントは依然としてこの名前を有効に獲得することができるけれども、この名前ではアクティベーション機能は利用できなくなる。
#この名前の「アクティベーションの状態」をリセットする。
#未処理のアクティベーション・リクエストは取り消される。
#このメソッドの呼び出しの際には続き番号を渡す必要がある。
#この続き番号は、この名前に関する最後のアクティベーション・イベントで受信したものでなければならない。
#別の続き番号を用いた呼び出しは、何も通知せずに無視され、無効なものと見做される。
#org.bus1.DBus.Name.Error の文字列も指定する。
#この文字列は、アクティベーションがリセットされた理由に関するヒントを表す。
#エラーの文字列の一覧は以下に記載する。
#アクティベーションのリクエストが失敗した。このエラーと同時に起きる非アクティベーションのリクエストがすでに進行中である。
#アクティベーションのリクエストが失敗した。不明なユニットである。
#アクティベーションのリクエストに失敗した。ユニットがマスクされている。(訳註:〜.service という経路が /dev/null へのシンボリックリンクになっている状態。)
#アクティベーションのリクエストに失敗した。ユニットが不正(invalid)である。
#ユニットのアクティベーション・ジョブは成功したが、その後で同ユニットが蹉跌した。
#起動ジョブの形式は有効(valid)であったが、同ジョブはアクティベーションの途中で蹉跌した。
#起動ジョブの形式は有効(valid)であったが、同ジョブはアクティベーションの途中でスキップ(skip)された。
#アクティベーションのリクエストが取り消され、バス名は解放された。
#このシグナルは、クライアントがこの名前のアクティベーションを要求する度に送信される。
#重複するアクティベーション・リクエストは、ブローカーによって1つに纏められる。
#コントローラーは、Reset() メソッドを使って未処理のリクエストを取り消すことができる。
#ブローカーは、このイベントと一緒に続き番号を送信する。
#この続き番号は、アクティベーション・リクエストを表しており、Reset() のようなメソッドで同アクティベーション・リクエストに対処する際に使用しなければならないものである。
#この続き番号は、全てのイベントで異なっており(unique)、再利用されることはない。
#続き番号 0 は、決して送信されず、不正な値(invalid)と見做される。
コントローラー自身も、以下に挙げるノードにおいて、下記のインターフェイスを実装する必要がある。このインターフェイスは、D-Bus 仕様で定義されているドライバ・インターフェイスの一部を実装するために、ブローカーによって呼び出される。
ブローカーが実行する全てのメソッド・コールは常にまるまる非同期であることに注意。すなわち、どれだけリクエストの処理に時間が掛かっても、ブローカーは依然として問題なく動作している状態であり、同者はさらなるリクエストをコントローラーへ送信することすら可能であるということである。
コントローラーは、このようなメソッド・コールをブロッキング(blocking)する形で実装してもよい。しかしながら、(どのような手段によるにせよ)ブロッキングを伴い且つブローカーへと戻っていくような再帰的な呼び出しを実行しないようにするのは、コントローラーの責任である。
#この関数は、org.freedesktop.DBus.ReloadConfig() メソッドの実行を求めるクライアント・リクエストの1つ1つに対して呼び出される。
dbus-broker-launch(1) dbus-daemon(1)
Package information:
#ユーザ ID が @uid のユーザで、アクティベート可能な名前 @name を新たに作成する。
#この名前をコントローラーは @path で公開することになる。
#この経路(@path)は「/org/bus1/DBus/Name/%」という型に合うものでなければならない。