Python for SUSE Administration: API & DBus (Artikel 173)
Fortgeschrittene SUSE-Administration mit Python. Erfahren Sie den Umgang mit der Snapper DBus-API, die Nutzung von Zypper-Bindings und die Entwicklung eigener Management-Tools.
# Python on SUSE: Tiefe Integration in Btrfs und YaST
TL;DR / Management Summary In der SUSE-Welt ist Python das Bindeglied zwischen High-Level Administration und Low-Level Systemfunktionen. Viele YaST-Module sind heute in Ruby oder Python geschrieben. Ein Senior Admin nutzt Python, um direkt mit dem D-Bus zu kommunizieren – etwa um Snapper-Snapshots programmatisch zu steuern – oder um die libzypp-Bibliothek für maßgeschneiderte Paket-Analysen zu nutzen. Dieses Modul zeigt, wie man SUSE-spezifische APIs anspricht.
# 1. Einführung & Architektur
Die SUSE API-Ebene.
SUSE setzt massiv auf D-Bus für die Kommunikation zwischen Systemdiensten. Fast alles, was YaST kann, lässt sich via D-Bus auch mit Python steuern.
# Der Python-Integrations-Stack (Mermaid)
graph LR
A[Python Script] --> B[D-Bus Interface]
A --> C[python3-zypp Bindings]
B --> D[Snapper Daemon]
B --> E[NetworkManager / Wicked]
C --> F[Package Management libzypp]
D --> G[Btrfs Snapshots]
# 2. Snapper via Python (D-Bus)
Snapshots per Skript steuern.
Anstatt subprocess.run(["snapper", ...]) zu nutzen, sprechen wir direkt mit dem Dienst.
# Beispiel: Snapshot erstellen via D-Bus
import dbus
def create_snapshot(description):
bus = dbus.SystemBus()
snapper_obj = bus.get_object('org.opensuse.Snapper', '/org/opensuse/Snapper')
iface = dbus.Interface(snapper_obj, 'org.opensuse.Snapper')
# Erstellt einen Single-Snapshot für die Config 'root'
params = dbus.Dictionary({'description': description}, signature='ss')
snap_id = iface.CreateSnapshot('root', 'single', params)
print(f"Created Snapshot ID: {snap_id}")
create_snapshot("Python automated backup")
# 3. Paket-Analyse mit libzypp Bindings
Den Solver verstehen.
Mit python3-zypp können Sie komplexe Abfragen an die Paketdatenbank stellen.
# Beispiel: Installierte Pakete nach Vendor filtern
import zypp
z = zypp.ZYppFactory_instance().get_zypp()
repo_manager = zypp.RepoManager()
pool = z.pool()
for item in pool:
if item.status().is_installed():
resolvable = item.resolvable()
if "SUSE" in resolvable.vendor():
print(f"Official SUSE Package: {resolvable.name()}")
# 4. Day-2 Operations: Custom YaST Modules
Eigene Tools in die GUI einbetten.
Wussten Sie, dass Sie eigene Python-Skripte als YaST-Module registrieren können?
- Erstellen Sie ein Python-Skript, das die Standard-CLI-Parameter von YaST akzeptiert.
- Legen Sie eine
.desktopDatei in/usr/share/applications/YaST2/an. - Ihr Tool erscheint nun im YaST Control Center.
# 5. Troubleshooting & “War Stories”
Wenn die API schweigt.
# Story 1: “Der D-Bus Timeout”
Symptom: Ein Python-Skript, das hunderte Snapshots löschen soll, bricht mit einem dbus.exceptions.DBusException: org.freedesktop.DBus.Error.Timeout ab.
Ursache: Das Löschen von Btrfs-Snapshots ist eine schwere I/O-Operation. Der Snapper-Dämon antwortet nicht schnell genug.
Lösung: Erhöhen Sie den Timeout im D-Bus Call oder führen Sie die Operation asynchron aus.
# Story 2: “Das verschwundene Python-Modul”
Symptom: import zypp schlägt nach einem Service-Pack Upgrade fehl.
Ursache: SUSE hat die Python-Version (z.B. von 3.6 auf 3.10) aktualisiert. Die Bindings wurden nur für die alte Version installiert.
Lösung: Installieren Sie die Bindings für die neue Version: zypper install python310-zypp. Suchen Sie immer nach dem Paketnamen mit der Versionsnummer.
# 6. Fazit & Empfehlung
- D-Bus: Nutzen Sie D-Bus für systemnahe Aufgaben (Snapper, Network). Es ist sauberer und bietet bessere Rückgabewerte als das Parsen von Shell-Output.
- Versionierung: Nutzen Sie virtuelle Umgebungen (
venv), aber aktivieren Sie--system-site-packages, um Zugriff auf die SUSE-spezifischen Bindings zu haben. - Wartung: Halten Sie Ihre Skripte kompatibel zu den Standard-SUSE-Pfaden (
/srv/www,/etc/sysconfig).
# Anhang: Cheatsheet
| Aufgabe | Modul / Paket |
|---|---|
| D-Bus Kommunikation | python3-dbus-python |
| Zypper Bindings | python3-zypp |
| Hardware Erkennung | python3-hwinfo (via subprocess wrapper) |
| SELinux Status | python3-selinux |
| RPM API | python3-rpm |
| YaST Integration | .desktop Datei in /usr/share/applications/YaST2/ |
| Log-Analyse | python3-systemd (Journal Zugriff) |
| XML Parsing | lxml (für AutoYaST XMLs) |