如何使用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)
不确定这是否是库作者的意图,但嘿它有效!
我正在开发一个 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)
不确定这是否是库作者的意图,但嘿它有效!