web-dev-qa-db-ja.com

非root systemdサービスがBLE操作にdbusを使用できるようにする方法

私は、小さなラズベリーのようなボード上でrootとして実行されているBLE周辺機器のプロトタイプを作成しています。今、私は物事を強化し、BLEアプリを非rootユーザーに分割しています。そのため、アプリのsystemdサービスファイルを次のように変更しました。

[Unit]
Description=BLE Peripheral

[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /opt/myPeripheral/bleMainloop
WorkingDirectory=/opt/myPeripheral
StandardOutput=journal
Restart=on-failure
User=blePeripheral

[Install]
WantedBy=multi-user.target 

Userフィールドを追加してblePeripheralユーザーとして実行すると、次の理由で起動に失敗します。

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 2 matched rules; type="method_call", sender=":1.6797" (uid=107 pid=17300 comm="/usr/bin/python3 -u /opt/pilot/bleMainloop ") interface="org.freedesktop.DBus.ObjectManager" member="GetManagedObjects" error name="(unset)" requested_reply="0" destination=":1.2" (uid=0 pid=1373 comm="/usr/lib/bluetooth/bluetoothd -d -E --noplugin=* “)

I think必要なのは、このroot以外のユーザーに対してdbusの特定の使用を許可することです。 bluetooth.conf/etc/dbus-1/system.d。このファイルで何かを調整して、アプリがBLE DBusサービスを引き続き使用できるようにする必要がありますか?

8
Travis Griggs

/etc/dbus-1/system.d/bluetooth.conf、これを追加してみてください:

<policy user="blePeripheral">
  <allow own="org.bluez"/>
  <allow send_destination="org.bluez"/>
  <allow send_interface="org.bluez.GattCharacteristic1"/>
  <allow send_interface="org.bluez.GattDescriptor1"/>
  <allow send_interface="org.freedesktop.DBus.ObjectManager"/>
  <allow send_interface="org.freedesktop.DBus.Properties"/>
</policy>

次に、dbusサービスを再起動します。

systemctl restart dbus
7
Mark Stosberg

技術的には@Markの回答が、dbus bluetooth構成ファイルを調整して希望するものを実現する方法についての質問に答えましたが、投稿する前にそのファイルを確認した後、気付いたことがありました。 bluetoothグループはバスにアクセスできます。したがって、私にとってより簡単な(多分正しいですか?)ことは、ルート以外のユーザーをBluetoothグループに追加することでした。これは、物事がうまく機能することも可能にします。

7
Travis Griggs