一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

D-BUS API查找與調(diào)用

 just_person 2019-06-14
Just For Coding190 閱讀

上篇文章<< D-Bus實例介紹 >>中簡要介紹了 D-Bus 的基本概念,其中提到 systemd NetworkManager 等系統(tǒng)服務(wù)導(dǎo)出了 D-Bus API 供其他程序來調(diào)用。本文通過示例來說明這些API的查找與調(diào)用。

上篇文章 我們提到 D-Bus object 可以實現(xiàn)多個 Interface 。 D-Bus 規(guī)范 中標準化了一些接口,這些接口對于我們調(diào)用其他服務(wù)提供的D-Bus API非常有幫助。

我們主要來看其中的兩個:

它有一個方法:

org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)

它會返回一個包含有對象(object), 接口(interface), 方法(methods), 信號(signals),屬性(properties)等信息的XML字符串。對象如果實現(xiàn)這個接口, 我們就可以通過調(diào)用該方法了解這個對象對外提供的所有信息。

XML字符串的解析方法可以參考官方文檔: https://dbus./doc/dbus-specification.html#introspection-format

它有三個方法:

org.freedesktop.DBus.Properties.Get (in STRING interface_name,
                                     in STRING property_name,
                                     out VARIANT value);
org.freedesktop.DBus.Properties.Set (in STRING interface_name,
                                     in STRING property_name,
                                     in VARIANT value);
org.freedesktop.DBus.Properties.GetAll (in STRING interface_name,
                                        out DICT<STRING,VARIANT> props);

如果對象實現(xiàn)了該接口, 那么可以通過調(diào)用這些方法來對該對象的屬性(properties)進行操作。

NetworkManager 服務(wù)都實現(xiàn)了這些標準接口。我們通過 busctl 工具來看一下具體的信息。

busctl systemd 提供的一個 D-Bus 操作工具,功能非常強大,在之前的文章中我們也用它來查看當(dāng)前的 D-Bus 服務(wù)。具體用法可以參考 Man Page

首先,使用 busctl 來查看 org.freedesktop.NetworkManager 服務(wù)提供了哪些對象( objects ):

[root@centos1 dbus]# busctl tree org.freedesktop.NetworkManager
├─/com
│ └─/com/redhat
│   └─/com/redhat/ifcfgrh1
└─/org
  └─/org/freedesktop
    └─/org/freedesktop/NetworkManager
      ├─/org/freedesktop/NetworkManager/ActiveConnection
      │ └─/org/freedesktop/NetworkManager/ActiveConnection/0
      ├─/org/freedesktop/NetworkManager/AgentManager
      ├─/org/freedesktop/NetworkManager/Devices
      │ ├─/org/freedesktop/NetworkManager/Devices/0
      │ ├─/org/freedesktop/NetworkManager/Devices/1
      │ └─/org/freedesktop/NetworkManager/Devices/2
      ├─/org/freedesktop/NetworkManager/IP4Config
      │ ├─/org/freedesktop/NetworkManager/IP4Config/0
      │ ├─/org/freedesktop/NetworkManager/IP4Config/1
      │ └─/org/freedesktop/NetworkManager/IP4Config/2
      ├─/org/freedesktop/NetworkManager/IP6Config
      │ ├─/org/freedesktop/NetworkManager/IP6Config/0
      │ ├─/org/freedesktop/NetworkManager/IP6Config/1
      │ └─/org/freedesktop/NetworkManager/IP6Config/2
      └─/org/freedesktop/NetworkManager/Settings
        └─/org/freedesktop/NetworkManager/Settings/0

接著,來查看某個對象實現(xiàn)的接口及其成員:

[root@centos1 dbus]# busctl introspect org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/0
NAME                                          TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable           interface -         -                                        -
.Introspect                                   method    -         s                                        -
org.freedesktop.DBus.Properties               interface -         -                                        -
.Get                                          method    ss        v                                        -
.GetAll                                       method    s         a{sv}                                    -
.Set                                          method    ssv       -                                        -
org.freedesktop.NetworkManager.Device         interface -         -                                        -
.Delete                                       method    -         -                                        -
.Disconnect                                   method    -         -                                        -
.ActiveConnection                             property  o         "/"                                      emits-change
.Autoconnect                                  property  b         false                                    emits-change writable
.AvailableConnections                         property  ao        0                                        emits-change
.Capabilities                                 property  u         7                                        emits-change
.DeviceType                                   property  u         14                                       emits-change
.Dhcp4Config                                  property  o         "/"                                      emits-change
.Dhcp6Config                                  property  o         "/"                                      emits-change
.Driver                                       property  s         "unknown"                                emits-change
.DriverVersion                                property  s         ""                                       emits-change
.FirmwareMissing                              property  b         false                                    emits-change
.FirmwareVersion                              property  s         ""                                       emits-change
.Interface                                    property  s         "lo"                                     emits-change
.Ip4Address                                   property  u         16777343                                 emits-change
.Ip4Config                                    property  o         "/org/freedesktop/NetworkManager/IP4C... emits-change
.Ip6Config                                    property  o         "/org/freedesktop/NetworkManager/IP6C... emits-change
.IpInterface                                  property  s         "lo"                                     emits-change
.Managed                                      property  b         false                                    emits-change
.Mtu                                          property  u         65536                                    emits-change
.PhysicalPortId                               property  s         ""                                       emits-change
.State                                        property  u         10                                       emits-change
.StateReason                                  property  (uu)      10 0                                     emits-change
.Udi                                          property  s         "/sys/devices/virtual/net/lo"            emits-change
.StateChanged                                 signal    uuu       -                                        -
org.freedesktop.NetworkManager.Device.Generic interface -         -                                        -
.HwAddress                                    property  s         "00:00:00:00:00:00"                      emits-change
.TypeDescription                              property  s         "loopback"                               emits-change
.PropertiesChanged                            signal    a{sv}     -                                        -

