Как использовать pystemd для контроля сервиса ndp с указанием времени systemd? - PullRequest
1 голос
/ 11 октября 2019

Я работаю над приложением python, которому нужно получить параметр NTPSynchronized из системного времени. Я также хотел бы иметь возможность запускать и останавливать службу NTP с помощью метода SetNTP.

Для связи с синхронизацией по времени по шине d-Bus я использовал это в качестве ссылки: 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

Запуск этогоЯ получаю:

Ошибка атрибута: у объекта 'SDInterface' нет атрибута 'NTPSynchronized'

У меня такое ощущение, что либо введенная мной служба неверна, либоЯ получаю доступ к свойствам неправильно, или даже оба неверны.

Любая помощь или совет приветствуется.

1 Ответ

1 голос
/ 11 октября 2019

Глядя на исходный код, кажется, что при использовании объекта модуля pystemd.systemd1 назначением по умолчанию является «org.freedesktop.systemd1» + имя службы (https://github.com/facebookincubator/pystemd/blob/master/pystemd/systemd1/unit.py)

Это не то, что яхочу, потому что я пытаюсь получить доступ к "org.freedesktop.timedate1" Так что вместо этого я создал его базовый класс SDObject из pystemd.base (https://github.com/facebookincubator/pystemd/blob/master/pystemd/base.py)

Следующий код позволил мне получить состояние синхронизации 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)

Не уверен, что это именно то, что задумал автор библиотеки, но эй, это работает!

...