2013-08-14 12 views
6

Dire che voglio ottenere a livello di programmazione il nome dell'interfaccia della mia scheda ethernet. Questo sembra funzionare:È possibile recuperare una proprietà D-Bus senza chiamare org.freedesktop.DBus.Properties.Get?

dbus-send --print-reply \ 
      --type=method_call \ 
      --system \ 
      --dest=org.freedesktop.NetworkManager \ 
      /org/freedesktop/NetworkManager/Devices/0 \ 
      org.freedesktop.DBus.Properties.Get \ 
      string:org.freedesktop.NetworkManager.Device \ 
      string:Interface 

che restituisce:

method return sender=:1.5 -> dest=:1.135 reply_serial=2 
    variant  string "eth0" 

C'è qualche modo di tagliare fuori gli intermediari org.freedesktop.DBus.Properties.Get e recuperare la proprietà più direttamente? Ahimè, definendolo come un metodo non funziona:

dbus-send --print-reply \ 
      --type=method_call \ 
      --system \ 
      --dest=org.freedesktop.NetworkManager \ 
      /org/freedesktop/NetworkManager/Devices/0 \ 
      org.freedesktop.NetworkManager.Device.Interface 

Returns:

Error org.freedesktop.DBus.Error.UnknownMethod: 
Method "Interface" with signature "" on interface 
"org.freedesktop.NetworkManager.Device" doesn't exist 

Lo chiedo perché dover chiamare org.freedesktop.DBus.Properties.Get sembra dover chiamare un object.getProp("someproperty") invece di object.getSomeProperty() in Python/Java/etc .

risposta

1

No.

Molto probabilmente org.freedesktop.DBus.Properties.GetAll restituirà voi stesso valore, ma internamente ogni servizio implementare proprietà come i gestori di messaggi con org.freedesktop.DBus.Properties.Get/org.freedesktop.DBus.Properties.GetAll chiamate di metodo.

Sembra object.getProp("someproperty") perché in realtà è più simile a questo pseudo-codice

bus.handleMessage({ 
    service: "org.freedesktop.NetworkManager", 
    object: "/org/freedesktop/NetworkManager/Devices/0", 
    iface: "org.freedesktop.NetworkManager.Device.Interface", 
    body: [ "org.freedesktop.NetworkManager.Device", "Interface"], 
    thisMessageIsReplyTo: null 
}) 

Internamente ogni chiamata di metodo/segnale/risposta è solo un messaggio con la firma grande (nome del servizio/oggetto percorso/interfaccia) e body

4

Sì, è possibile farlo se si utilizza qdbus. Non ho NetworkManager con me, ma un comando del genere dovrebbe funzionare:

qdbus --system \ 
     org.freedesktop.NetworkManager \ 
     /org/freedesktop/NetworkManager/Devices/0 \ 
     org.freedesktop.NetworkManager.Device.Interface 

ci sono vari client di riga di comando per parlare con D-Bus, alcuni sono più convenienti di altri. Ecco la lista di quelli che conosco.

  • dbus-send (fornito con D-Bus stesso)
  • gdbus (fornito da GLib)
  • qdbus (fornito da Qt)
  • busctl (fornito da systemd)
+1

è un peccato che il miglior strumento da riga di comando dbus è distribuito con qt, e non dbus. – olejorgenb

+1

Vale la pena notare che, internamente, 'qdbus' * chiamerà' org.freedesktop.DBus.Properties.Get' o 'org.freedesktop.DBus.Properties.GetAll', o otterrà le proprietà dai segnali di' org .freedesktop.DBus.ObjectManager'. A livello di protocollo, questo è un requisito. –

Problemi correlati