/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) version 3. ** ** Filius is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ** PURPOSE. See the GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.software.system; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; import java.util.Map.Entry; import filius.Main; import filius.hardware.NetzwerkInterface; import filius.hardware.knoten.InternetKnoten; import filius.rahmenprogramm.EingabenUeberpruefung; import filius.rahmenprogramm.FiliusClassLoader; import filius.rahmenprogramm.Information; import filius.software.Anwendung; import filius.software.dns.Resolver; import filius.software.netzzugangsschicht.Ethernet; import filius.software.transportschicht.TCP; import filius.software.transportschicht.UDP; import filius.software.vermittlungsschicht.ARP; import filius.software.vermittlungsschicht.ICMP; import filius.software.vermittlungsschicht.IP; import filius.software.vermittlungsschicht.Weiterleitungstabelle; import filius.software.rip.RIPTable; /** * Diese Klasse implementiert die Funktionalitaet eines Betriebssystems für * Internetknoten. Dass heisst, das Betriebssystem unterstuetzt den gesamten * Protokollstapel, der fuer den Betrieb von Internetanwendungen benoetigt wird. * <br /> * Ausserdem stellt diese Klasse eine Schnittstelle fuer den Zugriff auf * <ol> * <li> die erste Netzwerkkarte, </li> * <li> den DNS-Client (Resolver) </li> * </ol> * zur Verfuegung. (als Entwurfsmuster Fassade) */ public abstract class InternetKnotenBetriebssystem extends SystemSoftware { private static final long serialVersionUID = 1L; /** Das lokale Dateisystem eines Rechners */ private Dateisystem dateisystem; /** * Die installierten Anwendungen. Sie werden mit dem Anwendungsnamen als * Schluessel in einer HashMap gespeichert. */ private HashMap<String, Anwendung> installierteAnwendung; /** * Mit Hilfe des DNS-Client werden Rechneradressen, die als Domainname * uebergeben werden aufgeloest. Ausserdem wird er benutzt, um jegliche * Anfragen an den DNS-Server zu stellen. */ private Resolver dnsclient; /** Die Transportschicht wird durch TCP und UDP implementiert. */ private TCP tcp; /** Die Transportschicht wird durch TCP und UDP implementiert. */ private UDP udp; /** * Die Vermittlungsschicht wird durch das Address Resolution Protocol (ARP) * und das Internetprotokoll implementiert. Dafür stehen die Klassen ARP und * Vermittlung. */ private ARP arpVermittlung; /** * Die Vermittlungsschicht wird durch das Address Resolution Protocol (ARP) * und das Internetprotokoll implementiert. Dafür stehen die Klassen ARP und * Vermittlung. */ private IP vermittlung; private ICMP icmpVermittlung; /** * Die Weiterleitungstabelle enthaelt neben Standardeintraegen ggfs. auch * durch den Anwender hinzugefuegte Eintraege. Diese zusaetzliche * Funktionalitaet wird derzeit nur durch den Vermittlungsrechner genutzt. * Generell wird die Entscheidung, ueber welche Netzwerkkarte Daten * versendet werden, auf Grundlage der Weiterleitungstabelle getroffen. Sie * kann nicht der Vermittlungsschicht zugeordnet werden, weil sie mit einem * Projekt persistent gespeichert werden muss. */ private Weiterleitungstabelle weiterleitungstabelle; /** * Die Netzzugangsschicht wird durch das Ethernet-Protokoll implementiert. * Die zugehoerigen Threads werden vom Betriebssystem gestartet und beendet. */ private Ethernet ethernet; /** * Konstruktor fuer das Betriebssystem eines Internetknotens. Hier werden * <ul> * <li> die Schichten initialisiert, </li> * <li> die installierten Anwendungen zurueck gesetzt, </li> * <li> das Dateisystem initialisiert, </li> * <li> der DNS-Client erzeugt. </li> * </ul> */ public InternetKnotenBetriebssystem() { super(); Main.debug.println("INVOKED-2 ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), constr: InternetKnotenBetriebssystem()"); installierteAnwendung = new HashMap<String, Anwendung>(); weiterleitungstabelle = new Weiterleitungstabelle(); weiterleitungstabelle.setInternetKnotenBetriebssystem(this); arpVermittlung = new ARP(this); vermittlung = new IP(this); icmpVermittlung = new ICMP(this); ethernet = new Ethernet(this); tcp = new TCP(this); udp = new UDP(this); this.dateisystem = new Dateisystem(); dnsclient = new Resolver(); dnsclient.setSystemSoftware(this); // print IDs for all network layers and the according node --> for providing debug support in log file Main.debug.println("DEBUG: InternetKnotenBetriebssystem ("+this.hashCode()+")\n" // + "\tKnoten: "+this.getKnoten().hashCode()+" ("+this.getKnoten().getName()+", "+this.getKnoten().holeHardwareTyp()+")\n" + "\tEthernet: "+ethernet.hashCode()+"\n" + "\tARP: "+arpVermittlung.hashCode()+"\n" + "\tIP: "+vermittlung.hashCode()+"\n" + "\tICMP: "+icmpVermittlung.hashCode()+"\n" + "\tTCP: "+tcp.hashCode()+"\n" + "\tUDP: "+udp.hashCode() ); } /** * Zum beenden der Protokoll-Threads und der Anwendungs-Threads. * * @see filius.software.system.SystemSoftware.beenden() */ public void beenden() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), beenden()"); Iterator it; // Die einzelnen Protokoll-Threads werden beginnend // mit der untersten Schicht beendet. // Netzzugangsschicht ethernet.beenden(); // Vermittlungsschicht arpVermittlung.beenden(); vermittlung.beenden(); icmpVermittlung.beenden(); // Transportschicht tcp.beenden(); udp.beenden(); dnsclient.beenden(); it = installierteAnwendung.entrySet().iterator(); while (it.hasNext()) { ((Anwendung) ((Entry) it.next()).getValue()).beenden(); } } private void printDebugInfo() { Main.debug.println("DEBUG ("+this.hashCode()+"): start InternetKnotenBetriebssystem"); if (this.getKnoten()!=null) { Main.debug.println("DEBUG ("+this.hashCode()+") - Hostname = "+this.getKnoten().getName()); Main.debug.print("DEBUG ("+this.hashCode()+") - Hardwaretyp = '"); if (getKnoten() instanceof filius.hardware.knoten.Notebook) { Main.debug.println("Notebook'"); } else if (getKnoten() instanceof filius.hardware.knoten.Rechner) { Main.debug.println("Rechner'"); } else if (getKnoten() instanceof filius.hardware.knoten.Vermittlungsrechner) { Main.debug.println("Vermittlungsrechner'"); } else { Main.debug.println("<unknown>'"); } } else { Main.debug.println("DEBUG ("+this.hashCode()+") - Hostname = <unknown>"); Main.debug.println("DEBUG ("+this.hashCode()+") - Hardwaretyp = <unknown>"); } Main.debug.println("DEBUG ("+this.hashCode()+") - ETHER = "+ethernet.hashCode()); LinkedList threads = ethernet.getEthernetThreads(); if (threads!=null) for(int i=0; i<threads.size(); i++) Main.debug.println("DEBUG ("+this.hashCode()+") - ETHER T-"+i+" = "+((filius.software.netzzugangsschicht.EthernetThread) threads.get(i)).hashCode()); Main.debug.println("DEBUG ("+this.hashCode()+") - ARP = "+arpVermittlung.hashCode()); filius.software.vermittlungsschicht.ARPThread thread = arpVermittlung.getARPThread(); if (thread!=null) Main.debug.println("DEBUG ("+this.hashCode()+") - ARP T = "+thread.hashCode()); Main.debug.println("DEBUG ("+this.hashCode()+") - IP = "+vermittlung.hashCode()); filius.software.vermittlungsschicht.IPThread IPthread = vermittlung.getIPThread(); if (IPthread!=null) Main.debug.println("DEBUG ("+this.hashCode()+") - IP T = "+IPthread.hashCode()); Main.debug.println("DEBUG ("+this.hashCode()+") - ICMP = "+icmpVermittlung.hashCode()); filius.software.vermittlungsschicht.ICMPThread ICMPthread = icmpVermittlung.getICMPThread(); if (IPthread!=null) Main.debug.println("DEBUG ("+this.hashCode()+") - ICMP T = "+ICMPthread.hashCode()); Main.debug.println("DEBUG ("+this.hashCode()+") - TCP = "+tcp.hashCode()); Main.debug.println("DEBUG ("+this.hashCode()+") - UDP = "+udp.hashCode()); if (this.getKnoten()!=null) { if (getKnoten() instanceof filius.hardware.knoten.Notebook) { NetzwerkInterface nic = ((NetzwerkInterface) ((filius.hardware.knoten.Notebook) getKnoten()).getNetzwerkInterfaces().getFirst()); Main.debug.println("DEBUG ("+this.hashCode()+") - NIC: {IP="+nic.getIp()+"/"+nic.getSubnetzMaske()+", MAC="+nic.getMac()+", DNS="+nic.getDns()+", GW="+nic.getGateway()+"}"); } else if (getKnoten() instanceof filius.hardware.knoten.Rechner) { NetzwerkInterface nic = ((NetzwerkInterface) ((filius.hardware.knoten.Rechner) getKnoten()).getNetzwerkInterfaces().getFirst()); Main.debug.println("DEBUG ("+this.hashCode()+") - NIC: {IP="+nic.getIp()+"/"+nic.getSubnetzMaske()+", MAC="+nic.getMac()+", DNS="+nic.getDns()+", GW="+nic.getGateway()+"}"); } else if (getKnoten() instanceof filius.hardware.knoten.Vermittlungsrechner) { Iterator it = (((filius.hardware.knoten.Vermittlungsrechner) getKnoten()).getNetzwerkInterfaces().iterator()); int nicNr=0; while(it.hasNext()) { NetzwerkInterface nic = (NetzwerkInterface) it.next(); Main.debug.println("DEBUG ("+this.hashCode()+") - NIC"+nicNr+": {IP="+nic.getIp()+"/"+nic.getSubnetzMaske()+", MAC="+nic.getMac()+", DNS="+nic.getDns()+", GW="+nic.getGateway()+"}"); nicNr++; } } } else { Main.debug.println("DEBUG ("+this.hashCode()+") - NIC=<unknown>"); } getWeiterleitungstabelle().printTabelle(Integer.toString(this.hashCode())); } /** * Methode zum starten der Protokoll-Threads und der Anwendungen. * * @see filius.software.system.SystemSoftware.starten() */ public void starten() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), starten()"); Iterator it; Entry entry; // Die Protokoll-Threads der einzelnen Schichten werden // beginnend mit der untersten Schicht gestartet. ethernet.starten(); arpVermittlung.starten(); vermittlung.starten(); icmpVermittlung.starten(); tcp.starten(); udp.starten(); printDebugInfo(); // print all relevant debug information in log file to follow these data it = installierteAnwendung.entrySet().iterator(); while (it.hasNext()) { entry = (Entry) it.next(); if (entry.getValue() != null) ((Anwendung) entry.getValue()).starten(); } } /** Methode fuer den Zugriff auf den DNS-Resolver */ public Resolver holeDNSClient() { return dnsclient; } /** * Methode fuer den Zugriff auf das Transport Control Protocol (TCP). */ public TCP holeTcp() { return tcp; } /** * Methode fuer den Zugriff auf das User Datagram Protocol (UDP). */ public UDP holeUdp() { return udp; } /** * Methode fuer den Zugriff auf das Address Resolution Protocol (ARP). */ public ARP holeARP() { return arpVermittlung; } /** * Methode fuer den Zugriff auf das Internet Control Message Protocol (ICMP). */ public ICMP holeICMP() { return icmpVermittlung; } /** * Methode fuer den Zugriff auf das Internet Protocol (IP). */ public IP holeIP() { return vermittlung; } /** Methode fuer den Zugriff auf das Ethernet-Protokoll */ public Ethernet holeEthernet() { return ethernet; } /** * Methode fuer den Zugriff auf das Dateisystem Diese Methode wird fuer das * Speichern des Dateisystems in einer Projektdatei benoetigt. (JavaBean- * konformer Zugriff erforderlich) */ public Dateisystem getDateisystem() { return dateisystem; } /** * Methode, um das Dateisystem zu setzen. Diese Methode wird fuer das * Speichern des Dateisystems in einer Projektdatei benoetigt. (JavaBean- * konformer Zugriff erforderlich) * * @param dateisystem */ public void setDateisystem(Dateisystem dateisystem) { this.dateisystem = dateisystem; } public RIPTable getRIPTable() { return null; } /** * Methode fuer den Zugriff auf die Hash-Map zur Verwaltung der * installierten Anwendungen. Diese Methode wird benoetigt, um den * Anforderungen an JavaBeans gerecht zu werden. */ public void setInstallierteAnwendungen( HashMap<String, Anwendung> anwendungen) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), setInstallierteAnwendungen()"); this.installierteAnwendung = anwendungen; // printInstallierteAnwendungen(); } /** * Methode zur Ausgabe auf der aktuell installierten Anwendungen auf der * Standardausgabe */ private void printInstallierteAnwendungen() { Iterator it = installierteAnwendung.entrySet().iterator(); Main.debug.println("\tInternetKnotenBetriebssystem: installierte Anwendungen:"); while (it.hasNext()) { Main.debug.println("\t - " + ((Entry) it.next()).getKey().toString()); } Main.debug.println("\t ges: " + installierteAnwendung.toString()); } /** * Methode fuer den Zugriff auf die Hash-Map zur Verwaltung der * installierten Anwendungen. Diese Methode wird benoetigt, um den * Anforderungen an JavaBeans gerecht zu werden. */ public HashMap<String, Anwendung> getInstallierteAnwendungen() { return installierteAnwendung; } /** * Methode fuer den Zugriff auf eine bereits installierte Anwendung. * * @param anwendungsklasse * Klasse der Anwendung * @return das Programm / die Anwendung */ public Anwendung holeSoftware(String anwendungsklasse) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), holeSoftware("+anwendungsklasse+")"); Anwendung anwendung; if (anwendungsklasse == null) return null; anwendung = (Anwendung) installierteAnwendung.get(anwendungsklasse); if (anwendung == null) { return null; } else { return anwendung; } } /** * Methode zum Entfernen einer installierten Anwendung. * * @param awKlasse * Klasse der zu entfernenden Anwendung * @return ob eine Anwendung entfernt wurde */ public boolean entferneSoftware(String awKlasse) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), entferneSoftware("+awKlasse+")"); printInstallierteAnwendungen(); // DEBUG boolean entfernt = false; Iterator it = installierteAnwendung.entrySet().iterator(); while (it.hasNext() && !entfernt) { if (awKlasse.equals((String) ((Entry) it.next()).getKey())) { it.remove(); entfernt = true; } } return entfernt; } public boolean installiereSoftware(String klassenname) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), installiereSoftware("+klassenname+")"); printInstallierteAnwendungen(); // DEBUG Anwendung neueAnwendung = null; boolean erfolg = false; LinkedList liste = null; HashMap tmpMap; Class<?> cl; ListIterator it; if (holeSoftware(klassenname) != null) { // Main.debug.println(klassenname + " ist bereits installiert!"); return false; } else { try { liste = Information.getInformation().ladeProgrammListe(); } catch (Exception e) { e.printStackTrace(Main.debug); return false; } it = liste.listIterator(); while (it.hasNext() && !erfolg) { tmpMap = (HashMap) it.next(); if (klassenname.equals((String) tmpMap.get("Klasse"))) { try { cl = Class.forName(klassenname, true, FiliusClassLoader .getInstance(Thread.currentThread() .getContextClassLoader())); try { neueAnwendung = (Anwendung) cl.getConstructor() .newInstance(); neueAnwendung.setSystemSoftware(this); } catch (Exception e) { e.printStackTrace(Main.debug); } } catch (ClassNotFoundException e) { e.printStackTrace(Main.debug); } if (neueAnwendung != null) { installierteAnwendung.put(klassenname, neueAnwendung); erfolg = true; } //Main.debug.println("Installiert: " + klassenname); //Main.debug //.println(" SIZE: " + installierteAnwendung.size()); //Main.debug.println("Anwendung--->" //+ installierteAnwendung.toString()); } } } return erfolg; } public boolean deinstalliereAnwendung(String anwendungsName) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), deinstalliereAnwendung("+anwendungsName+")"); printInstallierteAnwendungen(); // DEBUG Anwendung anwendung; if (anwendungsName == null) return false; anwendung = (Anwendung) installierteAnwendung.get(anwendungsName); if (anwendung == null) { return false; } else { installierteAnwendung.remove(anwendung.holeAnwendungsName()); return true; } } /** * Methode zur Abfrage aller aktuell installierter Anwendungen * * @return ein Array der Anwendungsnamen */ public Anwendung[] holeArrayInstallierteSoftware() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), holeArrayInstallierteSoftware()"); Anwendung[] anwendungen; Iterator it = installierteAnwendung.entrySet().iterator(); anwendungen = new Anwendung[installierteAnwendung.size()]; for (int i = 0; it.hasNext() && i < anwendungen.length; i++) { anwendungen[i] = (Anwendung) ((Entry) it.next()).getValue(); } // printInstallierteAnwendungen(); return anwendungen; } /** * Methode fuer den JavaBean-konformen Zugriff auf die * Weiterleitungstabelle. Diese Methode wird aber ausserdem von der * Implementierung der Vermittlungsschicht verwendet. */ public Weiterleitungstabelle getWeiterleitungstabelle() { return weiterleitungstabelle; } /** * Methode fuer den JavaBean-konformen Zugriff auf die * Weiterleitungstabelle. */ public void setWeiterleitungstabelle(Weiterleitungstabelle tabelle) { this.weiterleitungstabelle = tabelle; } /** * Methode fuer den Zugriff auf die IP-Adresse des Standard-Gateways, aller * Netzwerkkarten. * * @return IP-Adresse der einzigen Netzwerkkarte als String */ public String getStandardGateway() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), getStandardGateway()"); InternetKnoten knoten; NetzwerkInterface nic; if (getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); if (knoten.getNetzwerkInterfaces().size() > 0) { nic = (NetzwerkInterface) knoten.getNetzwerkInterfaces().getFirst(); return nic.getGateway(); } } return null; } /** * Methode zum Einstellen des Standard-Gateways fuer die Netwerkkarten. Das * ist eine Methode des Entwurfsmusters Fassade. * * @param gateway * IP-Adresse der Netzwerkkarten als String */ public void setStandardGateway(String gateway) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), setStandardGateway("+gateway+")"); InternetKnoten knoten; NetzwerkInterface nic; Iterator<?> it; gateway = (gateway != null && gateway.trim().equals("")) ? gateway.trim() : IP.ipCheck(gateway); if (gateway != null && EingabenUeberpruefung.isGueltig(gateway,EingabenUeberpruefung.musterIpAdresseAuchLeer) && getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); it = knoten.getNetzwerkInterfaces().listIterator(); while (it.hasNext()) { nic = (NetzwerkInterface) it.next(); nic.setGateway(gateway); } } } /** * Methode zum Einstellen der IP-Adresse fuer die einzige Netwerkkarte. Das * ist eine Methode des Entwurfsmusters Fassade */ public void setzeIPAdresse(String ip) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), setzeIPAdresse("+ip+")"); InternetKnoten knoten; ip = IP.ipCheck(ip); if (ip != null && EingabenUeberpruefung.isGueltig(ip,EingabenUeberpruefung.musterIpAdresse) && getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); ((NetzwerkInterface) knoten.getNetzwerkInterfaces().getFirst()).setIp(ip); //Main.debug.println("\t" //+ ((NetzwerkInterface) knoten.getNetzwerkInterfaces() //.getFirst()).getIp()); } } /** * Methode fuer den Zugriff auf die IP-Adresse der einzigen Netwerkkarte. * Das ist eine Methode des Entwurfsmusters Fassade */ public String holeIPAdresse() { if (!(getKnoten() instanceof InternetKnoten)) { return null; } InternetKnoten knoten = (InternetKnoten) getKnoten(); String ip = null; NetzwerkInterface nic; ListIterator it = knoten.getNetzwerkInterfaces().listIterator(); while (it.hasNext()) { nic = (NetzwerkInterface) it.next(); ip = nic.getIp(); // search for a public IP if ( !( ip.startsWith("10.") || ip.startsWith("192.168.") || ip.startsWith("0.") || ip.startsWith("127."))) { break; } } return ip; } /** * Methode fuer den Zugriff auf die MAC-Adresse der einzigen Netwerkkarte. * Das ist eine Methode des Entwurfsmusters Fassade */ public String holeMACAdresse() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), holeMACAdresse()"); InternetKnoten knoten; if (getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); if (knoten.getNetzwerkInterfaces().size() > 0) { NetzwerkInterface nic = (NetzwerkInterface) knoten .getNetzwerkInterfaces().getFirst(); return nic.getMac(); } } return null; } /** * Methode fuer den Zugriff auf die IP-Adresse des DNS-Servers der aller * Netzwerkkarten. Das ist eine Methode des Entwurfsmusters Fassade */ public String getDNSServer() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), getDNSServer()"); InternetKnoten knoten; if (getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); if (knoten.getNetzwerkInterfaces().size() > 0) { NetzwerkInterface nic = (NetzwerkInterface) knoten .getNetzwerkInterfaces().getFirst(); return nic.getDns(); } } return null; } /** * Methode fuer den Zugriff auf die IP-Adresse des DNS-Servers der aller * Netzwerkkarten. Das ist eine Methode des Entwurfsmusters Fassade */ public void setDNSServer(String dns) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), setDNSServer("+dns+")"); InternetKnoten knoten; NetzwerkInterface nic; Iterator<?> it; dns = (dns != null && dns.trim().equals("")) ? dns.trim() : IP.ipCheck(dns); if (dns != null && EingabenUeberpruefung.isGueltig(dns,EingabenUeberpruefung.musterIpAdresseAuchLeer) && getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); it = knoten.getNetzwerkInterfaces().listIterator(); while (it.hasNext()) { nic = (NetzwerkInterface) it.next(); nic.setDns(dns); } } } /** * Methode fuer den Zugriff auf die Netzmaske der einzigen Netzwerkkarte. * Das ist eine Methode des Entwurfsmusters Fassade */ public void setzeNetzmaske(String mask) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), setzeNetzmaske("+mask+")"); InternetKnoten knoten; mask = IP.ipCheck(mask); if (mask != null && EingabenUeberpruefung.isGueltig(mask, EingabenUeberpruefung.musterSubNetz) && getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); ((NetzwerkInterface) knoten.getNetzwerkInterfaces().getFirst()) .setSubnetzMaske(mask); //Main.debug.println("\t" //+ ((NetzwerkInterface) knoten.getNetzwerkInterfaces() //.getFirst()).getSubnetzMaske()); } } /** * Methode fuer den Zugriff auf die Netzmaske der einzigen Netzwerkkarte. * Das ist eine Methode des Entwurfsmusters Fassade */ public String holeNetzmaske() { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (InternetKnotenBetriebssystem), holeNetzmaske()"); InternetKnoten knoten; if (getKnoten() instanceof InternetKnoten) { knoten = (InternetKnoten) getKnoten(); return ((NetzwerkInterface) knoten.getNetzwerkInterfaces() .getFirst()).getSubnetzMaske(); } return null; } }