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:
- Logik (Ruby): Verarbeitet Daten und steuert den Ablauf.
- 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 |