返回結(jié)果中顯示了該對象實現(xiàn)的接口及其方法(methods)、信息(signals)、屬性(properties)等信息,屬性值也被列出。

如果我們需要獲取特定的屬性值,還可以使用 busctl get-property 子命令單獨獲取。

比如,我們獲取某個網(wǎng)卡的名稱:

[root@centos1 python]# busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/1 org.freedesktop.NetworkManager.Device Interface
s "enp0s3"

上面我們使用 busctl 工具來示范了 D-Bus 服務(wù)API的調(diào)用方式。下面,我們再通一個 Python 程序來說明如何在程序中實現(xiàn)屬性獲取。

源碼如下:

import dbus
from pprint import pprint
from dbus import SystemBus
from dbus import Interface
from xml.etree import ElementTree

def print_network_ifaces(bus, service, object_path):
    try:
        if object_path == "/org/freedesktop/NetworkManager/Devices":
            return

        obj = bus.get_object(service, object_path)
        interface = Interface(obj, 'org.freedesktop.DBus.Properties')

        m = interface.get_dbus_method('Get', dbus_interface=None)

        ifacename = m('org.freedesktop.NetworkManager.Device', 'Interface')
        print(ifacename)

    except Exception, err:
        print err

def rec_intro(bus, service, object_path, callback):
    callback(bus, service, object_path)
    obj = bus.get_object(service, object_path)
    interface = Interface(obj, 'org.freedesktop.DBus.Introspectable')
    xmlstring = interface.Introspect()
    for child in ElementTree.fromstring(xmlstring):
        if child.tag == 'node':
            if object_path == '/':
                object_path = ''
            new_path = '/' . join((object_path, child.attrib['name']))
            rec_intro(bus, service, new_path, callback)

bus = SystemBus()
rec_intro(bus, 'org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager/Devices', print_network_ifaces)

我們的程序中首先調(diào)用標準接口 org.freedesktop.DBus.Introspectable 的方法 Introspect 拿到所有網(wǎng)絡(luò)接口對象,然后調(diào)用標準接口 org.freedesktop.DBus.Properties 的方法 Get 獲取屬性 Interface 的值,從而獲取網(wǎng)絡(luò)接口名稱。

系統(tǒng)本身的許多服務(wù)都提供了 D-Bus API, 在許多場景下通過調(diào)用這些API可以非常便捷地實現(xiàn)我們的功能需求。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩欧美一区二区亚洲| 男女午夜在线免费观看视频| 国产欧洲亚洲日产一区二区| 国产又粗又猛又黄又爽视频免费| 日本女优一区二区三区免费| 91爽人人爽人人插人人爽| 欧美一区日韩二区亚洲三区| 欧美黑人在线精品极品| 日系韩系还是欧美久久| 大香伊蕉欧美一区二区三区| 好吊色免费在线观看视频| 亚洲精品国产精品日韩| 熟妇久久人妻中文字幕| 亚洲中文字幕在线观看四区| 欧美日韩三区在线观看| 亚洲一区二区精品免费视频| 久久精品免费视看国产成人| 亚洲五月婷婷中文字幕| 在线视频三区日本精品| 亚洲五月婷婷中文字幕| 日韩精品少妇人妻一区二区| 中文字幕av诱惑一区二区| 国产精品不卡一区二区三区四区| 亚洲在线观看福利视频| 九九热这里有精品20| 日韩精品中文字幕在线视频| 99热九九在线中文字幕| 大香蕉精品视频一区二区| 久热人妻中文字幕一区二区| 日韩在线中文字幕不卡| 亚洲一区二区三区熟女少妇| 欧美中文字幕一区在线| 毛片在线观看免费日韩| 欧美日韩国产精品黄片| 中文字幕乱码免费人妻av| 亚洲精品中文字幕一二三| 亚洲午夜精品视频在线| 免费高清欧美一区二区视频| 亚洲国产性生活高潮免费视频| 国产成人高清精品尤物| 国产精品不卡一区二区三区四区|