linux-suse-opensuse automation yast ruby development sles

YaST Ruby Scripting: Custom Modules (Artikel 174)

Tiefgehender Einstieg in die Entwicklung eigener YaST-Module mit Ruby. Erfahren Sie alles über die YUI-Bibliothek, das SCR-Subsystem und die Erweiterung des SUSE-Administrations-Tools.

# YaST Development: Eigene Module mit Ruby entwickeln

TL;DR / Management Summary YaST ist kein abgeschlossenes System. Seit dem Wechsel von der proprietären Sprache YCP zu Ruby steht das YaST-Ökosystem jedem Admin offen. Wer komplexe Firmen-Standards (z.B. spezifische Hardening-Checks oder interne Provisionierungs-Logik) direkt in die SUSE-Oberfläche integrieren möchte, nutzt die YUI (YaST User Interface) Bibliothek und das SCR (System Content Repository) Subsystem. Damit bauen Sie Tools, die sich nahtlos in SLES anfühlen.


# 1. Einführung & Architektur

Wie YaST unter der Haube tickt.

Jedes YaST-Modul besteht aus zwei Teilen:

  1. Logik (Ruby): Verarbeitet Daten und steuert den Ablauf.
  2. Abstraktion (SCR): Liest und schreibt Systemdateien (Agenten-Modell).

# Das Schichtenmodell (Mermaid)

graph TD
    A[YaST User Interface: Qt / ncurses] --> B[Ruby Logic: yast2-lib-ruby]
    B --> C[SCR: System Content Repository]
    C -->|Read/Write| D[Files: /etc/sysconfig/*]
    C -->|Execute| E[Binaries: ip, zypper, systemctl]
    B --> F[Client: .ycp or .rb scripts]

# 2. Hello World in YaST (Ruby)

Der erste Dialog.

YaST Module nutzen die Yast Namespace-Library.

# Beispiel: hello_yast.rb

require "yast"
Yast.import "UI"
Yast.import "Popup"

module HelloYaST
  def self.Main
    Yast::UI.OpenLayout(
      Yast::UI.VBox(
        Yast::UI.Label("Willkommen im Enterprise Wiki Tool"),
        Yast::UI.PushButton(Yast::UI.Id(:ok), "OK")
      )
    )
    Yast::UI.UserInput
    Yast::UI.CloseLayout
  end
end

HelloYaST.Main

Ausführen mit: yast2 ./hello_yast.rb.


# 3. SCR: Sicher mit dem System interagieren

Keine direkten File-Hacks.

Anstatt Dateien manuell mit File.open zu öffnen, nutzt YaST Agenten. Das ist sicherer und unterstützt Transaktionen.

# Beispiel: Hostnamen via SCR lesen

# Liest den Hostnamen aus der System-Abstraktion
hostname = Yast::SCR.Read(Yast::path(".target.string"), "/etc/hostname")
Yast::Popup.Message("Der aktuelle Hostname ist: #{hostname}")

# 4. Day-2 Operations: Integration in das Control Center

Sichtbarkeit für das Team.

Damit Ihr neues Tool im yast2 Hauptmenü erscheint, benötigen Sie eine .desktop Datei.

Datei: /usr/share/applications/YaST2/my_tool.desktop

[Desktop Entry]
Type=Application
Name=My Security Auditor
Exec=yast2 /usr/local/sbin/my_auditor.rb
Icon=yast-security
Categories=Qt;YaST;Settings;

# 5. Troubleshooting & “War Stories”

Vermeiden Sie die klassischen Entwickler-Fehler.

# Story 1: “Der UI-Blocker”

Symptom: Das YaST-Modul friert ein, sobald ein langer Prozess (z.B. ein Backup) startet. Ursache: Die Ruby-Logik läuft im gleichen Thread wie das UI. Solange das Skript wartet, reagiert die Oberfläche nicht. Lösung: Nutzen Sie Yast::UI.Execute oder asynchrone Callbacks, um langlaufende Tasks in den Hintergrund zu schieben und den Status via Progress-Bar zu visualisieren.

# Story 2: “Zerschossene Config-Files”

Symptom: Nach der Nutzung eines eigenen Moduls ist die /etc/sysconfig/network leer oder korrupt. Ursache: Direkte Schreibzugriffe ohne Validierung oder Nutzung falscher SCR-Agenten. Lösung: Nutzen Sie für Standarddateien immer die spezialisierten Agenten (z.B. .sysconfig.network), die die Syntax der Datei kennen und nur geänderte Zeilen schreiben.


# 6. Fazit & Empfehlung

  • Ruby: Wenn Sie bereits Ruby kennen, ist der Einstieg in YaST extrem einfach.
  • Wartbarkeit: Nutzen Sie die offiziellen YaST-Bibliotheken (yast2-yui-bindings). Es garantiert, dass Ihr Tool sowohl in der Grafik (Qt) als auch im Textmodus (ncurses) funktioniert.
  • Source Code: Schauen Sie sich den Quellcode der offiziellen Module auf GitHub (yast) an. Es ist die beste Dokumentation.

# Anhang: Cheatsheet

Aufgabe Ruby Befehl
UI öffnen Yast::UI.OpenLayout(...)
Popup Nachricht Yast::Popup.Message("...")
Systemdatei lesen Yast::SCR.Read(path, file)
Befehl ausführen Yast::SCR.Execute(path, cmd)
Importiere Modul Yast.import "NetworkService"
Log schreiben Yast::Builtin.y2milestone("...")
CLI Argumente Yast::WFM.Args