alfsa - BFKDO Tulln
Transcription
alfsa - BFKDO Tulln
Diplomarbeit ALFSA Atemluftfüllstellenapplikation 16. Mai 2008 HTBLuVA St. Pölten Höhere Lehranstalt für Elektronik Ausbildungsschwerpunkt Technische Informatik DIPLOMARBEIT Atemluftfüllstellenapplikation (ALFSA) ausgeführt an der Abteilung für Elektronik der Höheren Technischen Bundeslehr- u. Versuchsanstalt St. Pölten Waldstraße 3, A-3100 St. Pölten im Schuljahr 2007/08 von Andreas Brandstätter, 5AHELI-02 Christoph Klaffl, 5AHELI-08 unter Betreuung von Dipl.-Ing. Wolfgang Alfery Dipl.-Päd. Ing. Gerd Riesenhuber St. Pölten, am 2008-05-16 1 ALFSA Eidesstattliche Erklärung Ich erkläre an Eides statt, dass ich die vorliegende Diplomarbeit selbständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die den benutzten Quellen wörtlich und inhaltlich entnommenen Stellen als solche erkenntlich gemacht habe. St. Pölten, am 2008-05-16 Andreas Brandstätter Christoph Klaffl Brandstätter Andreas, Klaffl Christoph Seite i ALFSA Kurzfassung ALFSA - Atemluftfüllstellenapplikation Mit dieser Diplomarbeit wird ein verteiltes Datenbanksystem für die sepziellen Anforderungen der Feuerwehr des Bezirkes Tulln realisiert. Alle Datenbankserver in dem System agieren als Master und können von der Clientsoftware verwendet werden. Die Syncronisation zwischen den geographisch getrennten Servern soll dabei über das Internet stattfinden. Für die Gewährleistung der Datensicherheit, im Bezug auf die Lesbarkeit der übertragenen Daten, soll eine sichere Leitung mittels Verschlüsselung eingesetzt werden. Für die Verwaltung der Server und der Feuerwehren (Benutzer, Füllstellen, ...) steht eine Administrationsoberfläche via Webinterface bereit. Die Berechtigungen der einzelnen Benutzer können über diese Web-Oberfläche eingestellt werden. Um auch hier benutzerrelevante Daten zu schützen, wird SSL zur Verschlüsselung verwendet. Brandstätter Andreas, Klaffl Christoph Seite ii ALFSA Abstract ALFSA - (Air breath fill station application) The result of this diplom thesis is a distributed Databasesystem for the special needs of the fire brigade of the district Tulln. All Databaseservers in this System act as Master and can be used by the client software. The syncronisation between the geographically seperated servers should take place over the internet. To provide data security, in reference to the readability of the transmitted data, a secure line with encryption is used. The management of the severs and the fire brigades (Users, fill stations, ...) is done via a Web-Administrative panel. The permissions of the single users can also be set in this panel. Again SSL is used for data encryption. Brandstätter Andreas, Klaffl Christoph Seite iii ALFSA INHALTSVERZEICHNIS Inhaltsverzeichnis Vorwort Eidesstattliche Erklärung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kurzfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Abstract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i i ii iii Inhaltsverzeichnis 1 I 8 Projektmanagement 1 Projektmanagement 1.1 Spezifikation . . . . . . . . . . . . . . . . 1.2 Zeitplan . . . . . . . . . . . . . . . . . . 1.3 Strukturplan . . . . . . . . . . . . . . . . 1.4 Arbeitskalender . . . . . . . . . . . . . . 1.4.1 Brandstätter Andreas . . . . . . . 1.4.2 Klaffl Christoph . . . . . . . . . . 1.5 Diplomarbeitsbesprechungen . . . . . . . 1.5.1 Erste Diplomarbeitsbesprechung . . 1.5.2 Zweite Diplomarbeitsbesprechung . 1.5.3 Dritte Diplomarbeitsbesprechung . 1.5.4 Vierte Diplomarbeitsbesprechung . 1.5.5 Fünfte Diplomarbeitsbesprechung . 1.5.6 Sechste Diplomarbeitsbesprechung . 1.6 Besprechungsnotizen . . . . . . . . . . . 1.6.1 Erste Besprechungsnotiz . . . . . . 1.6.2 Zweite Besprechungsnotiz . . . . . 1.7 Kontakte . . . . . . . . . . . . . . . . . . 1.7.1 Entwicklerteam . . . . . . . . . . 1.7.2 Betreuer . . . . . . . . . . . . . . 1.7.3 Auftraggeber . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 11 12 12 14 16 16 17 18 19 20 21 22 22 23 24 24 24 25 Seite 1von 231 ALFSA II INHALTSVERZEICHNIS Projektentwicklung 2 Verwendete Technologien 2.1 SSH . . . . . . . . . . . . . . . . 2.1.1 Allgemeines . . . . . . . . 2.1.2 Verwendung . . . . . . . . 2.1.3 Sicherheit . . . . . . . . . 2.1.4 Implementierungen . . . . 2.2 APACHE Webserver . . . . . . . 2.2.1 Allgemeines . . . . . . . . 2.2.2 Aufbau . . . . . . . . . . . 2.2.3 Implementierungen . . . . 2.2.4 Homepage . . . . . . . . . 2.3 Datenbanksystem . . . . . . . . . 2.3.1 Allgemeines . . . . . . . . 2.3.2 Anforderungen . . . . . . 2.3.3 Wartung . . . . . . . . . . 2.4 MySQL . . . . . . . . . . . . . . 2.4.1 Allgemeines . . . . . . . . 2.4.2 Aufbau . . . . . . . . . . . 2.4.3 Administration . . . . . . 2.4.4 Implemetierung . . . . . . 2.5 Linux . . . . . . . . . . . . . . . 2.5.1 Allgemeines . . . . . . . . 2.5.2 Was ist Linux? . . . . . . 2.5.3 Weitere Entwicklung . . . 2.5.4 Verbreitung . . . . . . . . 2.5.5 Distribution . . . . . . . . 2.6 Subversion . . . . . . . . . . . . . 2.6.1 Allgemeines . . . . . . . . 2.6.2 Funktionsweise . . . . . . 2.6.3 Implemetierung . . . . . . 2.7 SSL . . . . . . . . . . . . . . . . 2.7.1 Allgemeines . . . . . . . . 2.7.2 Funktionsweise . . . . . . 2.7.3 Verschlüsselungsverfahren 2.7.4 Vorteile . . . . . . . . . . 2.7.5 Nachteile . . . . . . . . . . 2.7.6 Probleme . . . . . . . . . 2.7.7 Implementierungen . . . . 2.8 PHP . . . . . . . . . . . . . . . . 2.8.1 Allgemeines . . . . . . . . 2.8.2 Funktionsweise . . . . . . 2.8.3 Syntax . . . . . . . . . . . 2.8.4 Implementierung . . . . . 2.9 JAVA . . . . . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph 26 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 27 27 27 28 29 29 29 29 30 30 30 30 31 32 32 32 33 33 33 34 34 34 34 35 36 36 36 36 39 40 40 40 42 43 44 44 44 45 45 45 46 46 46 Seite 2von 231 ALFSA INHALTSVERZEICHNIS 2.9.1 2.9.2 2.9.3 2.9.4 Allgemeines . . . Funktionsweise . Syntax . . . . . . Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 47 47 48 3 Analysen und Entscheidungen 3.1 Betriebssysteme . . . . . . . . . . . . . 3.1.1 Debian Etch (LINUX) . . . . . 3.1.2 Microsoft Windows Server 2003 3.1.3 Entscheidung . . . . . . . . . . 3.2 Datenbank Server . . . . . . . . . . . . 3.2.1 MySQL [16] [17] . . . . . . . . . 3.2.2 PostgreSQL [17] . . . . . . . . . 3.2.3 Microsoft SQL Server 2005 [16] 3.2.4 Entscheidung . . . . . . . . . . 3.3 Replikation vs. Cluster [19] [18] . . . . 3.3.1 Cluster allgemein . . . . . . . . 3.3.2 Active-Passive-Cluster . . . . . 3.3.3 Active-Active-Cluster . . . . . . 3.3.4 Replikation allgemein . . . . . . 3.3.5 Master-Slave Replikation . . . . 3.3.6 Master-Master Replikation . . . 3.3.7 Entscheidung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 49 49 50 50 51 51 51 52 52 53 53 53 54 54 55 55 56 4 Planung und Implementierung 4.1 Server aufsetzen . . . . . . . . . . . . 4.1.1 Installationsmedium besorgen 4.1.2 Installation . . . . . . . . . . 4.1.3 Konfiguration . . . . . . . . . 4.2 SSH Server aufsetzen . . . . . . . . . 4.2.1 Installation . . . . . . . . . . 4.2.2 Konfiguration . . . . . . . . . 4.3 Datenbankserver aufsetzten . . . . . 4.3.1 Installation . . . . . . . . . . 4.3.2 Konfiguration . . . . . . . . . 4.4 Webserver aufsetzten . . . . . . . . . 4.4.1 Installation . . . . . . . . . . 4.4.2 Konfiguration . . . . . . . . . 4.5 Subversion-Server aufsetzten . . . . . 4.5.1 Installation . . . . . . . . . . 4.5.2 Konfiguration . . . . . . . . . 4.6 Zeitspeicherung . . . . . . . . . . . . 4.6.1 Zeitumstellungsproblem . . . 4.6.2 Lösungsansatz . . . . . . . . . 4.6.3 Unixzeit . . . . . . . . . . . . 4.6.4 Einschränkungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 57 57 58 59 59 59 59 60 60 61 62 62 63 64 64 65 68 68 69 69 70 Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Seite 3von 231 ALFSA 4.7 4.8 4.9 4.10 4.11 4.12 4.13 INHALTSVERZEICHNIS 4.6.5 Zeitsynchronität . . . . . . . . . . . . . . Datenbankdesign . . . . . . . . . . . . . . . . . 4.7.1 Primärschlüssel . . . . . . . . . . . . . . 4.7.2 Spalte edit date . . . . . . . . . . . . . . 4.7.3 Löschen von Daten . . . . . . . . . . . . 4.7.4 Lineare Abhängigkeiten . . . . . . . . . 4.7.5 Grundlegende Struktur . . . . . . . . . . 4.7.6 Atemluftflaschen . . . . . . . . . . . . . 4.7.7 Füllungen . . . . . . . . . . . . . . . . . 4.7.8 Datenbankstruktur . . . . . . . . . . . . 4.7.9 Tabellen der Datenbank . . . . . . . . . Datenbankzugriff . . . . . . . . . . . . . . . . . Server - Server Syncronisation . . . . . . . . . . 4.9.1 Anforderungen . . . . . . . . . . . . . . 4.9.2 Konzept . . . . . . . . . . . . . . . . . . 4.9.3 Syncronisationsrichtung . . . . . . . . . 4.9.4 Anpassungen der Datenbankstruktur . . 4.9.5 Shell . . . . . . . . . . . . . . . . . . . . 4.9.6 CRON . . . . . . . . . . . . . . . . . . . 4.9.7 SSH . . . . . . . . . . . . . . . . . . . . 4.9.8 PHP . . . . . . . . . . . . . . . . . . . . 4.9.9 Datenbankstruktur aktualisieren . . . . . 4.9.10 Backupserver . . . . . . . . . . . . . . . 4.9.11 Fehlerbehandlung . . . . . . . . . . . . . Client - Server Syncronisation . . . . . . . . . . 4.10.1 Vorgaben . . . . . . . . . . . . . . . . . 4.10.2 Konzept . . . . . . . . . . . . . . . . . . 4.10.3 Prinzip . . . . . . . . . . . . . . . . . . . 4.10.4 Realisierung . . . . . . . . . . . . . . . . 4.10.5 Umsetzung . . . . . . . . . . . . . . . . 4.10.6 Sequenzdiagramm . . . . . . . . . . . . . 4.10.7 Fehlerbehandlung . . . . . . . . . . . . . Webinterface . . . . . . . . . . . . . . . . . . . 4.11.1 Übersicht . . . . . . . . . . . . . . . . . 4.11.2 index.php . . . . . . . . . . . . . . . . . 4.11.3 Template Engine . . . . . . . . . . . . . Tests . . . . . . . . . . . . . . . . . . . . . . . . 4.12.1 Test des Webinterfaces . . . . . . . . . . 4.12.2 Test der Server - Server Synchronisation 4.12.3 Test der Client - Server Synchronisation 4.12.4 Pre-Alpha Development-Test . . . . . . . Verwendete Hilfsmittel . . . . . . . . . . . . . . 4.13.1 Verwendete Software . . . . . . . . . . . 4.13.2 Allgemeine Quellen . . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 71 71 72 72 73 74 74 75 75 77 77 78 78 78 80 81 82 83 84 88 97 98 98 100 100 100 100 101 103 107 108 110 110 111 112 113 113 113 114 114 114 114 116 Seite 4von 231 ALFSA III INHALTSVERZEICHNIS Wirtschaftlicher Teil 117 5 Allgemeines 5.1 Die Firma FRED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Das Produkt ALFSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 General Public Liecense GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 118 118 119 6 Kostenrechnung 6.1 Kalkulation . . . . . . . . . . . . . . . . 6.1.1 Kalkulation der Fixkosten . . . . 6.1.2 Kalkulation der variablen Kosten 6.2 Support . . . . . . . . . . . . . . . . . . 6.2.1 Kalkulation der variablen Kosten 6.2.2 Preiskalkulation . . . . . . . . . . 6.2.3 Break-Even-Point . . . . . . . . . . . . . . . . 120 120 120 121 122 122 122 122 . . . . . . . . . . . . . . . 124 124 124 125 125 125 125 126 126 127 127 127 128 128 129 130 7 Marketing 7.1 Marktanalyse . . . . . . . . . . . 7.1.1 Primäre Zielgruppe . . . . 7.1.2 Sekundäre Zielgruppe . . . 7.2 Konkurrenzanalyse . . . . . . . . 7.3 Marketing . . . . . . . . . . . . . 7.3.1 Der Firmenname . . . . . 7.3.2 Das Firmenlogo . . . . . . 7.3.3 Das Produktlogo . . . . . 7.3.4 Logos - Corporate Design 7.4 Werbung . . . . . . . . . . . . . . 7.4.1 Messen . . . . . . . . . . . 7.4.2 Feuer-Zeitschriften . . . . 7.4.3 Feuer-Webseiten . . . . . . 7.4.4 Taucher-Zeitschriften . . . 7.5 Promotionswebseite . . . . . . . . IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Handbuch 8 Administratorhandbuch 8.1 Willkommen . . . . . . . . . . . . 8.2 Voraussetzungen . . . . . . . . . 8.2.1 Hardware . . . . . . . . . 8.2.2 Software . . . . . . . . . . 8.3 Installation . . . . . . . . . . . . 8.3.1 Programmdateien kopieren 8.3.2 Rechte anpassen . . . . . 8.3.3 Einmalige Einstellungen . 8.3.4 Erster ALFSA Server . . . Brandstätter Andreas, Klaffl Christoph 131 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 132 132 132 133 133 133 133 134 134 Seite 5von 231 ALFSA 8.4 V INHALTSVERZEICHNIS 8.3.5 Konfiguration . . . . . 8.3.6 Fehlerbehandlung . . . Bedienung . . . . . . . . . . . 8.4.1 Benutzerverwaltung . . 8.4.2 Feuerwehrverwaltung . 8.4.3 Fuellstellenverwaltung 8.4.4 Clientverwaltung . . . 8.4.5 Kompressorverwaltung 8.4.6 Serverliste . . . . . . . 8.4.7 Serververwaltung . . . 8.4.8 Konfiguration . . . . . 8.4.9 Synchronisieren . . . . 8.4.10 LOGViewer . . . . . . 8.4.11 Tabellenansicht . . . . 8.4.12 Fehlerhafte Eingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anhang 9 Anhang 9.1 Funktionen und Klassen . . . . . . . . . . 9.1.1 Teil Client-Server-Sync am Client . 9.1.2 Teil Server . . . . . . . . . . . . . . 9.1.3 Teil Client-Server-Sync am Server . 9.1.4 Teil Mehrfach genutzt . . . . . . . 9.2 Tabellen . . . . . . . . . . . . . . . . . . . 9.2.1 Tabelle abschnitte . . . . . . . . . . 9.2.2 Tabelle atemluftflaschen fuellung . 9.2.3 Tabelle atemluftflaschen maengel . 9.2.4 Tabelle atemluftflaschen . . . . . . 9.2.5 Tabelle atemluftflaschen pruefung . 9.2.6 Tabelle atemschutzgeraete maengel 9.2.7 Tabelle atemschutzgeraete . . . . . 9.2.8 Tabelle atemschutzgeraete pruefung 9.2.9 Tabelle atemschutzgeraete wartung 9.2.10 Tabelle atemschutzmasken maengel 9.2.11 Tabelle atemschutzmasken . . . . . 9.2.12 Tabelle atemschutzmasken wartung 9.2.13 Tabelle benutzer anmeldung . . . . 9.2.14 Tabelle benutzer . . . . . . . . . . 9.2.15 Tabelle benutzer schulung . . . . . 9.2.16 Tabelle bezirke . . . . . . . . . . . 9.2.17 Tabelle client . . . . . . . . . . . . 9.2.18 Tabelle dienstgrade . . . . . . . . . 9.2.19 Tabelle einsatz . . . . . . . . . . . 9.2.20 Tabelle feuerwehren . . . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . 134 135 136 138 142 144 146 148 150 151 153 154 156 158 159 160 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 161 161 164 193 196 197 197 197 198 198 199 199 200 200 201 201 201 202 202 203 204 204 204 204 205 205 Seite 6von 231 ALFSA 9.3 INHALTSVERZEICHNIS 9.2.21 Tabelle 9.2.22 Tabelle 9.2.23 Tabelle 9.2.24 Tabelle 9.2.25 Tabelle 9.2.26 Tabelle 9.2.27 Tabelle 9.2.28 Tabelle 9.2.29 Tabelle 9.2.30 Tabelle 9.2.31 Tabelle 9.2.32 Tabelle 9.2.33 Tabelle 9.2.34 Tabelle 9.2.35 Tabelle 9.2.36 Tabelle 9.2.37 Tabelle 9.2.38 Tabelle 9.2.39 Tabelle 9.2.40 Tabelle 9.2.41 Tabelle 9.2.42 Tabelle 9.2.43 Tabelle 9.2.44 Tabelle 9.2.45 Tabelle Dateiliste . . fremdflaschen fuellung . . . . fremdflaschen . . . . . . . . . fuell sitzung . . . . . . . . . fuellstelle . . . . . . . . . . . geraetetraeger . . . . . . . . geraetetraeger untersuchung . gruppen . . . . . . . . . . . . gruppen user . . . . . . . . . kompressoren maengel . . . . kompressoren . . . . . . . . . kompressoren pruefung . . . kompressoren wartung . . . . nachrichten gelesen . . . . . nachrichten . . . . . . . . . . permission . . . . . . . . . . person kontakt . . . . . . . . person . . . . . . . . . . . . . person telefon . . . . . . . . schulung . . . . . . . . . . . server details . . . . . . . . . server . . . . . . . . . . . . . sync . . . . . . . . . . . . . . sync server log . . . . . . . . sync vorgang . . . . . . . . . verbindungskennung . . . . . . . . . . . . . . . . . . . . . . Verzeichnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 206 206 206 206 207 207 207 208 208 209 209 209 210 210 210 211 211 211 212 212 212 212 213 213 213 220 Abbildungsverzeichnis 222 Listings 228 Tabellenverzeichnis 229 Literaturverzeichnis 230 Brandstätter Andreas, Klaffl Christoph Seite 7von 231 ALFSA Teil I Projektmanagement Brandstätter Andreas, Klaffl Christoph Seite 8von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT Kapitel 1 Projektmanagement 1.1 Spezifikation Ziel der Diplomarbeit ist es, ein hochverfügbares, verteiltes Datenbanksystem für die Feuerwehr des Bezirkes Tulln zu realisieren. Die Server sind dabei geographisch getrennt und verfügen daher über kein eigens Netzwerk und müssen ihre Daten über ein unsichers Netzwerk (Internet) austauschen. Die Server müssen dabei ihre Daten stetig synchronsieren und aktuell halten. Weiters muss ein asynchroner Datenaustausch mit Clients implementiert werden. Abbildung 1.1: Struktur der verteilten Datenbank Brandstätter Andreas, Klaffl Christoph Seite 9von 231 ALFSA 1.2 KAPITEL 1. PROJEKTMANAGEMENT Zeitplan Monat Oktober November Dezember Jänner Februar März April Mai Aufgabe Formulierung der genauen Aufgabe Einarbeitung in das Thema verteilte Datenbanken Verschiedene Betriebsysteme analysieren Datenbankkonzept erstellen Betriebsysteme auswählen verschiedne Datenbanksysteme analysieren Datenbanksystem auswählen Datenbankstruktur ausarbeiten Server-Server Sychronisation entwerfen Client-Server Sychronisation entwerfen Datenbankstruktur festlegen Dokumentation der Datenbankstruktur Server-Server Sychronisation implementieren Client-Server Sychronisation implementieren Dokumentation der Software Server-Server Sychronisation weiter implementieren Client-Server Sychronisation weiter implementieren Tests der Software formulieren Dokumentation der Software Tests der Server-Server Sychronisation Tests der Client-Server Sychronisation Dokumentation der Tests Eventuelle Fehler der Server-Server Sychronisation beheben Eventuelle Fehler der Client-Server Sychronisation beheben Tests der Server-Server Sychronisation Tests der Client-Server Sychronisation Dokumentation der Tests Weitere Inhalte der Dokumentation Abschließen der Dokumentation Tabelle 1.1: Zeitplan Brandstätter Andreas, Klaffl Christoph Seite 10von 231 ALFSA 1.3 KAPITEL 1. PROJEKTMANAGEMENT Strukturplan Abbildung 1.2: Strukturplan Brandstätter Andreas, Klaffl Christoph Seite 11von 231 ALFSA 1.4 1.4.1 KAPITEL 1. PROJEKTMANAGEMENT Arbeitskalender Brandstätter Andreas KW Stunden Tätigkeit 37 12 Formulierung der Aufgabenstellung Einarbeitung in das Thema Besprechung mit Johannes Ofner und Christian Brandstätter 38 11 Einarbeitung in das Thema 39 14 Datenbanksychronisation Client-Server konzeptioniert 40 11 Datenbanksychronisation Client-Server grundlegend ausgeführt Diplomarbeitsantrag fertiggestellt und abgegeben Datenbanksycronisation Client-Server 42 15 Datenbank-Verbindung auf UTF-8 umgestellt (für Umlaute) Grundlegende Systemänderungen Diplomarbeitsbesprechung Kooperationsvereinbarung eingeholt 43 7 Arbeitszeitkalender 44 17 Template-Engine Installation der Software auf Server euklid Logo entworfen und gezeichnet Deckblatt entworfen Zeitumstellungsploblem analysiert Zeitumstellungsploblem dokumentiert Installation der Software dokumentiert 45 13 Diplomarbeitsordner angelegt Zustandsdiagramm der Datensynchronisierung Plakat entworfen und gezeichnet Client-Server Synchronisation (kleine Änderungen) Template Engine (Bugfix) 46 9 Arbeitskalender Plakat entworfen und gezeichnet Sequenzdiagramm erstellt 48 4 Sourcecode-Autodokumentation 49 7 Client-Server-Syncronisierung an neue Config und DB-Struktur angepasst grundlegende Informationen zur Dokumentation eingeholt Logo für Scheinfirma gezeichnet Prospekt für Scheinfirma entworfen 52 8 Synchronisation getestet und konfiguriert 1 5 Grafiken für Syncronisationsfortschritt entworfen Brandstätter Andreas, Klaffl Christoph Seite 12von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 2 7 3 9 5 21 6 7 10 12 8 9 7 6 10 5 13 14 14 12 19 20 22 12 270 Oberfläche der Synchronisation von Client-Server Client-Server Synchronisation: Diverse Inhalte Client-Server Synchronisation: verschiedene Server verwenden Client-Server Synchronisation: Server zufällig auswählen grafische Darstellung von Tabellen Dokumentation: Beziehungen der Datenbank Beziehungen erstellt Beziehungen (eintragen / anzeigen) Datenbank-Tabellenansicht (verbessert, foreign-keys) Datenbankstruktur (Darstellung) Datenbankstruktur (Verbesserungen, Dumps, Import) Server-Server Synchronisation für Foreign Keys adapdiert Tabellenanzeige in Server-Oberfläche implementiert Promotionswebsite konzeptioniert neue Client-Server-Synchronisation (komplett neu aufgebaut, mit foreign-keys) Client für Server-Interface (Zentraldatenbank) adaptiert Client-Server-Synchronisation verbessert CMS für Promotionswebseite: Auswahl und Konfiguration CMS: Konfiguration Server-Client Synchronisation um Sicherheitsfunktionen erweitert Client-Server Synchronisation an neue Tabellennamen angepasst, und div. Maskottchen gezeichnet / entworfen Beschreibung für HTL-innovativ Client-Server Synchronisation diverse Änderungen Client-server Synchronisation Bug behoben Synchronisations-Hinweis und div. Einladung und Vorbereitung für Information mit BFKDO und AFKDOS Vorbereitung für Präsentation bei BFKDO und AFKDOS Vorstellung von ALFSA bei BFKDO und AFKDOS (St. Andrä-Wördern) vertiefte Analyse von verteilten Datenbanken Aufbau und Test eines MySQL-Clusters Abschließende Dokumentation Abschließende Dokumentation Abschließende Dokumentation Gesamt Tabelle 1.2: Arbeitskalender von Brandstätter Andreas Brandstätter Andreas, Klaffl Christoph Seite 13von 231 ALFSA 1.4.2 KW 37 38 39 40 41 42 44 45 47 48 49 50 51 53 54 1 2 4 KAPITEL 1. PROJEKTMANAGEMENT Klaffl Christoph Stunden Tätigkeit 11 Formulierung der Aufgabenstellung Gegenüberstellung der Betriebssysteme Softwareanforderungen der Auftraggeber studieren“ und überdenken ” 7 Gegenüberstellung der Datenbanksysteme Gegenüberstellung der Möglichkeiten für das redundante Datenbanksystem 8 Web-Interface Grundstruktur 11 Diplomarbeitsantrag fertiggestellt und abgegeben Web-Interface entworfen 12 Analysieren der bestehenden Datenbank des Auftraggebers Datenbankstruktur neu erstellen Diplomarbeitsbesprechung Kooperationsvereinbarung eingeholt 5 Eintragung aller Feuerwehren, Bezirke und Abschnitte von NÖ in die Datenbank 9 Server – Server Synchronisation: Konzept erstellt 12 SSH Einarbeitung Public-Key Authentifizierungsverfahren Konfigurationslibarys erstellt Web-Interface Konfigurationsseite für die Syncronisation 9 SSL Einarbeitung Library für die Erstellung und Vewaltung der Public Keys 7 CRON Einarbeitung Server – Server Synchronisation allgemein implementiert 10 Server – Server Synchronisation in PHP implementiert 11 Server – Server Synchronisation in JAVA implementiert 9 Testen und Vergleichen der Server – Server Synchronisation in PHP und JAVA 13 Library für die Verwaltung von Cronjobs Überarbeitung der Server – Server Synchronisation Logging für dir Server – Server Synchronisation 11 Web-Interface Benutzerverwaltung Web-Interface Server Liste Einführung LATEX Gegenüberstellung in LATEXdokumentiert 6 Web-Interface Füllstellenverwaltung Optimierungen der Libaries 5 .htaccess Dateien erstellt Cron Library - Intervalleinstellung Brandstätter Andreas, Klaffl Christoph Seite 14von 231 ALFSA 5 6 7 8 9 11 12 14 16 19 20 KAPITEL 1. PROJEKTMANAGEMENT 8 Beziehungen erstellt Server-Server Syncronisierung: Einteilung der Tabellen nach ihren Beziehungsebenen (FK) Entwicklungsseite überarbeitet 9 Fehlerkorrekturen durchgeführt Log Viewer programmiert 11 Login Maske erstellt Inkompatibilitäten zu IE behoben Server Verwaltung wurde komplett neu geschrieben Design Änderungen 4 Cookie Funktion ( Remember Me“) ” 8 Web-Interface Benutzerverwaltung überarbeitet Client-Server-Synchronisation verbessert Abstract und Zusammenfassung Server - Server Synronisation: Fehlerbereinigung 10 Server Verwaltung wurde komplett neu geschrieben Log Viewer wurde überarbeitet Web-Interface Client Verwaltung 12 Library für Systeminformationen Passwort System von md5 auf crypt mit Salt umgestellt Server – Server Syncronisation: freien Port herausfinden Log Viewer überarbeitet Vorbereitung für Präsentation bei BFKDO und AFKDOS Vorstellung von ALFSA bei BFKDO und AFKDOS (St. Andrä-Wördern) 10 vertiefte Analyse von verteilten Datenbanken Aufbau und Test eines MySQL-Clusters 7 Letzten Fehler behoben Programmcode verbessert und unötigen Code entfernt Dokumentation 15 abschließende Dokumentation 14 abschließende Dokumentation 264 Gesamt Tabelle 1.3: Arbeitskalender von Klaffl Christoph Brandstätter Andreas, Klaffl Christoph Seite 15von 231 ALFSA 1.5 KAPITEL 1. PROJEKTMANAGEMENT Diplomarbeitsbesprechungen 1. Diplomarbeitsbesprechung 2007/08 ALFSA Termin Ort 2007-10-17 14:50 HTBLuVA St. Pölten / W016 Teilnehmer DI Wolfgang ALFERY Andreas BRANDSTÄTTER Christoph KLAFFL Bericht Klaffl, Brandstätter Grundlegende Anforderungen für ALFSA wurden vom Projektleiter DI Johannes Ofner in schriftlicher Form übermittelt. Bisher wurden folgende Punkte erarbeitet: • Erörterung der Möglichkeiten zur Realisierung einer hochverfügbaren Datenbank • Vergleich verschiedener Open-Source Datenbank-Systeme • Konzipierung einer Datenbank-Synchronisierung von Client und Server • Test-Realisierung der Synchronisierung von Client und Server Vorführung • Benutzeroberfläche der Synchronisierung • Test der der Synchronisierung Planziele Alfery • • • • • • • Diplomarbeitsordner ist anzulegen Dokumentation ist nach den Richtlinien „Software Projekt Dokumentation“ auszuführen Spezifikation, Zeitplan und Strukturplan ist zu erarbeiten Für die laufende Durchführung der Diplomarbeit ist ein Arbeitskalender zu erstellen Für die Entwicklung der Client-Server Synchronisation ist eine Darstellung als Zustandsdiagramm anzugeben Weiterentwicklung der Client-Server Synchronisation Entwurf und Entwicklung der Datenbankstruktur nächster Besprechungstermin: 2007-11-14 Brandstätter Andreas, Klaffl Christoph Seite 16von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 2. Diplomarbeitsbesprechung 2007/08 ALFSA Termin Ort 2007-11-14 12:10 HTBLuVA St. Pölten / W016 Teilnehmer DI Wolfgang ALFERY Andreas BRANDSTÄTTER Christoph KLAFFL Bericht Klaffl, Brandstätter Folgende Punkte wurden vorgeführt: • Diplomarbeitsordner • Ansätze der Dokumentation ist nach den Richtlinien „Software Projekt Dokumentation“ • Spezifikation und Zeitplan • Arbeitskalender der laufenden Durchführung • Sequenzdiagramm und Entwurf des Zustandsdiagrammes der Client-Server Synchronisation Vorführung • Client-Server Synchronisierung wurde ergänzt mit der Prüfung und Erstellung der Tabellenstruktur sowie der Aufteilung in einzelne Datenpakete Planziele Alfery • • • • • Weiterentwicklung des Zustandsdiagrammes der Client-Server Synchronisierung Flussdiagramme für die einzelnen Zustände Entwurf und Entwicklung von Lösungen diverser Timeout-Szenarien Entwurf und Realisierung eines Testprogrammes zur Evaluierung von Synchronisation und Fehlerfällen Entwurf der Server-Server Synchronisierung nächster Besprechungstermin: 2008-01-09 Brandstätter Andreas, Klaffl Christoph Seite 17von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 3. Diplomarbeitsbesprechung 2007/08 ALFSA Termin Ort 2008-01-09 12:10 HTBLuVA St. Pölten / W016 Teilnehmer DI Wolfgang ALFERY Andreas BRANDSTÄTTER Christoph KLAFFL Bericht Klaffl, Brandstätter Folgende Punkte wurden erarbeitet: • Sequenzdiagramm der Client-Server Synchronisation • Erarbeitung der Fehlerszenarien bei Client-Server Synchronisation • Technische Dokumentation über verwendete Techniken Vorführung • Server-Server Synchronisierung wurde entworfen und realisiert Planziele Alfery • Dokumentation der Diplomarbeit über den Entwurf und die Ausführung der Client-Server Synchronisierung • Dokumentation der Diplomarbeit über den Entwurf und die Ausführung der Server-Server Synchronisierung • Darstellung der Fehlerszenarien im Sequenzdiagramm • Terminvereinbarung mit Auftraggeber zur Abstimmung der bisherigen Ergebnisse nächster Besprechungstermin: 2008-02-20 Brandstätter Andreas, Klaffl Christoph Seite 18von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 4. Diplomarbeitsbesprechung 2007/08 ALFSA Termin Ort 2008-02-27 12:10 HTBLuVA St. Pölten / W016 Teilnehmer DI Wolfgang ALFERY Andreas BRANDSTÄTTER Christoph KLAFFL Bericht Klaffl, Brandstätter Besprechungsnotiz mit Auftraggeber (Johannes Ofner) • Dazu notwendige Anpassungen bzw. Änderungen Dokumentation • Grundlegende Technologien • Darstellung der Fehlerszenarien Vorführung • Neue Client-Server Synchronisierung Planziele Alfery • Änderungen und Anpassungen implementieren (siehe Besprechungsnotiz) • Dokumentation: Ausführung der Client-Server Synchronisierung (gesicherte Datenübertragung) • Browserkompatibilität weiter ausführen • Konzept zu Tests der Software erstellen nächster Besprechungstermin: 2008-04-09 Brandstätter Andreas, Klaffl Christoph Seite 19von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 5. Diplomarbeitsbesprechung 2007/08 ALFSA Termin Ort 2008-04-09 12:10 HTBLuVA St. Pölten / W016 Teilnehmer DI Wolfgang ALFERY Andreas BRANDSTÄTTER Christoph KLAFFL Bericht Klaffl, Brandstätter Besprechungsnotiz mit Bezirksfeuerwehr- und Abschnittsfeuerwehrkommando • Präsentation des Projektstandes • Diskussion und letzte Änderungsvorschläge Dokumentation • Logo und Prospekt • Wirtschaftlicher Teil Vorführung • vertiefte Analysen von verteilten Datenbanken • Live-MySQL-Cluster Planziele Alfery • Dokumentation weiter ausführen • Tests der Software formulieren, ausführen und dokumentieren • Bestätigung über Projekterfolg bei Auftraggeber einholen nächster Besprechungstermin: 2008-05-07 Brandstätter Andreas, Klaffl Christoph Seite 20von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 6. Diplomarbeitsbesprechung 2007/08 ALFSA Termin Ort 2008-05-07 12:10 HTBLuVA St. Pölten / W016 Teilnehmer DI Wolfgang ALFERY Andreas BRANDSTÄTTER Christoph KLAFFL Bericht Klaffl, Brandstätter Vorführung • Präsentation des End-Projektstandes • Client-Server Synchronisation • Server-Server Synchronisation • Fehlerbehandlung bei Ausfall eines Server • Server-Oberfläche Brandstätter Andreas, Klaffl Christoph Seite 21von 231 ALFSA 1.6 KAPITEL 1. PROJEKTMANAGEMENT Besprechungsnotizen 1. Besprechungsnotiz ALFSA Termin Ort 2008-01-26 von 15:30 bis 17:15 Feuerwehrhaus der Feuerwehr Tulln Teilnehmer Ofner Johannes Brandstätter Christian Brandstätter Andreas Inhalte Allgemeine Abstimmung des aktuellen Projektstandes und Abstimmung der weiteren Entwicklung. • • • Demonstration der Client Oberfläche Besprechung von geplanten Änderungen Besprechung der weiteren Vorgangsweise geplante Änderungen • • • • • • • • • • • • • • • • • • • Mängel nicht unterscheiden (alle Mängel wie erhebliche Mängel eintragen) Bei Füllen von Flaschen mit Mängel zusätzlicher Button zum „nicht füllen“ Bei Fremdflaschen nur Eigentümer und Anzahl, keine Nummern vergeben Betriebsstundenzähler ist zwingend Barcode-Feld mitlaufend mit up/down Buttons Up/down Buttons mit Bilder oder deutsch beschriften Datumfelder automatisch umformatieren (Javascript) Datum nach „d.m.Y H:i“ formatieren Nach Barcode-Feld verlassen wieder rein springen, wenn Focus kein Eingabefeld Berechtigungen deutsch anzeigen / Symbole Jeder soll synchronisieren dürfen (trotzdem eigene Berechtigung) nur 3 Dringlichkeitsstufen Hinweis, dass synchronisiert werden soll, nach Anmeldung (wie Nachrichtenhinweis) „extended logon form“ deutsch schreiben Nachrichtenempfänger erweitern (siehe weitere Notizen) Füllstellendetails: Stationierungsfeuerwehr, freie Füllstellen-Nummer Kompressordetails: mobil [ja/nein] ntpdate anderer Server verwenden (Pool) bzw. verbessern Masken und Geräte nicht einbauen weitere Vorgangsweise • • • Client-Änderungen implementieren Server wie geplant weiter entwickeln Demonstration bei Bezirkskommando sowie Bezirks- und Abschnittssachbearbeitern Brandstätter Andreas, Klaffl Christoph Seite 22von 231 ALFSA KAPITEL 1. PROJEKTMANAGEMENT 2. Besprechungsnotiz ALFSA Termin Ort 2008-03-29 von 13:00 bis 14:45 Feuerwehrhaus der Feuerwehr St. Andrä Wördern Teilnehmer Ofner Johannes (Projektleiter) Brandstätter Christian (Technischer Berater) Brandstäter Andreas (Entwickler) Klaffl Christoph (Entwickler) Kudrna Norbert (Abschnittssachbearbeiter Tulln) Hagl Georg (Stellvertreter des Leiters des Verwaltungsdienstes Tulln) Thallauer Josef (Bezirksfeuerwehrkommandant Tulln) Sulzer Karl (Abschnittskommandant-Stellvertreter Tulln) Schneider Friedrich (Abschnittskommandant Kirchberg) Mann Josef (Abschnittssachbearbeiter Kirchberg) Quixtner Franz (Abschnittssachbearbeiter Atzenbrugg) Inhalte Demonstration aktuellen Projektstandes und allgemein Information über das System. • • einführende Präsentation (Ofner) technische Präsentation ALFSA/aaron (Brandstätter) • • Präsentation: Verbindunsstruktur, Datenstruktur, Bedienung (Klaffl) Demonstration des Programms: Einsatz schnellstart, Flaschendaten anzeigen, usw. (Brandstätter, Klaffl) Information über: Kosten, Füllstellen-Laptop, Server-Infrastruktur (Ofner) Atemschutzausschuss (Stöhr), nicht in FDISK integrieren (Thallauer) in der übernächsten Atemschutzausschusssitzung ist eine Präsentation erwünscht Diskussion Anlegen von Test-Logins (Brandstätter, Klaffl) • • • • Diskussionspunkte • • • einfachere Startseite für Füllberechtigten serverseitig Masken und Geräte erfassen Mängel mit größerer Warnung Brandstätter Andreas, Klaffl Christoph Seite 23von 231 ALFSA 1.7 KAPITEL 1. PROJEKTMANAGEMENT Kontakte Bei Support- oder sonstigen Anfragen wenden Sie sich bitte an folgende Personen: 1.7.1 Entwicklerteam • Andreas Brandstätter Gerersdorferstraße 17 3443 Sieghartskirchen +43 (664) 9246242 brandstaetter@feuerwehrjugend-noe.at • Christoph Klaffl Birkenweg 5 3550 Langenlois +43 (664) 4332791 christophklaffl@gmail.com Weiters sind die Entwickler unter alfsa@bfkdo-tulln.at“ erreichbar. ” 1.7.2 Betreuer • Prof. Dipl. Ing. Wolfgang Alfery Waldstrasse 3 3100 St.Pölten +43 (2742) 75051-421 wolfgang.alfery@htlstp.ac.at • Prof. Dipl. Ing. Gerd Riesenhuber Waldstrasse 3 3100 St.Pölten +43 (2742) 75051-421 gerd.riesenhuber@htlstp.ac.at Brandstätter Andreas, Klaffl Christoph Seite 24von 231 ALFSA 1.7.3 KAPITEL 1. PROJEKTMANAGEMENT Auftraggeber Abbildung 1.3: Korpsabzeichen der Feuerwehren in Österreich • Bezirksfeuerwehrkommando Tulln Hauptstrasse 23 3434 Tulbing +43 (2272) 62222 kommando@bfkdo-tulln.at • Kontaktperson: Johannes Offner Jakob Schefzikgasse 37/3/11 3430 Tulln an der Donau +43 (664) 5334541 johannes.ofner@feuerwehr.tulln.at Brandstätter Andreas, Klaffl Christoph Seite 25von 231 ALFSA Teil II Projektentwicklung Brandstätter Andreas, Klaffl Christoph Seite 26von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Kapitel 2 Verwendete Technologien 2.1 2.1.1 SSH Allgemeines SSH (Secure Shell) ist ein Netzwerkprotokoll sowie auch ein entsprechendes Programm, mit dem verschlüsselte und sichere Verbindungen zu entfernen Computern aufgebaut werden können. Am häufigsten wird es benutzt ein entferntes Terminal lokal zu verwenden, dabei werde die Ausgaben der entfernten Konsole an die lokale gesendet und die Tastenschläge der lokalen an die entfernte. • Versionen: SSH-1, SSH-2, SSH 3G • Standard Port: 22 2.1.2 Verwendung SSH ermöglicht es eine sichere, authentifizierte und verschlüsselte Verbindung zwischen zwei Computern über ein unsicheres Netzwerk (z.B.: Internet) herzustellen. Es ist somit ein Ersatz für die Vorgänger telnet, rlogin und rsh, die keine Methoden zur Verschlüsselung bereitstellen. Bei diesen wird jeglicher Netzverkehr ungesichert übertragen (auch Passwörter sind in Klartext lesbar!). Die Ursprüngliche Zweck von SSH ist das Anmelden an entfernte Recher über ein Netzwerk. Aber vorallem mit der SSH-2 Version beschränkt sich SSH nicht mehr auf reine Terminalfunktionen: • SFTP, SCP: Sind verschlüsselte Alternativen zu FTP (File Transfer Protocol) und RCP (Remote Copy). Somit ist es möglich Dateien auszutauschen ohne das sie ein Dritter einsehen kann. Brandstätter Andreas, Klaffl Christoph Seite 27von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN • Portweiterleitung: Es ist möglich beliebige TCP/IP Verbindungen zu tunnneln. So kann ein lokaler, beliebiger Port (z.B.: 3000) an den entfernten Rechner weitergeleitet werden, dabei ist es möglich das sich die Portnummern unterscheiden, also das gleichzeitig auch eine Portumsetzung stattfindet. Dieser Vorgang funktioniert auch umgekehrt, sodass auch Ports vom entfernten Server and den lokalen Rechner weitergeleitet werden können. Die Anwedungsgebiete für diese Funktion sind somit weit verteilt. So kann z.B. eine unverschlüsselte und somit unsichere VNC (Virtual Network Computing) Sitzung durch einen SSH Tunnel aufgebaut werden, sodass diese von der Verschlüsselung der SSH Vebindung profitiert. • SSHFS: Mit dieser Funktion ist es möglich ein entferntes Dateisystem lokal zu mounten bzw. verwenden. Es ist somit möglich direkt auf den Speicher eines entfernten Rechners zugreifen, als wäre es eine lokaler Speicher. • Authorized Keys: Es ist möglich anderen Benutzer zu gestatten, das sie sich ohne Tastatureingaben (also ohne Passworteinagbe) auf den Rechner anmleden können. Dazu wird der öffentliche Schlüssel des SSH Clients am SSH Server eingetragen. Anwendungsgebiete sind zum Beispiel Kommandoausführungen die am Client eingegeben werden und sofort am SSH Server ausgeführt werden (Somit wird eine SSH Sitzun aufgebaut, der Befehl ausgeführt und danach wird die Sitzung gleich wieder beendet) • Komprimierung: Es ist möglich die SSH Verbindung zusätzlich zu komprimieren um Bandbreite zu sparen. Dies ist für langsame Verbindungen und schnelle Rechner sehr ratsam, da dadurch eine deutliche Steigerung der Datenrate möglich ist. Auf langsamen Rechnern bzw. bei sehr schnellen Verbindungen führt die Kompression allerdings eher zu Verzögerungen. 2.1.3 Sicherheit Die Sicherheit von SSH wird durch veschiedenen Methoden der Verschlüsselung und Authentifizierung erreicht: • Authentifizierung: Beim Anmelden an einen SSH Server identifiziert sich der Sever gegenüber dem Client mit seinem RSA-Zertifikat. Durch diese Methode kann der Client erkennen ob jemand den Server ausgetauscht hat bzw. wenn sich ein andere Server meldet (zum Beispiel durch DNS Spoofing oder ARP Spoofing). Der SSH Client meldet sich nach dem Sicherstellen der Gültigkeit des SSH Servers entweder mit seinem öffenltichen Schlüssel an (wobei dieser beim Server bekannt gegeben werden muss; sogennante Public-Key-Authentifizierung) oder einem Passwort, das der Benutzer eingeben muss. • Verschlüsselung: Nach dem die Authentifizierung erfolgreich war, wird für die SSH Sitzung ein geheimer Schlüssel erzeugt der für die gesamte Zeitdauer der SSH Sitzung zur Verschlüsselung verwendet wird. Der verwendete Verschlüsselungsalgorithmus hängt dabei von der Protokollversion ab (SSH-2 verwendet standardmäßig AES mit einer Schlüssellänge von 128Bit). Es sind folgende Verschlüsselungverfahren verfügbar: 3DES, Brandstätter Andreas, Klaffl Christoph Seite 28von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Blowfish, Twofish, CAST, IDEA, Arcfour, SEED und AES mit anderen Schlüssellängen. Zusätzlich unterstützt die neue Generation von SSH (SSH G3) auch den proprietären Snakeoil-Algorithmus CryptiCore, der einen Geschwindigkeitsgewinn brigen soll. (Cryptoexperten bezeichnen ihn als Security-through-obscurity-Algorithmus 1 ) • Schwachstellen: Die Integritätsprüfung von SSH-1 zeigt Schwachstellen, die es Dritten erlaubt eine SSH-1 Sitzung auszuspähen. Daher sollte diese Version nicht mehr vewendet werden und die nächst höhere SSH-2 Version ist zu bevorzugen (inkompatibel zu SSH-1). Diese unterstützt verschiedene Verschlüsselungalgorithmen und ist modular im Hinblick auf Transport-, Autorisierungs- und Verbindungsschichten aufgebaut. 2.1.4 Implementierungen Ursprünglich waren SSH Implementierungen nur für UNIX Systeme vorhanden. Mittlerweile wurden viele SSH Server und SSH Clients für andere Systeme entwickelt. Am beliebtesten ist der OpenSSH Server, der eine freie Realisierung von SSH darstellt und mittlerweile einen sehr großen Verbreitungsgrad erreicht hat. Da Sicherheitsexperten freie Software bevorzugen (da nicht nur die verwendeten Algorithmen entscheidend für die Sicherheit sind, sondern auch ihre Implementierung) wird sich dieser vorraussichtlich noch vergößern. Über Cygwin ist es auch möglich den OpenSSH Server unter Windows Systemen zu betreiben, jedoch ist die WindowsShell nur sehr begrenzt zur Administration des Systems geeignet. Es existieren noch andere SSH Server, wie zum Beispiel dropbear, der für seine niedrigen Ressourcenverbrauch bekannt ist und sich deshalb sehr für embedded-Systeme eignet. Beliebte SSH Clients sind zum Beispiel PuTTY (Windows und Linux) und WinSCP (nur Windows). 2.2 2.2.1 APACHE Webserver Allgemeines Der Apache HTTP Server ist der meistbenutze Webserver [1] im Internet. Er wird von der Apache Software Foundation entwickelt, die aus zahlreichen Open Source Entwicklern besteht und Open Source Produkte unterstützt. Er wurde aus Respekt nach den nordamerikanischen Indianerstamm der Apachen benannt. 2.2.2 Aufbau Der Webserver ist modular aufgebaut. Dadurch kann der Webserver mit zahlreichen Modulen in seiner Funktion erweitert werden, um beispielsweise mittels des Moduls mod ssl“ ” 1 als Security-through-obscurity bezeichnet man in der Sicherheitstechnik den Versuch Sicherheit durch die Geheimhaltung des Algorithmus zu erreichen Brandstätter Andreas, Klaffl Christoph Seite 29von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN die gesamte Kommunikation zum Browser zu verschlüsseln. Desweiteren bietet Apache die Möglichkeit serversetige Skriptsprachen zu verarbeiten um so dynmaisch generierte Webseiten zur Verfügung zu stellen. Die Skriptsprachen sind jedoch nicht Bestandteil des Webservers sondern werden entweder über ein Modul eingebunden oder über CGI (Common Gateway Interface) aufgerufen. Wobei letztere Art der Implementierung langsamer ist, da für jede Anfrage an den Webserver ein Interpreter gestartet werden muss. Die Hauptmodule des Webservers bilden die MPMs (Multiprocessing-Module). Sie sind ausschlaggebend dafür, wie der Server mehrere Client-Anfragen verarbeitet. So gibt es für Multi Prozessor Systeme ein spezielles Modul, das die Anfragen, soweit möglich, auf die CPU Kerne verteilt. 2.2.3 Implementierungen Der Apache HTTP Server läuft auf allen gängigen Betriebsystemen, von AmigaOS über verschiedene Unix/Linux Deriviate bis hin zu Windows Systemen. Derzeit werden die stabilen Versionen 1.3.x, 2.0.x und 2.2.x weiterhin mit Sicherheitsupdates gepflegt und letztere auch weiterentwickelt. Daher empfielt es sich die letzte stabile Version einzusetzen, die während des Schreibens dieses Dokumentes die Versionsnummer 2.2.8 trägt. 2.2.4 Homepage Weitere Informationen können über die Hautptseite des Apache HTTP Servers bezogen werden: http://httpd.apache.org/ 2.3 2.3.1 Datenbanksystem Allgemeines Ein Datenbanksystem, abgekürzt DBS“, ist ein System zur elektronischen Datenverwaltung. ” Es habet die Aufgabe große Datenmengen wirksam und dauerhaft zu speichern. Desweiteren muss das Datenbanksystem die Konsistenz der Daten garantieren und die gespeicherten Informationen für Anwendungsprogramme bereistellen. Das Datenbanksystem besteht aus 2 Teilen: • Verwaltungssoftware/Datenbankmanagementsystem (DBMS): Die Verwaltungssoftware steuert und kontrolliert jeglichen Zugriff auf die Datenbank. Sie speichert die Daten anhand eines Datenbankmodells (z.B. relationales Datenbankmodell). Für die Brandstätter Andreas, Klaffl Christoph Seite 30von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Bereitstellung der Informationen stellt sie externe Schnittstellen zur Verfügung. Die Datenbankanfragen müssen entsprechend der jeweiligen Datenbanksprache des Datenbankmanagementsystem zusammengestellt werden um Operationen wie das Einfügen, Ändern oder Abfragen der Daten zu ermöglichen. Die meisten der aktuell verfügbaren Datenbanksysteme implementieren den SQL Standard, der im weiteren Verlauf der Dokumentation noch erläutert wird. Das DBMS ist somit entscheidend für die Geschwindigkeit und Funktionalität des Systems und die Auswahl eines solchen sollte daher sehr gründlich erfolgen. • Datenbank (DB): Die Datenbank enthält die Daten und Informationen die gespeichert wurden. Desweiteren besitzt sie zusätzlich zu den gespeicherten Informationen einen sogennanten Datenkatalog. Er enthält Metadaten zur Beschreibung des Aufbaus und der Darstellung der enthaltenen Daten. Desweiteren beschreibt er auch die Beziehungen zwischen den Datenbankelementen. Der direkte Zugriff auf die Datenbank ist nur für administrative Operationen, wie zum Beispiel die Durchführung eines Backups, erlaubt. Alle anderen Zugriffe werden durch das DBMS verwaltet. 2.3.2 Anforderungen Damit sich ein Datenbanksystem auch wirklich als solches klassifizieren kann, muss es im Gegensatz zur herkömmlichen Datenverarbeitung folgende Anforderungen erfüllen: Strukturierung und Integrität • Das DBS muss durch eine zentrale Struktur die Redundanz von Daten vermeiden • Es soll die Verwaltung von strukturierten Daten ermöglichen • Die logische Trennung von Anwendungsprogramm und Datenspeicher soll möglich sein • Regeln zur Gewährleistung der Datenintegrität sollen bereitstehen und überwacht werden Sprachen Das Datenbanksystem stellt eine Datenbanksprache für folgende Aufgabenbereiche bereit: • Datenabfrage und -manipulation (DML) • Verwaltung der Datenbank und Definition der Datenstrukturen (DDL) • Berechtigungssteuerung (DCL) Brandstätter Andreas, Klaffl Christoph Seite 31von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Diese Operationen können in einer Sprache kombiniert werden (zum Beispiel SQL). Sie können aber auchauf unterschiedliche Sprachen aufgeteilt sein. Mehrbenutzerfähigkeit Ein Berechtigungssystem sorgt dafür, das nur berechtigte Benutzer die gewünschten Informationen einsehen dürfen. Desweiteren stellt das DBS sogenannte locks“ bereit und verwaltet ” diese, um Datenelemente exklusiv für die eigenen Maniplutaionen zu sperren. Darüberhinaus arbeitet das DBS transaktionsorientiert. Darunter versteht man den Vorgang mehrere Anfragen zu einer logischen Einheit zusammenzufassen, damit man sicher gehen kann, dass bei einem Fehler in einem Statement keine der Anfrage durchgeführt wird, sondern stattdessen die Daten im alten Zustand erhalten bleiben. Wichtige Vorgänge werden dabei protokolliert und in Log Dateien gespeichert. Betrieb Für den einwandfreien Betrieb werden folgende Punkte vorausgesetzt: • Große Datenmengen dürfen die Geschwindigkeit des Datenbanksystems nicht signifikant verschlechtern • Ermöglicht Datenbackups und Datenwiederherstellung zur Laufzeit • Daten können im- und exportiert werden • Kann mit anderen Datenbanksystemen zusammenarbeiten (verteilte Datenbanksysteme) 2.3.3 Wartung Die Wartung wird von Datenbank-Administratoren (DBA) übernommen und wird vollständig über die Verwendung der bereitgestellten Datenbanksprache ausgeführt. 2.4 2.4.1 MySQL Allgemeines MySQL ist ein freies und relationales Datenbankverwaltungssystem der schwedischen Firma MySQL AB. Es steht sowohl unter der freien Lizenz GPL als auch unter einer kommerziellen Lizenz zur Verfügung (Duale Lizenz). Der Name setzt sich aus My“, dem Namen der ” Brandstätter Andreas, Klaffl Christoph Seite 32von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Tochter des Mitbegründers Monty Widenius, und SQL“, der Datenbanksprache die für die ” Verwaltung und Abfragen verwendet wird, zusammen. MySQL ist das am weitest verbreitete Open Source Datenbanksystem mit ca. 6 Millionen Installtaionen. Es wird vorwiegend für Webauftritte verwendet und daher auch gernen mit anderer Open Source Software wie dem Apache HTTP Webserver und PHP eingesetzt. Desweiteren wird es mit zahlereichen Produkten mitgeliefert. Vorallem die performante Arbeitsweise macht das System auch für den Businessbereich interessant. Im Jänner 2008 wurde MySQL AB von SUN Microsystems gekauft, an der Offenheit des Systems wird sich nach Informationen von SUN aber nichts ändern. 2.4.2 Aufbau MySQL wurde 1994 als Fork 2 von mSQL entwickelt und der überwiegende Teil des Codes ist in ANSI C/C++ programmiert. Schon am Anfang der Entwicklung wurde MySQL für große Datenmenge und Schnelligkeit ausgelegt, teilweise unter Verlust von Stabilität und Verfügbarkeit. Seit der Version 3.23 besitzt MySQL die Tabellenegine InnoDB“, die den An” foderungen eines Datenbanksystems entspricht. Trotzdem wird standardmäßig die MyISAM“ ” Engine verwendet, die vor allem in Sachen Perfomace punkten kann, dafür aber nicht transaktionsicher ist und keine locks“ verwendet. Mit der Entwicklung des MySQL Clusters wurde ” eine neue Tabellenengine eingeführt, bei der die gesamten Daten im Arbeitspeicher gehalten werden aber keine Beziehungen untersützt. Dadurch ist eine syncrone Replikation der Daten zwischen den Cluster-Rechnern möglich. Die nächsten Versionen brachten Unterstützung für Unions, Query Cache, Unicode und Subqueries. Desweiteren implementierte die Versionsreihe 5 den SQL Standard in der Version 3 fast vollständig und unterstützt nun somit: Views, Triggers, Stored Procedure und User Defined Functions. 2.4.3 Administration Die Administration wird vollständig über SQL Befehle bewerkstelligt. Dies kann zum Beispiel durch den mitgelieferten MySQL Kommandozeilenclient erfolgen. Jedoch ist es komfortabler die MySQL GUI Tools zu verwenden, die direkt von MySQL angeboten werden. 2.4.4 Implemetierung MySQL ist unter den gängigsten Betriebsystemen wie Windows und Linux lauffähig. Die aktuelle stabile Version während der Ausführung dieser Diplomarbeit ist 5.0.51. 2 Fork (...) ist in der Softwareentwicklung ein (Neben-) Entwicklungszweig nach der Aufspaltung eines ” Projektes in zwei oder mehr Folgeprojekte, wobei Teile des Quellcodes kopiert werden und dann unabhängig von dem ursprünglichen Projekt weiterentwickelt werden.“ [22] Brandstätter Andreas, Klaffl Christoph Seite 33von 231 ALFSA 2.5 2.5.1 KAPITEL 2. VERWENDETE TECHNOLOGIEN Linux Allgemeines Linux ist ein freies Multibenutzer Betriebssystem das nach dem Gründer Linus Torvalds benannt wurde. Es entspricht den POSIX Richtlinien 3 und ähnelt sehr einem UNIX System. Linux war ursprünglich ein Terminal-Emulator, da es eher in die Richtung eine Betriebsystems tendierte wurde es von Linus Torvalds fortan als solches entwickelt. Am Anfang der Entwicklung war es als kleines Betriebssystem gedacht, aber durch die Offenheit des Quellcodes und des ganzen Systems, beteiligte sich eine große Masse an Entwicklern an den Programmierarbeiten. Dieser Umstand führte dazu, dass Linux heute eines der technisch fortschrittlichsten Betriebsysteme ist. Zum Beispiel ist Linux dem Windows-System von Microsoft in vielen Bereichen, wie etwa Echtzeitfähigkeit voraus [7] [8]. 2.5.2 Was ist Linux? Mit dem Begriff Linux“ bezeichnet man den Kernel. Er ist der wichtigste Bestandteil ei” nes Betriebsystems und ist für die Interaktion zu den Hardware- und Softwareschnittstellen zuständig. Er verwaltet also unter anderem folgenede Aufgaben: • Die Zuteilung von Prozessorzeit und sonstige Ressourcen an die Programme • Kontrolliert den Zugriff auf Geräte, Speicher jeglicher Art, den Porzessoren • Einhaltung der Zugriffsrechte auf Speicher und Geräte • Gliederung der Ressourcen (Netzwerkstack für Netzwerkkarten, Dateisystem für Speichermedien) • Bereitstellung der Ressourcen (Netzwerk: Sockets, Festplatte: Dateien, Geräte: Spezialdateien, ...) Für ein vollständiges Betriebsystem benötigt man daher zusätzliche Software, welche zum Beispiel die Grafik Ausgabe übernimmt. 2.5.3 Weitere Entwicklung Die Weiterentwicklung von Linux wird von Firmen, Einzelpesonen, Non-Profit-Unternehmen, uvm. sichergestellt. Wie bereits erwähnt ist der Source-Code von Linux frei verfügbar und 3 Das Portable Operating System Interface (POSIX) ist ein (...) standardisiertes Application Programming ” Interface, das die Schnittstelle zwischen Applikation und dem Betriebssystem darstellt.“ [23] Brandstätter Andreas, Klaffl Christoph Seite 34von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN jeder kann sich an den Arbeiten daran beteiligen. Zum Beispiel stellt auch die Firma Google Programmierer bereit um Linux wieter zu programmieren. 2.5.4 Verbreitung Linux erfährt nur eine geringe Nutzung als Desktop Betriebsystem. Dies hat mehrere Gründe: • Mangelnde Benutzerfreundlichkeit: Dieses Argument schwindet in letzter Zeit, da aktuelle Linux Distributionen, wie bespielsweise Ubuntu, sehr einsteigerfreundlich sind und auch zahlreiche grafische Tools bieten um das System zu konfigurieren. • Mangelnde Hardwareunterstützung: Hersteller liefern Geräte in meisten Fällen nur mit Treibern für Windows Betriebssysteme. Gerätetreiber für solche Hardware werden daher von Dritten programmiert, wobei hier das Problem besteht, dass sie die genaue Funktionsweise des Geräts nicht kennen, da Hardware-Hersteller diese geheim halten. Durch diesen Umstand wurden viele Treiber nur durch Reverse-Engineering entwickelt. Bei Server-Hardware bestehen allerdings viel weniger Probleme, da in diesem Bereich Linux und demensprechend auch Treiber dafür gefragt sehr gefragt sind. Es muss jedoch angemerkt werden, dass Linux zum aktuellen Zeitpunkt mehr Geräte als andere Betriebsysteme unterstützt [9]. Weiters sei erwähnt, dass die Zukunft bessere Hardwareunterstützung durch standardisierte Treiber [9] verspricht. • Fehlende Programme: Vielen Nutzern, die gerne umsteigen würden, fehlt es an Software die unter anderen anderen Betriebsystemen verfügbar war, aber nicht unter Linux. Dies betrifft vorallem Spezialsoftware wie Video- oder Musikbearbeitungsprogramme. Es besteht aber auch die Möglichkeit Windows-Programme unter Linux auszuführen. Abhängig von der Komplexität der jeweiligen Anwendungen kann es dabei aber zu Problemen kommen. • Unwissenheit: Die meisten technisch unerfahrenen Anwender wissen jedoch nicht, dass es neben Windows auch freie Alternativen gibt und es fehlt ihnen somit an grundlegendem Coumputerwissen. In anderen Bereichen erfreut sich Linux jedoch großer Beliebheit: • Server: Linux hat sich als ein sehr verlässliches, sicheres und vorallem als leicht wartbares Server System herausgestellt und wird daher vorallem in diesem Bereich verwendet. • Supercomputer: Linux bietet eine gute Skalierbarkeit, Prozessverwaltung und läuft auf vielen Architekturen. Dadurch kann das Potential von Supercomputern durch Linux sehr gut ausgereizt werden. • Emebedded Systeme: Da ein Linux System sehr ressourcenschonend ist und für jegliche Einsatzzwecke angepasst werden kann eignet es sich hevorragend für emebedded Brandstätter Andreas, Klaffl Christoph Seite 35von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Systeme. So kommt es vor, dass viele Endnutzer Linux benutzen ohne es zu wissen, da in viele Routern, Handys, Festplattenvideorekordern, ... ein angepasstes Linux System läuft. 2.5.5 Distribution Linux wird über die Webseite http://kernel.org/ vertrieben. Es stehen dort sowohl die neu” ” en Versionen als auch die alten als Quellcode zur Verfügung. Allerdings ist dies wie bereits erwähnt nur der Kernel der noch übersetzt bzw. kompiliert werden muss. Daher greift der Großteil zu sogenannten Distributionen, die zusätzlich zum kompilierten Kernel noch zusätzliche Software-Pakete mitliefern. Sie enthalten bereits die meiste Software die ein Betriebssystem benötigt und mit welcher der Benutzer auch gewöhnliche Arbeiten, wie das Surfen im Internet oder die Bearbeitung von Dokumenten, ausführen kann. Abhängig von der gewählten Distribution sind alle bzw. fast alle mitgelieferten Programme frei in der Benutzung und auch Open Source. Einige bekannte Distributionen sind: • Debian (http://www.debian.org/) • Ubuntu (http://www.ubuntu.com/) • openSuSE (http://www.opensuse.org/) • Fedora (http://www.fedoraproject.org/) • Sidux (http://www.sidux.org/) 2.6 Subversion 2.6.1 Allgemeines SVN (Subversion) ist ein freies Versionsverwaltungssystem für Dateien und Verzeichnisse, speziell für die Entwicklung von OpenSource Software. Bei solchen Projekten arbeiten sehr viele Entwickler, die häufig rund um den Globus verteilt sind. Somit sind sie auf ein effizientes Versionsveraltungsystem angewiesen, welches die Zusammenarbeit ermöglicht. Ein Projekt bzw. eine Gruppe von Dateien wird als sogenanntes Repository am Server angelegt. 2.6.2 Funktionsweise Für SVN wird ein SVN Server benötigt, der die gesamten Daten verwaltet und Änderungen der Benutzer entgegennimmt und verarbeitet. Bevor der Benutzer/Programmierer mit der Brandstätter Andreas, Klaffl Christoph Seite 36von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Arbeit beginnt, lädt er sich die neue Version der Programmdateien herunter (update) und nach Beendigung der Programmierung überträgt er die neue geänderte Version an den SVN Server zurück (check in) Die Lösungswege für Konflikte bei SVN erklären sich anhand des folgenden Beispieles: Abbildung 2.1: Das Filesharing Problem [2] Harry und Sally laden sich beide die aktuellste Version der Dateien und Verzeichnisse herunter. Sie arbeiten beide an der selben Zeit und beide checken diese Dateien zu unterschiedlichen Zeiten ein. Somit ensteht ein Konflikt, um diesen zu vermeiden werden von Subversion sogenannte locks“ unterstützt: ” Brandstätter Andreas, Klaffl Christoph Seite 37von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Abbildung 2.2: Das Lock-Modify-Unlock Model [2] Bei diese Methoden ist das gleichzeitige Bearbeiten der Dateien unmöglich. Harry holt sich die aktuellste Version und sperrt die Datei die er bearbeitet. Sally will die Datei nun auch bearbeiten und lädt sich wiederum die neuste Version herunter und will die Datei sperren. Doch dieser Vorgang schägt fehl und der SVN Server meldet, dass bereits ein andere Entwickler ein lock“ auf diese Datei gesetzt hast, somit kann Sally die Datei nur lesen aber nicht ” bearbeiten. Wenn Harry seine Arbeiten beendet hat, lädt er die neue Datei hoch und gibt sie wieder frei. Somit kann jetzt Sally einen lock“ beantragen und die Datei bearbeiten. ” Das dieses Verfahren wesentliche Nachteile mit sich bringt liegt auf er Hand. Es kann jeweils nur ein Entwickler an einer Datei arbeiten. Daher gibt es ein weiteres Verfahren, dass nach dem Copy-Modify-Merge Modell“ arbeitet: ” Brandstätter Andreas, Klaffl Christoph Seite 38von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Abbildung 2.3: Das Copy-Modify-Merge Model [2] Beide bearbeiten die gleiche Datei. Nachdem Sally mit ihren Arbeiten fertig ist veröffentlicht sie ihre Version. Wenn Harry seine Version einchecken will bekommt er vom SVN Server einen sogenannten out-of-date error“. Dieser signalisiert Harry, dass ein anderer Entwickler auch ” Änderungen durchgeführt hat. Er lädt sich nun diese Version herunter und muss sie mit seiner Version vergleichen und zusammenführen. Nachdem er die beiden Versionen zusammengeführt hat, kann er diese auf den SVN Server hochladen. Somit sind die Änderungen von Beiden im SVN. Die drei wichtigsten Methoden für die Verwendung von SVN sind: • Check Out: Beim erstmaligen herunterladen eines Repositories • Check In: Um Änderungen im Repository zu übernehmen • Update: Neueste Version des Repositories wird heruntergeladen 2.6.3 Implemetierung Es gibt zahlreiche freie SVN Clients und SVN Server für die meisten Betriebssysteme (AIX, Linux, Windows, Mac OS X, *BSD, Solaris, OS/400). Brandstätter Andreas, Klaffl Christoph Seite 39von 231 ALFSA 2.7 KAPITEL 2. VERWENDETE TECHNOLOGIEN SSL 2.7.1 Allgemeines SSL ist die Abkürzung für Secure Sockets Layer“ wird aber unter den Namen Transport Layer ” Security (TLS) weiterentwickelt. Im folgenden wird für beide Bezeichnungen die Abkürzung SSL verwendet. SSL dient zur Verschlüsselung der Datenübertragung über das Internet. Es wurde entwickelt um wichtige Daten, die über das Internet übertragen werde, vor Dritten und vor Manipulationen zu schützen. Dazu bietet SSL verschiedene Verfahren zur Authentifizierung und Verschlüsselung. 2.7.2 Funktionsweise Mit SSL lassen sich verschiedenste Protokolle (HTTP, FTP, ...), die selber keine Methoden zur Verschlüsselung bieten, absichern. Im OSI-Modell 4 befindet sie sich somit zwischen Anwendungsschicht und Transportschicht. Das SSL Protokoll ist in 2 Schichten aufgeteilt: • SSL Handshake Protocol: Baut auf den SSL Record Protocol (siehe nächsten Punkt) auf und wird vor dem eigentlichen Datentransfer ausgeführt. Es übernimmt die folgenen Aufgaben: – Identifikation und Authentifizierung: Diese Funktion ist optional und wird zur Verschlüsselung der Datenübertragung nicht benötigt. Sie dient lediglich zur Verifizierung der Identitäten von Server und Client über asymetrische Verschlüsselungalgorithmen. – Auswahl der verwendeten Algorithmen: Durch diesen Vorgang werden die zu verwendete Schlüssel und Algorithmen ausgehandelt. Der Vorgang des Handshakes lässt sich in vier Phasen einteilen: – Phase 1: Der Client schickt eine Anfrage an den Server und der Server antwortet dem Client. Die Inhalte der Nachrichten sind die höchste Version des SSL Protokolls, die der Client unterstützt, eine 32 Bit lange Zufallszahl für die spätere Verschlüsselung, eine Session ID und den zu verwendeten Verschlüsselungsalgorithmus. – Phase 2: [optional] Der Server schickt zur Identifikation seiner Identität sein Serverzertifikat an den Client. Dieser kann sich dann die Echtheit des Zertifikats durch eine Zertifizierungstelle überprüfen und bei Verdacht auf einen Betrugsversuch die 4 Das OSI-7-Schichtenmodell oder OSI-Referenzmodell beschreibt das Durchlaufen von 7 Schichten in de” nen Funktionen und Protokolle definiert sind und einer bestimmten Aufgabe bei der Kommunikation zwischen zwei Systemen zugeordnet sind.“ [24] Brandstätter Andreas, Klaffl Christoph Seite 40von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Übertragung zu dem Server verweigern. Der Server kann in dieser Phase auch einen Zertifikatsantrag an den Client schicken, das heißt, dass der Client sich beim Server identifiziert. – Phase 3: [optional] In dieser Phase identifiziert sich der Client beim Server, indem er sein Zertifikat sendet. Falls der Client kein Zertifikat besitzt teilt er diesen Umstand dem Server mit. Der Server kann das Zertifikat kontrollieren und feststellen ob die Identität des Client stimmt. Hier kontrolliert auch der Client die Identität des Servers mittels des zuvor empfangenen Zertifikats. – Phase 4: Die letzte Phase schließt den Handshake Vorgang ab. Aus dem premaster-key wird durch 2 Hashfunktionen (SHA-1 und MD5) das Master Secret durch Miteinbeziehung der 32 Bit langen Zufallszahl errechnet. Dieser einmalige Schlüssel dient für die gesamte SSL Sitzung hinweg zur symetrischen Verschlüsselung der Datenübertragung. • SSL Record Protocol: Bildet die untere Schicht der beiden SSL Schichten. Wird für die Absicherung der Verbindung verwendet. Sie stellt 2 grundlegende Funktion zur Verfügung, die unabhängig voneinader genutz werden können: – Ende-zu-Ende-Verschlüsselung: Wird durch symetrische Verschlüsselungsalgorithmen realisiert. SSL unterstützt die folgenden Alogroithem zur Verschlüsselung: DES, Triple DES und AES. Die benötigten Schlüssel werden dazu schon im Voraus über das SSL Handshake Protocol ausgehandelt und gilt nur für eine Verbindung. – Sicherung der Nachrichtenintegrität: Ihre Aufgabe ist es Sicherzustellen, dass die Nachrichten ohne Fehler übertragen wurden. Dies wird durch verschiedene Hash-Funktionen erreicht, wie zum Beipsiel SHA-1 und MD5 Ein einfacher SSL Sitzungaufbau sieht folgendermaßen aus: Abbildung 2.4: SSL Sitzungsaufbau • 1: Der Browser sendet eine Anfrage an den Webserver Brandstätter Andreas, Klaffl Christoph Seite 41von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN • 2: Der Webserver antwortet dem Client und teilt ihm mit, dass es sich um eine gesicherte Seite handelt und sendet den öffentlichen Schlüssel seines Zertifikates für die asymetrische Verschlüsselung • 3: Da es sich um einer sicher Seite handelt generiert der Browser eine Zufallszahl • 4: Die Zufallszahl wird mit dem öffentlichen Schlüssel des Webservers verschlüsselt und zurückgesendet • 5: Der Webserver entschlüsselt die Nachricht mit seinem privaten Schlüssel und fängt mit der fortlaufenden symetrischen Verschlüsselung der Verbindung an • 6: Die gesamte Datenübertragung wird jetzt mit dem Zufallsschlüssel verschlüsselt 2.7.3 Verschlüsselungsverfahren Symetrisch Bei symetrischen Algorithmen werden die zu verschlüsselnden Daten mit einem geheimen Schlüssel sowohl kodiert als auch dekodiert. Daher muss bei allen Beteiligten dafür gesorgt werden das der Schlüssel geheim bleibt. Das größte Problem ist die Übermittlung des geheimen Schlüssels an alle Teilnehmer. Deshalb wird in der Praxis die symetrische und asymetrische Verschlüsselung kombiniert (siehe Hybrid-Verschlüsselung). Dadurch ist es möglich im Voraus über das asymetrische Verfahren den geheimen Schlüssel für den verwendeten symetrischen Algoritmus zu übertragen. Der große Nachteil an symetrischen Verfahren ist daher das Verwenden des geheimen Schlüssels für die Ver- und Entschlüsselung. Asymetrisch Bei asymetrischen Algorithmen werden zwei verschiedene Schlüssel zur Ver- und Entschlüsselung verwendet. Dieses Schlüsselpaar besteht aus einem öffentlichen Schlüssel, der von jedem eingesehen werden kann, und einem privaten Schlüssel, den nur der Eigentümer kennen darf und das eigentliche Geheimnis beinhaltet. Die Daten werden vom Sender mit dem öffentlichen Schlüssel des Empfängers verschlüsselt und können dann nur noch mit dem privaten Schlüssel des Empfängers entschlüsselt werden. Somit ist sichergestellt das nur der Empfänger die Nachricht entschlüsseln kann. Dadurch ist das System sehr sicher und wird bei Applikationen wie SSH (Secure Shell) verwendet. Asymetrische Verfahren beanspruchen deutlich mehr Rechenlesitung als symetrische Verfahren und arbeiten daher deutlich langsamer. In der Praxis werden daher hybride Verfahren benutzt. Ein weiterer Nachteil besteht darin, dass die Sicherheit bei vielen asymetrischen Brandstätter Andreas, Klaffl Christoph Seite 42von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Verfahren nicht bewiesen ist sondern nur angenommen wird, dass die verwendeten mathematischen Einwegverfahren nur mit extrem hohen Rechenaufwand umgekehrt werden können. Außerdem kann man durch einfaches“ probieren von Schlüsseln versuchen die mit dem öffent” lichen Schlüssel verschlüsselten Daten zu entschlüsseln und somit auf den privaten Schlüssel zu kommen. Jedoch würde man dafür sehr viel Rechenleistung aufbringen müssen. Mittelsmann- oder Man-In-The-Middle-Attacken können durch die Verwendung von Prüfsummen (Nachrichtenintegrität) oder durch vertrauenswürdige Zertifizierungstellen verhindert werden. Bei solchen Attacken steht der Angriffer in der Mitte der Datenübertragung. Beim Aufbau der Verbindung sendet der Anfreifer seinen öffentlichen Schlüssel an den Client. Die Antwort wird mit seinem privaten Schlüssel entschlüsselt und mit dem öffentlichen Schlüssel des Zielservers wieder verschlüsselt und an diesem gesendet. Hybrid Die hybriden Verfahren kombinieren die asymetrischen mit den symetrischen Algorithmen. Dabei wird der geheime Schlüssel für die symetrische Verschlüsselung durch das asymetrische Verfahren übertragen. Danach läuft der gesamte Datenverkehr über das symetrische Verschlüsselungsverfahren ab. Somit benötigt der gesamte Vorgang nur beim Schlüsselaustausch viel Rechenleistung, da bei der symetrischen Verschlüsselung die benötigte Rechenleistung nicht so groß ist. Hybride Verfahren kommen zum Beispiel bei SSL zum Einsatz. 2.7.4 Vorteile Mit SSL jedes Protokoll, welches sich in der Anwendungsschicht befindet (POP3, HTTP, FTP, SQL, ...), verschlüsselt werden ohne jegliche Unterstützung seitens des verwendeten Protokolls. Beispiel: Es existiert ein Netzwerk mit 5 Hosts die über einen Hub miteinander verbunden sind. Ein Router der auch am Hub angeschlossen ist, ermöglicht den Zugang zum Internet. Ein Benutzer ruft an einem Computer seine E-Mails ab, ist aber interessiert, dass der Inhalt nicht für andere nicht lesbar ist (Durch den Hub können alle Netzwerkteilnehmer die übertargenen Daten, wie in diesem Fall die E-Mails, mitlesen). Daher verwendet er eine verschlüsselte POP3 Verbindung mit SSL. Somit können die anderen Netzwerkteilnehmer zwar noch immer die übertragenen Daten sehen, können sie aber nicht lesen bzw. entschlüsseln da ihnen der Schlüssel fehlt. Brandstätter Andreas, Klaffl Christoph Seite 43von 231 ALFSA 2.7.5 KAPITEL 2. VERWENDETE TECHNOLOGIEN Nachteile Der größte Nachteil an SSL ist die Rechenzeit die am Server verbraucht wird. Diese ist beim Verbindungsaufbau sehr hoch und lässt, je nachdem welcher Verschlüsselungsalgorithmus verwendet wird, nach wenn die Sitzung aufgebaut ist. Ein weiterer Nachteil ist die Tatsache, dass sich die verschlüsselten Daten nicht mehr gut komprimieren lassen und somit transparente Kompressionsmethoden nicht mehr funktionieren (zum Beispiel eine komprimierte VPN Verbindung), jedoch beinhaltet die neuren SSL Spezifikationen Möglichkeiten zur Kompression, die jedoch aufgrund von Performanceverlusten in den meisten Fällen nicht verwendet werden. 2.7.6 Probleme Die Verschlüsselung von HTTP hat im Zusammenhang mit dem Apache Webserver bzw. jedem anderen Webserver, der die gleiche Funktion unterstützt, Probleme. Es ist nicht möglich einen verschlüsselten Virtual Host (VHost) über SSL an einen bestimmten Servernamen zu binden, da der Servername erst durch das HTTP Prtotokoll gesendet wird und dieses zum Zeitpunkt des SSL Sitzungsaufbaus noch keine Daten übertragen kann. Daher können Virtual Hosts mit SSL nur mit IP/Port Kombinationen realisiert werden. Jedoch wurde in neueren Spezifikationen (TLS 1.2) dieses Problem durch die Server Name Indication“ Funktion be” hoben. 2.7.7 Implementierungen Mit OpenSSL existiert eine freie Umsetzung des SSL Protokolls für die meisten aktuellen Betriebsysteme (Linux, Unix, Windows, Mac OS X). Sie unterstützt weitgehendst die meisten Verschlüsselungs- und Authentifizierungsverfahren. Mit GnuTLS exisitiert eine weitere freie Implementierung von SSL. Sie steht unter einer noch freieren“ Open Source Lizenz (BSD) ” und darf somit mit eigenen Produkten vertrieben werden (zum Beispiel ist GnuTLS in GNOME, Exim oder Lynx vertreten), läuft allerdings nur auf Unix und Linux Systemen. Desweiteren unterstützt GnuTLS mehr Möglichkeiten zur Authentifizierung (SRP, x.509, OpenPGP), darüber hinaus ist es auch mögliche den ganzen Datentransfer zusätzlich mittels zlib oder LZO zu komprimieren. Aktuelle Webbrowser, wie Firefox, Netscape, Opera oder Lynx, untersützen SSL. Sie beherschen nicht alle SSL Verfahren jedoch die gerbräuchlichsten. Die am meist vorkommende Verschlüsselungverfahren für Webseiten sind TLS mit RSA- oder AES-Algorithmus. Brandstätter Andreas, Klaffl Christoph Seite 44von 231 ALFSA 2.8 2.8.1 KAPITEL 2. VERWENDETE TECHNOLOGIEN PHP Allgemeines PHP ist die Kurzform für PHP: Hypertext Preprocessor“ (Früher: Personal Home Page ” ” Tools“) und ist eine interpretierte Skriptsprache die von der Syntax her C bzw. C++ sehr ähnelt. Sie ist Open Source und wird ständig weiterentwickelt. Im Gegensatz zu Javascript wird PHP severseitig ausgeführt und nur die Ausgabe wird an die Clients (Browser) gesendet, dadurch bleibt dem Client der Programmcode verborgen. PHP zeichnet sich besonders durch die leichte Erlernbarkeit aus, sodass man keine besonderen Vorkenntnisse benötigt werden um PHP Skripte zu schreiben. PHP verfügt darüber hinaus über eine große Anzahl an Datenbanktreibern (MySQL, PostgreSQL, ....) und zusätzlichen Funktionsbibliotheken (zum Beispiel Bibliotheken zur Erzeugung von dynamischen Bildern). PHP wird hauptsächlich für dynamischen Webseiten eingesetzt kann aber auch für andere Zwecke verwendet werden: • Kommandozeilen Skripts (PHP Kommandozeileninterpreter wird zum Ausführen benötigt) • Clientseitige GUI Applikationen (ohne Webserver über die GTK Grafikbibliothek) 2.8.2 Funktionsweise Bei PHP wird der Programmcode serverseitig ausgeführt. Dadurch wird der Quelltext nicht an den Browser am Client gesendet sondern dem PHP Interpreter zugeführt. Bei einem Webserver kann der PHP Interpreter über mehrere Schnittstellen (CGI,...) angebunden werden, bei der CGI Methode muss jedoch bei jeder Ausführung eines PHP Programmcodes der Interpreter eigens gestartet werden. Dadurch dauert diese Methode deutlich länger als bei den anderen Möglichkeiten. Beim freien Apache Webserver kann der PHP Interpreter als Modul geladen werden, sodass gegebenenfalls sofort mit der Ausführung begonnen wird. Eine Anfrage an einem Webserver läuft meistens wie folgt ab: Der Client fordet vom Webserver eine Datei an, zum Beispiel index.php. Der Webserver lädt dann die Datei von der Festplatte, stellt fest dass es sich um eine Datei vom Typ PHP handelt und übergibt die Datei dem PHP Interpreter. Dieser arbeitet die Datei ab. Die Ausgabe wird bereits während der Abarbeitung an den Webserver zurückgegeben und dieser sendet die Ausgabe weiter an den Browser am Client. Durch dieses Prinzip kann der Client keinen PHP Programmcode einsehen und muss diesen daher auch nicht ausführen. Dadurch entfallen eventuell benötigte Plugins und Zusatzsoftware, die bei einer clientseitgen Ausführung benötigt würden. Desweiteren brauchen die Clients keine Verbindung zu dem Datenbankserver, falls einer verwendet wird. Die Nachteile liegen dafür aber auch klar auf der Hand: Für jeden Aufruf der Datei muss diese neu intepretiert werden, da PHP standardmäßig keinen Bytecode-Cache besitzt. Dadurch kommt es eventuell zu einer starken Auslastung des Webservers und die Reaktionszeiten verlängern sich. Es existieren jedoch verschiedene Bytecode-Cache Systeme um diesem Verhalten entgegenzuwirken. Brandstätter Andreas, Klaffl Christoph Seite 45von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Abbildung 2.5: PHP Funktionsprinzip 2.8.3 Syntax Ein einfaches Hallo Welt“-Beispiel sieht folgendermaßen aus: ” 1 2 3 <?php echo "Hallo Welt!"; ?> Listing 2.1: PHP Syntaxbeispiel 2.8.4 Implementierung PHP ist plattformunabhängig und läuft auf allen gängigen Betriebssystemen. Dazu gehören Linux, Unix, Mac OS X, Windows, ... . Es existieren PHP Module für die meisten heute gebräuchlichen Webserver wie, Apache, lightHTTPD, Microsoft IIS, ... . Die Webserver, für die es keine speziellen Module gibt, können den PHP Interpreter über CGI aufrufen, sofern sie diese Methode unterstützen. 2.9 2.9.1 JAVA Allgemeines JAVA ist eine objektorientierte Programmiersprache der Firma Sun Microsystems. Um Java Programme ausführen zu können ist die Java Runtime Enviroment erforderlich die frei zur Verfügung steht. Java lehnt sich sehr an C++ an und hat auch zum Ziel die erfolgreichen Brandstätter Andreas, Klaffl Christoph Seite 46von 231 ALFSA KAPITEL 2. VERWENDETE TECHNOLOGIEN Features von C++ bieten zu können, ist jedoch komplett aus Klassen aufgebaut. Java ist zudem plattformunabhängig, sodass Programme, die in Java geschrieben sind, auf verschiedenen Computersystemen ausgeführt werden können. Java gilt fälschlicherweise oftmals als sehr langsam. Jedoch ist diese Behauptung nicht unbedingt korrekt. Die GUI Libary Swing bzw. AWK ist für diesen Ruf maßgeblich verantwortlich, da diese tatsächlich langsamer arbeiten als vergleichsweise die GUI von .NET Framework. Dieser Umstand rührt daher, da die GUI Libary bei Java auf jedem System laufen muss. In anderen Bereichen kann Java sehrwohl adequate Laufzeiten bieten [3]. 2.9.2 Funktionsweise Java Programme werden in Byte-Code übersetzt. Damit dieser Byte-Code ausgeführt werden kann, wird benötigt die Java Virtual Machine (JavaVM), die Teil der Java Runtime Enviroment ist benötigt. Die JavaVM interpretiert den erzeugten Byte-Code und kompiliert ihn gegebenfalls (JIT-Compiler). Durch den JIT-Compiler (Just in Time Compiler) wird der Byte-Code zur Laufzeit des Programms in nativen Maschinencode umgewandelt und für die jeweilige Computerplattform optimiert. Bei Programmen, die länger laufen und bei denen der Programmcode mehrmals abgearbeitet wird, erreicht man dadurch viel höhere Ausführungsgeschwindikeiten als wenn der Byte-Code nur interpretiert wird. Das Speichermanagement übernimmt Java selbst ( garbage collector“), sodass Speicherlecks ” größtenteils vermieden werden und nicht verwendeter Speicher automatisch freigegeben wird. Java stellt auch viele Sicherheitsfunktionen zur Verfügung mit denen überprüft wird, dass kein ungültiger Byte-Code ausgeführt wird, sowie dass auf Programmobjekte nur zugegriffen werden darf, wenn die Rechte dazu gegeben sind. 2.9.3 Syntax Ein einfaches Hallo Welt“-Beispiel sieht so aus: ” 1 2 3 4 5 public class HalloWelt { public static void main(String[] args) { System.out.println("Hallo Welt!"); } } Listing 2.2: JAVA Syntaxbeispiel Anhand des Syntax Beispiel wird deutlich, dass Java in Klassen aufgebaut ist. Beim Programmstart wird die Standardmethode main“ der Klasse aufgerufen. ” Brandstätter Andreas, Klaffl Christoph Seite 47von 231 ALFSA 2.9.4 KAPITEL 2. VERWENDETE TECHNOLOGIEN Implementierung Die Java Runtime Enviroment von Sun steht für die Betriebssysteme Linux, Mac OS X, Solaris und Windows zur Verfügung. Es existieren auch Open-Source Alternativen, die jedoch vom Funktionsumfang sehr beschränkt sind und deshalb den Großteil der Programme nicht ausführen können. Brandstätter Andreas, Klaffl Christoph Seite 48von 231 ALFSA KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Kapitel 3 Analysen und Entscheidungen 3.1 3.1.1 Betriebssysteme Debian Etch (LINUX) Debian Etch ist eine Linux Distribution, die vorallem auf Stabilität achtet. Die Programmpakete müssen einen langen Testzyklus durchlaufen, bis sie wirklich in die stabile Variante der Distribution aufgenommen werden. Dies führt dazu, dass kaum Probleme mit Programmen auftreten. Debian setzt auf den Linux Kernel 2.6 und hat somit eine solide Basis für ein Server System, das skalierbar und effizient arbeitet. Der Linux Kernel war von Anfang der Entwicklung an als Client/Server System ausgelegt und ist daher technisch hoch entwickelt. Debian eignet sich für simple Anwendugen genauso wie für komplizierte Aufgaben. Pro • Einfache Installation und Verwaltung von Software mittels apt-get“ ” • Schnelle und Bandbreiten sparende Remoteadministration über SSH • Schlankes Serversystem, da keine Graphische Oberfläche für den Betrieb erforderlich ist (Ressourcenschoned) • POSIX konform • OpenSource“ und kostenlos ” • Uneingeschränkte Benutzung auf einer beliebigen Anzahl von Servern/Clients • Es werden viele verschiedene Computer Architekturen (darunter x86, x86 64, PPC, SPARC, ...) unterstützt Brandstätter Andreas, Klaffl Christoph Seite 49von 231 ALFSA KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN • Sicherheitsupdates werden schnell bereitgestellt • Durchdachtes Sicherheitskonzept (Dienste werden als eigener unpriviligierter Benutzer ausgeführt) Contra • Kein direkter Support von Debian (Support kann von bestimmten Firmen wie z.B. HP gekauft werden) 3.1.2 Microsoft TM Windows Server 2003 Windows Server 2003 ist ein komerzielles Serverbetriebssystem von Microsoft. Es setzt auf einen NT Kernel und ist folglich für Netzwerkaufgaben ausgelegt. Das Hauptaugenmerk liegt auf der einfachen Konfiguration, mit welcher allerdings nur vorgegebe Lösungen eingestellt werden könne. Es eignet sich für simple Anwendugen und begrenzt für komplizierte Aufgaben, da das System nicht einfach über die inkludierten Funktionen und Konfigurationen hinaus erweitert werden kann. Pro • Direkter Support bei Microsoft • Zentrale Serververwaltung (nur für Microsoft eigenen Serverdienste) Contra • Graphische Oberfläche wird zum Betrieb vorausgesetzt (verbraucht viele Ressourcen) • Zusätzlich zu den teuren Lizenzen für den Server werden auch Lizenzen für die angeschlossenen Clients/Server benötigt • Keine definierten Schnittstellen zu den Serverdiensten und fehlende Interoperabilität mit andern Betriebssystemen 3.1.3 Entscheidung Die Entscheidung fiel auf das freie Linux Betriebsystem, da es für die gegebenen Anforderungen bestens geeignet ist. Das System von Microsoft wäre funktionell gesehen auch geeignet, jedoch es ist zu aufgeblasen“ bzw. verbraucht mehr Hardwareresourcen als das Linux System. ” Desweiteren würden sich die Kosten für Lizenzen nicht rechnen. Brandstätter Andreas, Klaffl Christoph Seite 50von 231 ALFSA 3.2 3.2.1 KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Datenbank Server MySQL [16] [17] MySQL ist eine freier, Open Source“ Datenbank Server, der sich großer Beliebtheit erfreut, da ” er kostenlos und äußerst performant ist. Er ist von Grund auf mit dem Ziel, sehr schnell zu sein, entwickelt worden. Deswegen beschränkt sich MySQL auf die grundlegenden Funktionen einer Datenbank. Zunkünftig sollen mehr Funktionen für den Enterprise Betrieb in Unternehmen hinzukommen. Pro • Freie Wahl zwischen verschiedenen Datenbanktreibern (MyISAM, InnoDB, . . . ) • Geringer Speicherverbrauch auf der Festplatte • Freie Lizenz (GPL) • Plattformunabhängig • Bessere Performance gegenüber PostgreSQL und MS SQL Server [16] [17] Contra • Wenige Datenbankfunktionen im Vergleich zu anderen Datenbanksystemen 3.2.2 PostgreSQL [17] PostgreSQL ist ebenfalls eine freier, Open Source“ Datenbank Server, der sich einer ähnlichen ” Popularität erfreut wie MySQL. Er wird jedoch mit dem Ziel, möglichst viele Funktion zu bieten, entwickelt. Pro • Weiterverkauf mit den eigenen Produkten möglich (BSD Lizenz) • Plattformunabhängig • Viele Datenbankfunktionen Brandstätter Andreas, Klaffl Christoph Seite 51von 231 ALFSA KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Contra • Kein direkter Support (Support kann von anderen Firmen gekauft werden) 3.2.3 Microsoft SQL Server 2005 [16] Microsoft SQL Server ist ein komerzieller Datenbankserver, der vorallem in Unternehmen zum Einsatz kommt. Er ist für große Datenbanken ausgelegt und bietet alle wichtigen Funktionen eines großen Datenbanksystems (wie z.B. Oracle). Durch die vielen komplexen Funktionen ist er allerdings langsamer und verbraucht mehr Ressourcen (RAM + Festplattenplatz) für SQL Queries. Pro • Erweiterte Replikationsmöglichkeiten • Zertifiziert als C-2 1 konform [25] • Bietet Funktionen, die für große Datenbank ausgelegt bzw. notwendig sind Contra • Lizenzkosten (für den Server und für die weiteren Clients) • Bindung an das Windows Server 2003 Betriebssystem • Mehr Ressourcen werden benötigt 3.2.4 Entscheidung Der Microsoft SQL Server 2005 ist für diese Diplomarbeit nicht geeignet, da er nicht auf dem ausgewählten Serversystem läuft. Desweitern ist der Microsoft SQL Server 2005 zu teuer. Die Entscheidung fiel daher zwischen MySQL und PostgreSQL. Letzendlich wurde de Datenbankserver MySQL ausgewählt, da er der performantere ist. 1 C2 ist die höchste Zertifizierungsklasse für Behörden und Regierungen (in den USA) [25] Brandstätter Andreas, Klaffl Christoph Seite 52von 231 ALFSA 3.3 3.3.1 KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Replikation vs. Cluster [19] [18] Cluster allgemein Ein Cluster ist ein Verbund von mehreren Systemen zu einem hocheffizienten und/oder ausfallsicheren Computersystem. Damit Cluster Systeme die Leistung erbringen, die man erwartet, müssen sie über schnelle Netzwerkverbindungen untereinander ausgestattet sein. Pro • Hochverfügbarkeit und Vermeidung von Single-Point-of-Failure automatisch gegeben bzw. leicht implementierbar • Hohe Gesamt-Performance durch ausschließliche Speicherung der Daten im RAM möglich (z.B. bei MySQL) • Synchrone Datenhaltung in Echtzeit Contra • gute Netzwerkverbindung zwischen den Knoten ist eine Vorraussetzung (üblich >= 100Mbit) • hoher Bedarf an Hardware bei Realisierung ohne Doppelaufgaben und Single-Piont-ofFailure (vgl Mysql-Cluster: 2xStorage Node, 2xSQL Node, 2xManagement Node) • Es ist nicht möglich, Knoten online hinzuzufügen oder zu löschen (der Cluster muss in solchen Fällen neu gestartet werden) (bei MySQL) 3.3.2 Active-Passive-Cluster Bei einem Active-Passive-Cluster verliert man den Vorteil der Performancesteigerung. Dabei wird nur ein Node für die Bearbeitung der Anfragen verwendet und die anderen synchronisieren nur die Änderungen. Falls der Master-Node ausfällt, übernimmt meist ein Slave-Node die Aufgaben des Masters. Pro • Die Hardware des Passiv-Clusters wird weniger stark belastet, wodurch sich dessen Lebensdauer erhöhen kann Brandstätter Andreas, Klaffl Christoph Seite 53von 231 ALFSA KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Contra • Keine Performancesteigerung möglich, nur Erhöhung der Verfügbarkeit • Normalerweise treten kurze Unterbrechungen bei der Übernahme auf (im Bereich einiger Sekunden) 3.3.3 Active-Active-Cluster Ein Active-Active-Cluster ist jenes System, das man sich unter den Namen Cluster vorstellt. Alle Nodes des Clusters stehen für die Bearbeitung der Anfragen zur Verfügung, jedoch muss ein Load Balancer 2 die ankommenden Anfragen auf die Nodes verteilen. Pro • es ist möglich höhere Performance als bei Active-Passive-Clustern zu erreichen Contra • Load-Balancing ist notwendig um das Active-Active System zu betreiben 3.3.4 Replikation allgemein Bei der Replikationen werden die Daten zeitgesteuert bzw. aktionsgesteuert zu den anderen Teilen des Datenbank Systems synchronisiert bzw. repliziert. Die Schwierigkeit besteht darin, alle Nodes untereinadner zu synchronisieren, ohne dass Konflikte enstehen, die sich nur durch besonders durchdachte DB-Konzepte vermeiden lassen. Pro • leichte Skalierbarkeit bei eigener Implementation Contra • kurzzeitige Asyncronität bei Zeitgestreuerter Replikation • eigene Load-Balancing bzw. Fail-Over-Lösung notwendig 2 Der Load Balancer ist ein Lastverteiler, der die Antwortzeiten und Auslastung einzelner Server beurteilen ” kann und eine Anfrage von außen mit der bestmöglichen Server-Performance bedienen kann.“ [26] Brandstätter Andreas, Klaffl Christoph Seite 54von 231 ALFSA 3.3.5 KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Master-Slave Replikation Bei der Master-Slave Replikation können keine Konflikte unter den Node entstehen, da es nur einen Master gibt, der Datenänderungen entgegen nimmt. Jedoch können von allen beteiligten Slave Nodes auch Datensätze gelesen werden. Bei einem Ausfall des Master Node bedeutet das aber den Totalausfall sofern keine Fail-Over Lösung vorhanden ist. Pro • Slave werden als Quellen bezüglich fehlerhafter Daten ausgeschlossen • Online Hinzufügen von Slave Nodes möglich Contra • Totalausfall des Systems bei Ausfall des Masters, wenn Master nicht von Slave übernommen wird • Datenänderungen müssen am Master durchgeführt werden, nur Selects können an Slave delegiert werden • Im Fehlerfall können keine Datenänderungen durchgeführt werden, oder im Fail-Back Fall müssen Daten von den Slaves auf den Master übertragen werden 3.3.6 Master-Master Replikation Bei der Master-Master Replikation können auf jedem Node Datenänderungen vorgenommen werden und Datensätze gelesen werden. Jedoch kommt es sehr leicht zu Konflikten, da gleiche Einträge auf verschiedenen Nodes während der Eingabe nicht überprüft werden können. Erst bei der Synchronisationen treten diese Probleme auf, um welche sich dann eine spezielle Synchronisationsimplementierung kümmern muss. Vorallem Auto Increment Werte stellen ein großes Problem dar und sollten deshalb auf Systemen mit Master-Master Replikationen nicht eingesetzt werden. Pro • komplett identische Server möglich (auf Software und Konfiguration bezogen) Contra • Aufwendige Prüfung der zu synchronisierenden Daten notwendig (welche Daten sind von welchen zu überschreiben) Brandstätter Andreas, Klaffl Christoph Seite 55von 231 ALFSA 3.3.7 KAPITEL 3. ANALYSEN UND ENTSCHEIDUNGEN Entscheidung Nach ausführlichen Überlegungen wurde eine Master-Master Replikation ausgewählt, die wir selbst implementiert bzw. programmiert wurde. Ein Cluster System wäre nicht möglich gewesen, da geplant ist die Server an unterschiedlichen geographischen Standorten zu betreiben. Daraus folgt das die Netzwerk-Geschwindigkeit zwischen den Nodes zu langsam für einen Cluster wäre. Brandstätter Andreas, Klaffl Christoph Seite 56von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Kapitel 4 Planung und Implementierung 4.1 Server aufsetzen Es wurde zur Entwicklung seitens der Feuerwehr Sieghartskirchen ein Server zur Verfügung gestellt. Die zwei weiteren Server wurden vom Entwicklerteam selbst für die Dauer der Diplomarbeit bereitgestellt. 4.1.1 Installationsmedium besorgen Das Linux System Debian Etch“ lässt sich auf verschiedene Art und Weise installieren, wie ” zum Beispiel über das Netzwerk, von einem USB Stick oder über eine CD-Rom. Es wurde die CD Installationsmethode gewählt. Die benötigten ISO-Images können von der Debian Hauptseite (http://www.debian.org/) bzw. von den zahlreichen Mirror Seiten herunterladen werden, auch eine Downloadmöglichkeit über das BitTorrent1 System steht zur Auswahl. Einige Seiten, über die das Installationsmedium bezogen werden kann, sind: • http://www.debian.org/ • http://gd.tuwien.ac.at/ • http://debian.planetmirror.com/ • http://mirror.aarnet.edu.au/ • http://debian.inode.at/ • http://esda.wu-wien.ac.at/ 1 Filesharing Protokoll für die schnelle Verteilung von großen Datemengen Brandstätter Andreas, Klaffl Christoph Seite 57von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Die aktuelle Version (während der Ausführung dieser Diplomarbeit) ist 4.0r3. Das Suffix r3“ ” kennzeichnet den vierten Release, der hauptsächlich die letzten Sicherheitsupdates seit dem ersten Releases beinhaltet. Es ist zu empfehelen die MD5 Checksumme zu kontrollieren um sicherzugehen, das das Image ohne Fehler heruntergeladen wurde. Das ISO-Image wird mit einem entsprechendenen Programm auf CD gebrannt und in das CD Laufwerk des Servers eingelegt. 4.1.2 Installation Um die Installation zu starten wird der Server mit der Installations CD gebootet. Es sollte der Startbildschirm von der Debian CD geladen werden. Nun können einige Optionen angegeben werden (z.B.: für mehr Ausgabe) bzw. entscheiden werden, ob ein textbasierter Installer oder ein graphischer Installer gestartet werden soll. Wird ENTER“ gedrückt, so wird und mit ” den Standardeinstellungen fortgefahren, worauf sich der textbasierte Installer startet. Die einzelnen Installationsschritte sind eingeteilt in: 1. Regionale Einstellungen: Hier wird die Sprache und das Land eingestellt sowie das Tastaturlayout 2. Laden der Installationsmodule: Die benötigten Treiber und Installationsdaten werden geladen 3. Netzwerkkonfiguration: Es wird versucht das Netzwerk automatisch mit DHCP zu konfigurieren, wenn dies fehlschlägt, muss selbst eine IP Einstellung gewählt werden 4. Partitionierung: Hier wird die Festplatte partitioniert und für die Installation vorbereitet 5. Installieren des Basissystem: Die Basiskomponenten werden auf die Festplatte installiert 6. Softwareauswahl: Es können Softwarepakete ausgewählt werden, die installiert werden (WEB Server, Dateiserver, Desktop, ...) 7. Bootloader: Wird automatisch auf die erste Festplatte installiert 8. Neustart: Nach erfolgreicher Installation wird neu gestartet Nach dem Neustart des Systems startet das Debian System automatisch von der Festplatte und kann konfiguriert bzw. es kann Software nachinstalliert werden. Nach dem Installationsvorgang sollten die neusten Sicherheitsupdates heruntergeladen werden und installiert werden. Dies wird über die folgenden Befehle erreicht: 1 root@euklid:˜$ apt-get update Brandstätter Andreas, Klaffl Christoph Seite 58von 231 ALFSA 2 3 4 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG ....AUSGABE.... root@euklid:˜$ apt-get upgrade ....AUSGABE.... Listing 4.1: Systemaktualisierung 4.1.3 Konfiguration Der Server benötigt im Wesentlichen keine weitere Konfiguration. 4.2 SSH Server aufsetzen Damit die Server entfernt administriert werden können wird ein SSH Server benötigt, mit dem es möglich ist eine Terminalsitzung remote zu öffnen. Desweiteren wird dieser auch für die Server-Server Syncronisation verwendet. 4.2.1 Installation Die Installation gestaltet sich nach dem Debian Prinzip sehr einfach und es reicht folgender Befehl, der im Terminal ausgeführt wird: 1 2 root@euklid:˜$ apt-get install openssh-server ....AUSGABE.... Listing 4.2: SSH Server installieren 4.2.2 Konfiguration Aus Sicherheitsgründen wird das root Login über SSH verboten, da es anfälliger für Bruteforce Attacken ist. Eine Anmeldung ist nur mit einem unprivilegiertem Benutzeraccount möglich, der nach Bedarf root-Berechtigung über den Befehl su“ erhält. Die Sperrung erfolgt über ” die Direktive PermitRootLogin“ in der Konfigurationsdatei /etc/ssh/sshd config“, die mit ” ” einem geeigneten Text Editor (vi, vim, nanu, ...) umgeschrieben wird. Ein Auszug: 1 2 3 4 ....... # Authentication: LoginGraceTime 120 PermitRootLogin no <<=== Brandstätter Andreas, Klaffl Christoph Seite 59von 231 ALFSA 5 6 7 8 9 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG StrictModes yes RSAAuthentication yes PubkeyAuthentication yes ....... Listing 4.3: SSH Konfiguration: Root Login verbieten Danach wird der SSH Server über das Init Script /etc/init.d/ssh“ neugestartet: ” 1 2 root@euklid:˜$ /etc/init.d/ssh restart * Restarting OpenBSD Secure Shell server sshd [ OK ] ←- Listing 4.4: SSH Server neustarten In der Standardeinstellung von SSH in Debian wird nur das SSH-2 Protokoll erlaubt, wie es auch erwünscht ist, da das SSH-1 Protokoll nicht mehr die nötige Sicherheit bieten kann (siehe Kapitel 2.1 SSH) Da sich alle Server in Netzwerken befinden, die über einen Router in das Internet gelangen, muss eine Portweiterleitung des SSH Ports (22) an den Server im Router eingestellt werden. Somit leitet der Router eingehende Verbindungen auf diesem Port an den Server und es ist möglich von außen eine SSH Sitzung aufzubauen, um den Server zu administrieren. 4.3 Datenbankserver aufsetzten 4.3.1 Installation Um den MySQL Server zu installieren genügt folgender Befehl: 1 2 root@euklid:˜$ apt-get install mysql-server ....AUSGABE.... Listing 4.5: MySQL Datenbankserver installieren Zusätzlich zum MySQL Server wird auch der Kommandozeilen Client mysqlclient“ automa” tisch installiert. Die Administration wird durch dieses Tool durchgeführt. Brandstätter Andreas, Klaffl Christoph Seite 60von 231 ALFSA 4.3.2 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Konfiguration In der Standardeinstellung von MySQL in Debian erlaubt der MySQL Server nur Verbindungen von dem lokalen Host. Wenn man den MySQL Server über das Netzwerk adminstrieren bzw. verwenden will muss man dies in der Konfiguration ändern. Dazu muss die Direktive bind-address“ auskommentiert werden: ” 1 2 3 4 5 6 7 8 9 10 11 12 skip-external-locking # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 <<== # # * Fine Tuning # key_buffer = 16M max_allowed_packet = 16M thread_stack = 128K thread_cache_size = 8 Listing 4.6: MySQL Konfiguration: Zugriffe über das Netzwerk erlauben Um die Einstellungen neu einzulesen bzw. zu übernehmen muss der MySQL Server neugestartet werden: 1 2 3 4 root@euklid:˜$ /etc/init.d/mysql restart * Stopping MySQL database server mysqld ←[ OK ] * Starting MySQL database server mysqld ←[ OK ] * Checking for corrupt, not cleanly closed and upgrade needing tables. ←- Listing 4.7: MySQL Server neustarten Mit dieser Einstellung läuft der MySQL Server jetzt auf allen Netzwerkinterfaces und nimmt somit aus jedem Netzwerk Verbindungen an. Dies kann ein großes Sicherheitsrisiko darstellen und wird daher nur für die Entwicklung verwendet. Für die Server-Server Syncronisation müssen nur lokale Verbindungen akzeptiert werden. Als nächstes sollte ein Passwort für den root Benutzer eingerichtet werden, da dieser bei der Standardeinstellung keines besitzt: 1 2 mysql --user=root Welcome to the MySQL monitor. Brandstätter Andreas, Klaffl Christoph Commands end with ; or \g. Seite 61von 231 ALFSA 3 4 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Your MySQL connection id is 7 Server version: 5.0.45-Debian_1ubuntu3.1-log Debian etch distribution 5 6 7 8 ←- Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer. mysql> update mysql.user set Password=PASSWORD(’<das neue ←Passwort kommt hier hin>’) where User=’root’;Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 9 10 11 12 13 14 15 ←- mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> quit Bye Listing 4.8: MySQL Konfiguration: Passwort für den administrativen Account (root) setzten Für die weitere Verwaltung der Datenbank wurden die freien MySQL GUI Tools verwendet. Sie sind für die Windows- und Linuxplattform verfügbar. 4.4 Webserver aufsetzten Für die Administration des ALFSA Systems wird ein Webserver benötigt. Die Wahl fiel auf den freien Apache2 Webserver mit dem PHP Modul (mod-php5). 4.4.1 Installation Um den Apache2 Webserver zu installieren genügt folgender Befehl: 1 2 root@euklid:˜$ apt-get install apache2 libapache2-mod-php5 php5- ←cli php5-common ....AUSGABE.... Listing 4.9: Apache2 und PHP5 installieren Damit wird Apache2 heruntergeladen und installiert. Zusätzlich werden auch PHP5, der PHP Command Line Intepreter und das PHP Modul für den Apache2 Webserver installiert. Brandstätter Andreas, Klaffl Christoph Seite 62von 231 ALFSA 4.4.2 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Konfiguration In der Standardkonfiguration (welche automatisch mitinstalliert wird) ist der Webserver mit einem VirtualHost konfiguriert, welcher auf Port 80 lauscht und bei einer Anfrage eine Testseite zurückgibt. Dieser wird über den folgenden Befehl deaktiviert: 1 2 root@euklid:˜$ a2dissite default Site default disabled; run /etc/init.d/apache2 reload to fully disable. ←- Listing 4.10: Apache2: Standardmäßigen VirtualHost deaktivieren Nun wird ein eigener VirtualHost konfiguriert, der die Datenübertragung mittels SSL sichert. Dazu erstellt man mit einem Texteditor (z.B.: vim oder nanu) eine Konfigurationsdatei für den VirtualHost unter /etc/apache2/sites-available/“: ” 1 root@euklid:˜$ vim /etc/apache2/sites-available/alfsa_ssl Listing 4.11: Apache2: VirtualHost konfigurieren Die Konfigurationsdatei sieht wie folgt aus: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <VirtualHost *:443> # General setup for the virtual host DocumentRoot "/home/alfsa/server-www/" ServerName ffsieg.dyndns.org:443 ServerAdmin alfsa@bfkdo-tulln.at # Logfiles: CustomLog /var/log/apache2/access-alfsa_ssl combined ErrorLog /var/log/apache2/error-alfsa_ssl # Possible values include: debug, info, notice, warn, error, crit ←, # alert, emerg. LogLevel notice # SSL SSLEngine On SSLCipherSuite HIGH:MEDIUM SSLCertificateFile /etc/apache2/ssl/alfsa_ssl.ffsieg.dyndns. ←org.crt SSLCertificateKeyFile /etc/apache2/ssl/alfsa_ssl.ffsieg.dyndns. ←org.key 20 Brandstätter Andreas, Klaffl Christoph Seite 63von 231 ALFSA 21 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG </VirtualHost> Listing 4.12: Apache2: VirtualHost Konfiguration Die angegebenen SSL Zertifikate wurden zuvor generiert (siehe weiter unten). Weiters muss PHP5 noch aktiviert werden. Dies geschieht mit dem folgenden Befehl: 1 2 root@euklid:˜$ a2enmod php5 Module php5 installed; run /etc/init.d/apache2 force-reload to enable. ←- Listing 4.13: Apache2: PHP5 aktivieren Um alle Änderungen zu übernommen wird der Apache2 Webserver neugestartet: 1 2 root@euklid:˜$ /etc/init.d/apache2 force-reload * Reloading web server config apache2 Listing 4.14: Apache2: Konfigurationsdateien neu einlesen Dieser Vorgang sollte ohne eine Fehlermeldung (wie oben zu sehen ist) abgeschlossen werden. Falls nicht sollte man die Konfigurationsdatei des VirtualHost überprüfen. Auch wenn der Vorgang erfolgreich abgeschlossen wurde, sollte man die ErrorLog auf Fehler kontrollieren, es könnten Probleme mit dem SSL Zertifikat auftreten. 4.5 Subversion-Server aufsetzten Für die Verwaltung der Quellcodes war ein Versionsverwaltungssystem notwendig. Es wurde das bekannte Subversion System SVN verwendet. 4.5.1 Installation Es gibt verschiedene Arten einen Subversion Server zu betreiben: • Über den Daemon svnserve“ (Läuft auf den Standardport 3690) ” • Mittels einer SSH Verbindung • Als Apache Modul (Port hängt von der Apache Konfiguration ab) Brandstätter Andreas, Klaffl Christoph Seite 64von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Der Zugang zu diesem Versionsverwaltungssystem sollte auch von der Schule aus ermöglicht werden, daher kam erstere Methode nicht in Frage, da der Schulserver die meisten Ports (wie auch den Subversion Stadardport) blockt. Für die 2te Methode müsste für jeden Subversion Benutzer ein Account auf dem SSH Server erstellt werden, dem der Zugriff über SSH erlaubt wird. Daher wurde auch diese Methode verworfen. Die Entscheidung fiel daher auf letzteres, das Apache Subversion Modul. Die Installation erfolgt wie gewohnt sehr einfach über die folgenden Befehle: 1 2 root@euklid:˜$ apt-get install subversion libapache2-svn ....AUSGABE.... Listing 4.15: Subversion installieren Damit wird das Subversion Modul für den Apache installiert und die Subversion Tools, die benötigt werden um ein Repository anzulegen, zu sichern, ... . 4.5.2 Konfiguration Als erster Schritt werden die Verzeichnisse für Subversion eingerichtet: 1 2 3 root@euklid:˜$ mkdir /home/svn root@euklid:˜$ mkdir /home/svn/conf root@euklid:˜$ mkdir /home/svn/repositories Listing 4.16: Subversion Konfiguration: Ordnerstruktur anlegen Als nächstes wird die Konfiguration für die Subversion Benutzer angelegt: 1 2 root@euklid:˜$ touch /home/svn/conf/passwd root@euklid:˜$ touch /home/svn/conf/users-access-file Listing 4.17: Subversion Konfiguration: Konfigurationsdateien anlegen In die Datei passwd“ werden nun die Benutzer mit ihrem dazugehörigen Passwort gespeichert ” (Datei hat das selbe Format wie die Datei htuser“ des Apache Servers). Das Passwort wird ” im Crypt Format gespeichert. Ein Benutzer Eintrag mit Passwort kann über den folgenden Befehl erzeugt werden: 1 root@euklid:˜$ htpasswd -n christoph Brandstätter Andreas, Klaffl Christoph Seite 65von 231 ALFSA 2 3 4 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG New password: Re-type new password: christoph:/xs182hQPisMk Listing 4.18: Subversion Konfiguration: Benuter-/Passworteintrag generieren Die letzte Ausgabezeile ist die Zeile, die in die passwd“ geschrieben wird. Der Übergabe” parameter christoph“ ist der Benutzername. (Das Passwort in diesem Beispiel wurde aus ” Sicherheitsgründen verändert) Mittels des gleichen Befehls kann der Eintrag auch gleich direkt in die passwd“ Datei ge” schrieben werden: 1 2 3 4 root@euklid:˜$ htpasswd /home/svn/conf/passwd christoph New password: Re-type new password: Adding password for user christoph Listing 4.19: Subversion Konfiguration: Benutzer-/Passworteintrag anlegen Die fertige Konfigurationsdatei passwd“ sieht dann folgendermaßen aus: ” 1 2 3 christoph:58//0wxlRZyzU silicium:Uoqpqz4QFoQMs alfsa:/cVVoIcChBQVU Listing 4.20: Subversion Konfiguration: passwd“ Datei ” (Die Passwörter wurden aus Sicherheitsgründen verändert) In der Datei users-access-file“ werden nun die Zugriffsrechte auf die Subversion Repositories ” für die Benutzer eingestellt. Die Datei sieht folgendermaßen aus: 1 2 3 4 5 6 [/] * = [alfsa:/] christoph = rw silicium = rw alfsa = r Listing 4.21: Subversion Konfiguration: users-access-file“ Datei ” Die ersten 2 Zeilen regeln die globalen Berechtigungen für jedes Repository. In diesem Fall wird der globale Zugriff verweigert. Die 3te Zeile bewirkt das die folgenden Einträge für das Repository alfsa“ gelten. Nun kommen die Benutzernamen mit ihren Zugriffsrechten. r“ ” ” steht dabei für Lesezugriff und w“ für den Schreibzugriff. ” Brandstätter Andreas, Klaffl Christoph Seite 66von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Der Benutzer alfsa“ ist der Account der verwendet wird, um auf den Testservern immer die ” aktuelle Version von ALFSA herunterzuladen. Die Benutzer wsind nun konfiguriert und das Repository kann nun über das Tool svnadmin“ ” erstellt werden: 1 root@euklid:˜$ svnadmin create /home/svn/repositories/alfsa Listing 4.22: Subversion Konfiguration: Repository anlegen Damit wird das Repository im Ordner /home/svn/repositories“ mit dem Namen alfsa“ ” ” erstellt. Zuletzt muss nur noch das Apache Modul konfiguriert werden. Dazu wird die Konfigurationdatei /etc/apache2/mods-available/dav svn.conf“ bearbeitet: ” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # dav_svn.conf - Subversion/Apache configuration <Location /svn> Order allow,deny Allow from all # Uncomment this to enable the repository, DAV svn # Set this to the path to your repositories SVNParentPath /home/svn/repositories/ SSLRequireSSL # Uncomment the following line to enable Authz Authentication AuthzSVNAccessFile /home/svn/conf/users-access-file #try anonymous access first, resort to real #authentication if necessary. Satisfy Any Require valid-user # The following allows for basic http authentication. Basic ←authentication # should not be considered secure for any particularly rigorous ←definition of # secure. # how to authenticate a user AuthType Basic AuthName "My Subversion repository" AuthUserFile /home/svn/conf/passwd Brandstätter Andreas, Klaffl Christoph Seite 67von 231 ALFSA 30 31 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG </Location> Listing 4.23: Subversion Konfiguration: Modulkonfiguration für Apache2 Die wichtigsten Schlüsselwörter sind: • <Location /svn> - Damit wird festgelegt, dass die SVN Repositories untder der Adresse: https://<Full Qualified Domain Name>/svn/“ erreichbar sind ” • SSLRequireSSL - Für jeden SVN Zugriff wird eine gesicherte Verbindung benötigt, das dient dazu, dass die Dateien nicht im Klartext über das Internet übertragen werden • AuthzSVNAccessFile - Damit wird die Datei angegeben, in der die Zugriffberechtigungen für die Repositories stehen • AuthUserFile - Damit wird die Datei angegeben, in der die Benutzernamen mit den Passwörter stehen Das Modul ist nun konfiguriert und muss nur noch aktiviert werden: 1 2 root@euklid:˜$ a2enmod dav_svn Module dav_svn installed; run /etc/init.d/apache2 force-reload to ←enable. Listing 4.24: Subversion Konfiguration: Apache2 Modul aktivieren Um alle Änderungen zu übernommen wird der Apache2 Webserver neugestartet: 1 2 root@euklid:˜$ /etc/init.d/apache2 force-reload * Reloading web server config apache2 Listing 4.25: Apache2 Konfiguration neu einlesen Der Subversion Server ist jetzt fertig konfiguriert und kann verwendet werden. 4.6 4.6.1 Zeitspeicherung Zeitumstellungsproblem In Österreich wird, wie in anderen Ländern Europas, die Zeit zwischen Normalzeit (Winterzeit) und Sommerzeit umgestellt. Vom letzten Sonntag des März bis zum letzten Sonntag des Brandstätter Andreas, Klaffl Christoph Seite 68von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Oktobers gilt die mitteleuropäische Sommerzeit (MESZ, CEST), sonst die mitteleuropäische Normalzeit (MEZ, CET). Die Umstellung erfolgt jeweils um 2 Uhr MEZ, welches 3 Uhr MESZ entspricht. Ein Großteil der Datensätze in der Datenbank von ALFSA wird durch den Zeitpunkt eindeutig identifiziert. Die Zeitumstellung an sich bewirkt, dass eine Stunde pro Jahr, die Uhrzeit nicht eindeutig ist. Andererseits fehlt eine Stunde in kontinuierlichen Ablauf der Uhrzeit. Die fehlende Stunde stellt keine wirklichen Probleme dar. Jedoch die Stunde, die durch die Umstellung doppelt auftritt verursacht erhebliche Probleme. 4.6.2 Lösungsansatz Die Lösung dieses Problems liegt darin, die Zeit, die in der Datenbank gespeichert wird, nicht nach Normal- und Sommerzeit umzustellen. Diese Bedingung wird durch die Koordinierte Weltzeit (UTC) erfüllt. Somit ist gewährleistet, dass alle Datensätze eindeutig identifizierbar sind. Beim Eintragen von Daten muss der aktuelle UTC-Zeitstempel ermittelt und mit den Daten in die Datenbank geschrieben werden. Beim Anzeigen von Daten wird der gespeicherte UTC-Zeitstempel abhängig vom Wert in Normal- bzw. Sommerzeit umgewandelt. 4.6.3 Unixzeit Die Unixzeit ist ein Zeitstempel, der diese Bedingung erfüllt. Die Unixzeit zählt die vergangenen Sekunden seit dem 1970-01-01 00:00:00 (UTC). In PHP wird die Funktion time() verwendet um die Unixzeit zu ermitteln. Zur Darstellung von Datum und Zeit wird standartmäßig die Funktion date() mit dem Parameter Y-m-d H:i:s (T)“ verwendet. Diese stellt ” die Zeit in folgendem Format dar: Jahr(4-stellig)-Monat(2-stellig)-Tag(2-stellig) Stunde(2stellig):Minute(2-stellig):Sekunde(2-stellig) (Zeitzone). Die Darstellung der Zeitzone ist notwendig um die Zeit in der Stunde der Zeitumstellung von Sommer- in Normalzeit unterscheiden zu können. Tabelle 4.1 verdeutlicht die Darstellung des Datums der Unixzeit mit der Funktion date(). Timestamp 1193528000 1193530000 1193532000 1193534000 1193536000 1193538000 Ausgabe von date( Y-m-d H:i:s (T)“, Timestamp) ” 2007-10-28 01:33:20 (CEST) 2007-10-28 02:06:40 (CEST) 2007-10-28 02:40:00 (CEST) 2007-10-28 02:13:20 (CET) 2007-10-28 02:46:40 (CET) 2007-10-28 03:20:00 (CET) Tabelle 4.1: Unixzeit-Darstellungen Brandstätter Andreas, Klaffl Christoph Seite 69von 231 ALFSA 4.6.4 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Einschränkungen Durch die Verwendung der Unixzeit als Zeitstempel wird somit das Problem der Zeitumstellung gelöst. Es ergeben sich durch die Unixzeit aber andere Einschränkungen. Eine Einschränkung liegt darin, dass das Datum nur zwischen 1970-01-01 00:00:00 (UTC) und 2038-01-19 03:14:08 (UTC) verarbeitet werden kann. Die Unixzeit verwendet einen longDatentyp, der auf den meisten Systemen mit 32 Bit definiert ist. Die Unixzeit zählt die vergangenen Sekunden seit dem 1970-01-01 und wird daher am 2038-01-19 den Wertebereich von 31 Bit überschreiten. Das 32te Bit wird zur Speicherung von negativen Zahlen verwendet. Daher springt die Zeit beim Überlauf auf den 1901-12-13. Diese Einschränkung des Zeitbereiches ist im Bereich vergangener Zeitpunkte (vor 1970-0101) nicht relevant, da keine Daten mit Zeiten vor 1970 gespeichert werden müssen. Im Bereich zukünftiger Zeitpunkte (nach 2038-01-19) sind Probleme möglich. Es ist jedoch zu erwarten, dass Debian und die in ALFSA verwendete PHP-Funktion date() rechtzeitig vor 2038 auf zumindest 64 Bit umgestellt werden. Dadurch könnten Zeitpunkte bis in 290 Milliarden Jahre gespeichert werden. In ALFSA selbst wird die Zeit nirgends auf 32 Bit beschränkt. Daher lassen sich Probleme gegebenenfals durch ein Update von Debian und der dazugehörigen Pakete beheben. Eine weitere Einschränkung der Unixzeit liegt darin, dass die Zeit nur auf ganze Sekunden genau gespeichert wird. Durch die verwendung der Zeit als Teil vieler Primärschlüssel in ALFSA können daher keine 2 Datensätze in einer Sekunde angelegt werden. Diese Einschränkungen sind jedoch annehmbar, da nicht zu erwarten ist, dass Datensätze schneller als im Sekundentakt vom Benutzer angelegt werden. 4.6.5 Zeitsynchronität Bei jeglicher Synchronisierung von Daten ist es erforderlich, dass die Zeit hinreichend synchron läuft. Die Zeit der Server muss bis auf wenige Sekunden gleich laufen. Für die Clients ist eine Abweichung von einigen Minuten verträglich. Würde der Zeitversatz bei der Synchronisation von zu groß werden, so wäre es möglich dass unplausible Daten produziert werden. Dies soll in einem Beispiel verdeutlicht werden: • Server B läuft um 1 Stunde gegenüber Server A nach. • Eine Flasche wird auf Server A gefüllt. Dieser Datensatz wird mit Datum 2008-02-03 14:02:00 eingetragen. • Die Flasche wird 5 Minuten später am Server B außer Dienst gestellt. Dieser Datensatz wird mit Datum 2008-02-03 13:07:00 eingetragen. • Beide Server synchronisieren. Die Datenbank beinhaltet nun eine Füllung der Flasche nach dessen Außerdienststellung. Brandstätter Andreas, Klaffl Christoph Seite 70von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Dieses Beispiel verdeutlicht, dass es erforderlich ist, die Zeit der beteiligten Computer synchron zu halten. Dazu wird das Protokoll NTP (Network Time Protocol) und das Linux-Programm ntpdate bzw. der Linux-Dienst ntpd verwendet. Bei der Client-Server Synchronisation wird ntpdate vor jeder Synchronisation ausgeführt. Auf den Servern sorgt der Dienst ntpd für eine ständig synchrone Zeit. Als Zeitserver wurde in der Entwicklungsphase der Zeitserver der Universität Wien ts1.univie.ac.at verwendet. Für den Realbetrieb wird ein Pool von NTP-Servern wie zum Beispiel europe.pool.ntp.org zu verwenden. Da dieses Pool aus einer vielzahl von Servern (946 am 2008-05-08 [5]) besteht, bietet es eine wesentlich höhere Ausfallssicherheit als ein einzelner Server. 4.7 Datenbankdesign Die grundlagen Datenbankstruktur waren im Wesentlichen durch den Auftraggeber gegeben. Jedoch mussten Anpassungen dieser Struktur und der Tabellen vorgenommen werden, damit die Datenbank den hohen Anforderungen der Redundanzfreiheit genügt. Weiters wurden Beziehungen durch Foreign-Keys definiert, um Inkonsistente Daten zu verhindern. 4.7.1 Primärschlüssel Prinzipiell werden in Datenbanken immer Primärschlüssel definiert um Datensätze eindeutig identifizieren zu können. Häufig wird dazu ein Auto-Increment, Zählwert oder ähnlich genanntes verwendet. Dieser Wert wird automatisch vom Datenbanksystem mit jedem Datensatz um einen Definierten Wert erhöht. So werden die Primärschlüssel von Datensätzen zum Beispiel automatisch mit 1,2,3,4,5, usw. vergeben. Dies ist überaus geeignet, wenn genau eine Datenbank verwendet wird. MySQL bietet die Möglichkeit den Wert automatisch um ein mehrfaches von eins zu erhöhen. Damit werden die Primärschlüssel von Datensätzen zum Beispiel automatisch mit 1,3,5,7,9, usw. vergeben. Dies ist geeignet wenn eine fixe Anzahl an Datenbank-Server in einem System arbeiten. Auf den verschiedenen Servern werden somit verschiedene Primärschlüssel vergeben. Ein Beispiel für die Verwendung von 4 Servern: • Server A, Offset 0, Schrittweite 4: ergibt Primärschlüssel 0,4,8,12,16,20, usw. • Server B, Offset 1, Schrittweite 4: ergibt Primärschlüssel 1,5,9,13,17,21, usw. • Server C, Offset 2, Schrittweite 4: ergibt Primärschlüssel 2,6,10,14,18,22, usw. Brandstätter Andreas, Klaffl Christoph Seite 71von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG • Server D, Offset 3, Schrittweite 4: ergibt Primärschlüssel 3,7,11,15,19,23, usw. Durch das Prinzip der Multiple-Master Datenbank mit undefinierter Anzahl an beteiligten Computern kann jeder einzelne Client oder Server unabhängig Daten in die Datenbank einfügen. Somit ist die vergabe von automatischen Werten als Primärschlüssel nicht mehr geeignet. Es wird daher eine komplett andere Grundlage zur Erzeugung eindeutiger Primärschlüssel verwendet. Es werden mehrere atomare Eigenschaften eines Datensatzes verknüpft um in Summe einen eindeutigen Schlüssel zu erhalten. Folgendes Beispiel soll dies verdeutlichen. • Ein Einsatz ist durch die ortlich zuständige Feuerwehr nicht eindeutig identifizierbar, denn eine Feuerwehr hat mehrere Einsätze. • Ein Einsatz ist ebenso durch die Einsatzzeit nicht eindeutig identifizierbar, denn zur gleichen Zeit können mehrere Einsätze stattfinden. • Ein Einsatz ist aber durch eine Kombination dieser zwei Daten eindeutig identifizierbar, denn eine Feuerwehr kann zur gleichen Zeit nur genau einen Einsatz durchführen. Nach diesem Prinzip werden die Primärschlüssel aller Tabellen gebildet. Dadurch ist es ausgeschlossen, dass verschiedene Clients Daten in das System einfügen, die im Konflikt zueinander stehen. 4.7.2 Spalte edit date Um bei synchronisationen zu erkennen, welche Daten übertragen werden müssen, wird in jedem Datensatz das Änderungsdatum gespeichert. Dazu existiert in jeder Tabelle eine Spalte edit date“, in der bei jeglichen Schreibzugriffen auf die Datenbank die aktuelle Unixzeit ” (Siehe auch Kapitel 4.6.3 Unixzeit) eingefügt wird. Bei der Sychronisation werden nur jene Datensätze übernommen, bei denen das Änderungsdatum größer als das Datum der letzten Sychncronisation ist. 4.7.3 Löschen von Daten In der Datenbank werden Daten grundsätzlich nicht gelöscht. Die Daten werden gegebenenfalls als gelöscht markiert. Dies hat mehrere Gründe. Einerseits ist es nicht erfordelich Daten zu löschen. Jegliche Daten stellen zu jedem Zeitpunkt in gewisser Weise ein Abbild der Realität dar. Das heißt Atemluftflaschen, die nicht mehr verwendet werden, werden mit einem Datum als außer Dienst gestellt. Somit existiert die Flasche für Einsätze usw. die vor diesem Brandstätter Andreas, Klaffl Christoph Seite 72von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Datum stattgefunden haben noch in der Datenbank. In solchen Fällen wäre es fatal eine Flasche zu löschen. Weiters vereinfacht es die Sychronisation erheblich. Es werden nur Datensätze bei der Sychronisation übernommen, bei denen das Änderungsdatum größer als das Datum der letzten Sychncronisation ist. Somit ist es ohne weitere Maßnahmen nicht möglich gelöschte Datensätze bei der Sychronisation zu erkennen. Denn gelöschte Datensätze wären nicht vorhanden und hätten somit kein Änderungsdatum um bei der Sychronisation erkannt zu werden. Um die Löschung von Datensätzen zu sychronisieren hätten weitere Maßnahmen getrofffen werden müssen, die allerdings nich notwendig waren, da keine Daten glöscht werden. 4.7.4 Lineare Abhängigkeiten Jegliche Beziehungen (Abhänigkeiten) der Datenbank verlaufen nur linear in eine Richtung. Was mit linearen Abhängigkeiten gemeint ist, soll in folgendem Beispiel gezeigt werden. Abbildung 4.1: Abhängigkeiten Linear, Ring Im linken Beispiel hängen alle Tabellen nur linear voneinander ab. Das heißt, alle Tabellen können entsprechend ihrer Ebene untereinander dargestellt werden und Beziehungen zeigen nur auf Tabellen oberhalb. Im rechten Beispiel ist dies nicht möglich. Die Tabellen hängen im Kreis immer wieder voneinander selbst ab. Es kann somit keine Ebene definiert werden. Für die Synchronisation ist es extrem wichtig, dass Tabellen nur linear von anderen Tabellen abhängen, da die Synchronisation nach der Reihenfolge der einzelnen Ebenen abläuft. Zuerst werden die Datensätze der obersten Ebene eingefügt, da diese von keinen anderen Tabellen abhängen. Danach folgen die weiteren Ebenen Schritt für Schritt nach unten. Wird mit Beziehungen ein Ring gebildet, ist es der Synchronisation nicht mehr möglich die Ebenen zu ermitteln und es kann keine Synchronisation durchgeführt werden. Brandstätter Andreas, Klaffl Christoph Seite 73von 231 ALFSA 4.7.5 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Grundlegende Struktur Die Grundlage der Datenbank bilden die Daten von Füllstellen, Feuerwehren, Clients, Kompressoren, Benutzern, Atemluftflaschen, Geräten und Masken. Diese Daten hängen jeweils voneinander ab wie es folgend Abbildung zeigt. Abbildung 4.2: Grundlegende Datenbankstruktur In dieser Darstellung werden die Pfeile als Zeiger verwendet. Atemluftflaschen zeigen beispielsweise auf die Feuerwehr, die der Besitzer der Flasche ist. Diese Pfeile stellen somit 1:n Beziehungen dar. Eine Feuerwehr kann zum Beispiel mehrere Flaschen besitzen, aber eine Flasche gehört nur genau einer Feuerwehr. Diese Darstellung zeigt ledeglich die wichtigsten Tabellen der Datenbank. Weitere wichtige Tabellen folgen mit den jeweiligen Beziehungen Auszugsweise. Alle Tabellen werden im Anhang dargestellt. 4.7.6 Atemluftflaschen Den beinahe wichtigsten Bestandteild er Datenbank bilden die Daten der Atemluftflaschen. Von Atemluftflaschen hängen Mängel, Prüfungen und Füllungen ab. Diese wichtigesten Beziehungen der Tabelle Atemluftflaschen werden hier gezeigt. Abbildung 4.3: wichtige Beziehungen von Atemluftflaschen Brandstätter Andreas, Klaffl Christoph Seite 74von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Ebenfalls ist hier die Beziehung der Atemluftflasche auf die Eigentümerfeuerwehr zu sehen. Atemluftflaschen stehen noch mit weiteren Tabellen in Beziehung, wie zum Beispiel der Benutzer, der die Flasche angelegt hat. Diese werden jedoch hier nicht dargestellt, sondern können dem Anhang entnommen werden. 4.7.7 Füllungen Ebenfalls wird hier die Grundlegende Struktur von Füllungen dargestellt, da diese ein wichtiges Detail der Datenbank darstellt. Abbildung 4.4: Grundlegende Struktur von Füllungen Wie hier zu sehen, werden Füllungen nicht direkt in Beziehung mit dem Benutzer, der die Füllung vorgenommen hat, und dem Kompressor in Beziehung gesetzt, sondern, es wird eine Ebene zwischen diesen Tabellen eingesetzt. Beim Starten von Füllungen wird ein Einsatz erzeugt. Dieser Speichert den Einsatzort, die zuständige Feuerwehr und Notizen zum Einsatz. Davon hängt die Füllsitzung ab, die ebenfalls beim Starten von Füllungen erzeugt wird. Diese Tabelle speichert eine Durchgängige Füllung eines Benutzers auf einem Kompressor. Wiederum davon hängen die eigentlichen Füllungen ab, welche die gefüllte Flasche beinhalten. 4.7.8 Datenbankstruktur In den folgenden zwei Seiten wird die komplette Datenbank inklusive Beziehungen dargestellt. Leider konnte keine komprimiertere Darstellung der Datenbank gefunden werden. Das Diagramm wurde mit DbVisualizer 6.0.10 Free edition“ erstellt. Leider kann dieses ” Programm die Beziehungen nicht genau auf die Spaltennamen der Tabellen abbilden, wodurch diese zuordnung im Diagramm nicht klar ersichtlich ist. Ebenso sind in den Tabellen nicht alle Spalten, sondern nur die Primary-Keys abgebildet. Für eine genauere Darstellung der Brandstätter Andreas, Klaffl Christoph Seite 75von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Tabellen und Beziehungen sei daher auf den Anhang verwiesen, in dem alle Tabellen und Beziehungen dargestellt werden. Brandstätter Andreas, Klaffl Christoph Seite 76von 231 ALFSA 4.7.9 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Tabellen der Datenbank Die Tabellen der Datenbank werden im Anhang dargestellt. In folgendem Beisiel einer Tabelle soll gezeigt werden, wie die Tabellen grafisch dargestellt sind. Ferner wird die Bedeutung der Symbole erläutert. Abbildung 4.5: Tabelle einsatz Die Abbildung zeigt die Tabelle einsatz“ mit den Spalten time“, einsatzbereich fwnr“, ” ” ” typ“, bezeichnung“, bemerkung“, time end“ und edit date“. Der Typ der jeweiligen Spal” ” ” ” ” ten wird hellgrau neben dem Spaltennamen dargestellt. Das Schlüssel-Symbol zeigt die Spalten an, die den Primärschlüssel bilden. Beziehungen oder auch genannt Foreign-Keys werden links und rechts der Tabelle mit Pfeilen angezeigt. Beziehungen, die aus mehreren Spalten bestehen, werden am Ende der Pfeile verbunden. Links werden schwarz Beziehungen gezeigt, die von der Tabelle auf andere Tabellen verweisen. Zum Beispiel zeigt die Spalte einsatzbereich fwnr“ auf die Spalte fwnr“ der Tabelle ” ” feuerwehren“. ” Rechts der Tabelle werden Beziehungen gezeigt, die von anderen Tabellen auf diese verweisen. Zum Beispiel zeigen die Spalten einsatz time“ und einsatz fwnr“ der Tabelle fuell sitzung“ ” ” ” auf die Spalten time“ und einsatzbereich fwnr“. ” ” 4.8 Datenbankzugriff Bei jedem Datenbankzugriff, der von ALFSA Komponenten durchgeführt wird, werden alle Variablen (Formulardaten, ...), die in ein SQL Query eingefügt werden, durch die PHP Funktion mysql real escape string()“[20] maskiert. Dadurch beugt man SQL Injections vor und ” verhindert somit effektiv die Einschleusung von bösartigen SQL Queries [21]. Folgendes Beispiel soll illustrieren wie SQL Injections funktionieren: Auf einem Webserver befindet sich das PHP Skript search.php“, welches zum Suchen von ” Benutzern verwendet wird. Es akzeptiert den Parameter keyword“, welcher Bestandteil des ” SQL Queries wird: Brandstätter Andreas, Klaffl Christoph Seite 77von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Aufruf : http://webserver/search.php?keyword=hugo Erzeugter SQL Befehl: SELECT name,adresse,telefonnummer FROM benutzer WHERE name LIKE ’%hugo%’ Eine SQL Injection sieht bei diesem Beispiel folgendermaßen aus: Aufruf : http://webserver/search.php?keyword=hugo’+;UPDATE+benutzer+SET+name= hacked“+ - ” Erzeugter SQL Befehl: SELECT name,adresse,telefonnummer FROM benutzer WHERE name LIKE ’%hugo’;UPDATE benutzer SET name= hacked“ - -% ” Durch diese SQL Injection wird nach dem beabsichtigten SELECT Query noch ein UPDATE Query ausgeführt, welches alle Namen in der Datenbank auf hacked“ setzt. Diese un” rechtmäßge Manipulation der Daten muss daher durch Maskierung jeglicher Benutzereingaben verhindert werden. 4.9 4.9.1 Server - Server Syncronisation Anforderungen Die Server - Server Syncronisation unterlag folgenden Forderungen: • Multi-Master: Alle Server agieren als Master und sind gleichberechtigt. Daher kann jeder Datenbakserver für alle Arten von Datenmanipulation (INSERT, UPDATE, SELECT, ...) verwendet werden. Jegliche Änderungen der Daten an einem Datenbankserver müssen auf alle andere übernommen werden. • Datensicherheit/Verschlüsselung: Da die ALFSA Server geographisch getrennt sind und daher kein eigenes Netzwerk besitzen, wird die Syncronisation über das Internet durchgeführt. Daher gilt es hier dafür zu sorgen, dass die übertragenen Daten verschlüsselt werden bzw. für andere Teilnehmer nicht einlesbar sind. • Sichere Authentifizierung: Für die Syncronisation der Server untereinander wird verlangt, dass sich jeder Server bei dem anderen mittels eines sicheren Anmeldeverfahrens authentifiziert. 4.9.2 Konzept Für die Realisierung der Syncronisation wurden folgende Technologien/Programme verwendet: Brandstätter Andreas, Klaffl Christoph Seite 78von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG • SSH (Secure Shell) • PHP (Hypertext Preprocessor) • SH (Shell) • CRON • (JAVA) Die aufgezählten Technologien/Programme wurden für folgende Aufgaben verwendet: SSH SSH sollte die Verbindung der Server untereinander übernehmen. Dazu wird eine SSH Verbindung zwischen dem lokalen und dem entfernten Server aufgebaut um über diese einen Port Tunnel zu realisieren. Dieser Tunnel ermöglicht es, eine Verbindung zum entfernten Datenbankserver zu erstellen und Daten auszutauschen, als würde er sich im lokalen Netzwerk befinden. Weiters ist der gesamte Datentransfer, der zwischen den 2 Servern entsteht, verschlüsselt und daher für andere nicht lesbar. Die Anmeldung am SSH Server erfolgt durch das Public-Key Verfahren, durch welches eine sichere Authentifizierung erreicht wird. Bei Bedarf ist es auch möglich die gesamte Verbindung zu komprimieren um Bandbreite zu sparen. PHP PHP übernimmt die Hauptaufgaben der Syncronisierung, die da wären: • Aufbau, Verwaltung und Beendigung der Datenbankverbindungen und der SSH Sitzung • Überwachung aller Vorgänge der Syncronisation • Vergleichen der Datenbankstruktur und eventuelles aktualisieren derselbigen • Neue und geänderte Datensätze finden und in die eigene Datenbank einfügen • Fehlerbehandlung und Logging SH Ein Shell Skript wurde dazu verwendet, um das PHP Skript mittels der Kommandozeilenversion des PHP Interpreters für jeden Server, mit dem eine Syncronisation stattfinden soll, auszuführen. Brandstätter Andreas, Klaffl Christoph Seite 79von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG CRON CRON ist unter Linux/Unix Systemen ein Standarddienst, der sich um die zeitlich geplante Ausführung von Programme jeglicher Art kümmert. Die Syncronisation wird in einem einstellbaren Zeitintervall durchgeführt und mit dieser Applikation wird diese Vorhaben realisiert. JAVA Während der Entwicklung der Syncronisation wurde für Testzwecke der Teil der Syncronisation, der in PHP implementiert wurde, auch in JAVA programmiert. Da JAVA wesentlich perfomanter [3] als die Skriptsprache PHP ist, erhofften wir uns bessere Ergebnisse im Bezug auf die Geschwindigkeit der Syncronisation. Jedoch war die JAVA Syncronisation nur sehr geringfügig schneller, daher wurde die Entwicklung der Syncronisation in JAVA eingestellt und stattdessen weiter an er PHP Variante gearbeitet. Nach einer Analyse sind wir auf den Schluss gekommen, dass die langsame Datenbankanbindung dafür verantwortlich ist, warum es keine signifikanten Unterschiede in der Ausführungsgeschwindigkeit gibt. Mit der langsamen Datenbankanbindung, ist jene gemeint, die über die vergleichsweise langsame Internetverbindung stattfindet. Ablauf einer Syncronisation 1. Kontrollieren der lokalen Konfiguration 2. Verbindungsaufbau mit dem lokalen Datenbankserver 3. SSH Verbindung (und Tunnel) zum entfernten Server aufbauen 4. Verbindungsaufbau mit dem entfernten Datenbankserver durch den Port Tunnel 5. Tabelle für Tabelle vergleichen und synchronisieren (Reihenfolge richte sich nach den Beziehungen zwischen den Tabellen) 6. Syncronisationsdatum schreiben Dieser Ablauf ist sehr vereinfacht und wird im Laufe dieses Dokuments noch genauer ausgeführt. 4.9.3 Syncronisationsrichtung Die Syncronisation ist nicht bidirektional sondern nur einseitig ausgelegt. Das bedeutet, dass sich jeder Server die neuen Daten von den anderen Servern abholt. Brandstätter Andreas, Klaffl Christoph Seite 80von 231 ALFSA 4.9.4 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Anpassungen der Datenbankstruktur Damit die Syncronisation funktioniert, musste die Datenbankstruktur angepasst werden. Jede Tabelle wird um eine Spalte erweitert, die vom Typ unsigned integer“ ist und den Namen ” edit date“ tägt. Bei jeder Manipulation der Datensätze (INSERT bzw UPDATE) wird in die” ser Spalte die aktuelle Unixzeit (siehe auch Kapitel 4.6.3 Unixzeit) eingefügt. Damit bekommt jeder Datensatz, der sich in der Datenbank befindet, ein Änderungdatum, über welches die Syncronisierung feststellen kann, ob neue Datensätze hinzugekommen sind oder aktualisiert wurden. Jedoch bringt dieses Vorgehen eine Einschräkung mit sich: Es lassen sich keine Datensätze löschen, da die Syncronisierung gelöschte Elemente nicht erkennen kann. Dieser Umstand stellt allerdings keine größeren Probleme dar, da seitens der Feuerwehr vorgesehen ist, die Daten zur Langzeitaufbewahrung zu behalten. Bei Tabellen wo es aber notwendig ist Datensätze zu löschen bzw. zu wissen dass der Datensatz nicht mehr gültig ist, zum Beispiel bei der server“ ” Tabelle, wurde die Tabelle um eine zusätzliche Spalte erweitert, die vom Typ ENUM(’0’,’1’)“ ” ist und über die feststellbar ist, ob der jeweilige Datensatz noch gültig ist. Die folgenden Tabellen sind für die Syncronisierung notwendig: Abbildung 4.6: Server Tabelle Abbildung 4.7: Server Details Tabelle Abbildung 4.8: Sync Tabelle • server: Beherbergt die Grundeinstellungen der Server (Servername, Hostname, IP Adresse, Priorität) Brandstätter Andreas, Klaffl Christoph Seite 81von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG • server details: Beinhaltet die wichtigen Einstellungen für die Syncronisation (SSH, MySQL). Die Konfigurationswerte rsa, db user, db password und db name sind base64 kodiert. Damit wird der leichten Lesbarkeit der sensiblen Daten entgegengewirkt. (Anmerkung: Dies ist kein Schutz, falls die Daten gestohlen oder kopiert werden. Die base64 Kodierung dient lediglich dazu, dass die Einstellungen nicht im Klartext gelesen werden können.) • sync: Beinhaltet alle Tabellen der Datenbank mit ihren Beziehungsebenen. Zusätzlich noch 2 Spalten (to client und from client), die für die Client-Server Syncronisation benötigt werden. Anhand der drei Tabellen sieht man, dass jede von ihnen die Spalte edit date“ besitzt, deren ” Verwendungszweck im obigen Absatz erläutert wurde. Weiters hat die server“ Tabelle die ” Spalte deleted“, über welche feststellbar ist ober der Server noch existiert oder entfernt ” wurde. 4.9.5 Shell Das verwendete Shell Skript hat die Aufgabe, alle Server, die eine Priorität über 0 besitzen, aus der Datenbank zu lesen und das PHP Syncronisierungsskript für jeden Server auszuführen. Dazu extrahiert das Shell Skript aus der Konfigurationsdatei ./conf/config.inc.php“ über das ” Konsolentool mawk“ die MySQL Verbindungsdaten und ruft damit den MySQL Komman” dozeilenclient auf. Das SQL Statement, welches ausgeführt wird, liefert die Namen aller Server aus der Datenbank deren Priorität ungleich 0 ist. 1 #!/bin/sh 2 3 DB_HOST=‘mawk ’/db_host/{split($1,geteilt,"="); print(substr(geteilt ←[2], 2, length(geteilt[2])-3));}’ ./conf/config.inc.php‘ 4 DB_USER=‘mawk ’/db_user/{split($1,geteilt,"="); print(substr(geteilt ←[2], 2, length(geteilt[2])-3));}’ ./conf/config.inc.php‘ 5 DB_PASSWORD=‘mawk ’/db_password/{split($1,geteilt,"="); print(substr( ←geteilt[2], 2, length(geteilt[2])-3));}’ ./conf/config.inc.php‘ 6 DB_NAME=‘mawk ’/db_name/{split($1,geteilt,"="); print(substr(geteilt ←[2], 2, length(geteilt[2])-3));}’ ./conf/config.inc.php‘ 7 8 server=‘mysql --host=$DB_HOST --user=$DB_USER --password=$DB_PASSWORD ←$DB_NAME -e "SELECT name FROM server WHERE priority!=0;"‘ 9 10 for sync_server in $server 11 do 12 if [ $sync_server != "name" ] 13 then 14 echo "Synchronisiere mit $sync_server" Brandstätter Andreas, Klaffl Christoph Seite 82von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG 15 php index.php page=sync server=$sync_server 16 fi 17 done Listing 4.26: Shell Skript für die Syncronisation Die Liste mit den Servernamen wird dann durch eine for-Schleife abgearbeitet. Die IF-Abfrage dient dazu, den eigenen Server auszufiltern, damit keine lokale Syncronisation durchgeführt wird. Dem PHP Skript wird die Option page“ mit dem Wert sync“ übergeben, dies führt ” ” dazu, dass die Syncronisierung ausgeführt wird. Der zweite Parameter server“ ist der Name ” des Servers, mit dem syncronisiert werden soll. 4.9.6 CRON Das Erzeugen eines Eintrags für die Syncronisierung kann über folgenden Befehl erfolgen: 1 www-data@euklid:˜$ crontab -e Damit öffnet sich ein Editor mit allen Cronjobs, die jeweils in einer Zeile angezeigt werden. Eine Cron Zeile hat den folgenden Syntax: <Minute (0-59)> <Stunde (0-23)> <Tag (1-31)> <Monat (1-12)> <Wochentag (0-7) (Sonntag=0 oder =7)> <auszuführender Befehl> <Kommentar> Folgende Zeile wird eingetragen: 1 */15 * * * * cd /home/christoph/Projects/php/alfsa/server-www && ./ ←sync.sh>/dev/null Diese Zeile bewirkt, dass das Shellscript für die Syncronisation alle 15 Minuten ausgeführt wird. Die Ausgabe wird nach /dev/null“ umgeleitet, eine Gerätedatei unter Linux, die man ” sich wie ein schwarzes Loch vorstellen kann. Daher geht jegliche Information verloren, die man an dieses virtuelle Gerät schickt. Wie in diesem Beispiel auch wird diese Gerätedatei verwendet um nicht erwünschte Ausgaben zu unterdrücken. Falls man die Ausgabe nicht umleitet, wird die gesamte Ausgabe von Cron per Mail an den Benutzer geschickt. Das PHP Syncronisierungsskript unterstützt sowohl die normale Ausgabe, als auch die Fehlerausgabe. Das bedeutet, das im Falle eines Syncronisierungsfehlers eine Meldung über die Fehlerausgabe angezeigt wird. Da nur die normale Ausgabe des PHP Syncronisierungsskript umgeleitet wird werden daher nur ihm Fehlerfall E-Mail Nachrichten durch Cron versandt. Brandstätter Andreas, Klaffl Christoph Seite 83von 231 ALFSA 4.9.7 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG SSH Damit die automatische Anmeldung mit Public-Key Verfahren funktioniert, braucht jeder Server ein Schlüsselpaar, bestehend aus privaten und öffentlichem Schlüssel. Um ein Schlüsselpaar für den aktuell angemeldeten Benutzer zu erstellen, genügt folgender Befehl: 1 www-data@euklid:˜$ ssh-keygen -f ˜/.ssh/id_rsa -t rsa Listing 4.27: SSH Konfiguration: RSA Schlüsselpaar generieren Damit werden die Schlüssel im eigenen Verzeichnis des jeweiligen Benutzers gespeichert: 1 2 3 4 5 www-data@euklid:˜$ ls -rw-r--r-- 1 www-data authorized_keys -rw------- 1 www-data -rw-r--r-- 1 www-data -rw-r--r-- 1 www-data known_hosts -l .ssh/ www-data www-data www-data www-data 0 2008-03-05 14:00 ←- 1675 2007-12-30 14:03 id_rsa 404 2007-12-30 14:03 id_rsa.pub 0 2008-05-05 12:10 ←- Listing 4.28: SSH Konfiguration: Ordnerauflistung .ssh/“ ” Anhand der Dateiberechtigung kann man sofort darauf schließen, dass die Datei id rsa“ den ” privaten Schlüssel enthält, da sie nur für den eigenen Benutzer les- und schreibbar ist. Folgende Liste gibt Aufschluss darüber, für welchen Zweck die einzelnen Dateien vorhanden sind: • authorized keys: Diese Datei beinhaltet die öffentlichen Schlüssel derjenigen Benutzer, die sich mit dem Public-Key Verfahren anmelden/authentifizieren dürfen (über diese Methode kann man eine automatische Anmeldung realisieren) • id rsa: Beinhaltet den privaten Schlüssel • id rsa.pub: Beinhaltet den öffentlichen Schlüssel • known hosts: In dieser Datei befinden sich die öffentlichen Schlüssel der SSH Server, mit denen man sich schon einmal verbunden hat. Damit kann man feststellen ob man sich wirklich zum richtigen SSH Server verbindet, da bei einer Änderung des Schlüssels der Benutzer druch den SSH Client über diesen Zustand unterrichtet wird und darauf hinweist, dass dieser Server möglicherweise manipuliert wurde. Beachte: Da der Apache2 Webserver unter dem Benutzer www-data“ ausgeführt wird, muss ” der Schlüssel auch für diesen erstellt werden. Wenn alle Server ein Schlüsselpaar besitzen, kann die Anmeldung über das Public-Key Verfahren konfiguriert werden. Dazu schreibt man die öffentlichen Schlüssel der Nutzer, die sich Brandstätter Andreas, Klaffl Christoph Seite 84von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG mit ihrem Schlüssel anmelden dürfen, mit folgender Schreibweise in die authorized keys“ ” Datei: <Typ des Schlüssels> <öffentlicher Schlüssel> <Kommentar> authorized keys“ Datei von einem ALFSA Testserver: ” 1 2 3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuDr+4 ←s3OCkz0tcurHJLpCxbqc5XQsn1H9V6VsybzDQ4OQO05FUB06tYnm/6 ←ohiNUE3S6hVf53NKRg18HuukB8Tu4HA9fqydL6bw/phxLZjxAtKGbHk/ ←jJJVHwswFeL0atpQz0XosSHkqNOhL1jIIL9rSHmR7LrunB2WilXYWzrubLk/ ←fbCWaDet7WikUCk9FOiotZ4ChY2wd/ZCmujXqpApfSBrKtm8VJ368pGtr0Z3U+ ←ThSaEx3zpQ1ortqFPjIzUmcHIkyTK560LJjUwG4Z1bbuMDqIy+AaTM3+ ←RIP1xLku/diTVXEYhB9AwFvX+pUaZc6k628q0kL/OvYPkd+oRQ== euklid- ←server ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuFoQMhCTiMWZZHmHyD9DlfDoq/ ←uiqDancNNFR6k2ZTUdTIVor8yq6Px7SP4rLrkB6B99uQvqueMOBLx/ ←mnREsj8dbQp8UXCsjRRZukjch4n3eyd/salnkIg2S2A/H7qXwX+ ←Li1cDCEy3hBJCLVdvff2j3fN5yItaMN7jyIjSgiYQb776iNO2rc/ ←qB8H8rpQyPgRezL16jskI6lZQPJGTnvSV7JWnjm/ ←UseJC11SmVUMeHugQ5klLNZ8VlHu9eCl+Jmw7/1vIqPJ9+0GCpBNy79h7/ ←SW36szgGFc5DYukbXDbrrDeVv725j0CTlfTTxDJeMQEYiQU/s6drFXfunM2kQ ←== debian-server ssh-rsa ←AAAAB3NzaC1yc2EAAAABIwAAAQEAtEjKFuINFDlVBytyQjkd8UQDMilRzH6er/ ←DiqLQIFMWiRkDBVhyqGFjgJvU6tR0y5mxaLhtP4F+S7N/ ←CSkaEeD2j1WipPNCwYBE0Dr7kO9rp6E4prSd7s/e7mRSCjC3Mx6Knn/ ←vtf4sZDZjLHTb1KRgcmA61g10PycwJoZfa2Ausr/1Jo+ ←g8UpFY1zluBlLURArxpZadL6FFPPI0Z9jhYFP/ ←ndeUN2zXo9QWW5PQNv40pyzpwZslluhPvzzcbTuG97yVU8mJnrmCsJPUck2GNV ←/RMwu2qWPnGRmPrTrGneoLUO2FS6Yi+9qhLk6yrkk5drcb884cYR+l5d/3 ←BUbbiNS9w== trinity-server Listing 4.29: SSH Konfiguration: authorized keys“ Datei ” Als letzter Schritt muss nur noch die Anmeldung per Public-Key Verfahren in der Konfiguration des SSH Servers erlaubt werden. Dazu fügt man die zwei Direktiven RSAAuthentication“ ” und PubkeyAuthentication yes“ in der Datei /etc/ssh/sshd config“ ein. Ein Auszug: ” ” 1 2 3 4 5 6 7 8 ....... # Authentication: LoginGraceTime 120 PermitRootLogin no StrictModes yes RSAAuthentication yes <<=== PubkeyAuthentication yes <<=== Brandstätter Andreas, Klaffl Christoph Seite 85von 231 ALFSA 9 10 11 12 13 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG #AuthorizedKeysFile %h/.ssh/authorized_keys # Don’t read the user’s ˜/.rhosts and ˜/.shosts files IgnoreRhosts yes ....... Listing 4.30: SSH Konfiguration: Publi-Key Authentifizierung aktivieren Um die getätigten Einstellungen zu übernehmen, wird der SSH Server neugestartet: 1 2 root@trinity:˜$ /etc/init.d/ssh restart * Restarting OpenBSD Secure Shell server sshd [ OK ] ←- Listing 4.31: SSH Server neustarten Nun können sich die jeweiligen Benutzer/Server mit ihrem Schlüssel am SSH Server anmelden: 1 2 3 4 www-data@euklid-server:˜$ ssh trinity-server No mail. Last login: Mon May 5 19:40:28 2008 from chief.tux.lan www-data@trinity-server:˜$ Listing 4.32: SSH Testverbindung Wenn die automatische Anmeldung funktioniert wird als nächstes die Port Weiterletiung eingerichtet. Dazu muss wiederum die Konfiguration des SSH Server geändert werden. Sie wird um die Direktive AllowTcpForwarding“ erweitert. Ein Auszug: ” 1 2 3 4 5 6 7 8 9 10 11 12 # GSSAPI options #GSSAPIAuthentication no #GSSAPICleanupCredentials yes AllowTcpForwarding yes X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes PrintMotd no PrintLastLog yes TCPKeepAlive yes #UseLogin no <<=== Listing 4.33: SSH Konfiguration: Portweiterleitung aktivieren Der SSH Server wird wieder neugestartet, um auch diese Einstellung zu übernehmen: Brandstätter Andreas, Klaffl Christoph Seite 86von 231 ALFSA 1 2 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG root@trinity:˜$ /etc/init.d/ssh restart * Restarting OpenBSD Secure Shell server sshd [ OK ] ←- Listing 4.34: SSH Server neustarten Um die Port Weiterleitung zu nutzen, übergibt man dem SSH Client die Option -L“ mit den ” Parametern für die Port Weiterleitung. Die Syntax lautet wie folgt: ssh <hostname> -L <port>:<host>:<hostport> Erklärung der einzelnen Optionen: • hostname: Ist der Hostname bzw. die IP Adresse des Servers, zu dem eine Verbindung aufgebaut werden soll • port: Ist der lokale Port, auf dem der entfernte Port gebunden wird • host: Ist vom entfernten Server aus gesehen der Hostname bzw. die IP Adresse des Rechners, auf dem der Port weitergeleitet werden soll • hostport: Ist der entfernte Port, zu welchem der lokale Port weitergeleitet werden soll Ein Beispiel könnte so aussehen: 1 2 3 4 www-data@euklid-server:˜$ ssh trinity-server -L 3000:localhost ←:3306 No mail. Last login: Mon May 5 19:40:28 2008 from chief.tux.lan www-data@trinity-server:˜$ Listing 4.35: SSH Porttunnel aufbauen Damit wird der lokale Port 3000“ am euklid-server“ auf den entfernten Port 3306“ (MySQL ” ” ” Standardport) des Rechners localhost“ (also trinity-server“) weitergeleitet. Um zu Testen ” ” ob die Port Weiterleitung funktioniert, kann man den Port mit dem Programm telnet“ über” prüfen: 1 2 3 4 5 6 www-data@euklid-server:˜$ telnet localhost 3000 Trying 127.0.0.1... Connected to localhost. Escape character is ’ˆ]’. J 5.0.45-Debian_1ubuntu3.3-logw->.iJt-˜,UoNv)c= Listing 4.36: SSH Porttunnel testen Brandstätter Andreas, Klaffl Christoph Seite 87von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Anhand der Ausgabe sieht man, dass sich der MySQL Server des entfernten Servers trinity” server“ meldet, daher funktioniert der Porttunnel einwandfrei. Die Konfiguration und Verwaltung der Schlüssel wird vom ALFSA System selbst übernommen und muss daher nicht manuell erfolgen. 4.9.8 PHP Das PHP Skript ist so ausgelegt, dass es über die Kommandozeile sowie auch über das Webinterface ausgeführt werden kann. Somit besteht auch die Möglichkeit eine Syncronisierung über das Webinterface durchführen. Es werden nun die wichtigsten Codeteile für die Syncronisation erläutert: Port Tunnel aufbauen 1 function create_tunnel($server,$tunneld_port,$db_host,$ssh_port=22) 2 { 3 $ssh_connection_string="/usr/bin/ssh -C -f -o StrictHostKeyChecking ←=no -o ConnectTimeout=1 -o ConnectionAttempts=1 -o ←PreferredAuthentications=publickey " . $server . " -p " . ←$ssh_port . " -L ". $tunneld_port . ":" . $db_host . ":3306 ←sleep 10 > /dev/null 2> /dev/null; echo \$?"; 4 $handle=popen($ssh_connection_string,"r"); 5 $read=trim(fread($handle,"3")); 6 pclose($handle); 7 8 if($read=="0") 9 return TRUE; 10 return FALSE; 11 } Listing 4.37: Funktion zum Erstellen eines Porttunnels Der Funktion werden folgende Parameter übergeben: 1. $server: Hostname oder IP Adresse des entfernten Servers 2. $tunneld port: Der lokale Port, der für den Tunnel verwendet wird 3. $db host: Hostname oder IP Adresse des Datenbankservers im Netzwerk des entfernten Servers 4. $ssh port: Der Port auf dem der SSH Server läuft Brandstätter Andreas, Klaffl Christoph Seite 88von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Über den Befehl popen()“ wird der SSH Client des Linux System aus PHP heraus gestartet. ” Die verwendeten Optionen für den SSH Client sind: • -C: Die Verbindung wird komprimiert • -f : Bewirkt, dass der SSH Client kurz vor der Befehlausführung am Remotesystem in den Hintergrund gelegt wird • -o StrictHostKeyChecking=no: known hosts“ Datei wird ignoriert ” • -o ConnectTimeout=1: Der Timeout wird auf 1 Sekunde herabgesetzt • -o ConnectionAttempts=1: Es wird nur ein Verbindungsversuch unternommen • -o PreferredAuthentications=publickey: Ameldung per Public-Key Verfahren • -L: Port Weiterleitung • sleep 10: Befehl der am Remotesystem ausgeführt wird Die gesamte Ausgabe des Befehls (SSH Client + Optionen) wird auf das Gerät /dev/null“ ” umgeleitet, damit keine Ausgabe erfolgt. Zusätzlich wird auch noch die Fehlerausgabe umgeleitet ( 2> /dev/null“). Der nächste Befehl der ausgeführt wird ist echo $?“, welcher den ” ” Rückgabewert des SSH Clients ausgibt. Dieser Rückgabewert wird mittels PHP ausgelesen (siehe Zeile 5 von Listing 4.37). Bei Rückgabewert 0 wurde die SSH Verbindung ohne Probleme hergestellt, bei allen anderen Werten ist ein Fehler aufgetreten und die Funktion gibt FALSE zurück. Der sleep 10“ Befehl wird nach erfolgreicher Verbindung am Remotesystem ausgeführt und ” dient dazu die Verbindung für 10 Sekunden offen zu halten. In dieser Zeit muss der Porttunnel aufgebaut werden. Falls die 10 Sekunden abgelaufen sind und noch eine Verbindung über den Porttunnel besteht wird auf Beedigung dieser gewartet und erst danach wird die SSH Sitzung beendet. RSA Schlüsselpaar generieren 1 function create_rsa_key() 2 { 3 if(@scandir(HOME_DIR . "/.ssh/")==FALSE) 4 if(mkdir (HOME_DIR . "/.ssh/", 0700)==FALSE) 5 return FALSE; 6 $output=array(); 7 exec("ssh-keygen -f " . HOME_DIR . "/.ssh/id_rsa -t rsa",$output); 8 return $output; 9 } Listing 4.38: Funktion zum Erstellen des RSA Schüsselpaares Brandstätter Andreas, Klaffl Christoph Seite 89von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Die Funktion benötigt keine Parameter. In den Zeilen 3-5 von Listing 4.38 wird überprüft ob der .ssh“ Ordner im Heimverzeichnis ” des jeweiligen Benutzers existiert und wenn nicht wird er erstellt. Falls bei diesem Vorgang ein Fehler auftritt wird FALSE zurückgeliefert. Mit exec()“ wird das SSH Tool ssh-keygen“ von PHP aus aufgerufen. Die verwendete Op” ” tionen für ssh-keygen“ sind: ” • -f : Mit dieser Option kann der Dateiname des Schlüssels angegeben werden • -t: Mit dieser Option kann der Typ des Schlüssels angegeben werden (rsa1,rsa,dsa) Fehlerbehandlung 1 function sync_error($line, $file, $string, $mysql_error="",$die=TRUE, ←$output=FALSE) 2 { 3 $fehler = "Datei: " . $file . ", Zeile: ". $line . " => " . $string ←; 4 if($mysql_error!="") 5 $fehler .= " - MySQL Fehler: " . $mysql_error; 6 7 $fehler=format_string_for_html_console($fehler); 8 append_to_log(SYNC_ERROR_LOG,$fehler["console"]); 9 10 11 if($output==FALSE && $die==TRUE) 12 { 13 if($argv) 14 { 15 $fp = fopen("php://stderr", ’w’); 16 flock($fp, LOCK_EX ); 17 fputs($fp, ’Fehler beim Syncronisieren mit dem Server "’ . ←$_GET["server"] . ’". Weitere Informationen befinden sich ←in der sync-error.log!’); 18 flock($fp, LOCK_UN ); 19 fclose($fp); 20 }else 21 { 22 echo ’<br><font color="red" size="3">Syncronisation wurde wegen ←eines Fehlers abgebrochen. Fuer naehere Information sehen ←sie bitte die sync-error.log ein!’; 23 } 24 }elseif($output==TRUE) 25 { Brandstätter Andreas, Klaffl Christoph Seite 90von 231 ALFSA 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG $string=format_string_for_html_console($string); if($argv) { $fp = fopen("php://stderr", ’w’); flock($fp, LOCK_EX ); fputs($fp, $string["console"]); flock($fccp, LOCK_UN ); fclose($fp); }else { echo $string["html"]; } } if($die==TRUE) { global $dbhandle; if(clean_up($dbhandle)==TRUE) del_lock_file(INCONSISTENT_LOCK_FILE); wieder als aktiv markieren 45 46 47 48 } 49 } //Datenbankserver ←- append_to_log(SYNC_INFO_LOG,"Synchronisation wegen eines Fehlers abgebrochen, siehe Sync Error Log"); die(); ←- Listing 4.39: Funktion für die Fehlerhandhabung bei der Syncronisation Der Funktion werden folgende Parameter übergeben: 1. $line: Zeilennummer, in welcher der Fehler auftritt 2. $file: Datei, in welcher der Fehler auftritt 3. $string: Fehlertext 4. $mysql error: Falls es sich um einen Datenbankfehler handelt, wird hier die Fehlermeldung vom Datenbankserver angegeben (Standardwert: leer) 5. $die: Soll das Programm abgebrochen werden (Standardwert: TRUE) 6. $output: Soll der übergebene Fehlertext ausgegeben werden (Standardwert: FALSE) Falls während der Syncronisation ein Fehler auftritt, wird diese Funktion aufgerufen, welche entsprechende Log Einträge schreibt und eine Fehlermedlung ausgibt. Sie kann weiters feststellen wie PHP ausgeführt wird, von der Kommandozeile oder über das Webinterface. Dies Brandstätter Andreas, Klaffl Christoph Seite 91von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG wird über die Systemvariable $argv“ festgestellt, die nur existiert wenn das PHP Skript von ” der Kommandozeile ausgeführt wird. Die verwendete Funktion format string for html console()“ formatiert den übergebenen Text ” für die Konsole und für HTML. Es liefert diesen als assoziatives Array zurück: • console“: HTML Zeilenumbrüche (<br>) und andere (\r, \r\n) werden zu einem ” UNIX konformen Zeilenumbruch umgewandelt (\n), alle HTML Tags werden entfernt • html“: UNIX konforme Zeilenumbrüche (\n) und andere (\r, \r\n) werden in HTML ” Zeichenumbrüche (<br>) umgewandelt Freien Port herausfinden 1 $tmp=explode("-",$config_tunnel_port_range); 2 $port=rand($tmp[0],$tmp[1]); //Zufaelligen Port aus dem ←eigestellten Port Range auswaehlen 3 $retries=20; 4 while(@fsockopen("127.0.0.1",$port,&$errno,&$errstr,2) && $retries--) ←//und ueberpruefen ob der Port frei ist 5 $port=rand($tmp[0],$tmp[1]); Listing 4.40: PHP Codeteil zum herausfinden ob ein Port frei ist $config tunnel port range“ ist eine globale Konfigurationsvariable, in welcher der Portbe” reich, der für die Syncronisation verwendet werden darf, im Format <Startport>-<Endport>“ ” steht. Dieser Portbereich wird mittels der Funktion explode()“ in Start- und Endport auf” gespalten und der Funktion rand()“ übergeben, welche einen zufälligen Port aus diesem ” Portbereich zurückgibt. Über die Funktion fsockopen()“ wird der übergeben Port überprüft ” und falls ein Socket geöffnet werden kann ist der Port offen und die Funktion liefert 0 zurück, was dazu führt das die while-Schleife verlassen wird. Falls nach 20 Versuchen kein freier Port gefunden werden konnte, wid die while-Schleife ebenfalls verlassen und über die Variable $re” tries“ kann festgestellt werden, dass der Vorgang nicht erfolgreich war (sie hat in diesem Fall den Wert 0). Das @“ Zeichen vor der Funktion fsockopen()“ bewirkt, dass bei einem Fehler ” ” die Ausgabe der Funktion unterdrückt wird. Primär Schlüssel auslesen 1 function get_primary_keys($tablename,$dbhandle) 2 { 3 $table_struct=get_table_structure($tablename,$dbhandle); 4 Brandstätter Andreas, Klaffl Christoph Seite 92von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG 5 $ret=array(); 6 foreach($table_struct as $collumn) 7 foreach($collumn as $key=>$value) 8 if($key=="Key" && $value=="PRI") 9 array_push($ret,$collumn["Field"]); 10 11 return $ret; 12 } Listing 4.41: Funktion zum Auslesen der Primärschlüssel einer Tabelle Der Funktion werden folgende Parameter übergeben: 1. $tablename: Name der Tabelle 2. $dbhandle: Datenbankhandle Die Funktion liest über die Funktion get table structure()“ die Struktur der Tabelle aus und ” geht diese mit einer foreach“ Schleife durch. Wenn in der Spalte Key“ der Wert PRI“ steht, ” ” ” ist diese ein Primärschlüssel und wird in ein Array zwischengespeichert. Dieses Array wird nach Beendigung der foreach“ Schleife zurückgegeben. ” Neue Datensätze auslesen 1 function get_new_data($tablename,$dbhandle,$limit_start=0, ←$limit_count=0) 2 { 3 if($limit_count==0) 4 $sql=’SELECT * FROM ’ . mysql_real_escape_string($tablename) . ’ ←WHERE edit_date>’ . $GLOBALS["last_sync_date"] . ’;’; 5 else 6 $sql=’SELECT * FROM ’ . mysql_real_escape_string($tablename) . ’ ←WHERE edit_date>’ . $GLOBALS["last_sync_date"] . ’ LIMIT ’ . ←mysql_real_escape_string($limit_start) . ’,’ . ←mysql_real_escape_string($limit_count) . ’;’; 7 8 $result=mysql_query($sql,$dbhandle) or sync_error(__LINE__, ←__FILE__, $sql, mysql_error($dbhandle)); 9 10 $ret=array(); 11 while($row = mysql_fetch_assoc($result)) //Process every row 12 array_push($ret, $row); 13 return $ret; 14 } Brandstätter Andreas, Klaffl Christoph Seite 93von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Listing 4.42: Funktion zum Auslesen der neuen Datensätze Der Funktion werden folgende Parameter übergeben: 1. $tablename: Name der Tabelle 2. $dbhandle: Datenbankhandle 3. $limit start: Gibt die Datensätze an, ab denen selektiert wird (Standardwert: 0) 4. $limit count: Gibt an, wieviele Datensaetze maximal zurueckgeliefert werden (Standardwert: 0) Die Funktion fragt über ein SQL Query alle Datensätze ab, deren Änderungsdatum ( edit date“) ” größer als das letzte Syncronisatiosdatum ($GLOBALS[ last sync date“]) ist. Falls man den ” Parameter $limit count“ verwendet, wird über die SQL-Direktive LIMIT“ die zurückgege” ” benen Datenstätze begrenzt. Tabellen synchronisieren 1 function sync_table($source_tablename,$target_tablename,$dbhandle, ←$dbhandle2) 2 { 3 $primary=get_primary_keys($source_tablename,$dbhandle2); 4 $limit_start=0; 5 $new_data=get_new_data($source_tablename,$dbhandle2,$limit_start, ←MAX_NEW_DATA); 6 $count_all=count($new_data); 7 8 while($new_data!=NULL) 9 { 10 foreach($new_data as $temp) 11 { 12 $sql=’INSERT INTO ’ . mysql_real_escape_string( ←$target_tablename) . ’ SET ’; 13 $count=0; 14 foreach($temp as $key=>$element) 15 { 16 $count++; 17 if(is_null($element)) 18 $sql.= ’‘’ . $key . ’‘=NULL’; 19 else 20 $sql.= ’‘’ . $key . ’‘="’ . $element . ’"’; Brandstätter Andreas, Klaffl Christoph Seite 94von 231 ALFSA 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG if($count<count($temp)) $sql.=’,’; else $sql.=’;’; } $result=mysql_query($sql,$dbhandle); if(mysql_errno($dbhandle)==1062) //1062: Duplicate Entry --> ←Daher muss statt ein INSERT Query eine UPDATE Query ←durchgefuehrt werden { $sql=’UPDATE ’ . mysql_real_escape_string($target_tablename ←) . ’ SET ’; $count=0; $where=""; foreach($temp as $key=>$element) { $count++; $tmp=0; foreach($primary as $pkey) if($key==$pkey) $tmp=1; if($key=="edit_date") { if($where!="") $where.=’ AND ’; $where.= ’edit_date<"’ . $element . ’"’; } if($tmp) { if($where!="") $where.=’ AND ’; $where.= ’‘’ . $key . ’‘="’ . $element . ’"’; }else { if(is_null($element)) $sql.= ’‘’ . $key . ’‘=NULL’; else $sql.= ’‘’ . $key . ’‘="’ . $element . ’"’; if($count<count($temp)) $sql.=’,’; else $sql.=’ WHERE ’; } Brandstätter Andreas, Klaffl Christoph Seite 95von 231 ALFSA 66 67 68 69 70 71 72 73 74 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG } $sql.= $where . ’;’; $result=mysql_query($sql,$dbhandle) or sync_error(__LINE__, ←__FILE__, $sql, mysql_error($dbhandle)); }else if(mysql_error($dbhandle)!="") sync_error(__LINE__, __FILE__, $sql, mysql_error($dbhandle) ←); } $limit_start+=MAX_NEW_DATA; $new_data=get_new_data($source_tablename,$dbhandle2,$limit_start, ←MAX_NEW_DATA); $count_all+=count($new_data); 75 76 77 } 78 79 return $count_all; 80 } //Hinzugefuegt/aktualisierte Datensaetze Listing 4.43: Funktion zum Synchronisieren der Tabellen Der Funktion werden folgende Parameter übergeben: 1. $source tablename: Tabellenname der Quelltabelle 2. $target tablename: Tabellenname der Zieltabelle 3. $dbhandle: Datenbankhandle der Zieldatenbank 4. $dbhandle2: Datenbankhandle der Quelldatenbank Die Funktion liest die Primärschlüssel der übergebenen Tabelle über die Funktion get primary keys()“ ein. Weiters werden die neuen Datensätze über die Funktion ” get new data()“ abgerufen. Durch das Übergeben der definierten Variable ” MAX NEW DATA“, welche in ./conf/defines.inc.php“ definiert ist, wird die Anzahl der ” ” Datensätze, die zurückgeliefert werden, limitiert. Diese Limitierung muss stattfinden, da ansonsten das PHP Skript zu viel Speicher beansprucht und vom PHP Interpreter unterbrochen wird. Die neuen Datensätze werden dann einzeln durchlaufen und daraus werden SQL Queries gebaut, welche in der Zieldatenbank bzw. Zieltabelle ausgeführt werden. Falls bei diesem Vorgang en Fehler auftritt wird überprüft, ob die MySQL Fehlernummer mit 1062 übereinstimmt. 1062 bedeutet, dass bereits ein Datensatz mit den gleichen Primärschlüsselwerten existiert, daher muss anstatt eines INSERT Querys ein UPDATE Query durchgeführt werden. Für das zusammenstellen des UPDATE Querys sind die Primärschlüssel wichtig, da mit diesen genau der eine Datensatz selektiert wird. Falls ein anderer Fehler auftritt wird die Funktion sync error()“ für die Fehlerbehandlung aufgerufen. Nachdem alle neuen Datensätze durch” gelaufen sind und in der Zieltabelle eingefügt bzw. aktualisiert wurden, wird $limit start um die definierten Variable MAX NEW DATA“ erhöht und über die Funktion get new data()“ ” ” Brandstätter Andreas, Klaffl Christoph Seite 96von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG die nächsten neuen Datensätze abgerufen. Der gesamte Vorgang wird solange wiederholt, bis die Funktion get new data()“ keine Datensätze mehr zurückgibt. ” Genauer Ablauf der Syncronisierung Das PHP Skript für die Syncronisierung läuft folgendermaßen ab: 1. Überprüfen der Konfigurationsdateien und ob ausreichende Schreibrechte zur Verfügung stehen 2. Verbindungsaufbau mit dem lokalen Datenbankserver 3. Eigenschaften und Einstellungen des übergebenen Servers aus der lokalen Datenbank lesen 4. Freien Port herausfinden (Listing 4.40 auf Seite 92) und aufbauen des SSH Porttunnels zu dem entfernten Server (Listing 4.37 auf Seite 88) 5. Verbindungsaufbau mit dem entfernten Datenbankserver über den SSH Porttunnel 6. Die Tabelle sync“ wird zwischen den zwei Server syncronisiert ” 7. Es werden alle Tabellen des entfernten Servers eingelesen und nach ihren Beziehungsebenen, welche in der sync“ Tabelle stehen, sortiert ” 8. Die Tabellen werden jetzt nacheinander abgearbeitet, begonnen wird mit jenen Tabellen welche keine Beziehungen zu anderen Tabellen aufweisen: (a) Es wird überprüft ob die Tabelle am lokalen Datenbankserver existiert, falls nicht wird sie anhand der Struktur des Quelltabelle erstellt (b) Überprüfen, ob die Tabellenstruktur gleich ist, falls nicht wird sie eventuell aktualisiert (siehe Kapitel 4.9.9) (c) Tabelle wird syncronisiert, siehe Listing 4.43 auf Seite 94 9. Syncronisation wird gesäubert (Entfernen von temporären Daten , ...) 10. authorized keys“ für SSH überprüfen und eventuell aktualisieren ” 11. Syncronisation abschließen (Syncronisationsdatum schreiben, Log Eintrag schreiben) 4.9.9 Datenbankstruktur aktualisieren Da während der Entwicklung die Datenbankstruktur ständig angepasst und verändert wurde, war es erforderlich, dass die Syncronisierung auch mit einer solchen Änderung zurecht Brandstätter Andreas, Klaffl Christoph Seite 97von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG kommt und diese auf allen Servern nachvollzieht. Für diesen Zweck wurde ein Server ausgewählt, über welchen die anderen Server im System die Datenbankstruktur übernehmen können. Der Name dieses Servers wurde in der Datei ./conf/defines.inc.php“ in der Variable ” MASTER STRUCTURE DB SERVER“ definiert. Falls sich während der Syncronisierung ” herausstellt, dass sich die Datenbankstruktur der beiden syncronisierenden Server unterscheidet, wird überprüft ob der Server, von welchem syncronisiert wird, derjenige ist, von dem die Struktur übernommen werden darf. Sollte dies zutreffen wird die Datenbankstruktur von diesem Server übernommen. Während diesen Vorgang wird der Datenbankserver über ein Lockfile als inkonsistent markiert, um Syncronisationsversuche von Clients oder anderen Server zu verhindern, da sonst ein Datenverlust auftreten kann. Sollte während der Strukturübernahme ein Fehler auftreten, wird der gesamte Prozess rückgängig gemacht und der alte Zustand wieder hergestellt. Danach wird der inkonsistente Status wieder aufgehoben. Falls es sich bei dem anderen Server nicht um denjenigen handelt, von dem die Struktur übernommen werden darf, wird der komplette Syncronisationsvorgang abgebrochen. Beachte: Für den produktiven Einsatz, sollte sich die Datenbankstruktur im Betrieb nicht änderen bzw. keine inkompatiblen Datenbankstrukturen geschaffen werden. Durch das Einspielen einer inkompatiblen Datenbankstruktur gehen die neuen Daten der Clients, die sich noch nicht im verteilten Datenbanksystem befinden, verloren. Daher ist es empfehlenswert die Aktualisierung der Datenbankstruktur im Produktivbetrieb generell zu unterbinden, dazu muss die Variable MASTER STRUCTURE DB SERVER“ mit einem leeren String also ” “ definiert werden. ” 4.9.10 Backupserver Durch den Eintrag eines Servers mit der Priorität 0 wird dieser zu einem Backupserver. Backupserver können nicht für die Client-Server Syncronisation verwendet werden. Desweiteren verweigern sie auch Verbindungen von den anderen aktiven ALFSA Sytemen. Backupserver bauen lediglich Verbindungen zu den anderen aktiven ALFSA Systemn auf und holen sich die neuen Daten. Dadurch sind alle Datensätze im ALFSA System auch auf den Backupserver verfügbar. Da die Backupserver jegliche Verbindungen von den anderen ALFSA Systemen verweigern, können keine direkten Datenmanipulationen seitens der anderen Server auf dem Backupserver durchgeführt werden. Im Falle einer Übernahme eines ALFSA Servers durch einen Angreifer ist der Backupserver von diesem geschützt, da keine Verbindungen erlaubt werden. Dadurch ist es möglich die Sicherheit der Daten noch weiter zu erhöhen. 4.9.11 Fehlerbehandlung Für eine ordnungsgemäße Syncronisation ist es notwendig, Fehler während des Syncronisationsvorgangs zu erkennen und entsprechende Handlungen für den Umgang mit diesen auszuführen. Nachfolgend werden mögliche Fehlerszenarien angeführt: Brandstätter Andreas, Klaffl Christoph Seite 98von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Keine Berechtigung Syncronisationsversuche von Servern, die im ALFSA System nicht registriert sind bzw. keine Berechtigung haben, werden schon beim Versuch eine SSH Verbindung herzustellen abgelehnt. Dadurch kommt es zu keiner Verbindung, wie es auch erwünscht ist. Falls aus irgendwelche Gründen (Fehler, Manuele Manipulation der Konfiguration, ...) trotzdem eine SSH Verbindung aufgebaut werden kann, muss sich der anfragende weiters am MySQL Datenbankserver authentifizieren, dazu müssen allerding Benutzername, Passwort, Datenbankname und der Datenbankhost bekannt sein. Daher muss sich ein Angreifer gegen zwei Sicherheitsstufen behaupten (SSH und MySQL). Datenmanipulation Versucht ein Angreifer die Datenübertragung zwischen 2 syncronisierenden Servern zu manipulieren wird dieser Vorgang durch SSH erkannt und die Verbindung wird sofort getrennt. Dadurch können keine fehlerhaften Daten bzw. manipulierte Daten von Dritten in das System eingeschleußt werden. Der Abbruch der SSH Verbindung verhält sich wie ein Abbruch der Internetverbindung bzw. eines Timeouts (siehe 4.9.11, Verbindungsabbruch). Serverausfall Falls der Versuch unternommen wird, mit einem Server zu syncronisieren, der nicht erreichbar oder abgesürzt ist, kommt die SSH Verbindung nicht zustande und es werden entpsrechende Log Meldungen geschrieben. Ausfall des Datenbankservers Falls der Datenbankserver am Zielserver ausgefallen ist, kann zwar die SSH Verbindung mit zugehörigem Porttunnel aufgebaut werden, jedoch ist die Verbindung zum entfernten Datenbankserver nicht möglich und die Syncronisation wird mit entsprechenden Log Eintragungen abgebrochen. Verbindungsabbruch Bricht während der Syncronisation die Verbindung zwischen den 2 Servern ab (Firewall, Netzwerkfehler, Router ausgefallen, ...) wird dieser Umstand durch einen Timeout erkannt und die SSH Verbindung wird beendet. Dadurch bricht folglicherweise auch die Verbindung mit dem entfernten Datenbankserver zusammen und die Syncronisation wird daraufhin abgebrochen. Entsprechende Log Einträge über den Verbindungsabbruch zum Datenbankserver werden im Brandstätter Andreas, Klaffl Christoph Seite 99von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Error Log geschrieben. Die Syncronisation wird als nicht erfolgreich markiert und alle neuen Daten werden bei der nächsten Syncronisation nochmals angefordert. 4.10 Client - Server Syncronisation 4.10.1 Vorgaben Synchronisation zwischen Client und Server werden grundsätzlich unregelmäßig vom Benutzer gestartet. Nach jeder Datenmanipulation am Client sollte der Benutzer eine Synchronisation ausführen. Daher soll die Synchronisation ohne weitere Eingaben und mit einer anschaulichem Fortschrittsdarstellung ablaufen. Der Benutzer muss einfach erkenn können, wann die Synchronisation fertiggestellt ist. Weiters ist es möglich, dass der Client durch einen Proxy vom Internet getrennt ist und nur die Ports für HTTP (80) und HTTPS (443) zur Benutzung freigegeben sind. Daher muss die Synchronisation auf einem dieser Ports durchgeführt werden und die Verwendung eines Proxys unterstützen. 4.10.2 Konzept Basiernd auf diesen Vorgaben wurde ein Konzept für die Client-Server-Synchronisation entwickelt. Dieses Konzept sieht auf Server und Client einen Webserver vor, welche die Daten aus der Datenbank zur Synchronisierung aufbreiten und über Webtransfer austauschen. Diese Komplette Übertragung erfolt über HTTPS um einem Manipulation der Daten zu verhindern. Weiters wird ein Verbindungsschlüssel, der später noch näher erläutert wird, eingesetzt um die Berechtigung der Datenmaniplation sicherzustellen. Die Kommunkikation erfolt in einzelnen Teilschritten um bei großen Datenmengen Timeouts zu herhindern. Ebenso kann bei einem Verbindungsabbruch beim letzten Teilschritt fortgesetzt werden. Durch ein verteiltes Server-Datenbank-Netz muss vom Client ein Server nach verschiedenen Kriterien selbstständig ausgewählt werden, um einen Single-Point-of-Failure zu vermeiden. 4.10.3 Prinzip Die einzelnen Teilschritte der Client-Server-Synchronisation erfolgen nach folgendem Prinzip: • Client sendet HTTPS-Request mit Daten an den Server • Server verarbeitet Daten vom Client • Server sendet HTTP-Replay mit Daten an den Client Brandstätter Andreas, Klaffl Christoph Seite 100von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG • Client verarbeitet Daten vom Server Wie im Ablauf ersichtlich, wird jede Kommunikation vom Client initiiert. Dies ist erforderlich, nur der Server öffentlich erreichbar ist. Sobald der erste Teilschritt vom Client gestartet wurden, überwacht der Server die folgenden Anfragen. Der Server kann, wenn nach einem Timeout kein weitere Anfragen folgen, einen Fehler feststellen und diesen in die Datenbank eintragen und gegebenenfalls ein Email an das Supportpersonal senden. Ebenso kann der Client bei Abbruch der Verbindung während der Synchronisation einen Fehler feststellen. Der Client kann daraufhin den Benutzer nach einem Timeout zum Neustart der Synchronisation auffordern. 4.10.4 Realisierung Hauptseite Die Synchronisierung wird vom Benutzer durch Aufruf einer PHP-Seite in einem neuen Frame aus der Client-Software gestartet. Diese Seite überprüft, in welchem Zustand sich die Synchronisation befindet. Wurde eine Synchronisation vollständig abgeschlossen, so wird eine neu Synchronisation gestartet. Befindet sich eine Synchronisation in Arbeit, so wird festgestellt, ob diese Fortgesetzt werden soll. Falls die laufende Sychronisation in einem anderen Frame oder Browser läuft, so wird eine Wartemeldung ausgegeben. Entsprechend diesen Entscheidungen wird bei Bedarf eine Seite des geweiligen Teilschrittes der Synchronisation, genannt Phase eingebunden. Andernfalls wird eine Entsprechende Fehler- oder Wartemeldung ausgegeben. Phase 0: Verbindung herstellen Diese Phase stellt die erste Verbindung zum Server her. Dazu wird zuerst ein Server aus der Datenbank ausgewählt. Dies erfolgt zu Lastverteilung zufällig gewichtet nach einer Priorität der Server. Das heißt jedem Server wird vom Supportpersonal eine Priorität von 1 bis 9 zugewiesen. Diese Zahl drückt die Geschwindigkeit der Internetverbindung und die Leistung des Servers aus. Größere Zahlen entsprechen mehr Leistung. Proportional zu dieser Zahl stigt die Wahrscheinlichkeit mit der ein Server gewählt wird. Server in der Datenbank, die mit der Zahl 0 als Backup-Server eingetragen sind, werde nie zur Sychronisation ausgewählt. Nach der Auswahl eines Server wird versucht mit diesem eine Verbindung herzustellen, indem die Daten “ping“ gesendet werden. Der Server antwortet daruf mit den Daten ”pong“. Dies stellt einen erfolgreichen Verbindungstest dar, und der Datentransfer kann in der nächsten Phase ausgführt werden. Antwortet der Server nicht, so wird bis zu 5 mal ein anderer zufälliger Server ausgewählt und der gleiche Verbindungstest durchgeführt. Endet keiner der 5 Verbindungsversuche erfolgreich, so wird dem Benutzer mitgeteilt, dass die Verbindung nicht hergestellt werden kann und die Synchronisation wird abgebrochen. Brandstätter Andreas, Klaffl Christoph Seite 101von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Phase 1: Daten senden In dieser Phase werden am Client alle Daten aus der Datenbank selektiert, die seit der letzten vollständigen Synchronisation eingetragen wurden. Die werden in jener Reihenfolge gesendet, dass keine Foreign-Key-Probleme auftreten. Das heißt es wird mit Daten begonnen, von denen keine weiteren Daten abhängen. Diese werden an den Server gesendet. Am Server wird für jeden Datensatz geprüft ob dieser vom Client verändert werden darf. Für jede Tabelle ist in der Datenbank gespeichert, ob Daten daraus vom Client angenommen werden. Werden vom Client Datensätze gesendet, die nicht in die Datenbank eingetragen werden dürfen, so wird eine Fehlermeldung abgespeichert. Dies ist zum Beispiel der Fall wenn Benutzerdaten gesendet werden, denn diese dürfen am Client nicht verändert werden. Verläuft diese Prüfung positiv, so werden die Daten in die Datenbank des Servers eingetragen. Ebenso wird die Änderungszeit auf die aktuelle Zeit gesetzt. Dies ist erforderlich um die Synchronierung der Datensätze mit den anderen Servern und anderen Clients zu ermöglichen. Die Zeit würde andernfalls in vor der letzten Synchronisation mit anderen Servern liegen und diese würden den Datensatz bei den nächsten Synchronisationen nicht erhalten. Phase 2: Tabellen abgleichen Beim abgleichen der Tabellen werden am Client die gesamten Tabellenstrukturen zusammengefasst und an den Server übertragen. Der Server verlgleicht die Struktur jeder Tabelle mit der Struktur Client. Wird ein Unterschied festgestellt, so werden die über Foreign-Keys abhängenden Tabellen rekursiv ermittelt. Dem Client werden daraufhin die Befehle zum löschen all dieser Tabellen, beginnen mit jenen von denen keine weiteren Tabellen abhängen, übermittelt. Anschließend werden in gleicher Reihenfolge die Befehle zum neu erstellen der Tabellen übertragen. Als letztes, in ebenfalls gleicher Reihenfolge, die kompletten Daten der Dateien. Bei dieser Übermittlung wird ebenfalls geprüft, ob der Client berechtigt ist die Struktur bzw. die Daten der Tabelle zu erhalten. Beispielsweise wird die Tabelle der Verbindungsschlüssel nicht an die Clients übertragen. Phase 3: Daten holen In dieser Phase sendet der Client an den Server die Anfrage, Daten zu holen. Der Server selektiert daraufhin in allen Tabellen die Daten, die neuer als das Datum der letzten vollständigen Synchronisierung sind. Es wird hierbei ebenfalls geprüft welche Daten gemäß einer Berechtigungstabelle auf den Client übertragen werden. Diese Daten werden anschließend in einer temporären Datei zwischengespeichert. Danach werden je 100 Datensätze an den Client übertragen. Sind mehr Daten in der temporären Datei vorhanden, so wird der Client aufgefordert eine erneute Anfrage zu senden. Nach dem Senden der lezten Daten wird die temporäre Datei am Server gelöscht. Am Client werden die Daten in die Datenbank eingefügt. Hier ist keine Prüfung der Daten erforderlich, da Daten die vom Server übertragen werden als Richtig anzusehen sind. Brandstätter Andreas, Klaffl Christoph Seite 102von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Phase 4: Synchronisation abschließen Als letzte Phase wird am Client das Datum der vollständigen Sychronisation abgespeichert. Dem Benutzer wird die Meldung ausgegeben, dass die Synchronisation abgeschlossen ist. Der Benutzer wird aufgefordert das Synchronisationsfenster zu schließen. Phase 5: Synchronisation bereits fertig Wird die Seite vom Benutzer durch Druck auf F5“ oder durch klicken auf Aktualisieren“ ” ” aktualisiert, so wird die Phase nach der letzten normalen Phase geladen. Dem Benutzer wird daraufhin die Meldung ausgegeben, dass die Synchronisation bereits abgeschlossen ist. Der Benutzer wird aufgefordert das Synchronisationsfenster zu schließen. 4.10.5 Umsetzung cURL-Funktion Um Anfragen an den Server zu senden und Daten von diesem zu empfangen wird cURL bzw. libcurl verwendet. PHP unterstützt libcurl, eine Bibiothek entwickelt von Daniel Stenberg, die es erlaubt sich ” mit Servern zu verbinden und über diverse Protokolle zu kommunizieren.“ [4] Eine eigene Funktion übernimmt die Einstellung aller Parameter für cURL sowie die Behandlung von Fehlern bei der Übertragung. Da diese Funktion einen fundamentalen Bestandteil der Client-Server-Synchronisation darstellt wird diese hier aufgeführt. Die Funktion sendet die Daten an den Server und empfängt die Daten, welche der Server zurücksendet. 1 2 3 4 5 6 /** * Fragt eine Server-Seite ueber CURL ab. * * @param array $post Daten, die per POST uebergeben werden. * @param int $phase Arbeitsschritt, der aktuell abgearbeitet wird. * @param string $server Servername, auf den die Anfrage ausgefuehrt wird. @return array Inhalt der Seite und eventuell aufgetretene Fehler. * */ ←- 7 8 9 10 function get_server_page($post = array(), $phase, $server = "euklid- ←server") 11 { 12 // Synchronisationsdaten laden 13 $this_sync_vorgang = get_this_sync_vorgang(); 14 Brandstätter Andreas, Klaffl Christoph Seite 103von 231 ALFSA 15 // 16 17 18 19 20 21 22 // 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 // // KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Daten des Servers aus der Datenbank holen $server = get_server($server); echo "Verbunden mit Server: ".$server["name"]."(".$server[" ←hostname"].")<br />"; flush(); $server = $server["hostname"]; flush(); Die Session mit URL initialisieren $ch = curl_init("https://".$server."/aaron/server-www/client-sync ←/"); Session Optionen setzen Wenn ein Proxy in Konfigurationsdatei vorhanden, Proxy setzen if(PROXY_STRING != "") curl_setopt($ch, CURLOPT_PROXY, PROXY_STRING); // Header nicht in die Ausgabe aufnehmen curl_setopt($ch, CURLOPT_HEADER, 0); // User-Agent-Feld (Browserkennung) im HTTP Header curl_setopt($ch, CURLOPT_USERAGENT, "ALFSA sync agent"); // gibt Transfer zurueck, anstatt Ausgabe vorzunehmen curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Peerueberpruefung von HTTPS setzen curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Hostueberpruefung von HTTPS setzen curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // Timeout der Verbindung curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // POST-Parameter setzen $postValues = ""; // Datum der letzen vollstaendigen Synchronisation $posts = array( "last_date" => read_end_date(), // Datum der aktuellen Synchronisation "this_date" => $this_sync_vorgang["start_date"], // aktuelles Datum "current_date" => time(), // Feuerwehrnummer der Fuellstelle "fwnr" => FUELLSTELLE, // Laufnummer des Clients "client" => CLIENT, // aktuelle Phase (Arbeitsschritt) "phase" => intval($phase), // Pruefsumme der Daten und Verbindungskennung "chksum" => md5($post["data"]."|".CONNECTION), // Zufallsdaten um Caching zu vermeiden Brandstätter Andreas, Klaffl Christoph Seite 104von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG 61 "rand" => md5(rand(0,1000)."|".time())); 62 $posts = array_merge($posts, $post); 63 // POST-Daten urlencodieren 64 foreach($posts AS $name => $value) 65 if(!empty($value) || $name == "phase") 66 $postValues .= urlencode($name)."=".urlencode($value).’&’; 67 $postValues = substr($postValues, 0, -1); 68 // POST-Daten setzen 69 curl_setopt($ch, CURLOPT_POSTFIELDS, $postValues); 70 71 // Ausfuehren der CURL-Aktion 72 $result = curl_exec($ch); 73 74 // Ergebnis als globale Variable fuer Debugzwecken zur Verfuegung ←stellen 75 global $raw_result; 76 $raw_result = $result; 77 78 // Fehlercodes als globale Variable importieren 79 global $error_codes; 80 $this_error = FALSE; 81 $codes = ""; 82 // Auftreten von Fehlercodes pruefen 83 foreach($error_codes as $error) 84 if(strstr($result, $error["code"])) 85 { 86 $result = str_replace($error["code"], "", $result); 87 $codes .= $error["code"]; 88 89 if($error["error"]) 90 $this_error = $error["code"]; 91 echo $error["text"]."<br />"; 92 } 93 94 // wenn Debug aktiviert ist, Ergebnis ausgebe 95 if(SYNC_DEBUG) 96 echo "<pre>### html-rueckgabe ###\r\n".$result."\r\n</pre>"; 97 98 // wenn Ergebnis leer ist, auf CURL-Fehler pruefen und ggf ausgeben 99 if(empty($result)) 100 { 101 if(strlen(curl_error($ch)) > 5) 102 echo "<b>CURL-Fehler: ".curl_error($ch)."</b><br />"; 103 104 $codes .= "[=curl]"; 105 $this_error = "[=curl]"; 106 } 107 Brandstätter Andreas, Klaffl Christoph Seite 105von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG 108 // CURL-Session beenden 109 curl_close($ch); 110 111 // Ergebnis der Anfrage und ggf Fehler zurueckgeben 112 return array("result" => $result, "error" => $this_error, "codes" => $codes); 113 } ←- Listing 4.44: PHP Funktion zum Senden von Daten an der Server und Empfangen von Daten Verbindungsschlüssel Zur Überprüfung der Authentizität des Clients wird ein Verbindungschlüssel eingesetzt. Dieser Schlüssel wird einmalig vom Supportpersonal zufällig generiert und an den Verwalter des Clients schriftlich übermittelt. Dieser trägt den Schlüssel in die Grundkonfiguration des Clients ein. Dieser Schlüssel wird bei jeder Übertragung verwendet um eine Checksumme mit den Daten zu bilden. Beispiel für einen Verbindungsschlüssel (aus Sicherheitsgründen wurde dieser verändert): 1 N5D40-FOEBA-MRCIX-VR95O-UQKP1 Listing 4.45: Beispiel für einen Verbindungschlüssel Einem möglichen Angreifer, der Daten in das System einschleusen will, ist der Schlüssel nicht bekannt und es ist ihm so nicht möglich eine korrekte Checksumme zu erzeugen. Dieser Fehler wird vom Client erkannt und die Daten, die der Angreifer in das System einschleusen wollte werden nicht in die Datenbank eingetragen. Es ist dem Angreifer durch Abfangen von korrekten Daten von Clients auch nicht möglich den Verbindunsschlüssel zu berechnen. Der Verbindungschlüssel stellt somit sicher, dass nur Authentische Daten am Server engegengenommen und in die Datenbank eingetragen werden. Folgender Codeteil erstellt die Checksumme am Client (die Variable $post[“data“] enthält die Daten, die Konstante CONNECTION enthält den Verbindungschlüssel): 1 md5($post["data"]."|".CONNECTION); Listing 4.46: PHP Code zur Erstellung der Checksumme mit Verbindungschlüssel Folgender Codeteil Prüft die Checksumme am Server (die Variable $ POST[“chksum“] enthält die Cecksumme, die vom Client übermittelt wurde, die Variable $ POST[“data“] enthält die Daten vom Client, die Variable $row[“kennung“] enthält den Verbindungschlüssel aus der Datenbank): Brandstätter Andreas, Klaffl Christoph Seite 106von 231 ALFSA 1 2 KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG if($_POST["chksum"] != md5($_POST["data"]."|".$row["kennung"])) die("[=chkerr]"); Listing 4.47: PHP Code zur Prüfung der Checksumme mit Verbindungschlüssel Browser-Abfrage Die Daten vom Client zum Server und vom Server zum Client werden über normalen Webtransfer übertragen. Der URL, der hiezu verwendet wird, könnt auch in einem normalen Browser geöffnet werden. Um dies zu verhindern wird in PHP der User-Agent überprüft. Der User-Agent-Wert ist die Kennung des Browsers und wird bei der HTML-Anfrage übertragen. Durch Abfragen dieses Wertes kann weitestgehend verhindert werden, dass normale Browser auf diese Seite zugreifen. Vom Client wird eine spezielle Kennung als User-Agent gesendet: ALFSA sync agent“. ” Folgender Codeteil weist CURL an den speziellen User-Agent zu senden: 1 curl_setopt($ch, CURLOPT_USERAGENT, "ALFSA sync agent"); Listing 4.48: PHP Code zur Übertragung des User-Agent Folgender Codeteil überprüft am Server den User-Agent: 1 2 3 4 5 6 7 8 if($_SERVER["HTTP_USER_AGENT"] != "ALFSA sync agent") { append_to_log("user agent", "wrong user agent dedected: ".$_SERVER[ ←"HTTP_USER_AGENT"], "critic"); die( ’You are not allowed to show this page directly!<br />’."\n". ’go to: <a href="http://www.bfkdo-tulln.at/alfsa/">ALFSA - ←webpage</a><br />’."\n". ’<br />’."\n". ’[=agerr]’); } Listing 4.49: PHP Code zur Prüfung des User-Agent 4.10.6 Sequenzdiagramm Dieses Sequenzdiagramm stellt den Ablauf der Client - Server Synchronisation dar. Brandstätter Andreas, Klaffl Christoph Seite 107von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Abbildung 4.9: Sequenzdiagramm 4.10.7 Fehlerbehandlung Um eine einwandfreie Funktion der Sychronisation sowie fehlerhafte Daten zu vermeiden müssen eine vielzahl an möglicher Fehler erkannt und entsprechend behandelt werden. Nachfolgend soll ein kleiner Teil der möglichen Fehler dargestellt und erläutert werden. Brandstätter Andreas, Klaffl Christoph Seite 108von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Falscher Verbindungsschlüssel Ein falscher Verbindungs Verbindungsschlüssel kann entweder vorliegen, wenn ein Client nicht berechtigt ist Daten beim Server einzutragen und daher dem Benutzer des Clients kein gültiger Verbindungsschlüssel bekannt ist, oder wenn der Verbindungsschlüssel falsch eingegeben wurde. In beiden Fällen verhindert der Server das Eintragen der Daten in die verteilte Datenbank. Diese funktioniert nach folgendem Prinzip. Der Client berechnet eine Checksumme der Daten: checksum-client = checksumme(Daten + Verbindungsschlüssel) Auch der Server berechnet die Checksumme der Daten: checksum-server = checksumme(Daten + Verbindungsschlüssel) Somit sind checksum-client und checksum-server gleich, und die Daten des Clients werden angenommen und eingetragen. Wurde jedoch am Client ein falscher Verbindungschlüssel eingetragen, so wird dies wie folgt erkannt. Der Client berechnet eine Checksumme der Daten: checksum-client = checksumme(Daten + falscher Verbindungsschlüssel) Auch der Server berechnet die Checksumme der Daten: checksum-server = checksumme(Daten + Verbindungsschlüssel) Somit sind checksum-client und checksum-server ungleich und der Server erkennt den Fehler und verweigert die weitere Verbindung. Datenmanipulation Werden durch einen Dritten während der Synchronisation Daten manipuliert, wird dies ebenfalls durch die Checksumme des Verbindungsschlüssels erkannt. Der Server erkennt diese Manipulation wie einen falschen Verbindungsschlüssel und verweigert ebenfalls die eingabe der Daten. Diese funktioniert nach folgendem Prinzip. Der Client berechnet eine Checksumme der Daten: checksum-client = checksumme(Daten + Verbindungsschlüssel) Ein Dritter ersetzt die Daten durch manipulierte Daten. Auch der Server berechnet die Checksumme der Daten: checksum-server = checksumme(manipulierte Daten + Verbindungsschlüssel) Somit sind checksum-client und checksum-server ungleich und der Server erkennt den Fehler und verweigert die weitere Verbindung. Serverausfall Fällt ein Server der verteilten Datenbank aus, so muss der Client dies erkennen und einen anderen Server für die Synchronisation wählen. Dies wird dadruch sichergestellt, dass der Client zuerst einen zufälligen Server auswählt. Danach wird im Arbeitsschritt 1 der Synchronisation eine Verbindung herzustellen. Schlägt dies nach einem Timeout fehl, wird ein anderer zufälliBrandstätter Andreas, Klaffl Christoph Seite 109von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG ger Server ausgewählt. Nach fünf erfolglosen Verbindungsversuchen wird davon ausgegangen, dass die Internetverbindung des Clients fehlerhaft ist und dem Benutzer wird eine Fehlermeldung ausgegeben. Verbindungsabbruch Bricht während der Synchronisation die Verbindung zum Server ab, wird dies durch einen Timeout erkannt. Es kann davon ausgegangen werden, dass es sich um einen kurzzeitigen Ausfall handelt, und die Verbindung innerhalb einiger Zeit wieder verfügbar ist. Daher wird versucht durch erneutes Abragen der Serverseite die Synchronisation weiterzuführen. Der Benutzer hat die möglichkeit dies abzubrechen und eine neue Synchronisation mit gegebenenfalls einem anderen Server zu starten. Abbruch durch Benutzer Bricht der Benutzer die Synchronisation ab, so wird dies bei einem Neustart erkannt. Es wird versucht die abgebrochene Synchronisation fortzusetzen. Ist dies aufgrund verschiedener Umstände (z.b. gleicher Server nicht erreichbar) nicht möglich, so wird eine neue Synchronisation gestartet und vollständig durchgeführt. 4.11 Webinterface 4.11.1 Übersicht Die Struktur des Webinterfaces wird durch folgende Dateiübersicht veranschaulicht: Brandstätter Andreas, Klaffl Christoph Seite 110von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Abbildung 4.10: Dateiübersicht Da die Dateiliste zu umfangreich ausfällt sind in der Abbildung 4.10 nicht alle Dateien angeführt, deshalb wird hier auf den Anhang verwiesen, der eine komplette Dateiliste mit der Beschreibung enthält, Kapitel 9.3 auf Seite 213. 4.11.2 index.php Jeglicher Zugriff auf einzelne Komponenten, wie zum Beispiel der Benutzerverwaltung, wird durch die index.php“ Datei geregelt. Über den GET Parameter page“ wird der index.php“ ” ” ” Datei mitgeteilt welche Seite gewünscht wird. Falls keine Seite angegeben wird, kommt man zu der Hauptseite, wo grundlegende Systeminformationen angezeigt werden. Weiters überBrandstätter Andreas, Klaffl Christoph Seite 111von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG prüft sie ob der Benutzer eingeloggt ist oder nicht, bei letzteres wird der Zugriff auf jegliche Seiten verweigert und die Login Maske angezeigt. Darüberhinaus ist sie für folgende Aufgaben zuständig: • Überprüfen ob die das PHP Skript von der Konsole oder über den Apache Web Server ausgeführt wird • Überprüfen ob ausreichende Berechtigungen für die Konfigurationsordner bestehen • Überprüfen der Konfigurationsdateien • Aufbauen und einstellen der lokalen Datenbankverbindung • Laden der benötigten Libraries 4.11.3 Template Engine Eine Template-Engine ist eine Software, die Templates (Vorlagen) mit Platzhaltern verarbeitet und mit Inhalt füllt. So ist es möglich die Daten und das Layout mit Design komplett zu trennen. Außerdem können Templates leicht ausgetauscht werden und somit das Layout komplett geändert werden ohne die Funktion, Sicherheit oder das Programm ändern zu müssen. Templates können außerdem von versierten Benutzern selbst verändert werden, um das Programm persönlichen Bedürfnissen anzupassen. Grundlegende Verwendung Die Verwendung der Template-Engine ist denkbar einfach. Mit dem Konstruktor wird das Template aus der Template-Datei geladen und erstellt. Die Funktion set“ wird verwendet ” um Werte zu setzen. Mit der Funktion display“ wird das Ergebnis ausgegeben. ” 1 2 3 4 $test = new Template("template_name"); $test->set("variable", "gesetzter wert"); // hier diverse Ersetzungen eintragen... $test->display(); Listing 4.50: Grundlegende Verwendung - PHP-Datei 1 Hello world 2 {variable} Listing 4.51: Grundlegende Verwendung - Template-Datei Dieses Beispiel ergibt folgendes Resultat: Brandstätter Andreas, Klaffl Christoph Seite 112von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG 1 Hello world 2 gesetzter wert Listing 4.52: Grundlegende Verwendung - HTML-Ergebnis 4.12 Tests Zur Gewährleistung der Funktion der Software wurden verschiedene Tests ausgeführt. Im Wesentlichen waren dies Funktionstests während der Entwicklung. Spezielle Tests wurden nur in Bezug auf kritische Programmteile ausgeführt. Im Allgemeinen soll gesagt werden, dass vor einem Einsatz der Software durch die Feuerwehren im Bezirk Tulln ein Probebetrieb in einigen Feuerwehren stattfinden wird. Imzugedessen wären erst Tests in realistischem Umfeld möglich. Die der Start des Probebetriebs wird jedoch erst nach Abschluss dieser Diplomarbeit durchgeführt. Daher wurden keine so umfangreichen Tests durchgeführt, wie es vor einem Produktiveinsatz von jeglicher Software erforderlich wäre. 4.12.1 Test des Webinterfaces Da das Webinterface den weniger komplexen Teil der Diplomarbeit darstellt, gestalteten sich die Tests desselben relativ einfach. Daten wurden in verschiednenen Browsern eingegeben, modifiziert und abgefragt. Dabei konnte festgestellt werden, dass die Darstellung in den verschiedenen Browsern trotz intensivster Bemühungen nicht komplett gleich ist. Trotzdem konnte einen einwandfreie Funktion in den häufigsten Browsern festgestellt werden. 4.12.2 Test der Server - Server Synchronisation Die Server - Server Synchronisation wurde großteils in der laufenden Entwicklung getestet. Es wurden laufen Daten durch die Clients auf verschiedenen Servern eingefügt. Die Server mussten daher diese Daten untereinander Synchronisieren. Diese Tests verliefen unter sehr realistischen Umständen, da die Internetverbindung teilweise durch den Proxy der Schule unterbrochen war, oder andere Störungen vorlagen. Weiters wurde auch die übernahme von verschiedenen Tabellenstrukturen ausgiebig getestet, denn die Struktur der Datenbank wurde oftmals modifiziert. Bei diesen Tests konnte eine gute und zuverlässige Funktion der Synchronisation nachgewiesen werden. Brandstätter Andreas, Klaffl Christoph Seite 113von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Langzeittest Da sich die wesentlichen Kernelemente der Sychronisation während der Entwicklung seit etwa Dezember nicht verändert haben, kann ein Langzeittest der Sychronisationskomponenten aufgewiesen werden. Denn die 3 Entwicklungsserver an den geografisch getrennten Orten waren seit beginn der Entwicklungsarbeiten durchgehend in Betrieb und führten stetig Syhcronisationen durch. Während dieser Zeit traten natürliche Ereignisse wie Internetausfälle, Stromausfälle o. ä. auf und sorgten für realistische Testbedingungen. Während der gesamten Zeitdauer konnte festgestellt werden, dass die Sychronisationsalgorithmen durchaus stabil und zuverlässig arbeiten. 4.12.3 Test der Client - Server Synchronisation Wesentliche Tests der Client - Server Synchronisation wurden durch Einfügen von Daten auf einem Client, sychronisieren, und Auswerten der Daten auf einem anderen Client durchgeführt. Dabei konnte bei Abschließenden Tests festgestellt werden, dass die Synchronisation zuverlässig funktioniert. Weiters wurden Verbindungsabbrüche, Serverausfälle und Netzwerkstörungen simuliert. Dabei konnte großteils ein erwartungsgemäßes Verhalten festgestellt werden. Weiters wurden am in der Server-Datenbank um Zuge der Entwicklung mehrmals die Datenbankstruktur verändert. Die Synchronisation dieser Änderung funktionierte ebenfalls wie erwartet. 4.12.4 Pre-Alpha Development-Test Im Zuge einer Atemschutzübung meherer Feuerwehren in Sieghartskirchen konnte das komplette System im Produktivbetrieb getestet werden. Hierbei wurde bei einem Atemschutzkompressor ein zur Verfügung gestelltes Notebook mit der Software platziert. Damit wurden die Füllungen erfasst und mehere Sychronisationsvorgänge über UMTS durchgeführt. Alle beteiligten Feuerwehren waren von der Funktion des Systems begeistert. Seitens des Entwicklunsteams konnte festgestellt werden, dass keine Fehler auftraten. 4.13 Verwendete Hilfsmittel 4.13.1 Verwendete Software Zur Entwicklung wurde folgende Software als Arbeitswerkzeuge verwendet: • Debian (http://www.debian.org/) Brandstätter Andreas, Klaffl Christoph Seite 114von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG • Ubuntu (http://www.ubuntu.com/) TM • Microsoft Windows (http://www.microsoft.com/windows/) • Eclipse (http://www.eclipse.org/) • Kile (http://kile.sourceforge.net/) • LATEX(PDFLaTeX) (http://www.pdftex.org/) • Firefox (http://www.mozilla-europe.org/de/products/firefox/) • Opera (http://de.opera.com/) • Konqueror (http://konqueror.kde.org/) • Iceweasel (http://www.geticeweasel.org/) • Internet Explorer (http://www.microsoft.com/windows/) • Corel Draw / Corel PhotoPaint (http://www.corel.com/) TM • Microsoft Visio (http://office.microsoft.com/) • Dia (http://www.gnome.org/projects/dia/) • OpenOffice (http://de.openoffice.org/) • Evolution (http://www.gnome.org/projects/evolution/) • Thunderbird (http://www.mozilla-europe.org/de/products/thunderbird/) • evince (http://www.gnome.org/projects/evince/) • KPDF (http://kpdf.kde.org/) • Pidgin (http://pidgin.im/) • Skype (http://www.skype.com/intl/de/) • medit (http://mooedit.sourceforge.net/) • gedit (http://www.gedit.org) • mcedit (http://www.gnome.org/mc/) • PuTTY (http://www.putty.org/) • MySQL GUI Tools (http://dev.mysql.com/downloads/gui-tools/5.0.html) • LeechFTP (http://www.leechftp.de/) • OpenSSH Client (http://www.openssh.com/) • MySQL Kommandozeilenclient (http://www.mysql.de/) Brandstätter Andreas, Klaffl Christoph Seite 115von 231 ALFSA KAPITEL 4. PLANUNG UND IMPLEMENTIERUNG Der Großteil dieser aufgelisteten Software ist OpenSource. Jene Programme, die nicht frei verfügbar (wie zum Beispiel Corel Draw) sind, wurden auf Computersystemen der Schule mit zugehöriger Schullizenz verwendet. 4.13.2 Allgemeine Quellen Neben den gesondert zitierten Quellen wurden folgende Nachschlagewerke und Referenzen zur Informationsbeschaffung verwendet: • MySQL Referenzhandbuch http://www.mysql.de/ • PHP Funktionsreferenz http://at.php.net/ • Freie Enzyklopedia http://de.wikipedia.org/ • Apache Referenz http://www.apache.org/ • Bibliothek mit vielen freien Handbüchern http://www.galileocomputing.de/ Brandstätter Andreas, Klaffl Christoph Seite 116von 231 ALFSA Teil III Wirtschaftlicher Teil Brandstätter Andreas, Klaffl Christoph Seite 117von 231 ALFSA KAPITEL 5. ALLGEMEINES Kapitel 5 Allgemeines Zur wirtschaftlichen Betrachtung der Diplomarbeit wird die Scheinfirma FRED Softwareentwicklung herangezogen. 5.1 Die Firma FRED FRED Softwareentwicklung sieht sich als dynamisches Unternehmen auf dem Sektor der Entwicklung von innovativer Software. Die Schwerpunkte liegen im Bereich vernetzer Softwarelösungen, Webapplikationen und Datenbankanwendungen. Die Firma FRED entwickelt kundenspezifische Programme und Software verschiedenster Branchen und Anwendungsgebiete. 5.2 Das Produkt ALFSA ALFSA stellt das Kern- und Referenzprodukt von FRED dar. Diese Softwarelösung stellt eine Verwaltungsumgebung für Altemluftflaschen und Geräte dar. Es bietet alle Funktionen von einfacher Verwaltung der Füllungen und Mängel über die Erfassung Prüfungen und Wartungen bis hin zu einem Update- und Nachrichtensystem. Das Programm ist in einer Netzwerkstruktur aufgebaut und stellt so für eine Vielzahl von Anwendern die gleichen Daten austauschbar zur Verfügung. Gleichzeitig ist durch diese Struktur eine maximale Sicherheit der Daten gegen Verlust und Manipulation gegeben. Die Software wird primär von Feuerwehren eingesetzt, ist aber daurchaus auch für Taucher oder ähnliche Anwender geeignet. Im Umgang mit Pressluftflaschen gelten strenge gesetzliche Vorschriften in Bezug auf Dokumentation und Kontrolle. ALFSA kann im Feuerwehrdienst langwierige und umständliche Auszeichnungen, die bisher in Papierform geführt wurden ablösen. Brandstätter Andreas, Klaffl Christoph Seite 118von 231 ALFSA KAPITEL 5. ALLGEMEINES Die Software wurde als Open Source - Projekt entwickelt und wird auch als solches verbreitet. Das heißt, dass jedermann das Programm unter Einhaltung der GPL (General Public License) frei beziehen, verwenden und weitergegeben darf. Ferner ist es jedem gestattet das Programm selbst zu modifizieren und weiter zu entwickeln. 5.3 General Public Liecense GPL Die General Public Liecense ist eine Lizenz, für freie Software. Sie gewährt jedermann im vier Freiheiten als Bestandteile der Lizenz: 1. Das Programm darf ohne jede Einschränkung für jeden Zweck genutzt werden. Kommer” zielle Nutzung ist hierbei ausdrücklich erlaubt. 2. Kopien des Programms dürfen kostenlos oder auch gegen Geld verteilt werden, wobei der Quellcode mitverteilt oder dem Empfänger des Programms auf Anfrage zum Selbstkostenpreis zur Verfügung gestellt werden muss. Dem Empfänger müssen dieselben Freiheiten gewährt werden – wer z. B. eine Kopie gegen Geld empfängt, hat weiterhin das Recht, diese dann kommerziell oder auch kostenlos zu verbreiten. Lizenzgebühren sind nicht erlaubt. (...) 3. Die Arbeitsweise eines Programms darf studiert und den eigenen Bedürfnissen angepasst werden. 4. Es dürfen auch die gemäß Freiheit 3 veränderten Versionen des Programms unter den Regeln von Freiheit 2 vertrieben werden, wobei dem Empfänger des Programms der Quellcode der veränderten Version verfügbar gemacht werden muss. (...)“ [6] Aus diesen Grundprinzipien der Lizenz wird deutlich, dass das Programm nicht verkauft wird. Vielmehr ist es üblich, dass Firmen, die Software entwickeln und nach der GPL veröffentlichen, kostenpflichtigen Support anbieten. Auch FRED Softwareentwicklung bietet Support von ALFSA an. Brandstätter Andreas, Klaffl Christoph Seite 119von 231 ALFSA KAPITEL 6. KOSTENRECHNUNG Kapitel 6 Kostenrechnung 6.1 Kalkulation Nachfolgend werden die Kosten der Firma FRED Softwareentwicklung kalkuliert. 6.1.1 Kalkulation der Fixkosten Die Fixkosten gliedern sich wie folgt: Kosten für Hardware: Anzahl 2 4 2 3 3 Bezeichnung Einzelpreis Notebook 17 Zoll 4.000 e Bildschirm TFT 30 Zoll 4.000 e Desktop-Computer 2.000 e Server IBM oder Sun (4HE) 10.000 e USV für Server 5kVA (5HE) 3.000 e Hardware-Gesamt Gesamtpreis 8.000 e 16.000 e 4.000 e 30.000 e 9.000 e 67.000 e Tabelle 6.1: Hardware Kosten für Miete und Diverses: Brandstätter Andreas, Klaffl Christoph Seite 120von 231 ALFSA Anzahl 1 1 3 1 KAPITEL 6. KOSTENRECHNUNG Bezeichnung Internetzugang für 1 Jahr div. Kommunikationskosten Server-Housing incl. Internet für 1 Jahr (10HE) Bürofläche für 1 Jahr (150qm) Miete und Diverses-Gesamt Einzelpreis Gesamtpreis 1.000 e 1.000 e 2.000 e 2.000 e 6.000 e 18.000 e 25.000 e 25.000 e 46.000 e Tabelle 6.2: Miete und Diverses Kosten für Arbeitszeit der Entwickler: Anzahl Bezeichnung Einzelpreis Gesamtpreis 550 Arbeitszeit pro Stunde 120 e 66.000 e Arbeitszeit-Gesamt 66.000 e Tabelle 6.3: Arbeitszeit Gesamten Fixkosten: Bezeichnung Hardware Miete und Diverses Arbeitszeit Fixkosten-Gesamt Kosten 67.000 e 46.000 e 66.000 e 179.000 e Tabelle 6.4: Fixkosten Die gesamten Fixkosten der Firma FRED belaufen sich somit auf 179.000 Euro. 6.1.2 Kalkulation der variablen Kosten Die Software wird gemäß der GPL im Internet veröffentlicht. Das Projekt wird so einer weltweiten Community zugänglich gemacht und zur Verfügung gestellt. Daraus ergibt sich andererseits, dass unabhängig von der Anzahl der verbreiteten Kopien keine Kosten für die Firma FRED auftreten. Brandstätter Andreas, Klaffl Christoph Seite 121von 231 ALFSA 6.2 KAPITEL 6. KOSTENRECHNUNG Support Da die Verbreitung der Software keine Finanzmittel zur Deckung der Kosten einbringen können, müssen durch die Firma FRED Softwareentwicklung andere Dienstleistungen erbracht werden, um die Fixkosten zu Decken. Daher wird von der Firma FRED Softwareentwicklung als Entwickler von ALFSA Support desselben Produktes angeboten. Dies hat für den Kunden den Vorteil, dass der Support durch diejenigen Techniker geleistet wird, die aktiv das Programm entwickeln. Daher können Aufgaben und Lösungen von Problemen in kürzester Zeit abgeschlossen werden. Der Support von FRED Softwareentwicklung kann flexibel in Tageseinheiten angefordert werden. Eine Tageseinheit umfasst 5 Arbeitsstunden um dem kundeneigenen EDV-Personal genügend Zeit zu geben eventuell parallele Aufgaben zu bearbeiten. 6.2.1 Kalkulation der variablen Kosten Die Support-Aufgaben verursachen außer der Arbeitszeit des Technikers keine weiteren Kosten. Daher beläuft sich eine Tageseinheit auf: 5 * 120 Euro = 600 Euro 6.2.2 Preiskalkulation Aufgrund des hohen Ausbildungsstandes und der Spezialisierung auf dem Sektor der Datenbankentwicklung der Mitarbeiter der Firma FRED Softwareentwicklung kann für eine Tageseinheit Softwaresupport ein Preis von 2100 Euro angesetzt werden. 6.2.3 Break-Even-Point Um die Fixkosten der Entwicklung von ALFSA zu decken müss eine bestimmte Mindestmenge an Support geleistet werden. Diese wird folgend berechnet: 179.000 Euro / ((2.100 – 600) Euro / Tageseinheit) = ∼ 120 Tageseinheiten Brandstätter Andreas, Klaffl Christoph Seite 122von 231 ALFSA KAPITEL 6. KOSTENRECHNUNG Abbildung 6.1: Break-Even-Point Das heißt, dass mehr als 120 Tageseinheiten Support geleistet werden müssen um einen Gewinn zu verzeichnen. Brandstätter Andreas, Klaffl Christoph Seite 123von 231 ALFSA KAPITEL 7. MARKETING Kapitel 7 Marketing 7.1 Marktanalyse ALFSA wurde primär für die Verwendung in Niederösterreich entwickelt. Der Einsatz ist jedoch nach Adaptierung in weiteren Gebieten möglich. Es werden folgender Zeitaufwand für eine Modifikation geschätzt: Österreich (je Bundesland) 150 Arbeitsstunden Deutschland (Gundaufwand) 200 Arbeitsstunden Deutschland (je Bundesland) 150 Arbeitsstunden anderes Land (Sprachportierung) 200 Arbeitsstunden anderes Land (Grundaufwand) 200 Arbeitsstunden anderes Land (je Verwaltungseinheit) 150 Arbeitsstunden Der Markt ist somit primär auf Niederösterreich beschränkt, jedoch nach entsprechender Portierung nahezu weltweit. 7.1.1 Primäre Zielgruppe Klare Zielgruppe des Produktes sind Feuerwehren. Es wird primär durch Feuerwehren bei der Verwaltung von Atemluftgeräten eingesetzt. Insbesondere ist das Produkt für große Feuerwehren mit einer größeren Anzahl an Atemschutzgeräten interressant, da bei diesen Feuerwehren ein hoher Verwaltungaufwand der Geräte anfällt. Auch für Feuerwehren mit überregionalen Füllstellen ist das Produkt bestens geeignet. Diese Feuerwehren sind zuständig für das Befüllen von Atemschutzgeräten mehrerer Feuerwehren im Umkreis. Daher fällt auch bei diesen Feuerweheren ein hoher Verwaltungaufwand an und das Produkt ALFSA bringt erhebliche Vorteile. Brandstätter Andreas, Klaffl Christoph Seite 124von 231 ALFSA KAPITEL 7. MARKETING In Österreich sind Feuerwehren je Bundesland organisiert. Daher stellen die einzelnen Landesfeuerwehrverbände die obersten Verwaltungebenen der Feuerwehren dar. Diese sind hinsichtlich einer landesweiten Verbreitung des Produktes ein erheblicher Teil der Zielgruppe. Analog dazu stellen Feuerwehr-Verwaltungseinheiten anderer Länder auch mögliche Kunden dar. 7.1.2 Sekundäre Zielgruppe Neben Feuerwehren können diese Software auch Taucher oder andere Personen, die Pressluftflaschen verwenden benützen. Diese stellen somit eine sekundäre Zielgruppe dar. Insbesondere seien hier Tauchvereine oder Tauchclubs genannt, die Anlagen zur Füllung von Pressluftflaschen betreiben. 7.2 Konkurrenzanalyse Im deutschsprachigen Raum bietet eine nicht namentlich genannte Firma ein Produkt zur Atemschutzgeräteverwaltung an. Das Produkt dieser auf einer Microsoft-Datenbank und bietet die Möglichkeit zur Verwaltung und Prüfung von Preßluftatmern, Masken und Lungenautomaten. Der Betrieb ist auf Einzelplätze beschränkt und die Arbeitsplätze können nicht wie bei ALFSA vernetzt werden. Somit erfüllt dieses Konkurenzprodukt nicht die Spezifikation des Auftraggebers von ALFSA. Ein weiterer Unterschied liegt darin, dass das Produkt dieser Firma nicht Open Source ist. 7.3 7.3.1 Marketing Der Firmenname Der Firmenname FRED wurde als Kunstname kreiert. Der Name lässt sich im deutsch- und englischsprachigen Raum leicht aussprechen. Ferner beinhaltet er keine Umlaute und Sonderzeichen, um im Falle einer möglichen internationalen Expansion von FRED weltweit verwendet werden zu können. Im Falle einer grafischen Darstellung des Firmennamens wird das R“ in ” 70% der Höhe der restlichen Buchstaben dargestellt. In rein textlichen Darstellungen entfällt dieses Gestaltungsmerkmal. Brandstätter Andreas, Klaffl Christoph Seite 125von 231 ALFSA 7.3.2 KAPITEL 7. MARKETING Das Firmenlogo Als Firmenlogo wird der stilisierte Kopf eines Frosches verwendet. Darunter befindet sich der Firmenname in grafischer Darstellung. Abbildung 7.1: Das Firmenlogo Das Logo soll die Dynamik und den Ideenreichtum der Firma FRED verdeutlichen. Das Logo ist in den Grundfarben Rot, Grün und Blau gehalten. Wobei die Farbe grün dominiert und die Frische und Lebendigkeit darstellt. 7.3.3 Das Produktlogo Das Logo des Produktes zeigt eine Pressluftflasche in gelber Farbe mit einer Schwarz-Weißen Flaschenschulter. Die Flasche gleicht dem typischen Aussehen der Pressluftflaschen, die in niederösterreichischen Feuerwehren eingesetzt werden. Auf der Flasche befindet sich der Striftzug ALFSA - atemluftfüllstellenapplikation“. ” Abbildung 7.2: Das Produktlogo Auf der folgenden Seite wird das Logo in größerer Auflösung dargestellt. Brandstätter Andreas, Klaffl Christoph Seite 126von 231 ALFSA 7.3.4 KAPITEL 7. MARKETING Logos - Corporate Design Zur Wahrung des Corporate Design darf kein Logo nicht-proportional verzerrt werden. Weiters darf es nicht beschnitten oder gedreht werden. Eine Veränderung der Farben (ausgenommen in Graustufen für den Druck) ist nicht erlaubt. Bei jeder Abbildung des Logos gemeinsam mit Text muss mindestens ein Zehntel der Diagonale des Logos als Rahmen um das Logo frei bleiben, kein Text darf in diesen Bereich geschrieben werden. Die Logos dürfen nie in zu kleiner Auflösung ( pixelig“) abgebildet oder gedruckt werden. ” 7.4 Werbung Für ALFSA wird nur in seriösen und fachlich relevanten Medien geworben. Grundsätzlich wird in den Werbebotschaften auf fachlich kompetente und seriöse Inhalte geachtet. Das kostenlose Produkt wird ebenso beworben wie der kostenplichtige Support desselben. Primär werden Werbauftritte auf Feuerwehrfachmessen, Feuerwehrzeitschriften und Feuerwehrwebseiten platziert. Zur Abdeckung der sekundären Zielgruppe werden Anzeigen in Taucherzeitschriften geschaltet. 7.4.1 Messen Interschutz Die Interschutz ist die größte Feuerwehrfachmesse im Deutschsprachigen Raum mit hohem internationalem Ansehen. Diese Messe findet alle 5 Jahre in Leipzig statt. Im Jahr 2005 waren 1.385 Aussteller vertreten und 140.000 Menschen besuchten die Messe [10]. Stetiges Wachstum, Aussteller und Innovatioen aus der ganzen Welt sowie ein großes und ” internationales Publikum - dies sind die Eigenschaften, die die INTERSCHUTZ auszeichnen. Bereits seit vielen Jahren ist sie deshalb die weltweite Leitmesse für Rettung, Brand- / Katastrophenschutz und Sicherheit.“ [10] Preis für Einen Messestand auf der Interschutz: 115 Euro/Quadratmeter (Eckstand, 2-seitig offen) Homepage der Messe: http://www.interschutz.de/ RETTER Die Retter findet alle zwei Jahre in Wels statt und ist die größte Feuerwehrfachmesse österreichs. Im Jahr 2006 besuchten rund 14.000 Besucher diese Fachmesse. Besucher aus Österreich und den benachbarten Ausland vor allem den neuen EU-Beitrittsländern ” nutzen die Retter alle zwei Jahre diese hochwertige Fachmesse zum Erfahrungsaustausch, zur Brandstätter Andreas, Klaffl Christoph Seite 127von 231 ALFSA KAPITEL 7. MARKETING Informationsgewinnung und –entscheidung, aber auch als Treffpunkt. Entscheidungsträger aller Einsatz- und Rettungsorganisationen, Sicherheitsfachkräfte, Unternehmer und Arbeitsmediziner informieren sich alle zwei Jahre in Wels über Neuheiten, branchenspezifische Lösungen und Services.“ [11]. Preis für Einen Messestand auf der Retter: 96 Euro/Quadratmeter (Eckstand, 2-seitig offen) Homepage der Messe: http://www.rettermesse.at/ 7.4.2 Feuer-Zeitschriften BRANDAUS Das Fachmagazin des Niederösterreichischen Landesfeuerwehrverbandes widmet sich Berichten um fachliche Neuerungen im Feuerwehrwesen, besonderen Einsätzen und verschiednen Reportagen aus dem Feuerwehrwesen. Das Magazin erscheint monatlich mit einer Auflage von 15.000 Exemplaren [12] und erreicht einen hohen Anteil größerer Feuerwehren in Niederösterreich. Homepage der Zeitschrift: http://www.brandaus.at/ Feuerwehr Objektiv Feuerwehr Objektiv ist ein unabhängige Feuerwehr-Fachmagazin mit 8 Exemplaren pro Jahr. Schwerpunkte des Magazins sind Fachreportagen und technische Berichte von Neuerungen im Feuerwehrwesen. Homepage der Zeitschrift: http://www.feuerwehrobjektiv.at/ Die österreichische Feuerwehr Die Zeitschrift Die österreichische Feuerwehr“ richtet sich an führende Mitglieder der öster” reichischen Feuerwehren. Das Magazin erscheint zwölf Mal jährlich mit einer Druckauflage von 5.000 Exemplaren.[13] 7.4.3 Feuer-Webseiten www.wax.at Die Webseite www.wax.at versteht sich als Portal für Feuerwehr und Rettungsdienst. Mit über 4300 registrierten Mitglieder ist es eines der größten österreichischen Foren für Feuerwehren Brandstätter Andreas, Klaffl Christoph Seite 128von 231 ALFSA KAPITEL 7. MARKETING und den Rettungsdienst. Private Plattform mit aktuellen Berichten aus den Blaulichtorganisationen zur Information ” der Mitarbeiter der Organisationen, der Bevölkerung und anderer Medien.“ [14] Homepage: http://www.wax.at/ www.fireworld.at Die Webseite www.fireworld.at stellt ebenfalls ein Portal für Feuerwehmitglieder mit Informationen, Diskussionen uvm. dar. Diese Webseiten dienen also Informations- und Kommunikationsplattform für Feuerweh” ren und deren Mitglieder. Vorwiegend zur Berichterstattung über das aktuelle Übungs- und Einsatzgeschehen, neue Innovationen im Feuerwehrwesen und zur Kommunikation der Feuerwehren und derer Mitglieder untereinander.“[15] Homepage: http://www.fireworld.at/ 7.4.4 Taucher-Zeitschriften Tauchen Tauchen erscheint monatlich und ist Europas größte Taucherzeitschrift. Es beinhaltet Berichte über Tauchziele, allgemeine Informationen über Neuerungen und Technische Innovationen. Homepage der Zeitschrift: http://www.tauchen.de/ Divemaster Divemaster ist ein Fachmagazin des Tauchsports. Es widmet sich im Wesentlichen der Tauchtechnik, Tauchmedizin und Tauchausbildung. Homepage der Zeitschrift: http://www.divemaster.de/ Unterwasser Das monatlich erscheindende Magazin Unterwasser widmet sich ebenfalls der Zielgruppe der Taucher. Es beinhaltet hauptsächlich Reiseinformation, Reportagen über Tauchorte und Tauchtechnik sowie Fotos vom Tauchen. Homepage der Zeitschrift: http://www.unterwasser.de/ Brandstätter Andreas, Klaffl Christoph Seite 129von 231 ALFSA 7.5 KAPITEL 7. MARKETING Promotionswebseite Zur allgemeinen Promotion und Präsentation das Produktes wurde eine Webseite im Internet eingerichtet. Diese Webseite bietet dem Kunden eine allgemeine Information über die Software, einige Screenshots und Kontaktadressen der Entwickler. Das Design der Seite wurde bewusst schlicht und professionell in den Farben des Logos gewählt um Kompetenz und Seriosität zu zeigen. Die Weseite ist erreichbar unter der Adresse: http://alfsa.bfkdo-tulln.at/ Brandstätter Andreas, Klaffl Christoph Seite 130von 231 ALFSA Teil IV Handbuch Brandstätter Andreas, Klaffl Christoph Seite 131von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Kapitel 8 Administratorhandbuch 8.1 Willkommen Willkommen bei ALFSA (Atemluftfüllstellenapplikation). Dieses Handbuch wird Sie mit der Einrichtung des ALFSA Systems vertraut machen und bietet ihnen eine schnelle Einführung in die Bedienung. 8.2 8.2.1 Voraussetzungen Hardware Die folgenden Vorausetzungen sind als Minimalwerte anzusehen. • 450 MHZ Prozessor • 256 MB Ram • 10/100 MBit Netzwerkkarte • 1 GB freier Festplattenspeicher Anmerkung: Der Ram- und Festplattenspeicherverbauch steigt porpertional mit der Datenbankgröße. Brandstätter Andreas, Klaffl Christoph Seite 132von 231 ALFSA 8.2.2 KAPITEL 8. ADMINISTRATORHANDBUCH Software • GNU/Linux Debian 4.0 Etch“ (Andere Linux Systeme sind auch möglich, für diese ” werden aber keine Supportleistungen erbracht) • Apache2 Web Server (Ältere Versionen möglich, jedoch werden keine Supportleistungen übernommen) • PHP5 (mit php-mysql Erweiterung) und PHP Modul für Apache2 • OpenSSH 4.3 oder höher (mit OpenSSL 0.9.7 oder höher) • MySQL 5.0.32 oder höher • NTP (ntpdate, ntpd) • CRON 8.3 8.3.1 Installation Programmdateien kopieren Der gesamte Verzeichnisbaum der Programmdateien von der mitgelieferten CD wird in den Webspace kopiert. Bei Debian Systemen ist das /var/www/“. ” Beachte: Auch die versteckten Dateien (.htaccess) müssen mitkopiert werden. 8.3.2 Rechte anpassen Folgende Verzeichnisse und darunterliegende Dateien brauchen Schreibrechte: 1. ./conf/ 2. ./images/tables Alle anderen Verzeichnisse kommen mit Leserechten aus. Desweiteren muss das Ausführungsrecht für die Datei ./sync.sh“ vergeben werden, damit die ” automatische Syncronisierung funktioniert. Brandstätter Andreas, Klaffl Christoph Seite 133von 231 ALFSA 8.3.3 KAPITEL 8. ADMINISTRATORHANDBUCH Einmalige Einstellungen In der Datei ./libs/defines.inc.php“ müssen 2 Werte für ihre Installation angepasst werden, ” die da wären: • HOME DIR: Hier müssen Sie das Heimverzeichnis des Benuters angeben, unter welchem der PHP Interpreter ausgeführt wird (bei einem Debian System ist das üblicherweise www-data“ mit dem Verzeichnis /var/www/“) ” ” • MASTER STRUCTURE DB SERVER: Hier wird derjenige Servername eingetragen, von welchem Datenbankstrukturänderungen akzeptiert werden (Beachte: Es wird ausdrücklichst empfohlen diese Option leer zu lassen, damit diese Funktion deaktiviert bleibt) 8.3.4 Erster ALFSA Server Falls es sich bei diesem Rechner um den ersten Server für die verteilte Datenbank handelt, muss zusätzlich folgender Schritt durchgeführt werden: Auf der mitgelieferten CD befindet sich eine SQL-Datei, welche die gesamte Datenbankstruktur enthält. Diese muss auf die gewählte Datenbank ausgeführt werden. 8.3.5 Konfiguration Wenn das Web-Interface zum ersten Mal durch einen Browser aufgerufen wird, meldet sich die Konfigurationsseite auf welcher alle nötigen Einstellungen eingetragen werden: Brandstätter Andreas, Klaffl Christoph Seite 134von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Abbildung 8.1: ALFSA Erste Synchronisierung Nach Ausfüllen der verlangten Einstellungen kann die erste Syncronisierung gestartet werden. Dadurch wird die Datenbankstruktur automatisch erstellt und alle verfügbaren Datensätze werden in den lokalen Datenbankserver eingefügt. Nach erfolgreicher Syncronisierung erfolgt eine Weiterleitung zur Anmeldung und das System ist für die Nutzung bereit. 8.3.6 Fehlerbehandlung Falls folgende Fehlermeldung beim Aufrufen der Server Oberfläche erscheint, wurden die Dateirechte nicht richtig gesetzt (siehe Kapitel 8.3.2): Abbildung 8.2: ALFSA Keine Berechtigung Brandstätter Andreas, Klaffl Christoph Seite 135von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Falls der Server im ALFSA System nicht registriert ist, funktioniert die erste Syncronisation nicht: Abbildung 8.3: ALFSA Nicht registriert Daher muss dieser bei einem laufenden ALFSA Server registriert werden (siehe Kapitel 8.4.7 auf Seite 151) 8.4 Bedienung Um Administrative Tätigkeiten auszuführen, muss zunächst eine Anmeldung am gewünschten ALFSA Server durchgeführt werden: Abbildung 8.4: ALFSA Hauptseite Brandstätter Andreas, Klaffl Christoph Seite 136von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Nach ordnungsgemäßer Anmeldung folgt eine Weiterleitung auf die Hauptseite, welche grundlegende Server Informationen anzeigt. Somit ist feststellbar ob der Speicher knapp wird oder andere Ressourcen nicht ausreichen bzw. nicht verfügbar sind: Abbildung 8.5: ALFSA Hauptseite Die einzelnen Verwaltungskomponenten können über die linke Menüleiste erreicht werden. Sie sind in 3 Hauptgruppen eingeteilt: • ALFSA-Verwaltung – Benutzerverwaltung – Feuerwehrverwaltung – Fuellstellenverwaltung – Clientverwaltung – Kompressorverwaltung • Server-Verwaltung Brandstätter Andreas, Klaffl Christoph Seite 137von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH – Serverliste – Serververwaltung – Konfiguration • Anderes – Synchronisieren – Logs – Tabellenansicht Diese werden im Folgenden erläutert. Anmerkung: Die Hauptgruppen sind einklappbar 8.4.1 Benutzerverwaltung Abbildung 8.6: ALFSA Benutzerverwaltung Brandstätter Andreas, Klaffl Christoph Seite 138von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH In der linken Spalte der Benutzerliste findet man verschiedene Filter, über die die Anzahl der Benutzer, die in der Liste angeziegt werden, limitiert werden kann: • Bezirk auswählen: Es werden nur Benutzer aus gewähltem Bezirk angezeigt • Abschnitt auswählen: Es werden nur Benutzer aus gewähltem Abschnitt angezeigt • Feuerwehr auswählen: Es werden nur Benutzer aus gewählter Feuerwehr angezeigt • aktive Benutzer: Es werden nur Benutzer angezeigt, die aktiv sind • gelöschte Benutzer: Es werden nur Benutzer angezeigt, die nicht mehr Mitglieder der Feuerwehr sind • alle Benutzer: Es werden alle Benutzer angezeigt, unabhängig davon, ob Sie noch im Dienst sind oder nicht Durch Anpassung der Filter wird die Seite mit den neuen Optionen automatisch neu geladen. Über 2 Buttons über und unter der Liste, die die Benutzer auflistet, können die nächsten 10 bzw. die vorigen 10 Benutzer abgerufen werden. (Diese werden natürlich nur eingeblendet, falls die Anzahl der verfügbaren Benutzer 10 übersteigt) In der rechten Spalte der Benutzerliste können bestimmte Aktionen ausgeführt werden, die sich selbst erklären: • Benutzer hinzufügen • Benutzer ändern • Benutzer Rechte ändern • Benutzer löschen • Benutzer anzeigen • Standard Rechte ändern Es werden aber nicht immer alle Aktionen angezeigt, sondern nur jene die verwendet werden können. Wurde zum Beispiel kein Benutzer aus der Liste ausgewählt und ist keine Feuerwehr ausgewählt wird nur der Menüpunkt Standard Rechte ändern“. Falls ein Benutzer ausgewählt ” wurde, werden die Menüpunkte zum Anzeigen, Löschen und Ändern angezeigt. In der Abbildung 8.6 werden die Details eines Benutzer geändert. Die einzelnen Einträge sind wiederum selbst erklärend und es besteht daher kein Bedarf diese zu erklären. Brandstätter Andreas, Klaffl Christoph Seite 139von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Abbildung 8.7: ALFSA Benutzerverwaltung2 In der Abbildung 8.7 werden die Rechte für einen Benutzer geändert. Diese sind wiederum selbsterklärend. Die Standardrechte, die bei den einzelnen Benutzern standardmäßig eingestellt, können über den Menüpunkt Benutzer Standard Rechte ändern“ eingestellt werden. ” Weiters ist aus der Abbildung 8.7 zu entnehmen, dass es Berechtigungsbereiche gibt (die TABs am unteren Rand): • global: Diese Rechte sind für alle Füllstellen gültig • local: Diese Rechte sind nur für die eigene Füllstelle gültig • server: Diese Berechtigungen sind beim Client-Terminal gültig Brandstätter Andreas, Klaffl Christoph Seite 140von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Abbildung 8.8: ALFSA Benutzerverwaltung3 In der Abbildung 8.8 wird ein neuer Benutzer angelegt. Dazu muss zunächst eine Feuerwehr im Filter ausgewählt werden, danach erscheint der Menüknop Benutzer hinzufügen“, mit dessen ” Betätigung wird dann das Formular für den neuen Benutzer geladen. Durch das Ausfüllen und Abschicken des Formulars wird der Benutzer erstellt. Brandstätter Andreas, Klaffl Christoph Seite 141von 231 ALFSA 8.4.2 KAPITEL 8. ADMINISTRATORHANDBUCH Feuerwehrverwaltung Abbildung 8.9: ALFSA Feuerwehrverwaltung In der linken Spalte von der Feuerwehrliste kann die Feuerwehr über die Angabe von Bezirk und Abschnitt ausgewählt werden. Weiters besteht die Möglichkeit die Feuerwehrnummer direkt einzugeben. Durch Anpassung der Filter wird die Seite mit den neuen Optionen automatisch neu geladen. Es stehen folgende Aktionen zur Verfügung, die sich in Abhängigkeit der Angaben aktivieren lassen oder nicht: • Feuerwehr hinzufügen • Feuerwehr ändern • Feuerwehr anzeigen Brandstätter Andreas, Klaffl Christoph Seite 142von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Falls eine Feuerwehr hinzugefügt werden soll, müssen Bezirk und Abschnitt ausgewählt werden. Abbildung 8.10: ALFSA Feuerwehrverwaltung2 Abbildung 8.10 zeigt das Hinzufügen einer Feuerwehr. Brandstätter Andreas, Klaffl Christoph Seite 143von 231 ALFSA 8.4.3 KAPITEL 8. ADMINISTRATORHANDBUCH Fuellstellenverwaltung Abbildung 8.11: ALFSA Fuellstellenverwaltung Die Bedienung der Fuellstellenverwaltung ist mit der Feuerwehrverwaltung ident und kann deshalb anhand dieser erlernt werden. Brandstätter Andreas, Klaffl Christoph Seite 144von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Abbildung 8.12: ALFSA Fuellstellenverwaltung2 Abbildung 8.11 und 8.12 illustrieren jeweils das Anzeigen und Bearbeiten von Fuellstellendetails. Brandstätter Andreas, Klaffl Christoph Seite 145von 231 ALFSA 8.4.4 KAPITEL 8. ADMINISTRATORHANDBUCH Clientverwaltung Abbildung 8.13: ALFSA Clientverwaltung In der linken Spalte der Clientliste findet man verschiedene Filter, über die die Anzahl der Clients, die in der Liste angezeigt werden, limitiert werden kann: • Bezirk auswählen: Es werden nur Clients aus gewähltem Bezirk angezeigt • Abschnitt auswählen: Es werden nur Clients aus gewähltem Abschnitt angezeigt • Füllstelle auswählen: Es werden nur Clients aus gewählter Füllstelle angezeigt Durch Anpassung der Filter wird die Seite mit den neuen Optionen automatisch neu geladen. Über 2 Buttons über und unter der Liste, die die Clients auflistet, können die nächsten 10 bzw. die vorigen 10 Clients abgerufen werden. (Diese werden natürlich nur eingeblendet, falls die Anzahl der verfügbaren Clients 10 übersteigt) Brandstätter Andreas, Klaffl Christoph Seite 146von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH In der rechten Spalte der Benutzerliste können bestimmte Aktionen ausgeführt werden, die sich selbst erklären: • Client hinzufügen • Client ändern • Client löschen • Client anzeigen Es werden aber nicht immer alle Aktionen angezeigt, sondern nur jene die verwendet werden können. Wurde zum Beispiel kein Client aus der Liste ausgewählt und ist keine Füllstelle ausgewählt wird kein Menüpunkt angezeigt. Falls ein Client ausgewählt wurde, werden die Menüpunkte zum Anzeigen, Löschen und Ändern angezeigt. Abbildung 8.13 und 8.14 zeigen jeweils die Details eines Clients und das Hinzufügen eine Clients. Abbildung 8.14: ALFSA Clientverwaltung2 Brandstätter Andreas, Klaffl Christoph Seite 147von 231 ALFSA 8.4.5 KAPITEL 8. ADMINISTRATORHANDBUCH Kompressorverwaltung Abbildung 8.15: ALFSA Kompressorverwaltung Die Bedienung der Kompressorverwaltung ist mit der Benutzerverwaltung ident und kann deshalb anhand dieser erlernt werden. Brandstätter Andreas, Klaffl Christoph Seite 148von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Abbildung 8.16: ALFSA Kompressorverwaltung2 Abbildung 8.15 und 8.16 illustrieren jeweils das Anzeigen Kompressordetails und das Hinzufügen eines Kompressors. Brandstätter Andreas, Klaffl Christoph Seite 149von 231 ALFSA 8.4.6 KAPITEL 8. ADMINISTRATORHANDBUCH Serverliste Abbildung 8.17: ALFSA Serverliste Die Serverliste zeigt im wesentlichen alle Server mit ihren Eigenschaften an (bis auf Backup Server, Abbildung 8.17). Weiters wird getestet ob die Server erreichbar sind und ob auf die entfernten Datenbank zugegriffen werden kann. Brandstätter Andreas, Klaffl Christoph Seite 150von 231 ALFSA 8.4.7 KAPITEL 8. ADMINISTRATORHANDBUCH Serververwaltung Abbildung 8.18: ALFSA Serververwaltung In der Liste sind alle Server mit ihren Namen aufgeführt und können ausgewählt werden. Folgende Aktionen sind möglich: • Server hinzufügen • Server ändern • Server löschen • Server anzeigen Anhand der Abbildung 8.19 ist eine Aktualisierung der Serverdetails zu sehen. Hier ist anzumerken, dass ein Server mit der Priorität 0 einen Backup server darstellt. Für diesen sind nur Servernamen und RSA Key auszufüllen. Der Backupserver wird von der Client-Server Brandstätter Andreas, Klaffl Christoph Seite 151von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Synchronisation und der Server-Server Synchronisation ausgeschlossen. Er führt nur Syncronisationen mit anderen Servern durch und hält deshalb stets ein Backup aller Daten. Keiner der anderen Server ist der Zugriff auf einen Backupserver erlaubt, dadurch ist sichergestellt, dass bei einer Übernahme eines anderen Server im ALFSA System durch einen Angreifer, dieser keinen Zugriff auf den Backupserver und die Backupdaten erhält. Abbildung 8.19: ALFSA Serververwaltung2 Brandstätter Andreas, Klaffl Christoph Seite 152von 231 ALFSA 8.4.8 KAPITEL 8. ADMINISTRATORHANDBUCH Konfiguration Abbildung 8.20: ALFSA Konfiguration Folgende Einstellungen werden in der Konfiguration getätigt: • Datenbank Host: Hostname oder IP Adresse des Datenbankservers • Datenbank Benutzer: Benutzername für die Datenbank • Datenbank Passwort: Passwort für die Datenbank • Datenbankname: Name der Datenbank • Kommunikationsmethode: Gibt an, ob die Verbindung zu anderen Server über den Hostnamen oder der IP Adresse erfolgen soll • Synchronisierungsintervall: Zeitintervall, in dem die Syncronisierung ausgeführt wird • Maximale Ausführungszeit der Synchronisierung: Gibt die maximale Zeit an, die eine Syncronisierung beanspruchen darf Brandstätter Andreas, Klaffl Christoph Seite 153von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH • Portrange für das Tunneln: Gibt einen Port bereich an, welcher für den Porttunnel verwendet werden darf • Sync Log Level: Gibt an, wie detailiert die Logdateien ausfallen 8.4.9 Synchronisieren Abbildung 8.21: ALFSA Synchronisieren Abbildung 8.21 zeigt die Liste mit den Namen aller aktiven Server an (nicht die Backupserver). Um eine manuelle Synchronisation zu starten, wird ein Server aus der Liste ausgewählt und der Button Synchronisieren“ betätigt. Dadurch wird der Synchronisationsvorgang gestartet ” und kann, wie in Abbildung 8.22 zu sehen ist, mitverfolgt werden. Brandstätter Andreas, Klaffl Christoph Seite 154von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH Abbildung 8.22: ALFSA Synchronisieren2 Brandstätter Andreas, Klaffl Christoph Seite 155von 231 ALFSA 8.4.10 KAPITEL 8. ADMINISTRATORHANDBUCH LOGViewer Abbildung 8.23: ALFSA LOGViewer Mittels des Log Viewers wird die Betrachtung der Log Meldungen vereinfacht. Sie werden nach Datum sortiert und können nach diesem auch eingeklappt werden um für eine bessere Übersicht zu sorgen. Es können 3 Log Dateien ausgewählt werden: • sync-info.log: Beinhaltet Informationen über die Synchronisationsvorgänge • sync-error.log: Beinhaltet Informationen über Fehler bei dem Synchronisationsvorgängen • error.log: Beinhaltet Informationen über Fehler, die eventuell bei der Benützung der Administrationsoberfläche auftreten Die weiteren Optionen sind: Brandstätter Andreas, Klaffl Christoph Seite 156von 231 ALFSA KAPITEL 8. ADMINISTRATORHANDBUCH 1. Alles laden: Bei diesem Modus, müssen die Log Meldungen für ein anderes Datum nicht nachgeladen werden, da sie bereits im vorhinein geladen wurden 2. Nachladen: Bei diesem Modus, werden durch drücken der Datumsüberschriften die betreffenden Log Meldungen nachgeladen 3. Zeilenanzahl: Gib die Anzahl der Log Meldungen an, die geladen werden sollen Durch drücken auf eine der Log Dateien, wird sie im Hauptfenster geladen. Siehe Abbildung 8.24. Abbildung 8.24: ALFSA LOGViewer2 Brandstätter Andreas, Klaffl Christoph Seite 157von 231 ALFSA 8.4.11 KAPITEL 8. ADMINISTRATORHANDBUCH Tabellenansicht Abbildung 8.25: ALFSA Tabellenansicht Die Tabellenansicht stellt alle Tabellen der Datenbank grafisch mit ihren Beziehungen da. Brandstätter Andreas, Klaffl Christoph Seite 158von 231 ALFSA 8.4.12 KAPITEL 8. ADMINISTRATORHANDBUCH Fehlerhafte Eingabe Eingabe.png Abbildung 8.26: ALFSA Fehlerhafte Eingabe Bei allen Formulardaten der Administrationsoberfläche wird eine serverseitige Überprüfung auf Gültigkeit der eingegebenen Daten durchgeführt. In der Abbildung 8.26 kann man eine resultierende Fehlermedlung mit den Details betrachten. Brandstätter Andreas, Klaffl Christoph Seite 159von 231 ALFSA Teil V Anhang Brandstätter Andreas, Klaffl Christoph Seite 160von 231 ALFSA KAPITEL 9. ANHANG Kapitel 9 Anhang 9.1 9.1.1 Funktionen und Klassen Teil Client-Server-Sync am Client function add new sync vorgang 1 int function add_new_sync_vorgang(\$server, [\$time = 0]) in Datei /client-www/sync/sync functions.inc.php (Zeile 69) Returnwert: int Zeit zur der die Synchronisierung initiiert wurde. Funktionsparameter: • string $server: Server, zu dem die Verbindung hergestellt werden soll. • int $time: Zeit, zu der die Synchronisierung gestartet wird. Speichert einen neuen Synchronisationsvorgang in der Datenbank und in der Datei. function close sync vorgang 1 void function close_sync_vorgang(\$time_start, [\$time_end = 0]) in Datei /client-www/sync/sync functions.inc.php (Zeile 139) Funktionsparameter: • int $time start: Zeit, zu der die Synchronisierung gestartet wurde. • int $time end: Zeit, zu der die Synchronisierung beendet wurde. Beendet den Synchronisationsvorgang in der Datenbank und loescht die Datei. function error 1 void function error(\$line, \$file, \$string, [\$error = ""], \$sql) in Datei /client-www/sync/sync functions.inc.php (Zeile 493) Funktionsparameter: • int $line: Zeile, in der die Fehlermeldung ausgloest wurde. • int $file: Datei, in der die Fehlermeldung ausgloest wurde. • string $string: Beschreibung des Fehlers. Brandstätter Andreas, Klaffl Christoph Seite 161von 231 ALFSA KAPITEL 9. ANHANG • string $error: Fehlermeldung, die von MySQL zurueckgegeben wird. • string $sql: MySQL-String, der den Fehler verursachte. Gibt eine formatierte MySQL-Fehlermeldung aus. function get db summary 1 string function get_db_summary() in Datei /client-www/sync/sync functions.inc.php (Zeile 266) Returnwert: string Datenbankzusammenfassung. Liefert eine Zusammenfassung der Tabellenstrukturen der Datenbank. function get rand server 1 array function get_rand_server() in Datei /client-www/sync/sync functions.inc.php (Zeile 238) Returnwert: array Server aus der Datenbank. Liefert einen zufälligen Server aus der Datenbank. function get server 1 array function get_server(\$name) in Datei /client-www/sync/sync functions.inc.php (Zeile 216) Returnwert: array Server aus der Datenbank. Funktionsparameter: • string $name: Servername des zu selektierenden Servers. Liefert einen Server aus der Datenbank. function get servers 1 array function get_servers() in Datei /client-www/sync/sync functions.inc.php (Zeile 190) Returnwert: array Alle Server aus der Datenbank. Liefert eine Auflistung aller Server aus der Datenbank inklusive Hardcode-Server. function get server page 1 array function get_server_page([\$post = array()], \$phase, [\$server ←= "euklid-server"]) in Datei /client-www/sync/sync functions.inc.php (Zeile 292) Returnwert: array Inhalt der Seite und eventuell aufgetretene Fehler. Funktionsparameter: • array $post: Daten, die per POST uebergeben werden. • int $phase: Arbeitsschritt, der aktuell abgearbeitet wird. • string $server: Servername, auf den die Anfrage ausgefuehrt wird. Brandstätter Andreas, Klaffl Christoph Seite 162von 231 ALFSA KAPITEL 9. ANHANG Fragt eine Server-Seite ueber CURL ab. function get tables 1 array function get_tables() in Datei /client-www/sync/sync functions.inc.php (Zeile 161) Returnwert: array Tabellen der Datenbank mit Level. Liefert eine Auflistung aller Tabellen der Datenbank. Liest zusaetzlich das Level aus der Tabelle sync aus. function get this sync vorgang 1 array function get_this_sync_vorgang() in Datei /client-www/sync/sync functions.inc.php (Zeile 97) Returnwert: array Daten des Synchronisationsvorganges aus der Datei. Liest den aktuellen Synchronisationsvorgang aus der Datei aus. function lock 1 void function lock() in Datei /client-www/sync/sync functions.inc.php (Zeile 378) Sperrt die Synchronisierung, damit nur ein Vorgang gleichzeitig ausgefuehrt wird. function locked 1 int function locked() in Datei /client-www/sync/sync functions.inc.php (Zeile 408) Returnwert: int Zeit, wann die Synchronisierung gesperrt wurde. Prueft, ob die Synchronisierung gesperrt ist. function my mysql exceute 1 void function my_mysql_exceute(\$dl) in Datei /client-www/sync/sync functions.inc.php (Zeile 512) Funktionsparameter: • string $dl: SQL-Anweisungen vom Server. Fuehrt mehrere SQL-Anweisungen vom Server in der Datenbank aus. function print reload 1 void function print_reload([\$sec = 2]) in Datei /client-www/sync/sync functions.inc.php (Zeile 535) Funktionsparameter: • string $sec: Zeit bis zum Neuladen in Sekunden. Brandstätter Andreas, Klaffl Christoph Seite 163von 231 ALFSA KAPITEL 9. ANHANG Gibt den die JavaScript-Befehle fuer ein Neuladen der Seite aus. function read end date 1 int function read_end_date() in Datei /client-www/sync/sync functions.inc.php (Zeile 475) Returnwert: int Datum der letzten vollstaendigen Synchronisation. Liest das Datum der letzten vollstaendigen Synchronisation aus. function read phase 1 int function read_phase() in Datei /client-www/sync/sync functions.inc.php (Zeile 440) Returnwert: int Aktueller Arbeitsschritt. Liest den aktuellen Arbeitsschritt aus. function unlock 1 void function unlock() in Datei /client-www/sync/sync functions.inc.php (Zeile 394) Entsperrt die Synchronisierung. function write end date 1 void function write_end_date([\$time = -1]) in Datei /client-www/sync/sync functions.inc.php (Zeile 454) Funktionsparameter: • int $time: Datum der letzten vollstaendigen Synchronisation. Speichert das Datum der letzten vollstaendigen Synchronisation. function write phase 1 void function write_phase([\$phase = 0]) in Datei /client-www/sync/sync functions.inc.php (Zeile 422) Funktionsparameter: • int $phase: Aktueller Arbeitsschritt. Speichert den aktuellen Arbeitsschritt. 9.1.2 Teil Server function add client 1 void function add_client(\$fuellstelle, \$laufnummer, \$name, \$os, \ ←$verbindungskennung) Brandstätter Andreas, Klaffl Christoph Seite 164von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/client.inc.php (Zeile 123) Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer • string $name: Name • string $os: OS Bezeichnung • string $verbindungskennung: Verbindungskennung/Verbindungsschlüssel Fügt einen neuen Client in die Datenbank ein function change client 1 void function change_client(\$fuellstelle, \$laufnummer, \$name, \$os ←, \$verbindungskennung) in Datei /server-www/libs/client.inc.php (Zeile 75) Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer • string $name: Neuer Name • string $os: Neue OS Bezeichnung • string $verbindungskennung: Neue Verbindungskennung/Verbindungsschlüssel Ändert die Eigenschaften/Details eines Clients function get clients 1 array function get_clients([\$bezirk = 0], [\$abschnitt = 0], [\ ←$fuellstelle = 0], [\$limit_start = 0], [\$limit_count = 0]) in Datei /server-www/libs/client.inc.php (Zeile 19) Returnwert: array Clients Funktionsparameter: • integer $bezirk: Berzirksnummer • integer $abschnitt: Abschnittsnummer • integer $fuellstelle: Füllstellennummer • integer $limit start: Datensätze, ab denen selektiert wird • integer $limit count: Gibt an, wie viele Clients zurückgeliefert werden sollen Liefert Clients aus der Datenbank function get client details 1 array function get_client_details(\$fuellstelle, \$laufnummer) in Datei /server-www/libs/client.inc.php (Zeile 57) Returnwert: array Clientdetails Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer Brandstätter Andreas, Klaffl Christoph Seite 165von 231 ALFSA KAPITEL 9. ANHANG Liefert Details über einen Client aus der Datenbank function get next laufnummer 1 integer function get_next_laufnummer(\$fuellstelle) in Datei /server-www/libs/client.inc.php (Zeile 170) Returnwert: integer Nächste freie Laufnummer Funktionsparameter: • integer $fuellstelle: Füllstellennummer Liefert die nächste freie Laufnummer für einen neuen Client in einer Füllstelle function add compressor 1 void function add_compressor(\$fuellstelle, \$laufnummer, \ ←$funkrufname, \$hersteller, \$seriennummer, 2 \$fuellanschl_200, \$fuellanschl_300, \$fuellanschl_nieder, \ ←$enddruck, \$hochdruck_eingang, 3 \$hochdruck_ausgang, \$wartungsintervall, \$pruefintervall, \ ←$quickfill, \$mobil) in Datei /server-www/libs/compressor.inc.php (Zeile 157) Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer • string $funkrufname: Funkrufname • string $hersteller: Hersteller • string $seriennummer: Seriennummer • integer $fuellanschl 200: Anzahl der 200bar Füllanschlüsse • integer $fuellanschl 300: Anzahl der 300bar Füllanschlüsse • integer $fuellanschl nieder: Anzahl der Niederdruck Füllanschlüsse • integer $enddruck: Enddruck • integer $hochdruck eingang: Anzahl der Hochdruckeingänge • integer $hochdruck ausgang: Anzahl der Hochdruckausgänge • integer $wartungsintervall: Wartungsintervall • integer $pruefintervall: Prüfintervall • integer $quickfill: Quikfillausgänge • string/enum $mobil: Mobil oder stationär Fügt einen neuen Kompressor in die Datenbank ein function change compressor 1 void function change_compressor(\$fuellstelle, \$laufnummer, \ ←$funkrufname, \$hersteller, \$seriennummer, 2 \$fuellanschl_200, \$fuellanschl_300, \$fuellanschl_nieder, \ ←$enddruck, \$hochdruck_eingang, 3 \$hochdruck_ausgang, \$wartungsintervall, \$pruefintervall, \ ←$quickfill, \$mobil) Brandstätter Andreas, Klaffl Christoph Seite 166von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/compressor.inc.php (Zeile 111) Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer • string $funkrufname: Neuer Funkrufname • string $hersteller: Neuer Hersteller • string $seriennummer: Neue Seriennummer • integer $fuellanschl 200: Anzahl der 200bar Füllanschlüsse • integer $fuellanschl 300: Anzahl der 300bar Füllanschlüsse • integer $fuellanschl nieder: Anzahl der Niederdruck Füllanschlüsse • integer $enddruck: Enddruck • integer $hochdruck eingang: Anzahl der Hochdruckeingänge • integer $hochdruck ausgang: Anzahl der Hochdruckausgänge • integer $wartungsintervall: Wartungsintervall • integer $pruefintervall: Prüfintervall • integer $quickfill: Quikfillausgänge • string/enum $mobil: Mobil oder stationär Ändert die Eigenschaften/Details eines Kompressors function del compressor 1 boolean function del_compressor(\$fuellstelle, \$laufnummer) in Datei /server-www/libs/compressor.inc.php (Zeile 195) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer Löscht einen Kompressor aus der Datenbank function get compressors 1 array function get_compressors([\$bezirk = 0], [\$abschnitt = 0], [\ ←$fuellstelle = 0], [\$limit_start = 0], [\$limit_count = 2 0], [\$show_deleted = 2]) in Datei /server-www/libs/compressor.inc.php (Zeile 20) Returnwert: array Kompressoren Funktionsparameter: • integer $bezirk: Berzirksnummer • integer $abschnitt: Abschnittsnummer • integer $fuellstelle: Füllstellennummer • integer $limit start: Datensätze, ab denen selektiert wird • integer $limit count: Gibt an, wie viele Kompressoren zurückgeliefert werden sollen • integer $show deleted: Gibt an, welche Kompressoren zurückgegeben werden (0 = nur aktive, 1 = nur gelöschte/abgeschlossene, 2 = aktive und gelöschte/abgeschlossene) Brandstätter Andreas, Klaffl Christoph Seite 167von 231 ALFSA KAPITEL 9. ANHANG Liefert Kompressoren aus der Datenbank function get compressor details 1 array function get_compressor_details(\$fuellstelle, \$laufnummer) in Datei /server-www/libs/compressor.inc.php (Zeile 83) Returnwert: array Kompressordetails Funktionsparameter: • integer $fuellstelle: Füllstellennummer • integer $laufnummer: Laufnummer Liefert Details über einen Kompressor aus der Datenbank function get next compressor laufnummer 1 integer function get_next_compressor_laufnummer(\$fuellstelle) in Datei /server-www/libs/compressor.inc.php (Zeile 219) Returnwert: integer Nächste freie Laufnummer Funktionsparameter: • integer $fuellstelle: Füllstellennummer Liefert die nächste freie Laufnummer für einen neuen Kompressor in einer Füllstelle function del cronjob 1 void function del_cronjob(\$command, [\$comment = "0"]) in Datei /server-www/libs/cron.inc.php (Zeile 110) Funktionsparameter: • string $command: Befehl, über den der Cronjob gesucht wird • string $comment: Kommentar, über den der Cronjob gesucht wird Löscht einen Cronjob function new cronjob 1 void function new_cronjob(\$command, [\$comment = " ←auto_generated_by_ALFSA"], [\$min = 2 "*"], [\$std = "*"], [\$day = "*"], [\$month = "*"], [\$wd = "*"]) in Datei /server-www/libs/cron.inc.php (Zeile 70) Funktionsparameter: • string $command: Befehl, der von Cron ausgeführt werden soll • string $comment: Kommentar, der zum Cronjob hinzugefügt wird • string $min: Minuten • string $std: Stunden • string $day: Tage • string $month: Monate • string $wd: Wochentage Brandstätter Andreas, Klaffl Christoph Seite 168von 231 ALFSA KAPITEL 9. ANHANG Generiert einen neuen Cronjob und registriert ihn function read crontab 1 array/string function read_crontab([\$comment = ""]) in Datei /server-www/libs/cron.inc.php (Zeile 15) Returnwert: array/string Liste der Cronjobs/ Bei Angabe eines Kommentars den Minutenintervall Funktionsparameter: • string $comment: Kommentar des Cronjobs Lifert alle Cronjobs oder einen bestimmten zurück function write crontab 1 void function write_crontab(\$file) in Datei /server-www/libs/cron.inc.php (Zeile 51) Funktionsparameter: • string $file: Die Liste mit Cronjobs Schreibt Cronjobs für den aktuellen Benutzer function add fuellstelle 1 void function add_fuellstelle(\$fwnr, \$tpa_nr) in Datei /server-www/libs/fuellstelle.inc.php (Zeile 71) Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $tpa nr: Neue TPA Nummer Fügt eine neue Füllstelle in die Datenbank ein function change fuellstelle 1 void function change_fuellstelle(\$fwnr, \$tpa_nr) in Datei /server-www/libs/fuellstelle.inc.php (Zeile 49) Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $tpa nr: Neue TPA Nummer Ändert die Details einer Füllstelle function get fuellstellen 1 array function get_fuellstellen([\$bezirk = 0], [\$abschnitt = 0], [\ ←$fwnr = 0]) Brandstätter Andreas, Klaffl Christoph Seite 169von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/fuellstelle.inc.php (Zeile 17) Returnwert: array Füllstellen Funktionsparameter: • integer $bezirk: Berzirksnummer • integer $abschnitt: Abschnittsnummer • integer $fwnr: Feuerwehrnummer Liefert Füllstellen aus der Datenbank function add fw 1 void function add_fw(\$fwnr, \$name, \$bezirk, \$abschnitt, \$plz, \ ←$ortschaft, \$gemeinde, \$strasze, 2 \$hausnummer, \$typ, \$fuellstelle) in Datei /server-www/libs/fw.inc.php (Zeile 106) Funktionsparameter: • integer $fwnr: Füllstellennummer • string $name: Feuerwehrname • integer $bezirk: Berzirksnummer • integer $abschnitt: Abschnittsnummer • integer $plz: Postleitzahl • string $ortschaft: Ortschaft • string $gemeinde: Gemeinde • string $strasze: Straße • integer $hausnummer: Hausnummer • string/enum $typ: Typ der Feuerwehr (Freiwillige Feuerwehr/Betriebsfeuerwehr) • integer $fuellstelle: Füllstellennummer Fügt eine neue Feuerwehr in die Datenbank ein function change fw 1 void function change_fw(\$fwnr, \$name, \$plz, \$ortschaft, \ ←$gemeinde, \$strasze, \$hausnummer, \$typ, 2 \$fuellstelle) in Datei /server-www/libs/fw.inc.php (Zeile 68) Funktionsparameter: • integer $fwnr: Füllstellennummer • string $name: Feuerwehrname • integer $plz: Postleitzahl • string $ortschaft: Ortschaft • string $gemeinde: Gemeinde • string $strasze: Straße • integer $hausnummer: Hausnummer • string/enum $typ: Typ der Feuerwehr (Freiwillige Feuerwehr/Betriebsfeuerwehr) • integer $fuellstelle: Füllstellennummer Ändert die Eigenschaften/Details einer Feuerwehr Brandstätter Andreas, Klaffl Christoph Seite 170von 231 ALFSA KAPITEL 9. ANHANG function get feuerwehren 1 array function get_feuerwehren([\$bezirk = 0], [\$abschnitt = 0], [\ ←$fwnr = 0], [\$fuellstelle = 1]) in Datei /server-www/libs/fw.inc.php (Zeile 18) Returnwert: array Feuerwehren Funktionsparameter: • integer $bezirk: Berzirksnummer • integer $abschnitt: Abschnittsnummer • integer $fwnr: Feuerwehnummer • integer $fuellstelle: Gibt an ob auch Feuerwehren angezeigt werden, die als Stationierungsfeuerwehr einer Füllstelle verwendet werden Liefert Feuerwehren aus der Datenbank function append to log 1 void function append_to_log(\$logfile, \$line) in Datei /server-www/libs/misc.inc.php (Zeile 197) Funktionsparameter: • string $logfile: Pfad zu der Logdatei • string $line: Logzeile Einen Eintrag mit Zeitstempel zur einer Logdatei hinzufügen function array insert 1 void function array_insert(\$array, \$pos, \$value) in Datei /server-www/libs/misc.inc.php (Zeile 38) Funktionsparameter: • array $array: Array, in welches ein Wert hinzugfügt werden soll • integer $pos: Position, in welcher der Wert eingefügt wird • * $value: Wert der eingefügt wird Fügt einen bestimmten Wert an einer bestimmten Stelle eines Arrays ein function check config 1 void function check_config(\$config_file) in Datei /server-www/libs/misc.inc.php (Zeile 398) Funktionsparameter: • string $config file: Pfad zur Konfigurationsdatei Funktion zur Überpüfung der Konfigurationsdatei function check form data Brandstätter Andreas, Klaffl Christoph Seite 171von 231 ALFSA KAPITEL 9. ANHANG 1 void function check_form_data(\$check, [\$check_verbindungskennung = false]) ←- in Datei /server-www/libs/misc.inc.php (Zeile 307) Funktionsparameter: • array $check: Enthält die Kürzel, Namen, .. der Formulare die üerprüft werden sollen • boolean $check verbindungskennung: Gibt an, ob auf eien gültige Verbindungskennung geprüft werden soll Funktion, die zur serverseitigen Validierung der Formulardaten dient function contains only letters 1 boolean function contains_only_letters(\$string) in Datei /server-www/libs/misc.inc.php (Zeile 229) Returnwert: boolean TRUE wenn der String nur Buchstaben enthält, sonst FALSE Funktionsparameter: • string $string: String der überprüft werden soll Funktion um zu überprüfen ob ein String nur Buchstaben enthält function convert spaces to one space 1 string function convert_spaces_to_one_space(\$value) in Datei /server-www/libs/misc.inc.php (Zeile 149) Returnwert: string Konvertierter Text Funktionsparameter: • string $value: Text, der konvertiert werden soll Konvertiert mehrere Leerzeichen zu einem function error 1 void function error(\$line, \$file, \$string, [\$mysql_error = ""]) in Datei /server-www/libs/misc.inc.php (Zeile 215) Funktionsparameter: • integer $line: Zeilennummer, in der der Fehler auftritt • string $file: Datei, in der der Fehler auftritt • string $string: Fehlermeldung • string $mysql error: Falls ein Fehler im Zusammenhang mit der Datenbank auftritt, wird er hier übergeben Fügt eine Meldung über einen Fehler in die Fehler Logdatei ein function format data type 1 string function format_data_type(\$value, [\$decimal_places = 1], [\ ←$add_data_type = true], [\$max_format = Brandstätter Andreas, Klaffl Christoph Seite 172von 231 ALFSA KAPITEL 9. ANHANG 2 ""]) in Datei /server-www/libs/misc.inc.php (Zeile 169) Returnwert: string Umgewandelte Größe Funktionsparameter: • integer $value: Größe in Bytes • integer $decimal places: Anzahl der dezimal Stellen • boolean $add data type: Gibt an, ob die Speichereinheit angegeben werden soll • string $max format: die maximale Speichereinheit in der der Wert umgewandelt wird Wandelt Dateigrößen von Byte in größere Speichereinheiten um function get abschnitte 1 array function get_abschnitte([\$bezirk = 0], [\$abschnitt = 0]) in Datei /server-www/libs/misc.inc.php (Zeile 109) Returnwert: array Abschnitte/Abschnitt Funktionsparameter: • integer $bezirk: Bezirksnummer • integer $abschnitt: Abschnittsnummer Liefert die Abschnitte aus der Datenbank function get bezirke 1 array function get_bezirke([\$bezirk = 0]) in Datei /server-www/libs/misc.inc.php (Zeile 81) Returnwert: array Bezirke/Bezirk Funktionsparameter: • integer $bezirk: Bezirksnummer Lifert die Bezirke aus der Datenbank function get current dir 1 string function get_current_dir() in Datei /server-www/libs/misc.inc.php (Zeile 25) Returnwert: string Verzeichnis Lifert das aktuelle Verzeichnis zurück function get homedir 1 string function get_homedir() in Datei /server-www/libs/misc.inc.php (Zeile 14) Returnwert: string Heimverzeichnis Liefert das Heimverzeichnis des Benutzers zurück unter dem PHP ausgeführt wird Brandstätter Andreas, Klaffl Christoph Seite 173von 231 ALFSA KAPITEL 9. ANHANG function get svn revision 1 string function get_svn_revision() in Datei /server-www/libs/misc.inc.php (Zeile 137) Returnwert: string Versionsnummer Liefert die Subversion Versionsnummer zurück function is ip 1 boolean function is_ip(\$string) in Datei /server-www/libs/misc.inc.php (Zeile 271) Returnwert: boolean TRUE wenn der String eine gültige IP Addresse enthält, sonst FALSE Funktionsparameter: • string $string: String der überprüft werden soll Funktion um zu überprüfen ob ein String eine gültige IP Addresse beinhaltet function is port 1 boolean function is_port(\$string) in Datei /server-www/libs/misc.inc.php (Zeile 292) Returnwert: boolean TRUE wenn der Wert eine gültige Portnummer ist, sonst FALSE Funktionsparameter: • string $string: Wert der überprüft werden soll Funktion um zu überprüfen ob der übergebene Wert eine gültige Portnummer ist function remove cr lf 1 string function remove_cr_lf(\$string) in Datei /server-www/libs/misc.inc.php (Zeile 62) Returnwert: string String ohne LF und CR Funktionsparameter: • string $string: String, aus welchem die Zeichen entfernt werden sollen Entfernt LineFeed und CarriageReturn aus einem Text function ping 1 array/boolean function ping(\$host, [\$n = 3]) in Datei /server-www/libs/net.inc.php (Zeile 16) Returnwert: array/boolean minimale, durschnittliche, maximale PING Zeiten / bei Nichtereichabrkeit des Servers FALSE Funktionsparameter: • string $host: Hostname oder IP Addresse des zu überprüfenden Rechners • integer $n: Anzahl der PING Versuche Funktion zur Überprüfung eines Server durch pingen Brandstätter Andreas, Klaffl Christoph Seite 174von 231 ALFSA KAPITEL 9. ANHANG function test mysql 1 boolean function test_mysql(\$host, \$tunneld_port, \$db_host, \ ←$db_user, \$db_password, [\$ssh_port = 22]) in Datei /server-www/libs/net.inc.php (Zeile 65) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $host: Hostname oder IP Addresse des zu überprüfenden Rechners • integer $tunneld port: Lokaler Port der zum Tunneln verwendet wird • string $db host: Datenbankhost • string $db user: Datenbankbenutzer • string $db password: Datenbankbenutzer • integer $ssh port: Port auf dem der SSH Server läuft Funktion zur Überprüfung der MySQL Verbindung zu einem entfernten Server über SSH function test ssh 1 boolean function test_ssh(\$host, [\$ssh_port = 22]) in Datei /server-www/libs/net.inc.php (Zeile 43) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $host: Hostname oder IP Addresse des zu überprüfenden Rechners • integer $ssh port: Port auf dem der SSH Server läuft Funktion zur Überprüfung der SSH Vebrindung zu einem Server function check permissions 1 boolean function check_permissions() in Datei /server-www/libs/setup.inc.php (Zeile 14) Returnwert: boolean Wenn die Berechtigungen stimmen TRUE, sonst FALSE Funktion zur Überprüfung ob die Berechtigungen für die Asuführung von ALFSA passen function is assoc 1 boolean function is_assoc(\$array) in Datei /server-www/libs/setup.inc.php (Zeile 107) Returnwert: boolean Wenn das Array assoziativ ist TRUE, sonst FALSE Funktionsparameter: • array $array: Das zu überprüfende Array Funktion zum Überprüfen ob ein Array assoziativ ist function update config 1 void function update_config(\$settings, [\$config_file = "settings. ←inc.php"]) Brandstätter Andreas, Klaffl Christoph Seite 175von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/setup.inc.php (Zeile 46) Funktionsparameter: • array $settings: Enthält die Einstellungen mit ihren Werte, die gesetzt werden sollen • string $config file: Name der Konfigurationsdatei Funktion zum ändern/erstellen von Konfigurationsdateien function add authorized key 1 boolean function add_authorized_key(\$type, \$rsa, [\$comments = ""], ←[\$allowed_host = 0], \$typ) in Datei /server-www/libs/ssh functions.inc.php (Zeile 154) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $typ: Typ des Eintrages • string $rsa: RSA Schlüssel • string $comments: Kommentar • string $allowed host: IP oder Hostname des Rechners, dem es erlaubt ist sich mit dem RSA KEy zu verbinden • $type: Fügt einen “authorized keys“ hinzu function add known host 1 boolean function add_known_host(\$name, \$hostname, \$ip, \$type, \ ←$rsa, \$typ) in Datei /server-www/libs/ssh functions.inc.php (Zeile 63) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $name: Name des Hosts • string $hostname: Hostname des Rechners • string $ip: IP des Rechners • string $typ: Typ des Eintrages • string $rsa: RSA Schlüssel • $type: Fügt einen “known Host“ hinzu function add server 1 boolean function add_server(\$server_name, \$hostname, \$ip, \ ←$ssh_port, \$priority, \$rsa, \$db_host, \$db_user, 2 \$db_password, \$db_name) in Datei /server-www/libs/ssh functions.inc.php (Zeile 333) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Brandstätter Andreas, Klaffl Christoph Seite 176von 231 ALFSA KAPITEL 9. ANHANG Funktionsparameter: • string $server name: Servername • string $hostname: Hostname • string $ip: IP Addresse • string $ssh port: SSH Port • string $priority: Priorität (0-9) • string $rsa: RSA Schlüssel • string $db host: Datenbankhost • string $db user: Datenbankbenutzer • string $db password: Datenbankpasswort • string $db name: Datenbankname Fügt einen neuen Server in das System ein function check authorized key 1 boolean function check_authorized_key(\$rsa) in Datei /server-www/libs/ssh functions.inc.php (Zeile 126) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $rsa: RSA Schlüssel Überprüft ob ein “authorized keys“ Eintrag existiert function check known host 1 boolean function check_known_host(\$rsa) in Datei /server-www/libs/ssh functions.inc.php (Zeile 89) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $rsa: RSA Schlüssel Überprüft ob ein “known Host“ Eintrag existiert function create rsa key 1 TRUE function create_rsa_key() in Datei /server-www/libs/ssh functions.inc.php (Zeile 29) Returnwert: TRUE bei Erfolg, sonst FALSE Erstellt ein RSA Schlüsselpaar function create tunnel 1 void function create_tunnel(\$server, \$tunneld_port, \$db_host, [\ ←$ssh_port = 22]) in Datei /server-www/libs/ssh functions.inc.php (Zeile 506) Funktionsparameter: Brandstätter Andreas, Klaffl Christoph Seite 177von 231 ALFSA KAPITEL 9. ANHANG • string $server: IP oder Hostname des Servers • integer $tunneld port: Lokaler Port der zum Tunneln verwendet wird • string $db host: Datenbankhost • integer $ssh port: SSH Port Erstellt einen SSH Porttunnel zu einem anderen Server function del authorized key 1 void function del_authorized_key(\$rsa, [\$comment = 0]) in Datei /server-www/libs/ssh functions.inc.php (Zeile 182) Funktionsparameter: • string $rsa: RSA Schlüssel • string $comment: Kommentar Löscht einen “authorized key“ Eintrag function del server 1 boolean function del_server(\$name) in Datei /server-www/libs/ssh functions.inc.php (Zeile 303) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $name: Servername Löscht einen Server aus der Datenbank function get rsa key 1 string function get_rsa_key() in Datei /server-www/libs/ssh functions.inc.php (Zeile 14) Returnwert: string Öffentlichen RSA Schlüssel Liest den öffentlichen Schlüssel des Benutzers aus, unter dem PHP ausgeführt wird function get server 1 array function get_server([\$name = ""], [\$rsa_key = ""], [\ ←$show_backup_server = FALSE]) in Datei /server-www/libs/ssh functions.inc.php (Zeile 251) Returnwert: array Servers/Server Funktionsparameter: • string $name: Servername • string $rsa key: RSA Schlüssel • boolean $show backup server: Gibt an ob auch Backup Server, also jene mit einer Priorität 0, ausgelesen werden sollen Liest die verfügbaren Server aus der Datenbank aus Brandstätter Andreas, Klaffl Christoph Seite 178von 231 ALFSA KAPITEL 9. ANHANG function read authorized keys 1 array function read_authorized_keys() in Datei /server-www/libs/ssh functions.inc.php (Zeile 113) Returnwert: array authorized keys Auslesem der “authorized keys“ function read known hosts 1 array function read_known_hosts() in Datei /server-www/libs/ssh functions.inc.php (Zeile 46) Returnwert: array Known Hosts Auslesem der “known Hosts“ function setup authorized keys 1 boolean function setup_authorized_keys() in Datei /server-www/libs/ssh functions.inc.php (Zeile 234) Returnwert: boolean TRUE bei Erfolg, sonst FALSE Schreibt für alle aktiven Server die “authorized key“ Einträge function update server 1 boolean function update_server(\$server_name_old, \$hostname, \$ip, \ ←$ssh_port, \$priority, \$rsa, \$db_host, 2 \$db_user, \$db_password, \$db_name, [\$server_name_new = 0]) in Datei /server-www/libs/ssh functions.inc.php (Zeile 445) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $server name old: Alter Servername • string $hostname: Hostname • string $ip: IP Addresse • string $ssh port: SSH Port • string $priority: Priorität (0-9) • string $rsa: RSA Schlüssel • string $db host: Datenbankhost • string $db user: Datenbankbenutzer • string $db password: Datenbankpasswort • string $db name: Datenbankname • string $server name new: Neuer Servername Ändert die Details/Eigenschaften eines Servers im System function update server config 1 boolean function update_server_config(\$server) Brandstätter Andreas, Klaffl Christoph Seite 179von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/ssh functions.inc.php (Zeile 524) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • array $server: Serverdetails Aktualisiert die Serverkonfiguration und übernimmt diese ALFSA weit. Das bedeutet, das bei Änderungen der Datenbankeinstellungen Kontakt mit den anderen Server aufgenommen wird und mindestens bei einem die Einstellungen für diesen Server eingetragen werden (damit sich die Server untereinander die Einstellungen austauschen können) function calc level 1 integer function calc_level(\$table, \$parents) in Datei /server-www/libs/sync functions.inc.php (Zeile 404) Returnwert: integer Beziehungsebene Funktionsparameter: • string $table: Tabellenname • array $parents: Tabellenbaum Berechnet die Beziehungen der Tabellen untereinander function check if inkonsistent 1 Falls function check_if_inkonsistent(\$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 812) Returnwert: Falls inkonsistent TRUE, sonst FALSE Funktionsparameter: • ressource $dbhandle: Datenbankhandle Prüft ob die Datenbank inkonsistent ist function check if table exists 1 boolean function check_if_table_exists(\$tablename, \$dbhandle, \ ←$db_name) in Datei /server-www/libs/sync functions.inc.php (Zeile 296) Returnwert: boolean Falls die Tabelle existiert TRUE, sonst FALSE, im Fehlerfall NULL Funktionsparameter: • string $tablename: Tabellenname • ressource $dbhandle: Datenbankhandle • string $db name: Datenbankname Überprüft ob eine Tabelle existiert oder nicht function check lock file 1 boolean function check_lock_file(\$lock_file) Brandstätter Andreas, Klaffl Christoph Seite 180von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/sync functions.inc.php (Zeile 797) Returnwert: boolean Falls die Lock Datei existiert TRUE, sonst FALSE Funktionsparameter: • string $lock file: Pfad zur Lock Datei, die überprüft werden soll Überprüft, ob die Lock Datei existiert function clean up 1 boolean function clean_up(\$dbhandle, [\$error_recovery = TRUE]) in Datei /server-www/libs/sync functions.inc.php (Zeile 655) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • ressource $dbhandle: Datenbankhandle • $error recovery: Säubert die Datenbank (löscht temporäre Syncronisationsdaten, aktiviert die Beziehungen der Datenbank wieder, ...) function create table 1 void function create_table(\$tablename, \$dbhandle, \$dbhandle2) in Datei /server-www/libs/sync functions.inc.php (Zeile 323) Funktionsparameter: • string $tablename: Tabellenname • ressource $dbhandle: Datenbankhandle der Zieldatenbank • ressource $dbhandle2: Datenbankhandle der Quelldatenbank Erstellt eine Tabelle anhand einer Tabelle aus einer anderen Datenbank mit gleichem Namen function create table extended 1 void function create_table_extended(\$source_tablename, \ ←$target_tablename, \$dbhandle, \$dbhandle2) in Datei /server-www/libs/sync functions.inc.php (Zeile 349) Funktionsparameter: • string $source tablename: Tabellenname der Quelltabelle • string $target tablename: Tabellenname der Zieltabelle • ressource $dbhandle: Datenbankhandle der Zieldatenbank • ressource $dbhandle2: Datenbankhandle der Quelldatenbank Erstellt eine Tabelle anhand der Struktur einer anderen Tabelle aus einer anderen Datenbank function del lock file 1 boolean function del_lock_file(\$lock_file) in Datei /server-www/libs/sync functions.inc.php (Zeile 782) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Brandstätter Andreas, Klaffl Christoph Seite 181von 231 ALFSA KAPITEL 9. ANHANG Funktionsparameter: • string $lock file: Pfad zur Lock Datei, die gelöscht werden soll Löscht eine Lock Datei function del sync 1 boolean function del_sync() in Datei /server-www/libs/sync functions.inc.php (Zeile 389) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Setzt die gesamte Syncronisierung zurück function first sync 1 Falls function first_sync() in Datei /server-www/libs/sync functions.inc.php (Zeile 376) Returnwert: Falls es sich um die erste Syncronisierung handelt TRUE, sonst FALSE Überprüft, ob es sich um die erste Syncronisierung handelt function format string for html console 1 array function format_string_for_html_console(\$message) in Datei /server-www/libs/sync functions.inc.php (Zeile 549) Returnwert: array die verschiedenen Ausgabetexte Funktionsparameter: • string $message: Text Formatiert einen String für verschiedene Ausgabeformate function get all tables 1 array function get_all_tables(\$dbhandle, [\$show_sync_tables = FALSE ←]) in Datei /server-www/libs/sync functions.inc.php (Zeile 18) Returnwert: array Tabellen Funktionsparameter: • ressource $dbhandle: Datenbankhandle • boolean $show sync tables: Gibt an, ob auch die Tabellen mit dem Suffix “ sync“ angezeigt werden sollen Liest alle Tabellen aus der Datenbank aus function get new data 1 array function get_new_data(\$tablename, \$dbhandle, [\$limit_start = ←0], [\$limit_count = 0]) Brandstätter Andreas, Klaffl Christoph Seite 182von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/sync functions.inc.php (Zeile 179) Returnwert: array Neue Datensätze Funktionsparameter: • string $tablename: Tabellenname • ressource $dbhandle: Datenbankhandle • integer $limit start: Datensätze, ab denen selektiert wird • integer $limit count: Gibt an, wieviele Datensätze maximal zurückgeliefert werden Liest die neuen Datensätze einer Tabelle ein function get primary keys 1 array function get_primary_keys(\$tablename, \$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 154) Returnwert: array Primärschlüssel Funktionsparameter: • string $tablename: Tabellenname • ressource $dbhandle: Datenbankhandle Liest die primären Schlüssel einer Tabelle aus function get table levels 1 array function get_table_levels(\$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 467) Returnwert: array Beziehungsebenen der Tabellen Funktionsparameter: • ressource $dbhandle: Datenbankhandle Liest die Beziehungen der Tabellen aus der Datenbank aus function get table structure 1 array function get_table_structure(\$tablename, \$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 41) Returnwert: array Tabellenstruktur Funktionsparameter: • string $tablename: Tabellenname • ressource $dbhandle: Datenbankhandle Liest die Tabellenstruktur einer Tabelle aus der Datenbank aus function get temporary sync tables 1 array/bollean function get_temporary_sync_tables(\$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 825) Returnwert: array/bollean temporären Syncronisationstabellen/Bei Fehler FALSE Funktionsparameter: Brandstätter Andreas, Klaffl Christoph Seite 183von 231 ALFSA KAPITEL 9. ANHANG • ressource $dbhandle: Datenbankhandle Liest die temporären Syncronisationstabellen aus der Datenbanka aus function output 1 void function output(\$string, [\$die = FALSE]) in Datei /server-www/libs/sync functions.inc.php (Zeile 612) Funktionsparameter: • string $string: Text, der formatiert und ausgegeben werden soll • boolean $die: Gibt an, ob abgebrochen werden soll oder nicht Gibt den Text formatiert für die jeweilige Ausgabe aus (Konsole, Webinterface) function read sync date 1 integer function read_sync_date(\$server_name) in Datei /server-www/libs/sync functions.inc.php (Zeile 200) Returnwert: integer UNIX timestamp Funktionsparameter: • string $server name: Servername Liest das Datum der letzten Syncronisation ein function set fk off 1 boolean function set_fk_off(\$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 510) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • ressource $dbhandle: Datenbankhandle Schaltet die Beziehungskontrolle der Datenbank aus function set fk on 1 boolean function set_fk_on(\$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 530) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • ressource $dbhandle: Datenbankhandle Schaltet die Beziehungskontrolle der Datenbank ein function set lock file 1 boolean function set_lock_file(\$lock_file) Brandstätter Andreas, Klaffl Christoph Seite 184von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/sync functions.inc.php (Zeile 767) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • string $lock file: Pfad zur Lock Datei, die gesetzt werden soll Setzt eine Lock Datei function sort tables after levels 1 array function sort_tables_after_levels(\$dbhandle, \$array) in Datei /server-www/libs/sync functions.inc.php (Zeile 486) Returnwert: array sortierte Tabellen Funktionsparameter: • ressource $dbhandle: Datenbankhandle • array $array: Tabellen Sortiert die Tabellen nach ihren Beziehungen function sync error 1 void function sync_error(\$line, \$file, \$string, [\$mysql_error = " ←"], [\$die = TRUE], [\$output = FALSE]) in Datei /server-www/libs/sync functions.inc.php (Zeile 239) Funktionsparameter: • integer $line: Zeilennummer, in der der Fehler auftritt • string $file: Datei, in der der Fehler auftritt • string $string: Fehlermeldung • string $mysql error: Falls ein Fehler im Zusammenhang mit der Datenbank auftritt, wird er hier übergeben • boolean $die: Gibt an, ob abgebrochen werden soll oder nicht • boolean $output: Gibt an, ob der Fehler ausgegeben werden soll oder nur ein Verweis auf die Error Log erfolgt Fehlerbehandlung und Logging im Falle eines Fehlers function sync table 1 integer function sync_table(\$source_tablename, \$target_tablename, \ ←$dbhandle, \$dbhandle2) in Datei /server-www/libs/sync functions.inc.php (Zeile 66) Returnwert: integer Anzahl der aktualisierten/hinzugefügten Datensätze Funktionsparameter: • string $source tablename: Tabellenname der Quelltabelle • string $target tablename: Tabellenname der Zieltabelle • ressource $dbhandle: Datenbankhandle der Zieldatenbank • ressource $dbhandle2: Datenbankhandle der Quelldatenbank Syncronisiert die Datensätze von einer Tabelle in die andere Brandstätter Andreas, Klaffl Christoph Seite 185von 231 ALFSA KAPITEL 9. ANHANG function update sync date 1 void function update_sync_date(\$server_name, [\$date = 0]) in Datei /server-www/libs/sync functions.inc.php (Zeile 216) Funktionsparameter: • string $server name: Servername • integer $date: UNIX timestamp Neues Syncronisationsdatum schreiben function update table levels 1 void function update_table_levels(\$db_name, \$dbhandle) in Datei /server-www/libs/sync functions.inc.php (Zeile 420) Funktionsparameter: • string $db name: Datenbankname • ressource $dbhandle: Datenbankhandle Aktualisiert die Beziehungen der Tabellen function update table structure 1 void function update_table_structure(\$tablename, \$dbhandle, \ ←$dbhandle2) in Datei /server-www/libs/sync functions.inc.php (Zeile 635) Funktionsparameter: • string $tablename: Tabellenname • ressource $dbhandle: Datenbankhandle der Zieldatenbank • ressource $dbhandle2: Datenbankhandle der Quelldatenbank Temporäre Tabelle mit dem Suffix “ sync“ erstellen und die Tabellestruktur einer gleichnamigen Tabelle aus einer anderen Datenbank übernehmen function get cpuclock 1 string function get_cpuclock() in Datei /server-www/libs/sysinfo.inc.php (Zeile 46) Returnwert: string Taktrate Liest die aktuelle Taktrate des Prozessors ein function get cpupercent 1 integer function get_cpupercent() in Datei /server-www/libs/sysinfo.inc.php (Zeile 15) Returnwert: integer CPU Auslastung in Prozent Liest die aktuelle CPU Auslastung aus (Achtung: wartet 1 Sekunde) Brandstätter Andreas, Klaffl Christoph Seite 186von 231 ALFSA KAPITEL 9. ANHANG function get date 1 string function get_date() in Datei /server-www/libs/sysinfo.inc.php (Zeile 197) Returnwert: string Datum - Uhrzeit Ruft das aktuelle Datum und die Uhrzeit ab function get diskspace 1 array function get_diskspace([\$disk = "./"]) in Datei /server-www/libs/sysinfo.inc.php (Zeile 184) Returnwert: array Partitionsbelegung Funktionsparameter: • $disk: Ermittelt die Partitionsbelegung function get distri 1 string/boolean function get_distri([\$use_lsb = false]) in Datei /server-www/libs/sysinfo.inc.php (Zeile 70) Returnwert: string/boolean Distributionsbezeichnung / im Fehlerfall FALSE Funktionsparameter: • boolean $use lsb: Gibt an, ob die LSB Methode zur Ermittlung der Distribution verwendet werden soll Ermittelt die eingesetzte Distribution function get ip 1 string function get_ip() in Datei /server-www/libs/sysinfo.inc.php (Zeile 283) Returnwert: string IP Addresse Ermittelt die eigene IP function get netstats 1 array/boolean function get_netstats([\$device = "eth0"]) in Datei /server-www/libs/sysinfo.inc.php (Zeile 240) Returnwert: array/boolean Netzwerkstatistik/Im Fehlerfall FALSE Funktionsparameter: • $device: Fragt den Status eines Netzwerkgeräts ab function get ram Brandstätter Andreas, Klaffl Christoph Seite 187von 231 ALFSA KAPITEL 9. ANHANG 1 array function get_ram() in Datei /server-www/libs/sysinfo.inc.php (Zeile 120) Returnwert: array RAM Belegung Ermittelt die RAM Belegung function get server status 1 boolean function get_server_status(\$service) in Datei /server-www/libs/sysinfo.inc.php (Zeile 270) Returnwert: boolean Falls der Dienst läuft TRUE, sonst FALSE Funktionsparameter: • $service: Überprüft ob ein Dienst läuft oder nicht function get swap 1 array function get_swap() in Datei /server-www/libs/sysinfo.inc.php (Zeile 142) Returnwert: array SWAP Belegung Ermittelt die SWAP Belegung function get temperature 1 integer/bollean function get_temperature() in Datei /server-www/libs/sysinfo.inc.php (Zeile 166) Returnwert: integer/bollean Temperatur / Im Fehlerfall FALSE Ermittelt die Temperatur function get uptime 1 string function get_uptime() in Datei /server-www/libs/sysinfo.inc.php (Zeile 207) Returnwert: string uptime Fragt die aktuelle uptime ab function add user 1 boolean function add_user(\$fwnr, \$stbnr, \$fuellstelle, \$vorname, \$nachname, \$password, \$stadt, \$plz, 2 \$strasze, \$hausnummer, \$dienstgrad, \$admin) ←- in Datei /server-www/libs/user.inc.php (Zeile 208) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: Brandstätter Andreas, Klaffl Christoph Seite 188von 231 ALFSA • • • • • • • • • • • • Fügt KAPITEL 9. ANHANG integer $fwnr: Feuerwehrnummer integer $stbnr: Standesbuchnummer integer $fuellstelle: Füllstellennummer string $vorname: Vorname string $nachname: Nachname string $password: Passwort string $stadt: Stadt string $strasze: Straße integer $hausnummer: Hausnummer string $dienstgrad: Dienstgrad integer/enum $admin: Gibt an, ob der Benutzer Admin ist (Wert=1) oder nicht (Wert=0) $plz: einen neuen Benutzer in die Datenbank ein function change user 1 boolean function change_user(\$fwnr, \$stbnr, \$fuellstelle, \ ←$vorname, \$nachname, \$password, \$stadt, \$plz, 2 \$strasze, \$hausnummer, \$dienstgrad, \$admin) in Datei /server-www/libs/user.inc.php (Zeile 135) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer • integer $fuellstelle: Füllstellennummer • string $vorname: Vorname • string $nachname: Nachname • string $password: Passwort • string $stadt: Stadt • string $strasze: Straße • integer $hausnummer: Hausnummer • string $dienstgrad: Dienstgrad • integer/enum $admin: Gibt an, ob der Benutzer Admin ist (Wert=1) oder nicht (Wert=0) • $plz: Ändert die Eigenschaften/Details eines Benutzers function check cookie passwd hash 1 bollean function check_cookie_passwd_hash() in Datei /server-www/libs/user.inc.php (Zeile 569) Returnwert: bollean Falls das Cookie gültig ist TRUE, sonst FALSE Überprüft ob das Passwort im Cookie stimmt function del user Brandstätter Andreas, Klaffl Christoph Seite 189von 231 ALFSA KAPITEL 9. ANHANG 1 boolean function del_user(\$fwnr, \$stbnr) in Datei /server-www/libs/user.inc.php (Zeile 102) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer Löscht einen Kompressor aus der Datenbank function get alias for permission 1 string function get_alias_for_permission(\$permission) in Datei /server-www/libs/user.inc.php (Zeile 540) Returnwert: string Berechtigung in lesbarer Form; falls keine Übersetzung vorhanden ist, das Berechtigungskürzel Funktionsparameter: • string $permission: Berechtigungskürzel Übersetzt die Berechtigungskürzel in eine für den Benutzer lesbare Form function get available areas 1 array function get_available_areas() in Datei /server-www/libs/user.inc.php (Zeile 328) Returnwert: array verfügbare Berechtigungsbereiche Liest die verfügbaren Berechtigungsbereiche aus einem ENUM Feld der Datenbankstruktur aus function get available permissions 1 array function get_available_permissions() in Datei /server-www/libs/user.inc.php (Zeile 295) Returnwert: array verfügbare Berechtigungen Liest die verfügbaren Berechtigungen aus einem ENUM Feld der Datanbankstruktur aus function get dienstgrade 1 array function get_dienstgrade([\$nr = 0]) in Datei /server-www/libs/user.inc.php (Zeile 270) Returnwert: array Dienstgrade/Dienstgrad Funktionsparameter: • integer $nr: Dienstgradnummer Liest die verfügabren Dienstgrade/einen Dienstgrad aus der Datenbank aus Brandstätter Andreas, Klaffl Christoph Seite 190von 231 ALFSA KAPITEL 9. ANHANG function get fwnr and stbnr 1 string function get_fwnr_and_stbnr() in Datei /server-www/libs/user.inc.php (Zeile 527) Returnwert: string Feuerwehrnummer und Standesbuchnummer im Format Feuerwehrnummer/Standesbuchnummer Liest die Feuerwehrnummer und die Standesbuchnummer des angemeldeten Benutzers aus function get permissions 1 array function get_permissions(\$fwnr, \$stbnr) in Datei /server-www/libs/user.inc.php (Zeile 363) Returnwert: array Berechtigungen des angegebenen Benutzers Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer Fragt die Berechtigungen eines Benutzers ab function get username 1 string/boolean function get_username() in Datei /server-www/libs/user.inc.php (Zeile 515) Returnwert: string/boolean Benutzernamen/Falls kein Benutzer angemeldet ist FALSE Liest den Benutzernamen des angemeldeten Benutzers aus function get users 1 array function get_users([\$bezirk = 0], [\$abschnitt = 0], [\$fwnr = ←0], [\$limit_start = 0], [\$limit_count = 0], 2 [\$show_deleted = 2]) in Datei /server-www/libs/user.inc.php (Zeile 20) Returnwert: array Benutzer Funktionsparameter: • integer $bezirk: Berzirksnummer • integer $abschnitt: Abschnittsnummer • integer $fwnr: Feuerwehrnummer • integer $limit start: Datensätze, ab denen selektiert wird • integer $limit count: Gibt an, wie viele Benutzer zurückgeliefert werden sollen • integer $show deleted: Gibt an, welche Benutzer zurückgegeben werden (0 = nur aktive, 1 = nur gelöschte/abgeschlossene, 2 = aktive und gelöschte/abgeschlossene) Liefert Benutzer aus der Datenbank function get user details 1 array function get_user_details(\$fwnr, \$stbnr) Brandstätter Andreas, Klaffl Christoph Seite 191von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/libs/user.inc.php (Zeile 82) Returnwert: array Benutzerdetails Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer Liefert Details über einen Benutzer aus der Datenbank function isloggedon 1 boolean function isloggedon() in Datei /server-www/libs/user.inc.php (Zeile 440) Returnwert: boolean Falls ein Benutzer angemeldet ist TRUE, sonst FALSE Überprüft ob ein Benutzer eingeloggt ist function is admin 1 boolean function is_admin(\$fwnr, \$stbnr) in Datei /server-www/libs/user.inc.php (Zeile 382) Returnwert: boolean TRUE falls der Benutzer ein Administrator ist, sonst FALSE (auch im Fehlerfall) Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer Überprüft ob ein Benutzer ein Administrator ist function login 1 boolean function login(\$fwnr, \$stbnr, \$passwd, [\$use_cookies = FALSE]) ←- in Datei /server-www/libs/user.inc.php (Zeile 458) Returnwert: boolean Bei Erfolg TRUE, sonst FALSE Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer • string $passwd: Passwort • boolean $use cookies: Gibt an, ob Cookies angelegt werden sollen (TRUE) oder nicht (FALSE) Meldet einen Benutzer an function logout 1 boolean function logout() in Datei /server-www/libs/user.inc.php (Zeile 490) Returnwert: boolean Bei Abmeldung TRUE, wenn kein Benutzer angemeldet ist FALSE Brandstätter Andreas, Klaffl Christoph Seite 192von 231 ALFSA KAPITEL 9. ANHANG Meldet den angemeldeten Benutzer ab function set permissions 1 void function set_permissions(\$fwnr, \$stbnr, \$settings) in Datei /server-www/libs/user.inc.php (Zeile 401) Funktionsparameter: • integer $fwnr: Feuerwehrnummer • integer $stbnr: Standesbuchnummer • array $settings: Enthält die Berechtigungen mit ihren Werte, die gesetzt werden sollen Setzt Berechtugungen für einen Benutzer function new draw table 1 void function new_draw_table(\$name, \$fields, [\$wfk = TRUE]) in Datei /server-www/pages/draw tables.inc.php (Zeile 51) Funktionsparameter: • string $name: Tabellenname • array $fields: Spalten der Tabelle • boolean $wfk: Darstellung mit oder ohne Foreign keys Funktion zum Zeichnen von Tabellen 9.1.3 Teil Client-Server-Sync am Server function append to log 1 void function append_to_log(\$title, \$data, [\$type = "standard"]) in Datei /server-www/client-sync/functions.inc.php (Zeile 310) Funktionsparameter: • string $title: Titel des Logeintrages. • string $data: Daten des Logeintrages. • string $type: Art des Logeintrages. Speichert Log-Eintraege in die Logdatei. function error 1 void function error(\$line, \$file, \$string, [\$error = ""], \$sql) in Datei /server-www/client-sync/functions.inc.php (Zeile 21) Funktionsparameter: • int $line: Zeile, in der die Fehlermeldung ausgloest wurde. • int $file: Datei, in der die Fehlermeldung ausgloest wurde. • string $string: Beschreibung des Fehlers. • string $error: Fehlermeldung, die von MySQL zurueckgegeben wird. • string $sql: MySQL-String, der den Fehler verursachte. Brandstätter Andreas, Klaffl Christoph Seite 193von 231 ALFSA KAPITEL 9. ANHANG Gibt eine formatierte MySQL-Fehlermeldung aus. function get filename of cache file 1 string function get_filename_of_cache_file([\$phase = -1]) in Datei /server-www/client-sync/functions.inc.php (Zeile 145) Returnwert: string Dateiname fuer die Datei. Funktionsparameter: • int $phase: Aktueller Arbeitsschritt. Liefert den Dateinamen fuer die Datei zur zwischenspeicherung von SQL-Befehlen. function get primary keys 1 array function get_primary_keys(\$table) in Datei /server-www/client-sync/functions.inc.php (Zeile 160) Returnwert: array Primaerschluessel der Tabelle. Funktionsparameter: • string $table: Name der Tabelle. Liefert die Primaerschluessel einer Tabelle aus der Datenbank. function get referenced tables 1 array function get_referenced_tables(\$table) in Datei /server-www/client-sync/functions.inc.php (Zeile 95) Returnwert: array Tabellen, die von der gegebenen Tabelle abhaengen. Funktionsparameter: • string $table: Name der Tabelle Liefert eine Auflistung aller Tabellen, die von einer gegebenen Tabelle ueber Foreign-Keys abhaengen. function get referenced tables recursive 1 array function get_referenced_tables_recursive(\$table) in Datei /server-www/client-sync/functions.inc.php (Zeile 125) Returnwert: array Tabellen, die rekursiv von der gegebenen Tabelle abhaengen. Funktionsparameter: • string $table: Name der Tabelle Liefert eine Auflistung aller Tabellen, die von einer gegebenen Tabelle ueber Foreign-Keys abhaengen. Abhaengende Tabellen werden rekursiv analysiert. function get right client 1 string function get_right_client(\$table, [\$type = "from_client"]) Brandstätter Andreas, Klaffl Christoph Seite 194von 231 ALFSA KAPITEL 9. ANHANG in Datei /server-www/client-sync/functions.inc.php (Zeile 185) Returnwert: string Berechtigung fuer die Tabelle und Art der Berechtigung. Funktionsparameter: • string $table: Name der Tabelle. • string $type: Art der Berechtigung. Liefert die Client-Berechtigungen einer Tabelle aus der Datenbank. function get tables 1 array function get_tables() in Datei /server-www/client-sync/functions.inc.php (Zeile 65) Returnwert: array Tabellen der Datenbank mit Level. Liefert eine Auflistung aller Tabellen der Datenbank. Lest zusaetzlich das Level aus der Tabelle sync aus. function my extract 1 void function my_extract(\$post_data, [\$decode = TRUE]) in Datei /server-www/client-sync/functions.inc.php (Zeile 38) Funktionsparameter: • string $post data: POST-Daten der Client-Anfrage. • bool $decode: Gibt an, ob die Daten des Clients URL-Codiert sind. Extrahiert die Datensaetze aus den POST-Daten der Client-Anfragen. function read cache data 1 void function read_cache_data() in Datei /server-www/client-sync/functions.inc.php (Zeile 267) Gibt temporaere SQL-Anfragen aus der Datei zur Zwischenspeicherung aus. function write cache data 1 void function write_cache_data(\$tables, \$last_sync_date) in Datei /server-www/client-sync/functions.inc.php (Zeile 208) Funktionsparameter: • string $tables: Namen der Tabellen. • int $last sync date: Datum der letzen Synchronisierung. Speichert temporaere SQL-Anfragen in die Datei zur Zwischenspeicherung. Maximale Ausfuehrungszeit in Sekunden, bis ein Fehler in der Logdatei eingetragen wird. Maximaler Zeitversatz in Minuten zum Client. Prozessdatei fuer Arbeitsschritt 2 fuer Client-Server-Synchronisation. Prozessdatei fuer Arbeitsschritt 3 fuer Client-Server-Synchronisation. Brandstätter Andreas, Klaffl Christoph Seite 195von 231 ALFSA 9.1.4 KAPITEL 9. ANHANG Teil Mehrfach genutzt class Template in Datei /server-www/libs/template.inc.php (Zeile 12) Klasse für TemplateEnginge. Klassenvariable Template::$inhalt Template::$inhalt = in Datei /server-www/libs/template.inc (Zeile 17) Klassenvariable Template::$replace Template::$replace = in Datei /server-www/libs/template. (Zeile 21) Klassenvariable Template::$start Template::$start = in Datei /server-www/libs/template.inc.p (Zeile 25) Constructor function Template::Template 1 Constructor void function Template::Template(\$name, [\$local_start = ←0]) in Datei /server-www/libs/template.inc.php (Zeile 150) Funktionsparameter: • string $name: Dateiname des Templates. • int $local start: Startzeit der Seite. Initialisiert das Template. Lädt die Template-Datei. function Template::display 1 void function Template::display() in Datei /server-www/libs/template.inc.php (Zeile 106) Gibt das Ergebnis an den Browser aus. function Template::get html 1 string function Template::get_html() in Datei /server-www/libs/template.inc.php (Zeile 117) Liefert das Ergebnis als Return-Wert. function Template::process 1 void function Template::process() in Datei /server-www/libs/template.inc.php (Zeile 30) Führt die Ersetzung der Werte und erweiterten Funktioenen durch. function Template::read diff page 1 void function Template::read_diff_page(\$filename) in Datei /server-www/libs/template.inc.php (Zeile 186) Funktionsparameter: • string $filename: Dateiname des differentialen Templates. Initialisiert das Template mit einer differentialen Template-Datei. Brandstätter Andreas, Klaffl Christoph Seite 196von 231 ALFSA KAPITEL 9. ANHANG function Template::set 1 void function Template::set(\$key, \$value) in Datei /server-www/libs/template.inc.php (Zeile 139) Funktionsparameter: • string $key: Schlüssel zu Identifikation im Template. • string/array $value: Wert der Ersetzung. Setzt einen Wert zur Ersetzung. function Template::set html 1 void function Template::set_html(\$set_html) in Datei /server-www/libs/template.inc.php (Zeile 128) Funktionsparameter: • string $set html: HTML-Text zum Schreiben in das Template. Setzt den Inhalt des Templates. 9.2 Tabellen 9.2.1 Tabelle abschnitte 9.2.2 Tabelle atemluftflaschen fuellung Brandstätter Andreas, Klaffl Christoph Seite 197von 231 ALFSA KAPITEL 9. ANHANG 9.2.3 Tabelle atemluftflaschen maengel 9.2.4 Tabelle atemluftflaschen Brandstätter Andreas, Klaffl Christoph Seite 198von 231 ALFSA KAPITEL 9. ANHANG 9.2.5 Tabelle atemluftflaschen pruefung 9.2.6 Tabelle atemschutzgeraete maengel Brandstätter Andreas, Klaffl Christoph Seite 199von 231 ALFSA KAPITEL 9. ANHANG 9.2.7 Tabelle atemschutzgeraete 9.2.8 Tabelle atemschutzgeraete pruefung Brandstätter Andreas, Klaffl Christoph Seite 200von 231 ALFSA 9.2.9 KAPITEL 9. ANHANG Tabelle atemschutzgeraete wartung 9.2.10 Tabelle atemschutzmasken maengel 9.2.11 Tabelle atemschutzmasken Brandstätter Andreas, Klaffl Christoph Seite 201von 231 ALFSA KAPITEL 9. ANHANG 9.2.12 Tabelle atemschutzmasken wartung 9.2.13 Tabelle benutzer anmeldung Brandstätter Andreas, Klaffl Christoph Seite 202von 231 ALFSA 9.2.14 KAPITEL 9. ANHANG Tabelle benutzer Brandstätter Andreas, Klaffl Christoph Seite 203von 231 ALFSA KAPITEL 9. ANHANG 9.2.15 Tabelle benutzer schulung 9.2.16 Tabelle bezirke 9.2.17 Tabelle client 9.2.18 Tabelle dienstgrade Brandstätter Andreas, Klaffl Christoph Seite 204von 231 ALFSA KAPITEL 9. ANHANG 9.2.19 Tabelle einsatz 9.2.20 Tabelle feuerwehren 9.2.21 Tabelle fremdflaschen fuellung Brandstätter Andreas, Klaffl Christoph Seite 205von 231 ALFSA KAPITEL 9. ANHANG 9.2.22 Tabelle fremdflaschen 9.2.23 Tabelle fuell sitzung 9.2.24 Tabelle fuellstelle 9.2.25 Tabelle geraetetraeger Brandstätter Andreas, Klaffl Christoph Seite 206von 231 ALFSA KAPITEL 9. ANHANG 9.2.26 Tabelle geraetetraeger untersuchung 9.2.27 Tabelle gruppen 9.2.28 Tabelle gruppen user Brandstätter Andreas, Klaffl Christoph Seite 207von 231 ALFSA KAPITEL 9. ANHANG 9.2.29 Tabelle kompressoren maengel 9.2.30 Tabelle kompressoren Brandstätter Andreas, Klaffl Christoph Seite 208von 231 ALFSA KAPITEL 9. ANHANG 9.2.31 Tabelle kompressoren pruefung 9.2.32 Tabelle kompressoren wartung 9.2.33 Tabelle nachrichten gelesen Brandstätter Andreas, Klaffl Christoph Seite 209von 231 ALFSA KAPITEL 9. ANHANG 9.2.34 Tabelle nachrichten 9.2.35 Tabelle permission 9.2.36 Tabelle person kontakt Brandstätter Andreas, Klaffl Christoph Seite 210von 231 ALFSA KAPITEL 9. ANHANG 9.2.37 Tabelle person 9.2.38 Tabelle person telefon 9.2.39 Tabelle schulung Brandstätter Andreas, Klaffl Christoph Seite 211von 231 ALFSA KAPITEL 9. ANHANG 9.2.40 Tabelle server details 9.2.41 Tabelle server 9.2.42 Tabelle sync 9.2.43 Tabelle sync server log Brandstätter Andreas, Klaffl Christoph Seite 212von 231 ALFSA KAPITEL 9. ANHANG 9.2.44 Tabelle sync vorgang 9.2.45 Tabelle verbindungskennung 9.3 Dateiliste Folgende Auflistung beinhaltet alle relevanten Dateien der Diplomarbeit des Clients und des Servers. • ./server-www Verzeichnis aller Dateien das Servers • ./server-www/templates Verzeichnis für Templates des Servers • ./server-www/templates/header.html Template für den HTML-Header • ./server-www/templates/list server.html Template für die Darstellung der Serverliste • ./server-www/templates/infoline.html Template für die Darstellung der allgemeinen Infoleiste • ./server-www/templates/add server.html Template für das Einfügen eines Servers • ./server-www/templates/list fuellstelle.html Template für die Darstellung der Füllstellenliste Brandstätter Andreas, Klaffl Christoph Seite 213von 231 ALFSA KAPITEL 9. ANHANG • ./server-www/templates/add fw.html Template für das Einfügen einer Feuerwehr • ./server-www/templates/add user.html Template für die Einfügen eines Benutzers • ./server-www/templates/menu.html Template für die Darstellung der Navigationsmenü • ./server-www/templates/add client.html Template für das Einfügen eines Clients • ./server-www/templates/change user details.html Template für das Bearbeiten eines Benutzers • ./server-www/templates/change server details.html Template für die Darstellung der Serverdaten • ./server-www/templates/list fw details.html Template für die Darstellung der Feuerwehrdaten • ./server-www/templates/change fuellstelle details.html Template für die Darstellung der Füllstellendaten • ./server-www/templates/list fw.html Template für die Darstellung der Feuerwehrenliste • ./server-www/templates/.htaccess Datei um den direkten Zugriff auf die Datein zu unterbinden • ./server-www/templates/add fuellstelle.html Template für das Erstellen einer Füllstelle • ./server-www/templates/list servers.html Template für die Darstellung der Serverliste • ./server-www/templates/add compressor.html Template für das Einfügen eines Kompressors • ./server-www/templates/login.html Template für die Darstellung der Loginmaske • ./server-www/templates/list clients.html Template für die Darstellung der Clientliste • ./server-www/templates/list compressors.html Template für die Darstellung der Kompressorliste • ./server-www/templates/change fw details.html Template für das Bearbeiten von Feuerwehren Brandstätter Andreas, Klaffl Christoph Seite 214von 231 ALFSA KAPITEL 9. ANHANG • ./server-www/templates/first sync.html Template für die erste Synchronisation • ./server-www/templates/list compressor details.html Template für die Darstellung der Kompressordaten • ./server-www/templates/sync server.html Template für die Synchronisation • ./server-www/templates/list client details.html Template für die Darstellung der Clientdaten • ./server-www/templates/log.html Template für die Logansicht • ./server-www/templates/foother.html Template für den Seitenfuß • ./server-www/templates/list user details.html Template für die Darstellung der Benutzerdaten • ./server-www/templates/list fuellstelle details.html Template für die Darstellung der Füllstellendaten • ./server-www/templates/main.html Template für die Darstellung der Haupseite • ./server-www/templates/list server details.html Template für die Darstellung der Serverdate • ./server-www/templates/list users.html Template für die Darstellung der Benutzerliste • ./server-www/templates/change client details.html Template für das Bearbeiten von Clientdaten • ./server-www/templates/setup.html Template für die Konfiguration • ./server-www/templates/change compressor details.html Template für das Bearbeiten von Kompressordaten • ./server-www/templates/change permissions.html Template für das Bearbeiten von Berechtigungen • ./server-www/templates/meldung.html Template für die Darstellung von Meldungen • ./server-www/pages Verzeichnis aller Darstellungsseiten am Server Brandstätter Andreas, Klaffl Christoph Seite 215von 231 ALFSA KAPITEL 9. ANHANG • ./server-www/pages/main.inc.php Haupseite • ./server-www/pages/setup.inc.php Seite der Konfiguration • ./server-www/pages/sync.inc.php Seite der Synchronisation • ./server-www/pages/list users.inc.php Seite der Benutzerliste • ./server-www/pages/.htaccess Datei um den direkten Zugriff auf die Datein zu unterbinden • ./server-www/pages/list server.inc.php Seite der Serverliste • ./server-www/pages/logs.inc.php Seite der Logdateien • ./server-www/pages/list servers.inc.php Seite der Serverliste • ./server-www/pages/draw tables.inc.php Seite zum Zeichnen von Tabellen • ./server-www/pages/list compressors.inc.php Seite der Kompressorliste • ./server-www/pages/list clients.inc.php Seite der Clientliste • ./server-www/pages/server test.inc.php Seite der Servertests • ./server-www/pages/list fw.inc.php Seite der Feuerwehren • ./server-www/pages/list fuellstelle.inc.php Seite der Füllstelle • ./server-www/pages/login.inc.php Seite zum Einloggen • ./server-www/dhtml.js Javascript-Funktionen • ./server-www/images Verzeichnis aller Bilder am Server Brandstätter Andreas, Klaffl Christoph Seite 216von 231 ALFSA KAPITEL 9. ANHANG • ./server-www/images/¡verschiedene Bilder¿ verschiedene Bilder • ./server-www/libs Verzeichnis aller Libraries am Server • ./server-www/libs/misc.inc.php verschiedene Funktionen • ./server-www/libs/net.inc.php Netzwerk-Funktionen • ./server-www/libs/sysinfo.inc.php Funktionen zum Auslesen von Systeminformationen • ./server-www/libs/ssh functions.inc.php SSH-Funktionen • ./server-www/libs/user.inc.php Benutzer-Funktionen • ./server-www/libs/client.inc.php Client-Funktionen • ./server-www/libs/setup.inc.php Konfigurations-Funktionen • ./server-www/libs/sync functions.inc.php Sychronisations-Funktionen • ./server-www/libs/.htaccess Datei um den direkten Zugriff auf die Datein zu unterbinden • ./server-www/libs/template.inc.php Template-Funktionen • ./server-www/libs/defines.inc.php Definition von Konstanten • ./server-www/libs/fw.inc.php Feuerwehr-Funktionen • ./server-www/libs/cron.inc.php cron-Funktionen • ./server-www/libs/fuellstelle.inc.php Füllstellen-Funktionen • ./server-www/libs/compressor.inc.php Kompressor-Funktionen Brandstätter Andreas, Klaffl Christoph Seite 217von 231 ALFSA KAPITEL 9. ANHANG • ./server-www/style.css CSS-Datei für das Design • ./server-www/conf Konfigurationsordner • ./server-www/index.php Hauptdatei • ./server-www/client-sync Verzeichnis für Client-Synchronisation • ./server-www/client-sync/config.inc.php Konfiguration für Client-Synchronisation • ./server-www/client-sync/functions.inc.php Funktionen für Client-Synchronisation • ./server-www/client-sync/phase 3.inc.php Datei von Arbeitsschritt 3 für Client-Synchronisation • ./server-www/client-sync/phase 2.inc.php Datei von Arbeitsschritt 2 für Client-Synchronisation • ./server-www/client-sync/phase 0.inc.php Datei von Arbeitsschritt 0 für Client-Synchronisation • ./server-www/client-sync/index.php Hauptdatei für Client-Synchronisation • ./server-www/client-sync/phase 1.inc.php Datei von Arbeitsschritt 1 für Client-Synchronisation • ./client-www Verzeichnis aller Dateien das Clients • ./client-www/sync Verzeichnis aller Dateien der Client-Synchronisation • ./client-www/sync/new phase 1.inc.php Datei von Arbeitsschritt 0 für Client-Synchronisation • ./client-www/sync/new phase 5.inc.php Datei von Arbeitsschritt 0 für Client-Synchronisation • ./client-www/sync/config.inc.php Konfiguration für Client-Synchronisation • ./client-www/sync/new phase 0.inc.php Datei von Arbeitsschritt 0 für Client-Synchronisation Brandstätter Andreas, Klaffl Christoph Seite 218von 231 ALFSA KAPITEL 9. ANHANG • ./client-www/sync/new phase 4.inc.php Datei von Arbeitsschritt 4 für Client-Synchronisation • ./client-www/sync/sync functions.inc.php Funktionen für Client-Synchronisation • ./client-www/sync/new phase 3.inc.php Datei von Arbeitsschritt 3 für Client-Synchronisation • ./client-www/sync/index.php Haupdatei für Client-Synchronisation • ./client-www/sync/new phase 2.inc.php Datei von Arbeitsschritt 2 für Client-Synchronisation • ./client-www/conf Datei von Arbeitsschritt 0 für Client-Synchronisation • ./client-www/conf/end.date Datei für Datum der letzen vollständigen Synchronisation • ./client-www/conf/rev.log Datei für Nummer der Revision • ./client-www/conf/settings.inc.php Datei für Client-Einstellungen • ./client-www/conf/sync.phase Datei für Arbeitsschritt der aktuellen Synchronisation Brandstätter Andreas, Klaffl Christoph Seite 219von 231 ALFSA ABBILDUNGSVERZEICHNIS Abbildungsverzeichnis 1.1 1.2 1.3 Struktur der verteilten Datenbank . . . . . . . . . . . . . . . . . . . . . . . . . Strukturplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Korpsabzeichen der Feuerwehren in Österreich . . . . . . . . . . . . . . . . . . 9 11 25 2.1 2.2 2.3 2.4 2.5 Das Filesharing Problem . . . . Das Lock-Modify-Unlock Model Das Copy-Modify-Merge Model SSL Sitzungsaufbau . . . . . . . PHP Funktionsprinzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 38 39 41 46 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 Abhängigkeiten Linear, Ring . . . . . . . . Grundlegende Datenbankstruktur . . . . . wichtige Beziehungen von Atemluftflaschen Grundlegende Struktur von Füllungen . . Tabelle einsatz . . . . . . . . . . . . . . . Server Tabelle . . . . . . . . . . . . . . . . Server Details Tabelle . . . . . . . . . . . Sync Tabelle . . . . . . . . . . . . . . . . . Sequenzdiagramm . . . . . . . . . . . . . . Dateiübersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 . 74 . 74 . 75 . 77 . 81 . 81 . 81 . 108 . 111 6.1 Break-Even-Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 7.1 7.2 Das Firmenlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Das Produktlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 8.1 8.2 8.3 8.4 8.5 8.6 8.7 ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA Erste Synchronisierung Keine Berechtigung . . Nicht registriert . . . . Hauptseite . . . . . . . Hauptseite . . . . . . . Benutzerverwaltung . . Benutzerverwaltung2 . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 135 136 136 137 138 140 Seite 220von 231 ALFSA 8.8 8.9 8.10 8.11 8.12 8.13 8.14 8.15 8.16 8.17 8.18 8.19 8.20 8.21 8.22 8.23 8.24 8.25 8.26 ABBILDUNGSVERZEICHNIS ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA ALFSA Benutzerverwaltung3 . Feuerwehrverwaltung . Feuerwehrverwaltung2 . Fuellstellenverwaltung . Fuellstellenverwaltung2 Clientverwaltung . . . . Clientverwaltung2 . . . Kompressorverwaltung Kompressorverwaltung2 Serverliste . . . . . . . Serververwaltung . . . Serververwaltung2 . . . Konfiguration . . . . . Synchronisieren . . . . Synchronisieren2 . . . . LOGViewer . . . . . . LOGViewer2 . . . . . . Tabellenansicht . . . . Fehlerhafte Eingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 7.1 Tabelle abschnitte . . . . . . . . . . 7.2 Tabelle atemluftflaschen fuellung . . 7.3 Tabelle atemluftflaschen maengel . . 7.4 Tabelle atemluftflaschen . . . . . . . 7.5 Tabelle atemluftflaschen pruefung . . 7.6 Tabelle atemschutzgeraete maengel . 7.7 Tabelle atemschutzgeraete . . . . . . 7.8 Tabelle atemschutzgeraete pruefung . 7.9 Tabelle atemschutzgeraete wartung . 7.10 Tabelle atemschutzmasken maengel 7.11 Tabelle atemschutzmasken . . . . . 7.12 Tabelle atemschutzmasken wartung 7.13 Tabelle benutzer anmeldung . . . . 7.14 Tabelle benutzer . . . . . . . . . . . 7.15 Tabelle benutzer schulung . . . . . 7.16 Tabelle bezirke . . . . . . . . . . . . 7.17 Tabelle client . . . . . . . . . . . . 7.18 Tabelle dienstgrade . . . . . . . . . 7.19 Tabelle einsatz . . . . . . . . . . . . 7.20 Tabelle feuerwehren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 197 198 198 199 199 200 200 201 201 201 202 202 203 204 204 204 204 205 205 Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . Seite 221von 231 ALFSA 7.21 7.22 7.23 7.24 7.25 7.26 7.27 7.28 7.29 7.30 7.31 7.32 7.33 7.34 7.35 7.36 7.37 7.38 7.39 7.40 7.41 7.42 7.43 7.44 7.45 ABBILDUNGSVERZEICHNIS Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle Tabelle fremdflaschen fuellung . . . fremdflaschen . . . . . . . . fuell sitzung . . . . . . . . . fuellstelle . . . . . . . . . . geraetetraeger . . . . . . . . geraetetraeger untersuchung gruppen . . . . . . . . . . . gruppen user . . . . . . . . kompressoren maengel . . . kompressoren . . . . . . . . kompressoren pruefung . . . kompressoren wartung . . . nachrichten gelesen . . . . . nachrichten . . . . . . . . . permission . . . . . . . . . . person kontakt . . . . . . . person . . . . . . . . . . . . person telefon . . . . . . . . schulung . . . . . . . . . . . server details . . . . . . . . server . . . . . . . . . . . . sync . . . . . . . . . . . . . sync server log . . . . . . . sync vorgang . . . . . . . . verbindungskennung . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 206 206 206 206 207 207 207 208 208 209 209 209 210 210 210 211 211 211 212 212 212 212 213 213 Seite 222von 231 ALFSA LISTINGS Listings 2.1 2.2 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18 4.19 4.20 4.21 4.22 4.23 4.24 4.25 4.26 4.27 4.28 4.29 4.30 PHP Syntaxbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JAVA Syntaxbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Systemaktualisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSH Server installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSH Konfiguration: Root Login verbieten . . . . . . . . . . . . . . . . . . . . . SSH Server neustarten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MySQL Datenbankserver installieren . . . . . . . . . . . . . . . . . . . . . . . MySQL Konfiguration: Zugriffe über das Netzwerk erlauben . . . . . . . . . . MySQL Server neustarten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MySQL Konfiguration: Passwort für den administrativen Account (root) setzten Apache2 und PHP5 installieren . . . . . . . . . . . . . . . . . . . . . . . . . . Apache2: Standardmäßigen VirtualHost deaktivieren . . . . . . . . . . . . . . Apache2: VirtualHost konfigurieren . . . . . . . . . . . . . . . . . . . . . . . . Apache2: VirtualHost Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . Apache2: PHP5 aktivieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache2: Konfigurationsdateien neu einlesen . . . . . . . . . . . . . . . . . . . Subversion installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Subversion Konfiguration: Ordnerstruktur anlegen . . . . . . . . . . . . . . . . Subversion Konfiguration: Konfigurationsdateien anlegen . . . . . . . . . . . . Subversion Konfiguration: Benuter-/Passworteintrag generieren . . . . . . . . . Subversion Konfiguration: Benutzer-/Passworteintrag anlegen . . . . . . . . . Subversion Konfiguration: passwd“ Datei . . . . . . . . . . . . . . . . . . . . ” Subversion Konfiguration: users-access-file“ Datei . . . . . . . . . . . . . . . . ” Subversion Konfiguration: Repository anlegen . . . . . . . . . . . . . . . . . . Subversion Konfiguration: Modulkonfiguration für Apache2 . . . . . . . . . . . Subversion Konfiguration: Apache2 Modul aktivieren . . . . . . . . . . . . . . Apache2 Konfiguration neu einlesen . . . . . . . . . . . . . . . . . . . . . . . . Shell Skript für die Syncronisation . . . . . . . . . . . . . . . . . . . . . . . . . SSH Konfiguration: RSA Schlüsselpaar generieren . . . . . . . . . . . . . . . . SSH Konfiguration: Ordnerauflistung .ssh/“ . . . . . . . . . . . . . . . . . . . ” SSH Konfiguration: authorized keys“ Datei . . . . . . . . . . . . . . . . . . . ” SSH Konfiguration: Publi-Key Authentifizierung aktivieren . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph 46 47 58 59 59 60 60 61 61 61 62 63 63 63 64 64 65 65 65 65 66 66 66 67 67 68 68 82 84 84 85 85 Seite 223von 231 ALFSA LISTINGS 4.31 4.32 4.33 4.34 4.35 4.36 4.37 4.38 4.39 4.40 4.41 4.42 4.43 4.44 4.45 4.46 4.47 4.48 4.49 4.50 4.51 4.52 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12 9.13 9.14 9.15 9.16 9.17 9.18 SSH Server neustarten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 SSH Testverbindung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 SSH Konfiguration: Portweiterleitung aktivieren . . . . . . . . . . . . . . . . . 86 SSH Server neustarten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 SSH Porttunnel aufbauen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 SSH Porttunnel testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Funktion zum Erstellen eines Porttunnels . . . . . . . . . . . . . . . . . . . . . 88 Funktion zum Erstellen des RSA Schüsselpaares . . . . . . . . . . . . . . . . . 89 Funktion für die Fehlerhandhabung bei der Syncronisation . . . . . . . . . . . 90 PHP Codeteil zum herausfinden ob ein Port frei ist . . . . . . . . . . . . . . . 92 Funktion zum Auslesen der Primärschlüssel einer Tabelle . . . . . . . . . . . . 92 Funktion zum Auslesen der neuen Datensätze . . . . . . . . . . . . . . . . . . 93 Funktion zum Synchronisieren der Tabellen . . . . . . . . . . . . . . . . . . . . 94 PHP Funktion zum Senden von Daten an der Server und Empfangen von Daten103 Beispiel für einen Verbindungschlüssel . . . . . . . . . . . . . . . . . . . . . . . 106 PHP Code zur Erstellung der Checksumme mit Verbindungschlüssel . . . . . . 106 PHP Code zur Prüfung der Checksumme mit Verbindungschlüssel . . . . . . . 106 PHP Code zur Übertragung des User-Agent . . . . . . . . . . . . . . . . . . . 107 PHP Code zur Prüfung des User-Agent . . . . . . . . . . . . . . . . . . . . . . 107 Grundlegende Verwendung - PHP-Datei . . . . . . . . . . . . . . . . . . . . . 112 Grundlegende Verwendung - Template-Datei . . . . . . . . . . . . . . . . . . . 112 Grundlegende Verwendung - HTML-Ergebnis . . . . . . . . . . . . . . . . . . 113 function add new sync vorgang . . . . . . . . . . . . . . . . . . . . . . . . . . 161 function close sync vorgang . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 function error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 function get db summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 function get rand server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 function get server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 function get servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 function get server page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 function get tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 function get this sync vorgang . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 function lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 function locked . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 function my mysql exceute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 function print reload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 function read end date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 function read phase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 function unlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 function write end date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Brandstätter Andreas, Klaffl Christoph Seite 224von 231 ALFSA 9.19 9.20 9.21 9.22 9.23 9.24 9.25 9.26 9.27 9.28 9.29 9.30 9.31 9.32 9.33 9.34 9.35 9.36 9.37 9.38 9.39 9.40 9.41 9.42 9.43 9.44 9.45 9.46 9.47 9.48 9.49 9.50 9.51 9.52 9.53 9.54 9.55 9.56 9.57 9.58 LISTINGS function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function write phase . . . . . . . . . . . . add client . . . . . . . . . . . . . change client . . . . . . . . . . . get clients . . . . . . . . . . . . . get client details . . . . . . . . . . get next laufnummer . . . . . . . add compressor . . . . . . . . . . change compressor . . . . . . . . del compressor . . . . . . . . . . get compressors . . . . . . . . . . get compressor details . . . . . . get next compressor laufnummer del cronjob . . . . . . . . . . . . . new cronjob . . . . . . . . . . . . read crontab . . . . . . . . . . . . write crontab . . . . . . . . . . . add fuellstelle . . . . . . . . . . . change fuellstelle . . . . . . . . . get fuellstellen . . . . . . . . . . . add fw . . . . . . . . . . . . . . . change fw . . . . . . . . . . . . . get feuerwehren . . . . . . . . . . append to log . . . . . . . . . . . array insert . . . . . . . . . . . . check config . . . . . . . . . . . . check form data . . . . . . . . . . contains only letters . . . . . . . convert spaces to one space . . . error . . . . . . . . . . . . . . . . format data type . . . . . . . . . get abschnitte . . . . . . . . . . . get bezirke . . . . . . . . . . . . . get current dir . . . . . . . . . . . get homedir . . . . . . . . . . . . get svn revision . . . . . . . . . . is ip . . . . . . . . . . . . . . . . is port . . . . . . . . . . . . . . . remove cr lf . . . . . . . . . . . . ping . . . . . . . . . . . . . . . . test mysql . . . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 164 165 165 165 166 166 166 167 167 168 168 168 168 169 169 169 169 169 170 170 171 171 171 171 172 172 172 172 172 173 173 173 173 174 174 174 174 174 175 Seite 225von 231 ALFSA 9.59 9.60 9.61 9.62 9.63 9.64 9.65 9.66 9.67 9.68 9.69 9.70 9.71 9.72 9.73 9.74 9.75 9.76 9.77 9.78 9.79 9.80 9.81 9.82 9.83 9.84 9.85 9.86 9.87 9.88 9.89 9.90 9.91 9.92 9.93 9.94 9.95 9.96 9.97 9.98 LISTINGS function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function function test ssh . . . . . . . . . . . . . check permissions . . . . . . . is assoc . . . . . . . . . . . . . update config . . . . . . . . . add authorized key . . . . . . add known host . . . . . . . . add server . . . . . . . . . . . check authorized key . . . . . check known host . . . . . . . create rsa key . . . . . . . . . create tunnel . . . . . . . . . del authorized key . . . . . . del server . . . . . . . . . . . get rsa key . . . . . . . . . . . get server . . . . . . . . . . . read authorized keys . . . . . read known hosts . . . . . . . setup authorized keys . . . . . update server . . . . . . . . . update server config . . . . . calc level . . . . . . . . . . . . check if inkonsistent . . . . . check if table exists . . . . . . check lock file . . . . . . . . . clean up . . . . . . . . . . . . create table . . . . . . . . . . create table extended . . . . . del lock file . . . . . . . . . . del sync . . . . . . . . . . . . first sync . . . . . . . . . . . . format string for html console get all tables . . . . . . . . . . get new data . . . . . . . . . get primary keys . . . . . . . get table levels . . . . . . . . get table structure . . . . . . get temporary sync tables . . output . . . . . . . . . . . . . read sync date . . . . . . . . . set fk off . . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 175 175 175 176 176 176 177 177 177 177 178 178 178 178 179 179 179 179 179 180 180 180 180 181 181 181 181 182 182 182 182 182 183 183 183 183 184 184 184 Seite 226von 231 ALFSA 9.99 function 9.100function 9.101function 9.102function 9.103function 9.104function 9.105function 9.106function 9.107function 9.108function 9.109function 9.110function 9.111function 9.112function 9.113function 9.114function 9.115function 9.116function 9.117function 9.118function 9.119function 9.120function 9.121function 9.122function 9.123function 9.124function 9.125function 9.126function 9.127function 9.128function 9.129function 9.130function 9.131function 9.132function 9.133function 9.134function 9.135function 9.136function 9.137function 9.138function LISTINGS set fk on . . . . . . . . . . set lock file . . . . . . . . sort tables after levels . . sync error . . . . . . . . . sync table . . . . . . . . . update sync date . . . . . update table levels . . . . update table structure . . get cpuclock . . . . . . . . get cpupercent . . . . . . . get date . . . . . . . . . . get diskspace . . . . . . . get distri . . . . . . . . . . get ip . . . . . . . . . . . . get netstats . . . . . . . . get ram . . . . . . . . . . get server status . . . . . . get swap . . . . . . . . . . get temperature . . . . . . get uptime . . . . . . . . . add user . . . . . . . . . . change user . . . . . . . . check cookie passwd hash del user . . . . . . . . . . get alias for permission . . get available areas . . . . get available permissions . get dienstgrade . . . . . . get fwnr and stbnr . . . . get permissions . . . . . . get username . . . . . . . get users . . . . . . . . . . get user details . . . . . . isloggedon . . . . . . . . . is admin . . . . . . . . . . login . . . . . . . . . . . . logout . . . . . . . . . . . set permissions . . . . . . new draw table . . . . . . append to log . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 184 185 185 185 186 186 186 186 186 187 187 187 187 187 188 188 188 188 188 188 189 189 190 190 190 190 190 191 191 191 191 191 192 192 192 192 193 193 193 Seite 227von 231 ALFSA 9.139function error . . . . . . . . . . . . . . 9.140function get filename of cache file . . . 9.141function get primary keys . . . . . . . 9.142function get referenced tables . . . . . 9.143function get referenced tables recursive 9.144function get right client . . . . . . . . 9.145function get tables . . . . . . . . . . . 9.146function my extract . . . . . . . . . . . 9.147function read cache data . . . . . . . . 9.148function write cache data . . . . . . . . 9.149constructor function Template . . . . . 9.150function display . . . . . . . . . . . . . 9.151function get html . . . . . . . . . . . . 9.152function process . . . . . . . . . . . . . 9.153function read diff page . . . . . . . . . 9.154function set . . . . . . . . . . . . . . . 9.155function set html . . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph LISTINGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 194 194 194 194 194 195 195 195 195 196 196 196 196 196 197 197 Seite 228von 231 ALFSA TABELLENVERZEICHNIS Tabellenverzeichnis 1.1 1.2 1.3 Zeitplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arbeitskalender von Brandstätter Andreas . . . . . . . . . . . . . . . . . . . . Arbeitskalender von Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . 10 13 15 4.1 Unixzeit-Darstellungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.1 6.2 6.3 6.4 Hardware . . . . . Miete und Diverses Arbeitszeit . . . . . Fixkosten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Brandstätter Andreas, Klaffl Christoph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 121 121 121 Seite 229von 231 ALFSA LITERATURVERZEICHNIS Literaturverzeichnis [1] Netcraft. Online im Internet: http://news.netcraft.com/archives/web server survey.html, 2008-05-08 [2] Subversion. Online im Internet: http://www.sable.mcgill.ca/∼hendren/303/Slides/Subversion/subversion.html, 2008-05-08 [3] Computer Language Benchmarks Game. Online im Internet: http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=php, 2008-05-08 [4] PHP Handbuch. Online im Internet: http://at.php.net/manual/de/intro.curl.php, 2008-05-08 [5] NTP Pool project. Online im Internet: http://www.pool.ntp.org/zone/europe, 2008-05-08 [6] Wikipedia - General Public License. Online im Internet: http://de.wikipedia.org/wiki/Gpl, 2008-05-10 [7] Online im Internet: http://mitschang.net/download/IESE-Report%2058.pdf, 2008-05-08 [8] Online im Internet: http://www.patentstorm.us/patents/6957432-description.html, 2008-05-08 [9] Online im Internet: http://www.golem.de/0804/59322.html, 2008-05-08 [10] Interschutz. Online im Internet: http://www.interschutz.de/, 2008-05-11 [11] Retter. Online im Internet: http://www.rettermesse.at/, 2008-05-11 [12] wax.at. Online im Internet: http://www.wax.at/modules.php?name=News&file=article&sid=6098, 2008-05-11 [13] Bohmann. Online im Internet: http://www.bohmann.at/templates/index.cfm/id/2906, 2008-05-11 [14] wax.at. Online im Internet: http://www.wax.at/, 2008-05-11 Brandstätter Andreas, Klaffl Christoph Seite 230von 231 ALFSA LITERATURVERZEICHNIS [15] fireworld.at. Online im Internet: http://www.fireworld.at, 2008-05-11 [16] Tometa Software. Online im Internet: http://www.tometasoftware.com/MySQL-5-vs-Microsoft-SQL-Server-2005.asp, 2008-05-12 [17] Tometa Software. Online im Internet: http://www.tometasoftware.com/MySQL-vs-PostgreSQL.asp, 2008-05-12 [18] MySQL Development. http://dev.mysql.com/doc/refman/5.1/de/multi-computer.html, 2008-05-13 [19] MySQL Development. http://dev.mysql.com/doc/refman/5.1/de/mysql-cluster-limitations.html, 2008-05-13 [20] PHP Funktionsreferenz. Online im Internet: http://at2.php.net/mysql real escape string, 2008-05-13 [21] xkcd. Online im Internet: http://xkcd.com/327/?gao, 2008-05-13 [22] Wikipedia - fork. Online im Internet: http://de.wikipedia.org/wiki/Fork, 2008-05-13 [23] Wikipedia - POSIX. Online im Internet: http://de.wikipedia.org/wiki/POSIX, 2008-05-13 [24] Elektronik-Kompendium - OSI-7-Schichten-Modell. Online im Internet: http://www.elektronik-kompendium.de/sites/kom/0301201.htm, 2008-05-13 [25] Winquadrat - Microsoft SQL Server. Online im Internet: http://www.winquadrat.de/index.php?mssql, 2008-05-13 [26] Elektronik-Kompendium - Load Balancer. Online im Internet: http://www.elektronik-kompendium.de/sites/net/0904131.htm, 2008-05-13 Brandstätter Andreas, Klaffl Christoph Seite 231von 231