Definindo a sessão raiz e a sessão do usuário no mesmo barramento?

3

Eu tenho um script que deve ser executado em root , com ligações ao dbus.

DBUS_SESSION_BUS_ADDRESS = 'address set under .dbus file ...'

class NewApp(dbus.service.Object):

    def __init__(self):
        busname = dbus.service.BusName('org.newapp', dbus.SessionBus(mainloop=DBusGMainLoop()))
        dbus.service.Object.__init__(self, busname, '/org/newapp')

    @dbus.service.method('org.newapp', out_signature='s')
    def do_stuff(self):
        return 'stuff'

if __name__ == '__main__':
    na = NewApp
    na()
    gobject.MainLoop().run()

Em que do_stuff tem código que precisa ter root access. Eu descobri que quando você executa o programa em root, isso cria uma sessão dbus separada e eu precisaria definir o 'DBUS_SESSION_BUS_ADDRESS'. Pensei em separar o script em dois arquivos diferentes e importar o outro, mas gostaria de saber como fazer isso também.

Isso está me causando problemas, não sei onde ou como definir o endereço corretamente. Se alguém tiver alguma ideia, eu agradeceria muito.

    
por tijko 24.12.2012 / 02:36

1 resposta

1

Se você está escrevendo um script que requer execução como root, e precisa ser acessado via DBus pelos usuários de alguma forma, você deve expor a API através do barramento do sistema, não do barramento da sessão.

Como exemplo, veja como o serviço do sistema NetworkManager funciona.

Para obter mais documentação sobre como as permissões funcionam no DBus, consulte link

    
por dobey 24.12.2012 / 03:28