From d3f476269a810dbecd577c44191312d2328e55d7 Mon Sep 17 00:00:00 2001 From: Julian Kiedaisch Date: Wed, 30 Sep 2026 09:04:30 +0000 Subject: [PATCH] feat(fls): export the editor model's system software exportProject.ts, step X2: a switch's SSID and learning time, a host's SSID, manual routes, RIP, DHCP client and server with static assignments, a home router's port forwarding, the firewall of a router or home router (the core's names as Java's numbers), and modems. What the model has no setting for is what Java's constructors make. A remote link pair becomes modems on the port its identifier names (12345 when it names none); the first of a pair in node order serves, the others connect to localhost. Checked by Java: every corpus file, imported, exported and written, loads with the system software of the original up to two new named departures: a switch SSID Java rolls is the one the model derives from the node id, and the model keeps a modem pair, not which one serves (modem_beispiel.fls has the client first; both ways work within one project). The synthetic model now has settings away from every default, a home router with port forwarding and two modem pairs. 21 mutation probes, each loaded by Java, were all caught. Co-Authored-By: Claude Opus 5.5 --- CHANGES.md | 4 +- packages/fls/src/exportProject.ts | 155 ++++- packages/fls/test/exportProject.test.ts | 249 +++++++- packages/fls/test/exported.java.json | 787 +++++++++++++++++------- 4 files changed, 960 insertions(+), 235 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 80a2831..38d13af 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -51,8 +51,8 @@ Swift-Pfade relativ zu `filius-ipad/ios/FiliusPad/TopologyEditor/` (Stand | `test/javaBeansWriter.test.ts`, `test/beans/` | — | neu: 11 Dateien des Schreibers, von Javas `XMLDecoder` gelesen und beschrieben; Erwartungen von Hand | | `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); 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)“ | | `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) | -| `src/exportProject.ts` | Gegenstück zu `importProject.ts`; Java `JHostKonfiguration.updateWifiConnection`, `InternetKnotenBetriebssystem.getStandardGateway`/`setStandardGateway` | neu: Editor-Modell → Javas Sicht für den Schreiber, Schritt X1 Topologie — Geräte, Schnittstellen (MAC wie in der Simulation: aus der Datei oder aus der Port-ID abgeleitet), Kabel samt Funk (Karte drahtlos und Switch, wie Java verbindet), Gateway und DNS an allen Schnittstellen wie Javas eigene Setter, Doku-Elemente | -| `test/exportProject.test.ts`, `test/exported.java.json` | — | neu: alle 23 Korpus-Dateien importiert, exportiert, geschrieben und von Java geladen — Topologie wie beim Original bis auf benannte Abweichungen (abgeleiteter MAC statt gewürfeltem, Doku in Zeichenreihenfolge mit Text, Schrift und Mindestgröße des Modells); dazu ein künstliches Modell, das Java ebenfalls lädt | +| `src/exportProject.ts` | Gegenstück zu `importProject.ts`; Java `JHostKonfiguration.updateWifiConnection`, `InternetKnotenBetriebssystem.getStandardGateway`/`setStandardGateway` | neu: Editor-Modell → Javas Sicht für den Schreiber, Schritt X1 Topologie — Geräte, Schnittstellen (MAC wie in der Simulation: aus der Datei oder aus der Port-ID abgeleitet), Kabel samt Funk (Karte drahtlos und Switch, wie Java verbindet), Gateway und DNS an allen Schnittstellen wie Javas eigene Setter, Doku-Elemente; X2 Systemsoftware — SSIDs, Lernzeit, Routen, RIP, DHCP-Client und -Server, Portweiterleitung, Firewall (Namen des Kerns als Javas Zahlen), Modems aus den Paaren des Modells (Port aus dem Paarnamen, der erste eines Paars dient, Ziel `localhost`) | +| `test/exportProject.test.ts`, `test/exported.java.json` | — | neu: alle 23 Korpus-Dateien importiert, exportiert, geschrieben und von Java geladen — Topologie wie beim Original bis auf benannte Abweichungen (abgeleiteter MAC und abgeleitete Switch-SSID statt gewürfelter, Modem-Rollen nach Reihenfolge im Paar, Doku in Zeichenreihenfolge mit Text, Schrift und Mindestgröße des Modells); dazu ein künstliches Modell, das Java ebenfalls lädt | | `src/importEmail.ts` | `Persistence/TopologyProjectStore.swift` (`registerJavaEmailConfigurations`, `assignedJavaEmailMessages`) | übertragen, Eingabe ist Javas Sicht: Server-Konten aus `/mailserver/konten.txt`, ohne Datei aus der Bean-Liste (Java verlöre sie); Client-Konto aus `/konten.txt`, ohne Datei aus der älteren `kontoListe` (Filius 2.14 liest sie nicht mehr); Konten und Nachrichten bleiben, wo Swift verwirft, was seine Prüfung nicht besteht; Vor- und Nachname getrennt; Empfangszeit nur aus der Datei (Swift nummeriert); gegen Swifts Modell geprüft | | `test/importEmail.test.ts`, `test/email-*.swift.json` | `State/TopologyEmail.swift` (`decodeJavaServer`, `decodeJavaClient`) als Vergleich | neu: dieselben 43 Kontodateien mit Swifts Leser; wie Swift bis auf benannte Fälle, in denen Swift prüft und die ganze Datei verwirft, wo Java liest | | `src/javaFileSystem.ts`, `src/javaString.ts` | Java `Dateisystem.holeDatei`, `String.trim`/`split`/`equalsIgnoreCase` | neu nach Java; die Groß-/Kleinschreibung gegenüber ASCII am JDK über die ganze BMP gemessen | diff --git a/packages/fls/src/exportProject.ts b/packages/fls/src/exportProject.ts index 32331b8..54dd4ef 100644 --- a/packages/fls/src/exportProject.ts +++ b/packages/fls/src/exportProject.ts @@ -7,7 +7,15 @@ // becomes a cable between those, drawn between its two nodes; each // documentation item a GUIDocuItem. A host whose wireless is enabled has a // wireless card, and its link to a switch is a wireless cable — the only -// wireless connection Java makes (JHostKonfiguration.updateWifiConnection). System software, files and programs +// wireless connection Java makes (JHostKonfiguration.updateWifiConnection). +// +// The system software: a switch's SSID and learning time, a host's SSID, +// manual routes, RIP, DHCP client and server, a home router's port +// forwarding, the firewall of a router or home router, and a modem. What the +// model has no setting for is what Java's constructors make. A remote link +// pair becomes modems on the port its identifier names (12345 when it names +// none): the first of a pair in node order serves, the others connect to +// localhost — the model's pairs live in one project. System software, files and programs // follow in later steps. // // What the model keeps is written as it keeps it, and so differs from the @@ -21,15 +29,28 @@ // Java reads them from the first interface only (getStandardGateway, // getDNSServer), and the model keeps no others; // - a documentation item always has a text and a font, bold or plain: where -// Java has none, the empty text and Dialog 12 the model gives it. +// Java has none, the empty text and Dialog 12 the model gives it; +// - a switch's SSID the file lacked (Java rolls one) is the one the model +// derives from the node's id. // // Checked by Java: every corpus file, imported, exported and written, loads in // Java FILIUS to the topology of the original up to those departures. import { + defaultSwitchConfiguration, + dhcpServerConfiguration, effectiveMacAddress, + firewallConfiguration, + FIREWALL_PROTOCOL, interfaceKey, type DeviceConfiguration, + type DhcpClientConfiguration, + type DhcpServerConfiguration, + type FirewallConfiguration, + type GatewayPortForwardingRow, + type ManualRoute, + type RemoteLinkConfiguration, + type SwitchConfiguration, type DocumentationItem, type HostLabelPolicy, type HostWirelessConfiguration, @@ -40,8 +61,9 @@ import { type TopologyGraph, type TopologyNode, } from '@mdg-filius/core'; +import type { FlsDhcpServer, FlsFirewall } from './systemSoftware.js'; import type { FlsDocumentationItem, FlsInterface, FlsLink, FlsNodeClass } from './topology.js'; -import type { NodeToWrite, TopologyToWrite } from './topologyWriter.js'; +import type { NodeToWrite, SystemToWrite, TopologyToWrite } from './topologyWriter.js'; /** The parts of the editor model the topology is made of. */ export interface ProjectToExport { @@ -49,6 +71,14 @@ export interface ProjectToExport { readonly deviceConfigurations: ReadonlyMap; readonly interfaceConfigurations: ReadonlyMap; readonly hostWirelessConfigurations: ReadonlyMap; + readonly switchConfigurations: ReadonlyMap; + readonly manualRoutesByNodeId: ReadonlyMap; + readonly ripEnabledByNodeId: ReadonlyMap; + readonly firewallConfigurationsByNodeId: ReadonlyMap; + readonly dhcpClientConfigurations: ReadonlyMap; + readonly dhcpServerConfigurations: ReadonlyMap; + readonly portForwardingRowsByNodeId: ReadonlyMap; + readonly remoteLinkConfigurations: ReadonlyMap; readonly documentationItems: readonly DocumentationItem[]; } @@ -74,7 +104,8 @@ export function exportProject(project: ProjectToExport): ExportedTopology { return false; }); const indexOfNode = new Map(exported.map((node, index) => [node.id, index])); - const nodes = exported.map((node) => exportNode(node, project)); + const servingModems = firstOfEachPair(exported, project); + const nodes = exported.map((node) => exportNode(node, project, servingModems)); const links: FlsLink[] = []; project.graph.links.forEach((link, index) => { @@ -102,7 +133,7 @@ export function exportProject(project: ProjectToExport): ExportedTopology { }; } -function exportNode(node: TopologyNode, project: ProjectToExport): NodeToWrite { +function exportNode(node: TopologyNode, project: ProjectToExport, servingModems: ReadonlySet): NodeToWrite { const javaClass = CLASS_OF_KIND[node.kind as Exclude]; const interfaces = exportInterfaces(node, project); return { @@ -114,7 +145,119 @@ function exportNode(node: TopologyNode, project: ProjectToExport): NodeToWrite { useMacAsName: showsMac(node.hostLabelPolicy), interfaces, portCount: javaClass === 'Switch' || javaClass === 'Modem' ? node.ports.length : interfaces.length, - system: {}, + system: exportSystem(node, project, servingModems), + }; +} + +/** The first node of each remote link pair: its modem serves. */ +function firstOfEachPair(nodes: readonly TopologyNode[], project: ProjectToExport): Set { + const seen = new Set(); + const serving = new Set(); + for (const node of nodes) { + if (node.kind !== 'remoteLink') continue; + const pair = project.remoteLinkConfigurations.get(node.id)?.pairIdentifier ?? ''; + if (seen.has(pair)) continue; + seen.add(pair); + serving.add(node.id); + } + return serving; +} + +const JAVA_MODEM_PAIR = /^java-modem-port-([0-9]{1,5})$/; +const DEFAULT_MODEM_PORT = 12_345; + +function modemPort(pairIdentifier: string | undefined): number { + const match = JAVA_MODEM_PAIR.exec(pairIdentifier ?? ''); + const port = match === null ? DEFAULT_MODEM_PORT : Number(match[1]); + return port >= 1 && port <= 65_535 ? port : DEFAULT_MODEM_PORT; +} + +function exportSystem(node: TopologyNode, project: ProjectToExport, servingModems: ReadonlySet): SystemToWrite { + const id = node.id; + switch (node.kind) { + case 'networkSwitch': { + const configuration = project.switchConfigurations.get(id) ?? defaultSwitchConfiguration(id); + return { ssid: configuration.ssid, retentionTime: configuration.retentionTimeMilliseconds }; + } + case 'remoteLink': + return { + modem: { + mode: servingModems.has(id) ? 1 : 2, + port: modemPort(project.remoteLinkConfigurations.get(id)?.pairIdentifier), + ipAddress: 'localhost', + }, + }; + case 'unsupported': + return {}; + default: + break; + } + const system: SystemToWrite = { + manualRoutes: (project.manualRoutesByNodeId.get(id) ?? []).map((route) => [ + route.destinationNetwork, + route.subnetMask, + route.gateway, + route.interfaceIPAddress, + ]), + dhcpClient: project.dhcpClientConfigurations.get(id)?.isEnabled === true, + dhcpServer: exportDhcpServer(project.dhcpServerConfigurations.get(id) ?? dhcpServerConfiguration()), + }; + switch (node.kind) { + case 'pc': + case 'notebook': { + const ssid = project.hostWirelessConfigurations.get(id)?.ssid ?? ''; + return { ...system, ssid: ssid === '' ? null : ssid }; + } + case 'router': + return { + ...system, + ripEnabled: project.ripEnabledByNodeId.get(id) === true, + firewall: exportFirewall(project.firewallConfigurationsByNodeId.get(id) ?? firewallConfiguration()), + }; + case 'gateway': + return { + ...system, + staticNAT: (project.portForwardingRowsByNodeId.get(id) ?? []).map((row) => [ + row.protocolValue, + row.publicPortValue, + row.lanIPAddress, + row.lanPortValue, + ]), + firewall: exportFirewall(project.firewallConfigurationsByNodeId.get(id) ?? firewallConfiguration()), + }; + } +} + +function exportDhcpServer(server: DhcpServerConfiguration): FlsDhcpServer { + return { + isActive: server.isActive, + lowerBound: server.lowerBoundIPAddress, + upperBound: server.upperBoundIPAddress, + gateway: server.gatewayIPAddress, + dnsServer: server.dnsServerIPAddress, + useOwnSettings: server.useOwnSettings, + staticAssignedAddresses: server.staticAssignments.map((entry) => ({ mac: entry.macAddress, ip: entry.ipAddress })), + }; +} + +/** The core's names as Java's numbers: FirewallRule.DROP = 0, ACCEPT = 1. */ +function exportFirewall(firewall: FirewallConfiguration): FlsFirewall { + const action = (value: 'drop' | 'accept') => (value === 'accept' ? 1 : 0); + return { + activated: firewall.isActive, + defaultPolicy: action(firewall.defaultPolicy), + dropICMP: firewall.dropIcmp, + filterSYNSegmentsOnly: firewall.filterSynSegmentsOnly, + filterUdp: firewall.filterUdp, + rules: firewall.rules.map((rule) => ({ + srcIP: rule.sourceIPAddress, + srcMask: rule.sourceSubnetMask, + destIP: rule.destinationIPAddress, + destMask: rule.destinationSubnetMask, + port: rule.port, + protocol: FIREWALL_PROTOCOL[rule.protocol], + action: action(rule.action), + })), }; } diff --git a/packages/fls/test/exportProject.test.ts b/packages/fls/test/exportProject.test.ts index 83c3142..50da906 100644 --- a/packages/fls/test/exportProject.test.ts +++ b/packages/fls/test/exportProject.test.ts @@ -11,7 +11,16 @@ import { createHash } from 'node:crypto'; import { mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'; import { dirname, join, relative } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { DOCUMENTATION_MINIMUM_SIZE, stableGeneratedMacAddress, type Id, type TopologyNode } from '@mdg-filius/core'; +import { + defaultSwitchConfiguration, + dhcpServerConfiguration, + DOCUMENTATION_MINIMUM_SIZE, + firewallConfiguration, + firewallRule, + stableGeneratedMacAddress, + type Id, + type TopologyNode, +} from '@mdg-filius/core'; import { describe, expect, it } from 'vitest'; import { decodeJavaBeans, @@ -42,13 +51,27 @@ function counter(): () => Id { return () => `00000000-0000-0000-0000-${String(++next).padStart(12, '0')}`; } -type JavaNode = { class: string; name: string | null; bounds: number[]; useIpAsName?: boolean; useMacAsName?: boolean; ports: unknown }; +type JavaNode = { + class: string; + name: string | null; + bounds: number[]; + useIpAsName?: boolean; + useMacAsName?: boolean; + ports: unknown; + system: Record; +}; type JavaFile = { success: boolean; nodes: JavaNode[]; cables: unknown[]; documentation: unknown[]; sha256?: string }; const original = JSON.parse(readFileSync(join(corpusRoot, 'corpus.java.json'), 'utf8')) as Record; const exportedPath = join(here, 'exported.java.json'); const exported = JSON.parse(readFileSync(exportedPath, 'utf8')) as Record; +/** The system software without its files and applications, later steps. */ +function systemOf(system: Record) { + const { fileSystem: _files, applications: _applications, ...settings } = system; + return settings; +} + /** The topology of Java's view: the label's position, not its size. */ function topologyOf(view: JavaFile) { return { @@ -60,6 +83,7 @@ function topologyOf(view: JavaFile) { useIpAsName: node.useIpAsName, useMacAsName: node.useMacAsName, ports: node.ports, + system: systemOf(node.system), })), cables: view.cables, documentation: view.documentation, @@ -73,7 +97,12 @@ function topologyOf(view: JavaFile) { * each load) has the one the simulation uses, derived from its port id; * - documentation: the items in the model's render order (rectangles below * text), a missing text empty, a missing font Dialog 12, and at least the - * editor's smallest size (DOCUMENTATION_MINIMUM_SIZE). + * editor's smallest size (DOCUMENTATION_MINIMUM_SIZE); + * - switchSsid: a switch's SSID the file lacked (Java rolls one) is the one + * the model derives from the node's id; + * - modemRoles: the model keeps a pair of modems, not which one serves: the + * first of a pair in node order serves, the others connect. Both ways + * work within one project, where the client connects to localhost. */ const DEPARTURES = { generatedMac(view: JavaFile, macs: (string | undefined)[][]): JavaFile { @@ -87,6 +116,20 @@ const DEPARTURES = { })), }; }, + switchSsid(view: JavaFile, nodeIds: Id[]): JavaFile { + return mapSystems(view, (node, index) => + node.class === 'Switch' && node.system.ssid === null ? { ...node.system, ssid: defaultSwitchConfiguration(nodeIds[index]!).ssid } : node.system, + ); + }, + modemRoles(view: JavaFile, pairs: (string | undefined)[]): JavaFile { + const seen = new Set(); + return mapSystems(view, (node, index) => { + if (node.class !== 'Modem') return node.system; + const serves = !seen.has(pairs[index]); + seen.add(pairs[index]); + return { ...node.system, modem: { ...(node.system.modem as object), mode: serves ? 1 : 2 } }; + }); + }, documentation(view: JavaFile): JavaFile { const items = (view.documentation as Record[]).map((item) => { const [x, y, width, height] = item.bounds as number[]; @@ -101,6 +144,10 @@ const DEPARTURES = { }, }; +function mapSystems(view: JavaFile, system: (node: JavaNode, index: number) => Record): JavaFile { + return { ...view, nodes: view.nodes.map((node, index) => ({ ...node, system: system(node, index) })) }; +} + /** Documentation items in an order that does not depend on the list's. */ function sortedDocumentation(items: unknown[]): unknown[] { return items.map((item) => JSON.stringify(item)).sort().map((text) => JSON.parse(text) as unknown); @@ -111,7 +158,12 @@ function portIds(project: ReturnType): Id[][] { return project.graph.nodes.map((node) => node.ports.map((port) => port.id)); } -const departed = { generatedMac: new Set(), documentation: new Set() }; +const departed = { + generatedMac: new Set(), + documentation: new Set(), + switchSsid: new Set(), + modemRoles: new Set(), +}; describe('the editor model exported, as Java loads it', () => { for (const file of flsFiles(corpusRoot)) { @@ -138,22 +190,54 @@ describe('the editor model exported, as Java loads it', () => { }), ); const source = original[name]!; - const withMacs = DEPARTURES.generatedMac(source, macs); - const expected = DEPARTURES.documentation(withMacs); - if (JSON.stringify(withMacs) !== JSON.stringify(source)) departed.generatedMac.add(name); - if (JSON.stringify(expected.documentation) !== JSON.stringify(source.documentation)) departed.documentation.add(name); + const nodeIds = project.graph.nodes.map((node) => node.id); + const pairs = nodeIds.map((id) => project.remoteLinkConfigurations.get(id)?.pairIdentifier); + const steps: [keyof typeof departed, (view: JavaFile) => JavaFile][] = [ + ['generatedMac', (view) => DEPARTURES.generatedMac(view, macs)], + ['switchSsid', (view) => DEPARTURES.switchSsid(view, nodeIds)], + ['modemRoles', (view) => DEPARTURES.modemRoles(view, pairs)], + ['documentation', (view) => DEPARTURES.documentation(view)], + ]; + let expected = source; + for (const [departure, apply] of steps) { + const next = apply(expected); + if (departure === 'documentation') { + if (JSON.stringify(next.documentation) !== JSON.stringify(expected.documentation)) departed[departure].add(name); + } else if (JSON.stringify(next) !== JSON.stringify(expected)) { + departed[departure].add(name); + } + expected = next; + } expect(topologyOf({ ...java!, documentation: sortedDocumentation(java!.documentation) })).toEqual(topologyOf(expected)); }); } it('departs from Java where the model decides differently', () => { - expect(departed.generatedMac.size).toBeGreaterThan(0); - expect(departed.documentation.size).toBeGreaterThan(0); + for (const [departure, files] of Object.entries(departed)) expect(files.size, departure).toBeGreaterThan(0); }); }); // ── A model beyond the corpus, loaded by Java ────────────────────────────── +/** A model without nodes, settings or documentation. */ +function emptyProject(): ProjectToExport { + return { + graph: { nodes: [], links: [] }, + deviceConfigurations: new Map(), + interfaceConfigurations: new Map(), + hostWirelessConfigurations: new Map(), + switchConfigurations: new Map(), + manualRoutesByNodeId: new Map(), + ripEnabledByNodeId: new Map(), + firewallConfigurationsByNodeId: new Map(), + dhcpClientConfigurations: new Map(), + dhcpServerConfigurations: new Map(), + portForwardingRowsByNodeId: new Map(), + remoteLinkConfigurations: new Map(), + documentationItems: [], + }; +} + const port = (id: string) => ({ id, label: id, isOccupied: false }); /** @@ -162,12 +246,17 @@ const port = (id: string) => ({ id, label: id, isOccupied: false }); * interfaces and a gateway, a half-transparent bold text and a rectangle. */ const SYNTHETIC: ProjectToExport = { + ...emptyProject(), graph: { nodes: [ { id: 'pc', kind: 'pc', displayName: 'PC', hostLabelPolicy: 'ipAndMAC', position: { x: 10.6, y: 20.2 }, ports: [port('p0')] }, { id: 'sw', kind: 'networkSwitch', displayName: 'SW', hostLabelPolicy: 'manual', position: { x: 100, y: 20 }, ports: ['s0', 's1', 's2', 's3', 's4'].map(port) }, { id: 'nb', kind: 'notebook', displayName: 'NB', hostLabelPolicy: 'macAddress', position: { x: 100, y: 120 }, ports: [port('n0')] }, { id: 'rt', kind: 'router', displayName: 'RT', hostLabelPolicy: 'manual', position: { x: 200, y: 20 }, ports: ['r0', 'r1', 'r2'].map(port) }, + { id: 'gw', kind: 'gateway', displayName: 'GW', hostLabelPolicy: 'manual', position: { x: 300, y: 20 }, ports: ['g0', 'g1'].map(port) }, + { id: 'm1', kind: 'remoteLink', displayName: 'M1', hostLabelPolicy: 'manual', position: { x: 400, y: 20 }, ports: [port('m1p')] }, + { id: 'm2', kind: 'remoteLink', displayName: 'M2', hostLabelPolicy: 'manual', position: { x: 500, y: 20 }, ports: [port('m2p')] }, + { id: 'm3', kind: 'remoteLink', displayName: 'M3', hostLabelPolicy: 'manual', position: { x: 600, y: 20 }, ports: [port('m3p')] }, ], links: [ { id: 'l1', sourceNodeId: 'pc', sourcePortId: 'p0', targetNodeId: 'sw', targetPortId: 's4' }, @@ -184,6 +273,56 @@ const SYNTHETIC: ProjectToExport = { ['rt/r0', { ipAddress: '10.1.0.1', subnetMask: '255.255.0.0' }], ['rt/r1', { ipAddress: '10.0.0.254', subnetMask: '255.255.255.0' }], ['rt/r2', { ipAddress: '10.2.0.1', subnetMask: '255.255.0.0' }], + ['gw/g0', { ipAddress: '42.0.0.7', subnetMask: '255.0.0.0' }], + ['gw/g1', { ipAddress: '192.168.1.1', subnetMask: '255.255.255.0' }], + ]), + switchConfigurations: new Map([['sw', { ssid: 'S-net', retentionTimeMilliseconds: 1234 }]]), + manualRoutesByNodeId: new Map([ + ['pc', [{ destinationNetwork: '10.5.0.0', subnetMask: '255.255.0.0', gateway: '10.0.0.254', interfaceIPAddress: '10.0.0.1' }]], + ['rt', [{ destinationNetwork: '10.6.0.0', subnetMask: '255.255.0.0', gateway: '10.1.0.2', interfaceIPAddress: '10.1.0.1' }]], + ]), + ripEnabledByNodeId: new Map([['rt', true]]), + firewallConfigurationsByNodeId: new Map([ + [ + 'rt', + firewallConfiguration({ + isActive: true, + defaultPolicy: 'accept', + dropIcmp: true, + filterSynSegmentsOnly: false, + filterUdp: false, + rules: [ + firewallRule({ sourceIPAddress: '10.0.0.0', sourceSubnetMask: '255.0.0.0', protocol: 'all', action: 'accept' }), + firewallRule({ destinationIPAddress: '10.2.0.5', destinationSubnetMask: '255.255.255.255', port: 80, protocol: 'tcp' }), + firewallRule({ port: 53, protocol: 'udp', action: 'accept' }), + firewallRule({ protocol: 'icmp' }), + ], + }), + ], + ]), + dhcpClientConfigurations: new Map([ + ['pc', { isEnabled: true }], + ['gw', { isEnabled: true }], + ]), + dhcpServerConfigurations: new Map([ + [ + 'gw', + dhcpServerConfiguration({ + isActive: true, + lowerBoundIPAddress: '192.168.1.100', + upperBoundIPAddress: '192.168.1.199', + gatewayIPAddress: '192.168.1.1', + dnsServerIPAddress: '8.8.8.8', + useOwnSettings: true, + staticAssignments: [{ id: 'a1', macAddress: 'AA:BB:CC:DD:EE:77', ipAddress: '192.168.1.77' }], + }), + ], + ]), + portForwardingRowsByNodeId: new Map([['gw', [{ protocolValue: 'TCP', publicPortValue: '8080', lanIPAddress: '192.168.1.10', lanPortValue: '80' }]]]), + remoteLinkConfigurations: new Map([ + ['m1', { pairIdentifier: 'java-modem-port-4242', latencyMilliseconds: 20, isEnabled: true }], + ['m2', { pairIdentifier: 'java-modem-port-4242', latencyMilliseconds: 20, isEnabled: true }], + ['m3', { pairIdentifier: 'our own pair', latencyMilliseconds: 20, isEnabled: true }], ]), hostWirelessConfigurations: new Map([['nb', { isEnabled: true, ssid: 'net' }]]), documentationItems: [ @@ -227,6 +366,15 @@ describe('a model beyond the corpus, as Java loads it', () => { ); expect(warnings).toEqual([]); const card = (ip: string, mask: string, mac: string, gateway: string, dns: string, wireless = false) => ({ ip, mask, mac, gateway, dns, wireless }); + const modem = (name: string, x: number, mode: number, port: number) => ({ + class: 'Modem', + name, + position: [x, 20], + useIpAsName: undefined, + useMacAsName: undefined, + ports: [{}], + system: { modem: { mode, port, ipAdresse: 'localhost' } }, + }); expect(topologyOf(java!)).toEqual({ success: true, nodes: [ @@ -237,8 +385,22 @@ describe('a model beyond the corpus, as Java loads it', () => { useIpAsName: true, useMacAsName: true, ports: [card('10.0.0.1', '255.255.255.0', stableGeneratedMacAddress('p0'), '10.0.0.254', '10.0.0.53')], + system: { + ssid: null, + manualRoutes: [['10.5.0.0', '255.255.0.0', '10.0.0.254', '10.0.0.1']], + dhcpClient: true, + dhcpServer: JAVA_DHCP_DEFAULTS, + }, + }, + { + class: 'Switch', + name: 'SW', + position: [100, 20], + useIpAsName: undefined, + useMacAsName: undefined, + ports: [{}, {}, {}, {}, {}], + system: { ssid: 'S-net', retentionTime: 1234 }, }, - { class: 'Switch', name: 'SW', position: [100, 20], useIpAsName: undefined, useMacAsName: undefined, ports: [{}, {}, {}, {}, {}] }, { class: 'Notebook', name: 'NB', @@ -246,6 +408,7 @@ describe('a model beyond the corpus, as Java loads it', () => { useIpAsName: false, useMacAsName: true, ports: [card('10.0.0.2', '255.255.255.0', stableGeneratedMacAddress('n0'), '', '', true)], + system: { ssid: 'net', manualRoutes: [], dhcpClient: false, dhcpServer: JAVA_DHCP_DEFAULTS }, }, { class: 'Vermittlungsrechner', @@ -258,7 +421,56 @@ describe('a model beyond the corpus, as Java loads it', () => { card('10.0.0.254', '255.255.255.0', stableGeneratedMacAddress('r1'), '10.9.9.9', '10.0.0.53'), card('10.2.0.1', '255.255.0.0', stableGeneratedMacAddress('r2'), '10.9.9.9', '10.0.0.53'), ], + system: { + ripEnabled: true, + manualRoutes: [['10.6.0.0', '255.255.0.0', '10.1.0.2', '10.1.0.1']], + dhcpClient: false, + dhcpServer: JAVA_DHCP_DEFAULTS, + firewall: { + activated: true, + defaultPolicy: 1, + dropICMP: true, + filterSYNSegmentsOnly: false, + filterUdp: false, + rules: [ + ['10.0.0.0', '255.0.0.0', '', '', -1, -1, 1], + ['', '', '10.2.0.5', '255.255.255.255', 80, 6, 0], + ['', '', '', '', 53, 17, 1], + ['', '', '', '', -1, 1, 0], + ], + }, + }, }, + { + class: 'Gateway', + name: 'GW', + position: [300, 20], + useIpAsName: undefined, + useMacAsName: undefined, + ports: [ + card('42.0.0.7', '255.0.0.0', stableGeneratedMacAddress('g0'), '', ''), + card('192.168.1.1', '255.255.255.0', stableGeneratedMacAddress('g1'), '', ''), + ], + system: { + manualRoutes: [], + dhcpClient: true, + dhcpServer: { + aktiv: true, + untergrenze: '192.168.1.100', + obergrenze: '192.168.1.199', + gatewayip: '192.168.1.1', + dnsserverip: '8.8.8.8', + ownSettings: true, + staticAssignedAddresses: ['AA:BB:CC:DD:EE:77 192.168.1.77'], + }, + staticNAT: [['TCP', '8080', '192.168.1.10', '80']], + firewall: { activated: false, defaultPolicy: 0, dropICMP: false, filterSYNSegmentsOnly: true, filterUdp: true, rules: [] }, + }, + }, + // A pair on Java's port: the first serves; a pair of our own: Java's default port. + modem('M1', 400, 1, 4242), + modem('M2', 500, 2, 4242), + modem('M3', 600, 1, 12345), ], cables: [ { ends: [[0, 0], [1, 4]], wireless: false, panel: [0, 1] }, @@ -273,6 +485,17 @@ describe('a model beyond the corpus, as Java loads it', () => { }); }); +/** The DHCP server as every IP stack's constructor leaves it. */ +const JAVA_DHCP_DEFAULTS = { + aktiv: false, + untergrenze: '0.0.0.0', + obergrenze: '0.0.0.0', + gatewayip: '0.0.0.0', + dnsserverip: '0.0.0.0', + ownSettings: false, + staticAssignedAddresses: [], +}; + // ── Rules the corpus does not exercise ───────────────────────────────────── describe('exportProject rules', () => { @@ -293,11 +516,9 @@ describe('exportProject rules', () => { targetPortId: target[1], }); const project = (nodes: TopologyNode[], links: ReturnType[], wireless: [string, boolean][] = []): ProjectToExport => ({ + ...emptyProject(), graph: { nodes, links }, - deviceConfigurations: new Map(), - interfaceConfigurations: new Map(), hostWirelessConfigurations: new Map(wireless.map(([id, isEnabled]) => [id, { isEnabled, ssid: 'net' }])), - documentationItems: [], }); it('leaves out a node of a kind Java does not have, and the links to it', () => { diff --git a/packages/fls/test/exported.java.json b/packages/fls/test/exported.java.json index 9c5fadf..37ae5ee 100644 --- a/packages/fls/test/exported.java.json +++ b/packages/fls/test/exported.java.json @@ -25,14 +25,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFi", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -100,11 +100,11 @@ }, "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.11", + "obergrenze": "192.168.0.254", "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", + "dnsserverip": "8.8.8.8", "ownSettings": false, "staticAssignedAddresses": [] }, @@ -156,7 +156,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -309,14 +309,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFi", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -365,7 +365,7 @@ {} ], "system": { - "ssid": null, + "ssid": "MyWiFi", "retentionTime": 300000 } } @@ -728,7 +728,7 @@ ] } ], - "sha256": "3bd8096f5f31f38c092db2a6d65af1fd888bdd55ead8bca92bd0b37fc1c92a48" + "sha256": "f0defe45fbcc22b7a6ab73d3961907737ac5b528c362855bb236befa83e5507b" }, "ipad-fixtures/dns_server.fls": { "success": true, @@ -770,7 +770,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -979,7 +979,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -1190,7 +1190,7 @@ } ], "documentation": [], - "sha256": "6b410928faee1600aa36e5ba05b8818b6b7484974b9c7c74e2026f0eb9b2bf90" + "sha256": "6b40b826ebbd20964e1e4f4c19c3be105d5357704c6966aa875241cabaeec759" }, "ipad-fixtures/zwei_rechnernetze_komplett.fls": { "success": true, @@ -1232,7 +1232,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -1273,7 +1273,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -1567,7 +1567,7 @@ } ], "documentation": [], - "sha256": "fbbcf5fd996a17f9d443865f83232870de866ace6823aa1614ba6173bb5e39db" + "sha256": "2ed2c7a1240329c741000aa6eec7f8ed721e5448efc957cdc8ab04dd94898f69" }, "java-examples/Internet_Complete_with_e-Mail_Webserver_Intranet_Portforwarding_Firewall_DHCP_EN.fls": { "success": true, @@ -1602,7 +1602,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -1651,7 +1651,7 @@ {} ], "system": { - "ssid": null, + "ssid": "[ausgeschaltet]", "retentionTime": 300000 } }, @@ -1685,7 +1685,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -1734,7 +1734,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -1825,7 +1825,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -1908,7 +1908,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -2007,7 +2007,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -2090,7 +2090,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -2165,7 +2165,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -2411,13 +2411,16 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", - "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", - "ownSettings": false, - "staticAssignedAddresses": [] + "aktiv": true, + "untergrenze": "10.50.50.11", + "obergrenze": "10.50.50.254", + "gatewayip": "10.0.0.1", + "dnsserverip": "10.0.0.1", + "ownSettings": true, + "staticAssignedAddresses": [ + "A8:BD:04:A6:63:AD 10.10.20.11", + "3D:67:2A:01:2D:91 10.10.20.12" + ] } } }, @@ -2475,13 +2478,13 @@ } ] }, - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.1.11", + "obergrenze": "192.168.1.254", "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", + "dnsserverip": "8.8.8.8", "ownSettings": false, "staticAssignedAddresses": [] }, @@ -2526,7 +2529,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -2561,14 +2564,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -2603,14 +2606,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -2645,14 +2648,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -2687,14 +2690,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -2743,7 +2746,7 @@ {} ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "retentionTime": 300000 } }, @@ -2811,14 +2814,76 @@ "ownSettings": false, "staticAssignedAddresses": [] }, - "staticNAT": [], + "staticNAT": [ + [ + "TCP", + "80", + "10.0.0.1", + "80" + ] + ], "firewall": { - "activated": false, + "activated": true, "defaultPolicy": 0, "dropICMP": false, "filterSYNSegmentsOnly": true, "filterUdp": true, - "rules": [] + "rules": [ + [ + "10.10.20.0", + "255.255.255.0", + "", + "", + -1, + -1, + 1 + ], + [ + "10.50.50.0", + "255.255.255.0", + "", + "", + -1, + -1, + 0 + ], + [ + "10.0.0.1", + "255.255.255.255", + "", + "", + -1, + -1, + 1 + ], + [ + "", + "", + "10.0.0.1", + "255.255.255.255", + -1, + -1, + 1 + ], + [ + "8.8.8.8", + "255.255.255.255", + "", + "", + -1, + -1, + 1 + ], + [ + "", + "", + "42.0.0.10", + "255.255.255.255", + -1, + -1, + 1 + ] + ] } } }, @@ -2851,7 +2916,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -2929,9 +2994,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "43.0.0.11", + "obergrenze": "43.0.0.254", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -2976,7 +3041,7 @@ {} ], "system": { - "ssid": null, + "ssid": "[ausgeschaltet]", "retentionTime": 300000 } } @@ -3721,7 +3786,7 @@ ] } ], - "sha256": "ada9286af6c826f6f09cabc7126d2820a2912ae1cfe1b05864d448f0b36d4e61" + "sha256": "b6c00e3e81dc32d03c349622e8559993575a00bf5d699f39e19f955963edcbc6" }, "java-examples/Internet_Komplett_mit_eMail_Webserver_Intranet_Portforwarding_Firewall_DHCP_DE.fls": { "success": true, @@ -3756,7 +3821,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -3805,7 +3870,7 @@ {} ], "system": { - "ssid": null, + "ssid": "[ausgeschaltet]", "retentionTime": 300000 } }, @@ -3839,7 +3904,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -3888,7 +3953,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -3979,7 +4044,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -4062,7 +4127,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -4161,7 +4226,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -4244,7 +4309,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -4319,7 +4384,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -4565,13 +4630,16 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", - "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", - "ownSettings": false, - "staticAssignedAddresses": [] + "aktiv": true, + "untergrenze": "10.50.50.11", + "obergrenze": "10.50.50.254", + "gatewayip": "10.0.0.1", + "dnsserverip": "10.0.0.1", + "ownSettings": true, + "staticAssignedAddresses": [ + "A8:BD:04:A6:63:AD 10.10.20.11", + "3D:67:2A:01:2D:91 10.10.20.12" + ] } } }, @@ -4629,13 +4697,13 @@ } ] }, - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.1.11", + "obergrenze": "192.168.1.254", "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", + "dnsserverip": "8.8.8.8", "ownSettings": false, "staticAssignedAddresses": [] }, @@ -4680,7 +4748,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -4715,14 +4783,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -4757,14 +4825,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -4799,14 +4867,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -4841,14 +4909,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -4897,7 +4965,7 @@ {} ], "system": { - "ssid": null, + "ssid": "MyWiFiNetwork", "retentionTime": 300000 } }, @@ -4965,14 +5033,76 @@ "ownSettings": false, "staticAssignedAddresses": [] }, - "staticNAT": [], + "staticNAT": [ + [ + "TCP", + "80", + "10.0.0.1", + "80" + ] + ], "firewall": { - "activated": false, + "activated": true, "defaultPolicy": 0, "dropICMP": false, "filterSYNSegmentsOnly": true, "filterUdp": true, - "rules": [] + "rules": [ + [ + "10.10.20.0", + "255.255.255.0", + "", + "", + -1, + -1, + 1 + ], + [ + "10.50.50.0", + "255.255.255.0", + "", + "", + -1, + -1, + 0 + ], + [ + "10.0.0.1", + "255.255.255.255", + "", + "", + -1, + -1, + 1 + ], + [ + "", + "", + "10.0.0.1", + "255.255.255.255", + -1, + -1, + 1 + ], + [ + "8.8.8.8", + "255.255.255.255", + "", + "", + -1, + -1, + 1 + ], + [ + "", + "", + "42.0.0.10", + "255.255.255.255", + -1, + -1, + 1 + ] + ] } } }, @@ -5005,7 +5135,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -5083,9 +5213,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "43.0.0.11", + "obergrenze": "43.0.0.254", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -5130,7 +5260,7 @@ {} ], "system": { - "ssid": null, + "ssid": "[ausgeschaltet]", "retentionTime": 300000 } } @@ -5833,7 +5963,7 @@ ] } ], - "sha256": "9562b4ff917b39bb29ad00345e839a3e4776a0726bb72fd828071a21dc7d495e" + "sha256": "4aa181ace877932ab88fbd0a7715f59c21ac00a84aa12ec18d1556b6d91b0e27" }, "java-examples/Public_and_Private_Networks_2_EN.fls": { "success": true, @@ -5861,14 +5991,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFi", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -5936,11 +6066,11 @@ }, "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.11", + "obergrenze": "192.168.0.254", "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", + "dnsserverip": "8.8.8.8", "ownSettings": false, "staticAssignedAddresses": [] }, @@ -5992,7 +6122,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -6145,14 +6275,14 @@ } ], "system": { - "ssid": null, + "ssid": "MyWiFi", "manualRoutes": [], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -6201,7 +6331,7 @@ {} ], "system": { - "ssid": null, + "ssid": "MyWiFi", "retentionTime": 300000 } } @@ -6564,7 +6694,7 @@ ] } ], - "sha256": "3bd8096f5f31f38c092db2a6d65af1fd888bdd55ead8bca92bd0b37fc1c92a48" + "sha256": "f0defe45fbcc22b7a6ab73d3961907737ac5b528c362855bb236befa83e5507b" }, "java-examples/anwendung_komplett.fls": { "success": true, @@ -6690,7 +6820,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -6791,7 +6921,7 @@ } ], "documentation": [], - "sha256": "6ddd17df1bb154d87d63d247b490d17015bea82ab16ff8f334df97d5702c276c" + "sha256": "c4d7f545e981678988135cf988f87863d385ecc281a607cf5aab97b62f0f6b08" }, "java-examples/dhcp_test_scenario.fls": { "success": true, @@ -6828,9 +6958,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.100", + "obergrenze": "192.168.0.150", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -6868,7 +6998,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -6959,7 +7089,7 @@ {} ], "system": { - "ssid": null, + "ssid": "71253f", "retentionTime": 300000 } }, @@ -6993,7 +7123,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -7061,9 +7191,9 @@ }, "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.100", + "obergrenze": "192.168.0.200", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -7110,7 +7240,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -7211,7 +7341,7 @@ } ], "documentation": [], - "sha256": "2dcf79c82767ed9dfba3d4be054d7c604247a02757941fbd053fb725d01f0c3b" + "sha256": "863f5d67e356ba363db33d31ec818fa3de17a022812644551bf0c9838d90247d" }, "java-examples/dns_server.fls": { "success": true, @@ -7253,7 +7383,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -7462,7 +7592,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -7673,7 +7803,7 @@ } ], "documentation": [], - "sha256": "6b410928faee1600aa36e5ba05b8818b6b7484974b9c7c74e2026f0eb9b2bf90" + "sha256": "6b40b826ebbd20964e1e4f4c19c3be105d5357704c6966aa875241cabaeec759" }, "java-examples/einfaches_rechnernetz_komplett.fls": { "success": true, @@ -7878,9 +8008,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.21", + "obergrenze": "192.168.0.29", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -7925,7 +8055,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -7959,7 +8089,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -8001,7 +8131,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -8043,7 +8173,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -8085,7 +8215,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -8134,7 +8264,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -8175,7 +8305,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } } @@ -8370,7 +8500,7 @@ } ], "documentation": [], - "sha256": "0d3b055bbc8091a569fc0cfc5d97bde286a361af60eda2c0539e9fca1d7d9c72" + "sha256": "b6c7806c4394e91a338416bb8d9547d9f7f5cba0d77edbcf99d0963b00a9cabe" }, "java-examples/email_komplett.fls": { "success": true, @@ -8622,7 +8752,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -8892,7 +9022,7 @@ } ], "documentation": [], - "sha256": "db96655e9ce9a17bdae05f1a2c7fef4001a70a096f6c70ced46eaed34dbe65e8" + "sha256": "cb3e3989a69306a93a28f1fcae310fe3717c59103695a91a76bd5175d05c5461" }, "java-examples/internetwork_komplett.fls": { "success": true, @@ -8934,7 +9064,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -8975,7 +9105,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -9092,7 +9222,20 @@ ], "system": { "ripEnabled": false, - "manualRoutes": [], + "manualRoutes": [ + [ + "141.99.1.0", + "255.255.255.0", + "141.99.2.1", + "141.99.2.2" + ], + [ + "141.99.5.0", + "255.255.255.0", + "141.99.4.2", + "141.99.4.1" + ] + ], "fileSystem": { "directory": "root", "children": [ @@ -9249,7 +9392,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -9542,7 +9685,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -9813,7 +9956,7 @@ } ], "documentation": [], - "sha256": "1925c7dbe9f9e399fe94d8ae234e870e219a42d861c431aca9559a6f12dba06e" + "sha256": "4fad67697c52751855d232ce12ac5b7d33f3b36a300a9563d66d0deb1499a66e" }, "java-examples/man-in-the-middle.fls": { "success": true, @@ -9981,7 +10124,7 @@ {} ], "system": { - "ssid": null, + "ssid": "6e23d8", "retentionTime": 300000 } }, @@ -10281,7 +10424,7 @@ ] } ], - "sha256": "678ca49cf7b1f8abf24f87a89065f4a203077caf41cc0ba2f38bf76502e975d0" + "sha256": "d56bb01b5b7d7125e3c5897b11aede16497e1401e780c4952a8f74f1e2aaae4e" }, "java-examples/modem_beispiel.fls": { "success": true, @@ -10385,7 +10528,7 @@ ], "system": { "modem": { - "mode": 2, + "mode": 1, "port": 12345, "ipAdresse": "localhost" } @@ -10450,7 +10593,7 @@ } ], "documentation": [], - "sha256": "f5e95b5c6dc7387925e61e6cf3076f189cf652df3f660484fb3600282c58b29d" + "sha256": "eae83c9db80a8289f425c2026bfab2dd3e417fb571a56bdf144a6a1c61c32f4f" }, "java-examples/multicast_server.fls": { "success": true, @@ -10520,7 +10663,7 @@ } ], "system": { - "ssid": null, + "ssid": "Filius Wi Fi", "manualRoutes": [], "fileSystem": { "directory": "root", @@ -10562,7 +10705,7 @@ } ], "system": { - "ssid": null, + "ssid": "Filius Wi Fi", "manualRoutes": [], "fileSystem": { "directory": "root", @@ -10618,8 +10761,8 @@ {} ], "system": { - "ssid": null, - "retentionTime": 300000 + "ssid": "Filius Wi Fi", + "retentionTime": 2000 } } ], @@ -10677,7 +10820,7 @@ } ], "documentation": [], - "sha256": "15598c16f471740a28d78497670e22098874dc6a68e585a7369c021263a908c0" + "sha256": "2eee88e78a1a50308a6f1a63485e6927c7bd81bf0d96c481fddb1e91ac1c67d3" }, "java-examples/nat.fls": { "success": true, @@ -10878,7 +11021,7 @@ {} ], "system": { - "ssid": null, + "ssid": "082368", "retentionTime": 300000 } } @@ -10937,7 +11080,7 @@ } ], "documentation": [], - "sha256": "0b1cac470c2d99365f4971c5e4016e360a091f1fbaea30efefbe49e4f9331230" + "sha256": "4ead19012d1bb245f5649fca807561ba8974544e720e6cb486c4b1fd9c6c82ea" }, "java-examples/nat_with_mapped_port.fls": { "success": true, @@ -10979,7 +11122,7 @@ {} ], "system": { - "ssid": null, + "ssid": "9b063a", "retentionTime": 300000 } }, @@ -11020,7 +11163,7 @@ {} ], "system": { - "ssid": null, + "ssid": "a4e955", "retentionTime": 300000 } }, @@ -11137,7 +11280,20 @@ ], "system": { "ripEnabled": false, - "manualRoutes": [], + "manualRoutes": [ + [ + "141.99.1.0", + "255.255.255.0", + "141.99.2.1", + "141.99.2.2" + ], + [ + "141.99.5.0", + "255.255.255.0", + "141.99.4.2", + "141.99.4.1" + ] + ], "fileSystem": { "directory": "root", "children": [ @@ -11504,7 +11660,7 @@ {} ], "system": { - "ssid": null, + "ssid": "8b0798", "retentionTime": 300000 } }, @@ -11614,7 +11770,14 @@ "ownSettings": false, "staticAssignedAddresses": [] }, - "staticNAT": [], + "staticNAT": [ + [ + "TCP", + "80", + "192.168.0.10", + "80" + ] + ], "firewall": { "activated": false, "defaultPolicy": 0, @@ -11737,7 +11900,7 @@ {} ], "system": { - "ssid": null, + "ssid": "f1dc45", "retentionTime": 300000 } } @@ -12173,7 +12336,7 @@ ] } ], - "sha256": "c05a40b1d13ba800f044dfbe85fe281d81aef2afee0ec0bc2dd078fd232aff55" + "sha256": "4d36314f4f69837268d5b0efc27f0730345fbbffc85bb977721583992c3991ba" }, "java-examples/private_and_public_network.fls": { "success": true, @@ -12215,7 +12378,7 @@ {} ], "system": { - "ssid": null, + "ssid": "52fd3f", "retentionTime": 300000 } }, @@ -12249,7 +12412,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -12291,7 +12454,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -12357,13 +12520,13 @@ } ] }, - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.10", + "obergrenze": "192.168.0.100", "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", + "dnsserverip": "141.99.2.10", "ownSettings": false, "staticAssignedAddresses": [] }, @@ -12415,7 +12578,7 @@ {} ], "system": { - "ssid": null, + "ssid": "5e7d40", "retentionTime": 300000 } }, @@ -12451,9 +12614,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "141.99.2.100", + "obergrenze": "141.99.2.250", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -12698,7 +12861,7 @@ ] } ], - "sha256": "38cced73016a0739cf12b9736af729fd4c93981c67f0019ab55974d6beb58d6a" + "sha256": "bd7f5a5f96982f8db3d7730f459407b0638ab9d148803e46b10a3fee706e30d7" }, "java-examples/private_und_public_networks_mit_provider_DE.fls": { "success": true, @@ -12740,7 +12903,7 @@ {} ], "system": { - "ssid": null, + "ssid": "bfc600", "retentionTime": 300000 } }, @@ -12774,7 +12937,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -12816,7 +12979,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -12882,13 +13045,13 @@ } ] }, - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.11", + "obergrenze": "192.168.0.100", "gatewayip": "0.0.0.0", - "dnsserverip": "0.0.0.0", + "dnsserverip": "42.0.0.2", "ownSettings": false, "staticAssignedAddresses": [] }, @@ -12940,7 +13103,7 @@ {} ], "system": { - "ssid": null, + "ssid": "[ausgeschaltet]", "retentionTime": 300000 } }, @@ -12976,9 +13139,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "42.0.0.11", + "obergrenze": "42.0.0.254", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -13023,7 +13186,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -13190,7 +13353,7 @@ } ], "system": { - "ripEnabled": false, + "ripEnabled": true, "manualRoutes": [], "fileSystem": { "directory": "root", @@ -13604,7 +13767,7 @@ ] } ], - "sha256": "2975118117d5c8add8acb57674437ea7caf219cd90afd1c9b0737e91057e3e51" + "sha256": "bdb684d8f4653604e6a40d7783b7235743a340605c55ef0a886967e40fc52cde" }, "java-examples/webserver.fls": { "success": true, @@ -13730,7 +13893,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } } @@ -13772,7 +13935,7 @@ } ], "documentation": [], - "sha256": "2c569a153ec78eef67a8d2f1ed5998c1ed55fb058daae10713a7b8349fd04943" + "sha256": "ba5908aa925435ca6c7bb68939a33c4a0ce702ace4a96a11adb579406f1ae4b7" }, "java-examples/zwei_rechnernetze_komplett.fls": { "success": true, @@ -13814,7 +13977,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -13855,7 +14018,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -14149,7 +14312,7 @@ } ], "documentation": [], - "sha256": "fbbcf5fd996a17f9d443865f83232870de866ace6823aa1614ba6173bb5e39db" + "sha256": "2ed2c7a1240329c741000aa6eec7f8ed721e5448efc957cdc8ab04dd94898f69" }, "java-tests/einfaches_rechnernetz_komplett.fls": { "success": true, @@ -14354,9 +14517,9 @@ "applications": [], "dhcpClient": false, "dhcpServer": { - "aktiv": false, - "untergrenze": "0.0.0.0", - "obergrenze": "0.0.0.0", + "aktiv": true, + "untergrenze": "192.168.0.21", + "obergrenze": "192.168.0.29", "gatewayip": "0.0.0.0", "dnsserverip": "0.0.0.0", "ownSettings": false, @@ -14401,7 +14564,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -14435,7 +14598,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -14477,7 +14640,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -14519,7 +14682,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -14561,7 +14724,7 @@ "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -14610,7 +14773,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } }, @@ -14651,7 +14814,7 @@ {} ], "system": { - "ssid": null, + "ssid": "000000", "retentionTime": 300000 } } @@ -14846,7 +15009,7 @@ } ], "documentation": [], - "sha256": "0d3b055bbc8091a569fc0cfc5d97bde286a361af60eda2c0539e9fca1d7d9c72" + "sha256": "b6c7806c4394e91a338416bb8d9547d9f7f5cba0d77edbcf99d0963b00a9cabe" }, "java-tests/empty.fls": { "success": true, @@ -14882,13 +15045,20 @@ ], "system": { "ssid": null, - "manualRoutes": [], + "manualRoutes": [ + [ + "10.5.0.0", + "255.255.0.0", + "10.0.0.254", + "10.0.0.1" + ] + ], "fileSystem": { "directory": "root", "children": [] }, "applications": [], - "dhcpClient": false, + "dhcpClient": true, "dhcpServer": { "aktiv": false, "untergrenze": "0.0.0.0", @@ -14918,8 +15088,8 @@ {} ], "system": { - "ssid": null, - "retentionTime": 300000 + "ssid": "S-net", + "retentionTime": 1234 } }, { @@ -14945,7 +15115,7 @@ } ], "system": { - "ssid": null, + "ssid": "net", "manualRoutes": [], "fileSystem": { "directory": "root", @@ -15001,8 +15171,15 @@ } ], "system": { - "ripEnabled": false, - "manualRoutes": [], + "ripEnabled": true, + "manualRoutes": [ + [ + "10.6.0.0", + "255.255.0.0", + "10.1.0.2", + "10.1.0.1" + ] + ], "fileSystem": { "directory": "root", "children": [ @@ -15037,6 +15214,127 @@ "ownSettings": false, "staticAssignedAddresses": [] }, + "firewall": { + "activated": true, + "defaultPolicy": 1, + "dropICMP": true, + "filterSYNSegmentsOnly": false, + "filterUdp": false, + "rules": [ + [ + "10.0.0.0", + "255.0.0.0", + "", + "", + -1, + -1, + 1 + ], + [ + "", + "", + "10.2.0.5", + "255.255.255.255", + 80, + 6, + 0 + ], + [ + "", + "", + "", + "", + 53, + 17, + 1 + ], + [ + "", + "", + "", + "", + -1, + 1, + 0 + ] + ] + } + } + }, + { + "class": "Gateway", + "name": "GW", + "label": "Heimrouter", + "bounds": [ + 300, + 20, + 21, + 20 + ], + "ports": [ + { + "ip": "42.0.0.7", + "mask": "255.0.0.0", + "mac": "02:G0", + "gateway": "", + "dns": "", + "wireless": false + }, + { + "ip": "192.168.1.1", + "mask": "255.255.255.0", + "mac": "02:G1", + "gateway": "", + "dns": "", + "wireless": false + } + ], + "system": { + "manualRoutes": [], + "fileSystem": { + "directory": "root", + "children": [ + { + "directory": "webserver", + "children": [ + { + "file": "index.html", + "type": "html", + "length": 243, + "sha256": "82d08041730728a01f9c7714db912699ff79a7a1b2211c48e283d6b8aec3f272", + "children": [] + }, + { + "file": "splashscreen-mini.png", + "type": "png", + "length": 8397, + "sha256": "c876b828d7258ddfce4aa01ecaa69d4685d238bccf6a94842972165bd1a0107c", + "children": [] + } + ] + } + ] + }, + "dhcpClient": true, + "dhcpServer": { + "aktiv": true, + "untergrenze": "192.168.1.100", + "obergrenze": "192.168.1.199", + "gatewayip": "192.168.1.1", + "dnsserverip": "8.8.8.8", + "ownSettings": true, + "staticAssignedAddresses": [ + "AA:BB:CC:DD:EE:77 192.168.1.77" + ] + }, + "staticNAT": [ + [ + "TCP", + "8080", + "192.168.1.10", + "80" + ] + ], "firewall": { "activated": false, "defaultPolicy": 0, @@ -15046,6 +15344,69 @@ "rules": [] } } + }, + { + "class": "Modem", + "name": "M1", + "label": "Modem", + "bounds": [ + 400, + 20, + 21, + 20 + ], + "ports": [ + {} + ], + "system": { + "modem": { + "mode": 1, + "port": 4242, + "ipAdresse": "localhost" + } + } + }, + { + "class": "Modem", + "name": "M2", + "label": "Modem", + "bounds": [ + 500, + 20, + 21, + 20 + ], + "ports": [ + {} + ], + "system": { + "modem": { + "mode": 2, + "port": 4242, + "ipAdresse": "localhost" + } + } + }, + { + "class": "Modem", + "name": "M3", + "label": "Modem", + "bounds": [ + 600, + 20, + 21, + 20 + ], + "ports": [ + {} + ], + "system": { + "modem": { + "mode": 1, + "port": 12345, + "ipAdresse": "localhost" + } + } } ], "cables": [ @@ -15145,6 +15506,6 @@ ] } ], - "sha256": "26386f4796c7c26ef63cfec50c6f6145c77e42f67e8315f30af316e0900554cd" + "sha256": "874f2f33f2f5beb5c301fc58f61deacc666fe65fb7289cd52abae84bd7dfb8d4" } }