如何使用pystemd控制systemd timedated ntp服务?

How to use pystemd to control systemd timedated ntp service?

我正在开发一个 python 应用程序,它需要从系统时间获取 NTPSynchronized 参数。我还希望能够使用 SetNTP 方法启动和停止 NTP 服务。

为了通过 d-bus 与 timedated 通信,我一直在使用它作为参考:https://www.freedesktop.org/wiki/Software/systemd/timedated/

我之前使用 dbus-python 进行过此操作,但此后了解到该库已被弃用。我尝试了 dbus_next 包,但它不支持我需要的 Python 3.5。

我遇到了 pystemd 包,但我不确定它是否可以用来做我想做的事。我能找到的唯一文档是这个例子 (https://github.com/facebookincubator/pystemd),但我不知道如何使用它来处理系统时间。

这是我拥有的与 dbus-python 一起使用的代码:

import dbus

BUS_NAME = 'org.freedesktop.timedate1`
IFACE = 'org.freedesktop.timedate1`

bus = dbus.SystemBus()
timedate_obj = bus.get_object(BUS_NAME, '/org/freedesktop/timedate1')

# Get synchronization value
is_sync = timedate_obj.Get(BUS_NAME, 'NTPSynchronized', dbus_interface=dbus.PROPERTIES_IFACE)

# Turn off NTP
timedate_obj.SetNTP(False,False, dbus_interface=IFACE)

这是我目前使用 pystemd 的内容,但我认为我没有以正确的方式访问它:

from pystemd.systemd1 import Unit

unit = Unit(b'systemd-timesyncd.service')
unit.load()

# Try to access properties
prop = unit.Properties
prop.NTPSynchronized

运行 我得到:

Attribute Error: 'SDInterface' object has no attribute 'NTPSynchronized'

我感觉要么我输入的服务不对,要么我访问属性的方式不对,甚至两者都不对。

如有任何帮助或建议,我们将不胜感激。

查看源代码,似乎使用 pystemd.systemd1 Unit 对象的默认目的地为 "org.freedesktop.systemd1" + 服务名称 (https://github.com/facebookincubator/pystemd/blob/master/pystemd/systemd1/unit.py)

这不是我想要的,因为我正在尝试访问 "org.freedesktop.timedate1" 因此,我从 pystemd.base (https://github.com/facebookincubator/pystemd/blob/master/pystemd/base.py)

实例化了它的基础 class SDObject

下面的代码允许我获取 NTP 的同步状态

from pystemd.base import SDObject

obj = SDObject(
    destination=b'org.freedesktop.timedate1',
    path=b'/org/freedesktop/timedate1',
    bus=None,
    _autoload=False
)

obj.load()

is_sync = obj.Properties.Get('org.freedesktop.timedate1','NTPSynchronized')

print(is_sync)

不确定这是否是库作者的意图,但嘿它有效!