Como permitir que o serviço systemd não-root use dbus para operação BLE

6

Eu fiz um protótipo de um periférico BLE sendo executado como root em uma pequena placa semelhante a uma framboesa. Agora estou endurecendo as coisas e particionando o aplicativo BLE para um usuário não-root. Então eu mudei meu arquivo de serviço do sistema para que o aplicativo se parecesse com:

[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 

Tendo adicionado o campo User para ser executado como o usuário blePeripheral , ele agora não inicia devido a:

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

Eu acho que o que eu preciso fazer é permitir alguns usos de dbus para esse usuário não-root. Vejo que há um bluetooth.conf em /etc/dbus-1/system.d . Preciso ajustar algo neste arquivo para permitir que meu aplicativo ainda use os serviços BLE DBus?

    
por Travis Griggs 01.03.2017 / 18:22

2 respostas

6

Em /etc/dbus-1/system.d/bluetooth.conf , tente adicionar isto:

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

Em seguida, reinicie o serviço dbus:

systemctl restart dbus
    
por 01.03.2017 / 18:48
2

Enquanto tecnicamente @ resposta de Mark respondeu a questão de como ajustar o arquivo de configuração dbus bluetooth para conseguir o que eu quero, notei depois de olhar nesse arquivo algo que eu gostaria de ter notado antes de postar. O grupo bluetooth obtém acesso ao barramento. Então, a coisa mais fácil (talvez mais correta?) Para mim era simplesmente adicionar meu usuário não-root ao grupo bluetooth. O que também permite que as coisas funcionem bem.

    
por 01.03.2017 / 19:32