So erlauben Sie einem Nicht-Root-Systemdienst, dbus für den BLE-Betrieb zu verwenden

8

Ich habe ein BLE-Peripheriegerät als Root für ein kleines himbeerähnliches Board entwickelt. Jetzt verhärtet ich die Dinge und partitioniere die BLE-App auf einen Nicht-Root-Benutzer. Daher habe ich meine systemd-Servicedatei so geändert, dass die App wie folgt aussieht:

[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 

Nachdem das UserFeld hinzugefügt wurde , das als blePeripheralBenutzer ausgeführt werden soll, kann es jetzt nicht gestartet werden, weil:

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=* “)

Ich denke, was ich tun muss, ist irgendwie bestimmte Verwendungen dbusfür diesen Nicht-Root-Benutzer zuzulassen . Ich sehe, dass es ein bluetooth.confIn gibt /etc/dbus-1/system.d. Muss ich etwas in dieser Datei optimieren, damit meine App die BLE DBus-Dienste weiterhin nutzen kann?

Travis Griggs
quelle

Antworten:

7

In /etc/dbus-1/system.d/bluetooth.conf, versuchen Sie dies und fügte hinzu:

<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>

Starten Sie dann den dbus-Dienst neu:

systemctl restart dbus
Mark Stosberg
quelle
7

Während die Antwort von @ Mark technisch die Frage beantwortete, wie die dbus-Bluetooth-Konfigurationsdatei so eingestellt werden kann, dass sie das erreicht, was ich will, bemerkte ich, nachdem ich in dieser Datei etwas gesehen hatte, von dem ich wünschte, ich hätte es vor dem Posten bemerkt. Die bluetoothGruppe erhält Zugang zum Bus. Das Einfachere (vielleicht korrekter?) Für mich war also, einfach meinen Nicht-Root-Benutzer zur Bluetooth-Gruppe hinzuzufügen. So können die Dinge auch gut funktionieren.

Travis Griggs
quelle
1
Verwenden Sie BLE für die Verbindung mit anderen Geräten oder wirbt Ihre Anwendung für Dienste über BLE? Ich habe diese Lösungen ausprobiert, aber Werbung funktioniert immer noch nicht ohne Root-Rechte.
Pwuertz
Mein himbeerartiges Board spielt die Rolle des Peripheriegeräts. Also ja, es ist Werbung. Ich benutze Debian Stretch mit einem 4.8.10 Kernel und Bluez 5.43. Ich habe Jessie mit dem gleichen Setup verwendet. Sie müssen den Bluetooth-Daemon optimieren, um mit dem Flag -E (experimentell) ausgeführt zu werden. HTH @pwuertz
Travis Griggs