26 Kapitel in vier Teilen, in der Reihenfolge, in der man sie braucht: erst sichern, dann Dateien holen, dann ganze Maschinen wiederherstellen, dahinter der Nachschlagteil. Gebaut wird mit MkDocs + Material. Bewusst ohne Netzabhaengigkeiten: keine Schriften vom CDN (font: false), Volltextsuche mit deutschem Stemming liegt neben den Seiten. Im Notfall steht vielleicht das halbe Netz - dann nuetzt eine Doku im Internet nichts. handbuch/bauen.sh baut handbuch/site/ handbuch/bauen.sh ansehen Vorschau auf 127.0.0.1:8000 install.sh nimmt das gebaute Handbuch mit nach /usr/share/doc/pvesnap/handbuch/ - falls es vorliegt. Auf dem Host selbst wird nichts gebaut, mkdocs gehoert nicht auf einen Hypervisor. Die 28 Bildschirmfotos sind nicht abfotografiert, sondern erzeugt: Der echte Programmcode laeuft in einem Pseudo-Terminal gegen einen erfundenen Proxmox-Host (Attrappen fuer pvesh, perl und rbd), pyte baut den Bildschirm nach, heraus faellt ein SVG. Damit stimmen sie garantiert mit dem Programm ueberein, sind reproduzierbar und enthalten keine echten Daten. Die Werkstatt dafuer liegt unter handbuch/werkstatt/ samt LIESMICH.md. Nebenbei: die Schlussmeldung von install.sh warb noch mit --exchange, das mit dem eingebauten Austauschlaufwerk weggefallen ist. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
63 lines
2.2 KiB
Python
Executable File
63 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Eine Szene starten und den Bildschirm als Text zeigen - zum Nachsehen."""
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__)) # handbuch/werkstatt
|
|
HANDBUCH = os.path.dirname(HERE) # handbuch
|
|
REPO = os.path.dirname(HANDBUCH) # Projektwurzel
|
|
sys.path.insert(0, HERE)
|
|
from shot import Terminal # noqa: E402
|
|
|
|
TASTEN = {"ab": "\x1bOB", "auf": "\x1bOA", "rechts": "\x1bOC", "links": "\x1bOD",
|
|
"enter": "\r", "tab": "\t", "esc": "\x1b", "f2": "\x1bOQ", "f3": "\x1bOR",
|
|
"f5": "\x1b[15~", "f7": "\x1b[18~", "f9": "\x1b[20~", "space": " "}
|
|
|
|
|
|
def umgebung():
|
|
env = dict(os.environ)
|
|
env["PATH"] = os.path.join(HERE, "bin") + ":" + env["PATH"]
|
|
env["PVESNAP_DEMO_STATE"] = os.path.join(HERE, "demo", "state.json")
|
|
# ncurses zeichnet Rahmen sonst ueber den Ersatzzeichensatz (ESC ( 0). Der
|
|
# Bildschirmnachbau ignoriert das im UTF-8-Betrieb, und aus den Linien
|
|
# wuerden Buchstaben. So kommen echte Unicode-Rahmenzeichen heraus.
|
|
env["NCURSES_NO_UTF8_ACS"] = "1"
|
|
env["PVESNAP_SRC"] = os.environ.get("PVESNAP_SRC", REPO)
|
|
env["PYTHONPATH"] = env["PVESNAP_SRC"]
|
|
return env
|
|
|
|
|
|
# Dieselbe Umgebung, die auch bauen.sh benutzt - dort wird pyte nachinstalliert.
|
|
VENV = os.path.join(HANDBUCH, ".venv", "bin", "python")
|
|
|
|
|
|
def befehl(szene):
|
|
"""Die Aufnahme laeuft in einem eigenen Mount-Namensraum - siehe stage.sh."""
|
|
return ["unshare", "-r", "-m", "--propagation", "private",
|
|
os.path.join(HERE, "stage.sh"), szene]
|
|
|
|
|
|
def starte(szene, cols=100, rows=30):
|
|
env = umgebung()
|
|
env["DOKU"] = HERE
|
|
env["PY"] = VENV
|
|
return Terminal(befehl(szene), cols=cols, rows=rows, env=env, cwd=HERE)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
szene = sys.argv[1]
|
|
tasten = [TASTEN.get(t, t) for t in sys.argv[2:]]
|
|
term = starte(szene, cols=int(os.environ.get("COLS", 100)),
|
|
rows=int(os.environ.get("ROWS", 30)))
|
|
try:
|
|
time.sleep(1.2)
|
|
term.settle()
|
|
term.send(tasten, pause=0.3)
|
|
time.sleep(0.3)
|
|
term.settle()
|
|
for line in term.screen.display:
|
|
print("|" + line.rstrip() + "|")
|
|
finally:
|
|
term.close()
|