linux-suse-opensuse automation python api dbus snapper sles

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?

  1. Erstellen Sie ein Python-Skript, das die Standard-CLI-Parameter von YaST akzeptiert.
  2. Legen Sie eine .desktop Datei in /usr/share/applications/YaST2/ an.
  3. 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)