NeXTnet: Das Verzeichnis für NeXT-Rechner und sein Plan
NeXTnet ist ein Verzeichnis für NeXT-Rechner: Eine App auf der Maschine registriert sie und meldet Modell, Ausstattung und Laufzeit, eine Website zeigt jede registrierte Maschine mit Besitzer, Standort und Online-Zustand, und eine Weltkarte zeigt, wo sie stehen. Dieses Paper ist der Plan: NeXTSTEP 3.3 und OPENSTEP 4.2 auf schwarzer Hardware, ein Inventar aus Mach-Aufrufen und dem Start-Protokoll des Kernels, ein Protokoll mit signierten Anfragen über Klartext-HTTP, ein Rust-Backend mit PostgreSQL und eine Astro-Website als Container, die sich zwischen Hosts nur in Umgebungsvariablen unterscheiden, ein Client in Objective-C aus AppKit-App und Meldeprozess, ein Repository für alles und vier Lieferphasen.
Inhalt
- Was NeXTnet ist
- Gegenstand und Grenzen
- Zielplattformen
- Hardware-Inventar unter NeXTSTEP
- Werkzeugkette und Entwicklungsumgebung
- Protokoll und Sicherheit
- Datenmodell und Datenschutz
- Backend, Website und Betrieb
- Der Globus
- Der Client: AppKit-App und Meldeprozess
- Repository und Lieferphasen
- Quellennachweis
Anhang
1. Was NeXTnet ist
NeXTnet ist ein Verzeichnis für NeXT-Rechner. Ein Besitzer legt auf der Website ein Konto und darin seine Maschine an. Auf der Maschine selbst registriert die AppKit-App die NeXT mit einem Code von der Website, und ein Meldeprozess sendet von da an die Ausstattung der Maschine und alle zehn Minuten ein Lebenszeichen. Die Website zeigt jede registrierte Maschine: welches Modell es ist, wie es ausgestattet ist, wem es gehört, wo es steht, ob es online ist und wie lange es läuft. Eine Weltkarte zeigt die Standorte.
Der Client läuft unter NeXTSTEP 3.3 und OPENSTEP 4.2 auf der Hardware von NeXT. Backend und Website laufen als Container und sind so zugeschnitten, dass dieselben Dienste ohne Änderung des Codes auf jedem Host laufen, der Container ausführt.
2. Gegenstand und Grenzen
Dieses Paper plant NeXTnet. Jede Aussage über NeXTSTEP und OPENSTEP nennt ihre Quelle: die Entwicklerdokumentation von NeXTSTEP 3.3, das Support-Archiv NeXTanswers, Handbuchseiten, einen Kernel-Quelltext von NeXT oder den Quelltext des Emulators Previous. Kein Programm wurde auf einem NeXTSTEP-System ausgeführt. Was sich nur dort klären lässt, steht als offen im Text und als Prüfpunkt in Anhang B. Die Rohnotizen der Recherche liegen unter sources/ neben diesem Dokument.
3. Zielplattformen
Der Client, die AppKit-App mit ihrem Meldeprozess, unterstützt NeXTSTEP 3.3 und OPENSTEP 4.2 auf der schwarzen Hardware von NeXT, also den 68040-Maschinen NeXTcube, NeXTstation und ihren Turbo- und Color-Varianten sowie dem 68030-Cube. NeXTSTEP 3.3 wird zuerst gebaut, weil es auf jeder dieser Maschinen läuft1 und der Stand ist, den der Emulator Previous und das Projekt Previously vorbereiten.2 OPENSTEP 4.2 für Mach folgt im selben Schritt, weil es auf derselben Hardware läuft und die letzte gefundene Ausgabe für sie ist.3
Die beiden Systeme haben eine Schnittstelle gemeinsam und unterscheiden sich in einer zweiten. Foundation ist auf beiden da: in 3.3 als statische Bibliothek mit 22 Klassen, die NeXT als OpenStep-konform bezeichnet, in 4.2 als Framework nach dem Foundation-Teil der OpenStep-Spezifikation. Code gegen die 3.3-Bibliothek muss für 4.x neu übersetzt werden, läuft dann aber gegen dieselben Klassen.45 Das Application Kit ist auf beiden ein anderes: Das von 3.3 steht auf der Wurzel Object, das von OpenStep auf NSObject mit neuen Namen, und NeXT beschreibt den Weg vom einen zum anderen als Konvertierung des Quelltexts mit tops-Skripten in sechs Stufen, nicht als Schicht, die beides ausführt.5
Daraus folgt der Zuschnitt. Alles, was nicht Oberfläche ist, also Protokoll, Signatur, Inventar, Dateien und die Steuerung der App, ist eine Quelle in Objective-C auf Foundation und wird zweimal übersetzt: auf dem 3.3-Abbild gegen die statische Bibliothek, auf dem 4.2-Abbild gegen das Framework. Der Meldeprozess besteht nur aus dieser Quelle. Die AppKit-App hat darüber zwei dünne Oberflächenschichten, eine gegen das Application Kit von 3.3 und eine gegen das OpenStep Application Kit, jede mit ihren Nib-Dateien aus dem Interface Builder des jeweiligen Systems. Beide rufen denselben Controller in der Bibliothek, so dass jede Entscheidung genau einmal existiert und die Schichten nichts enthalten als die Verbindung von Control und Aufruf. Das kostet zwei Entwicklungsabbilder in Previous, zwei Build-Ziele im Makefile, zwei Nib-Sätze, zwei Installer-Pakete je Ausgabe, weil die Binaries je System gegen eine andere Foundation gelinkt sind, und einen Testlauf auf jedem System vor jedem Release. Ob ein 3.3-Binary auf 4.2 unverändert läuft, ist offen (Anhang B). Läuft es, reicht für den Meldeprozess ein Build für beide Systeme, und die 4.2-Schicht der App bleibt für das native Aussehen.
NeXTSTEP 3.3 lief auch auf Intel-PCs, auf HP 9000 der Serien 712 bis 755 und auf SPARCstation 5, 10 und 20.1 Das Verzeichnis nimmt solche Maschinen an und führt die Architektur als Feld, weil ein Besitzer sein NeXTSTEP auf einem HP 712 genauso zeigen will und der Client dafür nur ein Fat Binary mehr braucht. In der Liste und auf dem Globus sind sie standardmäßig sichtbar und als Fremdhardware gekennzeichnet, weil ein Besitzer seine Maschine anlegt, damit man sie sieht; in der Bestenliste zählen sie nicht. Emulatoren werden ebenfalls angenommen, sind genauso sichtbar und als solche gekennzeichnet, mit den Merkmalen aus Abschnitt 4, weil Previously selbst ein Emulator ist und seine Nutzer dieselben Besitzer sind. Gebaut wird der Client zuerst für m68k; die Fat Binaries für Intel, PA-RISC und SPARC stehen im Backlog, und Maschinen dieser Architekturen erscheinen, sobald es sie gibt.
4. Hardware-Inventar unter NeXTSTEP
NeXTSTEP hat kein Werkzeug, das die Hardware einer Maschine als Liste zeigt. Was ein Programm über die eigene Maschine erfährt, kommt aus Mach-Aufrufen, aus dem Kernel-Protokoll des Starts und aus wenigen Werkzeugen. Tabelle 1 ist der Plan: Welche Angabe der Client sammelt, woher, und wie sicher die Quelle ist.
| Angabe | Quelle | Stand |
|---|---|---|
| CPU-Familie und -Typ (68030, 68040, i486, PA-RISC, SPARC), Anzahl CPUs | host_info() mit HOST_BASIC_INFO: cpu_type, cpu_subtype, max_cpus, avail_cpus6 | belastbar |
| Arbeitsspeicher | Dasselbe, Feld memory_size in Bytes6 | belastbar |
| Kernel und Betriebssystem | host_kernel_version() liefert die Zeile NeXT Mach 3.3: ..., die auch hostinfo als erste Zeile druckt67 | belastbar |
| Lastwerte | processor_set_info() mit PROCESSOR_SET_BASIC_INFO: load_average und mach_factor, skaliert mit LOAD_SCALE6 | belastbar |
| CPU-Takt, Systemtyp, Board-Revision | Drei Zeilen der Ausgabe von hostinfo auf 3.3 (Processor speed: 33 MHz, System type: 5, Board revision: 0xf); der Aufruf dahinter ist in keiner Dokumentation beschrieben, der Client parst deshalb die Ausgabe7 | schwach |
| Modell (NeXTcube, NeXTstation, Color, Turbo) | Der Kernel kennt den Maschinentyp aus einem Steuerregister, veröffentlicht aber nur den CPU-Typ8; der Besitzer wählt das Modell bei der Registrierung aus einer Liste, die der Server liefert | belastbar |
| Platten | Zeilen des Start-Protokolls in /usr/adm/messages, etwa MAXTOR XT-8360S as sd0 at sc0 target 1 lun 0 und Disk capacity: 660MB9; als zweiter Weg die ioctls DKIOCINFO und SDIOCGETCAP des Treibers sd(4)10 | schwach |
| Bildschirm | Grenzen, Farbtiefe und Anzahl der Bildschirme über NXScreen und getScreens:count: des Application Kit, also nur mit Verbindung zum Window Server; die Bildschirmdatensätze in NetInfo unter /localconfig/screens sind von der Shell lesbar, aber nicht immer vollständig11 | schwach |
| Ethernet-Adresse | Die Zeile en0: Ethernet address des Start-Protokolls9; gethostid() liefert nur die unteren drei Bytes, der Präfix 00:00:0f gehört NeXT1012 | schwach |
| Uptime | Kein dokumentierter Aufruf; w und uptime zeigen sie, der Client parst die Kopfzeile von w10 | schwach |
| Seriennummer | Weder der NVRAM-Datensatz noch die Struktur des ROM-Monitors noch Mach kennen eine8 | keine |
Die Ethernet-Adresse ist das einzige hardwaregebundene Merkmal einer schwarzen Maschine. Sie wird darum als Fingerabdruck mitgeschickt, um dieselbe Maschine beim zweiten Registrieren zu erkennen, aber sie ist nicht die Identität. Die Identität ist das Credential aus Abschnitt 6.
Emulatoren erkennt der Server an Merkmalen, die Previous aus seiner Konfiguration baut: eine der festen Ethernet-Adressen seiner ROM-Abbilder (00:00:0f:00:30:90, 00:00:0f:00:f3:02, 00:00:0f:12:34:56), der Hersteller Previous in der SCSI-Kennung unbekannter Plattenabbilder, der Hostname previous und die Adresse 10.0.2.15 des emulierten Netzes.213 Weil der Besitzer die Adresse ändern kann, bleibt die Erkennung ein Hinweis, und der Besitzer kann die Maschine auf der Website selbst als Emulator kennzeichnen.
Alles in Tabelle 1 mit dem Stand schwach rechnet mit Quellen, die aus Handbuch und Kernel-Quelltext belegt sind, aber nicht auf einem laufenden 3.3 geprüft. Die Prüfung ist der erste Schritt des ersten Builds (Anhang B).
Eine Angabe in Tabelle 1 erreicht nur ein Programm mit Verbindung zum Window Server: der Bildschirm. Grenzen und Farbtiefe jedes angeschlossenen Bildschirms liefert NXScreen, und die Liste aller Bildschirme liefert getScreens:count: der Klasse Application; beides sind Antworten des Window Servers, und ein Prozess, der aus /etc/rc.local startet, hat keine Verbindung zu ihm.11 Der NetInfo-Datensatz unter /localconfig/screens ist von der Shell aus lesbar, aber der Window Server ersetzt fehlende Angaben darin durch Vorgaben, so dass der Datensatz unvollständig sein kann.11 Alle anderen Angaben kommen aus Mach, aus dem Start-Protokoll und aus Werkzeugen, die ein Prozess mit und ohne Window Server gleich erreicht. Die Oberfläche hat damit beim Bildschirm einen echten Vorsprung, und Abschnitt 10 zieht daraus die Folge für die Form des Clients.
5. Werkzeugkette und Entwicklungsumgebung
Entwickelt wird mit den Werkzeugen, die NeXTSTEP 3.3 Developer mitbringt. Tabelle 2 nennt sie.
| Was | Werkzeug unter NeXTSTEP 3.3 | Unter OPENSTEP 4.2 |
|---|---|---|
| Projekt und Build | Project Builder mit dem Projekttyp Tool für den Meldeprozess und Application für die AppKit-App; er erzeugt PB.project und ruft make mit den Makefiles aus /NextDeveloper/Makefiles, Eigenes steht in Makefile.preamble1415 | Project Builder mit den Makefiles unter pb_makefiles, wählbar über MAKEFILEDIR5 |
| Oberfläche | Interface Builder, Nib-Dateien als Pakete1 | Interface Builder |
| Compiler | cc, NeXTs GNU C auf Basis von GCC 2.5.8, ANSI C, Objective-C mit Protokollen, Kategorien, @selector und @encode; ohne @try161718 | cc auf Basis von GCC 2.7.2.15 |
| Fat Binary | cc -arch m68k -arch i386 ..., in 3.1 nur diese beiden Werte dokumentiert16; ob 3.3 auch sparc und hppa annimmt, ist offen | m68k, i386, sparc, hppa5 |
| Frameworks | Foundation als libFoundation_s.a mit 22 Klassen, darunter NSObject, NSString, NSData, NSDictionary, NSArray, NSDate und NSException194; daneben die Common Classes mit der Wurzel Object, die das Application Kit von 3.3 verwendet20 | Foundation und Application Kit als Frameworks nach der OpenStep-Spezifikation5 |
| Netz | BSD-Sockets und select; gethostbyname fragt über lookupd NetInfo und DNS21; keine HTTP-Klasse in Foundation, kein TLS von NeXT4 | Dasselbe; NSFileHandle für Sockets ab 4.25 |
| Paket | Installer-Paket, ein Verzeichnis mit .tar.Z, .bom, .info und .sizes, gebaut mit /NextAdmin/Installer.app/package, mit post_install für Verzeichnis und Starteintrag22 | Dasselbe Format |
| Start beim Booten | Eine Zeile in /etc/rc.local, dem Ort für lokale Ergänzungen des Starts2324 | Dasselbe |
Der Client wird in Objective-C geschrieben, mit Foundation als Grundlage, weil Foundation auf 3.3 und 4.2 vorhanden ist und so Protokoll, Inventar und Zustand in beiden Builds dieselbe Quelle haben. Das Application Kit kommt nur in der AppKit-App vor. Netzcode ist BSD-Sockets in C, in eine Objective-C-Klasse gefasst.
Entwickelt wird in NeXTSTEP 3.3 und OPENSTEP 4.2 im Emulator Previous auf phrancks Mac, mit den beiden Plattenabbildern, die Previously vorbereitet. Previous teilt mit SLiRP und seinem NetInfo-Server automatisch einen Ordner des Mac unter /Net in das Gastsystem, so dass der Quelltext auf dem Mac liegt und im Gast gebaut wird.13 Das Gastsystem erreicht das Netz über das Gateway 10.0.2.2 und den DNS 10.0.2.3 des Emulators, der Client kann also aus Previous heraus gegen den Server getestet werden.13 Ob die Abbilder die Developer-Werkzeuge unter /NextDeveloper enthalten, ist der erste Prüfpunkt; falls nicht, werden sie von der Developer-CD des jeweiligen Systems nachinstalliert.
Auf eine echte NeXT-Maschine kommt das Paket über das Netz. Der Besitzer lädt den Tarball mit dem Paket auf einem heutigen Rechner herunter und kopiert ihn per FTP oder NFS auf die NeXT; beide gehören zum System, und ein HTTP-Client wie lynx ist Zusatzsoftware aus dem Peanuts-Archiv.25 Dort öffnet der Besitzer das Paketsymbol, und der Installer installiert es.22
Der erste Build soll sechs Dinge klären: ob der Compiler von 3.3 die geplante Objective-C-Form und ANSI-Prototypen so annimmt, wie der Quelltext sie schreibt; welche Werte host_info, hostinfo und das Start-Protokoll in Previous liefern und wo sie von einer echten Maschine abweichen; ob ein Prozess ohne Root /usr/adm/messages lesen darf; wie groß das gelinkte Binary ist und was es an Speicher braucht, bei 16 MB als kleinster und 24 MB als empfohlener Ausstattung der NeXT-Rechner26; ob die Verbindung aus dem Gast über SLiRP den Server erreicht; und ob das 3.3-Binary auf dem 4.2-Abbild startet.
6. Protokoll und Sicherheit
Ein NeXTSTEP ohne Zusatzsoftware kann kein TLS. Die Ports von OpenSSL, die es für 3.3 und 4.2 gibt, sind Stände der Serien 0.9 und 1.0.2; bei einem Test der RSA-Prüfung auf 68k schlug die Signaturprüfung fehl, und ein weiterer Bericht nennt fehlende Zufallsquellen.32728 Der Client spricht deshalb Klartext-HTTP, und die Sicherheit liegt in der Nachricht, nicht im Transport: Jede Anfrage ist mit einem Schlüssel signiert, den nur diese Maschine und der Server kennen, und der Schlüssel verlässt die Maschine nie.
Registrierung
Der Besitzer meldet sich auf der Website an, die nur über HTTPS erreichbar ist, und legt dort eine Maschine an. Die Website zeigt einen Einlösecode, zwanzig Zeichen in fünf Gruppen, mit 100 Bit Zufall, der fünfzehn Minuten gilt und genau einmal eingelöst werden kann. Auf der NeXT gibt der Besitzer den Code im Registrieren-Panel der AppKit-App ein. Der Code hat einen öffentlichen Teil, der die wartende Registrierung benennt, und einen geheimen Teil.
Der Client sendet die Registrierung mit dem öffentlichen Teil und dem Inventar und signiert sie mit dem geheimen Teil. Der geheime Teil wird nicht gesendet. Beide Seiten leiten daraus denselben Maschinenschlüssel ab, K = HMAC-SHA-256(Geheimnis, "nextnet-machine-key" || Maschinenkennung). Der Server speichert K zur Maschine, der Client legt K nach /etc/nextnet/machine.key mit Rechten nur für Root. Weil der Code nur über HTTPS angezeigt wird und nie über die Leitung geht, kann ein Mitleser der Registrierung weder den Code noch K gewinnen. Mit 100 Bit ist auch das Durchprobieren gegen eine aufgezeichnete Signatur aussichtslos. Nach fünf falschen Signaturen auf einen Code ist der Code verbrannt.
Signierte Anfragen
Jede weitere Anfrage hat vier Kopfzeilen: die Maschinenkennung, einen Zähler, eine Nonce und die Signatur HMAC-SHA-256(K, Methode || Pfad || Zähler || Nonce || SHA-256(Body)). Der Zähler steigt mit jeder Anfrage und steht auf der Maschine in /etc/nextnet/counter; der Server nimmt nur einen Zähler an, der größer ist als der letzte gesehene, und merkt sich die Nonce der letzten Stunde. Damit ist eine Wiederholung erkannt, ohne dass die Uhr der Maschine stimmen muss, und das ist wichtig, weil die Pufferbatterien dieser Maschinen oft leer sind. Die Zeit im Body ist Information, nicht Prüfmerkmal. SHA-256 und HMAC sind wenige hundert Zeilen C und laufen auf einem 68040 ohne Mühe.
| Nachricht | Signiert | Inhalt | Antwort |
|---|---|---|---|
GET /v1/models | nein | keiner | Die Modellliste zur Auswahl bei der Registrierung |
GET /v1/time | nein | keiner | Die Serverzeit, damit der Client eine falsche Uhr erkennt und meldet |
POST /v1/enroll | mit dem Code | Öffentlicher Codeteil, gewähltes Modell, Inventar, Version des Clients | Maschinenkennung, Bestätigung |
POST /v1/inventory | mit K | Das Inventar aus Tabelle 1 | Bestätigung |
POST /v1/status | mit K | Uptime, Lastwerte, Version, Zeit der Maschine; alle zehn Minuten vom Meldeprozess | Bestätigung, auf Wunsch die Bitte um ein frisches Inventar |
POST /v1/offline | mit K | keiner; beim Herunterfahren | Bestätigung |
Anfragen und Antworten sind JSON. Antworten sind flach und klein, damit der Client sie mit einem kleinen eigenen Parser liest. Online ist eine Maschine, deren letzter Status höchstens 25 Minuten alt ist, also zwei Meldungen plus Reserve.
Was der Server glaubt
Der Server glaubt der Signatur, dass die Anfrage von der Maschine kommt, deren Kennung sie nennt. Dem Inhalt glaubt er nicht: Jedes Feld wird auf Typ, Länge und erlaubte Zeichen geprüft, das Inventar auf höchstens 200 Einträge, der Body auf höchstens 32 KB. Der Besitzername kommt nie vom Client, sondern vom Konto auf der Website. Tabelle 4 nennt die Grenzen.
| Gegen | Maßnahme |
|---|---|
| Wiederholung | Steigender Zähler je Maschine und Nonce-Speicher über eine Stunde |
| Raten des Codes | 100 Bit Zufall, fünfzehn Minuten Gültigkeit, fünf Fehlversuche, höchstens zehn Registrierungsversuche je Adresse und Stunde |
| Flut | Höchstens eine Statusmeldung je Maschine in fünf Minuten, höchstens ein Inventar je Stunde, Body bis 32 KB, 200 Inventareinträge |
| Ausprobieren von Kennungen | Unbekannte Kennung und falsche Signatur antworten gleich und knapp; Fehlversuche je Adresse werden gezählt und gebremst |
| Verlorener Schlüssel | Der Besitzer löscht die Maschine auf der Website oder registriert sie mit neuem Code; ein neuer Schlüssel setzt den Zähler zurück |
Trennung von Client-API und öffentlicher API
Der Client-Endpunkt und die Website haben zwei Hostnamen und zwei Ports im Backend. Die Website liegt hinter HTTPS und liefert unter /api/v1 die öffentliche Lese-API für Listen, Details und Karte; Anmeldung und alles, was ein Konto betrifft, gibt es nur dort. Der Client-Host antwortet ausschließlich auf die Nachrichten aus Tabelle 3 über Klartext-HTTP, ohne Zertifikat und ohne Umleitung auf HTTPS, weil die NeXT beidem nicht folgen könnte; der Reverse Proxy vor dem Backend muss diesen einen Host unverschlüsselt durchreichen. Der Client löst den Namen bei jedem Lauf auf und enthält keine feste Adresse, weil der Host hinter dem Namen wechseln kann und sich Adressen über die Lebensdauer eines Projekts ändern.
Der Client nimmt die Basisadresse des Servers aus seiner Konfigurationsdatei /etc/nextnet/nextnet.conf. Wer die Strecke aus seinem LAN zusätzlich verschlüsseln will, schreibt dort die Adresse eines Reverse Proxy im eigenen Netz hinein, der mit TLS an den Server weiterreicht; das Repository liefert dafür eine Beispielkonfiguration eines Reverse Proxy mit. Die Signaturen bleiben dieselben, der Server behandelt beide Wege gleich.
7. Datenmodell und Datenschutz
| Entität | Felder |
|---|---|
| Besitzer | Kennung, Alias (öffentlich), Name (öffentlich nur nach eigener Freigabe), E-Mail (für die Anmeldung per Link), Zeitpunkt und Fassung der Einwilligung und der Namensfreigabe |
| Maschine | Öffentliche Kennung, Besitzer, Name, Modell aus der Liste, Klasse (NeXT-Hardware, Fremdhardware, Emulator), Architektur, Betriebssystem, Registrierdatum, zuletzt gesehen, Schlüssel K, letzter Zähler, Standort mit Genauigkeitsstufe |
| Inventar | Maschine, Zeitpunkt, die Angaben aus Tabelle 1 als Felder, dazu das rohe Start-Protokoll des Kernels bis 8 KB; die Ethernet-Adresse nur als Hash |
| Statusprobe | Maschine, Eingang, Uptime, Lastwerte, Client-Version; roh 90 Tage, danach zu Tageswerten verdichtet, aus denen Gesamt-Uptime und längste Uptime folgen |
| Registrierung | Öffentlicher Codeteil, Hash des Geheimnisses, Maschine, Ablauf, Fehlversuche |
| Modellliste | Name, Klasse, Hersteller, CPU-Typen, zu denen er passt; gepflegt im Backend, geliefert an Client und Website |
Der Standort gehört zur Maschine, nicht zum Besitzer, weil ein Besitzer Maschinen an mehreren Orten haben kann. Der Besitzer setzt ihn auf der Website durch einen Klick in die Karte oder durch Eingabe von Koordinaten. Die Vorgabe rundet auf ein Zehntelgrad, das sind rund elf Kilometer, weil diese Genauigkeit die Weltkarte füllt und die Wohnung nicht verrät; „genau“ wählt der Besitzer je Maschine. Ohne Standort erscheint die Maschine nicht auf dem Globus.
| Öffentlich | Privat |
|---|---|
| Alias des Besitzers oder, nach seiner Freigabe, sein Name, Maschinenname, Modell, Klasse, Architektur, Betriebssystem, Inventar der Hardware, Online-Zustand, Uptime und Gesamt-Uptime, Registrierdatum, gerundeter Standort, sofern gesetzt | E-Mail, Name, sofern nicht freigegeben, Schlüssel K, Zähler, genaue Koordinaten, sofern nicht freigegeben, Hash der Ethernet-Adresse, IP-Adressen, Fehlversuche |
Alias, Maschinenname, Inventar und Standort sind personenbezogene Daten nach Art. 4 Nr. 1 DSGVO, sobald sie einer Person zugeordnet werden können, und die Verordnung gilt in Österreich unmittelbar, ergänzt durch das Datenschutzgesetz.2930 Verantwortlicher ist phranck in Bregenz. Rechtsgrundlage für die Veröffentlichung ist die Einwilligung nach Art. 6 Abs. 1 lit. a, die der Besitzer beim Anlegen des Kontos mit einem eigenen Häkchen gibt und jederzeit widerrufen kann; die Informationen nach Art. 13 stehen auf einer Datenschutzseite der Website in Deutsch und Englisch. Der Alias ist die Vorgabe für den öffentlichen Namen, weil niemand seinen Namen zeigen muss, um teilzunehmen; wer ihn zeigen will, gibt das im Konto als eigene Einwilligung frei und nimmt es jederzeit zurück, worauf die Website wieder den Alias zeigt. Der Besitzer löscht Maschinen und Konto selbst, und mit dem Konto gehen alle Proben, Inventare und Standorte (Art. 17). IP-Adressen stehen nur in den Logs des Reverse Proxy und werden nach sieben Tagen gelöscht; die Zähler gegen Missbrauch rechnen mit gesalzenen Hashes der Adresse. Aufsichtsbehörde ist die österreichische Datenschutzbehörde.31
8. Backend, Website und Betrieb
Das Backend wird in Rust geschrieben, das Frontend in TypeScript. Jeder Dienst ist ein Container-Image, seine Konfiguration kommt ausschließlich aus Umgebungsvariablen, und eine Beschreibung des Deployments im Ordner deploy/ legt die Dienste an. So läuft derselbe Stand auf jedem Host, der Container ausführt, und ein Wechsel des Hosts ändert nichts am Code.
| Dienst | Technik | Container und Konfiguration |
|---|---|---|
| backend | Rust 1.99 stabil, axum 0.8 auf tokio, sqlx 0.9 mit eingebetteten Migrationen, tower-http, serde, hmac und sha2, utoipa für die OpenAPI-Beschreibung, tracing3233; ein Prozess mit zwei Listenern, Port 3000 für Website-API und Konto, Port 3001 nur für den Client-Endpunkt | Multi-Stage-Dockerfile rust:1-alpine nach alpine; die Migrationen laufen als Unterbefehl des Binarys vor dem Start |
| web | Astro 7 mit SSR über @astrojs/node, React 19 nur als Insel für den Globus, UnoCSS, TypeScript 5, oxlint und oxfmt, vitest, TSDoc mit typedoc, knip34 | Container node:22-alpine, Build mit astro build, Start node dist/server/entry.mjs, erreicht das Backend als http://backend:3000 |
| db | PostgreSQL | Container postgres:18-alpine mit eigenem Volume; den Verbindungsstring bekommt das Backend aus seiner Umgebung |
| edge | Reverse Proxy des Hosts | Beendet TLS für die Website und leitet /api/* auf backend:3000 und alles andere auf web:3000; reicht den Client-Host unverschlüsselt und ohne Umleitung auf backend:3001 durch |
axum, weil es die Bibliothek des tokio-Ökosystems ist, Middleware aus Tower übernimmt und damit Ratenbegrenzung, Logging und Zeitlimits ohne eigenen Unterbau liefert; sqlx, weil es Abfragen beim Kompilieren gegen das Schema prüft und Migrationen in das Binary einbettet, so dass der Datenbankstand mit dem Binary reist. Astro mit React-Inseln, UnoCSS, oxlint und oxfmt sind die Konventionen, die phrancks andere Web-Projekte schon verwenden; der Globus braucht WebGL und bekommt die eine React-Insel.
Die Migrationen laufen vor dem Start des Dienstes als Unterbefehl des eigenen Binarys, in das sqlx sie einbettet; der Datenbankstand reist so mit dem Binary. Vor der ersten Migration prüft das Binary die Rolle: Es liest current_user und rolsuper, bricht bei einem Superuser oder einer anderen Rolle als DB_MIGRATION_ROLE ab und läuft auf jedem Host gleich.
Ein Stand für jeden Host
Von den Ordnern des Repositorys (Abschnitt 11) zählen für die Serverseite drei: backend/ (Cargo-Projekt), web/ (Astro-Projekt, npm) und deploy/ mit der Compose-Datei für die drei Dienste, dem Schnipsel für den Reverse Proxy und je einer Beschreibung des Deployments für jeden Host, auf dem der Stand laufen soll. Zwischen den Hosts unterscheidet sich nichts im Code, nur die Umgebungsvariablen aus Tabelle 8, die jeder Host auf seine Weise setzt.
| Variable | Dienst | Inhalt |
|---|---|---|
| DATABASE_URL | backend | Verbindung als Anwendungsrolle, vom Host gesetzt |
| DB_MIGRATION_ROLE | backend | Erwartete Rolle vor der Migration, kein Superuser |
| NEXTNET_WEB_PORT | backend | Port für Website-API und Konto, 3000 |
| NEXTNET_CLIENT_PORT | backend | Port für den Client-Endpunkt, 3001 |
| NEXTNET_PUBLIC_URL | backend, web | Öffentliche Adresse der Website mit https://, für Links in Mails und Seiten |
| NEXTNET_CLIENT_URL | backend, web | Basisadresse des Client-Endpunkts mit http://, wird dem Besitzer beim Registrieren angezeigt |
| SESSION_SECRET | backend | Schlüssel der Sitzungen des Kontos; Secret |
| MAIL_API_KEY | backend | Schlüssel des Dienstes, der die Anmelde-Links versendet; Secret |
| API_URL | web | http://backend:3000/api/v1, weil die Dienste sich intern unter ihrem Namen erreichen |
| RUST_LOG | backend | Logstufe |
Vom Host braucht der Client-Endpunkt nur eines: einen Hostnamen, den der Reverse Proxy unverschlüsselt und ohne Umleitung an Port 3001 durchreicht. Kann ein Host das nicht, bekommt der Endpunkt einen eigenen Port, und die Basisadresse in der Konfiguration des Clients nennt ihn.
Gates vor jedem Deploy: cargo fmt --check, cargo clippy ohne Warnungen, cargo test; im Web oxlint, astro check, vitest und ein Build. Die CI des Repositorys führt sie bei jedem Pull Request aus.
9. Der Globus
Der Globus ist eine Seite der Website unter /globe, gebaut mit three-globe auf Three.js als React-Insel.35 Er zeigt jede Maschine mit Standort als Marker in der Genauigkeit, die der Besitzer gewählt hat, Fremdhardware und Emulatoren eingeschlossen und mit ihrer Klasse gekennzeichnet, grün für online und grau für offline, mit Besitzername, Maschinenname und Modell beim Zeigen. Die Daten kommen aus GET /api/v1/markers, das nur die freigegebenen Felder liefert. Eine native Globus-App für NeXTSTEP steht im Backlog.
10. Der Client: AppKit-App und Meldeprozess
Der Client ist die AppKit-App, im Workspace laufend, und sie ist der einzige Client, weil sie beim Bildschirm mehr über die Hardware erfährt als ein Programm im Terminal (Abschnitt 4). Sie ist eine Neuentwicklung in Objective-C für NeXTSTEP; Namen, Protokoll, Datenformat und Paket sind eigene Entwürfe. Der Client besteht aus drei Teilen, in dieser Reihenfolge gebaut:
- Die Bibliothek
libnextnetkommt zuerst. Sie enthält das Inventar nach Tabelle 1, SHA-256 und HMAC, den JSON-Schreiber und den kleinen Leser, den HTTP-Client über BSD-Sockets, die Schlüssel- und Zählerdatei, die Konfigurationsdatei und den Controller der App. Sie ist eine Quelle auf Foundation und wird für 3.3 und 4.2 übersetzt. Sie hat keine Abhängigkeit zum Application Kit, damit sie im Meldeprozess ohne Window Server läuft. - Der Meldeprozess
nextnetdkommt als zweites. Er hat keine Oberfläche und keine Befehle für den Besitzer, nur den Schalter-oncefür eine einzelne Meldung beim Testen. Er startet aus/etc/rc.local, lange vor einer Anmeldung, und läuft als Root, weil Start-Protokoll, Platten-ioctls und Schlüsseldatei Root verlangen. Er sendet den Status alle zehn Minuten, nach dem Start ein Inventar ohne Bildschirmwerte, öffnet nur ausgehende Verbindungen und schreibt seinen Zustand nach/etc/nextnet/state. Ohne Schlüsseldatei tut er nichts. - Die AppKit-App
NeXTnet.app, im Workspace laufend, kommt als drittes. Sie zeigt im Dock-Icon den Online-Zustand, hat ein Panel zum Registrieren mit dem Code, ein Fenster mit Inventar und Zustand und ein Info-Panel. Sie liest den Zustand des Meldeprozesses, ergänzt das Inventar um die Bildschirmwerte aus dem Window Server und sendet es, stößt auf Wunsch eine Statusmeldung an, meldet aber nicht im Takt, damit es einen Melder gibt. Sie besteht aus zwei Oberflächenschichten über demselben Controller, einer gegen das Application Kit von 3.3 und einer gegen das OpenStep Application Kit von 4.2, mit je eigenen Nib-Dateien. Ihre Oberfläche folgt den Regeln der NeXTSTEP-3.3-Interface-Dokumentation, mit Verben auf den Buttons und der Return-Taste auf dem Standard-Button.
Je System ein Paket, NeXTnet-3.3.pkg und NeXTnet-4.2.pkg, installiert alle drei: die Bibliothek wird statisch gelinkt, der Meldeprozess nach /usr/local/libexec/nextnetd, die App nach /LocalApps/NeXTnet.app, und post_install legt /etc/nextnet an und schreibt die Zeile in /etc/rc.local. Der Besitzer bleibt Herr über das Melden: Er registriert mit einem Code, den nur er kennt, und ohne Schlüssel meldet nichts.
Die Aufteilung in App und Meldeprozess folgt aus zwei Grenzen. Eine App im Workspace läuft nur, solange ein Benutzer angemeldet ist und sie gestartet hat; eine NeXT, die am Anmeldefenster steht oder als Server läuft, wäre mit ihr allein nie online. Ein Prozess aus rc.local läuft immer, sieht aber den Bildschirm nicht. Darum meldet der Prozess Status und Inventar, und die App ergänzt einmal pro Sitzung, was nur sie sehen kann. Der Preis ist ein zweites Binary im Paket; der Gewinn ist, dass die Maschine unabhängig von der Anmeldung online ist und das Inventar trotzdem den Bildschirm kennt.
11. Repository und Lieferphasen
Ein Repository für alles: NeXTnet auf phrancks eigener Gitea-Instanz, mit backend/ (Rust), web/ (Astro), client/ mit libnextnet, nextnetd, NeXTnet.app und dem Paketbau, deploy/ für die Dienste und docs/ mit der Protokollbeschreibung, die Server- und Client-Seite gemeinsam lesen. Ein Repository, weil Protokoll und Datenformat an einer Stelle definiert sind und eine Änderung beide Seiten im selben Commit erreicht; der Client-Teil wird auf einer NeXTSTEP-Maschine gebaut und braucht dafür nur seinen Ordner. Issues und Projekt-Board liegen in derselben Gitea-Instanz, und die Phasen werden dort als Issues angelegt. Der Code für Papers ist NXN.
| Phase | Issues | Liefert | Braucht |
|---|---|---|---|
| 1 Server | (1) Backend mit Schema, Migrationen, Client-Endpunkt nach Tabelle 3, Signaturprüfung, Grenzen nach Tabelle 4 und Lese-API. (2) Website mit Liste, Detail, Konto per Anmelde-Link, Maschine anlegen mit Einlösecode, Einwilligung und Datenschutzseite. (3) Betrieb: Container-Images und Compose-Datei für die drei Dienste, Schnipsel für den Reverse Proxy, Beschreibung des Deployments in deploy/, CI mit den Gates. | Ein laufendes Verzeichnis, in dem eine Maschine angelegt, mit einem Testskript vom Mac registriert und gemeldet wird und in der Liste mit Inventar und Online-Zustand erscheint | nichts |
| 2 AppKit-App | (1) libnextnet mit Inventar, Signatur, HTTP, Dateien und Controller sowie der Meldeprozess nextnetd, gebaut auf dem 3.3- und dem 4.2-Abbild, mit den Prüfpunkten aus Anhang B als erstem Schritt, darunter der Nachweis, ob das 3.3-Binary auf 4.2 läuft. (2) NeXTnet.app für 3.3 mit Dock-Icon, Registrieren-Panel, Inventarfenster mit Bildschirmwerten und Info-Panel. (3) Die 4.2-Schicht gegen das OpenStep Application Kit mit eigenen Nib-Dateien über demselben Controller, dazu NeXTnet-3.3.pkg und NeXTnet-4.2.pkg mit post_install, Installationsanleitung und der Beispielkonfiguration für ein Relay im eigenen Netz. | Die erste echte NeXT in der Liste, registriert aus dem Workspace und gemeldet von ihrem Meldeprozess, unter 3.3 wie unter 4.2 | Phase 1 |
| 3 Besitzer und Standort | (1) Kontoverwaltung: Alias ändern, Namen freigeben und die Freigabe zurücknehmen, Maschinen umbenennen, als Emulator kennzeichnen, löschen, Konto löschen. (2) Standort mit Karte und Genauigkeitsstufe, Klassenfilter in der Liste. (3) Statistik: Gesamt-Uptime, längste Uptime, Modellverteilung, Bestenliste über NeXT-Hardware. | Eine Website, die der Besitzer ohne Hilfe pflegt | Phase 1 |
| 4 Globus | (1) /api/v1/markers und die React-Insel mit three-globe. (2) Die Seite /globe mit Legende und Verweis auf die Maschine. | Die Weltkarte der Maschinen | Phase 3 |
Backlog, je ein Issue, sobald die Phase davor steht: Fat Binaries für Intel, PA-RISC und SPARC, die native Globus-App, Screenshots der Maschinen.
Quellennachweis
37 Quellen, in der Reihenfolge ihres Auftretens. Die Seiten der NeXTSTEP-Dokumentation und der Archive sind an den genannten Stellen gelesen, die lokalen Dateien vollständig.
- NeXT: NEXTSTEP 3.3 Release Notes: What’s New in Release 3.3, Abschnitte Platforms und Interface Builder. Spiegel bei nextop.de. Abschnitte gelesen Quelle↩↩↩
- Grabher, A., Schubiger, S., Fétis, G.: Previous 4.5,
readme.previous.txtund die Quelldateiensrc/rom.c,src/rtcnvram.c,src/sysReg.c,src/scsi.c,src/slirp/ctl.him Quellbaum unter~/Developer/Projects/previous. Genannte Dateien gelesen Quelle↩↩ - Peanuts-Archiv: SSLeay Framework 0.9.0 für OPENSTEP 4.2 for Mach, README. Volltext gelesen Quelle↩↩
- NeXT/Apple: NeXTanswers 1905, Foundation in NEXTSTEP 3.3. Volltext gelesen Quelle↩↩↩
- NeXT/Apple: NeXTanswers 2504, Release Notes OPENSTEP 4.2: Compiler GCC 2.7.2.1, Konvertierung mit tops, Makefiles, NSFileHandle, Architekturen. Abschnitte gelesen Quelle↩↩↩↩↩↩↩
- NeXT: Operating System Software, Teil 1 Mach, Kapitel 4: Mach Functions, Einträge
host_info(),host_kernel_version(),processor_set_info(). Einträge gelesen Quelle↩↩↩↩ - jrra: NeXTstation Color, Protokoll einer Installation von NeXTSTEP 3.3 mit der Ausgabe von
hostinfound des ROM-Monitors. Volltext gelesen Quelle↩↩ - NeXT: NeXT Mach kernel, Quelltextstand mk-108.1 (Release 2.0), Spiegel johnsonjh/NeXTMach:
next/next_init.c,next/autoconf.c,next/scr.h,mon/nvram.h,mon/global.h,nextif/if_en.c,bsd/kern_xxx.c. Älter als der 3.3-Kernel mk-171.9. Genannte Dateien gelesen Quelle↩↩ - NeXT: NEXTSTEP 3.3 Network and System Administration, Kapitel 3 Setting Up the Network, 7 Peripherals, 9 Starting Up and Shutting Down, 15 Troubleshooting. Spiegel bei cilinder.be. Abschnitte gelesen Quelle↩↩
- NeXT: NeXTSTEP 3.3 Manual Pages bei man.FreeBSD.org,
manpath=NeXTSTEP+3.3: gethostid(2), hostinfo(1), sd(4), sg(4), scsimodes(8), w(1), if(4N), uname(2P), arch(3). Seiten gelesen Quelle↩↩↩ - NeXT: NEXTSTEP 3.3 Developer Documentation, Release Notes Window Server, Eintrag
setframebuffertransfer; Application Kit, Types and Constants, EinträgeNXScreenundNXWindowDepth; Klassenübersicht des Application Kit, Abschnitt Managing Screens. Einträge gelesen Quelle↩↩↩ - IEEE: MA-L Public Listing, Eintrag 00000F NEXT, INC. Eintrag geprüft Quelle↩
- Grabher, A. u. a.: Previous,
networking.howto.txtundfilesharing.howto.txtim Quellbaum unter~/Developer/Projects/previous. Volltext gelesen Quelle↩↩↩ - NeXT: Development Tools, Kapitel 2: The Project Builder Application. Abschnitte gelesen Quelle↩
- NeXT: NEXTSTEP 3.3 Release Notes: Project Builder, Projekttyp Tool. Volltext gelesen Quelle↩
- NeXT: NEXTSTEP 3.3 Release Notes: Compiler und Fat Files. Volltext gelesen Quelle↩↩
- NeXT: Development Tools, Kapitel 11: The GNU C Compiler. Volltext gelesen Quelle↩
- NeXT: Object-Oriented Programming and the Objective C Language, Anhang A: Objective C Language Summary. Volltext gelesen Quelle↩
- NeXT: Foundation Kit, Introduction. Volltext gelesen Quelle↩
- NeXT: Foundation Kit: Living in a Hybrid World. Volltext gelesen Quelle↩
- Marcum, A. M.: The NetInfo Lookup Server: lookupd, NEXTSTEP In Focus, Sommer 1993, im Archiv NeXTanswers als Nummer 1275. Abschnitte gelesen Quelle↩
- NeXT: Preparing an Application for Installation by the Installer. Volltext gelesen Quelle↩↩
- NeXT: NeXTanswers 1987, Ablauf von
/etc/rcund/etc/rc.netin 3.3. Volltext gelesen Quelle↩ - NeXT: NeXTanswers 1849, Ergänzungen in
/etc/rc.local. Abschnitt gelesen Quelle↩ - NiCE: Peanuts-Archiv, Verzeichnisse mit lynx, gnumake und gzip für NeXTSTEP, gelesen am 2. November 2026. Verzeichnisse gelesen Quelle↩
- NeXT Computer, Inc.: NEXTSTEP, Produktdatenblatt, Spalte „NEXTSTEP for NeXT Computers“ mit CPU- und Speicherangaben, Copyright 1988 bis 1995, Spiegel bei levenez.com. Abschnitt gelesen Quelle↩
- rjbrown99: NeXTStep Software Ports, Wiki, OpenSSL 0.9.6m und wget auf NeXTSTEP 3.3. Volltext gelesen Quelle↩
- rooprob: OS42ssl, OpenSSL 1.0.2 auf OPENSTEP 4.2, README mit dem fehlgeschlagenen RSA-Test auf m68k. Volltext gelesen Quelle↩
- Europäische Union: Verordnung (EU) 2016/679 (Datenschutz-Grundverordnung), Art. 4, 5, 6, 13, 17. Artikel gelesen Quelle↩
- Republik Österreich: Datenschutzgesetz (DSG), geltende Fassung im RIS. Fassung geöffnet Quelle↩
- Österreichische Datenschutzbehörde. Startseite geöffnet Quelle↩
- tokio-rs: axum, Dokumentation auf docs.rs. Startseite gelesen Quelle↩
- crates.io: Stände am 2. November 2026: axum 0.8.9, sqlx 0.9.0, tokio 1.54.1, tower-http 0.7.1, hmac 0.13.0, sha2 0.11.1, utoipa 6.0.0; Rust 1.99.1 vom 16. Oktober 2026. Versionen abgefragt Quelle↩
- Astro: astro.build, Version 7.4.4 auf npm am 2. November 2026. Version geprüft Quelle↩
- Turiano, V.: three-globe, Version 2.45.6 auf npm am 2. November 2026. Version geprüft Quelle↩
- NeXT: Development Tools, Kapitel 14: Mach Object Files, CPU-Konstanten. Abschnitt gelesen Quelle
- comp.sys.next.hardware: Attempt to setup NeXTstation Color under NS3.2, Boot-Protokoll von NeXT Mach 3.2. Thread gelesen Quelle
Anhang
Fundstellen zu NeXTSTEP und die Prüfpunkte für den ersten Build. Für die Aussagen oben braucht man das hier nicht.
A. Fundstellen zu NeXTSTEP
| Aussage | Fundstelle |
|---|---|
host_info liefert max_cpus, avail_cpus, memory_size, cpu_type, cpu_subtype; nur HOST_BASIC_INFO, HOST_PROCESSOR_SLOTS und HOST_SCHED_INFO sind implementiert; die CPU-Konstanten stehen im Mach-O-Kapitel | Quelle 6, Eintrag host_info(); Quelle 36 |
Der Kernel setzt nur CPU_SUBTYPE_MC68030 oder CPU_SUBTYPE_MC68040, obwohl er den Maschinentyp aus dem Steuerregister liest | Quelle 8, next/next_init.c:153-154, next/autoconf.c:80-92, next/scr.h:34-61 |
hostinfo auf 3.3 druckt Processor speed, System type, Board revision; die Handbuchseite von 1989 kennt diese Zeilen nicht | Quelle 7, Abschnitt After install; Quelle 10, hostinfo(1) |
Boot-Protokoll mit physical memory, SCSI-Zeilen und en0: Ethernet address | Quelle 9, Kapitel 3 und 7; Quelle 37; Quelle 8, next/machdep.c:828-835, nextif/if_en.c:173-182 |
gethostid() ist 0x01 und die unteren drei Bytes der Ethernet-Adresse; Root kann den Wert mit sethostid ändern | Quelle 10, gethostid(2); Quelle 8, next/next_init.c:200-202, bsd/kern_xxx.c:91-98 |
Kein Ioctl für die Link-Layer-Adresse im Kernel-Quelltext (AF_LINK, sockaddr_dl, SIOCGIFHWADDR fehlen) | Quelle 8, net/if.c:309-394 |
| Der NVRAM-Datensatz enthält Ethernet-Adresse, SIMM-Konfiguration, Boot-Kommando und Prüfsumme, aber keine Seriennummer | Quelle 8, mon/nvram.h:14-47, mon/global.h:51-121 |
Platten: DKIOCINFO, DKIOCGLABEL, SDIOCGETCAP; INQUIRY über sg(4) als Superuser | Quelle 10, sd(4), sg(4), scsimodes(8) |
Bildschirm: NXScreen mit Grenzen und Tiefe; getScreens:count:; Datensätze in NetInfo /localconfig/screens | Quelle 11 |
Lastwerte aus processor_set_info; w zeigt Uptime und nennt /dev/kmem | Quelle 6, Eintrag processor_set_info(); Quelle 10, w(1) |
| 3.3 läuft auf SPARCstation 5, 10, 20, HP 9000 712 bis 755, Intel und NeXT | Quelle 1, Abschnitt Platforms |
| Foundation A’ liegt 3.3 Intel, Motorola, RISC und Developer bei; 3.2 hat keines | Quelle 4 |
22 Foundation-Klassen in 3.3, libFoundation_s.a, Header unter /NextDeveloper/Headers/foundation | Quelle 19; Index der Dokumentation |
Zwei Wurzelklassen in 3.3, Object und NSObject | Quelle 20 |
GCC 2.5.8 in 3.3, GCC 2.7.2.1 in 4.2; Konvertierung von 3.x-Quelltext mit tops in sechs Stufen; Foundation-Code von 3.3 muss für 4.0 neu übersetzt werden | Quelle 16; Quelle 5 |
cc ist ANSI C mit -ansi, -traditional, -ObjC; Objective-C mit Protokollen, Kategorien, @selector, @encode | Quelle 17; Quelle 18 |
Fat Binaries mit wiederholbarem -arch; 3.1 nennt m68k und i386 | Quelle 16, Fat Files |
Project Builder ruft make; Makefile.preamble; Projekttyp Tool seit 3.2 | Quelle 14; Quelle 15 |
Installer-Paket: .tar.Z, .bom, .info, .sizes; package; post_install; Doppelklick installiert | Quelle 22 |
/etc/rc startet nmserver, rc.net; /etc/rc.local für lokale Ergänzungen | Quelle 23; Quelle 24 |
gethostbyname() ruft lookupd, das NetInfo, DNS, NIS und die Systemdateien in dieser Reihenfolge fragt | Quelle 21 |
| NeXT-Rechner mit 68030 und 68040 (25 und 33 MHz): 16 MB Speicher mindestens, 24 MB empfohlen | Quelle 26 |
| Kein TLS von NeXT; SSLeay 0.9.0 für 4.2; OpenSSL 0.9.6m auf 3.3; RSA-Prüfung mit OpenSSL 1.0.2 auf m68k fehlgeschlagen | Quelle 3; Quelle 27; Quelle 28 |
| lynx, gnumake und gzip als Fremdpakete; kein curl gefunden | Quelle 25 |
Previous: emulierte Maschinen, ROM-Adressen, SCSI-Kennung Previous, SLiRP-Netz | Quelle 2, readme.previous.txt:41-49, src/rom.c:24-37, src/scsi.c:148-194, src/slirp/ctl.h:1-21 |
Previous: Netz ohne Einrichtung ab 3.3, NFS-Freigabe unter /Net, Gateway 10.0.2.2, DNS 10.0.2.3 | Quelle 13, networking.howto.txt:12-14, :199-226; filesharing.howto.txt:1-3 |
B. Prüfpunkte für den ersten Build
Jeder Punkt ist auf einem laufenden NeXTSTEP 3.3 zu klären, zuerst im Emulator, dann auf einer echten Maschine. Die Spalte Folge sagt, was im Plan davon abhängt.
| Prüfpunkt | Prüfung | Folge |
|---|---|---|
Enthalten die Plattenabbilder /NextDeveloper mit Project Builder und cc? | ls /NextDeveloper/Apps, cc -v | Sonst Developer-CD nachinstallieren |
Woher nimmt hostinfo Takt, Systemtyp und Board-Revision? | hostinfo, dann otool -tv /usr/etc/hostinfo; Vergleich Previous gegen echte Maschine (Previous baut Typ 4 und Revision 0, die echte Turbo meldet 5 und 0xf) | Ob der Client den Aufruf nutzt oder die Ausgabe parst |
Darf ein Prozess ohne Root /usr/adm/messages lesen, und stehen die Boot-Zeilen noch darin? | ls -l /usr/adm/messages, erste Zeilen lesen | Ob der Meldeprozess Root braucht |
Welche Werte haben utsname.release, version, machine, und linkt uname() ohne -posix? | Testprogramm mit und ohne cc -posix | Ob uname das Betriebssystem liefert |
Gibt es uptime, getloadavg, sysctl, gzip, gnutar? | ls /usr/bin /usr/ucb /usr/etc, grep -l sysctl /usr/include/bsd/sys/*.h | Uptime-Quelle und Form des Downloads |
Liefert SIOCGARP oder arp -a die eigene Ethernet-Adresse? | Testprogramm | Fingerabdruck ohne Boot-Protokoll |
| Welche Zahlenwerte haben die Subtypen für Intel, HP und SPARC? | /NextDeveloper/Headers/bsd/sys/machine.h | Architekturfeld des Inventars |
Was steht in /localconfig/screens einer echten Maschine mit MegaPixel oder Farbmonitor? | niutil -read . /localconfig/screens | Bildschirmfeld des Inventars |
| Nimmt der 3.3-Compiler die geplante Objective-C-Form und ANSI-Prototypen an, und wie groß wird das Binary? | Build der Bibliothek, size und ps im Meldeprozess | Speicherbedarf bei 16 MB |
| Erreicht der Client aus Previous den Server? | nextnetd -once gegen die konfigurierte Basisadresse über SLiRP | Testweg vor der echten Maschine |
| Startet das 3.3-Binary des Meldeprozesses auf dem 4.2-Abbild? | Kopieren und ausführen | Ob ein Build des Meldeprozesses für beide Systeme reicht |
| Übersetzt die Foundation-Quelle unverändert auf beiden Abbildern? | Build von libnextnet gegen libFoundation_s.a und gegen das Framework | Ob die 3.3-Foundation A’ Methoden anders benennt als die von 4.2 |
Startet /etc/rc.local den Meldeprozess, und überlebt er die Abmeldung? | Neustart, ps nach Abmeldung | Startmechanismus des Meldeprozesses |