Datenverarbeitungstechnik 2013/14 Serverbetriebssysteme (Grundlagen) Multitasking, Scheduler Memory Management Windows (Microsoft-Server) Windows –Domäne Active Directory Rechtesystem und User Administration objektorientiert mit VB-Skript Internettechnologien Apache Server Interaktives HTML PHP Datenbanken SQL Entwurf, Praxis dynamische Websites Kommunikation in Industrieanlagen Webservices, Middleware, XML Security Dipl.-Ing. Reiner Doll, Technikerschule München ([email protected]) 1 Zur Themenauswahl : Das Fach Datenverarbeitungstechnik im Profil “Automation und IT“ soll in enger Zusammenarbeit mit dem Fach Automatisierungstechnik die Grundlagen der Anwendung ITtechnischer Werkzeuge in der Industrie- und Anlagentechnik vermitteln. Es wird bewußt bei jedem Thema nur der erste Schritt, der Einstieg, vermittelt. Darauf basierend kann bei Bedarf dann Detailwissen für die Praxis leicht erworben werden. Serverbetriebssysteme : Moderne Leitrechner und in jüngster Zeit auch SPS gewinnen rasant an Rechenleistung. Hier werden Multitasking-Betriebssysteme eingeführt, die in industrieller Anwendung nicht unkritisch sind. Man sollte die Grundlagen kennen, um in der Diskussion und beim Lesen von technischen Unterlagen mithalten zu können. Windows : Die Rechentechnik in der MES- und ERP- Ebene von Industrieanlagen ist heute sehr eindeutig vom Betriebssystem Windows dominiert. Grundliegende Kenntnisse der Arbeitsweise und der Administration von Windows-Servern gehören zum Handwerkszeug in der Industrie-IT. Internettechnologien : Bedienung und Wartung von Industrieanlagen wird heute zunehmend in Weboberflächen durchgeführt. Moderne SPS nutzen integrierte Webserver zur Kommunikation. Daher sind grundliegende Fertigkeiten in der Administration von Webservern und im technischen Gestalten von Webinhalten nötig. Datenbanken : In vernetzten Industrieanlagen spielen SQL-Datenbanken als Kern der ERP-Systeme und als Informationspool für die gesamte Anlagentechnik eine zentrale Rolle. Der Techniker muß einen Einblick in Aufbau und Arbeitsweise dieser Systeme haben und die Basisbedienung beherrschen. Kommunikation in Industrieanlagen : In vertikal vernetzten Anlagen greift die Prozessebene (meist SPS) heute direkt auf Datenbestände in der MES – oder ERP-Ebene zu. Die MES-Ebene und die ERP-Systeme kommunizieren untereinander und über das Internet mit der Zulieferkette (supply chain). Hier haben moderne IT-Protokolle die klassischen proprietären Sprachen (EDI..) verdrängt. Kommuniziert wird mit Webservices, das Datenformat ist immer XML. Techniker müssen diese Formate kennen, sowie rechnergestützt lesen und senden können. 2 Serverbetriebssysteme (Grundlagen) Das BS muß Multitasking ausführen : Alle Prozesse, die im Zeitmultiplex auf dem Prozessor laufen, müssen gestartet, eine Weile ausgeführt, und dann wieder zugunsten des nächsten Prozesses gestoppt werden. Das BS muß den RAM-Speicher verwalten : Die Prozesse teilen sich den installierten RAM (heute einige GB). Daten müssen so verwaltet werden, daß alle Prozesse mit dem Speicher auskommen. Das BS muß die Prozesskommunikation ausführen : Zu einer Zeit läuft immer nur ein Prozess. Will er mit einem anderen kommunizieren, müssen hierfür Mechanismen (Serverdienste) bereitgestellt werden. Diese Aufgaben und noch eine ganze Reihe Weiterer führen bei heute üblichen modularen Betriebssystemen spezielle Module aus (z.b. der Memory Manager). Die Kommunikation der Module untereinander und das grundliegende Multitasking erledigt der BS-Kern, der sogenannte Micro-Kernel : früher : monolithisches BS Alle Funktionen des BS in einem Programm, dem Kernel heute : modulares BS Modul Modul Modul Micro-Kernel : Kommunikation und Multitasking 3 Prozessor als Betriebssystembasis Protected-Mode (Intel 1982) : Schutzringe für verschiedene Programmklassen : Ring 3 : Applikationsprogramme Ring 2 : Betriebssystem-Erweiterungen Ring 1 : Systemprogramme Ring 0 : Betriebssysgtemkern (Kernel) In Betriebsart 0 (Ring 0) laufen alle Befehle, auch systemkritische, wie z.b. HLT, mit dem der Prozessor angehalten wird. Ein Programmfehler kann hier das ganze System abstürzen lassen. Nach außen sind immer weniger Befehle zur Verfügung, bis in Ring 3 keine systemkritischen Befehle mehr vorhanden sind. Jedes Programm trägt, vom System vergeben, eine Kennzeichnung (CPL : current privilege level) , die bestimmt, in welchem Ring es laufen darf. Weiter regelt ein Mechanismus im protected mode, welche Speicherbereiche im RAM von einem Programm angesprochen werden dürfen. Dies bewirkt am Ende z.B., daß ein Userprogramm nicht Daten eines anderen Userprogramms überschreiben kann. 4 Betriebssystem auf protected-mode Prozessoren : Windows Server Ring 3 Ring 0 Beispiele : Microkernel : HAL : c:\windows\system32\kernel32.dll c:\windows\system32\hal.dll 5 Multitasking : Multitasking bedeutet, daß auf nur einem Prozessor mehrere Programme „quasi“ gleichzeitig ausgeführt werden. Das geht nur durch Zeitmultiplex, welches so schnell sein muß, daß der Anwender (ein Mensch oder auch ein technischer Prozess) es als „gleichzeitig“ empfindet. Programm / Task : Ein Programm ist eine Vorschrift, wie ein Ablauf auszuführen ist. Eine Task ist ein Programmteil, und dazu alle nötige Info, um den Ablauf jederzeit stoppen und wieder weiter starten zu können. Beispiel : Sie backen einen Kuchen. Dazu haben sie ein Rezept, das sie stets von Anfang bis Ende ausführen. => Programm ! Sie backen einen Kuchen, dazwischen kommt aber die Freundin und will reden. Das hat höhere Priorität, also muß der Kuchen unterbrochen werden. Sie müssen sich jetzt neben dem Rezept aufschreiben, wie weit sie waren, was alles schon drin ist, usw. => Task ! Eine Task kann verschiedene Zustände haben : Sleeping : wartet Running : läuft gerade Blocked : nicht lauffähig (z.b. Eier aus) 6 Varianten von Multitasking : Warum Sie das wissen müssen : Ausschnitt aus “SPS - Zeitschrift für Automatisierungstechnik“ : Das Betriebssystem von Sigmatek unterstützt und nutzt sowohl präemptive Tasks (….) als auch kooperative Tasks (…). Visualisierung und Steuerungsprogramm können so auf einem Prozessor laufen. Das Betriebssystem behält die Kontrolle über die abzuarbeitenden Aufgaben (präemptives Multitasking), innerhalb einer Taskpriorität wird kooperatives Multitasking angewendet. kooperatives Multitasking : Ziel : Auf eher schwacher Hardware sollen die Prozesse möglichst performant laufen. Systemstabilität hat nicht die oberste Priorität, ein Absturz ist keine Katastrophe. Lösung : Prozesse laufen so lange, bis sie die CPU “feiwillig“ wieder hergeben, z.b. bis sie in blocked gehen (dann können sie sowieso nicht weiterrechnen und ein anderer wird gestartet). Problem : Wenn ein Prozess die CPU nicht mehr freigibt (z.b. weil er in einer Endlosschleife läuft), steht das ganze System (incl. dem Betriebssystem) !! I/O-Anforderung Px Dispatcher : stoppt Px -> blocked Py Scheduler : wählt nächste Task(z.B. Pz) aus (nach festgelegter Scheduling-Strategie) Dispatcher : startet Pz -> running (Im Hintergrund wird Px irgendwann wieder von blocked auf sleeping gehen, wenn I/O fertig) Pz 7 präemptives Multitasking : Ziel : Maximale Systemstabilität. Nötige Performance wird durch entsprechende Hardware erreicht. Lösung : Anwender-Prozesse dürfen nicht am Multitasking beteiligt werden. Ausschließlich das Betriebssystem selber entscheidet, wann ein Taskwechsel erfolgt. Ein stehender Prozess gefährdet dann das Gesamtsysgtem nicht. Problem : Macht das System langsamer (oder teurer : schnelle Hardware) Zeitscheibendarstellung : Pc Pb Quantum Ƭ Pd Pa CPU Pe Die Zeitscheibe dreht sich rechts rum. Prozess Pa hat die CPU gerade, solange bis das Quantum (z.b. 20ms) vorbei ist. Dann sichert der Dispatcher Pa und lädt Pb, dann startet er Pb. Die Anordnung der Prozesse auf der Zeitscheibe bestimmt der Scheduler. Langes Quantum : Rechenleistung steigt (weniger Verluste durch Dispatching) Kurzes Quantum : “Gleichzeitigkeit“ wird besser, Anwender “fühlt“ keine Verzögerung 8 deterministisches Multitasking : Alle bisher beschriebenen Verfahren sind in Industieumgebungen problematisch, weil sie, anders als z.b. klassiche SPS-Betriebssysteme, keine Berechenbarkeit der Reaktionszeit bieten. Diese Systeme sind also nicht deterministisch. Als deterministische Alternativen werden z.b. für aktuelle Windows-Systeme von Drittherstellern Erweiterungen angeboten. Der Scheduler von Windows wird dann ausgetauscht. „Umlaufende“ Echtzeitverfahren : Im Prinzip wird das Scheduling im Vorfeld geplant. Entweder läßt man Programmteile zeitgesteuert nach einer vorgeplanten Reihenfolge immer komplett durchlaufen (Non-Preemptive Realtime Multitasking, das machen kleine Controllersysteme häufig, zum Beispiel der Scheduler des tsmCopters). Oder man plant das oben beschriebene präemptive Verfahren (Preemptive Realtime Multitasking) so voraus, daß sowohl die Prozessreihenfolge als auch die nötigen Quanten geplant ablaufen. Das machen größere Prozessrechner üblicherweise. „Ereignisgesteuerte“ Echtzeitverfahren : Ein kompliziertes Thema. Im Prinzip ein präemptives Scheduling, aber hier werden die Tasks je nach zeitlichem Zustand (wann kommt z.b. für die Task X wieder ein Meßwert, den sie verarbeiten muß ?) dynamisch mit Prioritäten versehen. Das Ganze wieder vorausgeplant, und rechnerisch nachgewiesen, daß zu jeder Zeit jede zeitliche Anforderung erfüllt werden kann. Beispiel : RMS (http://de.wikipedia.org/wiki/Rate_Monotonic_Scheduling) In realen Systemen, z.b. in der modernen SPS-Technik, werden alle diese Verfahren eingesetzt. Viele moderne SPS können mehrere Scheduling-Verfahren ausführen, sogar gleichzeitig (siehe Zitat am Anfang des Kapitels). 9 Multitasking in Windows-Serverbetriebssystemen : Seit Windows NT setzt Microsoft präemptives Multitasking ein. Vorher war eher das Systemziel optimale Rechenleistung , also kooperatives Multitasking besser (Heimcomputer ..) Scheduler mit 15 Prioritätsstufen : P15 P14 P13 Tx Ty Tz P1 Tk Scheduling-Strategie (vereinfacht) : - wähle oberste nicht leere Prioritätsstufe, führe deren Tasks immmer der Reihe nach aus - wenn eine Task ihr Quatum voll ausrechnet, kommt sie eine Stufe tiefer in Priorität - wenn eine Task nach blocked ging, kommt sie nach Beenden der I/O in die höchste Priorität - in Priorität 15 ist Ƭ = 20ms, es wird nach unten immer länger, bis Ƭ = 120ms in Priorität 1 10 Probleme durch Multitasking : Leider bringt der Betrieb eines Rechners (oder einer SPS !)) in Multitasking nicht nur Vorteile, sondern auch Schwierigkeiten mit sich. So können fehlerfreie Programme sporadisch falsche Ergebnisse produzieren, Prozesse können können sich sogar gegenseitig blockieren. 1. Deadlock : Oder etwas technischer : Prozesse A und B wollen Daten von einer Platte zur anderen kopieren. Prozess A will HD1->HD2, >HD2, Prozess B andersrum. Die Medien werden vor dem Zugriff mit einem Lock-Bit Lock reserviert. 11 Programmablauf beider Prozesse : Reserviere Quell-HD Reserviere Ziel-HD Lies Daten von Quelle Schreib Daten in Ziel Gib Ziel-HD frei Gib Quell-HD frei Im Multitasking kann jetzt folgendes passieren: Prozess A : Prozess B : Reserviere Quell-HD (HD1 ist jetzt für A reserviert) Reserviere Quell-HD Quantum A ist zufällig hier zu (HD2 ist jetzt für B reserviert) Ende. Scheduler wählt B Reserviere Ziel-HD Hier geht’s nicht weiter, B wartet auf Freigabe von HD1 Reserviere Ziel-HD Damit ist nun auch hier Schluß. A wartet auf Freigabe von HD 2 ! Quantum B ist zu Ende. Scheduler wählt irgendwann wieder A Beide Prozesse stehen, das nennt man Deadlock („tödliche Umarmung“). 12 2. Race condition : Zwei Prozesse in einer Industrieanlage erhöhen den Wert eines gemeinsamen Zählers (z.b. 2 Stanzen arbeiten in den gleichen Behälter). Der Zählvorgang ist in beiden so programmiert : Lies Zählerwert n Erhöhe n um 1 Schreib n in Zähler Im Multitasking kann jetzt folgendes passieren : n = 18 …. nach den beiden Additionen steht aber nicht 20 sondern 19 im Zähler ! Prozess A : Prozess B : Lies Zählerwert n (18) Erhöhe n um 1 (19) Quantum A ist zufällig hier zu Ende. Scheduler wählt B Lies Zählerwert n (18) Erhöhe n um 1 (19) Schreib n in Zähler (n=19) Schreib n in Zähler (n=19) Quantum B ist zu Ende. Scheduler wählt irgendwann wieder A Korrekte Programme führen durch ungünstiges Unterbrechen zu falschen Resultaten ! Zum Weiterlesen ganz witzig : Das Problem der 5 Philosophen (Djikstra, rund 1970) http://de.wikipedia.org/wiki/Philosophenproblem 13 Lösung dieser Multitasking-Probleme : Diese Probleme sind nicht neu. Im Eisenbahnwesen kann es vorkommen, daß 2 Züge von 2 Seiten Seiten den selben eingleisigen Steckenabschnitt befahren wollen. Dazu hat man das Semaphor erfunden. Dieses Signal wird gesetzt, sobald ein Zug den „kritischen Abschnitt“ befährt, der aus der Weiche zum Tunnelabschnitt, dem Tunnel selber, sowie der Weiche nach dem Tunnelabschnitt besteht. Erst wenn er komplett durch ist, gibt das Semaphor den Streckenabschnitt wieder frei. In der Informatik benutzt man dazu spezielle Variablen, die man auch Sempaphore, oder wenn sie nur 2 Zustände haben können, Mutexe (von : mutual exclusion), nennt. Wichtig ist hierbei, in einem Prozess, der mit anderen konkurrieren kann (siehe oben), den kritischen Abschnitt zu isolieren, und dann mit dem Mutex abzusichern. In unserem ersten Beispiel sind A und B dann so zu programmieren: Nimm MUTEX Reserviere Quell-HD Critical section Reserviere Ziel-HD Gib MUTEX frei Wenn Prozess A den gemeinsamen MUTEX nimmt, kann Prozess B seine erste Platte nicht mehr reservieren -> kein Deadlock mehr möglich ! Hierfür stehen auf Betriebssystemebene Funktionen bereit, die Systemprogrammierer nutzen können (Windows-Funktion : CreateMutex). Manchmal braucht man das auch in Anwenderprogrammen, dann muß man diese Variable halt selber definieren und den Zugangsschutz selber programmieren … Verständnisfrage : wieso blockiert man mit dem Mutex nicht einfach die Unterbrechung der critical section durch das Multitasking ?? 14 Graphische Beschreibung der Funktion nebenläufiger Systeme : Petrinetz Carl Adam Petri (geb. 12. Juli 1926), deutscher Mathematiker „Ein Petri-Netz ist ein mathematisches Modell von nebenläufigen Systemen. Es ist eine formale Methode der Modellierung von Systemen bzw. Transformationsprozessen.“ (Quelle : Wikipedia, siehe auch Automatentheorie und Moore-Automaten) Es besteht aus Zuständen („state“, diese sind in der Hardware durch die Ausgänge speichernder Bauteile definert) und Zustandsübergängen („transition“). Eine Marke (Punkt) definiert, ob ein Zustand aktiv oder nicht aktiv ist. Funktionsregel : Wenn alle Zustände vor einer Transition akitv sind, schaltet diese. Die Marke wandert dann auf die nachfolgenden Zustände : Zeitpunkt 1 : Zeitpunkt 2 : 15 Im Petrinetz dargestellt 2 Prozesse, die um gemeinsame Betriebsmittel konkurrieren : (Die beiden Betriebsmittel BM könnten z.b. 2 Festplatten sein, siehe oben) Prozess 1 Prozess 2 BM1 Selber spielen ? BM2 -> http://olli.informatik.uni-oldenburg.de/PetriEdiSim/ 16 Start : (beide BM sind bereit) Prozess1 legt los : Jetzt schaltet der Scheduler um, und Prozess2 beginnt : -> Deadlock : weder Prozess1 noch Prozess2 können weiterarbeiten ! 17 Mit Semaphor (Mutex) : Mutex (Der Mutex wird oben (t11 bzw.t21) genommen, unten (t13 bzw. t23) wieder zurückgelegt) Prozess 1 beginnt wieder : 18 Nun der Scheduler, Prozess 2 wird gestartet …. und wird blocked oder wartet einfach, weil er den Mutex nicht nehmen kann : Also kommt irgendwann wieder Prozess 1 im Scheduling dran, und macht weiter : .. und verläßt dann die critical section, wobei er Betriebsmittel und Mutex freigibt : 19 Speicherverwaltung im Multitasking Das Problem ist schnell erklärt : Im Multitasking eines 32-bit Windows laufen z.b. 20 Tasks (schauen Sie in Ihren Taskmanager). Jede Task kann theoretisch bei 32 bit Adressbreite 4GB Ram adressieren -> 20 x 4 GB wären 80GB nötiger Hautpspeicher ! Die Lösung auch : SUN Microsystems entwickelte rund 1970 ein System, das mit einem eigenen Prozessor Daten aus dem RAM im Hintergund auf die Festplatte auslagert ( und bei Bedarf wieder zurückholt), um Hauptspeicherplaz zu gewinnen. Man nannte das “virtual memory“. Schon um 1979 wurde der seperate Prozessor dann auf den Chip de CPU integriert, z.b. von Motorola bei 68000-Prozessor, die Komponente heißt MMU (memory management unit) : Heute integriert : MMU auf CPU RAM Prozessor für virtual memory Festplatte CPU Systembus Die Datenpakete, die zwischen RAM und HD hin-und hergeschoben werden, sind (wegen der Physik der Festplatten) nie Bytes, sondern „pages“ (page = Seite), das ist die Einheit, in der die Festplatte pro Lese- und Schreibzugriff Daten transportiert. Meist sind das heute 4 kB. Das Verfahren wird deshalb auch „paging“ genannt. 20 Zur Erklärung hier ein (unrealistisches) Beispiel für ein paging-Verfahren. Wir stellen uns einen 16bit-Rechner mit 32 kB RAM vor. Dieser adressiert nun 16 bit Adressen, obwohl er bloß 32k Hauptspeicher hat ! Der Adressbus des Rechnersystems ist 16 bit breit. Damit kann man 64kB adressieren (siehe Hilfsblatt : “Dualsystem“ im Übungsteil). (Vorausgesetzt wird, das der RAM byteweise adressiert wird) Die page-Größe wird mit 4kB angenommen (siehe oben, Blockgröße bei Standard-Festplatte). Will man innerhalb einer Seite ein Byte adressieren, braucht man dazu 12 bit ( -> 4k !). Wenn ich diese 12 bit als unteren Teil in die 16 bit-Adresse des (virtual !) memory eintrage, bleiben noch 4 bit übrig : damit nummeriere ich die Seiten, die rumkopiert werden : Im Beispiel : Von einem Programm zum Beispiel angesprochene Adresse 8196 (=virtuelle Adresse !) : 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 Wird von der MMU jetzt zerlegt, in Seitenadresse („Index“) und Adresse auf Seite („Realtiv“) : 0 0 1 0 Seitenadresse (= 2) 0 0 0 0 0 0 0 0 0 1 0 0 Adresse des Bytes auf der Seite 2 (= 4) Benötigt wird also die Seite (page) Nr. 2, und dort muß dann das Byte Nr.4 adressiert werden. 21 Zur Erinnerung : virtual memory heißt, das ein Teil der Seiten im RAM ist, ein anderer Teil aber auf die Festplatte ausgelagert wurde. Ist die benötigte Seite Nr. 2 jetzt gerade im RAM vorhanden, oder liegt diese Seite jetzt gerade auf der Festplatte ?? Dazu führt die MMU eine Verwaltungstabelle, die sogenannte page-table. Auf dieser ist vermerkt, welche Seite (Index) des virtual memory im Hauptspeicher liegt oder nicht (Präsenz-Bit =1 oder =0), und wenn ja, in welcher RAM-Seite (Rahmen oder Frame) : Index PB Rahmen 0000 1 010 0001 1 001 0010 1 110 0011 1 000 0100 1 100 0101 1 011 0110 0 - 0111 0 - 1000 0 - 1001 1 101 1010 0 - 1011 1 111 1100 0 - 1101 0 - 1110 0 - 1111 0 - 22 In unserem Beispiel haben wir Glück gehabt, die Seite 2 ( 0010 ) ist gerade im RAM, und hat dort die Adresse 100. Wir bilden damit die neue physikalische RAM-Adresse, indem wir den virtuellen Index durch den physikalischen Frame ersetzen : 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 Aus der virtuellen Adresse 8196 ist die physikalische Adresse 24580 entstanden. Diese wird von der MMU jetzt im RAM adressiert. Die CPU des Rechners hat von der Mogelei gar nichts mitbekommen, sie denkt ja, sie hätte die vollen 16 Bit Adressraum (64k). Interessant wird es, wenn die gewünschte page nicht im RAM vorhanden ist. Man nennt das einen paging error. (Kann man in Windows im Taskmanager sehen) Die MMU teilt dem Scheduler mit, daß das Programm, das gerade läuft, nicht weitermachen kann : es wird blocked gesetzt (wie bei einem anderen I/O-Zugriff auch). Die MMU muß auf der Festplatte nach der ausgelagerten page suchen (hierzu wird auch das Filesystem der Festplatte benutzt, auf das hier nicht eingegangen wird), und diese ins RAM holen. Und da wird’s jetzt eng : das RAM ist ja voll ! In jedem Betriebssystem gibt es hier nun komplexe Strategien, welche der Seiten im RAM mit den benötigten überschrieben werden sollen (Seitenersetzungs- oder paging-Strategie). Diese tragen nicht unerheblich zur Leistungsfähigkeit eines Betriebssystems bei ! (Beispiele : NRU= not resently used, NFU = not frequently used, usw..) 23 In Windows wird im Prinzip das „working-set“-Verfahren benutzt : Ausgehend vom „Lokalitätsprinzip“ (das bedeutet, daß wahrscheinlich in der nahen Zukunft Adressen benutzt werden, die sich in der Umgebung der aktuellen befinden), wird nicht nur die eine Seite geladen, die den paging-error ausgelöst hat, sondern gleich eine Menge Seiten da außen rum, in modernen System mit großen Speichern gleich ein paar Tausend. Zur Auswahl der dafür auszulagernden Seiten wird im Wesentlichen der LRU (least recently used) – Algorithmus benutzt, der die Seiten wählt, die am längsten nicht mehr benutzt wurden. .. Wenn dann der paging-Vorgang endlich abgeschlossen ist, sind also einige (viele) Seiten aus dem RAM in die Festplatte ausgelagert worden, dafür einige andere (incl. der benötigten) von der Festplatte ins RAM geschrieben worden. Der paging-eror ist damit behoben, die ursächliche Task wird von blocked nach sleeping gesetzt und kommt irgendwann im Scheduling wieder dran. IM ÜBUNGSTEIL : Übung : Speicherverwaltung IM ÜBUNGSTEIL : Hilfe zum Dualsystem 24 Windows (Microsoft-Server) Altes Konzept (Windows NT ab ca. 1990) : NT-Server NT-Server PDC BDC MitgliedServer NT-Client Neues Konzept (ab Windows 2000, ca. 2000) : Active Directory : gemeinsame Resourcen-Datenbank DC DC DC DC DC DC MitgliedServer 2000pro, WinXP, Win7 …. Voraussetzungen : TCP/IP-Netz, DNS-Server (DHCP optional) 25 Domänencontroller genauer betrachtet : In Windows NT war die Administration nur auf dem PDC (primary domain controller) möglich. Der BDC (backup domain controller) trug eine „read-only“ - Kopie, um bei Ausfall des PDC den Netzbetrieb aufrecht halten zu können. Ab Windows 2000 mit Active Directory ist die Administration der Netzresourcen auf allen DC möglich, jeder trägt eine beschreibbare Kopie der Datenbank, die in zyklischen Abständen von allen DC repliziert wird. Hierzu werden Zeitstempel auf die Einträge benutzt, die sogenannten „update sequence numbers“. Diese sorgen dafür, daß immer die neuste Änderung netzweit auf allen DC aktualisiert wird. Weitere DC erhöhen die Betriebssicherheit des Netzes.# Besondere Funktionen des ersten installierten DC : Der erste installierte Domänencontroller agiert als Betriebsmaster. Seine Spezial-Funktionen („FSMO“ flexible single master operations) werden nicht repliziert, das heißt bei Ausfall muß ein anderer Server manuell zum Betriebsmaster hochgestuft werden . Zu diesen Aufgaben gehört die Verwaltung der numerischen ID der Objekte (user, computer usw.), des Active-Dir Schemas (welche Funktionen möglich sind) und noch eine Reihe von weiteren Verwaltungsaufgaben. 26 Login im Netz mit Kerberos Active Directory entstand aus dem Verzeichnisdienst X.500 (1990). Ein Kerngedanke eines Verzeichnisdienstes („directory service“) ist die plattformunabhängig Authentifizierung. Das bedeutet, ein einziger login im Netz (an der Verzeichnisdatenbank) soll genügen, um alle bekannten Systeme im Netz nutzen zu können : auch Systeme mit anderen Betriebssystemen ! Heute können das die meisten netzfähigen Geräte, auch Smartphones usw.. Login-Vorgang : KDS KDS : key distribution service Protokoll : LDAP lightweight directory access protocol GINA GINA : graphical interactive network authentification Mit dem GINA-Tool (mit Bildschirm-Fenster) stellt der Client eine LDAP-Verbindung zum Datenbankserver (ein DC) her. Dort nimmt der key distribution service (KDS) die Anfrage entgegen. Der ticket granting service (TGS) stellt bei korrektem login ein ticket granting ticket (TGT) aus. Das ist praktisch ein „all-inclusive-Bändchen“. Es ist mit dem User-Passwort als Key verschlüsselt : deshalb sollten User-Passwörter lang sein ! Es gilt eine gewisse Zeit (time to life, TTL), in der es auf jedem Server im Netz den Zugang ermöglicht. Der Client zeigt sozusagen beim Zugriff auf einen beliebigen Server sein „allinclusive-Bändchen“, das TGT (Port 88), und bekommt dann vom Server ein service-ticket (ST). Dieses ist wieder verschlüsselt, und gilt nur auf diesem einen Server. Der User merkt von all dem nichts. 27 Aufbau eines Verzeichnisdienstes Basierend auf dem X.500 – Standard wurden für viele Betriebssysteme Verzeichnisdienste entwickelt. Novell z.b. bietet NDS an, den „Novell Directory Service“, für LINUX-Systeme gibt es OpenLDAP, bei Microsoft heißt der Dienst Active Directory. Will man hier begrifflich präzise sein, so muß man in den Verzeichnisdienst, also die Datenbank und ihre Tools, und das Zugriffsprotokoll trennen. In X.500 heißt der Protokollstandard DAP (directory access protokoll). LDAP ist eine Untermenge davon, das lightweight directory access protocol. (OpenLDAP ist also eigentlich unkorrekt, weil das ja ein Protokoll sein müßte, aber ein Verzeichnisdienst ist…) VORSICHT : DER BEGRIFF „VERZEICHNISSDIENST“ HAT NICHTS MIT EINEM FESTPLATTENVERZEICHNISS ZU TUN !! Die Datenbankstruktur eines Directory Service läßt sich gut graphisch darstellen, das sieht aus wie ein Baum (heißt auch tree), aber die Wurzel ist oben : Wurzelobjekt : root (heißt so wie die Domäne) Strukturobjekt (tree-object) : Dient nur der Strukturierung ! Bei Active Directory heißt es organizational unit (oder „Container“) Resource (leaf-object) : Die vorhandenen Objekte In AD im wesentlichen computer und user 28 In Active Directory gibt es eine Reihe von vorgegebenen Objekten und Containern. (Bei Novell z.b. ist das anders, da ist der Baum erstmal leer). Die wesentlichste Eigenschaft des directory tree ist, daß er ein hierarchisches System beschreibt : Für einen Container definierte Einstellungen übertragen sich nach unten an alle im Ast liegende Objekte, auch in weiteren Containern. Man nennt dies Vererbung oder inheritation : Domäne : dv-script.tsm.de Container A mit Parameter XY Container B mit Parameter AB User HANS hat XY + AB User MAX hat XY 29 Objekte in Active Directory : Administriert werden im Wesentlichen Computer und User. Im objektorientierten Sinn sind dies Klassen, also „Vorlagen“ für die zu erzeugenden Objekte. Wie es sich für Objekte gehört, haben diese eine Reihe von Eigenschaften (Attribute : mehrere Namen, Telefonnummern, usw…). Ein Teil davon sind „lebenswichtige“ Attribute, ohne die ein Objekt nicht existieren kann : mandatory attributes. Die übrigen, nicht lebenswichtigen, heißen optional attributes. Objekte in Active Directory haben neben den internen numerischen Kennungen (SID) für den Menschen lesbare Namen : distinguished name (DN) : cn = HANS, ou = B, ou = A, dc = dv-script, dc = tsm, dc = de common name organizational unit domain component Eine vereinfachte Form ist der “kontextfreie” Anmeldename (der Kontext, die Stelle im Baum, wird dann automatisch gesucht) : user prinzipal name (UPN) : [email protected] Am Einfachsten ist der aus NT-Zeiten stammende Name für den Security Account Manager : SamAccountName : HANS 30 Administration mit Active Directory : Administrieren in Active Dir bedeutet zum Einen, daß die zu verwaltenden Objekte, also die Computer im Netz und die daran arbeitenden User in einen sinnvoll strukturierten Verzeichnissbaum eingegeben (oder mit einem Programm importiert) werden müssen. Dann können Sie mit Parametern zurechtgestutzt werden. Aus geschichtlichen Gründen heißen diese Parameter bei Microsoft Gruppenrichtlinien (group policies). Gruppenrichtlinien werden an Container vergeben. Sie vererben sich dann wie beschrieben nach unten. Wenn der Baum geschickt aufgebaut ist, kommt man mit wenigen Richtlinien aus. Es gibt enorm viele einstellbare Parameter, sie sind aber streng in zwei Familien eingeteilt : Computerrichtlinien wirken nur auf den Objekttyp Computer Benutzerrichtlinien wirken nur auf den Objekttyp User Das kann Probleme bereiten, wenn man unsauber arbeitet. Wenn in Containern die Objekttypen gemischt sind, ist die Wirkung der Richtlinien nicht sehr übersichtlich … 31 Active Directory in der Praxis : Hier ein Ausschnitt der Labornetzverwaltung der Technikerschule : Default-Objekte Neuer Container Drunter noch einer 32 Hier nun (in der alten Ansicht mit Windows2003) die Eigenschaften eines Container-Objekts : Die Gruppenrichtlinien gehören zu den Eigenschaften des „räume“- Objekts. Eine solche Gruppenrichlinie kann beliebig viele Parametereinstellungen enthalten. Es ist aber sicher eine gute Idee, pro Richlinien nur eine einzige Parameteränderung durchzuführen, und die Richtlinie entsprechend zu benennen, um das System übersichtlich zu gestalten. Mit einem Klick auf NEU wird eine neue Gruppenrichtlinie hinzugefügt (hier : skripttest). Dann kann mit einem Klick auf BEARBEITEN der Gruppenrichtlinien-Editor geöffnet werden : 33 ..und zeigt links ein Menü und rechts die enthaltenen, einzelnen Gruppenrichtlinien. WICHTIG : Man erkennt die wichtige Unterscheidung in Computerkonfiguration und Benutzerkonfiguration. Wenn in diesem Beispiel in Benutzerkonfiguration eine passende Richtlinie gefunden und aktiviert wird, bewirkt das dann NICHTS, weil das Objekt, an dem wir arbeiten, der Container räume, keine Benutzer, sondern nur Computer enthält ! IM ÜBUNGSTEIL : Praktikum : WindowsDomäne aufbauen IM ÜBUNGSTEIL : Praktikum : Active Directory adnministrieren 34 Datenzugriffsrechte in Windows In Windows kann ohne Serverunterstützung direkt auf Daten eines anderen Computers zugegriffen werden. Das nennt man peer-to-peer Zugriff. Hierzu muß einfach eine Freigabe erzeugt werden und eine Zugriffskennung bekannt sein. Im Serverbetrieb spielt der peer-to-peer Zugriff wegen mangelnder Übersichtlichkeit und Datensicherheit keine Rolle. Wichtige Daten sollten auf einer technisch dafür ausgerüsteten Maschine gespeichert sein. Schnelle Netzanbindung, robuste Hardware (z.b. redundante Netzteile), und ein schnelles, sicheres Festplattensystem (Raid) sind empfehlenswert. In kleinen Netzen kann das der Domänencontroller sein, in größeren Netzen wird man einen seperaten Fileserver (vielleicht ein geeignetes NAS) hierfür einsetzen. SCHUTZ : NTFS-Rechte Windows als Fileserver : 1) Daten Direkter Zugriff über angeschlossene Tastatur/Monitor 3) Zugriff über Terminalservice SCHUTZ : FREIGABE-Rechte 2) Zugriff über das Netz vom Client-PC aus : Freigabe ! 35 Windows ist als non-dedicated Serversystem konzipiert. Das bedeutet, daß der (File-) Server auch als Arbeitsstation benutzt werden kann. In sehr kleinen Umgebungen mit wenigen Rechnern mag das Sinn haben. (In anderen Systemen, Novell zum Beispiel, ist das nicht möglich. Auf einem Novell-Server kann keine Applikationssoftware – z.b. Textverarbeitung – installiert werden : das nennt man einen dedicated Server) Der non-dedicated Aufbau bringt eine kompliziertere Rechtestruktur mit sich. Es kann wie im Bild auf mehreren Wegen auf die Daten des Servers zugegriffen werden. Freigaberechte : Wirken ausschließlich auf den Netzzugriff über das Freigabeprotokoll (SMB : server message blocks). Werden im System gespeichert, nicht als Attribute auf der Festplatte. Zugriffe über direkt angeschlossene Hardware (Terminal) oder die netzgestützten TerminalServices (Remote Desktop : RDP-Protokoll) werden nicht beeinflußt ! NTFS-Attribute : Sitzen als Filesystem-Attribute an den Daten der Festplatte. Administrierbar unter SICHERHEIT bei den Eigenschaften der Daten in Windows. Wirken auf alle Zugriffe. Ein dedicated Server benötigt keine Attribut-Rechte, das macht ihn deutlich übersichtlicher ! IM ÜBUNGSTEIL : Praktikum : WindowsRechtesystem 36 Skriptbasierte Administration von Windows Die Administration per Skript ist immer dann sinnvoll, wenn entweder oft wiederkehrende Tätigkeiten auszuführen sind oder wenn eine große Menge an Objekten (z.b. viele User) gehandelt werden müssen. Die Administration geschieht objektorientiert, hierzu stehen in Klassenbibliotheken innerhalb der Windows-Betriebssysteme umfangreiche Hilfsmittel zur Verfügung. Dokumentation hierzu findet sich im Internet, die Orginaldoku in der MSDN-Bibliothek. Hierzu werden Programme geschrieben, die aber nicht direkt auf Windows aufsetzen. Sie werden von einem Interpreter („Script Engine“) in einer sogenannten „Laufzeitumgebung“ ausgeführt, die auch für die Kommunikation mit den Systemkomponenten sorgt. Eine solche Laufzeitumgebung ist der Windows Scripting Host (WSH), den wir hier nutzen. Als Script Engine verwenden wir VBscript. UserProg. „Laufzeitumgebung“ Klassenbibliothek Betriebssystem Hardware 37 Zur Script-Engine : Syntax von VBscript („VB classic“) Sie erzeugen ein Textdocument, bearbeiten den Inhalt mit dem Editor, und speichern es nicht als .txt, sondern als .vbs (Vorsicht : nicht als Textfile sondern als „alle Dateien“ speichern) Dann einfach Anklicken … Wenn es Schwierigkeiten macht, mit dem Taskmanager den Prozess wscript.exe stoppen ! VB classic ist eine Interpretersprache (Skipt-Sprache), das bedeutet, sie wird nicht übersetzt bevor man sie ausführen kann. Deshalb ist auch keine Deklaration von Variablen nötig. Anweisung : a=b+c a=b–c a=b*c a=b/c a=b+1; Schleife : solange Bedingung gilt do while a < 0 ….. ….. loop Zählschleife : für i von 1 bis 100 for i=1 to 100 ….. ….. next 38 Verzweigung : a>0? ja Vergleichsoperatoren : nein > < >= <= = <> if a > 0 then .…. ….. ….. else ….. ….. end if größer als kleiner als größer gleich kleiner gleich gleich ungleich Stringoperationen : Strings (und Variableninhalte) zusammenfügen : neu = “Hallo“ & name Stringanalyse : a = right (test,3) b = left (test,4) c = mid (test, 5, 3) 3 Zeichen von rechts aus test in a 4 Zeichen von links aus tes in b 3 Zeichen ab der 5-ten Stelle von test in c Ein-Ausgabe : a = InputBox(“Text zur Eingabe”) MsgBox(a) IM ÜBUNGSTEIL : Praktikum : VBScript 39 Beispiel für die Nutzung von Windows-Objekten mit dem WSH Alle Komponenten in der Windows-Domäne, vom Userobjekt in Active Directory bis zum Textfile auf der Festplatte werden objektorientiert betrachtet. Eine sehr mächtige Klasse ist zum Beispiel das Scripting.FileSystemObject Diese Klasse beinhaltet eine große Anzahl von Methoden, die alle möglichen Operationen innerhalb eines Filesystems z.b. auf einer Festplatte ausführen können. Hier als erster Einblick eine Liste der Methoden : 40 Syntax für die Nutzung von Windows - Klassen So kann z.b. ein Textfile (welches wieder ein Objekt darstellt) erzeugt werden : Befehl : erzeuge Objekt Set apfel = CreateObject ( “Scripting.FileSystemObject“) Objektname Klasse apfel.CreateTextFile(“c:\testordner\testfile.txt”) Objekt Methode Parameter Ein wenig komplexer, wenn man das erzeugte Objekt gleich wieder nutzen möchte : Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.CreateTextFile("c:\testfile.txt", true) Sofortiges Erzeugen eines TextStream-Objekts Überschreiben bestehender files erlaubt a.WriteLine("This is a test.") a.Close Methoden des TextStream-Objekts IM ÜBUNGSTEIL : Praktikum : Scripting. FileSystemObject 41 Skriptbasierte Administration von Active Directory Die Administration geschieht durch Nutzung des Active Directory Service Interface ADSI. Dieses stellt im Prinzip eine Klassenbibliothek für die AD-Objekte bereit. Es gibt hier nur wenige Objekte, im Wesentlichen wie schon besprochen: user, computer und organizational units. Diese haben als wichtige Methoden create und delete zum Erzeugen und Löschen von Objekten, sowie get und put zum Lesen und Schreiben von Attributen. Der Zugriff in die AD-Datenbank kann auf verschiedene Wegen erfolgen, der einfachste ist wohl die Methode, bei der mit dem LDAP-Protokoll ohne Angabe eines Servernamens direkt auf die ActiveDirectory-Verwaltung zugegriffen wird (serverless binding). Welcher Server das dann wirklich ausführt ist für den Benutzer unwichtig. Die Position des zu referenzierenden Objekts im AD-Baum (Kontext) wird mit dem sogenannten Moniker angegeben. Dieser nennt zunächst das zu verwendende Zugriffsprotokoll, hier also LDAP (was Microsoft als Provider bezeichnet). Dann folgt der common name cn (siehe oben) : LDAP://ou= B, ou= A, dc= dv-script, dc= tsm, dc =de (ein Container hat keinen common name !) Ablauf : 1. Schritt : Referenzieren eines AD-Objekts mit dem Moniker 2. Schritt : Aufruf einer seiner Methoden Nächste Schritte : weitere Methodenaufrufe… Letzter Schritt : Schreiben des modifizierten Inhalts in AD mit der SetInfo-Methode 42 Beispiel : Einen User erzeugen im Container A : Eine "Bindung" ist das Herstellen eines Zugangs zu einem Objekt in Active Directory. Bindungen können unter Angabe eines Servers erstellt werden, besser jedoch (wie unter) als "serverless binding", die Domäne teilt den Server dann automatisch zu. VB-Funktion zur Herstellung einer Bindung an ein Active-Dir Objekt "ADSI -PROVIDER" : gibt an, auf welchem Weg die Daten erreichbar sind (hier LDAP-Protokoll) set apfel = GetObject("LDAP://ou=A,dc=dv-script,dc=tsm, dc=de") Erstellt eine Referenz auf das durch die Bindung erreichbare Objekt Referenzname DN (distinguished name), gibt den "Pfad" zum Objekt in Active Directory an Besteht aus : OU : organsiational unit (Container) CN : commen name (User, Computer..) DC : domain component (DNS-Name) Methode, die eine Instanz (=Objekt) der als Parameter angegebenen Klasse erzeugt set birne = apfel.create("user","cn=hans") erstellt Referenz auf das erzeugte Obekt ReferenzName Klasse Objektname als RDN (relative distinguished name) birne.put "samaccountname", "wurst" Methode, die ein Attribut setzt. Name des Attributs Manche Klassen (user z.b.) haben verbindliche Attribute (mandatory attributes), die gesetzt werden müssen (sonst Fehlermeldung) Wert des Attributs birne.SetInfo Methode, die Objekte und deren Parameter an Active Dir überträgt (Netzzugriff) 43 Damit kann man schon fast alles machen. Welche Attribute ein Objekt hat, schaut man am Besten im Internet nach. Entweder Microsoft direkt : Google-Suche nach : MSDN Attributes ADSI oder bei SelfADSI : http://www.selfadsi.de/user-attributes.htm Die Collection als Hilfsmittel für Schleifenstrukturen Schwierig wird es mit der bisher beschriebenen Methode beim Zugriff auf Container. Will man zum Beispiel die Namen aller Objekte innerhalb eines Containers wissen, können das unter Umständen sehr viele sein, und die Anzahl ist unbekannt. Man nennt dies eine Collection. Hierzu verwendet man am Einfachsten die for..each – Schleife : Set apfel = GetObject (“LDAP://ou=A, dc=dv-script, dc=tsm, dc=de”) for each gefundenes in apfel seinname = gefundenes.samaccountname msgbox(seinname) next Diese Schleife läuft solange, wie Objekte gefunden werden. IM ÜBUNGSTEIL : Praktikum ADSI leicht IM ÜBUNGSTEIL : Praktikum : ADSI schwer 44 Internettechnologien Client/Server-Struktur Request Client Response Server Ein Client ist ein Programm das einen Dienst (Service) von einem anderen Gerät anfordert. Das kann das Schicken von Daten oder auch eine mechanische Funktion sein. Ein Server ist ein Programm, das eine Funktion auf Anforderung ausführt. Die Anforderung des Dienstes heißt Request (Service-Request), das Erbringen des Dienstes wird Response genannt. Der Client ist also ein Requester, der Server ein Responder. Beispiel : Ihr Nachbar spielt READ-Responder, sie sind der READ-Requester. Der Dienst heißt READ, er beinhaltet das Lesen des ersten Buchstabens auf einer Seite. 1) Sie (Client) sprechen einen READ-Request aus 2) Ihr Nachbar (Server) kann diesen erst mal quittieren oder nicht (beides gibt’s) 3) Ihr Nachbar führt den READ-Dienst aus, er liest den Buchstaben 4) Ihr Nachbar schickt einen READ-Response. Das bedeutet erst mal nur, daß er den READ gemacht hat. Ob er ihnen den Buchstaben auch sagt, hängt von der Definition des READ-Dienstes ab. 45 HTTP-Request Im Internet wird nun bei Diensten mit angegeben, welches Protokoll zur Kommunikation benutzt wird. Das Protokoll bestimmt dann auch, wie die Dienste im Detail aussehen. Der übliche Weg im Internet ist die Aussprache eines HTTP-Request durch eine ClientSoftware (meist ein Browser) und dessen Beantwortung durch den HTTP-Response des Serverprogramms. Der Transport durch TCP/IP geschieht standardmäßig über SAP („Port“) 80. Das Adressformat für einen korrekten HTTP-Request sieht so aus : Socket in TCP/IP http://www.ts-muenchen.de:80/index.html Protokoll Service AccessPoint Server-Root DNS-Name der Servermaschine (IP geht auch) Dieses Format heißt Uniform Resource Locator (URL) www ist hier kein Protokoll oder so, der Server hat diesen Hostnamen ! 46 Dokument(Pfad..) Apache-Server Als Serverprogramme sind viele Alternativen möglich, der Windows-Server (bei den Serverbetriebssystemen von Microsoft enthalten) heißt IIS (Internet Information Server). Am meisten verbreitet ist jedoch eine OpenSource – Variante, der Apache Server Die wesentlichsten Komponenten und Dateien sehen Sie hier : Der eigentliche Server (HTTP-Responder) Apache Konfigurationsfile : httpd.conf wird bei Serverstart gelesen …….. …….. Document-Root, das Verzeichnis, in dem alle Webseiten gespeichert sind cgi …….. …….. …….. …….. Der cgi-Mechanismus sorgt dafür, daß die Clients ihre Antworten (an die richtige Adresse) kriegen. (Erklärung später …) alle Zugriffe werden im access.log protokolliert Fehler (Zugriffsfehler) werden im error.log gespeichert Bei einer Windows-Standardinstallation entpacken sie das Serverpaket XAMPP auf ihrem Rechner (eXtended Apache Mysql Perl Php), da haben sie dann ‘ne Datenbank und 2 Programmiersprachen gleich mitinstalliert. Sie finden dann in C: einen Xampp-Pfad, und darin die oben abgegebene files. IM ÜBUNGSTEIL : Praktikum ApacheInbetriebname 47 Interaktives HTML Gemeint ist hier, daß Der Webserver nicht nur wie bei simplen Webseiten einfach durch Schicken von HTML-Code als Response antwortet, sondern daß am Client erhobene Daten zum Server geschickt und verarbeitet werden. Das ist die technische Grundlage von ecommerce. Für die Datenverarbeitung sind hier prinzipiell 2 Varianten möglich : a) Client-sided Im Clientsystem werden die (meist vom Benutzer eingegeben) Daten direkt lokal verarbeitet. Der Programmcode steckt in der HTML-Seite, die vorher vom Server geholt wurde. Sprache : Java oder Varianten. b) Server-sided Am Client werden Daten zwar erfasst (meist im Browser durch Eingabefelder o.Ä), dann aber nicht lokal verarbeitet, sondern an den Server geschickt, und dort verarbeitet. Sprache : früher PERL, heute meist PHP. Die Variante a) ist schneller, hat aber den Nachteil, daß eine ungünstige Clientkonfiguration die Verarbeitung behindern oder unmöglich machen kann. Variante b) ist wegen der nötigen Übertragung langsamer, aber der Programmierer weiß, wie seine Maschine konfiguriert ist, und es läuft sicher … Bei e-commerce wird man alle Programmfunktionen, die dem Komfort und dem Design dienen, client-sided ausführen, alle Funktionen die zum Gelingen des Geschäftsprozesses unabdingbar sind, server-sided. 48 Wir gehen nun im Folgenden davon aus, daß ein Client eine Webseite anfordert, die dann einen wie oben beschriebenen Vorgang server-sided ermöglichen soll. 1) Client schickt (vom Benutzer ausgelöst) einen http-Request : Apache HTTP-Request Server-Rechner mit Apache-Installation Client-Rechner mit Browser 2) Der Server sucht das Dokument im angegebenen Pfad (unter Document-Root), und schickt es an den Client. In diesem HTML-File sind graphische Elemente enthalten, die dem Benutzer die Eingabe von Daten ermöglichen (Textfelder usw..) : html-forms http-Response Apache 49 3) Der Benutzer schreibt seine Daten rein, und schickt sie mit einem Knopfdruck im Browser wieder an den Server. Im HTML-Form ist auch eine Information enthalten, welches Programm im Server nun diese Daten bekommen und verarbeiten soll : form-action Dies ist wieder eine HTML-Seite mit der Besonderheit, daß ausführbarer Code (meist PHP) enthalten ist. Apache holt sich diese Seite wieder aus Document-Root, und prüft nun (Steuer-Tags auf der Seite) welche Teile davon er dem PHP-Interpreter zur Verarbeitung weitergeben muß PHP Apache Der Programmteil auf der Seite (meist ein PHP-Skript) bekommt die Daten, verarbeitet sie, und schickt möglicherweise auch eine Antwort in Form einer Ausgabe. Diese Ausgabe wird nun aber natürlich nicht am Monitor des Servers angezeigt, sondern zurück zum Client geschickt, und dort an den Browser zur Anzeige übergeben. Diese Funktion (Ausgabe des richtigen Skripts an den richtigen Client im Internet) leistet das common gateway interface (cgi). PHP cgi 50 HTML-Forms Um das Ausprobieren zu können, benötigen wir nun zunächst die Eingabemöglichkeit am Browser, das HTML-Form. Hier der elementare Kern , in eine HTML-Seite reingeschrieben : Definition des HTML-Forms „action“ gibt den Pfad zum Skipt im Server an „method“ wählt die Methode der Datenübertragung <form action= “script.php“ method = “post“> Ihr Vorname lautet : <input type= ”text” name= “vor“> <input type= “submit“> „name“ definiert den Variablennamen des Werts </form> „submit“ ist der Knopf zum Abschicken „input type“ gibt das Eingabefeld in HTML an „text“ ist z.b. ein simples Textfeld Als Datenübertragungsmethode stehen get und post zur Verfügung : Get schickt die Daten einfach sichtbar an die Server-URL mit einem Fragezeichen angehängt Post schickt die Daten unsichtbar und verschlüsselt. Man kann bei der GET-Methode die zu übertragenden Daten auch selber anhängen, und dann mit einer beliebigen anderen Aufrufmethode (z.b. mit einem Link) arbeiten : <a href = "php1.php?var1=eins">php_hier_aufrufen</a> 51 52 PHP PHP ist eine Skriptsprache ähnlich wie VBScript oder so, und auch genauso einfach. So richtig witzig ist es aber in Verbindung mit HTML, weil man da PHP direkt reinschreiben kann. Der Aufruf schaut in HTML so aus : <html> <body> das ist ein test, diese zeile ist normales html <?php print "das hier ist php-code"; ?> </body> </html> So ein File muß dann .phtml oder .php (je nach Serverkonfiguration) heißen, damit der Webserver das kapiert... Hinter jede Zeile ; setzen ! Variable : $name = "Alf"; $zahl = 176; $klasse[1] = "Anton"; $klasse[2] = "Berta"; Eingabe : braucht man nicht, Variablen kommen immer vom HTML-Client Ausgabe : echo $name; print $name; print "Name ist :".$name."<br>"; (identische Funktion..) Der Punkt fügt den Ausdruck zusammen, Html-Tags werden als String ausgegeben. Schleifen, Bedingungen : if ($a>$b) { print "a ist größer"; } if ($a>$b) { print "a größer"; } else { print "b größer"; } $i=1; while ($i<10) { print $i; $i = $i+1; } for ($i=1; $i<10; $i++) { print $i; } ....usw, also das übliche ! 53 Beispiel für server-sided Datenverarbeitung : 1) HTML-File mit enthaltenem HTML-Form. Das wird zunächst aufgerufen : <html> <body> hallo, ich bin html <br><br> <form action = "./aktion.php" method = "post"> <input type=”text” name="alf"><br><br> <input type="submit"> </form> </body> </html> Am Browser erscheint „hallo, ich bin html“ und das Eingabefenster für die form-Daten. Ein Textfeld holt einen String, der als Variable dann „alf“ heißen wird, mit dem „submit“-Knopf wird der Wert an den Server geschickt und das HTML-File „aktion.php“ geladen, welches PHPCode enthält : 2) Die vom Form aufgerufene HTML-Seite aktion.php mit ausführbarem Code drin : <html> <body> hallo, hier HTML ! <?php print „hallo, hier PHP “; print "Die Eingabe war : $_POST[alf]“; ?> </body> </html> Wird vom Apache also aus dem Documentroot geholt, und dann nach dem <?php untersucht. Alles zwischen diesem Zeichen und dem ?> wird an den PHP-Interpreter übergeben. Alle Ausgaben (print..) gehen über den cgi-Mechanismus zurück an den Browser und werden angezeigt. IM ÜBUNGSTEIL : Praktikum : lächerliche PHP-Übung IM ÜBUNGSTEIL : Praktikum : .. immer noch einfach ! 54 grafische Möglichkeiten zur Gestaltung von HTML-Forms : <html> <body> <form action= "./unter/form.php" method ="post"> <input type ="text" name="wort" value="eingabe hier"> <br><br><br> <select name="pizza"> <option value="p1">funghi</option> <option value="p2">mare</option> <option value="p3">rabiata</option> </select> <br><br><br> <input type="radio" name="cash" value="mastercard">mastercard<br> <input type="radio" name="cash" value="visa">visacard<br> <input type="radio" name="cash" value="nix">nix <br><br><br> <input type="submit" value="druckst du hier"> </form> </body> </html> im Browser sieht das so aus : 55 Stringfunktionen in PHP Syntax zur Bearbeitung von Strings finden Sie im Web zur Genüge. Hier nur ein kleiner Einblick : strcmp — Vergleich zweier Strings (Binary safe) strcoll — Locale-basierter Zeichenkettenvergleich strcspn — Ermittelt die Anzahl der nicht übereinstimmenden Zeichen strip_tags — Entfernt HTML- und PHP-Tags aus einem String stripcslashes — Entfernt Quotes aus mit addcslashes behandelten Strings stripos — Findet das erste Vorkommen eines Strings, unabhängig von Groß- und Kleinschreibung stripslashes — Entfernt aus einem gequoteten String alle Quotes stristr — Wie strstr, aber unabhängig von Groß- bzw. Kleinschreibung strlen — Ermitteln der String-Länge strnatcasecmp — String-Vergleich "natürlicher Ordnung" ohne Unterscheidung der Schreibweise strnatcmp — String-Vergleich unter Verwendung einer "natürlichen Ordnung" strncasecmp — Binärdaten-sicherer und groß- und kleinschreibungs-unabhängiger Stringvergleich strncmp — String-Vergleich der ersten n Zeichen (Binary safe) strpbrk — Durchsucht einen String nach einem Zeichen aus einer Gruppe von Zeichen strpos — Sucht das erste Vorkommen des Suchstrings strrchr — Sucht das letzte Vorkommen eines Zeichens in einem String strrev — Kehrt einen String um strripos — Findet das letzte Vorkommen, unabhängig von Groß- und Kleinschreibung strrpos — Findet das letzte Vorkommen eines Zeichens innerhalb einer Zeichenkette strspn — Ermittelt die Länge der am Anfang übereinstimmenden Zeichen strstr — Findet das erste Vorkommen eines Strings strtok — Zerlegt einen String strtolower — Setzt einen String in Kleinbuchstaben um strtoupper — Wandelt alle Zeichen eines Strings in Großbuchstaben um strtr — Tauscht bestimmte Zeichen aus substr_compare — Binärdaten-sicherer Vergleich beginnend an einer bestimmten Position substr_count — Ermittelt, wie oft eine Zeichenkette in einem String vorkommt substr_replace — Ersetzt Text innerhalb einer Zeichenkette substr — Gibt einen Teil eines Strings zurück trim — Entfernt Whitespaces (oder andere Zeichen) am Anfang und Ende eines Strings ucfirst — Verwandelt das erste Zeichen eines Strings in einen Großbuchstaben ucwords — Wandelt jeden ersten Buchstaben eines in einen Großbuchstaben vfprintf — Schreibt einen formatierten String in einen Stream vprintf — Gibt einen formatierten String zurück vsprintf — Gibt einen formatierten String zurück wordwrap — Bricht einen String nach einer bestimmten Anzahl Zeichen um 56 Dateien mit PHP bearbeiten : Dateien werden in PHP wie üblich mit Handles geöffnet : $opfer = fopen(“c:/testdatei.txt“, “w“); (w : schreiben, r : lesen, a : anhängen) dann kann man manipulieren : $werte = fread ($opfer, $zahl); liest eine Zahl von Zeichen aus der Datei $wert = fgetc ($opfer); liest das nächste Zeichen $werte = fgets ($opfer, $zahl); liest Zeichen, maximal bis zum Zeilenende Fwrite ($opfer, $inhalt); schreibt Variableninhalt in Datei …und dann wieder zumachen : Fclose ($opfer); IM ÜBUNGSTEIL : Praktikum : welches Bier schmeckt mir ? IM ÜBUNGSTEIL : Zusatzaufgabe (optional) : Sprachauswahl 57 Ausblick : Dynamische Websites Ein professionelles Webangebot ist meist anders als bisher behandelt aufgebaut. Nehmen wir als Beispiel Amazon : Wenn man für jeden Artikel eine eigene Webseite (.html) schreiben müßte, wäre der Aufwand nicht zu bewältigen. Das geht anders : ein allgemeines Seitengerüst (Design und so) wird dynamisch mit immer neuen Inhalten gefüllt. Diese Inhalte kommen aus einer Datenbank. Es gibt hier drei völlig verschiedene Aufgaben zu erledigen : 1) Das Seitengerüst und vor allem die Struktur der Datenbank, die dann die Inhalte beisteuert, muß entwickelt werden. Eine Aufgabe für den Software-Entwickler. 2) Die Inhalte müssen in die Datenbank „eingepflegt“ (tolles Wort, oder ? … meint : hineingeschrieben) werden. Das macht entweder ein tool (siehe z.b. Autoscout oder Ebay, da machts der Kunde praktisch selber) oder eben ein MItarbeiter, wie z.b. bei einem Webshop (Amazon z.b.), der das eingibt. 3) Die Inhalte müssen dann für den Kunden veröffentlicht werden. Heute üblicherweise natürlich mit einer Weboberfläche. Für alle drei Vorgänge brauchts eine Datenbank sowie eine Programmiersprache, die den Zugang herstellt. Das macht man heute meist mit der Structured Query Language (SQL) Datenbanken, die mit dieser Sprache bedient werden können, werden als SQL-Datenbanken bezeichnet. Ein kommerzielles Beispiel ist ORACLE (das finden Sie z.b. auf dem ERP-Server der digitalen Fabrik der Technikerschule), ein OpenSource-Produkt wäre z.b. mySQL (das bei unseren Apache-Installationen mit XAMPP mitinstalliert wurde). Im Weiteren betrachten wir zunächst den Datenbankentwurf und dann den Zugriff auf die Datenbank aus dem Web über PHP und SQL. 58 Datenbanken SQL - Datenbank SQL-Datenbanken sind simpel aufgebaut : Innerhalb der Datenbank (database) sind die Informationen in Tabellen (tables) gespeichert. Die Daten (dataset, entity) werden zeilenweise in die Tabellen eingetragen, die Spalten (attribute) bezeichnen die Informationsteile. database “Werkstattverwaltung“ Attribute Einträge, Datensätze table “Mitarbeiter“ Nummer Name Abteilung Telefon 123 Maier EDV 12212 124 Müller Werkstatt 456645 table “Fahrzeuge“ KFZNummer Typ Farbe 59 Zwischen den Einträgen bestehen Beziehungen (Relationen), deshalb werden solche Datenbanken als relationale Datenbanken bezeichnet. Für diese Beziehungen und den Aufbau der Tabellen (Attributstruktur) gibt es nun Regeln, die dafür sorgen sollen, daß die Datenbank Informationen so speichert, daß sie jederzeit eindeutig zu finden sind und widerspruchsfrei auch bei jeder Frage die gleiche Antwort kommt. Zunächst zwei grundliegende Forderungen an den Aufbau der Tabellen : 1) Primary key Jede Tabelle benötigt ein Attribut, das eindeutig die Suche nach einem Eintrag ermöglicht. Hierzu ein paar Fachbegriffe : Ein Schlüsselkandidat ist ein Attribut, das die eindeutige Identifizierung jedes Eintrags ermöglicht. Davon kann es mehrere geben. Ein Schlüsselkandidat kann sich auch aus der Kombination von mehreren Attributen ergeben (Beispiel : Eine Personalausweisnummer kann z.b. in Österreich und Kanada gleich sein. Dann kombiniert man einfach Personalausweisnummer und Land, und erhält damit Eindeutigkeit ). Das ist dann ein zusammengesetzter Schlüssel. Aus den Schlüsselkandidaten muß einer gewählt werden, der dann Primärschlüssel oder primary key genannt wird. Oft wird er Einfachheit halber eine fortlaufende Nummer hierfür benutzt. 60 2) Redundanzfreiheit Eine Information, und das ist hier immer der Zusammenhang zwischen zwei Einträgen : also zum Beispiel daß Frau Maier in der EDV arbeitet (Maier - EDV), darf in einer database nur einmal vorkommen. Steht zum Beispiel in der table Mitarbeiter ein Attribut Name und ein Attribut Abteilung, und in der table Personalräte steht wieder Name und Abteilung : Mitarbeiter Nummer Name Telefon Abteilung 1332 Maier asffsd EDV Personalräte Nummer Name Abteilung e-mail 12 Maier EDV [email protected] Dann kann folgendes passieren : Frau Maier wird befördert, und steigt von der EDV in die Firmenleitung auf. Die Sekretärin macht die Datenbank auf, und speichert dies, indem sie in der table Mitarbeiter EDV nach Leitung ändert. Nun fragen zwei verschiedene Mitarbeiter irgendwann die Datenbank ab, und die eine Frage geht nach Mitarbeiter, die andere nach Personalräte. Einmal kommt raus, daß Frau Maier in der EDV arbeitet, einmal, daß sie Mitarbeiter der Geschäftsleitung ist. Man nennt dies eine Inkonsistenz, die dann nicht vorkommen kann, wenn die Beziehung Name <-> Abteilung nur einmal gespeichert ist. Es gibt darüber hinaus eine ganze Reihe von Anforderungen, die Datenbankstrukturen erfüllen müssen, um effizient und fehlerfrei arbeiten zu können. Hier gibt es Regelwerke, die eingehalten werden sollen : Normalformen z.b. : http://de.wikipedia.org/wiki/Normalisierung_(Datenbank) …das ist, um es optimistisch zu sagen, nicht unkompliziert ;-) 61 Nun wollen wir aber nicht große Datenbanksysteme für Unternehmen entwickeln, sondern nur eine kleine SQL-Datenbank benutzten, um unseren Webserver zu unterstützen. Meist wird sogar eine table genügen. Deshalb genügt hier ein einfacheres Entwurfssystem, das einige Forderungen der Normalisierung relativ einfach erfüllt, das ER-Modell. ER – Modell (entity-relationship) Gleich am Beispiel einer Schuldatenbank gezeigt : Die Database heißt Schule, der Entwurf beinhaltet drei tables : Lehrer, Schüler, Klassen. Die tables werden als Rechteck oder so gezeichnet, der primary key jeweils mit einem # davor als erster Eintrag und dann alle Attribute (wichtig : Attribute, keine Daten !!) : Schüler #Schülernummer Name Vorname Alter usw… Klassen #Klassenbezeichner Stammsaal Fachrichtung Schülerzahl usw.. Lehrer #Lehrernummer Name Vorname Hauptfach usw… hier werden nun die Beziehungen (Relationen) eingetragen, und zwar als Linien zwischen den jeweiligen Attributen : Schüler #Schülernummer Name Vorname Klasse usw… Klassen #Klassenbezeichner Stammsaal Fachrichtung Lehrer usw.. 62 Lehrer #Lehrernummer Name Vorname Hauptfach usw… und dann werden diese Beziehungen untersucht : 1. Frage : Ich setze mich in die table Schüler, und blicke in Richtung Klassen. Nun frage ich : kommt ein Element hier ( = ein Schüler) in der Zieltabelle Klassen einmal oder öfter vor ? (Ist ein Schüler in einer oder in mehreren Klassen ?) -> Antwort : Einmal ! Diese 1 wird jetzt an der Linie am Zielelement angeschrieben : Schüler Klassen 1 #Schülernummer Stammsaal Vorname Klasse #Klassenbezeichner Name Fachrichtung Lehrer usw… usw.. 2. Frage : Nun setze ich mich in die table Klassen, und blicke in Richtung Schüler. Kommt ein Element aus meiner table in der Zieltable einmal oder öfter vor ? Antwort : öfter ! (eine Klasse steht bei mehreren Schülern dabei) Dieses „öfter“ wird als n (oder m) an der Zieltable angeschrieben : Schüler Klassen 1 #Schülernummer Stammsaal Vorname Klasse usw… #Klassenbezeichner Name Fachrichtung Lehrer n usw.. Diese Aussage nennt man nun Kardinalität, oben besteht eine 1:n –Kardinalität. 63 Man macht diese Untersuchung nun für alle Beziehungen, die zwischen den tables einer database bestehen. Dabei können folgende Ergebnisse auftreten : 1:n-Kardinalität Alles prima, das kann so bleiben ! 1:1 – Kardinalität Schlecht, ist verboten. Hier kann aber immer aus den beiden tables eine einzige gemacht werden. n:m – Kardinalität Auch schlecht, auch verboten. Hier muß in der Regel eine Zwischentablelle gefunden werden, die für eine Entkoppelung der unerlaubten Kardinalitäten sorgt. Beispiel für n:m Klassen Lehrer #Klassenbezeichner Stammsaal Fachrichtung Lehrer #Lehrernummer Name Vorname Hauptfach usw.. usw… Die Beziehung von Lehrer und Klassen untersucht : 1. Frage : Aus Sicht von Klassen : kommt ein Element aus Klassen (die TE2b z.b) bei einem oder bei mehreren Lehrern vor ? Klar, es unterrichten mehrere Lehrer in der Te2b -> n ! 2. Frage Aus Sicht von Lehrer : kommt ein Element aus Lehrer (z.b. der Doll) in einem oder mehreren Klassen vor ? Wieder klar, Doll hat Unterricht in mehreren Klassen -> m ! 64 Das ist also eine n:m – Kardinalität, und die ist verboten ! Überlegen wir also eine (möglichst sinnvolle) Zwischentable, die hier für Ordnung sorgt. Optimal wäre hier eine Liste, die irgendwie in jeder Zeile eine Beziehung zwischen den beiden primary keys aus den ursprünglichen tables herstellt. Ich nenne das mal „Einsatzplan“, man könnte auch einen „Stundenplan“ draus machen : Einsatzplan Klassen #Klassenbezeichner Stammsaal Fachrichtung Lehrer Lehrer #Einsatznummer Zeit Klasse Lehrer #Lehrernummer Name Vorname Hauptfach usw.. usw… Wieder die zwei Fragen, jeweils an den Beziehungen gestellt : Klassen -> Einsatzplan : Kommt eine Klasse im Einsatzplan öfter vor ? Ja : n ! Einsatzplan -> Klassen : Kommen in einem Einsatz eine oder mehrere Klassen vor ? Eine : 1 ! Einsatzplan -> Lehrer : Lehrer -> Einsatzplan : Kommen in einem Einsatz ein oder mehrere Lehrer vor ? Einer : 1 ! Kommt ein Lehrer in einem oder in mehreren Einsätzen vor ? n ! Klassen #Klassenbezeichner 1 Stammsaal Fachrichtung Lehrer Einsatzplan n #Einsatznummer Zeit Klasse Lehrer Lehrer n usw.. 1 #Lehrernummer Name Vorname Hauptfach usw… Nun ist alles in Ordnung, das ER-Modell ist korrekt ausgeführt ! IM ÜBUNGSTEIL : Übung : Beziehungsprobleme IM ÜBUNGSTEIL : Übung : Biokiste 65 IM ÜBUNGSTEIL : Übung : Leihbücherei SQL - Datenbank in der Praxis 1. Kontaktaufname mit dem Datenbankmonitor (der mySQL-Server muß laufen ) mysql –u <username> -p <passwort(wenn nötig)> <datenbankname (wenn schon vorhanden)> Falls Sie in UNIX als root angemeldet sind, genügt : "mysql" als Aufruf. Unter Windows ist –u root nötig ! Die mysql.exe finden Sie im XAMPP-Paket in /xampp/mysql/bin . 2. Jetzt kommen die Bedienbefehle. Diese werden immer mit einem ";" abgeschlossen. Wenn das fehlt, bringt der Monitor einen Pfeil als Eingabeaufforderung für weitere Eingaben. CREATE DATABASE datenbankname ; Eine neue Datenbank erzeugen. (Das geht bloß als root) CONNECT datenbankname ; Eine Datenbank öffnen (auch wenn sie gerade erzeugt wurde) CREATE TABLE relationsname (definition,definition,...) ; Damit kann man nun in der Datenbank Relationen anlegen. Beispiel : CREATE TABLE auftrag ( nummer INT NOT NULL AUTO_INCREMENT, datum DATE, kunde VARCHAR(30), primary key (nummer) ); INT ist Integer, DATE ein Datumswert (YYYY-MM-DD), VARCHAR(n) ist n langer Text, das Attribut das zum Primärschlüssel gemacht wird darf nie Null sein (NOT NULL), mit AUTO_INCREMENT zählt das Sytem den Wert selber hoch. SHOW TABLES; zeigt alle Relationen der Datenbank an. SHOW COLUMNS FROM table; zeigt alle Attribute aus der Relation table an. SELECT attribut FROM table; zeigt alle Tupel, die zum Attribut gehören. Wenn das Attribut * gesetzt wird, zeigt es alle Einträge. 66 SELECT attribut FROM table WHERE definition; Mit der Definition können nur Auswahlkriterien genannt werden, z.b "WHERE nummer >4". Es gelten die üblichen Zeichen : > < = != (größer, kleiner, gleich, ungleich). Mit AND und OR kann verknüpft werden. DELETE FROM table; und : DELETE FROM table WHERE definition; Damit können (ausgewählte) Einträge wieder entfernt werden DROP TABLE DROP TABLE <name> löscht eine Relation aus einer Datenbank INSERT INTO INSERT INTO <table-name> (attribut1, attribut2,....) VALUE ('wert1', 'wert2',...) fügt Werte ein Beispiel : INSERT INTO freundin (haarfarbe, gewicht) VALUE ('blond', '56') DELETE FROM DELETE FROM <table-name> WHERE <bedingung> Beispiel : DELETE FROM freundin WHERE gewicht > 60 ... alles klar ? ALTER TABLE ALTER TABLE <table-name> ADD <column-name> <type> fügt eine Spalte ein Beispiel : ALTER TABLE freundin ADD vorname VARCHAR(30) ; ALTER TABLE <table-name> DROP <column-name> löscht eine Spalte .. damit sollte nun alles möglich sein. Natürlich gibt's noch weitere Befehle, die das Arbeiten komfortabler machen, aber die brauchen wir momentan nicht. Sie finden komplette Befehlslisten zuhauf im Internet. IM ÜBUNGSTEIL : SQL-Praxis 67 Datenbankzugriff mit PHP und SQL Da Sie PHP und SQL jetzt beherrschen, ist der Rest simpel. Die nötigen SQL-Befehle werden einfachb in ein PHP-Gerüst eingebaut. Die PHP-Kernsyntax dafür sieht so aus : $result = mysql_query(“hierher_den_sql_befehl“); Ein Programmbeispiel, das aus unserer Freundinnendatenbank alle Namen ausliest : <HTML> <BODY> <?php mysql_connect(localhost, root); mysql_select_db(“freundinnen“); $result = mysql_query(“select name from freundin“); while ($row = mysql_fetch_array($result)) { print “<br>”; print $row[“name”]; } ?> </BODY> </HTML> 68 Erklärung : mysql_connect(localhost, root); Diese Zeile stellt mit root-Kennung auf dem lokalen Rechner Verbindung zur Datenbank her. (Das geht natürlich auch über IP auf einem anderen Rechner) mysql_select_db(“freundinnen“); Öffnet die Database „freundinnen“. while ($row = mysql_fetch_array($result)) Solange Werte kommen, holt die Schleife Werte aus $result und schreibt sie in ein Array $row. print “<br>”; Ausgabe beliebiger HTML-Tags in PHP, nichts neues … print $row[“name”]; In der Schleife gelesener Wert aus $result(s.o.) wird aus dem assoziativen Array (egal ;-) gelesen und in HTML ausgegeben. IM ÜBUNGSTEIL : Praxis dynamische Websites 1 IM ÜBUNGSTEIL : Praxis dynamische Websites 2 IM ÜBUNGSTEIL : Praxis dynamische Websites 3 69 Kommunikation in Industrieanlagen ….kommt noch ! 70