Der bisherige Weg zur Administration führt über HTTP: ein Formularserver auf dem ODROID, Netscape 3.04 auf dem Mac, HTML 3.2. Der Gegenentwurf wäre X11 — das Werkzeug läuft weiterhin auf dem Server, zeichnet aber mit echten Widgets auf dem Bildschirm des emulierten Macs. Die Grundlage dafür ist eXodusII 7.0, die letzte 68k-fähige Fassung des X-Servers von White Pine, die laut Beschreibung auch unter Basilisk II läuft.
Dieser Text ist ein Versuchsplan, kein Bericht. Nichts davon ist auf dem ODROID durchgeführt. Er hält fest, was zu tun wäre, in welcher Reihenfolge, und woran es voraussichtlich scheitert — damit der spätere Log das dagegenhalten kann.
Der Denkfehler zuerst: wer ist hier der Server?
X11 dreht die gewohnten Rollen um. Der Mac ist der Server — er stellt das Display bereit. Das Konfigurationswerkzeug ist der Client; es läuft auf dem ODROID und baut eine Verbindung zum Mac auf, auf TCP-Port 6000.
Das ist keine Spitzfindigkeit, sondern bestimmt die gesamte Netzkonfiguration. Bei AFP und HTTP verbindet sich der Mac zum ODROID. Hier ist es umgekehrt, und der emulierte Mac muss eingehende Verbindungen annehmen. Im Bridge-Modus über etherhelper ist das unproblematisch, weil der Gast eine eigene LAN-Adresse aus dem DHCP hat — über slirp wäre es aussichtslos.
flowchart LR
subgraph "Mac OS 7.6.1 in Basilisk II"
EX["eXodusII 7.0
X-Server, Display :0"]
end
subgraph "ODROID"
TK["netatalk-admin-x
X-Client"]
AVD["AppleVolumes.default"]
AFPD["afpd 2.2.2"]
end
TK -->|"X11-Protokoll, TCP 6000"| EX
EX -->|"Tasten und Maus"| TK
TK -->|"schreibt"| AVD
TK -->|"SIGHUP"| AFPD
| Richtung | Port | Wofür |
|---|---|---|
| ODROID zum Mac | 6000/tcp | die X11-Verbindung des Werkzeugs zum Display |
| Mac zum ODROID | 23/tcp | Telnet, um das Werkzeug in Stufe 1 überhaupt zu starten |
| Mac zum ODROID | 177/udp | XDMCP-Anfrage, nur für die optionale Stufe 2 |
Für die Paketfilter-Regeln auf dem ODROID heißt das: Die X-Verbindung geht ausgehend und wird von der INPUT-Kette gar nicht gesehen. Wer dort nach Fehlern sucht, sucht an der falschen Stelle.
Vorbereitung auf dem Mac
eXodusII 7.0. Die Fassung unterstützt X11R6.3, XDM sowie Rooted- und Rootless-Darstellung und verlangt mindestens einen 68020. Die Freischaltcodes liegen dem Installationspaket in der Datei „Readme-1st" bei — ohne die startet nichts.
Rooted oder Rootless. Rootless, also X-Fenster direkt auf dem Mac-Schreibtisch, verlangt Appearance Manager 1.0 oder neuer. Der gehört eigentlich zu Mac OS 8 — es gibt ihn aber als freies SDK auch für System 7, und die Fassungen 1.0.2 und 1.0.3 sind bis hinunter zu System 7.1 und Mac OS 7.6.1 kompatibel. Der Plan sieht trotzdem vor, mit Rooted anzufangen: ein einziges großes X-Wurzelfenster, in dem alles liegt. Das ist der Modus mit den wenigsten Unbekannten. Appearance Manager nachzurüsten ist die Kür, nicht die Pflicht, und bringt eine zusätzliche Fehlerquelle in ein System, das gerade stabil läuft.
Emulator aufbohren. Basilisk II emuliert standardmäßig einen 68040, die CPU-Anforderung ist also erfüllt. Zu ändern sind zwei Dinge: der Arbeitsspeicher — 64 MB statt der üblichen 16 sind angemessen, ein X-Server ist kein Sparprogramm — und der Bildschirm. Sinnvoll sind 1152×870 bei 256 Farben. Acht Bit Farbtiefe ist der Fall, für den X-Server dieser Ära gebaut wurden; mehr Farben kosten hier nur Bandbreite. In den Informationen zur eXodus-Anwendung sollte außerdem die Speicherzuteilung großzügig hochgesetzt werden.
TCP/IP. Muss nichts getan werden — dass Netscape den Formularserver auf Port 8081 erreicht, beweist einen funktionierenden Stack. Die IP-Adresse des Gasts wird gebraucht; sie steht im MacTCP- beziehungsweise TCP/IP-Kontrollfeld.
Vorbereitung auf dem ODROID
Wichtig und leicht zu verwechseln: Auf dem Server wird kein X-Server installiert. Kein xorg, kein xserver-xorg. Gebraucht werden nur die Client-Bibliotheken und ein paar Testprogramme.
# Paketquellen zeigen ins Archiv, sonst schlaegt jede Installation fehl
sudo sed -i 's|archive.ubuntu.com|old-releases.ubuntu.com|g' /etc/apt/sources.list
sudo sed -i 's|security.ubuntu.com|old-releases.ubuntu.com|g' /etc/apt/sources.list
sudo apt-get update
# Nur Clients und Diagnose, kein Server
sudo apt-get install --no-install-recommends x11-apps x11-utils xterm python-tk
x11-apps bringt xclock und xeyes, x11-utils das entscheidende xdpyinfo, python-tk die Tk-Anbindung für Python 2.7 — den Interpreter, der auf diesem Rechner ohnehin die Zielplattform ist.
Die Schritte
1. eXodus starten und den Zugriff öffnen
X-Server lassen nicht jeden zeichnen. eXodus führt eine Liste erlaubter Hosts; dort gehört die Adresse des ODROID hinein. Der elegantere Weg über MIT-MAGIC-COOKIE-1 setzt voraus, dass sich die Cookie-Datei zwischen beiden Rechnern abgleichen lässt — im Zweifel erst mit der Host-Liste arbeiten und die Authentifizierung später nachrüsten.
2. Die Gegenprobe, die alles Weitere entscheidet
Vom ODROID aus, in einer Telnet-Sitzung:
export DISPLAY=<mac-ip>:0 # Adresse des emulierten Macs
xdpyinfo | head -40
Diese eine Ausgabe ist die wichtigste Messung des ganzen Versuchs. Sie nennt Hersteller und Release-Nummer des X-Servers, die Bildschirmgeometrie, die Farbtiefe — und vor allem die Liste der unterstützten Erweiterungen. Danach richtet sich, welches Werkzeug überhaupt in Frage kommt.
Erwartungshaltung: SHAPE und BIG-REQUESTS dürften vorhanden sein, MIT-SHM ist über Netz ohnehin bedeutungslos, und RENDER wird mit einiger Sicherheit fehlen. RENDER kam erst nach X11R6.3. Genau daran hängt die Werkzeugwahl im nächsten Schritt.
3. Die Leiter: drei Programme, drei Beweise
Nicht gleich das Zielprogramm starten. Jede Sprosse beweist etwas anderes:
xclock # Verbindung steht, Grundzeichnen funktioniert
xeyes # Probe auf die SHAPE-Erweiterung
xterm # Kernfonts und Tastaturbelegung funktionieren
Bleibt xclock schwarz, ist es die Verbindung. Startet xeyes nicht oder zeichnet ein Rechteck statt zweier Augen, fehlt SHAPE. Zeigt xterm Kästchen statt Buchstaben, stimmt der Fontpfad des Servers nicht; xlsfonts listet dann, was der Mac tatsächlich anbietet.
4. Die Toolkit-Frage
Hier entscheidet sich, ob das Vorhaben trägt. Alles, was auf GTK aufbaut, scheidet aus. GTK2 zeichnet Text über Xft, Xft setzt RENDER voraus, und RENDER gibt es auf einem R6.3-Server nicht. GTK3 ist ohnehin außer Reichweite.
Was bleibt, ist die Generation davor, und sie passt hervorragend: Athena-Widgets, Motif beziehungsweise LessTif, FLTK — und Tk. Tk ist die naheliegende Wahl, weil es mit Kernfonts arbeitet, wenige Roundtrips erzeugt und über python-tk direkt an die vorhandene Python-2.7-Logik andockt. Die Probe:
echo 'button .b -text "netatalk" -command exit; pack .b' | wish
Erscheint der Knopf, ist der Weg frei.
5. Das Werkzeug
Die Dateilogik wird nicht neu erfunden. Parser, Validierung und die Suche nach dem afpd-Elternprozess über /proc stehen bereits im CGI-Werkzeug; ausgetauscht wird nur die Präsentationsschicht. Als Gerüst für den ersten Durchlauf genügt eine lesende Fassung mit SIGHUP-Knopf:
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""netatalk-admin-x -- Tk-Oberflaeche fuer AppleVolumes.default.
Laeuft auf dem netatalk-Rechner, zeichnet auf einem entfernten X-Server:
export DISPLAY=<mac-ip>:0
python netatalk-admin-x.py
Bewusst nur Kernfonts und einfache Widgets -- der Gegenueber spricht
X11R6.3 und kennt weder RENDER noch Xft.
"""
import os
import shlex
import signal
try:
import Tkinter as tk # Python 2
except ImportError:
import tkinter as tk # Python 3
VOLFILE = "/etc/netatalk/AppleVolumes.default"
def read_volumes():
"""Volume-Zeilen aus AppleVolumes.default, Kommentare uebersprungen."""
found = []
for raw in open(VOLFILE):
stripped = raw.strip()
if not stripped or stripped[0] in "#:~":
continue
try:
parts = shlex.split(stripped)
except ValueError:
continue
if not parts:
continue
path, rest = parts[0], parts[1:]
name = ""
if rest and ":" not in rest[0]:
name, rest = rest[0], rest[1:]
found.append((path, name, rest))
return found
def afpd_master():
"""PID des afpd-Elternprozesses ueber /proc, oder None."""
for entry in os.listdir("/proc"):
if not entry.isdigit():
continue
try:
data = open("/proc/%s/stat" % entry).read()
except IOError:
continue
start, end = data.find("("), data.rfind(")")
if start < 0 or end < 0:
continue
fields = data[end + 2:].split()
if data[start + 1:end] == "afpd" and len(fields) > 1 and fields[1] == "1":
return int(entry)
return None
class App(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack(fill="both", expand=1)
self.status = tk.StringVar()
self.volumes = tk.Listbox(self, width=76, height=12,
font=("Courier", 12))
self.volumes.pack(fill="both", expand=1, padx=6, pady=6)
bar = tk.Frame(self)
bar.pack(fill="x", padx=6)
tk.Button(bar, text="Neu einlesen",
command=self.refresh).pack(side="left")
tk.Button(bar, text="SIGHUP senden",
command=self.sighup).pack(side="left", padx=4)
tk.Label(self, textvariable=self.status,
anchor="w").pack(fill="x", padx=6, pady=6)
self.refresh()
def refresh(self):
self.volumes.delete(0, "end")
for path, name, opts in read_volumes():
label = name or os.path.basename(path.rstrip("/"))
self.volumes.insert("end", "%-20s %s %s"
% (label, path, " ".join(opts)))
pid = afpd_master()
if pid is None:
self.status.set("afpd laeuft nicht")
else:
self.status.set("afpd PID %d" % pid)
def sighup(self):
pid = afpd_master()
if pid is None:
self.status.set("Kein afpd-Elternprozess gefunden.")
return
os.kill(pid, signal.SIGHUP)
self.status.set("SIGHUP an PID %d gesendet." % pid)
if __name__ == "__main__":
root = tk.Tk()
root.title("netatalk-admin")
App(root).mainloop()
Das Schreiben — Formular, Validierung, temporäre Datei plus os.rename, Sicherungskopie — wird aus dem CGI-Werkzeug übernommen, sobald das Gerüst steht. Vorher lohnt sich der Aufwand nicht.
6. Kür: ohne Telnet starten
Solange das Werkzeug aus einer Telnet-Sitzung gestartet wird, ist der Umweg über die Shell nicht verschwunden, sondern nur versteckt. Die saubere Fassung ist XDMCP: eXodus beherrscht XDM, der Mac schickt eine Anfrage auf UDP 177 an den ODROID, und der antwortet mit einem Anmeldefenster. Dafür muss auf dem Server xdm installiert, der Anfrageport in xdm-config freigeschaltet und der Mac in Xaccess eingetragen werden.
Das ist die Stufe, auf der aus dem Experiment ein benutzbarer Arbeitsplatz wird — und gleichzeitig die mit dem größten Aufwand. Erst wenn Stufe 5 läuft.
Ergebnis-Check
Der Versuch gilt als gelungen, wenn diese fünf Punkte erfüllt sind:
xdpyinfoliefert eine vollständige Ausgabe, inklusive Erweiterungsliste.xclockzeichnet und aktualisiert sich.xtermzeigt lesbare Zeichen und nimmt Tastatureingaben an.- Die Tk-Probe erscheint als Knopf und beendet sich per Klick.
- Das Werkzeug listet dieselben drei Volumes, die auch die HTML-Fassung zeigt, und der SIGHUP-Knopf verändert die PID-Anzeige nicht — er sendet nur.
Festzuhalten für den späteren Log wären: die vollständige xdpyinfo-Ausgabe, die Zeit vom Aufruf bis zum sichtbaren Fenster, der Speicherverbrauch von eXodus und ob die Fensterdarstellung beim Scrollen zusammenbricht.
Was schiefgehen kann
| Symptom | Wahrscheinliche Ursache | Gegenmittel |
|---|---|---|
| Verbindung wird abgewiesen | ODROID steht nicht in der Host-Liste von eXodus | Adresse eintragen, eXodus neu starten |
| Programm startet, nichts erscheint | DISPLAY zeigt auf die falsche Adresse oder auf den Host statt auf den Gast | Adresse im TCP/IP-Kontrollfeld des Macs prüfen |
| Kästchen statt Buchstaben | angeforderter Font fehlt auf dem Server | xlsfonts befragen, auf fixed oder Courier ausweichen |
| Programm bricht mit Xft- oder RENDER-Meldung ab | GTK-basiertes Werkzeug | Toolkit wechseln, Tk oder Athena |
| Tasten landen falsch | fehlendes XKB, Rückfall auf die Core-Tastaturbelegung | xmodmap -pk vergleichen, Belegung nachziehen |
| Farbflackern beim Fensterwechsel | 8-Bit-Farbtiefe, konkurrierende Colormaps | private Colormap vermeiden, Programme mit wenig Farben nutzen |
| eXodus stürzt beim Öffnen großer Fenster ab | Speicherzuteilung der Anwendung zu klein | Basilisk-RAM und Programm-Partition erhöhen |
Die ehrliche Einordnung
Dieser Weg wird die HTML-3.2-Lösung nicht ersetzen, und er soll es auch nicht.
Der Formularserver braucht auf dem Mac nichts als einen Browser, läuft in einem winzigen Speicherfenster, übersteht jeden Neustart und funktioniert im Zweifel auch von einem anderen Vintage-Rechner aus. Der X11-Weg braucht eine installierte, freigeschaltete Anwendung, zweistellige Megabyte Arbeitsspeicher, eine laufende Sitzung und eine Netzverbindung in die ungewohnte Richtung.
Was er dafür bietet, ist eine echte Oberfläche statt eines Formulars: Listen mit Auswahl, sofortige Rückmeldung, kein Neuladen der Seite nach jedem Klick. Und er beantwortet eine Frage, die im Rückblick auf die historischen Werkzeuge offengeblieben ist — nämlich wie sich das anfühlt, was Anfang der Neunziger die einzige Möglichkeit gewesen wäre, Unix-Administration grafisch auf einen 68k-Mac zu holen.
Der Aufwand steht in keinem Verhältnis zum Nutzen. Das ist bei diesem Aufbau seit jeher der Punkt.
