ELEKTRONIKSCHULE TETTNANG PROJEKTARBEIT RECHNERNETZWERK MIT INTRANETS Realisierung einer vernetzten Infrastruktur für ein Schülerwohnheim und Programmierung der Wohngruppen-Intranets Erstellt durch: Christoph Blank Dung Phan KUMAvision AG TANNER AG Eingereicht bei Andreas Grella, am 1. Juni 2011 in der Elektronikschule Tettnang Einführung Seite |2 Inhaltsverzeichnis 1. Einführung ...................................................................................................................... 3 2. Planung der Projekttätigkeiten ....................................................................................... 3 3. 2.1. Zeitplanung ............................................................................................................. 3 2.2. Ressourcenplanung ................................................................................................. 3 Technische Problemlösung ............................................................................................. 4 3.1. IP-Adresskonzept .................................................................................................... 4 3.2. Konfiguration und Administration der Netzwerkgeräte ......................................... 5 3.2.1. Grundkonfiguration des Routers: .............................................................................. 6 3.2.2. Grundkonfiguration des Switches .............................................................................. 8 3.3. Einrichtung des Webservers .................................................................................... 8 3.4. Programmierung des Intranets ................................................................................ 9 4. Projektauswertung ........................................................................................................ 10 5. Quellen und Hilfsmittel ................................................................................................ 11 6. Anlagen......................................................................................................................... 12 6.1. Passwörter ............................................................................................................. 12 6.2. Router Konfiguration ............................................................................................ 12 6.3. Switch Konfiguration ............................................................................................ 14 6.4. Intranet Skripte ...................................................................................................... 16 6.4.1. about.php ................................................................................................................. 16 6.4.2. admin.php ................................................................................................................ 16 6.4.3. foot.inc.php .............................................................................................................. 16 6.4.4. guestbook.php ......................................................................................................... 17 6.4.5. head.inc.php............................................................................................................. 17 6.4.6. index.php.................................................................................................................. 18 6.4.7. style.css .................................................................................................................... 19 6.5. Datenbank Konfiguration ...................................................................................... 20 6.6. Abnahmeprotokoll................................................................................................. 21 Einführung Seite |3 1. Einführung Das Schülerwohnheim Tannenbusch e.V. hat mehrere Stockwerke. Die Wohngruppen verwalten künftig ihr eigenes Teilnetz (inkl. Intranet). Ziele des Projektes sind die Realisierung einer vernetzten Infrastruktur und der webbasierten Informationsplattformen (Intranets) der einzelnen Wohngruppen. Die Rechnernetzwerke der einzelnen Geschosse müssen außerdem miteinander vernetzt werden. Hierfür sind die Netzwerkgeräte zu verkabeln und zu konfigurieren. Für jedes Stockwerk muss ein linuxbasierter Webserver aufgesetzt und ein Intranet programmiert werden.1 2. Planung der Projekttätigkeiten 2.1. Zeitplanung In der Planungsphase wurde mit folgenden Zeiten gerechnet. Aufgabe Zeitschätzung Hauptverantwortliche IP Adressplanung Netzwerkdiagramm erstellen 1,00 h Blank Konfiguration von Router und Switch Switch 1,00 h Dung Router 1,00 h Dung Einrichten von Virtual Machines Client Konfiguration 0,75 h Dung Server 1,5 h Programmierung Intranet Frontend 1,00 h CBL Pizza Gutschein 0,75 h CBL Gästebuch 1,50 h CBL Übergreifende Konfiguration 1,00 h Dung Dokumentation 4,00 h Summe 13,00 h Verfügbare Zeit 15,00 h Puffer 2,00 h 2.2. Ressourcenplanung Für die Projektarbeit werden folgende Ressourcen benötigt. 1 1 Router (Cisco 2600) 1 Switch (Cisco Catalyst 2950) 3 Netzwerkkabel 2m 1 Konsolenkabel, 1 serielles Kabel Projekt: Rechnernetzwerk mit Intranets – Aufgabenstellung, Seite 1 Technische Problemlösung Seite |4 2 Windows XP Rechner ausgerüstet mit folgender Software o VMware Player o Quelltexteditor für Programmierung o Word und Excel o Packet Tracer o Browser (z.B. Firefox) o Snag it OpenSuse Image 3. Technische Problemlösung 3.1. IP-Adresskonzept Aufgrund der hohen Anzahl an Clients ist es unabdinglich mehrere Subnetze zu bilden um eine angemessene Performance im gesamten Netzwerk gewährleisten zu können. Die Aufgabenstellung beschreibt elf Gruppennetzte die wiederum durch elf Verbindungsnetzte mit einem Internet Service Provider verbunden werden. Daraus ergibt sich eine LinienTopologie aus elf Routern (ausschließlich dem des ISP) an den jeweils ein Switch mit wiederum jeweils 100 Clients angeschlossen werden. Ausgehend von dem Netz 172.16.8.0/21 führt dies zu folgendem in Abbildung 1 ersichtlichen theoretischem Adresskonzept. Technische Problemlösung Seite |5 Abbildung 1: Theoretisches Adresskonzept 3.2. Konfiguration und Administration der Netzwerkgeräte Ausgehend von den Vorgaben des theoretischen Konzepts wurde das internes Netzwerk wie in Abbildung 2 geplant und aufgebaut. Cisco 2600 Series Cisco Catalyst 2950 Server läuft als VM auf PC Abbildung 2: geplante Netzwerktopologie Am FastEthernet 0/0 Port (kurz Fa0/0) des Cisco 2600 Routers wird ein 24-Port-Switch vom Typ Cisco Catalyst 2950 mittels Patchkabels2 am Port Fa0/1 angeschlossen. Die beiden Arbeitsplatzrechner sind via Patchkabel mit dem Switch über die Ports Fa0/2 und Fa0/3 verbunden. 2 Shielded Twisted Pair, Kategorie 5 Technische Problemlösung Seite |6 Anhand einer IP-Tabelle wurde die Netzwerkinfrastruktur in Details geplant: Device openSUSE-Gr5 PC1-Gr5 PC2-Gr5 Router-Gr5 Switch-Gr5 IP-Adresse 172.16.5.100 172.16.5.1 172.16.5.2 172.16.5.126 172.16.109.2 172.16.105.1 172.16.5.125 Subnetzmaske 255.255.255.128 255.255.255.128 255.255.255.128 255.255.255.128 255.255.255.0 255.255.255.0 255.255.255.128 Typ Linux-VM/Webserver Desktop Desktop Cisco 2600 WAN Serial DTE WAN Serial DCE Cisco Catalyst 2950 Port (Quelle) Port (Ziel) Ethernet Ethernet Fa0/0 Serial0/0 Serial0/1 VLAN1 Fa0/2 Fa0/3 Fa0/1 Zur Grundeinrichtung des Routers und des Switches wurde ein serielles Konsolenkabel genutzt, über welches vom PC1 eine Putty-Session zum jeweils zu konfigurierenden Gerät mit den folgenden Einstellungen aufgebaut wurde: 9600 Baud 8 Datenbit Keine Parität 1 Stoppbit Keine Flusssteuerung 3.2.1. Grundkonfiguration des Routers Die Konfiguration des Routers wurde wie folgend beschrieben vorgenommen. Die Ergebnisse wurden in der startup-config im Anhang dokumentiert. Ferner wurden Testergebnisse im Abnahmeprotokoll festgehalten. 3.2.1.1. Absicherung des Routers Im Global Configuration Mode wurde das Passwort des Privileged Mode eingerichtet. Die Zugänge für Konsole (console 0) und Telnet (vty 0 4) wurden ebenfalls mit einem Passwort abgesichert. Die Passwortverschlüsselung wurde aktiviert um die Passwörter in der Konfiguration nicht im Klartext erscheinen zu lassen. 3.2.1.2. Konfiguration der Schnittstellen Der FastEthernet-Schnittstelle Fa0/0 des Routers wurde die statische IP-Adresse 172.16.5.126 mit der Subnetzmaske 255.255.255.128 (/25) zugewiesen. Nachdem zusätzlich eine Beschreibung für diese hinzugefügt wurde, schalten wir sie mit no shutdown ein. Technische Problemlösung Seite |7 Die serielle Schnittstelle Serial0/0 stellt die Verbindung zum (vom ISP-Router aus betrachtet) dahinter liegenden Netzwerk 172.16.9.0/24 her und bekommt die IP-Adresse 172.16.109.2/24. Sie wird ebenfalls mit einer Beschreibung versehen und eingeschaltet. Die Schnittstelle Serial0/1 des Routers dient als Taktgeber der seriellen Verbindung zum zwischen uns und dem ISP-Router liegenden Netzwerk 172.16.11.0/24. Ihre IP-Adresse wurde auf 172.16.105.1/24 und die Taktrate auf 56000bps festgelegt. Vor der Aktivierung der Schnittstelle wurde ein Beschreibungstext angegeben. 3.2.1.3. Konfiguration globaler Parameter Dem Router wurde im Global Configuration Mode der Hostnamen Router-Gr5 zugewiesen. Als Message of the day (motd) wurde eine Begrüßung mit den Namen der Gruppenmitglieder gewählt. Ein Sicherheitshinweis wird in Form eines login-Banners ausgegeben. Die Konfigurationsänderungen in der running-config wurde dauerhaft in die startup-config gespeichert und zusätzlich per TFTP3 lokal in unserem Arbeitsordner auf PC1 abgelegt. 3.2.1.4. Konfiguration des statischen Routing Es wurden auf unserem Router statische Routen zu anderen Gruppennetzwerken festgelegt. Beispielsweise werden mit der statischen Route ip route 172.16.11.0 255.255.255.0 Serial0/1 alle IP-Pakete zum vor uns liegenden Netzwerk 172.16.11.0/24 über die serielle Schnittstelle Serial0/1 gesendet. Das Ergebnis wurde erfolgreich mit einem Ping an den Webserver 172.16.11.100 der Gruppe 11 verifiziert. Analog dazu wurden statische Routen zu allen hinter uns liegenden Gruppennetzwerken über die Schnittstelle Serial0/0 konfiguriert. Für die Verbindung ins Internet über den ISP-Router wurde eine Default-Route über den Router der Gruppe 11 (next hop 172.16.105.2) eingerichtet. 3 Trivial File Transfer Protocol Technische Problemlösung 3.2.1.5. Seite |8 Konfiguration der internen DNS-Tabelle Es wurde eine statische interne DNS-Tabelle für die Namensauflösung des Routers eingerichtet: Host openSUSE-Gr5 PC1-Gr5 PC2-Gr5 Router-Gr5 Switch-Gr5 3.2.2. IP-Adresse 172.16.5.100 172.16.5.1 172.16.5.2 172.16.5.126 172.16.5.125 Grundkonfiguration des Switches Analog zur Konfiguration des Routers wurde der Switch über eine serielle Konsolenverbindung global wie folgt eingerichtet: Sehr sicheres, verschlüsseltes Kennwort für den Privileged Exec Mode erstellt. Zugänge über die Konsole und Telnet wird passwortgeschützt. Passwortverschlüsselung aktiviert. Hostname Switch-Gr5 festgelegt. Banner motd und login erstellt. Die Schnittstelle VLAN1 des Switches wurde mit der IP-Adresse 172.16.5.125/25 konfiguriert und machten ihn damit für die Konfiguration über das Netzwerk mit Telnet erreichbar. Anschließend speicherten wir die Konfigurationsänderung in die startup-config und auf dem TFTP-Server ab. Die komplette Konfiguration ist im Anhang auf Seite 14 zu finden. 3.3. Einrichtung des Webservers Zur Nutzung der Virtual Machine als Webserver wurde openSuse 11.4 eingesetzt. Das Betriebssystem wurde mit den Voreinstellungen installiert. Mit Hilfe von Yast nahmen wir die Paketinstallation vor. Zusätzlich wurden die Apache2, php5, apache2-mod_php5, sendmail, mysql und das mysqladmin Pakete installiert. Der Netzwerkkarte des Servers wurde die IP-Adresse 172.16.5.100/25 zugeteilt. Als Default-Gateway wurde die IP-Adresse unseres Routers (172.16.5.126) im Reiter Routing eingetragen. Technische Problemlösung Seite |9 Zur Konfiguration der Firewall wurde festgelegt, dass die Server-Dienste HTTP-Server und MySQL-Server über das externe Netzwerk erreichbar sein sollen. Des Weiteren wurden die Dienste Apache, MySQL und SSH in der Runlevel-Konfiguration aktiviert. Zur Konfiguration des MySQL-Servers richteten wir zunächst mit Hilfe des MySQL Workbench auf der Linux-VM einen root-Benutzer mit allen globalen Privilegien zur Administration ein. Anschließend meldeten wir uns als root-Benutzer über MySQL Workbench 5.2 vom PC1 aus an und legten einen neuen User gruppe5 an, welcher nur über die nötigsten Objektprivilegien für die Datenbank verfügt. Im Anschluss daran wurde eine Datenbank project und eine Tabelle guestbook für das Hinterlegen der Gästebuchdaten angelegt. 3.4. Programmierung des Intranets Die Entwicklung des Intranets gliedert sich in drei Hauptaufgaben: HTML/CSS-Frontend Gutscheinsystem Gästebuch Im Frontend wurden eine Startseite, ein Gästebuch und eine Seite zur Vorstellung der Wohngruppe erstellt. Die Gestaltung wurde in Cascading Style Sheets definiert. Um Änderungen am Design und der Struktur der Website zu erleichtern wurden zwei PHP-Dateien die jeweils am Anfang (head.inc.php) und am Ende (foot.inc.php) des eigentlichen Dokuments, unter Benutzung der include Funktion ausgeführt werden. Diese Dateien enthalten zum Beispiel die Definition des Doctypes und des Titles. Beim Gutscheinsystem handelt es sich um einen erweiterten Besucherzähler. Die Daten (aktueller Zählerstand und letzter Gutscheincode) werden unter Anwendung von PHP in eine Textdatei geschrieben. Der inkrementierte Zählerstand und der letzte Gutscheincode werden mit Hilfe der explode und implode Funktionen durch ein Verkettungszeichen4 verbunden bzw. getrennt. Wenn der Zählerstand restfrei durch 100 teilbar ist (Modulo Division) wird eine Meldung mit einem Zufallscode (Ganzzahl zwischen 1000 und 9999) angezeigt. Danach kann der Benutzer ganz normal durch das Hauptmenü navigieren. Nach ak4 ‘|’; Unicode: U+007C Projektauswertung S e i t e | 10 tueller Programmierung wird jedes Mal wenn die Home Seite geladen wird der Zähler erhöht. Es ist technisch möglich den Zähler für jeden Besucher nur um eins zu erhöhen. Hier müsste man entweder die IP-Adresse protokollieren oder mit Sessions arbeiten. Das Gästebuch wurde sehr einfach gehalten. Der Benutzer kann alte Einträge lesen und neue Nachrichten unter Verwendung eines HTML-Formulars eingeben. Die Daten werden dann via POST an das Skript übertragen. Die Daten werden in einer MySQL Datenbank auf dem Server hinterlegt. Gespeichert werden eine Automatisch vergebene Ganzzahl ID (Auto_Increment), das aktuelle Datum, der eingegebene Name und die eingegebene Nachricht. Nach erfolgreichem Speichern der Nachricht wird dies dem Benutzer visuell bestätigt. 4. Projektauswertung Abschließend lässt sich sagen, dass das Projekt erfolgreich beendet werden konnte. Es wurden alle geforderten Aufgaben erfolgreich abgeschlossen und auch einige der Zusatzaufgaben konnten zufriedenstellend bearbeitet werden. Wir haben viel über die angewendeten Techniken und über uns selbst lernen können. Da Christoph Blank sich maßgeblich im Softwarebereich auskennt und Dung Phan sich auf die Netzwerkkonfiguration spezialisiert hat, konnten wir uns mit unseren Stärken gegenseitig ergänzen und funktionierten als Team sehr gut. Darüber hinaus konnten wir auch anderen Gruppen helfen die im Umgang mit verschiedenen Techniken bisher wenige Erfahrungen sammeln konnten. Während unserer Arbeit mussten wir erkennen das wir aufgrund unserer mangelnden Erfahrung im Projektmanagement teilweise weit von den geschätzten Zeiten entfernt lagen. Ursprünglich hatten wir geplant den Großteil der Aufgaben gemeinschaftlich zu bearbeiten um den Lernerfolg zu maximieren. Doch dies wäre uns zeitlich am Ende zu knapp geworden und so arbeiteten wir parallel an verschiedenen Aufgaben. Aufgrund des Zeitdrucks war es uns auch nicht möglich auf weitere Problematiken im Bereich des Intranets einzugehen. So wäre beispielsweise eine SQL-Injection problemlos möglich. Quellen und Hilfsmittel S e i t e | 11 5. Quellen und Hilfsmittel Um uns das teilweise fehlende Fachwissen über MySQL Datenbankzugriffe via PHP anzueignen nutzten wir das Tutorial von PHP für dich5. Des Weiteren wurde die SelfHTML6 Dokumentation genutzt um bereits gelerntes Nachzuschlagen. Um unser IP-Adresskonzept zu überprüfen nutzen wir den VLSM (CIDR) Subnet Calculator7. Für das Erstellen dieser Dokumentation wurden Word, Excel und Visio aus dem Microsoft Office Paket genutzt. Screenshots wurden mit Snagit von TechSmith angefertigt. Für die Virtual Machine, welche wir im VMware Player laufen ließen, nutzten wir openSuse 11.4. Für die Programmierung des Intranets wurde aufgrund des Syntax Highlightings Notepad++ genutzt. Zum Testen des Intranets wurde sowohl Firefox in den Versionen 3 und 4 wie auch der Internet Explorer 6 und 8 genutzt. Die Verwaltung der MySQL Datenbank wurden mit dem MySQL Workbench durchgeführt. Die Verbindung zu Router und Switch stellten wir über die Terminalemulations-Software PuTTY her. 5 http://www.schattenbaum.net/php/ http://de.selfhtml.org/ 7 http://www.vlsm-calc.net/ 6 Anlagen S e i t e | 12 6. Anlagen 6.1. Passwörter 6.1.1. Router + Switch Konsolen- und Telnetzugang: gruppe5 Privileged Execute Mode: admin Enable Mode: admin 6.1.2. Web-Server Root-Passwort: root User: operator Password: operator 6.1.3. MySQL-Datenbank: Datenbank: project User: gruppe5 Passwort: gruppe5 6.2. Router Konfiguration ! version 12.2 service timestamps debug uptime service timestamps log uptime service password-encryption ! hostname Router-Gr5 ! enable secret 5 $1$VAhm$qEfSEzSgJNWPp814I5ymV. ! ip subnet-zero ! ! ! ! ! ! interface FastEthernet0/0 description Verbindung zu Switch-Gr5 ip address 172.16.5.126 255.255.255.128 duplex auto speed auto ! interface Serial0/0 Anlagen S e i t e | 13 description Verbindung zu Gruppennetz 172.16.9.0 Serial0/3/0 ip address 172.16.109.2 255.255.255.0 no fair-queue ! interface FastEthernet0/1 description FastEthernet0/1 Gruppe 5 no ip address shutdown duplex auto speed auto ! interface Serial0/1 description Verbindung zum Gruppennetz 172.16.11.0 Fa0/3/0 ip address 172.16.105.1 255.255.255.0 clock rate 56000 ! ip classless ip route 0.0.0.0 0.0.0.0 172.16.105.2 ip route 172.16.1.0 255.255.255.0 Serial0/0 ip route 172.16.2.0 255.255.255.0 Serial0/0 ip route 172.16.3.0 255.255.255.0 Serial0/0 ip route 172.16.4.0 255.255.255.0 Serial0/0 ip route 172.16.6.0 255.255.255.0 Serial0/0 ip route 172.16.7.0 255.255.255.0 Serial0/0 ip route 172.16.8.0 255.255.255.0 Serial0/0 ip route 172.16.9.0 255.255.255.0 Serial0/0 ip route 172.16.10.0 255.255.255.0 Serial0/0 ip route 172.16.11.0 255.255.255.0 Serial0/1 ip http server ! banner login # Router-Gr5 ist mit einem verschluesselten Passwort abgesichert! # banner motd # Gruppe 5: Christoph Blank, Dung Phan. # ! line con 0 password 7 00030113144B0E53 login line aux 0 line vty 0 4 password 7 15151919143A2E71 login ! end Anlagen 6.3. Switch Konfiguration ! version 12.1 no service pad service timestamps debug uptime service timestamps log uptime service password-encryption ! hostname Switch-Gr5 ! enable secret 5 $1$C9eu$7XRtuqAtbxfHI9mrPr7FX/ ! ip subnet-zero ! ip host openSUSE-Gr5 172.16.5.100 ip host Switch-Gr5 172.16.5.125 ip host Router-Gr5 172.16.5.126 ip host PC2-Gr5 172.16.5.2 ip host PC1-Gr5 172.16.5.1 ip ssh time-out 120 ip ssh authentication-retries 3 ! spanning-tree mode pvst no spanning-tree optimize bpdu transmission spanning-tree extend system-id ! ! ! ! interface FastEthernet0/1 description Verbindung zu Router-Gr5 Fa0/0 ! interface FastEthernet0/2 description Verbindung zu PC1-Gr5 ! interface FastEthernet0/3 description Verbindung zu PC2-Gr5 ! interface FastEthernet0/4 ! interface FastEthernet0/5 ! interface FastEthernet0/6 ! interface FastEthernet0/7 ! interface FastEthernet0/8 ! interface FastEthernet0/9 ! interface FastEthernet0/10 ! interface FastEthernet0/11 ! interface FastEthernet0/12 ! interface FastEthernet0/13 ! S e i t e | 14 Anlagen S e i t e | 15 interface FastEthernet0/14 ! interface FastEthernet0/15 ! interface FastEthernet0/16 ! interface FastEthernet0/17 ! interface FastEthernet0/18 ! interface FastEthernet0/19 ! interface FastEthernet0/20 ! interface FastEthernet0/21 ! interface FastEthernet0/22 ! interface FastEthernet0/23 ! interface FastEthernet0/24 ! interface Vlan1 description VLAN1 Switch_Gr5 ip address 172.16.5.125 255.255.255.128 no ip route-cache ! ip http server banner login #Gruppe5: ChrBla, DunPha. # banner motd # Switch-Gr5 ist mit einem verschluesselten Passwort abgesichert. # ! line con 0 password 7 10491B0C1507175E login line vty 0 4 password 7 08265E5B19090042 login line vty 5 15 password 7 08265E5B19090042 login ! ! end Anlagen S e i t e | 16 6.4. Intranet Skripte 6.4.1. about.php <?php include('head.inc.php'); ?> <h1>Wir &uuml;ber uns</h1> <ul> <li><a href="#blank">Blank</a></li> <li><a href="#phan">Phan</a></li> </ul> <h2><a name="blank"></a>Christoph Blank</h2> <p> <img src="images/blank.jpg"> Da es hier wohl kaum um den Text geht gibts ab jetzt nur noch Blindtext. Lorem ipsum dolor sit amet[…]</p> <h2><a name="phan"></a>Dung Phan</h2> <p> <img src="images/phan.jpg"> Sed aliquam ultrices mauris. […]</p> <?php include('foot.inc.php'); ?> 6.4.2. admin.php <?php mysql_connect("172.16.5.100", "gruppe5","gruppe5") or die ("Keine Verbindung moeglich"); mysql_select_db("project") or die ("Die Datenbank existiert nicht."); if (isset($_GET["delete"])) { $eintragen = mysql_query("DELETE FROM guestbook WHERE id = '".$_GET["delete"]."'"); echo "<p>Eintrag gel&ouml;scht</p>"; } $abfrage = "SELECT * FROM guestbook"; $ergebnis = mysql_query($abfrage); include('../head.inc.php'); ?> <h1>G&auml;stebuch</h1><?php while($row = mysql_fetch_object($ergebnis)) { echo "<p><i>".$row->name."</i> schrieb am ".$row->date.":<br>"; echo $row->message."</p>"; echo "<p><a href='admin.php?delete=".$row->id."'>L&ouml;schen</a></p>"; } include('../foot.inc.php'); ?> 6.4.3. </body> </html> foot.inc.php Anlagen 6.4.4. S e i t e | 17 guestbook.php <?php mysql_connect("172.16.5.100", "gruppe5","gruppe5") or die ("Keine Verbindung moeglich"); mysql_select_db("project") or die ("Die Datenbank existiert nicht."); mysql_query("SET NAMES 'utf8'"); if (isset($_POST["op"])) { $message = $_POST["message"]; if($_POST["op"] == 'submit'){ $eintragen = mysql_query("INSERT INTO guestbook (name, date, message)"."VALUES ('".$_POST['name']."', now(), '".$message."')"); echo "<p>Eintrag gespeichert</p>"; } } $abfrage = "SELECT * FROM guestbook ORDER BY date DESC"; $ergebnis = mysql_query($abfrage); include('head.inc.php'); ?> <h1>G&auml;stebuch</h1> <?php while($row = mysql_fetch_object($ergebnis)) { echo "<p><i>".$row->name."</i> schrieb am ".$row->date.":<br>"; echo $row->message."</p>"; } ?> <h2>Eintragen</h2> <form action="guestbook.php" method="post"> <p><input type="text" name="name"> schrieb am <?php echo date("Y-m-d"); ?> um <?php echo date("G:i:s");?>:<br> <textarea name="message"></textarea> <input type="hidden" value="submit" name="op"> </p> <input type="submit"> </form> <?php include('foot.inc.php'); ?> 6.4.5. head.inc.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Tannenbusch e.V. - Wohngruppe 5</title> <link rel="stylesheet" type="text/css" href="http://172.16.5.100/style/style.css"> </head> <body> <p> <a href="http://172.16.5.100/index.php"><b>Home</b></a> | <a href="http://172.16.5.100/about.php"><b>Wir &uuml;ber uns</b></a> | <a href="http://172.16.5.100/guestbook.php"><b>G&auml;stebuch</b></a> </p> Anlagen 6.4.6. S e i t e | 18 index.php <?php include('head.inc.php'); $file = fopen("counter.txt","r+"); $content = fgets($file, 10); $data = explode("|",$content); if($data[0] == "") { $data[0] = 0; } $data[0]++; if ($data[0] % 100 == 0) { $data[1] = rand (1000, 9999); $message = "Der ".$data[0].". Besucher hat den Gutscheincode ".$data[1]."."; mail('[email protected]', 'Gewinner für Pizzagutschein', $message, 'From: Projektgruppe 5' ); } $content = implode("|", $data); rewind($file); fwrite($file, $content); fclose($file); if ($data[0] % 100 != 0) { ?> <h1>Home</h1> <p>Hallo auf der intranetseite der <b>Tannenbusch e.V. - Wohngruppe 5<b> <img src="http://172.16.5.100/images/none.jpg" alt="Gruppenbild" style="width: 50%"> </p> <?php }else{ ?> <h1>Herzlichen Glückwunsch zum Pizza-Gutschein</h1> <p>Gebe einfach den Gutschein-Code <b><?php echo $data[1]; ?></b> an.<br> Ein Bewohner wurde über dies per Email informiert.</p> <?php } include('foot.inc.php'); ?> Anlagen 6.4.7. S e i t e | 19 style.css frame,frameset { border:0; } body { width:70%; margin-left: auto; margin-right: auto; } h1 { border-bottom: solid green thin; } b { font-weight: bold; } a { color: green; text-decoration:none; } textarea { width: 100%; height: 10em; } p img { width: 30%; margin-left: 2em; margin-bottom: 1em; float: right; } Anlagen 6.5. Datenbank Konfiguration --------- phpMyAdmin SQL Dump version 3.3.9 http://www.phpmyadmin.net Host: localhost Erstellungszeit: 23. Mai 2011 um 09:46 Server Version: 5.5.8 PHP-Version: 5.3.5 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; --- Datenbank: `project` --- ---------------------------------------------------------- Tabellenstruktur für Tabelle `guestbook` -CREATE TABLE `guestbook` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL, `date` datetime DEFAULT NULL, `message` varchar(1024) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; S e i t e | 20 Anlagen 6.6. Abnahmeprotokoll S e i t e | 21 Anlagen S e i t e | 22