From 016f9461df6d1306eb1e50d8278a2cec5129fa75 Mon Sep 17 00:00:00 2001 From: Julian Kiedaisch Date: Thu, 1 Oct 2026 20:32:35 +0000 Subject: [PATCH] feat(core): the command line with its local commands after Java, measured against Java The terminal splits a line as Java's window does and runs ls, cd, pwd, mkdir, touch, cp, mv, rm, cat, test, help, ipconfig and route on the node's files, which are the project's own. Its texts are generated from the bundle Java loads. TerminalCases feeds Java's Terminal without a network (16 cases, de and en); eight cases name Java bugs. Co-Authored-By: Claude Opus 5.5 --- CHANGES.md | 12 +- packages/core/src/index.ts | 2 + packages/core/src/model/virtualFileSystem.ts | 13 + packages/core/src/runtime/apps/terminal.ts | 363 + .../core/src/runtime/apps/terminalTexts.ts | 226 + packages/core/src/runtime/engine.ts | 20 + packages/core/src/runtime/snapshot.ts | 4 + packages/core/test/terminal.cases.txt | 140 + packages/core/test/terminal.de.java.json | 6569 +++++++++++++++++ packages/core/test/terminal.en.java.json | 6569 +++++++++++++++++ packages/core/test/terminal.test.ts | 259 + packages/fls/src/projectSnapshot.ts | 5 +- packages/fls/test/importProject.test.ts | 16 + scripts/code_language_allow.txt | 2 + tools/java-oracle/README.md | 29 + tools/java-oracle/run.sh | 12 +- tools/java-oracle/src/TerminalCases.java | 170 + 17 files changed, 14404 insertions(+), 7 deletions(-) create mode 100644 packages/core/src/runtime/apps/terminal.ts create mode 100644 packages/core/src/runtime/apps/terminalTexts.ts create mode 100644 packages/core/test/terminal.cases.txt create mode 100644 packages/core/test/terminal.de.java.json create mode 100644 packages/core/test/terminal.en.java.json create mode 100644 packages/core/test/terminal.test.ts create mode 100644 tools/java-oracle/src/TerminalCases.java diff --git a/CHANGES.md b/CHANGES.md index 26d5c82..ffff33b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,7 +13,7 @@ Swift-Pfade relativ zu `filius-ipad/ios/FiliusPad/TopologyEditor/` (Stand | `src/model/link.ts`, `src/model/graph.ts` | `Model/TopologyLink.swift`, `Model/TopologyGraph.swift` | übertragen, bisher nur die Daten (Abfragen folgen mit dem Editor) | | `src/model/documentation.ts` | `Model/TopologyDocumentation.swift` | übertragen; FNV-Kennung mit BigInt, gegen die IDs aus dem Swift-Import geprüft | | `src/runtime/config.ts` | `State/TopologyEditorState.swift` (Laufzeit-Konfigurationen, WLAN eines Rechners, DHCP, Portweiterleitung, Remote Link ohne LAN-Transport, Programme und ihre Konfiguration, Firewall, DNS-Einträge aus `State/TopologyDNSResolver.swift`, E-Mail-Konten und -Nachrichten aus `State/TopologyEmail.swift`); dazu Echo-Server- und Client-Konfiguration, die Swift nicht speichert | übertragen; Java-Beschriftungen der Oberfläche weggelassen | -| `src/runtime/engine.ts` | `State/TopologyNetworkRuntimeEngine.swift` Z. ~313–3585, ~4472–5187 (UDP), ~4753–4850 | übertragen: Warteschlange, Uhr, Ethernet, Switch, ARP, IPv4, ICMP, Routing, Firewall, UDP-Sockets (binden, freie Ports nach Javas Zufall, senden samt Broadcast, zustellen, empfangen mit Wartezeit, schließen), TCP (Z. ~5187–5913: Server- und Client-Sockets, Handschlag mit Ergebnis, Segmente zu 1460 Byte bis zum PSH, höchstens drei Versuche, Abbau über alle Java-Zustände samt `TIME_WAIT`; seit F2.3c nach Javas `TCPSocket` an Java-Filius gemessen: je Versuch und für `TIME_WAIT` 3 RTT nach der Geschwindigkeit (8250 ms bei 90 %, Swift fest 7500 bzw. 2500 ms), der Zeitablauf zählt ab der Übergabe des Segments, vor ARP; ein Segment beendet `TIME_WAIT`; die Gegenseite schließt beim FIN von selbst; nicht bestätigte Daten schließen mit FIN statt sofort; der angenommene Socket hat die Startnummer des Listeners, der Listener eine neue. seit F2.3e wie Java: SYN+ACK und FIN gehen nie ein zweites Mal hinaus; der Server gibt einen Handschlag nach 3 RTT auf und schließt mit FIN; nach dem FIN wartet ein Socket höchstens fünfmal 3 RTT, jedes Segment beendet eine Wartezeit, dann CLOSED (Java lässt den Zustand stehen). Abweichend von Java: drei SYN statt einem, weil Javas Wiederholungsschleife nach dem ersten Zeitablauf abbricht, und ein wiederholtes SYN in `SYN_RCVD` bekommt das SYN+ACK noch einmal, statt den Socket zu schließen), DHCP (Z. ~5913–6694: Server mit festen Zuordnungen, Adressbereich, Angeboten, Leases und Sperrliste; Client seit F2.3b nach Javas `DHCPClient` neu gebaut und an Java-Filius gemessen: je Versuch eine Nachricht, eine Antwort, die nicht passt, wird gelesen und verworfen; die ARP-Prüfung wartet eine RTT, eine Antwort für die Adresse beendet sie sofort, dann DECLINE; nach einem Zeitablauf wiederholt der Zustand seine Nachricht, nach dem fünften nimmt der Client eine Link-Local-Adresse `169.254.1.x/16` (ARP-Probe, ARP-Reply an alle) und gibt keine alte Adresse zurück; Swift sendete doppelt, wartete nicht auf ARP und kehrte nach zehn Versuchen zur alten Adresse zurück. Abweichend von Java: Nach fünf belegten Link-Local-Adressen gibt der Client auf (Java sucht endlos), und ein ARP-Paket für eine andere Adresse beendet die Prüfung nicht. Seit F2.3d befördert ein Kabel einen Frame nach dem anderen wie Javas `SimplexVerbindung` (ein Frame wartet im Ausgangspuffer, bis der vorige angekommen ist, und erscheint im Protokoll, wenn er losgeht); Swift schickt alle zugleich, die Option `swiftCables` behält das für den Swift-Vergleich. Die RTT der DHCP-Zeiten (Warten, Angebote, Sperrliste) folgt wie in Java der Geschwindigkeit (50 Kabel, 2750 ms bei 90 %); Swift rechnet fest mit 2500 ms. ARP seit F2.4b nach Javas `holeARPTabellenEintrag`, an Java-Filius gemessen: eine Auflösung fragt, wartet eine RTT, fragt ein zweites Mal und gibt nach einer weiteren RTT auf; dann „Host unreachable" beim Absender selbst oder vom Router zurück (bei ICMP nur für Echo-Anfragen); ein wartender Absender wacht nach den übrigen Ereignissen desselben Zeitpunkts auf; der Ping wartet danach eine RTT auf die Antwort. Swift schickt in der Ereignisverarbeitung beide Anfragen zugleich und lässt das Paket ohne Ende warten, wenn die Adresse irgendwo im Netz vorkommt (Wissen, das kein Knoten hat), und blockiert direkte Aufrufe ohne Wartezeit; die Option `swiftArp` behält das für den Swift-Vergleich. Seit F2.4b-2 kehrt ein Senden wie in Java sofort zurück, die Frames reisen, während die Uhr läuft (Swift: der Aufruf kehrt erst zurück, wenn alle Frames angekommen sind; die Option `swiftSends` behält das für den Swift-Vergleich), und UDP und TCP senden über Javas Transport-Thread je Knoten und Protokoll: ein Segment nach dem anderen; solange IP auf ARP wartet, blockiert das nächste `senden`. Wartende Absender kommen in der Reihenfolge an die Reihe, in der sie kamen (Javas Sperre überlässt das dem Zufall). Seit F2.4b-3 geht jedes ankommende Paket wie in Java durch den IP-Thread (UDP, TCP) oder den ICMP-Thread (ICMP) seines Knotens: zustellen, Echo-Reply, weiterleiten, eins nach dem anderen; solange ARP wartet, warten die folgenden. Abweichend von Java weckt eine ARP-Antwort alle, die auf die Adresse warten (Javas `notify` weckt einen beliebigen). DNS seit F2.4a nach Javas `DNSServer`/`Resolver`, an Java-Filius gemessen: Server auf Port 53 mit Einträgen aus dem Modell (die Antwort wiederholt die Frage nicht, RCODE immer 0, ein Verweis mit NS und A im Antwortteil), iterativer Resolver mit 5 RTT je Anfrage, der nur die Server behält, an die er verwiesen wurde; seit F2.4c auf den Ereignissen statt blockierend und mit rekursivem Server nach `DNSServer.answerWithRemoteData` (Nameserver der Zone, dann der eigene DNS-Server, sonst Verweis), abweichend von Java fragt er sich nie selbst (Java endlos). Gateway-NAT seit F2.6 (Z. ~3585–3900) nach Javas `filius.software.nat`, an Java-Filius gemessen: die Übersetzung vor dem IP-Thread (wie Javas NAT-Threads zwischen Karte und Ethernet), ausgehend WAN-Adresse und der Port des Eintrags (ICMP behält die Kennung), eingehend nach Gegenstelle, Port und Protokoll, sonst nach der Portweiterleitung (legt einen dynamischen Eintrag an), ein Ping an die WAN-Adresse beantwortet der Heimrouter, Pakete von außen an das LAN verschwinden, beide Seiten durch die Firewall des Heimrouters, ausgehend TTL 1 bekommt „Zeit überschritten“; dynamische Einträge verfallen nach 300 s mal Javas Verzögerungsfaktor (Swift fest 300 s), aufgefrischt nur eingehend, seit 01.10.2026 genau in diesem Alter (Java findet sie erst bei seiner sekündlichen Prüfung, bis zu 1 s später; so auch der Switch: Javas `checkSAT` prüft jede Sekunde, der Kern verfällt genau zur Lernzeit); der Heimrouter leitet weiter wie ein Router. Abweichend von Java: ein LAN-Endpunkt bekommt für jede neue Gegenstelle einen Eintrag auf demselben WAN-Port (Java behält nur den für die erste, die Antworten weiterer bleiben am Heimrouter hängen). RIP seit F2.5a (Z. ~4700–5090) nach Javas `filius.software.rip`, seit F2.5b an Java-Filius gemessen (die Pause in Javas `float`-Rechnung): eine Route mit 0 Hops je eigenem Netz, die nie verfällt; der erste Beacon nach einer Sekunde, dann alle 25,2–35,2 s aus einem Zufall je Router (Java: ein ungesetzter `Random` je Router; der Kern setzt ihn aus Szenario und Router-ID, `ripSeed`; Swift: ein Zufall für alle); eine Nachricht je Schnittstelle ohne die Routen über sie (Split Horizon); eine neue Route oder mehr Hops vom selben Router senden sofort; eine gelernte Route wird genau nach ihren 75 s auf 16 gesetzt und sofort gemeldet (Java erst beim nächsten eigenen Beacon, bis zu gut 30 s später; Swift bei jedem Ereignis; seit 01.10.2026, vorher wie Java); Nachrichten von jedem Quellport (Swift: nur 521); ein RIP-Router leitet nur nach seiner Tabelle weiter, wenige Hops vor langer Maske. `receiveUdp` kehrt wie Javas `empfangen` zurück, sobald ein Datagramm da ist. Seit der Abnahme F2 nach Javas `ARPThread`: ein Eintrag entsteht nur aus einer Anfrage nach der eigenen Adresse oder aus einer Antwort (Swift: aus jedem Paket; `swiftArp` behält das), ein Paket von der Netzadresse wird verworfen; ein Rechner leitet weiter, wenn seine IP-Weiterleitung an ist (`ipForwardingByNodeId`). Seit F2.8b nach Javas Tabellen gemessen: eine ARP-Anfrage trägt als Ziel-MAC die Broadcast-Adresse (Swift: Nullen; `swiftArp` behält sie), eine ICMP-Fehlermeldung Identifier und Sequenznummer 0 (RFC 792, Java; Swift kopiert die des Echos, ein Ping erkennt die Meldung am eingebetteten Echo), und „Host nicht erreichbar“ vom Router trägt das Paket, wie er es weitergeleitet hat (TTL gesenkt). Die Broadcast-Adresse schreibt sie immer groß (Java in der Antwort an 0.0.0.0 klein). Den Mitschnitt je Karte (`capture.ts`) schreibt sie seit F2.8a dort, wo Java ihn schreibt: beim Abgang auf das Kabel und bei der Ankunft an der Karte. Seit F3.3b läuft das E-Mail-Programm mit (`emailClient`), seine gesendeten und abgeholten Mails stehen im Schnappschuss (`emailClientsByNodeId`); ein Programm-Thread kann MX nachschlagen (`resolveDnsMailServerSteps`). Seit F3.3a läuft der E-Mail-Server mit (`emailServer`); was er annimmt oder löscht, steht im Schnappschuss (`emailServersByNodeId`), aus dem es zurück ins Projekt geht; die Uhrzeit für seine Benachrichtigungen kommt aus der Option `wallClock`. Seit F3.2c ändert die Seite `konfig` der Router und Heimrouter die Firewall zur Laufzeit; die Änderung steht im Schnappschuss (`firewallConfiguration`), aus dem sie zurück ins Projekt geht. Seit F3.2b starten Router und Heimrouter ihren Webserver auf Port 80 mit Javas Seiten (Javas Server lauscht wegen eines Wettlaufs in `setAktiv` manchmal nie, der Kern immer; `swiftRouters` lässt ihn für den Swift-Vergleich weg), die Firewall führt ein Protokoll je Knoten (Regeltreffer bei TCP und UDP, verworfenes ICMP), das wie Javas Protokollseite einen Neustart überlebt, eine RIP-Route kennt die öffentliche Adresse des meldenden Routers (`hopPublicIp`), und TCP zählt Sequenznummern und Segmentgröße wie Java in Zeichen (UTF-16-Einheiten) statt in Bytes, ohne ein Zeichenpaar zu zerreißen; Bytes, die kein Text sind, zählen als Bytes. Seit F3.2a schließt ein Programm wie Javas `schliessen()` nur auf Bitte (`requestTcpClose`): Das FIN geht zur selben Zeit, nach dem, was der Programm-Thread noch tut. Seit F3.1 laufen Verbinden, Senden, Empfangen und Annehmen auch als Schritte eines Programm-Threads (`connectTcpSteps`, `sendTcpSteps`, `receiveTcpSteps`, `acceptTcpSteps`, `resolveHostSteps`); die blockierenden Aufrufe sind nur noch eine Hülle darum. Abweichend von Java: Ein Verbindungsaufbau ohne Route scheitert sofort (Javas Socket-Thread stirbt an der `RouteNotFoundException`, `verbinden` wartet ewig), eine Nachricht, die vor dem Schließen ankam, wird noch ausgegeben (Java verwirft sie), und Senden unterscheidet wie Java „nicht verbunden", „unterbrochen" und „Zeitüberschreitung". WLAN seit F2.7 an Java-Filius gemessen: zur Laufzeit ist ein Funkkabel ein Kabel wie jedes andere, und eine SSID verbindet nichts (nach ihr legt nur Javas Editor das Funkkabel, `JHostKonfiguration.updateWifiConnection`); Swifts Verbindung über die SSID zur Laufzeit, auch ohne Kabel (`wirelessAssociations`), nicht übernommen. Klasse statt Werttyp. Noch nicht übertragen (wirft `NotPortedError`): Remote Link | +| `src/runtime/engine.ts` | `State/TopologyNetworkRuntimeEngine.swift` Z. ~313–3585, ~4472–5187 (UDP), ~4753–4850 | übertragen: Warteschlange, Uhr, Ethernet, Switch, ARP, IPv4, ICMP, Routing, Firewall, UDP-Sockets (binden, freie Ports nach Javas Zufall, senden samt Broadcast, zustellen, empfangen mit Wartezeit, schließen), TCP (Z. ~5187–5913: Server- und Client-Sockets, Handschlag mit Ergebnis, Segmente zu 1460 Byte bis zum PSH, höchstens drei Versuche, Abbau über alle Java-Zustände samt `TIME_WAIT`; seit F2.3c nach Javas `TCPSocket` an Java-Filius gemessen: je Versuch und für `TIME_WAIT` 3 RTT nach der Geschwindigkeit (8250 ms bei 90 %, Swift fest 7500 bzw. 2500 ms), der Zeitablauf zählt ab der Übergabe des Segments, vor ARP; ein Segment beendet `TIME_WAIT`; die Gegenseite schließt beim FIN von selbst; nicht bestätigte Daten schließen mit FIN statt sofort; der angenommene Socket hat die Startnummer des Listeners, der Listener eine neue. seit F2.3e wie Java: SYN+ACK und FIN gehen nie ein zweites Mal hinaus; der Server gibt einen Handschlag nach 3 RTT auf und schließt mit FIN; nach dem FIN wartet ein Socket höchstens fünfmal 3 RTT, jedes Segment beendet eine Wartezeit, dann CLOSED (Java lässt den Zustand stehen). Abweichend von Java: drei SYN statt einem, weil Javas Wiederholungsschleife nach dem ersten Zeitablauf abbricht, und ein wiederholtes SYN in `SYN_RCVD` bekommt das SYN+ACK noch einmal, statt den Socket zu schließen), DHCP (Z. ~5913–6694: Server mit festen Zuordnungen, Adressbereich, Angeboten, Leases und Sperrliste; Client seit F2.3b nach Javas `DHCPClient` neu gebaut und an Java-Filius gemessen: je Versuch eine Nachricht, eine Antwort, die nicht passt, wird gelesen und verworfen; die ARP-Prüfung wartet eine RTT, eine Antwort für die Adresse beendet sie sofort, dann DECLINE; nach einem Zeitablauf wiederholt der Zustand seine Nachricht, nach dem fünften nimmt der Client eine Link-Local-Adresse `169.254.1.x/16` (ARP-Probe, ARP-Reply an alle) und gibt keine alte Adresse zurück; Swift sendete doppelt, wartete nicht auf ARP und kehrte nach zehn Versuchen zur alten Adresse zurück. Abweichend von Java: Nach fünf belegten Link-Local-Adressen gibt der Client auf (Java sucht endlos), und ein ARP-Paket für eine andere Adresse beendet die Prüfung nicht. Seit F2.3d befördert ein Kabel einen Frame nach dem anderen wie Javas `SimplexVerbindung` (ein Frame wartet im Ausgangspuffer, bis der vorige angekommen ist, und erscheint im Protokoll, wenn er losgeht); Swift schickt alle zugleich, die Option `swiftCables` behält das für den Swift-Vergleich. Die RTT der DHCP-Zeiten (Warten, Angebote, Sperrliste) folgt wie in Java der Geschwindigkeit (50 Kabel, 2750 ms bei 90 %); Swift rechnet fest mit 2500 ms. ARP seit F2.4b nach Javas `holeARPTabellenEintrag`, an Java-Filius gemessen: eine Auflösung fragt, wartet eine RTT, fragt ein zweites Mal und gibt nach einer weiteren RTT auf; dann „Host unreachable" beim Absender selbst oder vom Router zurück (bei ICMP nur für Echo-Anfragen); ein wartender Absender wacht nach den übrigen Ereignissen desselben Zeitpunkts auf; der Ping wartet danach eine RTT auf die Antwort. Swift schickt in der Ereignisverarbeitung beide Anfragen zugleich und lässt das Paket ohne Ende warten, wenn die Adresse irgendwo im Netz vorkommt (Wissen, das kein Knoten hat), und blockiert direkte Aufrufe ohne Wartezeit; die Option `swiftArp` behält das für den Swift-Vergleich. Seit F2.4b-2 kehrt ein Senden wie in Java sofort zurück, die Frames reisen, während die Uhr läuft (Swift: der Aufruf kehrt erst zurück, wenn alle Frames angekommen sind; die Option `swiftSends` behält das für den Swift-Vergleich), und UDP und TCP senden über Javas Transport-Thread je Knoten und Protokoll: ein Segment nach dem anderen; solange IP auf ARP wartet, blockiert das nächste `senden`. Wartende Absender kommen in der Reihenfolge an die Reihe, in der sie kamen (Javas Sperre überlässt das dem Zufall). Seit F2.4b-3 geht jedes ankommende Paket wie in Java durch den IP-Thread (UDP, TCP) oder den ICMP-Thread (ICMP) seines Knotens: zustellen, Echo-Reply, weiterleiten, eins nach dem anderen; solange ARP wartet, warten die folgenden. Abweichend von Java weckt eine ARP-Antwort alle, die auf die Adresse warten (Javas `notify` weckt einen beliebigen). DNS seit F2.4a nach Javas `DNSServer`/`Resolver`, an Java-Filius gemessen: Server auf Port 53 mit Einträgen aus dem Modell (die Antwort wiederholt die Frage nicht, RCODE immer 0, ein Verweis mit NS und A im Antwortteil), iterativer Resolver mit 5 RTT je Anfrage, der nur die Server behält, an die er verwiesen wurde; seit F2.4c auf den Ereignissen statt blockierend und mit rekursivem Server nach `DNSServer.answerWithRemoteData` (Nameserver der Zone, dann der eigene DNS-Server, sonst Verweis), abweichend von Java fragt er sich nie selbst (Java endlos). Gateway-NAT seit F2.6 (Z. ~3585–3900) nach Javas `filius.software.nat`, an Java-Filius gemessen: die Übersetzung vor dem IP-Thread (wie Javas NAT-Threads zwischen Karte und Ethernet), ausgehend WAN-Adresse und der Port des Eintrags (ICMP behält die Kennung), eingehend nach Gegenstelle, Port und Protokoll, sonst nach der Portweiterleitung (legt einen dynamischen Eintrag an), ein Ping an die WAN-Adresse beantwortet der Heimrouter, Pakete von außen an das LAN verschwinden, beide Seiten durch die Firewall des Heimrouters, ausgehend TTL 1 bekommt „Zeit überschritten“; dynamische Einträge verfallen nach 300 s mal Javas Verzögerungsfaktor (Swift fest 300 s), aufgefrischt nur eingehend, seit 01.10.2026 genau in diesem Alter (Java findet sie erst bei seiner sekündlichen Prüfung, bis zu 1 s später; so auch der Switch: Javas `checkSAT` prüft jede Sekunde, der Kern verfällt genau zur Lernzeit); der Heimrouter leitet weiter wie ein Router. Abweichend von Java: ein LAN-Endpunkt bekommt für jede neue Gegenstelle einen Eintrag auf demselben WAN-Port (Java behält nur den für die erste, die Antworten weiterer bleiben am Heimrouter hängen). RIP seit F2.5a (Z. ~4700–5090) nach Javas `filius.software.rip`, seit F2.5b an Java-Filius gemessen (die Pause in Javas `float`-Rechnung): eine Route mit 0 Hops je eigenem Netz, die nie verfällt; der erste Beacon nach einer Sekunde, dann alle 25,2–35,2 s aus einem Zufall je Router (Java: ein ungesetzter `Random` je Router; der Kern setzt ihn aus Szenario und Router-ID, `ripSeed`; Swift: ein Zufall für alle); eine Nachricht je Schnittstelle ohne die Routen über sie (Split Horizon); eine neue Route oder mehr Hops vom selben Router senden sofort; eine gelernte Route wird genau nach ihren 75 s auf 16 gesetzt und sofort gemeldet (Java erst beim nächsten eigenen Beacon, bis zu gut 30 s später; Swift bei jedem Ereignis; seit 01.10.2026, vorher wie Java); Nachrichten von jedem Quellport (Swift: nur 521); ein RIP-Router leitet nur nach seiner Tabelle weiter, wenige Hops vor langer Maske. `receiveUdp` kehrt wie Javas `empfangen` zurück, sobald ein Datagramm da ist. Seit der Abnahme F2 nach Javas `ARPThread`: ein Eintrag entsteht nur aus einer Anfrage nach der eigenen Adresse oder aus einer Antwort (Swift: aus jedem Paket; `swiftArp` behält das), ein Paket von der Netzadresse wird verworfen; ein Rechner leitet weiter, wenn seine IP-Weiterleitung an ist (`ipForwardingByNodeId`). Seit F2.8b nach Javas Tabellen gemessen: eine ARP-Anfrage trägt als Ziel-MAC die Broadcast-Adresse (Swift: Nullen; `swiftArp` behält sie), eine ICMP-Fehlermeldung Identifier und Sequenznummer 0 (RFC 792, Java; Swift kopiert die des Echos, ein Ping erkennt die Meldung am eingebetteten Echo), und „Host nicht erreichbar“ vom Router trägt das Paket, wie er es weitergeleitet hat (TTL gesenkt). Die Broadcast-Adresse schreibt sie immer groß (Java in der Antwort an 0.0.0.0 klein). Den Mitschnitt je Karte (`capture.ts`) schreibt sie seit F2.8a dort, wo Java ihn schreibt: beim Abgang auf das Kabel und bei der Ankunft an der Karte. Seit F3.4a läuft die Befehlszeile mit (`terminal`, auf den Dateien des Knotens). Seit F3.3b läuft das E-Mail-Programm mit (`emailClient`), seine gesendeten und abgeholten Mails stehen im Schnappschuss (`emailClientsByNodeId`); ein Programm-Thread kann MX nachschlagen (`resolveDnsMailServerSteps`). Seit F3.3a läuft der E-Mail-Server mit (`emailServer`); was er annimmt oder löscht, steht im Schnappschuss (`emailServersByNodeId`), aus dem es zurück ins Projekt geht; die Uhrzeit für seine Benachrichtigungen kommt aus der Option `wallClock`. Seit F3.2c ändert die Seite `konfig` der Router und Heimrouter die Firewall zur Laufzeit; die Änderung steht im Schnappschuss (`firewallConfiguration`), aus dem sie zurück ins Projekt geht. Seit F3.2b starten Router und Heimrouter ihren Webserver auf Port 80 mit Javas Seiten (Javas Server lauscht wegen eines Wettlaufs in `setAktiv` manchmal nie, der Kern immer; `swiftRouters` lässt ihn für den Swift-Vergleich weg), die Firewall führt ein Protokoll je Knoten (Regeltreffer bei TCP und UDP, verworfenes ICMP), das wie Javas Protokollseite einen Neustart überlebt, eine RIP-Route kennt die öffentliche Adresse des meldenden Routers (`hopPublicIp`), und TCP zählt Sequenznummern und Segmentgröße wie Java in Zeichen (UTF-16-Einheiten) statt in Bytes, ohne ein Zeichenpaar zu zerreißen; Bytes, die kein Text sind, zählen als Bytes. Seit F3.2a schließt ein Programm wie Javas `schliessen()` nur auf Bitte (`requestTcpClose`): Das FIN geht zur selben Zeit, nach dem, was der Programm-Thread noch tut. Seit F3.1 laufen Verbinden, Senden, Empfangen und Annehmen auch als Schritte eines Programm-Threads (`connectTcpSteps`, `sendTcpSteps`, `receiveTcpSteps`, `acceptTcpSteps`, `resolveHostSteps`); die blockierenden Aufrufe sind nur noch eine Hülle darum. Abweichend von Java: Ein Verbindungsaufbau ohne Route scheitert sofort (Javas Socket-Thread stirbt an der `RouteNotFoundException`, `verbinden` wartet ewig), eine Nachricht, die vor dem Schließen ankam, wird noch ausgegeben (Java verwirft sie), und Senden unterscheidet wie Java „nicht verbunden", „unterbrochen" und „Zeitüberschreitung". WLAN seit F2.7 an Java-Filius gemessen: zur Laufzeit ist ein Funkkabel ein Kabel wie jedes andere, und eine SSID verbindet nichts (nach ihr legt nur Javas Editor das Funkkabel, `JHostKonfiguration.updateWifiConnection`); Swifts Verbindung über die SSID zur Laufzeit, auch ohne Kabel (`wirelessAssociations`), nicht übernommen. Klasse statt Werttyp. Noch nicht übertragen (wirft `NotPortedError`): Remote Link | | `src/runtime/threads.ts` | Javas Threads der Programme (`Anwendung extends Thread`, `ServerMitarbeiter`) | neu (F3.1): ein Programm-Thread als Generator, der liefert, worauf er wartet (Bedingung, Zeit oder beides); die Engine setzt nach jedem Ereignis fort, wessen Warten vorbei ist, in der Reihenfolge, in der die Threads begannen; nichts blockiert die Engine. Abweichend von Java: ein Thread wacht sofort, wenn seine Bedingung gilt (Java sieht oft nur alle 100 ms nach) | | `src/runtime/apps/program.ts` | Java `filius.software.Anwendung` | neu (F3.1): die Zeilen im Fenster eines Programms (strukturiert, damit der Editor sie übersetzt) und der Befehls-Thread (`ausfuehren`) | | `src/runtime/apps/server.ts` | Java `ServerAnwendung`, `ServerMitarbeiter` | neu (F3.2a, aus `echo.ts` herausgelöst): was jeder Server teilt — ein Thread nimmt Verbindungen an, solange er eingeschaltet ist, je Verbindung einer beantwortet jede Nachricht; ausgeschaltet schließt er Socket und Verbindungen; Port belegt → er schaltet sich aus; seit F3.3a kann ein Server das Gespräch einer Verbindung selbst führen (`converse`: Begrüßung, keine oder mehrere Antworten, Schließen) | @@ -25,20 +25,21 @@ Swift-Pfade relativ zu `filius-ipad/ios/FiliusPad/TopologyEditor/` (Stand | `src/runtime/email.ts` | Java `filius.software.email.Email`, `AddressEntry`, `EmailUtils` | neu nach Java (F3.3a): Mails in Javas Textform (From, To, Cc, Subject, Date Received, Leerzeile, Text; kein Bcc), Adressen „Name “, Javas Größe einer Mail für POP3. Abweichend von Java: der Kopf endet an seiner Leerzeile, ein unbekanntes Feld wird übergangen (Java beendet dort den Kopf und liest die folgenden Felder als Text), eine Zeile ohne Feld beginnt den Text (Java verwirft sie) | | `src/runtime/apps/emailServer.ts` | Java `EmailServer`, `SMTPServer`, `SMTPMitarbeiter`, `POP3Server`, `POP3Mitarbeiter`, `EmailKonto` | neu nach Java (F3.3a): Konten einer Domain, SMTP auf Port 25 speichert Mails an eigene Konten (wie Java neu gelesen) und schickt bei unbekannten Empfängern eine Benachrichtigung an einen Absender der Domain, POP3 auf Port 110 gibt Mails ab 0 nummeriert aus; beide zusammen ein- und ausgeschaltet, POP3 zuerst; SMTP-Antworten in der Sprache des Projekts; Fensterzeilen wie Java. An Java-Filius gemessen (`EmailRun`, `MailCases`). Abweichend von Java: nach einer Mail ist der Umschlag neu (Java antwortet dem nächsten Befehl 503 und behält Absender, Empfänger und Text); ein Befehl, den der Zustand nicht nimmt, bekommt 503 (Java schweigt), HELO beginnt neu; in DATA ist alles Text, auch `quit`; die Domain gilt in jeder Schreibweise; ein Empfänger ohne `@` ist unbekannt, ein leerer Absender bekommt keine Benachrichtigung (Java wirft), eine Benachrichtigung an eine Mail ohne From geht an den Absender des Umschlags (Java: `To: null`); POP3: eine Mail lässt sich mehrmals abrufen, eine fehlende Mail, `LIST` ohne Mails und falsche Argumente geben `-ERR` (Java: leere Mail, leere Antwort, Abbruch), `LIST n` listet die eine Mail, Nummern bleiben nach `DELE` (Javas `LIST` zählt neu), vor der Anmeldung `-ERR unknown command`, `QUIT` immer `+OK`. Seit F3.3b leitet der Server Mails an fremde Domains per MX weiter (in seinem eigenen Thread, je Weiterleitung ein neuer SMTP-Client) und schickt eine Benachrichtigung an einen fremden Absender mit leerem Absender an dessen Domain. Noch nicht: die Kontodatei `/mailserver/konten.txt` zur Laufzeit | | `src/runtime/apps/emailClient.ts` | Java `EmailAnwendung`, `SMTPClient`, `POP3Client`, das Senden aus `GUIApplicationEmailAnwendungWindow` | neu nach Java (F3.3b): das E-Mail-Programm sendet eine Mail an den SMTP-Server seines Kontos, eine Verbindung je Empfänger (An, Cc, Bcc), und holt die Mails seines Kontos vom POP3-Server (jede abgerufen, dann gelöscht); die Prüfungen des Fensters (kein Konto, Adresse, die Javas Muster nicht nimmt, kein Empfänger); Meldungen wie Javas Beobachter (Verbindung, versendet, getrennt, Ausnahmen); der SMTP-Client dient auch dem Server zum Weiterleiten. An Java-Filius gemessen (`EmailClientRun`). Abweichend von Java: der SMTP-Port des Kontos gilt (Java verbindet immer zu 25); drei SYN statt einem | +| `src/runtime/apps/terminal.ts`, `src/runtime/apps/terminalTexts.ts` | Java `filius.software.lokal.Terminal`, die Eingabe aus `GUIApplicationTerminalWindow`, die Texte `sw_terminal_*` und `terminal_msg*` des Bündels | neu nach Java (F3.4a): die Befehlszeile mit Javas Zerlegung der Eingabe, Verteilung nach dem Befehlsnamen und den lokalen Befehlen `ls`/`dir`, `cd`, `pwd`, `mkdir`, `touch`, `cp`/`copy`, `mv`/`move`, `rm`/`del`, `cat`/`type`, `test`, `help`, `ipconfig`, `route`; Texte in der Sprache des Projekts, aus dem von Java geladenen Bündel erzeugt. An Java-Filius gemessen (`TerminalCases`). Abweichend von Java: die Größe einer Textdatei sind ihre Zeichen (Java dekodiert Base64); ein fehlender Ordner ist für `ls` „nicht vorhanden“, `ls /` nennt die Wurzel; `cd` auf eine Datei, `touch`/`mkdir` in fehlenden Ordnern und `cp` auf einen Ordnernamen scheitern; `..` bleibt an der Wurzel; `rm` und `mv` nehmen absolute Pfade absolut, die Wurzel ist nicht löschbar, nach dem Löschen des Arbeitsordners gilt der nächste verbliebene darüber; `mv` auf die Datei selbst benennt sie um | | `src/runtime/apps/echo.ts` | Java `filius.software.clientserver` (`ServerBaustein`, `ServerBausteinMitarbeiter`, `ClientAnwendung`, `ClientBaustein`) | neu nach Java statt nach Swift (F3.1): Echo-Server (auf `server.ts`, sendet jede Nachricht zurück) und einfacher Client (verbinden über Adresse oder Namen, senden, empfangen, trennen), mit Javas Fensterzeilen. An Java-Filius gemessen. Abweichend von Java: Der Server merkt das Ausschalten, der Client die Verbindung sofort (Java alle 100 ms); ohne Route scheitert der Client sofort (Java wartet ewig ohne Meldung); ausgeschaltet bestätigt der Server noch das FIN seiner Verbindungen (Java gibt den Port frei, das FIN bleibt unbeantwortet) | | `src/runtime/dns.ts` | Java `filius.software.dns.DNSNachricht`, `Query`, `ResourceRecord` | neu nach Java statt nach Swift (Swift ersetzt Javas Textnachrichten durch `FILIUS-DNS-TYPED/1`): Kopfzeile `ID=… QR=… RCODE=… QDCOUNT=… …`, Frage- und Eintragszeilen, Suche nach Namen ohne Rücksicht auf Groß- und Kleinschreibung, NS der längsten Zone, sonst der Wurzel | | `src/runtime/ipv4.ts` | Engine `parseIPv4`/`sameSubnet` | übertragen | | `src/runtime/packets.ts` | Engine, Paketmodelle | übertragen; `Data` → `Uint8Array` | | `src/runtime/random.ts` | Engine, `TopologyJavaCompatibleRandom` | übertragen; BigInt für die 48-Bit-Arithmetik; dazu `nextDouble` (Javas `Math.random`, an OpenJDK 21 gemessen) | | `src/runtime/routeTable.ts` | `State/TopologyJavaRouteTable.swift` | übertragen ohne Tabellengeometrie (gehört in den Editor) | -| `src/runtime/snapshot.ts` | Engine, `TopologyNetworkRuntimeTopologySnapshot` | übertragen, bisher mit den Feldern der übertragenen Schichten, seit der Abnahme F2 mit der IP-Weiterleitung, wo sie vom Standard der Art abweicht, seit F2.3 mit den DHCP-Einstellungen von Clients und Servern, seit F2.4a mit den eingeschalteten DNS-Servern, seit F3.1 mit den installierten Echo-Servern (Port, ein oder aus) und einfachen Clients, seit F3.2a mit den Webservern, Browsern und den Dateisystemen der Knoten, seit F3.2b mit der Sprache der Seiten, die Geräte selbst schreiben, seit F3.3a mit den E-Mail-Servern (Domain, Konten mit Postfächern, ein oder aus), seit F3.3b mit den E-Mail-Programmen (Konto, Ordner); ohne Swifts WLAN-Einstellungen der Rechner (`hostWirelessConfigurationsByNodeID`), die zur Laufzeit nichts bewirken (F2.7) | +| `src/runtime/snapshot.ts` | Engine, `TopologyNetworkRuntimeTopologySnapshot` | übertragen, bisher mit den Feldern der übertragenen Schichten, seit der Abnahme F2 mit der IP-Weiterleitung, wo sie vom Standard der Art abweicht, seit F2.3 mit den DHCP-Einstellungen von Clients und Servern, seit F2.4a mit den eingeschalteten DNS-Servern, seit F3.1 mit den installierten Echo-Servern (Port, ein oder aus) und einfachen Clients, seit F3.2a mit den Webservern, Browsern und den Dateisystemen der Knoten, seit F3.2b mit der Sprache der Seiten, die Geräte selbst schreiben, seit F3.3a mit den E-Mail-Servern (Domain, Konten mit Postfächern, ein oder aus), seit F3.3b mit den E-Mail-Programmen (Konto, Ordner), seit F3.4a mit den Knoten, auf denen die Befehlszeile installiert ist; ohne Swifts WLAN-Einstellungen der Rechner (`hostWirelessConfigurationsByNodeID`), die zur Laufzeit nichts bewirken (F2.7) | | `src/runtime/speed.ts` | Engine, `TopologyNetworkRuntimeSpeed` | übertragen; dazu Javas RTT (`Verbindung.holeRTT`: 50 Kabel), die Swift nicht kennt | | `src/runtime/trace.ts` | Engine, Paketspur-Modell | übertragen | | `src/runtime/captureRows.ts` | Java `Lauscher.datenVorbereiten`, `classifyApplicationLayerProtocol`, die `toString` von `ArpPaket`, `IpPaket`, `IcmpPaket` | neu nach Java (F2.8b): die Tabelle des Mitschnitts, je Frame eine Zeile je Schicht (Ethernet; ARP, ICMP oder IP; TCP oder UDP; die Daten, wenn Javas `trim` etwas übrig lässt), in beiden Ansichten Javas (Ende als Adresse:Port samt Datenzeile, oder nur Ports und die Datenzeile ohne Enden); die Bemerkung bleibt strukturiert, `captureCommentText` sagt sie mit gegebenen Wörtern und Zahlenformat wie Java. An Javas eigenen Tabellen gemessen. Abweichend von Java: „ICMP Time Exceeded“ (Java: „Exeeded“) | | `src/runtime/capture.ts` | Java `filius.rahmenprogramm.nachrichten.Lauscher` | neu nach Java (Swift hat stattdessen die Paketspur je Schritt): der Mitschnitt je Netzwerkkarte, jeder gesendete und empfangene Frame einmal mit Zeit und Nummer, wie Java auch Frames an andere Karten und solche, die die Firewall verwirft; Switches ohne Liste; verlorene Frames getrennt; bleibt über Stopp und Neustart, geleert nur auf Wunsch. Abweichend von Java: je Port statt je MAC-Adresse (Java legt zwei Karten mit gleicher MAC zusammen) und höchstens 10.000 Frames je Karte, die ältesten 1.000 fallen auf einmal heraus, die Nummern bleiben (Java behält alles) | | `src/util/equal.ts` | — | neu (Ersatz für Swifts `Equatable`) | | `src/util/swiftString.ts` | — | neu: Swift-String-Verhalten, das der übertragene Code stillschweigend voraussetzt (Trimmen, Kleinschreibung je Skalar, kanonische Gleichheit, Sortierung nach Skalarwerten, Base64 wie Foundation); am Swift-Orakel gemessen, Leerraum und Steuerzeichen über ganz Unicode | -| `src/model/virtualFileSystem.ts`, `src/model/defaultImages.ts` | `State/TopologyVirtualFileSystem.swift` | übertragen; Schlüssel in NFC statt Swifts kanonischer Wörterbuch-Gleichheit; Steuerzeichen nach Unicode Cc+Cf, ohne Foundations Tabellenfehler in Ebene 14 | +| `src/model/virtualFileSystem.ts`, `src/model/defaultImages.ts` | `State/TopologyVirtualFileSystem.swift` | übertragen; Schlüssel in NFC statt Swifts kanonischer Wörterbuch-Gleichheit; Steuerzeichen nach Unicode Cc+Cf, ohne Foundations Tabellenfehler in Ebene 14; seit F3.4a die Einträge eines Ordners auch in der Reihenfolge ihres Entstehens, wie Javas Dateibaum (`entriesInCreationOrder`) | | `test/virtualFileSystem.test.ts`, `test/vfs.*.json` | `TopologyProjectPersistenceTests.swift`, `TopologyEditorReducerTests.swift` (drei Dateisystem-Tests, als Fälle) | übertragen und erweitert: 11 Fälle, Ergebnis aus dem Swift-Kern | | `test/strings.test.ts`, `test/strings.*.json` | — | neu: Fälle und ganze Zeichenmengen, Ergebnis aus dem Swift-Kern | | `test/engine.test.ts` | `TopologyNetworkRuntimeEngineTests.swift` (21 von 72 Tests) | übertragen; `nextInt`- und `nextDouble`-Referenzwerte an OpenJDK 21 gemessen; die DHCP-Client-Tests seit F2.3b nach Javas Verhalten (neun, davon zwei benannte Java-Fehler, die der Kern nicht übernimmt); seit F2.8a sechs Tests für den Mitschnitt (über Neustart, Leeren, Obergrenze, verlorene Frames, Switches) | @@ -57,6 +58,7 @@ Swift-Pfade relativ zu `filius-ipad/ios/FiliusPad/TopologyEditor/` (Stand | `test/emailJava.test.ts`, `test/scenarios/mail-lan.scenario.json`, `test/scenarios/email-java-*.java.json` | — | neu (F3.3a): vier Abläufe mit dem E-Mail-Server gegen Java-Filius (`EmailRun`): SMTP, SMTP mit Fehlern und Benachrichtigung, POP3 zweimal angemeldet, POP3-Anmeldefehler; je Karte Frames, Zeiten, Tabellen, die Fensterzeilen von Server und Client und die Konten am Ende (das Datum der Benachrichtigung als Platzhalter) | | `test/emailClientJava.test.ts`, `test/scenarios/email-client-java-*.java.json` | — | neu (F3.3b): sechs Abläufe mit dem E-Mail-Programm und zwei Servern gegen Java-Filius (`EmailClientRun`): senden mit Weiterleitung, abholen, Server per Name und Benachrichtigungen von beiden Servern, falsches Passwort, kein Server, unbekannter Servername; je Karte Frames, Zeiten, Tabellen, die Meldungen von Programm und Servern, Posteingang, Gesendete und Konten am Ende; Javas 100-ms-Blick kostet je Verbindung (und je DNS-Antwort, auf die es so wartet) eine Periode Toleranz; ein benannter Java-Fehler (nur ein SYN); bei `byName` die Startnummern ohne die Million (Thread-Wettlauf in Java) | | `test/emailClient.test.ts` | — | neu (F3.3b): was das Fenster ablehnt, Bcc, der SMTP-Port des Kontos, eine ungültige Kontoadresse, eine Verbindung, die beim Warten endet, eine Mail ohne Absender aus dem Modell, die Ordner im Schnappschuss | +| `test/terminal.test.ts`, `test/terminal.cases.txt`, `test/terminal.{de,en}.java.json` | — | neu (F3.4a): 16 Fälle der Befehlszeile gegen Java-Filius (`TerminalCases`), je Zeile die Handlung des Fensters, was das Programm sagt, Arbeitsordner und alle Dateien, Deutsch und Englisch; Javas Größe von Textdateien überall als Java-Fehler korrigiert, dazu acht Fälle mit benannten Java-Fehlern (`JAVA_BUGS`); ein Bild bleibt beim Kopieren ein Bild | | `test/apps.test.ts` | — | neu (F3.1): wie Threads aufwachen (nach dem Ereignis, nach einer Pause hinter den anderen, ein Weckruf nur für sein Warten, Reihenfolge des Beginns, kein Warten auf schon Geltendes), und was die Java-Abläufe nicht zeigen: belegter Port, Name über DNS und ohne DNS, keine Route, unbestätigtes Senden, Neustart, eine Nachricht vor dem Schließen | | `test/captureRows.test.ts` | — | neu (F2.8b): die Regeln der Tabelle, die kein Java-Lauf zeigt (GNT, POP3, SMTP, HTTP, Javas `trim`, ICMP-Fehler mit eingebettetem ICMP, Ansicht ohne Enden) | | `test/wlanJava.test.ts`, `test/scenarios/wlan-lan.scenario.json`, `test/scenarios/wlan-java-*.java.json` | — | neu: vier Pings gegen Java-Filius (`WlanRun`): über Funkkabel, über ein Kabel und an ein Notebook mit der SSID des Switches, aber ohne Kabel (ARP scheitert in Java wie im Kern); Frames, Abstände, Ergebnis und Dauer | @@ -73,7 +75,7 @@ Swift-Pfade relativ zu `filius-ipad/ios/FiliusPad/TopologyEditor/` (Stand | `src/archive.ts` | ebenda, Archiv-Teil von Import und Export | übertragen, ohne die XML-Ebene | | `src/javabeans.ts`, `src/javaDefaults.json` | — | neu: XMLEncoder-Leser nach den Regeln von `java.beans.XMLDecoder` (Swift liest elementweise und verliert geteilte Werte); Getter-Standardwerte und statische Konstanten mit `tools/java-oracle` gemessen; merkt sich den Java-Typ jedes Primitivs an Settern, Konstruktor- und Aufrufargumenten und welche Eigenschaften ein eigener Getter angelegt hat (für `beanCapture.ts`) | | `src/importProject.ts` | `Persistence/TopologyProjectStore.swift` (Knoten, Ports, Kabel, IP-Konfiguration, Switch/WLAN, Routen, RIP, Firewall, DHCP, Portweiterleitung, Modem, Dateisysteme, Programme, Doku-Elemente des Imports) | übertragen, Eingabe ist Javas Sicht: Name und Port-Anzahl wie Java, abgelehnte Adresse → Swift-Standard, Router-Standardgateway wie Java (Swift verliert es), jede Router-Firewall eingetragen, Konfigurationstexte wie in Swift getrimmt (`swiftTrim`), Rechner ohne Dateisystem leer wie in Java (Swift: Demo-Dateien), alle Programme bleiben (Swift verwirft sechs), Webserver-Dateien bleiben in `/webserver` (Swift: `/www`), keine versteckten Zustandsdateien im Dateisystem, DNS-Einträge so, wie Javas Server sie aus `/dns/hosts` beantwortet, WLAN eines Rechners eingeschaltet nach Javas Funk-Merkmal der Karte (auch ohne SSID; Swift: jede SSID); der Webserver behält Javas Schalter für virtuelle Hosts (Swift: aus); gegen Swifts importiertes Modell auf 13 Dateien geprüft; seit der Abnahme F2 die IP-Weiterleitung eines Knotens, wo sie vom Standard seiner Art abweicht (`ipForwardingByNodeId`; Java `ipForwardingEnabled`, übersehen bis das Firewall-Beispiel lief) | -| `test/importProject.test.ts` | — | neu: Swifts importiertes Modell (13 Dateien, begründete Abweichungen; im Dateisystem ausgenommen nur Swifts versteckte Zustandsdateien), Vollständigkeit aller 23, Pings im Kern (über einen Router; über drei Router mit manuellen Routen und Router-Gateways; seit F2.7 über Funkkabel); seit der Abnahme F2 IP-Weiterleitung und eingeschaltete DNS-Server im Schnappschuss; seit F3.2c eine Firewall, über `konfig` im Lauf geändert, gespeichert und wieder geöffnet (`internetwork_komplett.fls`); seit F3.3a eine Mail, im Lauf per SMTP angenommen, gespeichert und wieder geöffnet (`email_komplett.fls`); seit F3.3b eine Mail vom Programm über den MX an die andere Domain, abgeholt, gespeichert und wieder geöffnet | +| `test/importProject.test.ts` | — | neu: Swifts importiertes Modell (13 Dateien, begründete Abweichungen; im Dateisystem ausgenommen nur Swifts versteckte Zustandsdateien), Vollständigkeit aller 23, Pings im Kern (über einen Router; über drei Router mit manuellen Routen und Router-Gateways; seit F2.7 über Funkkabel); seit der Abnahme F2 IP-Weiterleitung und eingeschaltete DNS-Server im Schnappschuss; seit F3.2c eine Firewall, über `konfig` im Lauf geändert, gespeichert und wieder geöffnet (`internetwork_komplett.fls`); seit F3.3a eine Mail, im Lauf per SMTP angenommen, gespeichert und wieder geöffnet (`email_komplett.fls`); seit F3.3b eine Mail vom Programm über den MX an die andere Domain, abgeholt, gespeichert und wieder geöffnet; seit F3.4a Ordner und Datei aus der Befehlszeile, gespeichert und wieder geöffnet | | `src/systemSoftware.ts` | Java `SwitchFirmware`, `Betriebssystem`, `VermittlungsrechnerBetriebssystem`, `GatewayFirmware`, `Weiterleitungstabelle`, `Firewall`, `FirewallRule`, `DHCPServer`, `ModemFirmware`, `Dateisystem`, `Datei` | neu nach Java: SSID, Lernzeit, RIP, manuelle Routen, Router-Firewall (an allen Stellen, an denen die Datei sie erreicht), DHCP (ein kaputter statischer Eintrag fällt allein weg, Java verliert alle folgenden), statische NAT, Modem, Dateisystem (bei Router und Heimrouter das, was die Datei zu den Vorlagen des Konstruktors hinzufügt, oder eine eigene Wurzel, die sie ersetzt), installierte Programme von Rechner und Notebook (eigene Anwendungen eines Projekts als erfasste Bean, `beanCapture.ts`); `Character.isWhitespace` am JDK gemessen; gegen Java geprüft; seit der Abnahme F2 `ipForwardingEnabled` jedes Knotens mit IP-Stapel, mit Javas Standard der Klasse (Router und Heimrouter an) | | `src/javaIp.ts` | Java `IP.inetAton`/`ipCheck` | neu nach Java; an 46 Fällen mit Java gemessen; seit F2.5a in `packages/core/src/util/javaIp.ts` (der Kern liest damit RIP-Nachrichten) | | `src/dnsHosts.ts` | Java `DNSServer.leseRecordListe`, `ResourceRecord`, `Dateisystem.holeDatei`; Swift `State/TopologyDNSResolver.swift` (`TopologyDNSHostsFileCodec`) als Vergleich | neu nach Java: Felder nur an einzelnen Leerzeichen, keine Kommentare, ungültige TTL → 3600, Doppelte bleiben; ins Modell kommt nur, was Java beantwortet (Typ A/MX/NS, Name nicht leer); Javas Fehler nicht übernommen: Label mit Ziffer vorn erlaubt, kein Backslash, letztes Label nicht rein numerisch (RFC 1123/3696), Typ in jeder Schreibung (RFC 4343), negative TTL ungültig (RFC 2181); an 76 Fällen mit Java und Swift gemessen | @@ -85,7 +87,7 @@ Swift-Pfade relativ zu `filius-ipad/ios/FiliusPad/TopologyEditor/` (Stand | `src/beanCapture.ts` | — | neu: eine decodierte Bean zurück in die Form des Schreibers, mit Javas Zahlentypen; der Verweis auf das Betriebssystem des Knotens als Marke; was das Format nicht sagen kann (Unaufgelöstes, `Field`, Fabrikmethode, ein anderswo per Getter erreichtes Objekt), wird abgelehnt, nicht geraten; Rundlauf-Tests in `test/beanCapture.test.ts` | | `src/javaBeansWriter.ts` | — | neu: Schreiber für das `XMLDecoder`-Format, Gegenstück zu `javabeans.ts`; ausdrücklich typisierte Eingabe, geteilte Objekte über `id`/`idref`, was XML nicht fassen kann (und CR) als ``; von Java selbst geprüft (`BeansDump`) | | `test/javaBeansWriter.test.ts`, `test/beans/` | — | neu: 11 Dateien des Schreibers, von Javas `XMLDecoder` gelesen und beschrieben; Erwartungen von Hand | -| `src/projectSnapshot.ts` | Swift `TopologyNetworkRuntimeTopologySnapshot(editorState:)` | neu (Abnahme F2): das importierte Projekt als Schnappschuss des Kerns; nur die Kabel verbinden (Swifts Verbindung über die SSID nicht übernommen), nur eingeschaltete DNS-Server laufen; seit F3.1 jeder installierte Echo-Server (ein oder aus, er lässt sich zur Laufzeit schalten) und einfache Client; seit F3.2a jeder Webserver und Browser und die Dateisysteme; seit F3.2c der Rückweg `projectWithSimulationChanges`: die Firewalls aus dem Schnappschuss des Laufs ins Projekt, wie Java sie beim Speichern hat; seit F3.3a die installierten E-Mail-Server (ein oder aus) und auf dem Rückweg ihre Postfächer; seit F3.3b die installierten E-Mail-Programme und auf dem Rückweg ihre Ordner | +| `src/projectSnapshot.ts` | Swift `TopologyNetworkRuntimeTopologySnapshot(editorState:)` | neu (Abnahme F2): das importierte Projekt als Schnappschuss des Kerns; nur die Kabel verbinden (Swifts Verbindung über die SSID nicht übernommen), nur eingeschaltete DNS-Server laufen; seit F3.1 jeder installierte Echo-Server (ein oder aus, er lässt sich zur Laufzeit schalten) und einfache Client; seit F3.2a jeder Webserver und Browser und die Dateisysteme; seit F3.2c der Rückweg `projectWithSimulationChanges`: die Firewalls aus dem Schnappschuss des Laufs ins Projekt, wie Java sie beim Speichern hat; seit F3.3a die installierten E-Mail-Server (ein oder aus) und auf dem Rückweg ihre Postfächer; seit F3.3b die installierten E-Mail-Programme und auf dem Rückweg ihre Ordner; seit F3.4a die Knoten mit der Befehlszeile (ihre Dateien sind die des Projekts) | | `test/examplesJava.test.ts`, `test/examples/*.java.json` | — | neu (Abnahme F2): fünf Beispiele von Filius (`internetwork_komplett`, `einfaches_rechnernetz_komplett`, `dns_server`, `nat_with_mapped_port`, `Internet_Komplett_…_DE`) mit dem eigenen Leser eingelesen und im Kern gespielt, gegen Java-Filius (`ExampleRun`): je Karte Frames, Zeiten und Tabellenzeilen, die Aufrufe, die Adressen am Ende; gleichzeitig startende DHCP-Clients je Client; zwei benannte Java-Fehler (`JAVA_BUGS`: Ping ohne Gateway wirft eine `NullPointerException`; NAT-Eintrag nur für die erste Gegenstelle) | | `src/topologyWriter.ts` | Java `SzenarioVerwaltung.netzwerkSpeichern`, Konstruktoren von `NetzwerkInterface`, `Port`, `GUIKabelItem` und der Systemsoftware | neu nach Java: `konfiguration.xml` aus Javas Sicht — Geräte, Schnittstellen (vom Konstruktor angelegte über Getter, weitere per `add`), Ports über Getter-Verweise, Kabel samt Zeichen-Enden (`kabelpanel`), Doku-Elemente; Systemsoftware über ihre Setter: SSID, Lernzeit, RIP, manuelle Routen, DHCP-Client und -Server, statische NAT, Modem, Router-Firewall (über das `konfig`-Plug-in des Webservers, wie XMLEncoder sie erreicht); eigene Anwendungen eines Projekts, wie die Datei sie hatte; Dateisysteme (an die Wurzel des Konstruktors angehängt wie bei XMLEncoder, beim Router hinter dessen Vorlagen); installierte Programme nach den Dateien (Webserver, Tauschbörse und E-Mail-Server legen ihre Ordner nur an, wo sie fehlen; der DNS-Server liest `/dns/hosts` beim Installieren), je unter ihrem Schlüssel mit der Systemsoftware wie `installApp`, samt Einstellungen und persönlicher Firewall; E-Mail: Domain und Bean-Konten des Servers samt Postfächern, Ordner und Adressbuch des Clients (sein Konto steht in `/konten.txt`, einer Datei); Javas Fehler nicht übernommen: ein Empfänger, den eine ältere Datei als Zeichenkette hält, wird als der `AddressEntry` geschrieben, den Javas `AddressEntry(String)` daraus macht (Java legt die Zeichenkette ungeprüft in die typisierte Liste, sein E-Mail-Fenster scheitert daran), ein `null`-Empfänger fällt weg; Kopf „Filius version: 2.14.0 (mdg-filius)“; seit der Abnahme F2 `ipForwardingEnabled`, wo es vom Standard der Klasse abweicht | | `test/topologyWriter.test.ts`, `test/written.java.json` | — | neu: alle 23 Korpus-Dateien gelesen und neu geschrieben, von Java geladen — Topologie, Systemsoftware, Dateisysteme und Programme samt E-Mail wie beim Original (bis auf die benannte Abweichung bei Empfängern als Zeichenkette, nur in `man-in-the-middle.fls`) (Java gegen Java); dazu eine künstliche Topologie mit dem, was der Korpus nicht hat (u. a. eingeschaltete Router-Firewall mit Regeln jedes Protokolls, alle Firewall-Schalter abseits der Vorgabe, Modem mit eigenem Port und Ziel, verschachtelter Dateibaum mit umbenannter Wurzel, namenlosem Ordner, Datei ohne Typ und Inhalt mit CR/CRLF und Zeichen jenseits der BMP, Heimrouter mit eigener Wurzel, jedes Filius-Programm mit Einstellungen abseits der Vorgabe samt persönlicher Firewall, von Java angelegte Ordner `/peer2peer` und `/mailserver`, E-Mail-Server und -Client mit Konto, Postfach, drei Ordnern, Adressbuch und Empfängern aller Formen) | diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 141cdfb..a48623a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -26,6 +26,8 @@ export * from './runtime/apps/routerPages.js'; export * from './runtime/apps/firewallSettings.js'; export * from './runtime/apps/emailServer.js'; export * from './runtime/apps/emailClient.js'; +export * from './runtime/apps/terminal.js'; +export * from './runtime/apps/terminalTexts.js'; export * from './runtime/email.js'; export * from './runtime/http.js'; export * from './util/equal.js'; diff --git a/packages/core/src/model/virtualFileSystem.ts b/packages/core/src/model/virtualFileSystem.ts index 9a1ec74..d5a4169 100644 --- a/packages/core/src/model/virtualFileSystem.ts +++ b/packages/core/src/model/virtualFileSystem.ts @@ -261,6 +261,19 @@ export class VirtualFileSystem { }); } + /** + * A directory's entries in the order they were made, as Java's file tree + * keeps them (its command line lists them so); a file written anew keeps + * its place. + */ + entriesInCreationOrder(rawDirectoryPath: string): VirtualFileEntry[] { + const directoryPath = this.existingPath(rawDirectoryPath); + if (this.get(directoryPath)?.kind !== 'directory') fail('expectedDirectory', directoryPath); + return [...this.store.values()] + .filter(({ path }) => !swiftEqual(path, directoryPath) && swiftEqual(parentPath(path), directoryPath)) + .map(({ path, content }) => ({ path, content })); + } + textFile(rawPath: string): string { const entry = this.entry(rawPath); if (entry.content.kind !== 'text') fail('expectedTextFile', entry.path); diff --git a/packages/core/src/runtime/apps/terminal.ts b/packages/core/src/runtime/apps/terminal.ts new file mode 100644 index 0000000..5e45276 --- /dev/null +++ b/packages/core/src/runtime/apps/terminal.ts @@ -0,0 +1,363 @@ +// FILIUS' command line (filius.software.lokal.Terminal, with the input +// handling of GUIApplicationTerminalWindow): a line's first word is the +// command, the others its parameters; the program tells its window texts, +// in the project's language, as Java writes them. The files are the node's +// (the snapshot's file system, the same the project keeps). +// +// Departures from Java (terminal.test.ts names each): +// - a text file's size is its length in characters (Java decodes the text as +// Base64 and counts the bytes: "Hallo Welt" is 6); +// - a folder that is not there is "not there" for ls (Java: "empty"), and +// ls / names the root (Java leaves the path out); +// - cd to a file is "not there" (Java makes the file the working directory); +// - touch and mkdir in a folder that is not there fail (Java says the file +// was made, or the folder is there already); cp onto a folder's name +// fails (Java throws); +// - ".." at the root stays there (Java finds nothing, or throws); +// - rm and mv take an absolute path as absolute (Java puts the working +// directory in front of the path it removes); the root cannot be removed (Java removes the working +// directory and says it removed the file); after the working directory +// is removed, the nearest folder above it that is left is the working +// directory (Java goes on in the removed one); +// - mv onto the file itself, also in another case, renames it (Java copies +// the file onto itself and removes it). + +import type { Id } from '../../ids.js'; +import type { VirtualFileContent, VirtualFileSystem } from '../../model/virtualFileSystem.js'; +import { entryName, parentPath } from '../../model/virtualFileSystem.js'; +import type { NetworkRuntimeEngine } from '../engine.js'; +import { javaTrim } from '../http.js'; +import type { Steps } from '../threads.js'; +import { javaBase64 } from '../../util/javaBase64.js'; +import { CommandThread, ProgramLog } from './program.js'; +import type { PageLanguage } from './routerPages.js'; +import { TERMINAL_TEXTS, type TerminalTextKey } from './terminalTexts.js'; + +/** What the command line tells its window: a text, or whether a command runs on (Java's Boolean). */ +export type TerminalLogEntry = { readonly kind: 'text'; readonly text: string } | { readonly kind: 'busy'; readonly busy: boolean }; + +/** What the window does itself with a line (GUIApplicationTerminalWindow). */ +export type TerminalWindowAction = 'blank' | 'exit' | 'clear'; + +/** GUIApplicationTerminalWindow.MENU_LINE. */ +export const TERMINAL_MENU_LINE = '==========================================================================\n'; + +/** The usage texts' keys by command (Terminal.initUsageInfo). */ +const USAGE: Record = { + arp: 'arp', + arpsend: 'arpsend', + cat: 'cat', + cd: 'cd', + copy: 'copy', + cp: 'copy', + del: 'del', + dir: 'dir', + help: 'help', + host: 'host', + ipconfig: 'ipconfig', + ls: 'dir', + mkdir: 'mkdir', + move: 'move', + mv: 'move', + netstat: 'netstat', + nslookup: 'nslookup', + ping: 'ping', + pwd: 'pwd', + rm: 'del', + route: 'route', + tcpdump: 'tcpdump', + touch: 'touch', + traceroute: 'traceroute', + type: 'cat', +}; + +/** + * Dateisystem.evaluatePathString for an absolute path: "." and empty parts + * left out, ".." one up (at the root it stays there). + */ +function evaluatedPath(path: string): string { + const parts: string[] = []; + for (const part of path.split('/')) { + if (part === '..') parts.pop(); + else if (part !== '.' && part !== '') parts.push(part); + } + return `/${parts.join('/')}`; +} + +/** A path's last part (Dateisystem.getBasename). */ +const basenameOf = (path: string) => path.slice(path.lastIndexOf('/') + 1); + +export class Terminal { + readonly log: ProgramLog; + private directoryValue = '/'; + /** The program's thread (Anwendung.ausfuehren): one command after the other. */ + private readonly commands: CommandThread; + + constructor( + private readonly engine: NetworkRuntimeEngine, + private readonly nodeId: Id, + private readonly files: VirtualFileSystem, + ) { + this.log = new ProgramLog(engine); + this.commands = new CommandThread(engine); + } + + private get language(): PageLanguage { + return this.engine.state.topologySnapshot.language; + } + + private text(key: TerminalTextKey): string { + return TERMINAL_TEXTS[this.language][key]; + } + + /** The working directory, as Dateisystem.absoluterPfad writes it. */ + get directory(): string { + return this.directoryValue; + } + + /** The window's prompt. */ + get prompt(): string { + return `${this.directoryValue}> `; + } + + /** GUIApplicationTerminalWindow.showStartScreen. */ + get startScreen(): string { + return `${this.text('sw_terminal_msg57')}\n${TERMINAL_MENU_LINE}${this.text('sw_terminal_msg26')}\n${TERMINAL_MENU_LINE}`; + } + + /** + * A line typed into the window: blank, exit, cls and reset are the + * window's; any other line is the program's command, run by its thread. + */ + enter(line: string): TerminalWindowAction | undefined { + const words = line.split(' ').filter((word) => word !== ''); + if (javaTrim(line) === '' || words.length === 0) return 'blank'; + const [command, ...parameters] = words as [string, ...string[]]; + if (command === 'exit') return 'exit'; + if (command === 'reset' || command === 'cls') return 'clear'; + this.commands.hand(() => this.run(command, parameters)); + this.engine.resumeThreads(); + return undefined; + } + + private tell(text: string): void { + this.log.write({ kind: 'text', text }); + } + + /** Terminal.terminalEingabeAuswerten: the method of the command's name, if Java has one. */ + private *run(command: string, parameters: readonly string[]): Steps { + const local: Record void> = { + cat: (each) => this.cat(each), + cd: (each) => this.cd(each), + copy: (each) => this.copy(each, 'cp'), + cp: (each) => this.copy(each, 'cp'), + del: (each) => this.remove(each), + dir: (each) => this.list(each), + help: (each) => this.usage(each[0] ?? ''), + ipconfig: (each) => this.ipconfig(each), + ls: (each) => this.list(each), + mkdir: (each) => this.makeDirectory(each), + move: (each) => this.move(each), + mv: (each) => this.move(each), + pwd: (each) => (each.length === 0 ? this.tell(this.directoryValue) : this.usage('pwd')), + rm: (each) => this.remove(each), + route: (each) => this.route(each), + test: () => this.test(), + touch: (each) => this.touch(each), + type: (each) => this.cat(each), + }; + const handler = Object.hasOwn(local, command) ? local[command] : undefined; + if (handler === undefined) { + this.tell(`${this.text('terminal_msg2')}\n${this.text('terminal_msg3')}`); + return; + } + handler(parameters); + } + + /** Terminal.usage: the command's usage, or the list of commands. */ + private usage(command: string): void { + const key = Object.hasOwn(USAGE, command) ? USAGE[command] : undefined; + if (key === undefined) { + this.tell(this.text('sw_terminal_msg25')); + return; + } + const texts = TERMINAL_TEXTS[this.language] as Record; + this.tell(`${texts[`sw_terminal_${key}`]}\n${texts[`sw_terminal_usage_${key}`]}\n`); + } + + /** A parameter as an absolute path: from the root, or from the working directory. */ + private absolute(path: string): string { + return evaluatedPath(path.startsWith('/') ? path : `${this.directoryValue}/${path}`); + } + + /** The content at a path, found in any case; undefined when there is none. */ + private content(path: string): { readonly path: string; readonly content: VirtualFileContent } | undefined { + try { + return this.files.entry(path); + } catch { + return undefined; + } + } + + /** Datei.holeGroesse, a text in characters (see the departures above). */ + private static size(content: VirtualFileContent): number { + return content.kind === 'text' ? content.text.length : content.kind === 'directory' ? 0 : content.data.length; + } + + /** Terminal.dir. */ + private list(parameters: readonly string[]): void { + if (parameters.length > 1) return this.usage('dir'); + const shown = parameters.length === 0 ? this.directoryValue : this.absolute(parameters[0]!); + const found = this.content(shown); + if (found === undefined || found.content.kind !== 'directory') return this.tell(this.text('sw_terminal_msg20')); + const entries = this.files.entriesInCreationOrder(found.path); + if (entries.length === 0) return this.tell(this.text('sw_terminal_msg8')); + let text = `${this.text('sw_terminal_msg9')} ${shown}:`; + let directories = 0; + let files = 0; + for (const entry of entries) { + const name = entryName(entry.path); + if (entry.content.kind === 'directory') { + directories += 1; + text += `\n[${name}]`; + } else { + files += 1; + text += `\n${name}${'.'.repeat(Math.max(0, 40 - name.length))}${Terminal.size(entry.content)}`; + } + } + this.tell(`${text}\n${this.text('sw_terminal_msg10')}${directories}${this.text('sw_terminal_msg11')}${files}`); + } + + /** Terminal.cd. */ + private cd(parameters: readonly string[]): void { + if (parameters.length > 1) return this.usage('cd'); + if (parameters.length === 0) return this.tell(this.directoryValue); + const found = this.content(this.absolute(parameters[0]!)); + if (found === undefined || found.content.kind !== 'directory') return this.tell(this.text('sw_terminal_msg20')); + this.directoryValue = found.path; + this.tell(''); + } + + /** A new item at a path (touch, mkdir): the parent must be a folder, the name new. */ + private create(parameters: readonly string[], command: 'touch' | 'mkdir', make: (path: string) => void): void { + if (parameters.length !== 1) return this.usage(command); + const keys = + command === 'touch' + ? ({ noName: 'sw_terminal_msg15', exists: 'sw_terminal_msg14', made: 'sw_terminal_msg13', failed: 'sw_terminal_msg12' } as const) + : ({ noName: 'sw_terminal_msg19', exists: 'sw_terminal_msg18', made: 'sw_terminal_msg17', failed: 'sw_terminal_msg16' } as const); + const path = this.absolute(parameters[0]!); + if (basenameOf(path) === '') return this.tell(this.text(keys.noName)); + if (this.content(path) !== undefined) return this.tell(this.text(keys.exists)); + // The file system takes nothing in a folder that is not there (or is a file). + try { + make(path); + this.tell(this.text(keys.made)); + } catch { + this.tell(this.text(keys.failed)); + } + } + + private touch(parameters: readonly string[]): void { + this.create(parameters, 'touch', (path) => this.files.writeTextFile(path, '', false)); + } + + private makeDirectory(parameters: readonly string[]): void { + this.create(parameters, 'mkdir', (path) => this.files.createDirectory(path)); + } + + /** Writes content as a new file or over a file of that name (Dateisystem.speicherDatei). */ + private write(path: string, content: VirtualFileContent): void { + if (content.kind === 'text') this.files.writeTextFile(path, content.text); + else if (content.kind === 'image') this.files.writeImageFile(path, content.data, content.mediaType); + else if (content.kind === 'binary') this.files.writeBinaryFile(path, content.data, content.mediaType); + } + + /** Terminal.pureCopy: a file to a new name or over a file; false where it cannot. */ + private copied(parameters: readonly string[]): { readonly source: string; readonly destination: string } | undefined { + const source = this.content(this.absolute(parameters[0]!)); + const destination = this.absolute(parameters[1]!); + if (source === undefined || source.content.kind === 'directory' || basenameOf(destination) === '') return undefined; + // The file system writes over a file only, in a folder that is there; onto the file itself it changes nothing. + try { + this.write(destination, source.content); + } catch { + return undefined; + } + return { source: source.path, destination }; + } + + private copy(parameters: readonly string[], command: 'cp'): void { + if (parameters.length !== 2) return this.usage(command); + this.tell(this.text(this.copied(parameters) === undefined ? 'sw_terminal_msg34' : 'sw_terminal_msg33')); + } + + /** Terminal.mv: copied, then the source removed; onto the file itself, renamed. */ + private move(parameters: readonly string[]): void { + if (parameters.length !== 2) return this.usage('mv'); + const done = this.copied(parameters); + if (done === undefined) return this.tell(this.text('sw_terminal_msg36')); + if (done.source.toLowerCase() === done.destination.toLowerCase()) { + const content = this.files.entry(done.source).content; + this.files.deleteItem(done.source); + this.write(done.destination, content); + } else { + this.files.deleteItem(done.source, true); + } + this.tell(this.text('sw_terminal_msg35')); + } + + /** Terminal.del: a file or a folder with all in it. */ + private remove(parameters: readonly string[]): void { + if (parameters.length !== 1) return this.usage('del'); + const found = this.content(this.absolute(parameters[0]!)); + if (found === undefined || found.path === '/') return this.tell(this.text('sw_terminal_msg38')); + this.files.deleteItem(found.path, true); + while (this.content(this.directoryValue) === undefined) this.directoryValue = parentPath(this.directoryValue); + this.tell(this.text('sw_terminal_msg37')); + } + + /** Terminal.cat: a file's content as Java keeps it (an image or binary file in Base64). */ + private cat(parameters: readonly string[]): void { + if (parameters.length === 0) { + this.usage('cat'); + this.tell(''); + return; + } + const found = this.content(this.absolute(parameters[0]!)); + if (found === undefined || found.content.kind === 'directory') return this.tell(this.text('sw_terminal_msg54')); + this.tell(found.content.kind === 'text' ? found.content.text : javaBase64(found.content.data)); + } + + /** Terminal.test: test.txt in the working directory. */ + private test(): void { + try { + this.files.writeTextFile(`${this.directoryValue === '/' ? '' : this.directoryValue}/test.txt`, 'blaaa'); + this.tell(this.text('sw_terminal_msg24')); + } catch { + this.tell(this.text('sw_terminal_msg23')); + } + } + + /** Terminal.ipconfig: the node's first address, mask, MAC, gateway and DNS server. */ + private ipconfig(parameters: readonly string[]): void { + if (parameters.length !== 0) return this.usage('ipconfig'); + const configuration = this.engine.state.topologySnapshot.deviceConfigurations.get(this.nodeId); + const card = this.engine.networkInterfaces(this.nodeId)[0]; + this.tell( + `${this.text('sw_terminal_msg4')} ${card?.ipAddress ?? configuration?.ipAddress ?? ''}\n` + + `${this.text('sw_terminal_msg5')} ${card?.subnetMask ?? configuration?.subnetMask ?? ''}\n` + + `${this.text('sw_terminal_msg6666')} ${card?.macAddress ?? ''}\n` + + `${this.text('sw_terminal_msg6')} ${configuration?.defaultGateway ?? ''}\n` + + `${this.text('sw_terminal_msg27')} ${configuration?.dnsServer ?? ''}\n`, + ); + } + + /** Terminal.route: the forwarding table, each cell padded to 15. */ + private route(parameters: readonly string[]): void { + if (parameters.length !== 0) return this.usage('route'); + const rows = this.engine.forwardingTable(this.nodeId); + const cell = (text: string) => `${text}${' '.repeat(Math.max(0, 15 - text.length))} | `; + const table = rows.map((row) => `| ${[row.destinationNetwork, row.subnetMask, row.nextHop, row.interfaceIPAddress].map(cell).join('')}\n`).join(''); + this.tell(this.text('sw_terminal_msg7') + table); + } +} diff --git a/packages/core/src/runtime/apps/terminalTexts.ts b/packages/core/src/runtime/apps/terminalTexts.ts new file mode 100644 index 0000000..0854b31 --- /dev/null +++ b/packages/core/src/runtime/apps/terminalTexts.ts @@ -0,0 +1,226 @@ +// The command line's texts as Java FILIUS's message bundle gives them +// (MessagesBundle_de_DE, _en_GB; the keys sw_terminal_* and terminal_msg*), +// written from what tools/java-oracle's TerminalCases read from Java (texts +// of terminal..java.json), so that continued lines and spacing are +// Java's own. + +import type { PageLanguage } from './routerPages.js'; + +export const TERMINAL_TEXTS = { + de: { + sw_terminal_arp: 'arp - show or manipulate Address Resolution Protocol (ARP) table', + sw_terminal_arpsend: 'arpsend - send an ARP reply', + sw_terminal_cat: 'cat / type - show file contents', + sw_terminal_cd: 'cd - change directory', + sw_terminal_copy: 'copy / cp - copy file', + sw_terminal_del: 'del / rm - delete file/directory', + sw_terminal_dir: 'dir / ls - show list of files in current directory', + sw_terminal_exit: 'exit - exit terminal application', + sw_terminal_help: 'help - show the list of commands or info on one command', + sw_terminal_host: 'host - resolve hostname to IP address', + sw_terminal_ipconfig: 'ipconfig - show network configuration', + sw_terminal_mkdir: 'mkdir - create directory', + sw_terminal_move: 'move / mv - move/rename file', + sw_terminal_msg10: '\nAnzahl Verzeichnisse:', + sw_terminal_msg11: '\nAnzahl Dateien:', + sw_terminal_msg12: 'Fehler bei Touch\n', + sw_terminal_msg13: 'Datei erstellt\n', + sw_terminal_msg14: 'Datei bereits vorhanden\n', + sw_terminal_msg15: 'Bitte einen Dateinamen angeben!\n', + sw_terminal_msg16: 'Fehler beim Ordner erstellen\n', + sw_terminal_msg17: 'Ordner erstellt\n', + sw_terminal_msg18: 'Ordner bereits vorhanden\n', + sw_terminal_msg19: 'Bitte einen Ordnernamen angeben!\n', + sw_terminal_msg20: 'Verzeichnis nicht vorhanden\n', + sw_terminal_msg23: 'Test\n', + sw_terminal_msg24: 'Erfolgreich erstellt!', + sw_terminal_msg25: + 'Liste verfügbarer Befehle:\n arp zeige Adresstabelle des "Address Resolution Protocol" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n', + sw_terminal_msg26: "Verwende den Befehl 'help' um Liste der verfügbaren Befehle anzuzeigen\n oder nutze 'help ' für weitere Infos zum Befehl.", + sw_terminal_msg27: 'DNS-Server . . . :', + sw_terminal_msg28: 'hat die IP-Adresse', + sw_terminal_msg29: 'Ungültige Host-Angabe!\nNur korrekte URLs ohne Pfadangabe erlaubt.\n', + sw_terminal_msg30: 'Hostname konnte nicht aufgelöst werden!\nEventuell ist kein DNS-Server verfügbar.\n', + sw_terminal_msg31: 'Zeitüberschreitung! Keine Antwort empfangen.', + sw_terminal_msg33: 'Datei erfolgreich kopiert\n', + sw_terminal_msg34: 'Datei konnte nicht kopiert werden\n', + sw_terminal_msg35: 'Datei erfolgreich verschoben/umbenannt\n', + sw_terminal_msg36: 'Datei konnte nicht verschoben/umbenannt werden\n', + sw_terminal_msg37: 'Datei erfolgreich gelöscht\n', + sw_terminal_msg38: 'Datei konnte nicht gelöscht werden\n', + sw_terminal_msg4: 'IP Adresse . . . :', + sw_terminal_msg45: 'Paketstatistik', + sw_terminal_msg47: 'Paket(e) empfangen', + sw_terminal_msg48: 'Paketverlust', + sw_terminal_msg49: '| Proto | Lokale Adresse | Entfernte Adresse | Zustand |\n', + sw_terminal_msg5: 'Netzmaske. . . . :', + sw_terminal_msg50: '| Internetadresse | Physische Adresse |\n', + sw_terminal_msg52: 'Zieladresse nicht erreichbar', + sw_terminal_msg53: 'Ping zu Broadcast-Adressen wird nicht unterstützt.', + sw_terminal_msg54: 'Datei nicht vorhanden', + sw_terminal_msg55: 'Beenden mit Strg+C', + sw_terminal_msg57: + "\n\n sSSs .S S. .S .S S. sSSs \n d%%SP .SS SS. .SS .SS SS. d%%SP \n d%S' S%S S%S S%S S%S S%S d%S' \n S%S S%S S%S S%S S%S S%S S%| \n S&S S&S S&S S&S S&S S&S S&S \n S&S_Ss S&S S&S S&S S&S S&S Y&Ss \n S&S~SP S&S S&S S&S S&S S&S `S&&S \n S&S S&S S&S S&S S&S S&S `S*S \n S*b S*S S*b S*S S*b d*S l*S \n S*S S*S S*S. S*S S*S. .S*S .S*P \n S*S S*S SSSbs S*S SSSbs_sdSSS sSS*S \n S*S S*S YSSP S*S YSSP~YSSY YSS' \n SP SP SP \n Y Y Y \n\n", + sw_terminal_msg58: 'Mails werden behandelt durch', + sw_terminal_msg6: 'Standardgateway. :', + sw_terminal_msg6666: 'Physische Adresse:', + sw_terminal_msg7: '| Ziel | Netzmaske | Gateway | Schnittstelle |\n -----------------------------------------------------------------------\n', + sw_terminal_msg8: 'Verzeichnis ist leer\n', + sw_terminal_msg9: 'Verzeichnis', + sw_terminal_netstat: 'netstat - show list of connections', + sw_terminal_nslookup: 'nslookup - resolve hostname to IP address', + sw_terminal_ping: 'ping - test connection to other computer', + sw_terminal_pwd: 'pwd - print working directory', + sw_terminal_route: 'route - show routing table', + sw_terminal_tcpdump: 'tcpdump - show data exchange', + sw_terminal_touch: 'touch - create file', + sw_terminal_trace_msg10: 'Fehler: %s antwortet "ICMP Destination Unreachable"', + sw_terminal_trace_msg11: '%s wurde nach einem Sprung (hop) erreicht.', + sw_terminal_trace_msg12: '%s wurde nach %s Sprüngen (hops) erreicht.', + sw_terminal_trace_msg13: 'Fehler: nächste Station konnte mehrfach nicht erreicht werden.', + sw_terminal_trace_msg2: 'Fehler: Verbindung zum DNS-Server nicht möglich.', + sw_terminal_trace_msg3: 'Fehler: Domainname konnte nicht aufgelöst werden.', + sw_terminal_trace_msg4: 'Verbindung nach %s wird bestimmt (max. %s Stationen).', + sw_terminal_trace_msg5: 'Verbindung nach %s (%s) wird bestimmt (max. %s Stationen).', + sw_terminal_trace_msg6: '%s konnte über %s Stationen (hops) nicht erreicht werden.', + sw_terminal_trace_msg7: 'Analyse abgebrochen!', + sw_terminal_trace_msg8: 'Fehler: %s antwortet "ICMP Network Unreachable"', + sw_terminal_trace_msg9: 'Fehler: %s antwortet "ICMP Host Unreachable"', + sw_terminal_traceroute: 'traceroute - analyse hops of connecting path', + sw_terminal_usage_arp: + 'Usage: arp [-d []] [-a ] \n -d \t delete ARP entry for IP address or reset ARP table \n -a \t show ARP entry for specified IP address', + sw_terminal_usage_arpsend: + 'Usage: arpsend \n address to be published for own MAC address\n target the reply must be sent to', + sw_terminal_usage_cat: 'Usage: cat ', + sw_terminal_usage_cd: 'Usage: cd ', + sw_terminal_usage_copy: 'Usage: copy ', + sw_terminal_usage_del: 'Usage: del \n relative path to current directory', + sw_terminal_usage_dir: 'Usage: dir', + sw_terminal_usage_exit: 'Usage: exit', + sw_terminal_usage_help: 'Usage: help []', + sw_terminal_usage_host: 'Usage: host \n the domain for which to look up A and MX records', + sw_terminal_usage_ipconfig: 'Usage: ipconfig', + sw_terminal_usage_mkdir: 'Usage: mkdir \n name of new directory either as absolute path \n or relative path', + sw_terminal_usage_move: 'Usage: move ', + sw_terminal_usage_netstat: 'Usage: netstat', + sw_terminal_usage_nslookup: 'Usage: nslookup \n the domain for which to look up A (and related NS) records', + sw_terminal_usage_ping: 'Usage: ping \n the remote address as IP address or host name', + sw_terminal_usage_pwd: 'Usage: pwd', + sw_terminal_usage_route: 'Usage: route', + sw_terminal_usage_tcpdump: 'Usage: tcpdump', + sw_terminal_usage_touch: 'Usage: touch ', + sw_terminal_usage_traceroute: 'Usage: traceroute \n the remote address as IP address or host name', + terminal_msg1: 'root>', + terminal_msg2: 'Unbekannter Befehl!', + terminal_msg3: "Mit 'help' erhalten Sie eine Liste bekannter Befehle.", + }, + en: { + sw_terminal_arp: 'arp - show or manipulate Address Resolution Protocol (ARP) table', + sw_terminal_arpsend: 'arpsend - send an ARP reply', + sw_terminal_cat: 'cat / type - show file contents', + sw_terminal_cd: 'cd - change directory', + sw_terminal_copy: 'copy / cp - copy file', + sw_terminal_del: 'del / rm - delete file/directory', + sw_terminal_dir: 'dir / ls - show list of files in current directory', + sw_terminal_exit: 'exit - exit terminal application', + sw_terminal_help: 'help - show the list of commands or info on one command', + sw_terminal_host: 'host - resolve hostname to IP address', + sw_terminal_ipconfig: 'ipconfig - show network configuration', + sw_terminal_mkdir: 'mkdir - create directory', + sw_terminal_move: 'move / mv - move/rename file', + sw_terminal_msg10: '\nNumber of directories:', + sw_terminal_msg11: '\nNumber of files:', + sw_terminal_msg12: 'Error in Touch\n', + sw_terminal_msg13: 'File created\n', + sw_terminal_msg14: 'File does already exist\n', + sw_terminal_msg15: 'Please enter a file name!\n', + sw_terminal_msg16: 'Error while creating new folder\n', + sw_terminal_msg17: 'Folder is created\n', + sw_terminal_msg18: 'Folder does already exist\n', + sw_terminal_msg19: 'Please enter folder name!\n', + sw_terminal_msg20: 'Directory does not exist\n', + sw_terminal_msg23: 'Test\n', + sw_terminal_msg24: 'Successfully built!', + sw_terminal_msg25: + 'List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n', + sw_terminal_msg26: "Use command 'help' to show list of available commands \n or 'help ' for further information on the command.", + sw_terminal_msg27: 'DNS server . . .:', + sw_terminal_msg28: 'has the IP address', + sw_terminal_msg29: 'Invalid host string!\nOnly correct URLs without paths are allowed.\n', + sw_terminal_msg30: 'Hostname could not be resolved!\nPossibly no DNS server is available.\n', + sw_terminal_msg31: 'Timeout! No response received during waiting period.', + sw_terminal_msg33: 'File successfully copied\n', + sw_terminal_msg34: 'File could not be copied\n', + sw_terminal_msg35: 'File successfully moved/renamed\n', + sw_terminal_msg36: 'File could not be moved/renamed\n', + sw_terminal_msg37: 'File successfully deleted\n', + sw_terminal_msg38: 'File could not be deleted\n', + sw_terminal_msg4: 'IP address . . .:', + sw_terminal_msg45: 'packet statistics', + sw_terminal_msg47: 'packet(s) received', + sw_terminal_msg48: 'packet loss', + sw_terminal_msg49: '| Proto | Local Address | Remote Address | State |\n', + sw_terminal_msg5: 'Netmask. . . . .:', + sw_terminal_msg50: '| Internet Address | Physical Address |\n', + sw_terminal_msg52: 'Destination not reachable', + sw_terminal_msg53: 'Ping to Broadcast is not supported.', + sw_terminal_msg54: 'No such file', + sw_terminal_msg55: 'Cancel with Ctrl+C', + sw_terminal_msg57: + "\n\n sSSs .S S. .S .S S. sSSs \n d%%SP .SS SS. .SS .SS SS. d%%SP \n d%S' S%S S%S S%S S%S S%S d%S' \n S%S S%S S%S S%S S%S S%S S%| \n S&S S&S S&S S&S S&S S&S S&S \n S&S_Ss S&S S&S S&S S&S S&S Y&Ss \n S&S~SP S&S S&S S&S S&S S&S `S&&S \n S&S S&S S&S S&S S&S S&S `S*S \n S*b S*S S*b S*S S*b d*S l*S \n S*S S*S S*S. S*S S*S. .S*S .S*P \n S*S S*S SSSbs S*S SSSbs_sdSSS sSS*S \n S*S S*S YSSP S*S YSSP~YSSY YSS' \n SP SP SP \n Y Y Y \n\n", + sw_terminal_msg58: 'mail is handled by', + sw_terminal_msg6: 'Standard gateway:', + sw_terminal_msg6666: 'Physical address:', + sw_terminal_msg7: '| Destination | Netmask | Gateway | Interface |\n -------------------------------------------------------------------------\n', + sw_terminal_msg8: 'Directory is empty\n', + sw_terminal_msg9: 'Directory', + sw_terminal_netstat: 'netstat - show list of connections', + sw_terminal_nslookup: 'nslookup - resolve hostname to IP address', + sw_terminal_ping: 'ping - test connection to other computer', + sw_terminal_pwd: 'pwd - print working directory', + sw_terminal_route: 'route - show routing table', + sw_terminal_tcpdump: 'tcpdump - show data exchange', + sw_terminal_touch: 'touch - create file', + sw_terminal_trace_msg10: 'Error: response from %s was "ICMP Destination Unreachable"', + sw_terminal_trace_msg11: '%s was reached with one hop.', + sw_terminal_trace_msg12: '%s was reached with %s hops.', + sw_terminal_trace_msg13: 'Error: next hop could not be processed.', + sw_terminal_trace_msg2: 'Error: could not connect to DNS server.', + sw_terminal_trace_msg3: 'Error: domain could not be resolved.', + sw_terminal_trace_msg4: 'trace route to %s started (max. %s hops).', + sw_terminal_trace_msg5: 'trace route to %s (%s) started (max. %s hops).', + sw_terminal_trace_msg6: '%s could not be reached via %s hops.', + sw_terminal_trace_msg7: 'Analysis interrupted!', + sw_terminal_trace_msg8: 'Error: response from %s was "ICMP Network Unreachable"', + sw_terminal_trace_msg9: 'Error: response from %s was "ICMP Host Unreachable"', + sw_terminal_traceroute: 'traceroute - analyse hops of connecting path', + sw_terminal_usage_arp: + 'Usage: arp [-d []] [-a ] \n -d \t delete ARP entry for IP address or reset ARP table \n -a \t show ARP entry for specified IP address', + sw_terminal_usage_arpsend: + 'Usage: arpsend \n address to be published for own MAC address\n target the reply must be sent to', + sw_terminal_usage_cat: 'Usage: cat ', + sw_terminal_usage_cd: 'Usage: cd ', + sw_terminal_usage_copy: 'Usage: copy ', + sw_terminal_usage_del: 'Usage: del \n relative path to current directory', + sw_terminal_usage_dir: 'Usage: dir', + sw_terminal_usage_exit: 'Usage: exit', + sw_terminal_usage_help: 'Usage: help []', + sw_terminal_usage_host: 'Usage: host \n the domain for which to look up A and MX records', + sw_terminal_usage_ipconfig: 'Usage: ipconfig', + sw_terminal_usage_mkdir: 'Usage: mkdir \n name of new directory either as absolute path \n or relative path', + sw_terminal_usage_move: 'Usage: move ', + sw_terminal_usage_netstat: 'Usage: netstat', + sw_terminal_usage_nslookup: 'Usage: nslookup \n the domain for which to look up A (and related NS) records', + sw_terminal_usage_ping: 'Usage: ping \n the remote address as IP address or host name', + sw_terminal_usage_pwd: 'Usage: pwd', + sw_terminal_usage_route: 'Usage: route', + sw_terminal_usage_tcpdump: 'Usage: tcpdump', + sw_terminal_usage_touch: 'Usage: touch ', + sw_terminal_usage_traceroute: 'Usage: traceroute \n the remote address as IP address or host name', + terminal_msg1: 'root>', + terminal_msg2: 'Unknown command!', + terminal_msg3: "Type 'help' to get a list of available commands.", + }, +} as const satisfies Record>; + +export type TerminalTextKey = keyof (typeof TERMINAL_TEXTS)['de']; diff --git a/packages/core/src/runtime/engine.ts b/packages/core/src/runtime/engine.ts index 0c891bd..5a264c7 100644 --- a/packages/core/src/runtime/engine.ts +++ b/packages/core/src/runtime/engine.ts @@ -118,6 +118,7 @@ import { EchoServer, SimpleClient } from './apps/echo.js'; import { WebBrowser, WebServer, type WebServerPage } from './apps/web.js'; import { EmailClient, type EmailClientFolders } from './apps/emailClient.js'; import { EmailServer } from './apps/emailServer.js'; +import { Terminal } from './apps/terminal.js'; import { firewallLogPage, forwardingTablePage, ripTablePage, routerIndexPage } from './apps/routerPages.js'; import { applyFirewallSettings, firewallSettingsPage } from './apps/firewallSettings.js'; import { VirtualFileSystem } from '../model/virtualFileSystem.js'; @@ -915,6 +916,7 @@ export class NetworkRuntimeEngine { private readonly webBrowsersByNodeId = new Map(); private readonly emailServersByNodeId = new Map(); private readonly emailClientsByNodeId = new Map(); + private readonly terminalsByNodeId = new Map(); /** The time of day a program writes into a mail (Java's new Date()). */ private readonly wallClock: () => number; /** Each node's firewall log; it outlives a stop and a new start, as Java's log page does. */ @@ -1046,6 +1048,7 @@ export class NetworkRuntimeEngine { this.webBrowsersByNodeId.clear(); this.emailServersByNodeId.clear(); this.emailClientsByNodeId.clear(); + this.terminalsByNodeId.clear(); this.arpLookups = []; this.protocolThreads.clear(); this.dnsQueriesBySocketId.clear(); @@ -1136,6 +1139,11 @@ export class NetworkRuntimeEngine { return this.emailServersByNodeId.get(nodeId); } + /** The node's command line while the simulation runs, if it has one installed. */ + terminal(nodeId: Id): Terminal | undefined { + return this.terminalsByNodeId.get(nodeId); + } + /** The node's e-mail program while the simulation runs, if it has one installed. */ emailClient(nodeId: Id): EmailClient | undefined { return this.emailClientsByNodeId.get(nodeId); @@ -1171,6 +1179,7 @@ export class NetworkRuntimeEngine { this.webBrowsersByNodeId.clear(); this.emailServersByNodeId.clear(); this.emailClientsByNodeId.clear(); + this.terminalsByNodeId.clear(); for (const node of snapshot.nodes) { const echoServer = snapshot.echoServersByNodeId.get(node.id); if (echoServer !== undefined) this.echoServersByNodeId.set(node.id, new EchoServer(this, node.id, echoServer)); @@ -1196,6 +1205,17 @@ export class NetworkRuntimeEngine { ), ); } + if (snapshot.terminalNodeIds.has(node.id)) { + let files = snapshot.fileSystemsByNodeId.get(node.id); + if (files === undefined) { + // A node without files gets an empty file system, kept in the snapshot. + files = new VirtualFileSystem(); + this.stateValue.topologySnapshot = withSnapshot(this.stateValue.topologySnapshot, { + fileSystemsByNodeId: new Map([...this.stateValue.topologySnapshot.fileSystemsByNodeId, [node.id, files]]), + }); + } + this.terminalsByNodeId.set(node.id, new Terminal(this, node.id, files)); + } const emailClient = snapshot.emailClientsByNodeId.get(node.id); if (emailClient !== undefined) { const nodeId = node.id; diff --git a/packages/core/src/runtime/snapshot.ts b/packages/core/src/runtime/snapshot.ts index 2c0bb4f..1617ba0 100644 --- a/packages/core/src/runtime/snapshot.ts +++ b/packages/core/src/runtime/snapshot.ts @@ -103,6 +103,8 @@ export interface TopologySnapshot { readonly webBrowserNodeIds: ReadonlySet; /** The installed e-mail servers, by node; a run's deliveries change their mailboxes here. */ readonly emailServersByNodeId: ReadonlyMap; + /** The nodes with the command line installed (Terminal); it works on the node's files. */ + readonly terminalNodeIds: ReadonlySet; /** The installed e-mail programs, by node; a run's sent and fetched mails change their folders here. */ readonly emailClientsByNodeId: ReadonlyMap; /** Each node's files, which its programs read (a web server its pages). */ @@ -131,6 +133,7 @@ export interface TopologySnapshotInput { webBrowserNodeIds?: ReadonlySet; emailServersByNodeId?: ReadonlyMap; emailClientsByNodeId?: ReadonlyMap; + terminalNodeIds?: ReadonlySet; fileSystemsByNodeId?: ReadonlyMap; language?: PageLanguage; } @@ -156,6 +159,7 @@ export function topologySnapshot(input: TopologySnapshotInput): TopologySnapshot webBrowserNodeIds: input.webBrowserNodeIds ?? new Set(), emailServersByNodeId: input.emailServersByNodeId ?? new Map(), emailClientsByNodeId: input.emailClientsByNodeId ?? new Map(), + terminalNodeIds: input.terminalNodeIds ?? new Set(), fileSystemsByNodeId: input.fileSystemsByNodeId ?? new Map(), language: input.language ?? 'de', }; diff --git a/packages/core/test/terminal.cases.txt b/packages/core/test/terminal.cases.txt new file mode 100644 index 0000000..5d84d43 --- /dev/null +++ b/packages/core/test/terminal.cases.txt @@ -0,0 +1,140 @@ +# Cases for tools/java-oracle's TerminalCases: FILIUS' command line fed with +# lines as typed, one per line. Read by terminal.test.ts. +case listing +ls +dir +ls Dokumente +ls /Dokumente/Alt +ls gibtsnicht +ls .. +dir / +ls a b +case navigate +pwd +cd Dokumente +pwd +cd Alt +cd .. +cd ../.. +cd /Dokumente/Alt +cd / +cd gibtsnicht +cd DOKUMENTE +pwd +cd +cd / +cd notizen.txt +pwd +ls +case files +touch neu.txt +touch neu.txt +touch NEU.TXT +touch Dokumente/neu2.txt +touch /gibtsnicht/x.txt +touch .. +mkdir Neu +mkdir Neu +mkdir neu +mkdir Dokumente/Alt/Tief +mkdir /gibtsnicht/x +mkdir .. +ls +case copy +cp notizen.txt kopie.txt +cp gibtsnicht.txt x.txt +cp notizen.txt NOTIZEN.TXT +copy bild.png Dokumente/bild2.png +cp kurz.txt /leer/kurz.txt +cp notizen.txt +cp notizen.txt Dokumente +ls +case move +mv notizen.txt umbenannt.txt +mv kurz.txt Dokumente/kurz.txt +mv gibtsnicht.txt y.txt +move bild.png /leer/bild.png +mv Dokumente Ordner +ls +case rename +mv notizen.txt NOTIZEN.TXT +ls +mv Dokumente/brief.txt /brief.txt +ls +case delete +rm notizen.txt +rm notizen.txt +del Dokumente +rm /leer +cd leer +rm ../bild.png +ls +case show +cat notizen.txt +type Dokumente/brief.txt +cat gibtsnicht +cat +cat Dokumente +cat bild.png +case info +ipconfig +ipconfig x +route +route x +test +ls +case help +help +help ls +help gibtsnicht +help exit +case window + + +cls +reset +exit +unbekannt +LS +move +setInterrupt x +initUsageInfo +case spaces +ls Dokumente +cd Dokumente/ +pwd +cd ./Alt/../Alt +pwd +case deleteInside +cd Dokumente/Alt +rm /Dokumente +pwd +ls +cd .. +pwd +rm / +ls +case sameName +mv notizen.txt notizen.txt +cp kurz.txt kurz.txt +ls +case usage +pwd x +rm +rm a b +cd a b +touch a b +mkdir a b +cp a b c +mv a b c +help type +help rm +help cp +help mv +\u0009 +case paths +ls ./Dokumente +ls notizen.txt +cd Dokumente +test +ls diff --git a/packages/core/test/terminal.de.java.json b/packages/core/test/terminal.de.java.json new file mode 100644 index 0000000..7f3f9a5 --- /dev/null +++ b/packages/core/test/terminal.de.java.json @@ -0,0 +1,6569 @@ +{ + "cases": [ + { + "name": "listing", + "steps": [ + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3" + ] + ], + "returned": "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "dir", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3" + ] + ], + "returned": "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls Dokumente", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1" + ] + ], + "returned": "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls /Dokumente/Alt", + "window": null, + "told": [ + [ + "text", + "Verzeichnis ist leer\n" + ] + ], + "returned": "Verzeichnis ist leer\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls gibtsnicht", + "window": null, + "told": [ + [ + "text", + "Verzeichnis ist leer\n" + ] + ], + "returned": "Verzeichnis ist leer\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls ..", + "window": null, + "told": [ + [ + "text", + "Verzeichnis ist leer\n" + ] + ], + "returned": "Verzeichnis ist leer\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "dir /", + "window": null, + "told": [ + [ + "text", + "Verzeichnis :\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3" + ] + ], + "returned": "Verzeichnis :\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls a b", + "window": null, + "told": [ + [ + "text", + "dir / ls - show list of files in current directory\nUsage: dir\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "navigate", + "steps": [ + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/" + ] + ], + "returned": "/", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Dokumente", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ..", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ../..", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd /Dokumente/Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd /", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd gibtsnicht", + "window": null, + "told": [ + [ + "text", + "Verzeichnis nicht vorhanden\n" + ] + ], + "returned": "Verzeichnis nicht vorhanden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd DOKUMENTE", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd /", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd notizen.txt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/notizen.txt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/notizen.txt" + ] + ], + "returned": "/notizen.txt", + "directory": "/notizen.txt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis ist leer\n" + ] + ], + "returned": "Verzeichnis ist leer\n", + "directory": "/notizen.txt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "files", + "steps": [ + { + "typed": "touch neu.txt", + "window": null, + "told": [ + [ + "text", + "Datei erstellt\n" + ] + ], + "returned": "Datei erstellt\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch neu.txt", + "window": null, + "told": [ + [ + "text", + "Datei bereits vorhanden\n" + ] + ], + "returned": "Datei bereits vorhanden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch NEU.TXT", + "window": null, + "told": [ + [ + "text", + "Datei bereits vorhanden\n" + ] + ], + "returned": "Datei bereits vorhanden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch Dokumente/neu2.txt", + "window": null, + "told": [ + [ + "text", + "Datei erstellt\n" + ] + ], + "returned": "Datei erstellt\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch /gibtsnicht/x.txt", + "window": null, + "told": [ + [ + "text", + "Datei erstellt\n" + ] + ], + "returned": "Datei erstellt\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch ..", + "window": null, + "told": [ + [ + "text", + "Bitte einen Dateinamen angeben!\n" + ] + ], + "returned": "Bitte einen Dateinamen angeben!\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "mkdir Neu", + "window": null, + "told": [ + [ + "text", + "Ordner erstellt\n" + ] + ], + "returned": "Ordner erstellt\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir Neu", + "window": null, + "told": [ + [ + "text", + "Ordner bereits vorhanden\n" + ] + ], + "returned": "Ordner bereits vorhanden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir neu", + "window": null, + "told": [ + [ + "text", + "Ordner bereits vorhanden\n" + ] + ], + "returned": "Ordner bereits vorhanden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir Dokumente/Alt/Tief", + "window": null, + "told": [ + [ + "text", + "Ordner erstellt\n" + ] + ], + "returned": "Ordner erstellt\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir /gibtsnicht/x", + "window": null, + "told": [ + [ + "text", + "Ordner bereits vorhanden\n" + ] + ], + "returned": "Ordner bereits vorhanden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir ..", + "window": null, + "told": [ + [ + "text", + "Bitte einen Ordnernamen angeben!\n" + ] + ], + "returned": "Bitte einen Ordnernamen angeben!\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nneu.txt.................................0\n[Neu]\n\nAnzahl Verzeichnisse:3\nAnzahl Dateien:4" + ] + ], + "returned": "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nneu.txt.................................0\n[Neu]\n\nAnzahl Verzeichnisse:3\nAnzahl Dateien:4", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "copy", + "steps": [ + { + "typed": "cp notizen.txt kopie.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich kopiert\n" + ] + ], + "returned": "Datei erfolgreich kopiert\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp gibtsnicht.txt x.txt", + "window": null, + "told": [ + [ + "text", + "Datei konnte nicht kopiert werden\n" + ] + ], + "returned": "Datei konnte nicht kopiert werden\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp notizen.txt NOTIZEN.TXT", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich kopiert\n" + ] + ], + "returned": "Datei erfolgreich kopiert\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "copy bild.png Dokumente/bild2.png", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich kopiert\n" + ] + ], + "returned": "Datei erfolgreich kopiert\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp kurz.txt /leer/kurz.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich kopiert\n" + ] + ], + "returned": "Datei erfolgreich kopiert\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp notizen.txt", + "window": null, + "told": [ + [ + "text", + "copy / cp - copy file\nUsage: copy \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp notizen.txt Dokumente", + "window": null, + "told": [], + "returned": "!ClassCastException", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nkopie.txt...............................6\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:4" + ] + ], + "returned": "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nkopie.txt...............................6\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:4", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "move", + "steps": [ + { + "typed": "mv notizen.txt umbenannt.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich verschoben/umbenannt\n" + ] + ], + "returned": "Datei erfolgreich verschoben/umbenannt\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "mv kurz.txt Dokumente/kurz.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich verschoben/umbenannt\n" + ] + ], + "returned": "Datei erfolgreich verschoben/umbenannt\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/leer" + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "mv gibtsnicht.txt y.txt", + "window": null, + "told": [ + [ + "text", + "Datei konnte nicht verschoben/umbenannt werden\n" + ] + ], + "returned": "Datei konnte nicht verschoben/umbenannt werden\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/leer" + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "move bild.png /leer/bild.png", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich verschoben/umbenannt\n" + ] + ], + "returned": "Datei erfolgreich verschoben/umbenannt\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "mv Dokumente Ordner", + "window": null, + "told": [ + [ + "text", + "Datei konnte nicht verschoben/umbenannt werden\n" + ] + ], + "returned": "Datei konnte nicht verschoben/umbenannt werden\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\n[Dokumente]\n[leer]\numbenannt.txt...........................6\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:1" + ] + ], + "returned": "Verzeichnis /:\n[Dokumente]\n[leer]\numbenannt.txt...........................6\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:1", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "rename", + "steps": [ + { + "typed": "mv notizen.txt NOTIZEN.TXT", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich verschoben/umbenannt\n" + ] + ], + "returned": "Datei erfolgreich verschoben/umbenannt\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:2" + ] + ], + "returned": "Verzeichnis /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:2", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "mv Dokumente/brief.txt /brief.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich verschoben/umbenannt\n" + ] + ], + "returned": "Datei erfolgreich verschoben/umbenannt\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nbrief.txt...............................42\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3" + ] + ], + "returned": "Verzeichnis /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nbrief.txt...............................42\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:3", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "delete", + "steps": [ + { + "typed": "rm notizen.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich gelöscht\n" + ] + ], + "returned": "Datei erfolgreich gelöscht\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm notizen.txt", + "window": null, + "told": [ + [ + "text", + "Datei konnte nicht gelöscht werden\n" + ] + ], + "returned": "Datei konnte nicht gelöscht werden\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "del Dokumente", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich gelöscht\n" + ] + ], + "returned": "Datei erfolgreich gelöscht\n", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm /leer", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich gelöscht\n" + ] + ], + "returned": "Datei erfolgreich gelöscht\n", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + }, + { + "typed": "cd leer", + "window": null, + "told": [ + [ + "text", + "Verzeichnis nicht vorhanden\n" + ] + ], + "returned": "Verzeichnis nicht vorhanden\n", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + }, + { + "typed": "rm ../bild.png", + "window": null, + "told": [], + "returned": "!ArrayIndexOutOfBoundsException", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nbild.png................................70\nkurz.txt................................5\n\nAnzahl Verzeichnisse:0\nAnzahl Dateien:2" + ] + ], + "returned": "Verzeichnis /:\nbild.png................................70\nkurz.txt................................5\n\nAnzahl Verzeichnisse:0\nAnzahl Dateien:2", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "show", + "steps": [ + { + "typed": "cat notizen.txt", + "window": null, + "told": [ + [ + "text", + "Hallo Welt" + ] + ], + "returned": "Hallo Welt", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "type Dokumente/brief.txt", + "window": null, + "told": [ + [ + "text", + "Sehr geehrte Damen und Herren,\nviele Grüße" + ] + ], + "returned": "Sehr geehrte Damen und Herren,\nviele Grüße", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat gibtsnicht", + "window": null, + "told": [ + [ + "text", + "Datei nicht vorhanden" + ] + ], + "returned": "Datei nicht vorhanden", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat", + "window": null, + "told": [ + [ + "text", + "cat / type - show file contents\nUsage: cat \n" + ], + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat Dokumente", + "window": null, + "told": [ + [ + "text", + "Datei nicht vorhanden" + ] + ], + "returned": "Datei nicht vorhanden", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat bild.png", + "window": null, + "told": [ + [ + "text", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==" + ] + ], + "returned": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "info", + "steps": [ + { + "typed": "ipconfig", + "window": null, + "told": [ + [ + "text", + "IP Adresse . . . : 10.0.0.2\nNetzmaske. . . . : 255.255.255.0\nPhysische Adresse: 02:00:00:00:03:11\nStandardgateway. : 10.0.0.1\nDNS-Server . . . : \n" + ] + ], + "returned": "IP Adresse . . . : 10.0.0.2\nNetzmaske. . . . : 255.255.255.0\nPhysische Adresse: 02:00:00:00:03:11\nStandardgateway. : 10.0.0.1\nDNS-Server . . . : \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ipconfig x", + "window": null, + "told": [ + [ + "text", + "ipconfig - show network configuration\nUsage: ipconfig\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "route", + "window": null, + "told": [ + [ + "text", + "| Ziel | Netzmaske | Gateway | Schnittstelle |\n -----------------------------------------------------------------------\n| 10.0.0.2 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | \n| 10.0.0.0 | 255.255.255.0 | 10.0.0.2 | 10.0.0.2 | \n| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | \n| 0.0.0.0 | 0.0.0.0 | 10.0.0.1 | 10.0.0.2 | \n" + ] + ], + "returned": "| Ziel | Netzmaske | Gateway | Schnittstelle |\n -----------------------------------------------------------------------\n| 10.0.0.2 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | \n| 10.0.0.0 | 255.255.255.0 | 10.0.0.2 | 10.0.0.2 | \n| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | \n| 0.0.0.0 | 0.0.0.0 | 10.0.0.1 | 10.0.0.2 | \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "route x", + "window": null, + "told": [ + [ + "text", + "route - show routing table\nUsage: route\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "test", + "window": null, + "told": [ + [ + "text", + "Erfolgreich erstellt!" + ] + ], + "returned": "Erfolgreich erstellt!", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/test.txt", + "txt", + "blaaa", + 3 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\ntest.txt................................3\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:4" + ] + ], + "returned": "Verzeichnis /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\ntest.txt................................3\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:4", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/test.txt", + "txt", + "blaaa", + 3 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "help", + "steps": [ + { + "typed": "help", + "window": null, + "told": [ + [ + "text", + "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help ls", + "window": null, + "told": [ + [ + "text", + "dir / ls - show list of files in current directory\nUsage: dir\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help gibtsnicht", + "window": null, + "told": [ + [ + "text", + "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help exit", + "window": null, + "told": [ + [ + "text", + "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "window", + "steps": [ + { + "typed": "", + "window": "blank", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": " ", + "window": "blank", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cls", + "window": "clear", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "reset", + "window": "clear", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "exit", + "window": "exit", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "unbekannt", + "window": null, + "told": [ + [ + "text", + "Unbekannter Befehl!\nMit 'help' erhalten Sie eine Liste bekannter Befehle." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "LS", + "window": null, + "told": [ + [ + "text", + "Unbekannter Befehl!\nMit 'help' erhalten Sie eine Liste bekannter Befehle." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "move", + "window": null, + "told": [ + [ + "text", + "move / mv - move/rename file\nUsage: move \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "setInterrupt x", + "window": null, + "told": [ + [ + "text", + "Unbekannter Befehl!\nMit 'help' erhalten Sie eine Liste bekannter Befehle." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "initUsageInfo", + "window": null, + "told": [ + [ + "text", + "Unbekannter Befehl!\nMit 'help' erhalten Sie eine Liste bekannter Befehle." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "spaces", + "steps": [ + { + "typed": "ls Dokumente", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1" + ] + ], + "returned": "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Dokumente/", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ./Alt/../Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente/Alt" + ] + ], + "returned": "/Dokumente/Alt", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "deleteInside", + "steps": [ + { + "typed": "cd Dokumente/Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm /Dokumente", + "window": null, + "told": [ + [ + "text", + "Datei konnte nicht gelöscht werden\n" + ] + ], + "returned": "Datei konnte nicht gelöscht werden\n", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente/Alt" + ] + ], + "returned": "/Dokumente/Alt", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis ist leer\n" + ] + ], + "returned": "Verzeichnis ist leer\n", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ..", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm /", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich gelöscht\n" + ] + ], + "returned": "Datei erfolgreich gelöscht\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1" + ] + ], + "returned": "Verzeichnis /:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "sameName", + "steps": [ + { + "typed": "mv notizen.txt notizen.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich verschoben/umbenannt\n" + ] + ], + "returned": "Datei erfolgreich verschoben/umbenannt\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cp kurz.txt kurz.txt", + "window": null, + "told": [ + [ + "text", + "Datei erfolgreich kopiert\n" + ] + ], + "returned": "Datei erfolgreich kopiert\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:2" + ] + ], + "returned": "Verzeichnis /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nAnzahl Verzeichnisse:2\nAnzahl Dateien:2", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "usage", + "steps": [ + { + "typed": "pwd x", + "window": null, + "told": [ + [ + "text", + "pwd - print working directory\nUsage: pwd\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm", + "window": null, + "told": [ + [ + "text", + "del / rm - delete file/directory\nUsage: del \n relative path to current directory\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm a b", + "window": null, + "told": [ + [ + "text", + "del / rm - delete file/directory\nUsage: del \n relative path to current directory\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd a b", + "window": null, + "told": [ + [ + "text", + "cd - change directory\nUsage: cd \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "touch a b", + "window": null, + "told": [ + [ + "text", + "touch - create file\nUsage: touch \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "mkdir a b", + "window": null, + "told": [ + [ + "text", + "mkdir - create directory\nUsage: mkdir \n name of new directory either as absolute path \n or relative path\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cp a b c", + "window": null, + "told": [ + [ + "text", + "copy / cp - copy file\nUsage: copy \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "mv a b c", + "window": null, + "told": [ + [ + "text", + "move / mv - move/rename file\nUsage: move \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help type", + "window": null, + "told": [ + [ + "text", + "cat / type - show file contents\nUsage: cat \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help rm", + "window": null, + "told": [ + [ + "text", + "del / rm - delete file/directory\nUsage: del \n relative path to current directory\n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help cp", + "window": null, + "told": [ + [ + "text", + "copy / cp - copy file\nUsage: copy \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help mv", + "window": null, + "told": [ + [ + "text", + "move / mv - move/rename file\nUsage: move \n" + ] + ], + "returned": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "\t", + "window": "blank", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "paths", + "steps": [ + { + "typed": "ls ./Dokumente", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1" + ] + ], + "returned": "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls notizen.txt", + "window": null, + "told": [ + [ + "text", + "Verzeichnis ist leer\n" + ] + ], + "returned": "Verzeichnis ist leer\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Dokumente", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "test", + "window": null, + "told": [ + [ + "text", + "Erfolgreich erstellt!" + ] + ], + "returned": "Erfolgreich erstellt!", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/test.txt", + "txt", + "blaaa", + 3 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\ntest.txt................................3\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:2" + ] + ], + "returned": "Verzeichnis /Dokumente:\nbrief.txt...............................42\n[Alt]\ntest.txt................................3\n\nAnzahl Verzeichnisse:1\nAnzahl Dateien:2", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/test.txt", + "txt", + "blaaa", + 3 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "texts": { + "sw_terminal_arp": "arp - show or manipulate Address Resolution Protocol (ARP) table", + "sw_terminal_arpsend": "arpsend - send an ARP reply", + "sw_terminal_cat": "cat / type - show file contents", + "sw_terminal_cd": "cd - change directory", + "sw_terminal_copy": "copy / cp - copy file", + "sw_terminal_del": "del / rm - delete file/directory", + "sw_terminal_dir": "dir / ls - show list of files in current directory", + "sw_terminal_exit": "exit - exit terminal application", + "sw_terminal_help": "help - show the list of commands or info on one command", + "sw_terminal_host": "host - resolve hostname to IP address", + "sw_terminal_ipconfig": "ipconfig - show network configuration", + "sw_terminal_mkdir": "mkdir - create directory", + "sw_terminal_move": "move / mv - move/rename file", + "sw_terminal_msg1": "Anwendung", + "sw_terminal_msg10": "\nAnzahl Verzeichnisse:", + "sw_terminal_msg11": "\nAnzahl Dateien:", + "sw_terminal_msg12": "Fehler bei Touch\n", + "sw_terminal_msg13": "Datei erstellt\n", + "sw_terminal_msg14": "Datei bereits vorhanden\n", + "sw_terminal_msg15": "Bitte einen Dateinamen angeben!\n", + "sw_terminal_msg16": "Fehler beim Ordner erstellen\n", + "sw_terminal_msg17": "Ordner erstellt\n", + "sw_terminal_msg18": "Ordner bereits vorhanden\n", + "sw_terminal_msg19": "Bitte einen Ordnernamen angeben!\n", + "sw_terminal_msg2": "ist bereits installiert.\n", + "sw_terminal_msg20": "Verzeichnis nicht vorhanden\n", + "sw_terminal_msg21": "Ordner gewechselt! (..)\n", + "sw_terminal_msg22": "Ordner gewechselt!\n", + "sw_terminal_msg23": "Test\n", + "sw_terminal_msg24": "Erfolgreich erstellt!", + "sw_terminal_msg25": "Liste verfügbarer Befehle:\n arp zeige Adresstabelle des \"Address Resolution Protocol\" (ARP)\n arpsend versende eine ARP-Antwort\n cat / type zeige Dateiinhalt an \n cd Verzeichnis wechseln\n cls Anzeige zurücksetzen\n copy / cp Datei kopieren\n del / rm lösche Datei/Verzeichnis\n dir / ls zeige Liste der Dateien im aktuellen Verzeichnis\n exit beende Terminal-Anwendung\n help zeige diese Befehlsliste\n host löse Hostnamen zu IP-Adresse auf\n ipconfig Netzwerkkonfiguration anzeigen\n mkdir erstelle Verzeichnis\n move / mv Datei verschieben/umbenennen\n netstat zeige Liste aller Verbindungen\n nslookup löse Hostnamen zu IP-Adresse auf\n ping teste Verbindung zu anderem Rechner\n pwd gib Pfad des aktuellen Arbeitsverzeichnisses aus\n route Routing-/Weiterleitungstabelle anzeigen\n tcpdump Datenaustausch anzeigen\n touch erstelle Datei\n traceroute analysiere Stationen des Übertragungsweges \n", + "sw_terminal_msg26": "Verwende den Befehl 'help' um Liste der verfügbaren Befehle anzuzeigen\n oder nutze 'help ' für weitere Infos zum Befehl.", + "sw_terminal_msg27": "DNS-Server . . . :", + "sw_terminal_msg28": "hat die IP-Adresse", + "sw_terminal_msg29": "Ungültige Host-Angabe!\nNur korrekte URLs ohne Pfadangabe erlaubt.\n", + "sw_terminal_msg3": "erfolgreich installiert\n", + "sw_terminal_msg30": "Hostname konnte nicht aufgelöst werden!\nEventuell ist kein DNS-Server verfügbar.\n", + "sw_terminal_msg31": "Zeitüberschreitung! Keine Antwort empfangen.", + "sw_terminal_msg33": "Datei erfolgreich kopiert\n", + "sw_terminal_msg34": "Datei konnte nicht kopiert werden\n", + "sw_terminal_msg35": "Datei erfolgreich verschoben/umbenannt\n", + "sw_terminal_msg36": "Datei konnte nicht verschoben/umbenannt werden\n", + "sw_terminal_msg37": "Datei erfolgreich gelöscht\n", + "sw_terminal_msg38": "Datei konnte nicht gelöscht werden\n", + "sw_terminal_msg39": "\n", + "sw_terminal_msg4": "IP Adresse . . . :", + "sw_terminal_msg45": "Paketstatistik", + "sw_terminal_msg46": "Paket(e) gesendet", + "sw_terminal_msg47": "Paket(e) empfangen", + "sw_terminal_msg48": "Paketverlust", + "sw_terminal_msg49": "| Proto | Lokale Adresse | Entfernte Adresse | Zustand |\n", + "sw_terminal_msg5": "Netzmaske. . . . :", + "sw_terminal_msg50": "| Internetadresse | Physische Adresse |\n", + "sw_terminal_msg52": "Zieladresse nicht erreichbar", + "sw_terminal_msg53": "Ping zu Broadcast-Adressen wird nicht unterstützt.", + "sw_terminal_msg54": "Datei nicht vorhanden", + "sw_terminal_msg55": "Beenden mit Strg+C", + "sw_terminal_msg57": "\n\n sSSs .S S. .S .S S. sSSs \n d%%SP .SS SS. .SS .SS SS. d%%SP \n d%S' S%S S%S S%S S%S S%S d%S' \n S%S S%S S%S S%S S%S S%S S%| \n S&S S&S S&S S&S S&S S&S S&S \n S&S_Ss S&S S&S S&S S&S S&S Y&Ss \n S&S~SP S&S S&S S&S S&S S&S `S&&S \n S&S S&S S&S S&S S&S S&S `S*S \n S*b S*S S*b S*S S*b d*S l*S \n S*S S*S S*S. S*S S*S. .S*S .S*P \n S*S S*S SSSbs S*S SSSbs_sdSSS sSS*S \n S*S S*S YSSP S*S YSSP~YSSY YSS' \n SP SP SP \n Y Y Y \n\n", + "sw_terminal_msg58": "Mails werden behandelt durch", + "sw_terminal_msg6": "Standardgateway. :", + "sw_terminal_msg6666": "Physische Adresse:", + "sw_terminal_msg7": "| Ziel | Netzmaske | Gateway | Schnittstelle |\n -----------------------------------------------------------------------\n", + "sw_terminal_msg8": "Verzeichnis ist leer\n", + "sw_terminal_msg9": "Verzeichnis", + "sw_terminal_netstat": "netstat - show list of connections", + "sw_terminal_nslookup": "nslookup - resolve hostname to IP address", + "sw_terminal_ping": "ping - test connection to other computer", + "sw_terminal_pwd": "pwd - print working directory", + "sw_terminal_route": "route - show routing table", + "sw_terminal_tcpdump": "tcpdump - show data exchange", + "sw_terminal_touch": "touch - create file", + "sw_terminal_trace_msg10": "Fehler: %s antwortet \"ICMP Destination Unreachable\"", + "sw_terminal_trace_msg11": "%s wurde nach einem Sprung (hop) erreicht.", + "sw_terminal_trace_msg12": "%s wurde nach %s Sprüngen (hops) erreicht.", + "sw_terminal_trace_msg13": "Fehler: nächste Station konnte mehrfach nicht erreicht werden.", + "sw_terminal_trace_msg2": "Fehler: Verbindung zum DNS-Server nicht möglich.", + "sw_terminal_trace_msg3": "Fehler: Domainname konnte nicht aufgelöst werden.", + "sw_terminal_trace_msg4": "Verbindung nach %s wird bestimmt (max. %s Stationen).", + "sw_terminal_trace_msg5": "Verbindung nach %s (%s) wird bestimmt (max. %s Stationen).", + "sw_terminal_trace_msg6": "%s konnte über %s Stationen (hops) nicht erreicht werden.", + "sw_terminal_trace_msg7": "Analyse abgebrochen!", + "sw_terminal_trace_msg8": "Fehler: %s antwortet \"ICMP Network Unreachable\"", + "sw_terminal_trace_msg9": "Fehler: %s antwortet \"ICMP Host Unreachable\"", + "sw_terminal_traceroute": "traceroute - analyse hops of connecting path", + "sw_terminal_usage_arp": "Usage: arp [-d []] [-a ] \n -d \t delete ARP entry for IP address or reset ARP table \n -a \t show ARP entry for specified IP address", + "sw_terminal_usage_arpsend": "Usage: arpsend \n address to be published for own MAC address\n target the reply must be sent to", + "sw_terminal_usage_cat": "Usage: cat ", + "sw_terminal_usage_cd": "Usage: cd ", + "sw_terminal_usage_copy": "Usage: copy ", + "sw_terminal_usage_del": "Usage: del \n relative path to current directory", + "sw_terminal_usage_dir": "Usage: dir", + "sw_terminal_usage_exit": "Usage: exit", + "sw_terminal_usage_help": "Usage: help []", + "sw_terminal_usage_host": "Usage: host \n the domain for which to look up A and MX records", + "sw_terminal_usage_ipconfig": "Usage: ipconfig", + "sw_terminal_usage_mkdir": "Usage: mkdir \n name of new directory either as absolute path \n or relative path", + "sw_terminal_usage_move": "Usage: move ", + "sw_terminal_usage_netstat": "Usage: netstat", + "sw_terminal_usage_nslookup": "Usage: nslookup \n the domain for which to look up A (and related NS) records", + "sw_terminal_usage_ping": "Usage: ping \n the remote address as IP address or host name", + "sw_terminal_usage_pwd": "Usage: pwd", + "sw_terminal_usage_route": "Usage: route", + "sw_terminal_usage_tcpdump": "Usage: tcpdump", + "sw_terminal_usage_touch": "Usage: touch ", + "sw_terminal_usage_traceroute": "Usage: traceroute \n the remote address as IP address or host name", + "terminal_msg1": "root>", + "terminal_msg2": "Unbekannter Befehl!", + "terminal_msg3": "Mit 'help' erhalten Sie eine Liste bekannter Befehle." + } +} diff --git a/packages/core/test/terminal.en.java.json b/packages/core/test/terminal.en.java.json new file mode 100644 index 0000000..779174c --- /dev/null +++ b/packages/core/test/terminal.en.java.json @@ -0,0 +1,6569 @@ +{ + "cases": [ + { + "name": "listing", + "steps": [ + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:3" + ] + ], + "returned": "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:3", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "dir", + "window": null, + "told": [ + [ + "text", + "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:3" + ] + ], + "returned": "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:3", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls Dokumente", + "window": null, + "told": [ + [ + "text", + "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1" + ] + ], + "returned": "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls /Dokumente/Alt", + "window": null, + "told": [ + [ + "text", + "Directory is empty\n" + ] + ], + "returned": "Directory is empty\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls gibtsnicht", + "window": null, + "told": [ + [ + "text", + "Directory is empty\n" + ] + ], + "returned": "Directory is empty\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls ..", + "window": null, + "told": [ + [ + "text", + "Directory is empty\n" + ] + ], + "returned": "Directory is empty\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "dir /", + "window": null, + "told": [ + [ + "text", + "Directory :\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:3" + ] + ], + "returned": "Directory :\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:3", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls a b", + "window": null, + "told": [ + [ + "text", + "dir / ls - show list of files in current directory\nUsage: dir\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "navigate", + "steps": [ + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/" + ] + ], + "returned": "/", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Dokumente", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ..", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ../..", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd /Dokumente/Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd /", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd gibtsnicht", + "window": null, + "told": [ + [ + "text", + "Directory does not exist\n" + ] + ], + "returned": "Directory does not exist\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd DOKUMENTE", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd /", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd notizen.txt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/notizen.txt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/notizen.txt" + ] + ], + "returned": "/notizen.txt", + "directory": "/notizen.txt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory is empty\n" + ] + ], + "returned": "Directory is empty\n", + "directory": "/notizen.txt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "files", + "steps": [ + { + "typed": "touch neu.txt", + "window": null, + "told": [ + [ + "text", + "File created\n" + ] + ], + "returned": "File created\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch neu.txt", + "window": null, + "told": [ + [ + "text", + "File does already exist\n" + ] + ], + "returned": "File does already exist\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch NEU.TXT", + "window": null, + "told": [ + [ + "text", + "File does already exist\n" + ] + ], + "returned": "File does already exist\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch Dokumente/neu2.txt", + "window": null, + "told": [ + [ + "text", + "File created\n" + ] + ], + "returned": "File created\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch /gibtsnicht/x.txt", + "window": null, + "told": [ + [ + "text", + "File created\n" + ] + ], + "returned": "File created\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "touch ..", + "window": null, + "told": [ + [ + "text", + "Please enter a file name!\n" + ] + ], + "returned": "Please enter a file name!\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ] + ] + }, + { + "typed": "mkdir Neu", + "window": null, + "told": [ + [ + "text", + "Folder is created\n" + ] + ], + "returned": "Folder is created\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir Neu", + "window": null, + "told": [ + [ + "text", + "Folder does already exist\n" + ] + ], + "returned": "Folder does already exist\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir neu", + "window": null, + "told": [ + [ + "text", + "Folder does already exist\n" + ] + ], + "returned": "Folder does already exist\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir Dokumente/Alt/Tief", + "window": null, + "told": [ + [ + "text", + "Folder is created\n" + ] + ], + "returned": "Folder is created\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir /gibtsnicht/x", + "window": null, + "told": [ + [ + "text", + "Folder does already exist\n" + ] + ], + "returned": "Folder does already exist\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "mkdir ..", + "window": null, + "told": [ + [ + "text", + "Please enter folder name!\n" + ] + ], + "returned": "Please enter folder name!\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nneu.txt.................................0\n[Neu]\n\nNumber of directories:3\nNumber of files:4" + ] + ], + "returned": "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nneu.txt.................................0\n[Neu]\n\nNumber of directories:3\nNumber of files:4", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/Alt/Tief" + ], + [ + "/Dokumente/neu2.txt", + "text/txt", + "", + 0 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/neu.txt", + "text/txt", + "", + 0 + ], + [ + "/Neu" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "copy", + "steps": [ + { + "typed": "cp notizen.txt kopie.txt", + "window": null, + "told": [ + [ + "text", + "File successfully copied\n" + ] + ], + "returned": "File successfully copied\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp gibtsnicht.txt x.txt", + "window": null, + "told": [ + [ + "text", + "File could not be copied\n" + ] + ], + "returned": "File could not be copied\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp notizen.txt NOTIZEN.TXT", + "window": null, + "told": [ + [ + "text", + "File successfully copied\n" + ] + ], + "returned": "File successfully copied\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "copy bild.png Dokumente/bild2.png", + "window": null, + "told": [ + [ + "text", + "File successfully copied\n" + ] + ], + "returned": "File successfully copied\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp kurz.txt /leer/kurz.txt", + "window": null, + "told": [ + [ + "text", + "File successfully copied\n" + ] + ], + "returned": "File successfully copied\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp notizen.txt", + "window": null, + "told": [ + [ + "text", + "copy / cp - copy file\nUsage: copy \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "cp notizen.txt Dokumente", + "window": null, + "told": [], + "returned": "!ClassCastException", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nkopie.txt...............................6\n\nNumber of directories:2\nNumber of files:4" + ] + ], + "returned": "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nkopie.txt...............................6\n\nNumber of directories:2\nNumber of files:4", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/bild2.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/kopie.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "move", + "steps": [ + { + "typed": "mv notizen.txt umbenannt.txt", + "window": null, + "told": [ + [ + "text", + "File successfully moved/renamed\n" + ] + ], + "returned": "File successfully moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "mv kurz.txt Dokumente/kurz.txt", + "window": null, + "told": [ + [ + "text", + "File successfully moved/renamed\n" + ] + ], + "returned": "File successfully moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/leer" + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "mv gibtsnicht.txt y.txt", + "window": null, + "told": [ + [ + "text", + "File could not be moved/renamed\n" + ] + ], + "returned": "File could not be moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/leer" + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "move bild.png /leer/bild.png", + "window": null, + "told": [ + [ + "text", + "File successfully moved/renamed\n" + ] + ], + "returned": "File successfully moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "mv Dokumente Ordner", + "window": null, + "told": [ + [ + "text", + "File could not be moved/renamed\n" + ] + ], + "returned": "File could not be moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\n[Dokumente]\n[leer]\numbenannt.txt...........................6\n\nNumber of directories:2\nNumber of files:1" + ] + ], + "returned": "Directory /:\n[Dokumente]\n[leer]\numbenannt.txt...........................6\n\nNumber of directories:2\nNumber of files:1", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/leer/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/umbenannt.txt", + "txt", + "Hallo Welt", + 6 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "rename", + "steps": [ + { + "typed": "mv notizen.txt NOTIZEN.TXT", + "window": null, + "told": [ + [ + "text", + "File successfully moved/renamed\n" + ] + ], + "returned": "File successfully moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:2" + ] + ], + "returned": "Directory /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:2", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "mv Dokumente/brief.txt /brief.txt", + "window": null, + "told": [ + [ + "text", + "File successfully moved/renamed\n" + ] + ], + "returned": "File successfully moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nbrief.txt...............................42\n\nNumber of directories:2\nNumber of files:3" + ] + ], + "returned": "Directory /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\nbrief.txt...............................42\n\nNumber of directories:2\nNumber of files:3", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "delete", + "steps": [ + { + "typed": "rm notizen.txt", + "window": null, + "told": [ + [ + "text", + "File successfully deleted\n" + ] + ], + "returned": "File successfully deleted\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm notizen.txt", + "window": null, + "told": [ + [ + "text", + "File could not be deleted\n" + ] + ], + "returned": "File could not be deleted\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "del Dokumente", + "window": null, + "told": [ + [ + "text", + "File successfully deleted\n" + ] + ], + "returned": "File successfully deleted\n", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm /leer", + "window": null, + "told": [ + [ + "text", + "File successfully deleted\n" + ] + ], + "returned": "File successfully deleted\n", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + }, + { + "typed": "cd leer", + "window": null, + "told": [ + [ + "text", + "Directory does not exist\n" + ] + ], + "returned": "Directory does not exist\n", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + }, + { + "typed": "rm ../bild.png", + "window": null, + "told": [], + "returned": "!ArrayIndexOutOfBoundsException", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\nbild.png................................70\nkurz.txt................................5\n\nNumber of directories:0\nNumber of files:2" + ] + ], + "returned": "Directory /:\nbild.png................................70\nkurz.txt................................5\n\nNumber of directories:0\nNumber of files:2", + "directory": "/", + "files": [ + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "show", + "steps": [ + { + "typed": "cat notizen.txt", + "window": null, + "told": [ + [ + "text", + "Hallo Welt" + ] + ], + "returned": "Hallo Welt", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "type Dokumente/brief.txt", + "window": null, + "told": [ + [ + "text", + "Sehr geehrte Damen und Herren,\nviele Grüße" + ] + ], + "returned": "Sehr geehrte Damen und Herren,\nviele Grüße", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat gibtsnicht", + "window": null, + "told": [ + [ + "text", + "No such file" + ] + ], + "returned": "No such file", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat", + "window": null, + "told": [ + [ + "text", + "cat / type - show file contents\nUsage: cat \n" + ], + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat Dokumente", + "window": null, + "told": [ + [ + "text", + "No such file" + ] + ], + "returned": "No such file", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cat bild.png", + "window": null, + "told": [ + [ + "text", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==" + ] + ], + "returned": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "info", + "steps": [ + { + "typed": "ipconfig", + "window": null, + "told": [ + [ + "text", + "IP address . . .: 10.0.0.2\nNetmask. . . . .: 255.255.255.0\nPhysical address: 02:00:00:00:03:11\nStandard gateway: 10.0.0.1\nDNS server . . .: \n" + ] + ], + "returned": "IP address . . .: 10.0.0.2\nNetmask. . . . .: 255.255.255.0\nPhysical address: 02:00:00:00:03:11\nStandard gateway: 10.0.0.1\nDNS server . . .: \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ipconfig x", + "window": null, + "told": [ + [ + "text", + "ipconfig - show network configuration\nUsage: ipconfig\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "route", + "window": null, + "told": [ + [ + "text", + "| Destination | Netmask | Gateway | Interface |\n -------------------------------------------------------------------------\n| 10.0.0.2 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | \n| 10.0.0.0 | 255.255.255.0 | 10.0.0.2 | 10.0.0.2 | \n| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | \n| 0.0.0.0 | 0.0.0.0 | 10.0.0.1 | 10.0.0.2 | \n" + ] + ], + "returned": "| Destination | Netmask | Gateway | Interface |\n -------------------------------------------------------------------------\n| 10.0.0.2 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | \n| 10.0.0.0 | 255.255.255.0 | 10.0.0.2 | 10.0.0.2 | \n| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | \n| 0.0.0.0 | 0.0.0.0 | 10.0.0.1 | 10.0.0.2 | \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "route x", + "window": null, + "told": [ + [ + "text", + "route - show routing table\nUsage: route\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "test", + "window": null, + "told": [ + [ + "text", + "Successfully built!" + ] + ], + "returned": "Successfully built!", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/test.txt", + "txt", + "blaaa", + 3 + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\ntest.txt................................3\n\nNumber of directories:2\nNumber of files:4" + ] + ], + "returned": "Directory /:\nnotizen.txt.............................6\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\ntest.txt................................3\n\nNumber of directories:2\nNumber of files:4", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ], + [ + "/test.txt", + "txt", + "blaaa", + 3 + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "help", + "steps": [ + { + "typed": "help", + "window": null, + "told": [ + [ + "text", + "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help ls", + "window": null, + "told": [ + [ + "text", + "dir / ls - show list of files in current directory\nUsage: dir\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help gibtsnicht", + "window": null, + "told": [ + [ + "text", + "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help exit", + "window": null, + "told": [ + [ + "text", + "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "window", + "steps": [ + { + "typed": "", + "window": "blank", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": " ", + "window": "blank", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cls", + "window": "clear", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "reset", + "window": "clear", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "exit", + "window": "exit", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "unbekannt", + "window": null, + "told": [ + [ + "text", + "Unknown command!\nType 'help' to get a list of available commands." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "LS", + "window": null, + "told": [ + [ + "text", + "Unknown command!\nType 'help' to get a list of available commands." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "move", + "window": null, + "told": [ + [ + "text", + "move / mv - move/rename file\nUsage: move \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "setInterrupt x", + "window": null, + "told": [ + [ + "text", + "Unknown command!\nType 'help' to get a list of available commands." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "initUsageInfo", + "window": null, + "told": [ + [ + "text", + "Unknown command!\nType 'help' to get a list of available commands." + ] + ], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "spaces", + "steps": [ + { + "typed": "ls Dokumente", + "window": null, + "told": [ + [ + "text", + "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1" + ] + ], + "returned": "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Dokumente/", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ./Alt/../Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente/Alt" + ] + ], + "returned": "/Dokumente/Alt", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "deleteInside", + "steps": [ + { + "typed": "cd Dokumente/Alt", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm /Dokumente", + "window": null, + "told": [ + [ + "text", + "File could not be deleted\n" + ] + ], + "returned": "File could not be deleted\n", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente/Alt" + ] + ], + "returned": "/Dokumente/Alt", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory is empty\n" + ] + ], + "returned": "Directory is empty\n", + "directory": "/Dokumente/Alt", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd ..", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "pwd", + "window": null, + "told": [ + [ + "text", + "/Dokumente" + ] + ], + "returned": "/Dokumente", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm /", + "window": null, + "told": [ + [ + "text", + "File successfully deleted\n" + ] + ], + "returned": "File successfully deleted\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1" + ] + ], + "returned": "Directory /:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "sameName", + "steps": [ + { + "typed": "mv notizen.txt notizen.txt", + "window": null, + "told": [ + [ + "text", + "File successfully moved/renamed\n" + ] + ], + "returned": "File successfully moved/renamed\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cp kurz.txt kurz.txt", + "window": null, + "told": [ + [ + "text", + "File successfully copied\n" + ] + ], + "returned": "File successfully copied\n", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:2" + ] + ], + "returned": "Directory /:\n[Dokumente]\nbild.png................................70\nkurz.txt................................5\n[leer]\n\nNumber of directories:2\nNumber of files:2", + "directory": "/", + "files": [ + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "usage", + "steps": [ + { + "typed": "pwd x", + "window": null, + "told": [ + [ + "text", + "pwd - print working directory\nUsage: pwd\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm", + "window": null, + "told": [ + [ + "text", + "del / rm - delete file/directory\nUsage: del \n relative path to current directory\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "rm a b", + "window": null, + "told": [ + [ + "text", + "del / rm - delete file/directory\nUsage: del \n relative path to current directory\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd a b", + "window": null, + "told": [ + [ + "text", + "cd - change directory\nUsage: cd \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "touch a b", + "window": null, + "told": [ + [ + "text", + "touch - create file\nUsage: touch \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "mkdir a b", + "window": null, + "told": [ + [ + "text", + "mkdir - create directory\nUsage: mkdir \n name of new directory either as absolute path \n or relative path\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cp a b c", + "window": null, + "told": [ + [ + "text", + "copy / cp - copy file\nUsage: copy \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "mv a b c", + "window": null, + "told": [ + [ + "text", + "move / mv - move/rename file\nUsage: move \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help type", + "window": null, + "told": [ + [ + "text", + "cat / type - show file contents\nUsage: cat \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help rm", + "window": null, + "told": [ + [ + "text", + "del / rm - delete file/directory\nUsage: del \n relative path to current directory\n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help cp", + "window": null, + "told": [ + [ + "text", + "copy / cp - copy file\nUsage: copy \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "help mv", + "window": null, + "told": [ + [ + "text", + "move / mv - move/rename file\nUsage: move \n" + ] + ], + "returned": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "\t", + "window": "blank", + "told": [], + "returned": null, + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "name": "paths", + "steps": [ + { + "typed": "ls ./Dokumente", + "window": null, + "told": [ + [ + "text", + "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1" + ] + ], + "returned": "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\n\nNumber of directories:1\nNumber of files:1", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls notizen.txt", + "window": null, + "told": [ + [ + "text", + "Directory is empty\n" + ] + ], + "returned": "Directory is empty\n", + "directory": "/", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "cd Dokumente", + "window": null, + "told": [ + [ + "text", + "" + ] + ], + "returned": "", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "test", + "window": null, + "told": [ + [ + "text", + "Successfully built!" + ] + ], + "returned": "Successfully built!", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/test.txt", + "txt", + "blaaa", + 3 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + }, + { + "typed": "ls", + "window": null, + "told": [ + [ + "text", + "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\ntest.txt................................3\n\nNumber of directories:1\nNumber of files:2" + ] + ], + "returned": "Directory /Dokumente:\nbrief.txt...............................42\n[Alt]\ntest.txt................................3\n\nNumber of directories:1\nNumber of files:2", + "directory": "/Dokumente", + "files": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/Dokumente/test.txt", + "txt", + "blaaa", + 3 + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "start": [ + [ + "/notizen.txt", + "txt", + "Hallo Welt", + 6 + ], + [ + "/Dokumente" + ], + [ + "/Dokumente/brief.txt", + "txt", + "Sehr geehrte Damen und Herren,\nviele Grüße", + 42 + ], + [ + "/Dokumente/Alt" + ], + [ + "/bild.png", + "png", + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9\nawAAAABJRU5ErkJggg==", + 70 + ], + [ + "/kurz.txt", + "txt", + "SGFsbG8=", + 5 + ], + [ + "/leer" + ] + ] + } + ], + "texts": { + "sw_terminal_arp": "arp - show or manipulate Address Resolution Protocol (ARP) table", + "sw_terminal_arpsend": "arpsend - send an ARP reply", + "sw_terminal_cat": "cat / type - show file contents", + "sw_terminal_cd": "cd - change directory", + "sw_terminal_copy": "copy / cp - copy file", + "sw_terminal_del": "del / rm - delete file/directory", + "sw_terminal_dir": "dir / ls - show list of files in current directory", + "sw_terminal_exit": "exit - exit terminal application", + "sw_terminal_help": "help - show the list of commands or info on one command", + "sw_terminal_host": "host - resolve hostname to IP address", + "sw_terminal_ipconfig": "ipconfig - show network configuration", + "sw_terminal_mkdir": "mkdir - create directory", + "sw_terminal_move": "move / mv - move/rename file", + "sw_terminal_msg1": "Application", + "sw_terminal_msg10": "\nNumber of directories:", + "sw_terminal_msg11": "\nNumber of files:", + "sw_terminal_msg12": "Error in Touch\n", + "sw_terminal_msg13": "File created\n", + "sw_terminal_msg14": "File does already exist\n", + "sw_terminal_msg15": "Please enter a file name!\n", + "sw_terminal_msg16": "Error while creating new folder\n", + "sw_terminal_msg17": "Folder is created\n", + "sw_terminal_msg18": "Folder does already exist\n", + "sw_terminal_msg19": "Please enter folder name!\n", + "sw_terminal_msg2": "is already installed.\n", + "sw_terminal_msg20": "Directory does not exist\n", + "sw_terminal_msg21": "Folder changed! (..)\n", + "sw_terminal_msg22": "Folder changed!\n", + "sw_terminal_msg23": "Test\n", + "sw_terminal_msg24": "Successfully built!", + "sw_terminal_msg25": "List of available commands:\n arp show or manipulate Address Resolution Protocol (ARP) table\n arpsend send an ARP reply\n cat / type show file contents \n cd change directory\n cls clear screen \n copy / cp copy file\n del / rm delete file/directory\n dir / ls show list of files in current directory\n exit exit terminal application\n help show this list of commands\n host resolve hostname to IP address\n ipconfig show network configuration\n mkdir create directory\n move / mv move/rename file\n netstat show list of connections\n nslookup resolve hostname to IP address\n ping test connection to other computer\n pwd print working directory\n route show routing table\n tcpdump show data exchange\n touch create file\n traceroute analyse hops of connecting path \n", + "sw_terminal_msg26": "Use command 'help' to show list of available commands \n or 'help ' for further information on the command.", + "sw_terminal_msg27": "DNS server . . .:", + "sw_terminal_msg28": "has the IP address", + "sw_terminal_msg29": "Invalid host string!\nOnly correct URLs without paths are allowed.\n", + "sw_terminal_msg3": "successfully installed\n", + "sw_terminal_msg30": "Hostname could not be resolved!\nPossibly no DNS server is available.\n", + "sw_terminal_msg31": "Timeout! No response received during waiting period.", + "sw_terminal_msg33": "File successfully copied\n", + "sw_terminal_msg34": "File could not be copied\n", + "sw_terminal_msg35": "File successfully moved/renamed\n", + "sw_terminal_msg36": "File could not be moved/renamed\n", + "sw_terminal_msg37": "File successfully deleted\n", + "sw_terminal_msg38": "File could not be deleted\n", + "sw_terminal_msg39": "\n", + "sw_terminal_msg4": "IP address . . .:", + "sw_terminal_msg45": "packet statistics", + "sw_terminal_msg46": "packet(s) transmitted", + "sw_terminal_msg47": "packet(s) received", + "sw_terminal_msg48": "packet loss", + "sw_terminal_msg49": "| Proto | Local Address | Remote Address | State |\n", + "sw_terminal_msg5": "Netmask. . . . .:", + "sw_terminal_msg50": "| Internet Address | Physical Address |\n", + "sw_terminal_msg52": "Destination not reachable", + "sw_terminal_msg53": "Ping to Broadcast is not supported.", + "sw_terminal_msg54": "No such file", + "sw_terminal_msg55": "Cancel with Ctrl+C", + "sw_terminal_msg57": "\n\n sSSs .S S. .S .S S. sSSs \n d%%SP .SS SS. .SS .SS SS. d%%SP \n d%S' S%S S%S S%S S%S S%S d%S' \n S%S S%S S%S S%S S%S S%S S%| \n S&S S&S S&S S&S S&S S&S S&S \n S&S_Ss S&S S&S S&S S&S S&S Y&Ss \n S&S~SP S&S S&S S&S S&S S&S `S&&S \n S&S S&S S&S S&S S&S S&S `S*S \n S*b S*S S*b S*S S*b d*S l*S \n S*S S*S S*S. S*S S*S. .S*S .S*P \n S*S S*S SSSbs S*S SSSbs_sdSSS sSS*S \n S*S S*S YSSP S*S YSSP~YSSY YSS' \n SP SP SP \n Y Y Y \n\n", + "sw_terminal_msg58": "mail is handled by", + "sw_terminal_msg6": "Standard gateway:", + "sw_terminal_msg6666": "Physical address:", + "sw_terminal_msg7": "| Destination | Netmask | Gateway | Interface |\n -------------------------------------------------------------------------\n", + "sw_terminal_msg8": "Directory is empty\n", + "sw_terminal_msg9": "Directory", + "sw_terminal_netstat": "netstat - show list of connections", + "sw_terminal_nslookup": "nslookup - resolve hostname to IP address", + "sw_terminal_ping": "ping - test connection to other computer", + "sw_terminal_pwd": "pwd - print working directory", + "sw_terminal_route": "route - show routing table", + "sw_terminal_tcpdump": "tcpdump - show data exchange", + "sw_terminal_touch": "touch - create file", + "sw_terminal_trace_msg10": "Error: response from %s was \"ICMP Destination Unreachable\"", + "sw_terminal_trace_msg11": "%s was reached with one hop.", + "sw_terminal_trace_msg12": "%s was reached with %s hops.", + "sw_terminal_trace_msg13": "Error: next hop could not be processed.", + "sw_terminal_trace_msg2": "Error: could not connect to DNS server.", + "sw_terminal_trace_msg3": "Error: domain could not be resolved.", + "sw_terminal_trace_msg4": "trace route to %s started (max. %s hops).", + "sw_terminal_trace_msg5": "trace route to %s (%s) started (max. %s hops).", + "sw_terminal_trace_msg6": "%s could not be reached via %s hops.", + "sw_terminal_trace_msg7": "Analysis interrupted!", + "sw_terminal_trace_msg8": "Error: response from %s was \"ICMP Network Unreachable\"", + "sw_terminal_trace_msg9": "Error: response from %s was \"ICMP Host Unreachable\"", + "sw_terminal_traceroute": "traceroute - analyse hops of connecting path", + "sw_terminal_usage_arp": "Usage: arp [-d []] [-a ] \n -d \t delete ARP entry for IP address or reset ARP table \n -a \t show ARP entry for specified IP address", + "sw_terminal_usage_arpsend": "Usage: arpsend \n address to be published for own MAC address\n target the reply must be sent to", + "sw_terminal_usage_cat": "Usage: cat ", + "sw_terminal_usage_cd": "Usage: cd ", + "sw_terminal_usage_copy": "Usage: copy ", + "sw_terminal_usage_del": "Usage: del \n relative path to current directory", + "sw_terminal_usage_dir": "Usage: dir", + "sw_terminal_usage_exit": "Usage: exit", + "sw_terminal_usage_help": "Usage: help []", + "sw_terminal_usage_host": "Usage: host \n the domain for which to look up A and MX records", + "sw_terminal_usage_ipconfig": "Usage: ipconfig", + "sw_terminal_usage_mkdir": "Usage: mkdir \n name of new directory either as absolute path \n or relative path", + "sw_terminal_usage_move": "Usage: move ", + "sw_terminal_usage_netstat": "Usage: netstat", + "sw_terminal_usage_nslookup": "Usage: nslookup \n the domain for which to look up A (and related NS) records", + "sw_terminal_usage_ping": "Usage: ping \n the remote address as IP address or host name", + "sw_terminal_usage_pwd": "Usage: pwd", + "sw_terminal_usage_route": "Usage: route", + "sw_terminal_usage_tcpdump": "Usage: tcpdump", + "sw_terminal_usage_touch": "Usage: touch ", + "sw_terminal_usage_traceroute": "Usage: traceroute \n the remote address as IP address or host name", + "terminal_msg1": "root>", + "terminal_msg2": "Unknown command!", + "terminal_msg3": "Type 'help' to get a list of available commands." + } +} diff --git a/packages/core/test/terminal.test.ts b/packages/core/test/terminal.test.ts new file mode 100644 index 0000000..a830dcb --- /dev/null +++ b/packages/core/test/terminal.test.ts @@ -0,0 +1,259 @@ +// The command line (apps/terminal.ts) against Java FILIUS' own: +// tools/java-oracle's TerminalCases fed Java's Terminal, as its window does, +// with the lines of terminal.cases.txt on host 10.0.0.2 of router-web +// (terminal..java.json). After each line: what the window does +// itself, what the program told it, the working directory, and every file +// must be Java's, in both languages, except where Java errs. + +import { readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; +import { + entryName, + javaBase64, + javaBase64Decode, + TERMINAL_TEXTS, + VirtualFileSystem, + withSnapshot, + type NetworkRuntimeEngine, + type PageLanguage, + type TerminalTextKey, + type VirtualFileContent, +} from '../src/index.js'; +import { watchedEngine } from './javaRun.js'; +import { snapshotOf, type Scenario } from './scenario.js'; + +const here = dirname(fileURLToPath(import.meta.url)); +const HOST = '00000000-0000-0000-0000-000000000301'; + +/** A file as TerminalCases writes it: path, and for a file its type, content and size. */ +type JavaNode = [string] | [string, string, string, number]; +type Told = ['text', string] | ['busy', boolean]; + +interface JavaStep { + typed: string; + window: 'blank' | 'exit' | 'clear' | null; + told: Told[]; + directory: string; + files: JavaNode[]; +} + +interface JavaCase { + name: string; + start: JavaNode[]; + steps: JavaStep[]; +} + +/** TerminalCases.files: the host's files at the start, in their order. */ +function startFiles(start: JavaNode[]): VirtualFileSystem { + const files = new VirtualFileSystem(); + for (const node of start) { + if (node.length === 1) files.createDirectory(node[0]); + else if (node[1] === 'png') files.writeImageFile(node[0], javaBase64Decode(node[2])!, 'image/png'); + else files.writeTextFile(node[0], node[2]); + } + return files; +} + +/** The engine's files as TerminalCases writes Java's: preorder, each directory's entries in their order. */ +function engineFiles(files: VirtualFileSystem, directory = '/'): JavaNode[] { + return files.entriesInCreationOrder(directory).flatMap((entry): JavaNode[] => { + const content: VirtualFileContent = entry.content; + if (content.kind === 'directory') return [[entry.path], ...engineFiles(files, entry.path)]; + const text = content.kind === 'text' ? content.text : javaBase64(content.data); + return [[entry.path, content.kind === 'text' ? 'text' : 'binary', text, content.kind === 'text' ? content.text.length : content.data.length]]; + }); +} + +/** Java's file types as the engine's kinds: an image FILIUS keeps in Base64, every other file as text. */ +const kindOf = (type: string) => (type === 'png' ? 'binary' : 'text'); + +/** + * Java's sizes of text files: Datei.holeGroesse decodes the text as Base64 + * and counts the bytes ("Hallo Welt" is 6). As Java means it: the + * characters. Applied to every step, in the file list and in each listing. + */ +function withTextSizes(step: JavaStep): JavaStep { + const files = step.files.map((node): JavaNode => (node.length === 1 ? node : [node[0], kindOf(node[1]), node[2], kindOf(node[1]) === 'text' ? node[2].length : node[3]])); + const sizes = new Map(files.flatMap((node) => (node.length === 4 && node[1] === 'text' ? [[entryName(node[0]), node[3]] as const] : []))); + const told = step.told.map(([kind, value]): Told => { + if (kind !== 'text') return [kind, value]; + return ['text', value.replace(/^(?!\[)(.+?)(\.+)(\d+)$/gm, (line, name: string, dots: string, size: string) => (sizes.has(name) ? `${name}${dots}${sizes.get(name)}` : line))]; + }); + return { ...step, files, told }; +} + +type Fix = (steps: JavaStep[], text: (key: TerminalTextKey) => string) => JavaStep[]; + +const said = (step: JavaStep, ...texts: string[]): JavaStep => ({ ...step, told: texts.map((each): Told => ['text', each]) }); +const at = (steps: JavaStep[], changes: Record JavaStep>) => steps.map((step, index) => changes[index]?.(step) ?? step); + +/** + * Where Java errs, the case as Java means it (the engine's departures, see + * terminal.ts). + */ +const JAVA_BUGS: Record = { + // A folder that is not there: Java says "empty"; ls .. at the root lists + // nothing (".." goes above the root); ls / names no path. + listing: (steps, text) => + at(steps, { + 4: (step) => said(step, text('sw_terminal_msg20')), + 5: (step) => ({ ...step, told: steps[0]!.told }), + 6: (step) => said(step, (step.told[0]![1] as string).replace(/^(\S+) :/, '$1 /:')), + }), + // cd to a file makes it the working directory. + navigate: (steps, text) => + at(steps, { + 13: (step) => ({ ...said(step, text('sw_terminal_msg20')), directory: '/' }), + 14: (step) => ({ ...said(step, '/'), directory: '/' }), + 15: (step) => ({ ...step, directory: '/', told: listingOfStart(text) }), + }), + // touch and mkdir in a folder that is not there: "made" and "there already". + files: (steps, text) => + at(steps, { + 4: (step) => said(step, text('sw_terminal_msg12')), + 10: (step) => said(step, text('sw_terminal_msg16')), + }), + // cp onto a folder's name throws (ClassCastException). + copy: (steps, text) => at(steps, { 6: (step) => said(step, text('sw_terminal_msg34')) }), + // mv onto the file in another case copies it onto itself, then removes it. + rename: (steps) => { + const renamed: JavaNode = ['/NOTIZEN.TXT', 'text', 'Hallo Welt', 10]; + return at(steps, { + 0: (step) => ({ ...step, files: [...step.files, renamed] }), + 1: (step) => ({ ...step, files: [...step.files, renamed], told: [['text', addedFile(step.told, 'NOTIZEN.TXT', 10)]] }), + 2: (step) => ({ ...step, files: [...step.files.filter((node) => node[0] !== '/brief.txt'), renamed, step.files.find((node) => node[0] === '/brief.txt')!] }), + 3: (step) => ({ + ...step, + files: [...step.files.filter((node) => node[0] !== '/brief.txt'), renamed, step.files.find((node) => node[0] === '/brief.txt')!], + told: [['text', addedFile(step.told, 'NOTIZEN.TXT', 10, 'brief.txt')]], + }), + }); + }, + // ".." above the root: Java's path evaluation throws (rm ../bild.png from the root). + delete: (steps, text) => + at(steps, { + 5: (step) => ({ ...said(step, text('sw_terminal_msg37')), files: step.files.filter((node) => node[0] !== '/bild.png') }), + 6: (step) => ({ + ...step, + files: step.files.filter((node) => node[0] !== '/bild.png'), + told: [['text', (step.told[0]![1] as string).replace(/\nbild\.png\.+\d+/, '').replace(/(:)2$/, '$11')]], + }), + }), + // rm /Dokumente from inside: Java puts the working directory in front of + // the path and finds nothing; rm / then removes the working directory. + deleteInside: (steps, text) => { + const withoutDocuments = (step: JavaStep) => step.files.filter((node) => !node[0].startsWith('/Dokumente')); + const start = steps[0]!.files; + const remaining = start.filter((node) => !node[0].startsWith('/Dokumente')); + const rootListing = listing(text, '/', remaining); + return at(steps, { + 1: (step) => ({ ...said(step, text('sw_terminal_msg37')), directory: '/', files: withoutDocuments(step) }), + 2: (step) => ({ ...said(step, '/'), directory: '/', files: remaining }), + 3: (step) => ({ ...said(step, rootListing), directory: '/', files: remaining }), + 4: (step) => ({ ...said(step, ''), directory: '/', files: remaining }), + 5: (step) => ({ ...said(step, '/'), directory: '/', files: remaining }), + 6: (step) => ({ ...said(step, text('sw_terminal_msg38')), directory: '/', files: remaining }), + 7: (step) => ({ ...said(step, rootListing), directory: '/', files: remaining }), + }); + }, + // ls of a file: Java lists its children (none: "empty"). + paths: (steps, text) => at(steps, { 1: (step) => said(step, text('sw_terminal_msg20')) }), + // mv onto the file itself: Java copies it onto itself, then removes it. + sameName: (steps) => { + const notes: JavaNode = ['/notizen.txt', 'text', 'Hallo Welt', 10]; + return at(steps, { + 0: (step) => ({ ...step, files: [...step.files, notes] }), + 1: (step) => ({ ...step, files: [...step.files, notes] }), + 2: (step) => ({ ...step, files: [...step.files, notes], told: [['text', addedFile(step.told, 'notizen.txt', 10)]] }), + }); + }, +}; + +/** A listing's text with a file added at its end (after `before`'s line when given), one file more counted. */ +function addedFile(told: Told[], name: string, size: number, before?: string): string { + const text = told[0]![1] as string; + const line = `\n${name}${'.'.repeat(40 - name.length)}${size}`; + const withLine = before === undefined ? text.replace(/\n\n/, `${line}\n\n`) : text.replace(new RegExp(`\\n${before.replace('.', '\\.')}`), `${line}\n${before}`); + return withLine.replace(/(\d+)$/, (count) => String(Number(count) + 1)); +} + +/** Terminal.dir's listing of a directory as Java writes it, from TerminalCases' file list. */ +function listing(text: (key: TerminalTextKey) => string, directory: string, files: JavaNode[]): string { + const children = files.filter((node) => node[0] !== directory && node[0].slice(0, node[0].lastIndexOf('/') || 1) === directory); + const lines = children.map((node) => (node.length === 1 ? `[${entryName(node[0])}]` : `${entryName(node[0])}${'.'.repeat(Math.max(0, 40 - entryName(node[0]).length))}${node[3]}`)); + const directories = children.filter((node) => node.length === 1).length; + return `${text('sw_terminal_msg9')} ${directory}:\n${lines.join('\n')}\n${text('sw_terminal_msg10')}${directories}${text('sw_terminal_msg11')}${children.length - directories}`; +} + +let startNodes: JavaNode[] = []; +/** The root's listing of the start files (with the sizes as Java means them). */ +const listingOfStart = (text: (key: TerminalTextKey) => string): Told[] => [['text', listing(text, '/', startNodes)]]; + +function javaCases(language: PageLanguage): JavaCase[] { + return (JSON.parse(readFileSync(join(here, `terminal.${language}.java.json`), 'utf8')) as { cases: JavaCase[] }).cases; +} + +function play(javaCase: JavaCase, language: PageLanguage): JavaStep[] { + const scenario = JSON.parse(readFileSync(join(here, 'scenarios', 'router-web.scenario.json'), 'utf8')) as Scenario; + const files = startFiles(javaCase.start); + const snapshot = withSnapshot(snapshotOf(scenario), { language, terminalNodeIds: new Set([HOST]), fileSystemsByNodeId: new Map([[HOST, files]]) }); + const { engine } = watchedEngine(scenario, snapshot); + const terminal = (each: NetworkRuntimeEngine) => each.terminal(HOST)!; + let seen = 0; + return javaCase.steps.map((step) => { + const window = terminal(engine).enter(step.typed) ?? null; + const told = terminal(engine) + .log.all.slice(seen) + .map((line): Told => (line.kind === 'text' ? ['text', line.text] : ['busy', line.busy])); + seen = terminal(engine).log.all.length; + return { typed: step.typed, window, told, directory: terminal(engine).directory, files: engineFiles(files) }; + }); +} + +describe('the command line as Java FILIUS answers it', () => { + for (const language of ['de', 'en'] as const) { + const cases = javaCases(language); + const text = (key: TerminalTextKey) => TERMINAL_TEXTS[language][key]; + + it(`corrects Java only where it errs (${language})`, () => { + for (const [name, fix] of Object.entries(JAVA_BUGS)) { + const javaCase = cases.find((each) => each.name === name)!; + startNodes = withTextSizes({ ...javaCase.steps[0]!, files: javaCase.start }).files; + const steps = javaCase.steps.map(withTextSizes); + expect(JSON.stringify(fix(steps, text)), name).not.toBe(JSON.stringify(steps)); + } + }); + + for (const javaCase of cases) { + it(`${javaCase.name} (${language})`, () => { + startNodes = withTextSizes({ ...javaCase.steps[0]!, files: javaCase.start }).files; + const steps = javaCase.steps.map(withTextSizes); + const expected = JAVA_BUGS[javaCase.name]?.(steps, text) ?? steps; + const actual = play(javaCase, language); + for (const [index, step] of expected.entries()) { + const { typed, window, told, directory, files } = step; + expect(actual[index], `step ${index}: ${JSON.stringify(typed)}`).toEqual({ typed, window, told, directory, files }); + } + }); + } + } +}); + +describe('the command line beyond the cases', () => { + it('copies an image as an image', () => { + const scenario = JSON.parse(readFileSync(join(here, 'scenarios', 'router-web.scenario.json'), 'utf8')) as Scenario; + const files = new VirtualFileSystem(); + files.writeImageFile('/bild.png', new Uint8Array([1, 2, 3]), 'image/png'); + const { engine } = watchedEngine(scenario, withSnapshot(snapshotOf(scenario), { terminalNodeIds: new Set([HOST]), fileSystemsByNodeId: new Map([[HOST, files]]) })); + engine.terminal(HOST)!.enter('cp bild.png kopie.png'); + expect(files.entry('/kopie.png').content).toEqual({ kind: 'image', data: new Uint8Array([1, 2, 3]), mediaType: 'image/png' }); + }); + + it('lists in the order of making only a folder', () => { + const files = new VirtualFileSystem(); + files.writeTextFile('/a.txt', 'a'); + expect(() => files.entriesInCreationOrder('/a.txt')).toThrow('expectedDirectory'); + }); +}); diff --git a/packages/fls/src/projectSnapshot.ts b/packages/fls/src/projectSnapshot.ts index 4f4a551..fda116a 100644 --- a/packages/fls/src/projectSnapshot.ts +++ b/packages/fls/src/projectSnapshot.ts @@ -7,7 +7,8 @@ // A DNS server runs only when it is switched on (Java: DNSServer.aktiv); an // echo, web or e-mail server is there either way, switched on or off (it can be // switched at run time). The programs read the nodes' files (a web server its -// pages). +// pages); the command line changes them, and as they are the project's own, +// a project saved after the run holds the change, as in Java. // // Back the other way: what the simulation changes that Java keeps in the // project (its objects are the project's), so a project saved after it holds @@ -38,6 +39,7 @@ export function projectSnapshot(project: ImportedProject): TopologySnapshot { emailServers.set(nodeId, { domain: configuration.domain, accounts: configuration.accounts, isActive: project.activePrograms.get(nodeId)?.has('emailServer') === true }); } const emailClients = new Map([...project.emailClientConfigurations].filter(([nodeId]) => project.installedPrograms.get(nodeId)?.has('emailClient') === true)); + const terminals = new Set([...project.installedPrograms].filter(([, programs]) => programs.has('commandPrompt')).map(([nodeId]) => nodeId)); const webBrowsers = new Set([...project.installedPrograms].filter(([, programs]) => programs.has('webBrowser')).map(([nodeId]) => nodeId)); return topologySnapshot({ nodes: project.graph.nodes.map((node) => ({ @@ -63,6 +65,7 @@ export function projectSnapshot(project: ImportedProject): TopologySnapshot { webBrowserNodeIds: webBrowsers, emailServersByNodeId: emailServers, emailClientsByNodeId: emailClients, + terminalNodeIds: terminals, fileSystemsByNodeId: project.virtualFileSystems, }); } diff --git a/packages/fls/test/importProject.test.ts b/packages/fls/test/importProject.test.ts index eec3ba3..c936649 100644 --- a/packages/fls/test/importProject.test.ts +++ b/packages/fls/test/importProject.test.ts @@ -857,6 +857,22 @@ describe('importProject rules', () => { expect(client('Rechner 3').account).toEqual(project.emailClientConfigurations.get(receiver)!.account); }); + it("keeps what the command line did to a node's files in the project saved after the run", () => { + const name = 'java-examples/Internet_Komplett_mit_eMail_Webserver_Intranet_Portforwarding_Firewall_DHCP_DE.fls'; + const project = openProjectArchive(new Uint8Array(readFileSync(join(corpusRoot, name))), counter()); + const notebook = project.graph.nodes.find((each) => each.displayName === 'Notebook' && project.deviceConfigurations.get(each.id)?.ipAddress === '10.10.20.11')!.id; + const snapshot = projectSnapshot(project); + expect(snapshot.terminalNodeIds.has(notebook)).toBe(true); + const engine = new NetworkRuntimeEngine(14); + engine.handle({ type: 'start', snapshot, seed: 14, initialTimeMilliseconds: 0 }); + for (const line of ['mkdir Projekt', 'cd Projekt', 'touch plan.txt']) engine.terminal(notebook)!.enter(line); + engine.handle({ type: 'advance', toMilliseconds: 1_000 }); + + const reopened = openProjectArchive(saveProjectArchive(projectWithSimulationChanges(project, engine.state.topologySnapshot)).archive, counter()); + const reopenedNotebook = reopened.graph.nodes.find((each) => each.displayName === 'Notebook' && reopened.deviceConfigurations.get(each.id)?.ipAddress === '10.10.20.11')!.id; + expect(reopened.virtualFileSystems.get(reopenedNotebook)!.entry('/Projekt/plan.txt').content).toEqual({ kind: 'text', text: '' }); + }); + it("keeps a node's IP forwarding where it differs from its kind's: a host that forwards, a router that does not", () => { const system = (ipForwardingEnabled: boolean) => ({ manualRoutes: [], ipForwardingEnabled }); const project = importProject( diff --git a/scripts/code_language_allow.txt b/scripts/code_language_allow.txt index 0432eff..3ebf906 100644 --- a/scripts/code_language_allow.txt +++ b/scripts/code_language_allow.txt @@ -86,3 +86,5 @@ packages/core/test/routerWebJava.test.ts::konfig packages/core/src/runtime/apps/emailServer.ts::smtpmitarbeiter packages/core/src/runtime/apps/emailServer.ts::pop3mitarbeiter packages/core/src/runtime/apps/emailClient.ts::smtpclient +# arpsend: a command only FILIUS' terminal has (send an ARP reply); named as Java names it. +packages/core/src/runtime/apps/::arpsend diff --git a/tools/java-oracle/README.md b/tools/java-oracle/README.md index 0c03641..94b6798 100644 --- a/tools/java-oracle/README.md +++ b/tools/java-oracle/README.md @@ -764,3 +764,32 @@ Gemessen (01.10.2026): * Wer von zwei fast gleichzeitig gebauten Sockets die nächste TCP-Startnummer zieht, entscheidet der Thread-Takt (Programm und Weiterleitung des Servers, wenige Millisekunden auseinander). + +## Befehlszeile, lokale Befehle (F3.4a) + +`TerminalCases` füttert Javas `Terminal` mit Zeilen, wie sie getippt +werden, und zerlegt sie wie das Fenster (`GUIApplicationTerminalWindow`: +erstes Wort der Befehl, dann die Parameter, mindestens drei leere dazu; +`exit`, `cls`, `reset` und leere Zeilen behandelt das Fenster selbst). Ohne +laufendes Netz, auf Rechner 10.0.0.2 von `router-web` mit festen Dateien. +Geschrieben werden je Zeile, was das Programm dem Fenster sagt, der +Arbeitsordner und alle Dateien, dazu die Terminal-Texte des Bündels, wie +Java sie lädt (daraus `terminalTexts.ts`). + +Gemessen (01.10.2026): + +* Java ruft jede Methode des Terminals mit `String[]`-Parameter auf, deren + Name der Befehl ist, mit Groß- und Kleinschreibung (`LS` ist unbekannt). +* Ordner listet `ls` in der Reihenfolge, in der die Einträge entstanden; + Pfade findet Java ohne Rücksicht auf Groß- und Kleinschreibung und zeigt + die gespeicherte Schreibweise. +* Die Größe einer Datei: Java dekodiert jeden Inhalt als Base64 und zählt + die Bytes, nur bei einem Fehler die Zeichen; „Hallo Welt“ hat 6. +* Fehler: `ls` auf einen fehlenden Ordner sagt „leer“, `dir /` schreibt + „Verzeichnis :“; `cd` auf eine Datei macht sie zum Arbeitsordner; `touch` + und `mkdir` in einem fehlenden Ordner melden „erstellt“ bzw. „bereits + vorhanden“; `cp` auf einen Ordnernamen wirft; `..` über der Wurzel findet + nichts oder wirft; `rm` (und das Löschen bei `mv`) hängt einen absoluten + Pfad an den Arbeitsordner, `rm /` löscht den Arbeitsordner und meldet + Erfolg; `mv` auf die Datei selbst (auch in anderer Schreibweise) löscht + sie. diff --git a/tools/java-oracle/run.sh b/tools/java-oracle/run.sh index 4743e28..60c79f2 100755 --- a/tools/java-oracle/run.sh +++ b/tools/java-oracle/run.sh @@ -21,7 +21,7 @@ if [ ! -f "$upstream/target/filius.jar" ]; then fi classpath="$upstream/target/filius.jar:$upstream/target/lib/*" mkdir -p "$here/.build" -javac -encoding UTF-8 -d "$here/.build" -cp "$classpath" "$here/src/FlsOracle.java" "$here/src/GetterDefaults.java" "$here/src/IpCheckCases.java" "$here/src/DnsHostsCases.java" "$here/src/EmailFileCases.java" "$here/src/BeansDump.java" "$here/src/Base64Cases.java" "$here/src/ScenarioNetwork.java" "$here/src/DhcpRun.java" "$here/src/TcpRun.java" "$here/src/DnsRun.java" "$here/src/ArpRun.java" "$here/src/RipRun.java" "$here/src/NatRun.java" "$here/src/WlanRun.java" "$here/src/ExampleRun.java" "$here/src/EchoRun.java" "$here/src/WebRun.java" "$here/src/RouterWebRun.java" "$here/src/KonfigCases.java" "$here/src/EmailRun.java" "$here/src/MailCases.java" "$here/src/EmailClientRun.java" +javac -encoding UTF-8 -d "$here/.build" -cp "$classpath" "$here/src/FlsOracle.java" "$here/src/GetterDefaults.java" "$here/src/IpCheckCases.java" "$here/src/DnsHostsCases.java" "$here/src/EmailFileCases.java" "$here/src/BeansDump.java" "$here/src/Base64Cases.java" "$here/src/ScenarioNetwork.java" "$here/src/DhcpRun.java" "$here/src/TcpRun.java" "$here/src/DnsRun.java" "$here/src/ArpRun.java" "$here/src/RipRun.java" "$here/src/NatRun.java" "$here/src/WlanRun.java" "$here/src/ExampleRun.java" "$here/src/EchoRun.java" "$here/src/WebRun.java" "$here/src/RouterWebRun.java" "$here/src/KonfigCases.java" "$here/src/EmailRun.java" "$here/src/MailCases.java" "$here/src/EmailClientRun.java" "$here/src/TerminalCases.java" # FILIUS writes its settings below $HOME; keep them out of the real one. mkdir -p "$here/.build/home" # Removed first: a crashed run must not leave the previous result standing. @@ -276,6 +276,16 @@ for run in send:15000 fetch:10000 byName:35000 wrongPass:8000 noServer:15000 unk test -s "$output" done +# The command line fed with lines as typed, without a running network, in +# both languages (TerminalCases; packages/core/test/terminal.test.ts). +for language in de en; do + output="$root/packages/core/test/terminal.$language.java.json" + rm -f "$output" + HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" TerminalCases "$language" \ + "$root/packages/core/test/scenarios/router-web.scenario.json" "$root/packages/core/test/terminal.cases.txt" "$output" 2>&1 | grep -v 'logback\|^$' || true + test -s "$output" +done + # FILIUS' own examples as Java FILIUS runs them, opened and started as FILIUS # does (ExampleRun): the acceptance of F2 (packages/fls/test/examplesJava.test.ts). for run in internetwork_komplett:routing:12000 einfaches_rechnernetz_komplett:dhcp:20000 dns_server:dns:12000 \ diff --git a/tools/java-oracle/src/TerminalCases.java b/tools/java-oracle/src/TerminalCases.java new file mode 100644 index 0000000..57a30c8 --- /dev/null +++ b/tools/java-oracle/src/TerminalCases.java @@ -0,0 +1,170 @@ +// Feeds FILIUS' command line (Terminal, with the input handling of its window +// GUIApplicationTerminalWindow) with lines as typed, without a running +// network, and writes for each line what the program told the window (each +// text and each Boolean "busy" mark), what it returned, the working directory +// after it, and every file and directory of the host: the reference for the +// core's command line (packages/core/src/runtime/apps/terminal.ts). It also +// writes the terminal's texts of the message bundle, as Java loads them. +// Each case starts on host 10.0.0.2 of a scenario (ScenarioNetwork) with the +// files below and a new Terminal. The cases file is ASCII, with Java-style +// unicode escapes (backslash, u, four hex digits) for anything else: +// +// case +// +// +// Usage: java -cp filius.jar:lib/*:classes TerminalCases + +import filius.rahmenprogramm.Base64; +import filius.rahmenprogramm.Information; +import filius.software.lokal.Terminal; +import filius.software.system.Datei; +import filius.software.system.Dateisystem; +import filius.software.system.InternetKnotenBetriebssystem; + +import java.io.FileOutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.StringTokenizer; +import java.util.TreeMap; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreeNode; + +public class TerminalCases { + static final String HOST = "00000000-0000-0000-0000-000000000301"; + + /** A tiny PNG (1 x 1 pixel), as FILIUS keeps images: Base64. */ + static final String IMAGE = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="; + + /** The image as FILIUS writes a file's bytes (Base64.encodeBytes, with its line breaks). */ + static String imageAsFiliusWritesIt() { + try { + return Base64.encodeBytes(Base64.decode(IMAGE)); + } catch (Exception error) { + throw new IllegalStateException(error); + } + } + + /** The host's files at the start of each case, in this order. */ + static void files(Dateisystem files) { + files.getRoot().removeAllChildren(); + files.speicherDatei("/", new Datei("notizen.txt", "txt", "Hallo Welt")); + files.erstelleVerzeichnis("/", "Dokumente"); + files.speicherDatei("/Dokumente", new Datei("brief.txt", "txt", "Sehr geehrte Damen und Herren,\nviele Grüße")); + files.erstelleVerzeichnis("/Dokumente", "Alt"); + files.speicherDatei("/", new Datei("bild.png", "png", imageAsFiliusWritesIt())); + files.speicherDatei("/", new Datei("kurz.txt", "txt", "SGFsbG8=")); + files.erstelleVerzeichnis("/", "leer"); + } + + public static void main(String[] args) throws Exception { + // Before any class reads the message bundle (I18n.messages is read once). + Information.getInformation().setLocale(args[0].equals("en") ? new Locale("en", "GB") : Locale.GERMANY); + ScenarioNetwork network = ScenarioNetwork.read(args[1]); + InternetKnotenBetriebssystem system = network.system(HOST); + List cases = new ArrayList<>(); + List steps = null; + Terminal terminal = null; + List told = new ArrayList<>(); + for (String line : Files.readAllLines(Path.of(args[2]), StandardCharsets.US_ASCII)) { + if (line.startsWith("#")) continue; + if (line.startsWith("case ")) { + Map current = new LinkedHashMap<>(); + steps = new ArrayList<>(); + current.put("name", line.substring("case ".length())); + current.put("steps", steps); + cases.add(current); + files(system.getDateisystem()); + system.getInstallierteAnwendungen().remove("filius.software.lokal.Terminal"); + system.installApp("filius.software.lokal.Terminal", false); + terminal = (Terminal) system.holeSoftware("filius.software.lokal.Terminal"); + terminal.setSystemSoftware(system); + terminal.hinzuBeobachter((observable, data) -> { + if (data instanceof Boolean) told.add(Arrays.asList("busy", data)); + else if (data != null) told.add(Arrays.asList("text", data.toString())); + }); + current.put("start", tree(system.getDateisystem())); + continue; + } + String typed = IpCheckCases.unescape(line); + Map step = new LinkedHashMap<>(); + step.put("typed", typed); + told.clear(); + Object returned = null; + String window = null; + // GUIApplicationTerminalWindow: the first word is the command, the others its parameters, then at least three empty ones. + if (typed.trim().isEmpty()) { + window = "blank"; + } else { + StringTokenizer tokens = new StringTokenizer(typed, " "); + String command = tokens.nextToken(); + String[] parameters = new String[3 + tokens.countTokens()]; + Arrays.fill(parameters, ""); + for (int index = 0; tokens.hasMoreTokens(); index++) parameters[index] = tokens.nextToken(); + if (command.equals("exit")) { + window = "exit"; + } else if (command.equals("reset") || command.equals("cls")) { + window = "clear"; + } else { + // Terminal.terminalEingabeAuswerten, but in this thread instead of the program's. + try { + Method method = Terminal.class.getDeclaredMethod(command, String[].class); + terminal.setInterrupt(false); + returned = method.invoke(terminal, (Object) parameters); + } catch (NoSuchMethodException error) { + terminal.benachrichtigeBeobachter(terminal.messages.getString("terminal_msg2") + "\n" + terminal.messages.getString("terminal_msg3")); + } catch (InvocationTargetException error) { + returned = "!" + error.getCause().getClass().getSimpleName(); + } + } + } + step.put("window", window); + step.put("told", new ArrayList<>(told)); + step.put("returned", returned == null ? null : returned.toString()); + step.put("directory", Dateisystem.absoluterPfad(terminal.getAktuellerOrdner())); + step.put("files", tree(system.getDateisystem())); + steps.add(step); + } + Map out = new LinkedHashMap<>(); + out.put("cases", cases); + ResourceBundle bundle = terminal.messages; + Map texts = new TreeMap<>(); + for (String key : Collections.list(bundle.getKeys())) { + if (key.startsWith("sw_terminal") || key.startsWith("terminal_msg")) texts.put(key, bundle.getString(key)); + } + out.put("texts", texts); + try (FileOutputStream stream = new FileOutputStream(args[3])) { + stream.write((FlsOracle.Json.write(out, "") + "\n").getBytes(StandardCharsets.UTF_8)); + } + System.out.println("terminal cases (" + args[0] + "): " + cases.size()); + System.exit(0); + } + + /** Every node below the root in preorder: path, and for a file its type, content and size (Datei.holeGroesse). */ + static List tree(Dateisystem files) { + List nodes = new ArrayList<>(); + Enumeration all = files.getRoot().preorderEnumeration(); + while (all.hasMoreElements()) { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) all.nextElement(); + if (node == files.getRoot()) continue; + if (node.getUserObject() instanceof Datei) { + Datei file = (Datei) node.getUserObject(); + nodes.add(Arrays.asList(Dateisystem.absoluterPfad(node), file.getDateiTyp(), file.getDateiInhalt(), file.holeGroesse())); + } else { + nodes.add(Arrays.asList(Dateisystem.absoluterPfad(node))); + } + } + return nodes; + } +}