Python3.5+ sd-bus adapter which allows to manage services, publish and call methods.
Tested on Ubuntu 16.04 and Ubuntu 20.04.
If you are orchestrating a large number of services on a Linux system, you have to run the command service
or systemctl
quite frequently.
If you want to do this programmatically, you have to start the process in most cases with a shell (to parse systemctl
commands arguments) which sometimes may lead you to arguments symbols escaping.
What will do the systemctl restart nginx.service
command in the end? This command will send message over SD-Bus to systemd daemon (PID 1) which will restart nginx
service.
What if it is possible to send the message to systemd through the SD-Bus directly from Python? What if the same mechanism can be used for IPC?
sudo apt update
sudo apt install python3-setuptools python3-stdeb python3-all-dev libsystemd-dev
python3 ./setup.py build
Just run build.sh
and make sure you installed fakeroot
package.
sudo apt update
sudo apt install fakeroot python3-setuptools python3-stdeb python3-all-dev libsystemd-dev
./build.sh
For example you can reload nginx
service in the following way:
from pysysdc.unit import Unit
Unit("nginx").reload()
All supported unit methods can be found here.
It's also possible to set your hostname through this library without any subprocess spawn, configuration editing and etc:
from pysysdc.methods import Methods
Methods.set_pretty_hostname("myhostname")
or reboot your machine
from pysysdc.methods import Methods
Methods.machine_reboot()
see other implemented systemd methods here.
Also you can publish method in you service.
from pysysdc.sdbus import SDBus
data = "example data string"
def handler():
return True, data
sd = SDBus(path="/dc/cloud/auth", if_name="dc.cloud.auth", method_name="Token", method_args="s", output_sig="s", method_return="s")
sd.set_func(handler)
sd.listen()
and call it from another program
from pysysdc.sdbus import SDBus
sd = SDBus(
path="/dc/cloud/auth",
if_name="dc.cloud.auth",
method_name="Token",
method_args="s",
method_return="s",
output_sig="s")
ret = sd.send(method_name="Token")
print(ret)