anhand von Beispielen aus den Bereichen der Netzw
Transcription
anhand von Beispielen aus den Bereichen der Netzw
Automatisiertes Übersetzen und Installieren freier quelloffener Programme . . . anhand von Beispielen aus den Bereichen der Netzwerküberwachung und -analyse. Niki W. Waibel 29. Dezember 2006 Copyright © 2005, 2006 Niki W. Waibel Permission is granted to copy, distribute and / or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”. Copyright © 2005, 2006 Niki W. Waibel Dieses Dokument darf unter den Bedingungen der GNU Free Documentation License, Version 1.2 oder einer späteren, von der Free Software Foundation veröffentlichten Version, ohne unveränderliche Abschnitte, ohne Vorderseitentext und ohne Rückseitentext kopiert, verteilt und / oder verändert werden. Eine Kopie der Lizenz ist in dem Abschnitt enthalten, der mit GNU ” Free Documentation License“ betitelt ist. Zusammenfassung Um die komplexer werdenden, computergestützten IT1 -Infrastrukturen zu analysieren und zu überwachen macht es Sinn elektronische Hilfsmittel zu verwenden. Diese Diplomarbeit führt anhand einer Übersicht über freie quelloffene, für diesen Zweck geeignete Software in die Thematik ein. Die Funktionsweise der verschiedenen Programme wird erläutert und dargestellt. Ein eigenes Kapitel befasst sich mit dem Übersetzen des Quellcodes freier Software und dessen Installation. Die notwendigen Hilfsmittel werden beschrieben und ein Programm wird vorgestellt, welches die Arbeitsschritte drastisch vereinfacht. Die Übersetzung und Installation der vorgestellten Analyse- und Überwachungsprogramme wird erläutert. 1 Informationstechnik (de) / Information technology (en) [47] Inhaltsverzeichnis Inhaltsverzeichnis i Listingverzeichnis vii Abbildungsverzeichnis xi Tabellenverzeichnis xiii Vorwort Eidesstattliche Erklärung / Declaration of Urheberrecht / Copyright . . . . . . . . . . Motivation . . . . . . . . . . . . . . . . . Dank . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 2 1 Einleitung 1.1 Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Konventionen . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 4 2 Software 2.1 Tcpdump . . . . . 2.2 Wireshark . . . . . 2.3 Nmap . . . . . . . 2.4 Arpwatch-NG . . . 2.5 Snort . . . . . . . . 2.6 Collectd . . . . . . 2.7 Cacti . . . . . . . . 2.8 Zabbix . . . . . . . 2.9 Nagios . . . . . . . 2.10 Nessus . . . . . . . 2.11 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Oath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6 8 11 13 14 16 17 17 18 19 23 INHALTSVERZEICHNIS 3 Kompilieren 25 3.1 fbuild – Allgemeines . . . . . . . . . . . . . . . . . . . . . . . 30 3.2 fbuild – Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . 31 3.3 fbuild – Im Detail . . . . . . . . . . . . . . . . . . . . . . . . 32 3.3.1 Programmstart, Informationen und Variablen . . . . . 32 3.3.2 Hilfsfunktionen . . . . . . . . . . . . . . . . . . . . . . 33 3.3.3 Hauptfunktionen . . . . . . . . . . . . . . . . . . . . . 37 3.3.4 Standardfunktionen . . . . . . . . . . . . . . . . . . . 38 3.3.5 Hauptprogramm . . . . . . . . . . . . . . . . . . . . . 39 3.3.6 Verknüpfungen . . . . . . . . . . . . . . . . . . . . . . 47 3.4 fbuild – Die Arbeitsweise . . . . . . . . . . . . . . . . . . . . 49 3.5 fbuild – Die fbuild-Dateien . . . . . . . . . . . . . . . . . . . . 52 3.6 fbuild – Erweiterungen . . . . . . . . . . . . . . . . . . . . . . 53 4 Anwendung 4.1 4.2 4.3 4.4 57 Entwicklungssystem . . . . . . . . . . . . . . . . . . . . . . . 57 4.1.1 sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.1.2 find (findutils) . . . . . . . . . . . . . . . . . . . . . . 59 4.1.3 gzip oder gzcat . . . . . . . . . . . . . . . . . . . . . . 60 4.1.4 tar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.1.5 fbuild.conf . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.1.6 fbuild.sh (Solaris Linker) . . . . . . . . . . . . . . . . 61 4.1.7 fbuild-Pakete . . . . . . . . . . . . . . . . . . . . . . . 62 4.1.8 Assembler und Linker (binutils) . . . . . . . . . . . . . 62 4.1.9 Compiler (gcc) . . . . . . . . . . . . . . . . . . . . . . 63 4.1.10 fbuild-Pakete mit GNU-Compiler, -Assembler und Linker . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Tcpdump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.2.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 64 4.2.2 Kompilieren und Installieren . . . . . . . . . . . . . . 65 Wireshark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.3.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 67 4.3.2 Kompilieren und Installieren . . . . . . . . . . . . . . 67 Nmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.4.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 69 4.4.2 Kompilieren und Installieren . . . . . . . . . . . . . . 69 ii INHALTSVERZEICHNIS 4.5 Arpwatch-NG . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.5.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 70 4.5.2 Kompilieren und Installieren . . . . . . . . . . . . . . 70 Snort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.6.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 71 4.6.2 Kompilieren und Installieren . . . . . . . . . . . . . . 71 Collectd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.7.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 73 4.7.2 Kompilieren und Installieren . . . . . . . . . . . . . . 73 Cacti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.8.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 74 4.8.2 Kompilieren und Installieren . . . . . . . . . . . . . . 74 Zabbix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.9.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 75 4.9.2 Kompilieren und Installieren . . . . . . . . . . . . . . 76 4.9.2.1 zabbix-frontend . . . . . . . . . . . . . . . . 76 4.9.2.2 zabbix-server . . . . . . . . . . . . . . . . . . 77 4.9.2.3 zabbix-agent . . . . . . . . . . . . . . . . . . 78 4.10 Nagios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.10.1 Abhängigkeiten . . . . . . . . . . . . . . . . . . . . . . 78 4.10.2 Kompilieren und Installieren . . . . . . . . . . . . . . 79 4.10.2.1 nagios . . . . . . . . . . . . . . . . . . . . . . 79 4.10.2.2 nagios-plugins . . . . . . . . . . . . . . . . . 80 4.6 4.7 4.8 4.9 A Literaturverzeichnis 91 iii INHALTSVERZEICHNIS B Listings – fbuild B.1 fbuild.sh . . . . . . . . . . . B.2 helloworld.c . . . . . . . . . B.3 helloworld.s . . . . . . . . . B.4 helloworld.bincode . . . . . B.5 autoconf-2.61.fbuild . . . . B.6 automake-1.10.fbuild . . . . B.7 bison-2.3.fbuild . . . . . . . B.8 bzip2-1.0.3-r1.fbuild . . . . B.9 coreutils-6.6.fbuild . . . . . B.10 diffutils-2.8.7.fbuild . . . . . B.11 expat-2.0.0.fbuild . . . . . . B.12 flex-2.5.33.fbuild . . . . . . B.13 fontconfig-2.4.2.fbuild . . . B.14 freetype-2.2.1.fbuild . . . . B.15 gd-2.0.33.fbuild . . . . . . . B.16 gettext-0.16.1.fbuild . . . . B.17 glib-2.12.4.fbuild . . . . . . B.18 grep-2.5.1a.fbuild . . . . . . B.19 indent-2.2.9.fbuild . . . . . B.20 jpeg-6b-r4.fbuild . . . . . . B.21 libart lgpl-2.3.17.fbuild . . . B.22 libdnet-1.10.fbuild . . . . . B.23 libiconv-1.11.fbuild . . . . . B.24 libpcap-0.9.5.fbuild . . . . . B.25 libpng-1.2.14.fbuild . . . . . B.26 libtool-1.5.22.fbuild . . . . . B.27 m4-1.4.8.fbuild . . . . . . . B.28 mysql-5.0.27.fbuild . . . . . B.29 ncurses-5.5-20060603.fbuild B.30 net-snmp-5.1.3.1.fbuild . . . B.31 openssl-0.9.8d.fbuild . . . . B.32 pcre-6.7.fbuild . . . . . . . . B.33 pkgconfig-0.19.fbuild . . . . B.34 readline-5.2.fbuild . . . . . . B.35 rrdtool-1.2.15.fbuild . . . . B.36 sed-4.1.5.fbuild . . . . . . . B.37 zlib-1.2.3-r1.fbuild . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 97 114 114 115 116 116 117 117 117 118 119 119 119 120 120 121 121 122 122 123 123 123 124 124 125 125 126 126 127 128 128 130 131 131 132 132 133 INHALTSVERZEICHNIS C Listings – patches 135 C.1 flex-2.5.33-isatty.patch . . . . . . . . . . . . . . . . . . . . . . 135 C.2 freetype-2-enable bci.patch . . . . . . . . . . . . . . . . . . . 136 C.3 glib-2.12.4-timer.diff . . . . . . . . . . . . . . . . . . . . . . . 137 C.4 indent-2.2.9-deb-gentoo.patch . . . . . . . . . . . . . . . . . . 137 C.5 indent-2.2.9-malloc.patch . . . . . . . . . . . . . . . . . . . . 139 C.6 jpeg-6b-freebsd.patch . . . . . . . . . . . . . . . . . . . . . . . 140 C.7 jpeg-6b-gentoo.patch . . . . . . . . . . . . . . . . . . . . . . . 140 C.8 libdnet-1.10-gcc4.diff . . . . . . . . . . . . . . . . . . . . . . . 141 C.9 libpcap-0.8.1-fPIC.patch . . . . . . . . . . . . . . . . . . . . . 141 C.10 mysql-5.0.27.nww.patch . . . . . . . . . . . . . . . . . . . . . 142 C.11 openssl-0.9.8b-parallel-build.patch . . . . . . . . . . . . . . . 142 D GNU Free Documentation License v 145 vi Listingverzeichnis Software 5 2.1 Tcpdump: normale Ausgabe . . . . . . . . . . . . . . . . . . . 7 2.2 Tcpdump: komplette Dekodierung . . . . . . . . . . . . . . . 7 2.3 Ping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4 Wireshark: normale Ausgabe . . . . . . . . . . . . . . . . . . 9 2.5 Wireshark: komplette Dekodierung . . . . . . . . . . . . . . . 9 2.6 Nmap: Anwendungsbeispiel . . . . . . . . . . . . . . . . . . . 13 2.7 Nmap: Datei scan1-scan2.diff . . . . . . . . . . . . . . . . . . 13 2.8 Arpwatch-NG . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Kompilieren 25 3.1 Konfigurieren, kompilieren und installieren, einfachster Fall . 26 3.2 Installationspfade, -dateien und -verknüpfungen . . . . . . . . 28 3.3 fbuild-Paketbeschreibungsdatei . . . . . . . . . . . . . . . . . 29 3.4 Konfigurieren, kompilieren und installieren mit fbuild.sh . . . 30 3.5 fbuild-Verzeichnisstruktur und -Dateien . . . . . . . . . . . . 31 3.6 Verwendung von deps . . . . . . . . . . . . . . . . . . . . . . 32 3.7 fbuild.sh – Ausgabe der Variablen 50 vii . . . . . . . . . . . . . . . LISTINGVERZEICHNIS Anwendung 57 4.1 Kompilieren und installieren von sed-4.1.5 ohne fbuild . . . . 59 4.2 Kompilieren und installieren von find-4.3.2 ohne fbuild . . . . 60 4.3 Kompilieren und installieren von gzip-1.3.6 ohne fbuild . . . . 60 4.4 Kompilieren und installieren von tar-1.16 ohne fbuild . . . . . 61 4.5 fbuild.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.6 fbuild-solaris-ld.diff . . . . . . . . . . . . . . . . . . . . . . . . 62 4.7 fbuild-Pakete . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.8 Assembler und Linker (binutils) . . . . . . . . . . . . . . . . . 63 4.9 Compiler (gcc) . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.10 fbuild-Pakete mit GNU-Compiler, -Assembler und -Linker . . 64 4.11 Abhängigkeiten von Tcpdump . . . . . . . . . . . . . . . . . . 64 4.13 Abhängigkeiten von tshark . . . . . . . . . . . . . . . . . . . 67 4.15 Abhängigkeiten von Nmap . . . . . . . . . . . . . . . . . . . . 69 4.17 Abhängigkeiten von Arpwatch-NG . . . . . . . . . . . . . . . 70 4.19 Abhängigkeiten von Snort . . . . . . . . . . . . . . . . . . . . 71 4.21 Abhängigkeiten von Collectd . . . . . . . . . . . . . . . . . . 73 4.23 Abhängigkeiten von Cacti . . . . . . . . . . . . . . . . . . . . 74 4.25 Abhängigkeiten von zabbix-frontend . . . . . . . . . . . . . . 75 4.26 Abhängigkeiten von zabbix-server . . . . . . . . . . . . . . . . 76 4.27 Abhängigkeiten von zabbix-agent . . . . . . . . . . . . . . . . 76 4.31 Abhängigkeiten von nagios . . . . . . . . . . . . . . . . . . . 78 4.32 Abhängigkeiten von nagios-plugins . . . . . . . . . . . . . . . 79 4.12 tcpdump-3.9.5.fbuild . . . . . . . . . . . . . . . . . . . . . . . 81 4.14 tshark-0.99.4.fbuild . . . . . . . . . . . . . . . . . . . . . . . . 82 4.16 nmap-4.20.fbuild . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.18 arpwatch-ng-1.5.fbuild . . . . . . . . . . . . . . . . . . . . . . 83 4.20 snort-2.6.1.1.fbuild . . . . . . . . . . . . . . . . . . . . . . . . 84 4.22 collectd-3.10.3.fbuild . . . . . . . . . . . . . . . . . . . . . . . 85 4.24 cacti-0.8.6i.fbuild . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.28 zabbix-frontend-1.1.4.fbuild . . . . . . . . . . . . . . . . . . . 86 4.29 zabbix-server-1.1.4.fbuild . . . . . . . . . . . . . . . . . . . . . 87 4.30 zabbix-agent-1.1.4.fbuild . . . . . . . . . . . . . . . . . . . . . 88 4.33 nagios-2.6.fbuild . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.34 nagios-plugins-1.4.5.fbuild . . . . . . . . . . . . . . . . . . . . 90 viii LISTINGVERZEICHNIS Listings – fbuild B.1 fbuild.sh . . . . . . . . . . . B.2 helloworld.c . . . . . . . . . B.3 helloworld.s . . . . . . . . . B.4 helloworld.bincode . . . . . B.5 autoconf-2.61.fbuild . . . . B.6 automake-1.10.fbuild . . . . B.7 bison-2.3.fbuild . . . . . . . B.8 bzip2-1.0.3-r1.fbuild . . . . B.9 coreutils-6.6.fbuild . . . . . B.10 diffutils-2.8.7.fbuild . . . . . B.11 expat-2.0.0.fbuild . . . . . . B.12 flex-2.5.33.fbuild . . . . . . B.13 fontconfig-2.4.2.fbuild . . . B.14 freetype-2.2.1.fbuild . . . . B.15 gd-2.0.33.fbuild . . . . . . . B.16 gettext-0.16.1.fbuild . . . . B.17 glib-2.12.4.fbuild . . . . . . B.18 grep-2.5.1a.fbuild . . . . . . B.19 indent-2.2.9.fbuild . . . . . B.20 jpeg-6b-r4.fbuild . . . . . . B.21 libart lgpl-2.3.17.fbuild . . . B.22 libdnet-1.10.fbuild . . . . . B.23 libiconv-1.11.fbuild . . . . . B.24 libpcap-0.9.5.fbuild . . . . . B.25 libpng-1.2.14.fbuild . . . . . B.26 libtool-1.5.22.fbuild . . . . . B.27 m4-1.4.8.fbuild . . . . . . . B.28 mysql-5.0.27.fbuild . . . . . B.29 ncurses-5.5-20060603.fbuild B.30 net-snmp-5.1.3.1.fbuild . . . B.31 openssl-0.9.8d.fbuild . . . . B.32 pcre-6.7.fbuild . . . . . . . . B.33 pkgconfig-0.19.fbuild . . . . B.34 readline-5.2.fbuild . . . . . . B.35 rrdtool-1.2.15.fbuild . . . . B.36 sed-4.1.5.fbuild . . . . . . . B.37 zlib-1.2.3-r1.fbuild . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 97 114 114 115 116 116 117 117 118 118 119 119 120 120 120 121 121 122 122 123 123 123 124 124 125 125 126 126 127 128 129 130 131 132 132 132 133 LISTINGVERZEICHNIS Listings – patches 135 C.1 flex-2.5.33-isatty.patch . . . . . . . . . . . . . . . . . . . . . . 135 C.2 freetype-2-enable bci.patch . . . . . . . . . . . . . . . . . . . 136 C.3 glib-2.12.4-timer.diff . . . . . . . . . . . . . . . . . . . . . . . 137 C.4 indent-2.2.9-deb-gentoo.patch . . . . . . . . . . . . . . . . . . 137 C.5 indent-2.2.9-malloc.patch . . . . . . . . . . . . . . . . . . . . 139 C.6 jpeg-6b-freebsd.patch . . . . . . . . . . . . . . . . . . . . . . . 140 C.7 jpeg-6b-gentoo.patch . . . . . . . . . . . . . . . . . . . . . . . 140 C.8 libdnet-1.10-gcc4.diff . . . . . . . . . . . . . . . . . . . . . . . 141 C.9 libpcap-0.8.1-fPIC.patch . . . . . . . . . . . . . . . . . . . . . 141 C.10 mysql-5.0.27.nww.patch . . . . . . . . . . . . . . . . . . . . . 142 C.11 openssl-0.9.8b-parallel-build.patch . . . . . . . . . . . . . . . 142 x Abbildungsverzeichnis Software 5 2.1 Tcpdump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2 Nmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3 Collectd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.4 Nagios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.5 Nessus: Report des Clients . . . . . . . . . . . . . . . . . . . . 21 2.6 Nessus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 xi xii Tabellenverzeichnis Software 5 2.1 Zusammenfassung, Art und Weise . . . . . . . . . . . . . . . 23 2.2 Zusammenfassung, Art der Rückmeldungen . . . . . . . . . . 24 Kompilieren 25 3.1 fbuild.sh Variablendetails (1) . . . . . . . . . . . . . . . . . . 41 3.2 fbuild.sh Variablendetails (2) . . . . . . . . . . . . . . . . . . 42 3.3 fbuild.sh Variablendetails (3) . . . . . . . . . . . . . . . . . . 43 3.4 fbuild.sh Variablendetails (4) . . . . . . . . . . . . . . . . . . 45 3.5 fbuild.sh Installationsvariablen . . . . . . . . . . . . . . . . . 49 3.6 fbuild.sh Verzeichnisvariablen . . . . . . . . . . . . . . . . . . 50 3.7 fbuild.sh Programmvariablen . . . . . . . . . . . . . . . . . . 51 3.8 fbuild.sh USE-Variablen . . . . . . . . . . . . . . . . . . . . . 52 xiii xiv Vorwort Eidesstattliche Erklärung / Declaration of Oath Der Autor erklärt, dass er die vorliegende Diplomarbeit selbstständig angefertigt hat. Zur Diplomarbeit benutzte er keine anderen als die angegebenen Quellen und Hilfsmittel. Alle wörtlich oder sinngemäß übernommenen Stellen sind gekennzeichnet. The author declares that this diploma was written by himself. No other then the indicated sources and aids were used writing this diploma. All parts which have been taken over, either literally or in a general manner, are accordingly indicated. ..................................... Niki W. Waibel Urheberrecht / Copyright Dieses Dokument darf unter den Bedingungen der GNU Free Documentation License, Version 1.2 vom November 2002 verbreitet werden. Eine englischsprachige und somit rechtlich gültige Version der Lizenz ist im Anhang D auf Seite 145 zu finden. Permission to distribute this document under the terms of the GNU Free Documentation License, Version 1.2, November 2002 is granted. The license can be found at Anhang D on page 145. 1 VORWORT Motivation Nach 8 Jahren praktischer Erfahrung in der Arbeitswelt ist es für den Autor an der Zeit ein Projekt mit pädagogischem Hintergrund zu starten. Es soll deshalb öffentlich und ohne Einschränkungen von jedermann verwendet werden dürfen. Ob als Lehrmittel oder auch im praktischen Einsatz. Dank Besonderer Dank gilt folgenden Personen: Bettina Waibel für die unendliche Geduld und somit der Unterstützung meiner Hobbys und dieser Arbeit. Meinen Eltern Renate und Artur Waibel, die mich viele Jahre begleitet, das Wichtigste gelehrt und zum richtigen Zeitpunkt losgelassen haben. Meinen Arbeitskollegen besonders Günther Sohler, Markus Madlener, Cormac Tiernan und den Ferialpraktikannten, die mich mit ihren Fragen, Vorschlägen und Lösungen täglich fordern und motivieren. Meinen ehemaligen Lehrern und Professoren für ihr bemühen Wissen und Information weiterzugeben. Besonders Prof. Dipl. Ing. Dr. Roland Sandholzer, Prof. Dipl. Ing. Otto Jagschitz und Dipl. Ing. Leopold Mosbrugger. Donald E. Knuth für TEX, sein geniales Programm zum Setzen von Text und mathematischen Formeln. Leslie Lamport für LATEX, die beste Erweiterung zu TEX in der diese Arbeit verfasst wurde. Thomas Esser für teTEX, seiner Zusammenstellung aller wichtigen Programme rund um LATEX, mit denen diese Arbeit in eine druckreife Form gebracht werden konnte. Bram Moolenaar und allen anderen für Vim , dem Editor in dem diese Arbeit geschrieben wurde. Alexander Larsson, Hans Breuer, Lars R. Clausen und den vielen anderen Entwicklern für Dia, das Programm mit dem die Diagramme dieser Arbeit erstellt wurden. Den Wissenschaftlern besonders Albert Einstein, Stephen W. Hawking, Richard J. Gott, Harald Fritzsch und Anton Zeilinger für ihre interessante Literatur und ihre Werke. 2 Kapitel 1 Einleitung Diese Arbeit befasst sich mit zwei Themen die in der Arbeitswelt des Autors besonders im Vordergrund stehen. Zum einen ist dies die Notwendigkeit komplexe IT[47]-Infrastrukturen zu überwachen und gegebenenfalls zu analysieren bzw. zu scannen. In Kapitel 2 auf Seiten 5–23 werden Analyse- und Überwachungsprogramme vorgestellt. Zum anderen müssen den Benutzern1 verschiedenste Hilfsprogramme zur Verfügung gestellt werden, die ständig – genau wie auch die Überwachungs- und Analyseprogramme – auf aktuellem Stand gehalten werden sollen. Der Autor ist hauptsächlich für UNIX[57]-Netzwerke verantwortlich, die verschiedene Betriebssysteme in unterschiedlichen Versionen auf verschiedensten Rechnern enthalten. Auch diese müssen auf aktuellstem Stand gehalten werden und sollen dabei die zusätzlich installierten Programme nicht beeinflussen. Besonderes Augenmerk wird auf Sicherheit gelegt. Programme, welche zusätzlich zum Betriebssystem zur Verfügung gestellt werden, werden vom Autor in der Regel vom Quellcode aus übersetzt und optimiert, um danach in einer speziellen Form installiert zu werden. Diese ermöglicht es verschiedene Versionen des Programms gleichzeitig installiert zu haben und gegebenenfalls auf eine beliebige Version (zurück) zu wechseln. Da der Autor keine existierende Lösung zur Automatisierung des Übersetzens und Installierens der Programme gefunden hat (welche seinen Anforderungen entsprach), hat er ein eigenes Programm entwickelt und veröffentlicht. Dieses wird in Kapitel 3 auf Seiten 25–55 vorgestellt und ist unter Listing B.1 auf Seite 97 aufgelistet. Das komplette Projekt wird öffentlich unter [14] entwickelt. Die aktuellste Version ist dort zu finden. Kapitel 4 auf Seiten 57–80 befasst sich mit der Anwendung des in Kapitel 3 vorgestellten Programms anhand der in Kapitel 2 vorgestellten Programme. 1 hier sind die Benutzer / Anwender von Rechnern / Computern gemeint 3 1.1. VORAUSSETZUNGEN 1.1 KAPITEL 1. EINLEITUNG Voraussetzungen Es wird vorausgesetzt, dass der Leser dieser Arbeit Grundkenntnisse im Umgang mit UNIX[57]-Systemen2 besitzt. Der Leser soll mit der Kommandozeile umgehen können, er muss aber nicht jeden Befehl im Detail beherrschen. Der Leser soll ein Basiswissen im Bereich TCP[54] / IP[46] und Netzwerke besitzen und verstehen wie Rechner oder Geräte im Netzwerk miteinander verbunden werden können. Erfahrungen im Bereich des Übersetzens von Quellcode mit Hilfe von Compilern, Umgang mit existierenden Build-Systemen3 und / oder Kenntnisse der auto*-tools4 sind von Vorteil, jedoch nicht Voraussetzung für das Verständnis dieser Arbeit. Die vorliegende Arbeit enthält Verweise zu Erklärungen von Begriffen, über das Literaturverzeichnis, auf Wikipedia[39] Internet Seiten. Damit soll auch Lesern mit wenig Erfahrung in den oben genannten Bereichen ermöglicht werden diese Arbeit zu verstehen. Lesern mit mehr Erfahrung sollen die Verweise als detaillierte Informationsquelle dienen und zur weiteren Recherche anregen. Allen Verweisen zu Seiten im Internet ist ein Datum hinzugefügt, welches den Tag des letzten Zugriffs des Autors angibt. 1.2 Konventionen Folgende typografische Konventionen werden in dieser Arbeit verwendet: Geneigt: Spezielle Dateien. Zum Beispiel: Makefile, configure.ac. Fett und kursiv: Für Programmpakete, welche entweder den Quellcode eines Programms oder einer Programmbibliothek (welcher meist in einem Archiv zusammengefasst ist) enthalten, oder, welche Installationsprogramme enthalten, die alle Dateien und Informationen generieren um das Programm zu installieren und starten zu können. Zum Beispiel: OpenSSL , zlib . Serifenlos: Für Pfade und Verzeichnisse. Zum Beispiel: /usr/local/bin, /misc/ sparc-sun-solaris2.10/opt/. Serifenlos und geneigt: Für Funktionen in Programmen und Bibliotheken. Zum Beispiel: acos(), function def makeinstall (). Maschinenschrift und geneigt: Für Befehle der Kommandozeile. Zum Beispiel: nmap --version , openssl . 2 oder UNIX-artigen System wie z. B. Linux z. B. : ebuild, RPM, dpkg, . . . 4 autoconf, automake, libtool [38] 3 4 Kapitel 2 Software Es gibt eine sehr große Auswahl an freier quelloffener Software im Bereich der Netzwerkanalyse und -überwachung. Um einen Überblick zu schaffen werden im Folgenden einige ausgewählte1 Programme vorgestellt, (wenn möglich oder nötig) miteinander verglichen und deren Arbeitsweise erläutert. Das Projekt Gentoo 2 soll hier nicht unerwähnt bleiben. Am 22. Dezember 2005 wurden 205 Programme im Verzeichnis net-analyzer (Netzwerkanalyse) aufgelistet. Für den Autor war diese Übersicht bei der Auswahl der folgenden Softwarepakete eine große Hilfe. Allerdings sollen auch Programme die (noch) nicht im Gentoo-Projekt enthalten sind betrachtet werden. Bei den ersten drei Softwarepaketen (Tcpdump , Wireshark , Nmap ) handelt es sich um interaktiv und direkt vom Benutzer aufzurufende Programme. Die Ausgabe erfolgt in der Regel direkt auf der Kommandozeile. Die nächsten zwei Pakete (Arpwatch-NG , Snort ) beinhalten Programme um den Netzwerkverkehr zu analysieren. Sie arbeiten im Hintergrund, ohne zutun eines Anwenders. Die folgenden vier Pakete (Collectd , Cacti , Zabbix , Nagios ) analysieren diverse Systemdaten bzw. -zustände. Sie sind mit unterschiedlichsten Überwachungsfunktionen ausgestattet. Das letzte hier vorgestellte Softwarepaket (Nessus ) ist ein Spezialfall, da der Quellcode seit kurzem nicht mehr vorhanden ist. Diese Software kann somit auch nicht mehr in Kapitel 4 betrachtet werden. Trotz allem findet der Autor diese Kategorie von Überwachungssoftware sehr wichtig und er möchte das Programm in diesem Kapitel vorstellen. Es handelt sich hierbei um ein Paket, welches direkt und aktiv nach Sicherheitslücken sucht. 1 der Autor hat versucht ein breites Spektrum an möglichst verschiedenen Programmen auszuwählen 2 Gentoo[6], eine Linux Distribution die sich zum Ziel gesetzt hat alle Programme nicht als fertig übersetzte Pakete zu liefern, sondern diese vor dem Installieren aus dem Quellcode (optimiert und angepasst an das jeweilige System) direkt zu übersetzen. 5 2.1. TCPDUMP KAPITEL 2. SOFTWARE Abbildung 2.1: Tcpdump 2.1 Tcpdump Tcpdump [19] ist ein rein passiver Scanner. D. h. es werden keine Datenpakete verschickt. Lediglich die Daten, die an einer Netzwerkschnittstelle ankommen, werden angezeigt und eventuell in einer Datei gespeichert. Der Name des Programms ist etwas verwirrend. Tcpdump ist nicht ausschließlich ein TCP[54]-Paket-Scanner. Es werden praktisch alle Pakettypen angezeigt (z. B. auch Ethernet Frames, IP-ICMP, IPv6-UDP, . . . , und sogar einige Protokolle auf Applikationsebene: NFS, NTP, . . . ). Mit Hilfe von Ausdrücken, die dem Programm beim Aufruf übergeben werden, kann (z. B. bei einem hohen Datenaufkommen) das Scannen auf bestimmte Daten eingeschränkt (gefiltert) werden. Es ist wichtig zu verstehen, dass, je nach Netzwerktopologie, nicht alle Pakete erfasst werden können. Sind die drei Rechner in Abbildung 2.1 (Tcpdump-Scanner, Rechner A und Rechner B) im Netzwerk mit einem Ethernet-Switch3 verbunden, so ist der Netzwerkverkehr von Rechner A zu Rechner B nicht erfassbar. Senden die Rechner Daten an alle Rechner im Netzwerk (Broadcast), oder senden die Rechner Daten direkt an den Tcpdump-Scanner, so können diese Daten erfasst werden. Sind die Rechner im Netzwerk mit einem Ethernet-Hub4 verbunden, so ist auch der Netzwerkverkehr von Rechner A zu Rechner B am TcpdumpScanner erfassbar. (Solch eine Konfiguration kommt meist nur in Testnetzwerken oder sehr kleinen Netzwerken vor). 3 ein Ethernet-Switch leitet Pakete die an einem Anschluss ankommen lediglich an die Anschlüsse weiter, für deren Rechner die Pakete bestimmt sind 4 ein Ethernet-Hub leitet Pakete die an einem Anschluss ankommen an alle anderen Anschlüsse weiter 6 KAPITEL 2. SOFTWARE 2.1. TCPDUMP Da die Netzwerkkarte/-schnittstelle von Tcpdump in einem speziellen Überwachungsbetrieb geöffnet wird, damit diese beliebige Netzwerkpakete empfangen kann (und somit z. B. im Falle eines Ethernet-Hubs auch die Pakete für Rechner B sieht“), ist es notwendig tcpdump mit administrativen ” Rechten zu starten. In den folgenden zwei Listings ist ein IP-ICMP[45]-echo-request (Listing 2.1, Zeile 4 bzw. Listing 2.2, Zeilen 3 - 9) Paket und die Antwort darauf (Listing 2.1, Zeile 5 bzw. Listing 2.2, Zeilen 10 - 16), ein IP-ICMP-echo-reply Paket zu sehen. Diese Pakete können mit dem Programm ping generiert werden. Ein Aufruf von ping unter dem Betriebssystem Linux ist in Listing 2.3 auf der nächsten Seite ersichtlich. Listing 2.1: Tcpdump: normale Ausgabe 1 2 3 4 5 6 7 8 # tcpdump -n -c 2 -i lo icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 01:48:15.132496 IP 127.0.0.1 > 127.0.0.1: ICMP echo request, id 52276, seq 1, length 64 01:48:15.132547 IP 127.0.0.1 > 127.0.0.1: ICMP echo reply, id 52276, seq 1, length 64 2 packets captured 6 packets received by filter 0 packets dropped by kernel Listing 2.2: Tcpdump: komplette Dekodierung 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # tcpdump -n -vvv -e -XX -c 2 -i lo tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 13:01:45.071801 00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: ICMP (1), length: 84) 127.0.0.1 > 127.0.0.1: ICMP echo request, id 47993, seq 1, length 64 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. 0x0010: 0054 0000 4000 4001 3ca7 7f00 0001 7f00 .T..@.@.<....... 0x0020: 0001 0800 97d8 bb79 0001 994c e444 3b18 .......y...L.D;. 0x0030: 0100 0809 0a0b 0c0d 0e0f 1011 1213 1415 ................ 0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$% 0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &’()*+,-./012345 13:01:45.071841 00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 20002, offset 0, flags [none], proto: ICMP (1), length: 84) 127.0.0.1 > 127.0.0.1: ICMP echo reply, id 47993, seq 1, length 64 0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. 0x0010: 0054 4e22 0000 4001 2e85 7f00 0001 7f00 .TN"..@......... 0x0020: 0001 0000 9fd8 bb79 0001 994c e444 3b18 .......y...L.D;. 0x0030: 0100 0809 0a0b 0c0d 0e0f 1011 1213 1415 ................ 0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$% 0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &’()*+,-./012345 2 packets captured 6 packets received by filter 0 packets dropped by kernel 7 2.2. WIRESHARK KAPITEL 2. SOFTWARE Listing 2.3: Ping 1 2 3 $ ping -c 1 localhost PING localhost.localdomain (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.102 ms 4 5 6 7 --- localhost.localdomain ping statistics --1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.102/0.102/0.102/0.000 ms Tcpdump bietet selbst keine Möglichkeit die Daten grafisch darzustellen, periodisch und selbstständig zu scannen oder gegebenenfalls Benachrichtigungen zu schicken. Tcpdump bietet dem System-Administrator einen Überblick über den Datenverkehr, der am Rechner ankommt. Ausgeklügelte Filterfunktionen können direkt mit logischen Ausdrücken angegeben werden und die Anzeige effektiv auf das Notwendige beschränken. 2.2 Wireshark Bis Version 0.99.0 (Juni 2006) hieß Wireshark noch Ethereal . Ab Version 0.99.1pre1 wurde es aus namensrechtlichen Gründen umbenannt5 . Es ist nicht zu erwarten, dass es von Ethereal weitere Versionen geben wird, da fast alle Ethereal Programmierer nun an Wireshark arbeiten. Wireshark [18] ist wie Tcpdump (auf Seiten 6–8) ein rein passiver Scanner. Es werden keine Datenpakete verschickt. Lediglich die Daten die an einer Netzwerkschnittstelle ankommen werden angezeigt und eventuell in einer Datei gespeichert. Im Unterschied zu Tcpdump kann Wireshark praktisch alle6 relevanten Protokoll- und Mediendaten dekodieren. Das heißt, sobald ein Protokoll analysiert werden soll, ist es sinnvoll Wireshark statt Tcpdump zu verwenden. Wie bei Tcpdump muss auf die gleichen Dinge geachtet werden (je nach Netzwerkstruktur können nicht alle Pakete im Netzwerk erfasst werden, das Programm ist mit administrativen Rechten zu starten; siehe Tcpdump auf Seiten 6–8). 5 ebenfalls auch die zwei enthaltenen Programme: ethereal wireshark bzw. tethereal tshark 6 Wireshark Version 0.99.4 kann 855 verschiedene Protokoll- und Mediendaten dekodieren. Neu in dieser Version sind z. B. : h248q1950 (H.248 Q.1950 Annex A), newmail (Microsoft Exchange New Mail Notification), png (Portable Network Graphics, usbms (USB Mass Storage), wlccp (Cisco Wireless LAN Context Control Protocol), . . . 8 KAPITEL 2. SOFTWARE 2.2. WIRESHARK Das Programmpaket beinhaltet zwei Hauptprogramme: wireshark und tshark . Das Erste startet eine grafische Oberfläche und ermöglicht auch dem Einsteiger einfach und schnell Datenströme zu protokollieren und zu analysieren. tshark ist für Benutzer gedacht die entweder keine Möglichkeit haben wireshark zu benutzen (wenn keine grafische Oberfläche zur Verfügung steht), oder als einfacher Ersatz für Tcpdump (tshark bietet praktisch den gleichen Funktionsumfang wie tcpdump , allerdings mit einigen zusätzlichen, sehr sinnvollen Funktionen wie z. B. : Zusammenfassung der empfangenen Daten, eine komplette Protokolldekodierung, Ausgabe ganz bestimmter Daten eines Protokolls). Listing 2.4 und Listing 2.5 zeigen (wie Tcpdump in Listing 2.1 auf Seite 7 und Listing 2.2 auf Seite 7) einen IP-ICMP7 -echo-request und die Antwort darauf (ein IP-ICMP-echo-reply), interpretiert und dargestellt von tshark . Listing 2.4: Wireshark: normale Ausgabe 1 2 3 4 5 # tshark -nn -c 2 -i lo icmp Capturing on lo 0.000000 98 127.0.0.1 -> 127.0.0.1 0.000043 98 127.0.0.1 -> 127.0.0.1 2 packets captured ICMP Echo (ping) request ICMP Echo (ping) reply Listing 2.5: Wireshark: komplette Dekodierung 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # tshark -nn -c 2 -V -i lo icmp Capturing on lo Frame 1 (98 bytes on wire, 98 bytes captured) Arrival Time: Aug 17, 2006 13:43:41.921438000 Time delta from previous packet: 0.000000000 seconds Time since reference or first frame: 0.000000000 seconds Frame Number: 1 Packet Length: 98 bytes Capture Length: 98 bytes Frame is marked: False Protocols in frame: eth:ip:icmp:data Ethernet II, Src: 00:00:00:00:00:00 (00:00:00:00:00:00), Dst: 00:00:00:00:00:00 (00:00:00:00:00:00) Destination: 00:00:00:00:00:00 (00:00:00:00:00:00) Address: 00:00:00:00:00:00 (00:00:00:00:00:00) .... ...0 .... .... .... .... = Multicast: This is a UNICAST frame .... ..0. .... .... .... .... = Locally Administrated Address: This is a FACTORY DEFAULT address Source: 00:00:00:00:00:00 (00:00:00:00:00:00) Address: 00:00:00:00:00:00 (00:00:00:00:00:00) .... ...0 .... .... .... .... = Multicast: This is a UNICAST frame .... ..0. .... .... .... .... = Locally Administrated Address: This is a FACTORY DEFAULT address Type: IP (0x0800) 7 Internet Control Message Protocol [45] 9 2.2. WIRESHARK 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 KAPITEL 2. SOFTWARE Internet Protocol, Src: 127.0.0.1 (127.0.0.1), Dst: 127.0.0.1 (127.0.0.1) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) 0000 00.. = Differentiated Services Codepoint: Default (0x00) .... ..0. = ECN-Capable Transport (ECT): 0 .... ...0 = ECN-CE: 0 Total Length: 84 Identification: 0x0000 (0) Flags: 0x04 (Don’t Fragment) 0... = Reserved bit: Not set .1.. = Don’t fragment: Set ..0. = More fragments: Not set Fragment offset: 0 Time to live: 64 Protocol: ICMP (0x01) Header checksum: 0x3ca7 [correct] Good: True Bad : False Source: 127.0.0.1 (127.0.0.1) Destination: 127.0.0.1 (127.0.0.1) Internet Control Message Protocol Type: 8 (Echo (ping) request) Code: 0 Checksum: 0x6bd3 [correct] Identifier: 0x227e Sequence number: 0x0001 Data (56 bytes) 50 51 52 53 54 0000 0010 0020 0030 6d 10 20 30 56 11 21 31 e4 12 22 32 44 13 23 33 1f 14 24 34 0f 15 25 35 0e 16 26 36 00 08 09 0a 0b 0c 0d 0e 0f 17 18 19 1a 1b 1c 1d 1e 1f 27 28 29 2a 2b 2c 2d 2e 2f 37 mV.D............ ................ !"#$%&’()*+,-./ 01234567 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 Frame 2 (98 bytes on wire, 98 bytes captured) Arrival Time: Aug 17, 2006 13:43:41.921486000 Time delta from previous packet: 0.000048000 seconds Time since reference or first frame: 0.000048000 seconds Frame Number: 2 Packet Length: 98 bytes Capture Length: 98 bytes Frame is marked: False Protocols in frame: eth:ip:icmp:data Ethernet II, Src: 00:00:00:00:00:00 (00:00:00:00:00:00), Dst: 00:00:00:00:00:00 (00:00:00:00:00:00) Destination: 00:00:00:00:00:00 (00:00:00:00:00:00) Address: 00:00:00:00:00:00 (00:00:00:00:00:00) .... ...0 .... .... .... .... = Multicast: This is a UNICAST frame .... ..0. .... .... .... .... = Locally Administrated Address: This is a FACTORY DEFAULT address Source: 00:00:00:00:00:00 (00:00:00:00:00:00) Address: 00:00:00:00:00:00 (00:00:00:00:00:00) .... ...0 .... .... .... .... = Multicast: This is a UNICAST frame .... ..0. .... .... .... .... = Locally Administrated Address: This 10 KAPITEL 2. SOFTWARE 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 2.3. NMAP is a FACTORY DEFAULT address Type: IP (0x0800) Internet Protocol, Src: 127.0.0.1 (127.0.0.1), Dst: 127.0.0.1 (127.0.0.1) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00) 0000 00.. = Differentiated Services Codepoint: Default (0x00) .... ..0. = ECN-Capable Transport (ECT): 0 .... ...0 = ECN-CE: 0 Total Length: 84 Identification: 0x831c (33564) Flags: 0x00 0... = Reserved bit: Not set .0.. = Don’t fragment: Not set ..0. = More fragments: Not set Fragment offset: 0 Time to live: 64 Protocol: ICMP (0x01) Header checksum: 0xf98a [correct] Good: True Bad : False Source: 127.0.0.1 (127.0.0.1) Destination: 127.0.0.1 (127.0.0.1) Internet Control Message Protocol Type: 0 (Echo (ping) reply) Code: 0 Checksum: 0x73d3 [correct] Identifier: 0x227e Sequence number: 0x0001 Data (56 bytes) 103 104 105 106 107 0000 0010 0020 0030 6d 10 20 30 56 11 21 31 e4 12 22 32 44 13 23 33 1f 14 24 34 0f 15 25 35 0e 16 26 36 00 08 09 0a 0b 0c 0d 0e 0f 17 18 19 1a 1b 1c 1d 1e 1f 27 28 29 2a 2b 2c 2d 2e 2f 37 mV.D............ ................ !"#$%&’()*+,-./ 01234567 108 109 2 packets captured Listing 2.5 zeigt, wie umfangreich und detailliert die komplette Protokolldekodierung von Wireshark ist. 2.3 Nmap Nmap [12] ist ein Klassiker unter den aktiven Netzwerk-Scannern. Das Programm sendet von einem Rechner aus IP8 -Pakete und detektiert die Antworten darauf. Es gibt eine grafische Bedieneroberfläche (nmapfe bzw. xnmap ) auf die hier nicht näher eingegangen wird, da diese keine erweiterte Funktionalität 8 Internet Protokoll [46] 11 2.3. NMAP KAPITEL 2. SOFTWARE Abbildung 2.2: Nmap bietet (es wird lediglich das Programm nmap mit den ausgewählten Optionen als Parameter aufgerufen und dessen Textausgabe dargestellt). Nmap bietet verschiedenste Methoden ein Netzwerk zu scannen. Darunter auch solche, die IP-Pakete verschicken welche bei regulären Netzwerkverbindungen nicht vorkommen. Damit sind Scans möglich (z. B. : Idlescan9 ) bei denen der Scanner praktisch extrem schwer zu detektieren ist, andere Scans sind einfach schneller als solche mit regulären IP-Paketen. Nmap kann aufgrund der Antworten der gesendeten IP-Pakete eine beachtliche Menge an Informationen liefern. Wie zum Beispiel offene / geschlossene TCP10 / UDP11 Ports, die Versionen der Programme der offenen Ports und / oder das verwendete Betriebssystem. Es ist zu beachten, dass es für viele Scan-Varianten erforderlich ist Nmap mit administrativen Rechten zu starten. Sollte dies notwendig sein, so gibt Nmap gleich nach dem Start eine entsprechende Meldung aus. Das Programm selbst bietet allerdings keine Möglichkeit die Daten grafisch darzustellen, periodisch und selbstständig zu scannen oder gegebenenfalls Benachrichtigungen zu schicken. Ist solch eine Funktion erwünscht, sind weitere Programme nötig. Nmap bietet dem System-Administrator (normalerweise manuell) einen schnellen Überblick der Dienste, die Rechner im lokalen IP-Netzwerk anbieten. Wird diese (Text)Information gespeichert und mit einem Scan verglichen der zu einem anderen Zeitpunkt stattgefunden hat, können Änderungen der Versionen (Dienste, Betriebssystem) und / oder die Erreichbarkeit der Rechner im Netzwerk detektiert werden. 9 http://www.insecure.org/nmap/idlescan.html (15. Februar 2006) Transmission Control Protocol [54] 11 User Datagram Protocol [55] 10 12 KAPITEL 2. SOFTWARE 2.4. ARPWATCH-NG Listing 2.6: Nmap: Anwendungsbeispiel 1 2 3 4 # # # # nmap -n -sV 127.0.0.1 > scan1.log # nach einiger Zeit nmap -n -sV 127.0.0.1 > scan2.log diff -u scan1.log scan2.log > scan1-scan2.diff Listing 2.7: Nmap: Datei scan1-scan2.diff 1 2 3 --- scan1.log 2006-02-22 00:01:32.000000000 +0100 +++ scan2.log 2006-03-09 00:24:10.000000000 +0100 @@ -1,13 +1,13 @@ 4 5 6 7 8 9 10 11 12 13 14 15 16 -Starting Nmap 4.00 ( http://www.insecure.org/nmap/ ) at 2006-02-22 00:00 CET +Starting Nmap 4.00 ( http://www.insecure.org/nmap/ ) at 2006-03-09 00:23 CET Interesting ports on 127.0.0.1: (The 1667 ports scanned but not shown below are in state: closed) PORT STATE SERVICE VERSION -22/tcp open ssh OpenSSH 4.2 (protocol 2.0) +22/tcp open ssh OpenSSH 4.3 (protocol 2.0) 631/tcp open ipp CUPS 1.1 6000/tcp open X11 X.Org (open) 8081/tcp open http-proxy WWWOFFLE caching webproxy 2.8c 8082/tcp open blackice-alerts? Service Info: OS: Unix 17 18 19 -Nmap finished: 1 IP address (1 host up) scanned in 66.514 seconds +Nmap finished: 1 IP address (1 host up) scanned in 66.269 seconds In Listing 2.7 (Zeile 10 und 11) ist deutlich zu erkennen, dass sich die Version des Dienstes OpenSSH (TCP-Port 22) von Version 4.2 auf Version 4.3 erhöht hat. 2.4 Arpwatch-NG Arpwatch-NG [11] ist eine Weiterentwicklung von Arpwatch[9]. Das Programm implementiert eine ganz spezielle Art der Überwachung. Wie bei Tcpdump (auf Seiten 6–8) und Wireshark (auf Seiten 8–11) wird die Netzwerkkarte in den Überwachungsbetrieb geschaltet (administrative Rechte beim Starten erforderlich). Danach werden aber lediglich ARP12 -Pakete im Netzwerk gesucht. Da die IP-Adressen der Rechner im Ethernet-Netzwerk mit Hilfe von ARP-Paketen bekannt gegeben werden, kann so eine Manipulation bei der Adressvergabe13 erkannt werden. Auch mehrfach vergebene IP-Adressen werden auf diese Weise detektiert. 12 13 Address Resolution Protocol [40] z. B. durch ARP-Spoofing[41] 13 2.5. SNORT KAPITEL 2. SOFTWARE Im regulären Betrieb werden die bekanntgegebenen IP- und EthernetAdressen in einer Datei gespeichert und via syslog [53] protokolliert. Verdächtige Änderungen der Adressen werden zusätzlich per Email gemeldet. Arpwatch-NG hat keine grafische Oberfläche. Es läuft als Programm im Hintergrund und überwacht eine Netzwerkschnittstelle14 . Listing 2.8 startet arpwatch im Vordergrund (-m 1 ) und gibt alle Informationen auf der Kommandozeile aus. Es ist deutlich zu erkennen, dass der Rechner mit dem Namen video (192.168.11.11 ) seine Ethernet-Adresse von 0:40:63:cb:7b:99 auf aa:bb:cc:dd:ee:ff ändert. Listing 2.8: Arpwatch-NG 1 2 # arpwatch -i eth0 -m 1 -n 192.168.11.0/24 new station: video 3 4 5 6 7 8 hostname: ip address: ethernet address: ethernet vendor: timestamp: video 192.168.11.11 0:40:63:cb:7b:99 VIA Technologies Tuesday, August 22, 2006 22:33:58 +0200 9 10 new station: notebook 11 12 13 14 15 16 hostname: ip address: ethernet address: ethernet vendor: timestamp: notebook 192.168.11.250 0:d:60:b0:7c:57 IBM Tuesday, August 22, 2006 22:33:58 +0200 17 18 changed mac: video 19 20 21 22 23 24 25 26 27 28 hostname: ip address: ethernet address: ethernet vendor: old ethernet address: old ethernet vendor: timestamp: previous timestamp: delta: 2.5 video 192.168.11.11 aa:bb:cc:dd:ee:ff <UNKNOWN> 0:40:63:cb:7b:99 VIA Technologies Tuesday, August 22, 2006 22:36:27 +0200 Tuesday, August 22, 2006 22:34:54 +0200 1 minute Snort Snort [17] ist eine IDS15 -Software. Das Programm läuft (wie ArpwatchNG , Abschnitt 2.4 auf der vorherigen Seite) im Hintergund und überwacht 14 Sollen mehrere Netzwerkschnittstellen überwacht werden so ist das Programm mehrmals mit entsprechend anderen Optionen zu starten. 15 Intrusion Detection System / System zum Feststellen von Netzwerkeinbrüchen 14 KAPITEL 2. SOFTWARE 2.5. SNORT eine Netzwerkschnittstelle. Allerdings werden (im Gegensatz zu ArpwatchNG ) alle Netzwerkpakete überwacht und mit einer Datenbank verglichen, in der bekannte Angriffe im Netzwerk gespeichert sind16 . Werden im Netzwerkverkehr Daten gefunden die Sicherheitslücken ausnützen oder versuchen an Informationen zu gelangen (z. B. Portscan), kann Snort dies erkennen und Benachrichtigungsprogramme starten oder diese Information an Programme weiterleiten. Es gibt für die Angriffe, die in der Datenbank gespeichert sind, eine Beschreibung und einen Hinweis wie das Problem zu lösen ist. Wenn Snort einen Angriff erkennt, so muss das noch lange nicht heißen, dass die angegriffenen Rechner im Netzwerk auch tatsächlich ein Problem damit haben. Es sollten die angegriffenen Systeme geprüft werden ob die betroffenen Dienste überhaupt aktiviert / aktiv sind. Weiters ist dann zu prüfen ob eine verwundbare Version des Dienstes installiert ist. Die Hauptaufgabe von Snort besteht darin Angriffe im Netzwerk zu erkennen und einen Hinweis auf den Angreifer zu liefern. Eine Technik Namens IPS17 versucht, direkt während des Angriffs, diesen zu verhindern. Dazu gibt es mehrere Möglichkeiten. Man kann versuchen, mit automatisch generierten Firewall-Regeln, die IP[46]-Adressen des Angreifers zu blocken (kann mit Snortsam [35], eine Erweiterung zu Snort , realisiert werden). Eine andere Technik besteht darin dem Angreifer ein TCP-RST[54]-Paket zu schicken (ist in Snort integriert, heißt flexresp – Flexible Responses – und kann beim Übersetzen des Programms eingeschaltet werden), was natürlich nur bei TCP-Paketen funktioniert. Snort ist wie Arpwatch-NG (auf Seiten 13–14) ein Programm das den Netzwerkverkehr analysiert und interpretiert. Im Gegensatz zu ArpwatchNG werden allerdings nicht ausschließlich ARP-Pakete gescannt, sondern der gesamte Netzwerkverkehr. Je nach installierten Analyseregeln werden Alarme generiert und in Dateien gespeichert. Es ist auch möglich diese Alarme direkt an andere Programme weiterzuleiten. Die Firma Sourcefire18 wurde Ende 2005 / Anfang 2006 beinahe von der Firma CheckPoint19 gekauft. Es ist fraglich ob Snort weiterhin als freie quelloffene Software verfügbar gewesen wäre. Die Übernahme ist, möglicherweise auch auf Grund von Einwänden seitens der USRegierung, nicht zu Stande gekommen. 16 Die Datenbank vom 11. Oktober 2006 kennt mehr als 8400 Angriffe im Netzwerk. Intrusion Prevention System / System zum Verhindern von Netzwerkeinbrüchen 18 Sourcefire[2] ist maßgeblich an der Entwicklung von Snort beteiligt und stellt eine kommerzielle Datenbank spezieller Regeln gegen Gebühr zur Verfügung. 19 CheckPoint[1]: Firewall Hersteller 17 15 2.6. COLLECTD KAPITEL 2. SOFTWARE Abbildung 2.3: Collectd 2.6 Collectd Collectd [15] ist ein Programm zur aktiven Überwachung verschiedenster Dienste eines Rechners. Es werden Systemdaten direkt und in hoher Auflösung (alle 10 Sekunden) in RRD20 -Datenbanken[8] gespeichert. Das Programm ist optimiert für eine sehr hohe Geschwindigkeit: Es ruft keine weiteren Programme auf (alle Programmteile sind in Erweiterungsbibliotheken aufgeteilt die zum Programmstart geladen werden), ist komplett in C[42] programmiert und hat keine grafische Oberfläche. Es gibt auch einen Server / Client Modus mit dem es möglich ist das Programm auf vielen Rechnern im Netzwerk als Client zu starten und auf einem Server die Daten zu empfangen und zu speichern. Die Aufgabe von collectd ist lediglich Daten zu sammeln und zu speichern. Die Daten können mit Hilfe des Programms rrdtool [8] als Grafik (siehe Abbildung 2.3) angezeigt werden. Das Speichern der Daten im RRD-Format garantiert, dass die Größe der Datenbank nicht steigt. Der Platzbedarf bleibt somit immer gleich, was ein sehr großer Vorteil sein kann. Altert der Datensatz, so wird mit der Zeit die Auflösung geringer (Standardeinstellung bei Collectd sind drei Auflösungsstufen: 1 Wert pro Minute für 25 Stunden, 1 Wert pro halbe Stunde für 35 Tage, 1 Wert alle 6 Stunden für 380 Tage). Mit Collectd ist es derzeit nicht möglich bei bestimmten Grenzwerten Benachrichtigungsprogramme zu starten. Es ruft allerdings selbstständig 20 Round Robin Database 16 KAPITEL 2. SOFTWARE 2.7. CACTI (alle 10 Sekunden) Funktionen der Erweiterungsbibliotheken21 auf um entsprechende Daten zu sammeln. Im Client/Server-Modus ist es auch möglich alle diese Daten von entfernten Rechnern zu erfassen. 2.7 Cacti Cacti [13] ist eine Datenbeschaffungs- und Visualisierungssoftware. Die Daten werden via SNMPv1, SNMPv2, SNMPv322 oder per Script23 (mit Hilfe eines PHP24 -Scripts) gesammelt und dann im Programmcode (PHP) eines Webservers verarbeitet. Zum Speichern und Anzeigen der Daten wird RRDTool [8] verwendet, wobei, wie bei Collectd in Abschnitt 2.6, die Datenbankgröße gleich bleibt. Konfiguration und Anzeige erfolgen über eine Webschnittstelle, welche alle Einstellungen in einer MySQL-Datenbank[27] ablegt. Die Scripte zum Sammeln der Daten werden von einem PHP-Script gestartet, welches laut Dokumentation via Cron[22] alle 5 Minuten ausgeführt werden soll. Sollte dieser Zeitraum nicht ausreichen um alle Daten zu sammeln, so ist eine Erweiterung vorhanden. Anstelle des erwähnten PHPScripts sammelt diese Erweiterung die Daten mit Hilfe eines Programms (cactid ). Cacti ist stark darauf ausgelegt Daten entweder durch lokale Scripte oder via SNMP [51] zu empfangen. Die Grundkonfiguration für entfernte Rechner sieht lediglich vor, dass Daten, die via SNMP vorliegen empfangen werden. Die Konfigurations- und Anzeigeschnittstelle ist mit einer Benutzerverwaltung ausgestattet, mit welcher recht detailliert Anzeige- und Konfigurationsrechte vergeben werden können. Cacti benötigt einen Rechner auf dem ein Webserver (Apache [20]) installiert ist. Dieser Webserver muss mit der Erweiterung PHP [32] ausgestattet sein, welche wiederum die Erweiterung MySQL [27] beinhalten muss. Weiters sind die Pakete RRDTool [8] und net-smnp [28] notwendig. 21 Version 3.8.2: battery, cpu, cpufreq, df, disk, hddtemp, load, memory, mysql, network, nfs, ping, processes, sensors, serial, swap, tape, traffic, users, wireless 22 experimentell 23 PHP, Shell, Perl, . . . 24 PHP: Hypertext Preprocessor [32] 17 2.8. ZABBIX 2.8 KAPITEL 2. SOFTWARE Zabbix Zabbix [10] ist wie Cacti (Abschnitt 2.7) eine Datenbeschaffungs- und Visualisierungssoftware. Die Daten werden allerdings direkt in einer SQLDatenbank gespeichert. Somit steigt grundsätzlich die Größe dieser Datenbank laufend. Eine so genannte Housekeeping“-Funktion löscht jedoch nach ” definierten Regeln alte Daten. Ein weiterer Unterschied zu Cacti ist das Existieren eines definierten Clients (bei Zabbix Agent“ genannt: zabbix agentd ), welcher dem Server ” (zabbix server ) unterschiedlichste Daten übermittelt. Der Agent überwacht den Status des lokalen Rechners. Er empfängt über das Netzwerk Anfragen und beantwortet diese. Weiters schickt er alle 2 Minuten eine Statusmeldung an den Server. Der Server (zabbix server ) ist ein Prozess, der Daten von einem oder mehreren Agenten abfrägt und diese in einer SQL-Datenbank (MySQL oder PostgreSQL) einträgt. Weiters empfängt er auch sogenannte HeartbeatSignale (Statusmeldungen) der Agenten. Zusätzlich kann zabbix server SNMPv1, SNMPv2 und SNMPv3 Anfragen schicken und entsprechende Antworten auswerten. Die Konfigurations- und Anzeigeschnittstelle (das Webinterface) ist – wie bei Cacti – mit einer Benutzerverwaltung ausgestattet und benötigt ebenfalls einen Webserver (Apache [20]) mit der Erweiterung PHP [32], welche wiederum die Erweiterung MySQL [27] oder PostgreSQL [33] beinhalten muss. Zabbix ist das Erste hier vorgestellte Programm, welches eine Benachrichtigungsmöglichkeit, beim Überschreiten von bestimmten Grenzwerten, vorsieht. 2.9 Nagios Nagios [7] ist wahrscheinlich das bekannteste freie Überwachungsprogramm überhaupt. Es arbeitet grundsätzlich aktiv auf einem Rechner der gleichzeitig überwacht wird. Treten bestimmte Zustände für längere Zeitintervalle auf, so können Benachrichtigungsprogramme gestartet werden. Im Gegensatz zu Collectd , Cacti und Zabbix arbeitet Nagios zustandsorientiert. Die Möglichkeit zur Langzeitdatensammlung (in Nagios Performancedata“ genannt), deren Anzeige und Analyse besteht zwar, kann ” aber nur mit Erweiterungen sinnvoll genutzt werden. Zur Bedienung und Analyse ist Nagios mit einer Webschnittstelle ausgestattet, welche zusätzlich einen installierten Webserver (Apache [20]) mit der Erweiterung PHP [32] voraussetzt. 18 KAPITEL 2. SOFTWARE 2.9. NAGIOS Die Konfiguration kann jedoch nicht über die Webschnittstelle verändert werden. Dazu sind Textdateien zu editieren. Das erfordert ein gewisses Maß an Geduld und Zeit, was auch auf amüsante Weise auf den Webseiten von Nagios zu lesen ist: “Relax – it’s going to take some time. Don’t expect to be able to compile Nagios and start it up right off the bat. It’s not that easy. In fact, it’s pretty difficult. [. . . ]” “Read the documentation. Nagios is difficult enough to configure when you’ve got a good grasp of what’s going on, and nearly impossible if you don’t. [. . . ]” Grundsätzlich werden in der Konfiguration Hosts25 konfiguriert, auf denen sich bestimmte Services26 befinden. Die Erreichbarkeit der Rechner im Netzwerk und der Dienste der Rechner werden periodisch überprüft. Tritt ein Fehler oder eine Warnung (wenn z. B. eine Festplatte voll wird) öfters hintereinander oder für einen längeren Zeitraum auf, so wird ein Alarmierungsprogramm gestartet. Über die Webschnittstelle ist dann der betroffene Rechner schnell lokalisiert. Weiters unterstützt Nagios auf einfache Weise eine Bestätigung des Fehlers und das Hinzufügen von Kommentaren. Nagios kann von sich aus nur Dienste auf entfernten Rechnern überwachen die öffentlich im Netzwerk verfügbar sind (z. B. : HTTP27 , FTP28 , SMTP29 ). Private Dienste, die nur lokal auf dem entfernten Rechner erreichbar sind oder Informationen die nur lokal verfügbar sind, kann Nagios grundsätzlich nicht überwachen. Nagios lässt sich auf vielfältige Art und Weise erweitern. Zum einen besteht die Möglichkeit entfernte Rechner zu überwachen um den oben genannten Nachteil zu umgehen (NRPE [29]), zum anderen kann Nagios auch dahingehend erweitert werden die Zustandsdaten zu speichern und in Diagrammen darzustellen (PerfParse [31]). Es ist auch möglich Programme zu installieren, mit welchen die Konfiguration über eine Webschnittstelle – also grafisch – geändert werden kann (z. B. mit Monarch [26]). Die schematische Funktionsweise von Nagios ist in Abbildung 2.4 auf der nächsten Seite dargestellt. 25 Rechner Dienste 27 HyperText Transfer Protocol [44] 28 File Transfer Protocol [43] 29 Simple Mail Transfer Protocol [50] 26 19 2.9. NAGIOS KAPITEL 2. SOFTWARE Abbildung 2.4: Nagios 20 KAPITEL 2. SOFTWARE 2.10. NESSUS Abbildung 2.5: Nessus: Report des Clients 2.10 Nessus Ab Version 3 steht Nessus leider nicht mehr als freie quelloffene Software zur Verfügung. Lediglich eine in ausführbare Form übersetzte Version für Linux, FreeBSD, Solaris, MacOS X und Windows wird angeboten. Trotzdem soll das Programm, der Vollständigkeit wegen, hier angeführt werden. Nessus [16] ist ein aktiver Sicherheits-Scanner der nach dem Client-ServerPrinzip arbeitet. Zwischen dem Client (NessusClient oder nessus ) und dem Server (nessusd ) wird eine authentifizierte und verschlüsselte Verbindung aufgebaut (je nach Authentifizierung können via Autorisierung die Scans auch auf bestimmte Rechner eingeschränkt werden). Der Client teilt dem Server mit, welche Sicherheitsprüfungen der Server auf welchen Rechnern durchführen soll30 . Der Server führt in der Regel erst einen Portscan durch um festzustellen auf welchen Ports Sicherheitsprüfungen durchgeführt werden sollen. Danach werden alle relevanten ausgewählten Tests ausgeführt. Die Tests / Sicherheitsprüfungen testen die Rechner spezifisch auf bekannte Sicherheitslücken (mehr als 9500!). Wird ein Problem gefunden, so gibt es für praktisch alle Sicherheitslücken eine Beschreibung und einen Hinweis wie das Problem zu beheben ist (siehe Abbildung 2.5). Es gibt auch Tests, die lokal Programme aufrufen um zum Beispiel unter Solaris diverse Patchlevels zu testen. Wird nicht der lokale, sondern ein 30 Der Server (nessusd ) ist über zwei Clients, NessusClient (grafisches Programm) oder nessus (Kommandozeile), zu steuern. 21 2.11. ZUSAMMENFASSUNG KAPITEL 2. SOFTWARE Abbildung 2.6: Nessus entfernter Rechner vom Nessus-Server gescannt, so versucht Nessus (für lokale Programme) eine SSH31 -Verbindung aufzubauen um so die Programme auf dem entfernten Rechner zu starten und diese lokalen Tests dort durchzuführen (Abbildung 2.6 auf der nächsten Seite). Siehe dazu auch Nagios , Abschnitt 2.9 auf Seite 18, da tritt dasselbe Problem auf. Nessus bietet im Gegensatz zu Nagios ohne Zusatzsoftware eine Lösung zu diesem Problem. 2.11 Zusammenfassung Um einen Überblick über die vorgestellten Programme und deren Funktionalität zu erhalten (um z. B. die Auswahl im Anwendungsfall zu erleichtern) sollen zwei Tabellen vorgestellt werden. Tabelle 2.1 liefert einen Überblick über die Art (aktiv oder passiv) des Programms und beschreibt dessen Überwachungsmöglichkeiten. Tabelle 2.2 auf der nächsten Seite fasst die Arten und die Möglichkeiten der Rückmeldungen der Programme zusammen. 31 Secure SHell [52] 22 KAPITEL 2. SOFTWARE Programm Art 2.11. ZUSAMMENFASSUNG Überwachen von . . . Tcpdump passiv Netzwerkverkehr Wireshark passiv Netzwerkverkehr; detaillierte Protokolldekodierung Nmap aktiv Rechner und deren Dienste: TCP[54]- / UDP[55]Ports, deren Dienste und Versionen; RPC[49]Dienste; IP[46]-Protokolle; Betriebssysteme und deren Versionen Arpwatch passiv ARP[40]-Netzwerkverkehr (IP-Adressvergabe) Snort passiv Angriffe im Netzwerkverkehr Collectd aktiv Systemdaten (lokal) Cacti aktiv Systemdaten (lokal, SNMP[51], Programme) Zabbix aktiv Systemdaten (lokal, SNMP[51], Agenten) Nagios aktiv Systemzustand / -daten (lokal, mit Erweiterung auch für entfernte Rechner) Nessus aktiv Verwundbarkeit der Rechner Tabelle 2.1: Zusammenfassung, Art und Weise Programm Rückmeldung / Darstellung / Benachrichtigung Tcpdump Wireshark Nmap Arpwatch Snort Collectd Cacti Zabbix Nagios Nessus Kommandozeile / Text, pcap[48]-Datei / Kommandozeile / Text, pcap[48]-Datei / Kommandozeile / Text, XML[58] / Kommandozeile / Text / Email Syslog[53] / Protokolldatei / Programme, UNIX-Socket Round-Robin-Database[8] / - / Round-Robin-Database[8] / Webinterface / SQL-Datenbank / Webinterface / Email, Programm SQL-Datenbank / Webinterface / Email, Programm NessusClient : grafisch (Export: XML, HTML, PDF, . . . ) / NessusClient / - Tabelle 2.2: Zusammenfassung, Art der Rückmeldungen 23 24 Kapitel 3 Kompilieren Kompilieren ist der Vorgang den Quellcode1 eines Programms in Binärcode zu übersetzen und so in eine Form zu bringen, die die jeweilige Plattform (Prozessor, Architektur2 und Betriebssystem) versteht. In diesem Kapitel soll auch die Installation betrachtet werden. Jener Vorgang, der alle zum Start und Betrieb notwendigen Daten eines Programms an die richtige Stelle des Betriebssystems kopiert und gegebenenfalls Verzeichnisse erzeugt in denen das Programm Daten ablegt. Compiler, Assembler und Linker: Beim Übersetzen (Kompilieren) des Quellcodes einer Software in ein Programm wird der Quellcode in Binärcode umgewandelt den das Betriebssystem ausführen kann. Dazu werden Compiler, Assembler und Linker verwendet. Der Compiler setzt den Code der Programmiersprache (z. B. : C, C++, Pascal, Fortran, . . . ), den Quellcode, in Maschinencode 3 um. Dieser ist immer noch lesbar als Text, jedoch bereits Prozessor4 -spezifisch. Der Maschinencode wird dann vom Assembler in eine vom Prozessor lesbare Form (Binärcode5 ) umgewandelt. Der Linker führt (gegebenenfalls mehrere) Binärcodedateien zusammen und bringt den Binärcode in eine für das Betriebssystem lesbare und ausführbare Form. 1 auch Programmcode oder Sourcecode genannt; Beispiel in der Programmiersprache C[42]: Listing B.2 auf Seite 114 2 Mit Architektur eines Rechners“ sind die zusätzlich zum Prozessor angebrachten ” Komponenten – wie Speicher, Bussystem, Ein- / Ausgabe, . . . und deren Anordnung und Verbindung mit dem Prozessor und somit im Rechner – gemeint. Ein klassisches Beispiel ist der PC (Personal Computer). 3 auch Assemblercode oder Assemblersprache genannt; Beispiel in x86-Assembler für GNU-Linux: Listing B.3 auf Seite 114 4 auch CPU (Central Processing Unit Zentrale-Ausführungs-Einheit) genannt 5 siehe Listing B.4 auf Seite 115 25 KAPITEL 3. KOMPILIEREN make: Die meisten Compiler rufen Assembler und Linker selbstständig auf und ersparen somit dem Benutzer die oft sehr komplexen Aufrufe. Jedoch ist der Quellcode meist auf mehrere Dateien aufgeteilt. So entstehen Abhängigkeiten die in der richtigen Reihenfolge aufgelöst werden müssen. Dabei hilft das Programm make . make liest die Informationen der Abhängigkeiten aus Dateien, die meist Makefile genannt werden, und prüft, ob sich die Dateien des Quellcodes geändert haben. So wird wenn möglich, nur der geänderte Code kompiliert. In der Regel wird make auch verwendet um die kompilierten Programme zu installieren. Dazu ist meist make install aufzurufen. autoconf: Normalerweise prüfen Programme, die im Quellcode veröffentlicht werden, die Plattform bevor der Kompiliervorgang mit Hilfe von make gestartet wird. Dazu wird oft das Programm autoconf verwendet, das aus einer Konfigurationsdatei (configure.ac oder configure.in) das Programm configure erzeugt. Das Besondere an configure ist, dass es Plattform unabhängig ist. Es prüft das System (ob z. B. : die Funktion acos() in der Bibliothek libm.so vorhanden ist), aktiviert / deaktiviert Teile des Quellcodes und generiert aus Makefile.in-Dateien entsprechende Makefile-Dateien. Weiters kann es eine Datei erzeugen in der diverse Ergebnisse der Tests gespeichert werden (oft config.h). automake: Da es keine Standards für Makefile.in-Dateien gab, waren auch die Aufrufe für make und das Verhalten beim Kompilieren und Installieren nicht standardisiert. Deshalb wurde automake entwickelt. Es liest einfache und verständliche Makefile.am-Dateien und generiert daraus standardisierte Makefile.in-Dateien. libtool: Eine weitere Herausforderung für Programmierer sind Bibliotheken. Diese sind je nach Linker und Betriebssystem anders zu erzeugen und auch die Namensgebung und Versionierung ist nicht einheitlich. Entwickler haben das Programm libtool geschrieben um auch hier die Abhängigkeiten von Betriebssystem und Linker zu beseitigen. Verwenden Programmierer autoconf , automake und evtl. libtool , so ist es relativ einfach den Quellcode auf beliebigen Betriebssystemen zu kompilieren. Im einfachsten Fall konfiguriert, kompiliert und installiert man den Quellcode wie in Listing 3.1. Listing 3.1: Konfigurieren, kompilieren und installieren, einfachster Fall 1 2 3 4 5 tar -xjf nmap-4.11.tar.bz2 cd nmap-4.11 ./configure make make install # Entpacken des Quellcode-Archivs # Wechsel in das Quellcode-Verzeichnis # Konfiguration und Anpassung an die Plattform # Kompilieren des Quellcodes # Installieren der Programme und Daten 26 KAPITEL 3. KOMPILIEREN (Eine sehr gute Beschreibung zu autoconf , automake und libtool liefert [38]). Das Programm ist dann meist im Verzeichnis /usr/local/bin/ installiert, Bibliotheken werden unter /usr/local/lib/ abgelegt und die entsprechenden C-Code Include-Dateien unter /usr/local/include/. Das Basisverzeichnis ist dementsprechend /usr/local/. Dieses Verzeichnis bieten praktisch alle UNIX-Betriebssysteme für lokale Installationen an. Werden nicht alle (oder keines) der oben genannten Hilfsprogramme verwendet so gestaltet sich der Kompiliervorgang meist schwieriger, erfordert manchmal eine genaue Kenntnis des Betriebssystems und / oder es müssen diverse Konfigurationsdateien editiert werden. Leider ergibt sich durch Listing 3.1 auf der vorherigen Seite in Bezug auf die Programmentwicklung und -evaluierung ein weiteres Problem: Sollen verschiedene Versionen eines Programms getestet werden, so wäre es notwendig diese entweder auf verschiedenen Rechnern zu installieren oder nur eine Version zur selben Zeit installiert zu haben. Ein einfacher Wechsel zwischen zwei oder mehreren Versionen ist nicht möglich. Das selbe Problem weisen auch die Paketverwaltungsprogramme der gängigen Linux6 - und anderer UNIX7 -Distributionen auf. Eine Lösung um verschiedene Versionen eines Programms gleichzeitig installiert zu haben bietet autoconf . Das von autoconf generierte Programm configure bietet plattformunabhängig die Option --prefix , welche in der Grundeinstellung auf /usr/local/ gesetzt ist. Verwendet man z. B. : --prefix= /usr/local/hProgrammnamei/hVersioni/, so kann man beliebig viele verschiedene Versionen installieren, ohne dass sich diese gegenseitig beeinflussen. Wenn autoconf , automake und eventuell libtool korrekt verwendet wurden, dann befinden sich nämlich alle generierten Daten und Programme nach einem make install in dem genannten Verzeichnis. Da der Autor die Programme zusätzlich auch auf verschiedenen Plattformen8 kompiliert und er auf diesen die selben Programme und Versionen verwenden will, geht er noch einen Schritt weiter und konfiguriert die Programme mit --prefix= /misc/hPlattformi/opt/hProgrammnamei/hVersioni/. Wobei /misc/ ein zentrales Verzeichnis ist, welches von allen Rechnern aus in das Dateisystem eingebunden wird. Die lokale Installation wird somit zur Netzwerkinstallation. Ein neuer Rechner erhält, sobald das /misc/ Verzeichnis eingebunden ist, alle kompilierten Programme. Weiters ist es dem Autor wichtig, dass die kompilierten Programme unabhängig von den meisten Komponenten der jeweiligen Plattform arbeiten. 6 z. B. : RedHat, Suse: RPM (Redhat Package Manager); Debian: dpkg z. B. : Solaris, HP-UX, AIX 8 i686-pc-linux-gnu, x86 64-unknown-linux-gnu, alpha-unknown-linux-gnu, sparc-sunsolaris2.{8,9,10}, i386-sun-solaris2.{9,10}, amd64-sun-solaris2.10 7 27 KAPITEL 3. KOMPILIEREN Dies kann dadurch erreicht werden, indem (möglichst) alle abhängigen Komponenten die das Programm zur Laufzeit benötigt, ebenfalls übersetzt und installiert werden. Dabei muss man beachten, dass die Programme ein zentrales Verzeichnis vorfinden in dem alle notwendigen Programme, Bibliotheken und Dateien zum Konfigurieren, Kompilieren und Ausführen vorhanden sind. Dies wäre in der Grundeinstellung von autoconf der Fall (/usr/local/), aber mit oben beschrieben Nachteilen. Deshalb verwendet der Autor die Verzeichnisse /misc/hPlattformi/bin/, . . . /sbin/, . . . /lib/, . . . /include/, . . . /man/ und . . . /info/. Darin werden relative symbolische Verknüpfungen9 zum Installationsverzeichnis angelegt. Was in eine Datei- / Verzeichnisstruktur wie in Listing 3.2 resultiert. Listing 3.2: Installationspfade, -dateien und -verknüpfungen 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 /misc/i686-pc-linux-gnu/ |-- bin/ | ‘-- nmap -> ../opt/nmap/4.11/bin/nmap* |-- include/ |-- info/ |-- lib/ |-- man/ | ‘-- man1/ | ‘-- nmap.1 -> ../../opt/nmap/4.11/man/man1/nmap.1 ‘-- opt/ ‘-- nmap/ |-- 4.11/ | |-- bin/ | | ‘-- nmap* | |-- man/ | | ‘-- man1/ | | ‘-- nmap.1 | ‘-- share/ | ‘-- nmap/ | |-- nmap-mac-prefixes | |-- nmap-os-fingerprints | |-- nmap-protocols | |-- nmap-rpc | |-- nmap-service-probes | |-- nmap-services | |-- nmap.dtd | ‘-- nmap.xsl ‘-- default -> 4.11/ Um schnell auf die aktuellste, stabilste Version zugreifen zu können legt der Autor in jedem /misc/hPlattformi/opt/hProgrammnamei/ Verzeichnis eine Verknüpfung an die default heißt und auf die aktuelle, stabile Version zeigt. 9 auch Softlinks genannt 28 KAPITEL 3. KOMPILIEREN Damit das Anlegen der Verknüpfungen, das Laden der Programme vom Internet, das Kompilieren auf verschiedenen Betriebssystemen und das Installieren unterschiedlicher Programme so einfach und komfortabel wie möglich vor sich geht, wurde vom Autor ein Programm (Listing B.1 auf Seite 97) entwickelt, welches mit einer Beschreibungsdatei (fbuild-Datei) wie in Listing 3.3 Listing 3.3: fbuild-Paketbeschreibungsdatei 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # # # # # # # # # # # # # # # # # nmap-4.11.fbuild This file is part of fbuild.sh. Copyright (C) 2006 Niki W. Waibel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 20 N="nmap" V="4.11" 21 22 URL="http://www.insecure.org/$N/dist/$N-$V.tar.bz2" 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 f_configure () { def_configure \ --enable-static \ --with-libpcap=included \ --with-openssl="$BASE" \ --with-pcre="$BASE" \ --without-nmapfe } f_make () { def_make } f_makeinstall () { def_makeinstall } obige Anforderungen erfüllt. Dabei unterstützt es die Konfiguration beliebiger Installations- und Verknüpfungsverzeichnisse. Damit werden die Installationen maximal unabhängig von den Versionen der Betriebssysteme. Das Konfigurieren und Installieren reduziert sich gewöhnlich auf einen Aufruf wie in Listing 3.4 auf der nächsten Seite. 29 3.1. FBUILD – ALLGEMEINES KAPITEL 3. KOMPILIEREN Listing 3.4: Konfigurieren, kompilieren und installieren mit fbuild.sh 1 ./fbuild.sh FBUILD/nmap-4.11.fbuild 3.1 fbuild – Allgemeines Das Programmpaket fbuild [14] bietet folgendes: 1. laden des Quellcodes vom Internet, falls lokal nicht vorhanden 2. beliebige Optimierungsstufen / -optionen beim Übersetzen 3. beliebiges Installationsverzeichnis 4. Plattformunabhängigkeit 5. keine Installationsdatenbank, trotzdem übersichtliche Installationen 6. einfaches integrieren von Fehlerkorrekturen und Erweiterungen 7. (beliebige) zentrale, (mit dem Installationsverzeichnis) automatisch verknüpfte Verzeichnisstruktur Die Punkte 3, 4, 5 und 7 sollen besonders hervorgehoben werden, da diese dem Autor den ausschlaggebenden Grund dafür gegeben haben ein eigenes Programm zu entwickeln. Keines der vom Autor evaluierten Systeme zum Kompilieren und Installieren wies alle diese Eigenschaften auf. fbuild ist auf [14] veröffentlicht. Auch das zentrale Subversion10 Repository befindet sich dort. Um das Programmpaket lokal auf den eigenen Rechner zu laden ist eine Internetverbindung notwendig, die auf das Repository zugreifen kann. Mit dem Befehl svn co https://svn.sourceforge.net/svnroot/fbuild fbuild werden die aktuellsten Dateien im Verzeichnis fbuild abgelegt11 . Oder, falls das Programm Subversion (svn ) nicht installiert ist, besteht die Möglichkeit die notwendigen Dateien von http://svn.sourceforge.net/fbuild (26. Dezember 2006) direkt zu laden. Die Verzeichnisstruktur des fbuild-Verzeichnisses sollte dann wie in Listing 3.5 auf der nächsten Seite aussehen. Die Dateien und Verzeichnisse der ersten Verzeichnisebene: 10 Die Daten von fbuild sind im zentralen Versionsverwaltungssystem Subversion [36] des Projektes SourceForge[3] gespeichert. 11 Achtung, evtl. muss in der Datei $HOME/.subversion/servers ein HTTP-Proxy angegeben werden, damit svn auf den zentralen Server zugreifen kann. 30 KAPITEL 3. KOMPILIEREN 3.2. FBUILD – ABHÄNGIGKEITEN COPYRIGHT: Die Lizenzvereinbarung. FBUILD/: In diesem Verzeichnis sind die fbuild -Paketbeschreibungen zu finden. Wie z. B. in Listing 3.3 auf Seite 29. deps: Diese Datei ist eigentlich ein Makefile. In dieser Datei sind die Abhängigkeiten der Pakete zueinander eingetragen. Die Verwendung ist in Abschnitt 3.2 beschrieben. fbuild.conf: Eine Konfigurationsdatei in der Umgebungsvariablen definiert werden können. fbuild.sh : Das Programm das in Abschnitt 3.3 auf der nächsten Seite im Detail beschrieben wird. patches/: In diesem Verzeichnis sind Fehlerbehebungen und Erweitungen in so genannten patch-Dateien gespeichert. Listing 3.5: fbuild-Verzeichnisstruktur und -Dateien 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 fbuild/ |-- COPYRIGHT |-- FBUILD/ | |-- a52dec-0.7.4.fbuild | |-- aalib-1.4rc5.fbuild | |-- alsa-lib-1.0.11.fbuild | |-- alsa-utils-1.0.11.fbuild | |-- arpwatch-ng-1.2.fbuild | |-- aspell-0.60.4.fbuild | |-- aspell-de-20030222-1.fbuild | |-- aspell-en-6.0-0.fbuild [...] |-- deps |-- fbuild.conf |-- fbuild.sh* ‘-- patches/ |-- aspell-0.60.3-templateinstantiations.patch |-- aspell-0.60.4-nls.patch |-- aspell-0.60.4.nww.patch [...] 3.2 fbuild – Abhängigkeiten In vielen Fällen muss beim Kompilieren und / oder Installieren eines Programms ein anderes Programm oder Paket installiert sein. Um diese Abhängigkeiten möglichst schnell, einfach und übersichtlich aufzulösen gibt es im fbuild -Verzeichnis die Datei deps. Diese enthält Zeilen in der Form nmap: pcre libpcap openssl . Damit ist es mit Hilfe des Programms make möglich die Datei wie in Listing 3.6 zu verwenden. 31 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Listing 3.6: Verwendung von deps 1 2 3 4 5 6 7 8 9 10 11 12 $ make -f deps nmap :pkgconfig: :pcre: pkgconfig :m4: :bison: m4 :flex: bison :libpcap: flex bison :zlib: :db: :perl: db :openssl: pkgconfig zlib perl :nmap: pcre libpcap openssl Es ist zu erkennen, dass das Paket nmap drei Abhängigkeiten (Zeile 12) besitzt: pcre , libpcap und openssl . pcre (Zeile 3) ist abhängig von einem Paket: pkgconfig ; dieses wiederum (Zeile 2) von keinem weiteren. 3.3 fbuild – Im Detail Das komplette Programm ist in Listing B.1 auf Seite 97 zu finden. In diesem Abschnitt werden die Teile des Programms betrachtet und erklärt. 3.3.1 Programmstart, Informationen und Variablen In diesem Abschnitt wird das Programm initialisiert. Es sind Informationen in Kommentarzeilen angegeben und wichtige Umgebungsvariablen werden auf bestimmte Werte gesetzt. Zeile 1: fbuild.sh ist ein /bin/sh -Programm (Shell-Script), um so portabel wie möglich zu sein (/bin/sh ist auf allen UNIX[57]-Plattformen vorhanden). Das gesamte, vorliegende Programm setzt lediglich voraus, dass die Shell (/bin/sh ) Funktionen versteht und korrekt ausführen kann12 . Zeile 3-18: Zeile 20: Die Lizenzvereinbarung. Versionsverwaltungsinformation. 12 Eine Erweiterung ist geplant (Abschnitt 3.6 auf Seite 53) um diese Abhängigkeit zu umgehen. 32 KAPITEL 3. KOMPILIEREN 3.3. FBUILD – IM DETAIL Zeile 22-23: Die Umgebungsvariable PATH wird auf einen definierten Wert gesetzt, wobei der ursprüngliche Wert in OLDPATH13 gespeichert wird. Die folgenden Programme, die von fbuild.sh aufgerufen werden, sollen die vom Betriebssystem zur Verfügung gestellten sein. Zeile 25-27: Die Sprachsteuerungsvariablen werden auf definierte Werte gesetzt, damit die von fbuild.sh aufgerufenen Programme definierte Ausgabewerte liefern. Zeile 29-31: Hier werden Umgebungsvariablen gelöscht, die das Verhalten des fbuild.sh Programms oder der erstellten Programme stören könnten. Mit LD PRELOAD können Betriebssystemfunktionen überschrieben werden, LD LIBRARY PATH kann die zu ladenden Bibliotheken ändern und LD RUN PATH kann das Verhalten des Compilers beeinflussen und dem erzeugten Programm einen Pfad zu Bibliotheken hinzufügen, die dann fälschlicherweise geladen würden. Zeile 33-36: Das Kommando, mit dem fbuild.sh aufgerufen worden ist (in der Regel ./fbuild.sh oder fbuild.sh ) und die ersten drei Parameter werden in Umgebungsvariablen gespeichert. 3.3.2 Hilfsfunktionen Die meisten der folgenden Hilfsfunktionen sind – falls nicht anders angegeben und mit f beginnend – dazu gedacht in den Hauptfunktionen (Abschnitt 3.3.3 auf Seite 37) der fbuild-Dateien verwendet zu werden. Zeile 38-123: Die Funktion Usage () erzeugt eine Ausgabe der Aufrufbeschreibung von fbuild.sh . Sie wird direkt von fbuild.sh verwendet und soll in den fbuild-Dateien nicht vorkommen. Zeile 125-145: Die Funktion f which () ist sowohl für fbuild-Dateien gedacht, wird aber auch von fbuild.sh selbst verwendet. Sie ist ein Ersatz für das Programm which und bildet dessen Funktionalität nach. f which () sucht in den Pfaden der Umgebungsvariablen PATH nach den übergebenen Funktionsparametern (Programmen) und prüft, ob diese ausführbar sind. Wird ein ausführbares Programm gefunden, so wird der vollständige Aufrufpfad ausgegeben. Werden alle Programme gefunden, so endet die Funktion mit 0“ als Rückgabewert. Wird ein, oder werden mehrere Programme nicht ” gefunden, so liefert die Funktion 1“ als Rückgabewert. ” 13 Dieser alte Pfad“ ist später eventuell notwendig um wget aufzurufen bevor PATH ” komplett gesetzt ist. 33 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Zeile 147: Die Funktion f echo () sollte in den fbuild-Dateien statt echo verwendet werden, sofern sie dazu benutzt wird um direkt einen Text auszugeben. Zeile 149-150: Die Funktionen f sed () und f awk () sollten in den fbuildDateien statt sed und awk verwendet werden, da diverse Betriebssysteme unterschiedliche Versionen dieser Programme anbieten. Diese Kapselung der Programme soll sicherstellen, dass diese Funktionen – unabhängig vom jeweiligen Programm selbst – immer die gleiche Funktionalität bieten. Im Moment ist in fbuild.sh noch nichts Spezielles implementiert. Sollte jedoch etwas fehlen, wäre hier Platz für Erweiterungen14 . Zeile 152-177: Die Funktion f source () wird grundsätzlich mit einem Parameter (einer Datei) aufgerufen. Diese Datei wird dann in den Verzeichnissen: /etc/fbuild.d/, $FBUILDHOME/etc/fbuild.d/ und $FBUILDHOME/ gesucht. Dabei wird der Inhalt der Datei ausgeführt; die fbuild-Dateien werden mit dieser Funktion geladen“. ” Auch die Konfigurationsdatei (fbuild.conf) wird auf diese Weise integriert (f source () ohne Parameter), wobei die Datei $HOME/.fbuildrc (falls vorhanden) noch zusätzlich geladen“ wird. ” Es ist zu beachten, dass alle Dateien – falls diese in den genannten Verzeichnissen vorkommen – geladen“ werden. Dabei ” können Umgebungsvariablen und Funktionen überschrieben werden. Soll dieses Überschreiben verhindert werden, kann die Funktion f setifenv () (siehe weiter unten) verwendet werden um eine Umgebungsvariable zu setzen. Zeile 179-189: Die Funktion f unsetenv () löscht die Variable deren Name als Parameter übergeben wird. Weiters wird auch eine Variable gelöscht die dem übergebenen Namen sed vorangestellt hat. Diese sed -Variablen werden von der Funktion f setenv () automatisch gesetzt. Sie sind für die Funktion f sed () notwendig, da in dieser alle / durch \/ ersetzt werden müssen. Zeile 191-202: Die Funktion f setenv () setzt die Variable, deren Name im ersten Parameter übergeben wird, auf den Wert des zweiten Parameters. Weiters wird eine Variable gesetzt deren Name ein sed vorgestellt ist. Dabei werden in deren Wert alle / durch \/ ersetzt. Wie oben schon erwähnt, ist dies notwendig für die Funktion f sed (). 14 Dem Autor ist bekannt, dass es Implementierungen von sed gibt die mit dem Parameter -i nicht umgehen können. Dies wäre die Stelle an der eine solche Erweiterung implementiert werden sollte. 34 KAPITEL 3. KOMPILIEREN 3.3. FBUILD – IM DETAIL Zeile 204-219: Die Funktion f setifenv () verhält sich wie die Funktion f setenv (), falls der Wert der Variablen nicht gesetzt oder leer ist. Ist die Variable bereits gesetzt, so wird die sed -Variable initialisiert (siehe dazu f setenv () und f unsetenv () weiter oben), und zwar mit dem ursprünglichen Wert (nicht mit dem Wert des zweiten Parameters). Diese Funktion sollte in der Konfigurationsdatei beim Setzen der Variablen verwendet werden. Dadurch kann der Benutzer diese Variablen gegebenenfalls direkt auf der Kommandozeile überschreiben15 . Zeile 221-251: Die Funktion AppendOrPrependEnv () sollte ausschließlich von fbuild.sh selbst verwendet werden. Sie wird von f appendenv () und f prependenv () (siehe unten) aufgerufen. Es wird an eine Variable (zweiter Parameter) der dritte Parameter hinten angehängt oder vorne hinzugefügt. Dazwischen wird ein Trenner (vierter Parameter) oder ein Leerzeichen (kein vierter Parameter) eingefügt. Sollte die zu ändernde Variable leer sein oder nicht existieren, so wird diese gesetzt und kein zusätzlicher Trenner eingefügt. Der zweite Parameter bestimmt ob hinten angehängt (append) oder vorne hinzugefügt (prepend) wird. Zeile 253-259: Die Funktion f appendenv () ruft AppendOrPrependEnv () (siehe oben) mit dem Parameter append auf und übergibt alle weiteren Parameter. Zeile 261-267: Die Funktion f prependenv () verhält sich wie die Funktion f appendenv () (siehe oben). Allerdings wird prepend übergeben. Zeile 269-296: Die Funktion f subenv () substituiert vom Inhalt einer Variablen (erster Parameter) einen regulären Ausdruck (zweiter Parameter) mit dem dritten Parameter. Dabei wird der vierte Parameter als Trenner berücksichtigt16 . 15 z. B. : OPTIMIZE=’-O1’ ./fbuild.sh FBUILD/nmap-4.11.fbuild Der Trenner muss vor und nach dem zweiten Parameter im Inhalt der Variablen vorkommen, falls der zweiten Parameter nicht am Anfang und nicht am Ende steht; er muss nach dem zweiten Parameter vorkommen, falls dieser am Anfang steht; er muss vor dem zweiten Parameter vorkommen, falls dieser am Ende steht; er wird nicht berücksichtigt falls ausschließlich der zweite Parameter vorkommt. 16 35 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Mit f subenv CFLAGS ’-O.’ ’’ ’[\t ][\t ]*’ werden zum Beispiel die -O Optimierungsparameter aus der Umgebungsvariablen CFLAGS entfernt. Dies ist früher in den fbuild-Dateien recht oft vorgekommen. Inzwischen kann dieses Verhalten direkt auf der Kommandozeile mit OPTIMIZE=’’ ./fbuild.sh <fbuild-Datei> erzielt werden. Dies ist nun auch die bevorzugte Methode, da der Benutzer die Kontrolle über die Optimierung der Programme haben sollte. Das heißt, dass die Optimierung nicht in den fbuild-Dateien festgelegt werden soll! Zeile 298-332: Die Funktion f unpack () extrahiert aus einer Datei (erster Parameter) das eventuell komprimierte Archiv aus Dateien und Verzeichnissen. Dabei muss nicht unbedingt der komplette Name des Archivs angegeben werden. Die Funktion erweitert den übergebenen Namen mit verschiedensten Erweiterungen und dekomprimiert gegebenenfalls die Datei. Zeile 334-342: Die Funktion f download () versucht mit Hilfe des Programms wget eine Datei vom Internet zu laden. Deren Ort wird im ersten Parameter, mit Hilfe eines URL’s, angegeben. Die Datei wird im Verzeichnis $DL DIR gespeichert. Es sollte vorab geprüft werden, ob die zu ladende Datei schon existiert. Falls dem so ist, sollte entweder die existierende Datei zuvor entfernt oder die Datei nicht noch einmal geladen werden. Zeile 344-376: Die Funktion f patch () kann einerseits verwendet werden um Fehler des Quellcodes zu beheben und andererseits um den Quellcode (und somit die resultierenden Programme) zu erweitern. Sie muss mit mindestens zwei Parametern aufgerufen werden. Erster Parameter ist eine so genannte Patch-Datei17 , welche die Änderungen des Quellcodes beinhaltet. Der zweite und alle weiteren Parameter werden dem Programm patch direkt übergeben. -p n (meist -p0 oder -p1 ) sollte immer übergeben werden (aus diesem Grund muss ein zweiter Parameter angegeben werden). -p n bestimmt um wie viele (n ) Verzeichnisse die Pfade, zu den Dateien in der Patch-Datei, gekürzt werden. Ähnlich wie die Funktion f unpack () erkennt f patch () komprimierte Patch-Dateien automatisch und dekomprimiert diese entsprechend. 17 kann mit dem Programm diff erzeugt werden 36 KAPITEL 3. KOMPILIEREN 3.3.3 3.3. FBUILD – IM DETAIL Hauptfunktionen Die folgenden Funktionen werden von fbuild.sh abgearbeitet. Sie sollen gegebenenfalls in den fbuild-Dateien geändert bzw. überschrieben werden. Lediglich drei (f configure (), f make () und f makeinstall ()) der elf Hauptfunktionen sind vorkonfiguriert (und notwendig) um Pakete zu konfigurieren und installieren, deren Programmierer autoconf , automake und (evtl.) libtool verwendet haben. Die anderen acht Funktion führen, solange sie nicht in der fbuild-Datei überschrieben werden, keine Aktionen aus. Pakete die den autoconf , automake , libtool Standards nicht entsprechen, oder Pakete deren Konfiguration speziell geändert werden soll / muss, müssen die entsprechenden (folgenden) Hauptfunktionen ändern bzw. überschreiben. Zeile 378-379: Die Funktionen f setvars () und f info () führen grundsätzlich keine Aktionen aus. f setvars () wird nach dem Setzen der Standardwerte der Umgebungsvariablen aufgerufen. Die Funktion soll verwendet werden um, wenn nötig, Umgebungsvariablen mit den Hilfsfunktionen (z. B. f setenv (), f appendenv (), f prependenv ()) zu setzen oder zu ändern. f info () kann verwendet werden um eine Information auszugeben. Die Funktion wird aufgerufen nachdem fbuild.sh die gesetzten relevanten Umgebungsvariablen und deren Werte ausgegeben hat. Zeile 381-383: Die Funktion f configure () ruft die Standardfunktion def configure () auf und ist somit für autoconf -Pakete, deren Konfiguration nicht geändert werden soll, vorkonfiguriert. In dieser Funktion soll das zu kompilierende Paket an die Plattform (Prozessor, Architektur und Betriebssystem) angepasst werden. f pre configure () und f post configure () werden jeweils vor und nach f configure () aufgerufen. Sie sollen verwendet werden, wenn in Bezug auf die Konfiguration, vor oder nach dem Aufruf von f configure (), Änderungen durchgeführt werden müssen. Zeile 385-387: f make () ruft die Standardfunktion def make () auf und ist somit für die meisten Pakete vorkonfiguriert. In dieser Funktion soll das Paket kompiliert werden. f pre make () und f post make () werden jeweils vor und nach f make () aufgerufen. Sie sollen verwendet werden, wenn in Bezug auf die Kompilation, vor oder nach dem Aufruf von f make (), Änderungen durchgeführt werden müssen. 37 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Zeile 389-391: Die Funktion f makeinstall () soll das Paket installieren und ist mit der Funktion def makeinstall () vorkonfiguriert. f makeinstall () und f post makeinstall () werden jeweils vor und nach f makeinstall () aufgerufen. Sie sollen verwendet werden, wenn in Bezug auf die Installation, vor oder nach dem Aufruf von f makeinstall (), Änderungen durchgeführt werden müssen. 3.3.4 Standardfunktionen Die folgenden Funktionen sollen in den fbuild-Dateien – wann immer es möglich ist – von den Hauptfunktionen (Abschnitt 3.3.3 auf der vorherigen Seite) aufgerufen werden. Sie sollen keinesfalls in den fbuild-Dateien geändert oder überschrieben werden. Stattdessen sind die Hauptfunktionen zu ändern! Die Standardfunktionen sind für autoconf , automake und libtool Pakete geeignet, lassen sich aber in fast allen Fällen auch – durch weitere Parameter oder gesetzte Umgebungsvariablen – an Pakete anpassen die diesen Standards nicht entsprechen. Zeile 393-397: Die Funktion def configure () ruft das configure Programm auf und übergibt diesem Optionen. Es wird sichergestellt, dass bei der Installation das Programm und dessen Dateien an die richtigen Stellen installiert werden (--prefix="$PREFIX" ), dass – sofern Bibliotheken erzeugt werden – diese von mehreren Programmen gleichzeitig verwendet und zur Laufzeit geladen werden können (Parameter --disable-static und --enable-shared ), und, dass als Linker jener des GNU Projektes (GNU Binutils [21]) verwendet werden soll (Parameter --with-gnu-ld ). Werden Parameter an def configure () übergeben, so werden diese an configure weitergereicht. configure wird mit der Angabe des absoluten Pfades aufgerufen. Das ist für manche Pakete notwendig und von den autoconf -Entwicklern empfohlen. Zeile 398-400: fbuild unterstützt auch das Kompilieren von Perl-Paketen. Die Funktion def perl configure () sollte in dem Fall statt def configure () von f configure () aufgerufen werden. 38 KAPITEL 3. KOMPILIEREN 3.3. FBUILD – IM DETAIL Zeile 401-403: Die Funktion def make () ruft das Programm make auf um das Paket zu kompilieren. Mit Hilfe der Umgebungsvariablen MAKETHREADS , welche normalerweise auf -j3 gesetzt ist, wird make angewiesen immer drei Prozesse gleichzeitig zu starten. In den meisten Fällen ist das für die Dauer des Kompiliervorganges von Vorteil. Sollten vier oder mehr Prozessoren im System vorhanden sein, so ist diese Variable entsprechend anzupassen (-j4 , -j8 , . . . ). Falls ein Paket mit mehreren make -Prozessen nicht umgehen kann, so ist in der fbuild-Datei USE MAKETHREADS=’no’ anzugeben. Damit ist sichergestellt, dass MAKETHREADS immer auf -j1 gesetzt wird. MAKEFLAGS darf vom Benutzer verwendet werden um make weitere Parameter zu übergeben. Zeile 404-417: def perl make () sollte in der Hauptfunktion f make () verwendet werden um Perl-Module, die mit def perl configure () konfiguriert wurden, zu kompilieren. Auch hier werden, wie bei def make (), die Variablen MAKEFLAGS und MAKETHREADS an make übergeben. Zeile 418: Mit der Funktion def makeinstall () können praktisch alle Pakete installiert werden. Die Installationspfade wurden schon in der Konfiguration festgelegt. In sehr seltenen Ausnahmefällen sind die erzeugten Programme, Bibliotheken, Include-Dateien, Handbuch-Dateien, etc. mit Hilfe von cp direkt zu installieren. 3.3.5 Hauptprogramm Bisher wurden lediglich Funktionen definiert und Umgebungsvariablen gesetzt. Diese werden im folgenden Hauptprogramm verwendet und aufgerufen. Zeile 423-434: Hier werden die Übergabeparameter ausgewertet. Ein Parameter (fbuild-Datei) ist zwingend, ein Zweiter (Plattform) ist optional. Wird kein Parameter oder werden mehr als zwei Parameter angegeben, so wird die Funktion Usage () ausgeführt (und somit die Aufrufbeschreibung von fbuild.sh und einige weitere Informationen ausgegeben) und das Programm beendet. Zeile 436-441: Hier werden die Komprimierungsprogramme bzip2 und gzip gesucht, die – zum Dekomprimieren – in jeweils zwei verschiedenen Varianten vorkommen können. Speziell bei Minimalsystemen18 kommt es 18 Embedded-Systems 39 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN oft vor, dass lediglich das Dekomprimierungsprogramm installiert ist. Fast alle quelloffenen Pakete werden in komprimierter Form veröffentlicht, da sich Quelltexte zum einen sehr gut komprimieren lassen, zum anderen die Übertragungszeit beim Laden aus dem Internet verkürzt und die Bandbreite geschont wird. Aus diesen Gründen wird praktisch jeder veröffentlichte Quellcode komprimiert zur Verfügung gestellt. Somit ist ein Dekomprimieren vor dem Entpacken des Quellcodes notwendig. Zeile 444-445: Die Variable D wird auf das lokale Datum / die lokale Uhrzeit gesetzt und in der nächsten Zeile, mit dem Namen der fbuild-Datei, ausgegeben. So kann – sofern die Ausgabe gespeichert wird – später nachvollzogen werden was wann kompiliert wurde. Die Umgebungsvariable D wird auch verwendet wenn Verzeichnisse gelöscht werden sollten. fbuild.sh löscht niemals Installationsverzeichnisse! Stattdessen wird das existierende Verzeichnis verschoben / umbenannt (es wird $D – ein Zeitstempel – an den vorherigen Namen angehängt). Zeile 447-449: Die Umgebungsvariable FBUILDHOME wird auf das aktuelle Verzeichnis gesetzt, sofern FBUILDHOME nicht gesetzt ist. Das ermöglicht ein direktes Ausführen von fbuild.sh in der gegebenen Verzeichnisstruktur ohne die Variable vorher setzen zu müssen oder in den Konfigurationsdateien anzugeben19 . Mit obiger Variable kann das Programm die Konfigurationsdatei, die fbuild-Dateien und die Fehlerkorrektur- / Erweiterungsdateien finden. Dies ist auch gleich in den nächsten beiden Zeilen notwendig, wenn fbuild.sh die Konfigurationsdatei und die fbuild-Datei ausführt. Zeile 451-455: Hier werden die Basisumgebungsvariablen auf ihre Standardwerte (siehe Tabelle 3.1 auf der nächsten Seite) gesetzt, sofern diese Variablen nicht schon gesetzt wurden (entweder via Kommandozeile oder in der Konfigurationsdatei). PATCH DIR: Verzeichnis der Fehlerkorrektur- und Erweiterungsdateien. Es wird ausschließlich lesend auf dieses Verzeichnis zugegriffen. 19 Eine Erweiterung hierzu ist geplant (Abschnitt 3.6 auf Seite 53). fbuild.sh sollte von jedem Verzeichnis aus gestartet werden können und auch alle notwendigen Dateien finden. 40 KAPITEL 3. KOMPILIEREN Variable PATCH DIR DL DIR SRC DIR BUILD DIR BASE NOPLAT 3.3. FBUILD – IM DETAIL Grundeinstellung $FBUILDHOME/patches /home/download /tmp /tmp /misc Tabelle 3.1: fbuild.sh Variablendetails (1) DL DIR: Verzeichnis der Quellcodepakete. Befinden sich diese noch nicht in diesem Verzeichnis, so muss es für den Anwender beschreibbar sein, da der Quellcode aus dem Internet geladen und in diesem Verzeichnis gespeichert wird. Ist das Quellcodepaket schon vorhanden, so wird lediglich lesend auf dieses Verzeichnis zugegriffen. SRC DIR: Verzeichnis zum Entpacken des Quellcodes. fbuild.sh benötigt hier Schreibrechte. BUILD DIR: Verzeichnis zum Kompilieren und Anlegen aller erzeugten Daten. Auch hier benötigt fbuild.sh Schreibrechte. BASE NOPLAT: Basisinstallationsverzeichnis ohne Angabe der Plattform. Achtung, viele Quellcodepakete können nicht mit unterschiedlichem SRC DIR und BUILD DIR umgehen. Aus diesem Grund sind diese Verzeichnisse in der Grundeinstellung auch gleich. Für die Pakete, die verschiedene SRC DIR und BUILD DIR empfehlen oder sogar voraussetzen, empfiehlt der Autor – mit Hilfe der fbuild-Datei und der Funktion f pre configure () – innerhalb von BUILD DIR ein weiteres Verzeichnis anzulegen und dieses als build-Verzeichnis zu verwenden. Zeile 458-492: Die Umgebungsvariable PLAT wird hier gesetzt. Folgende Reihenfolge gilt: 1. Angabe als zweiter Parameter zu fbuild.sh . 2. Angabe als Variable auf der Kommandozeile. 3. Angabe in der Konfigurationsdatei. 4. Automatisches setzen via Programm, welches vom Internet geladen wird. 41 3.3. FBUILD – IM DETAIL Variable BASE BASE KAPITEL 3. KOMPILIEREN Grundeinstellung $BASE NOPLAT/$PLAT $BASE NOPLAT/CROSS-$CROSSPLAT Tabelle 3.2: fbuild.sh Variablendetails (2) Falls trotz allem PLAT nicht gesetzt wird / werden kann, dann wird eine Warnung ausgegeben und ohne das Setzen von PLAT weitergearbeitet. Solange die Verzeichnisstruktur von fbuild.sh nur für eine Plattform verwendet wird, sollte dies kein Problem sein. Zeile 494-506: Die Umgebungsvariable BASE wird hier gesetzt (Tabelle 3.2). Sie setzt sich – falls nicht via Kommandozeile oder Konfigurationsdatei überschrieben – aus den Verzeichnissen $BASE NOPLAT und $PLAT zusammen. Weiters wird hier geprüft ob USE CROSSPLAT auf yes gesetzt ist. Falls dem so ist, wird BASE auf $BASE NOPLAT/CROSS-$CROSSPLAT gesetzt. Auf Details zum Cross-Plattform-Kompilieren20 wird in dieser Arbeit nicht eingegangen. Zeile 508-514: Die folgenden Variablen bestimmen die grundlegenden Installationsverzeichnisse (Standardwerte, siehe Tabelle 3.3 auf der nächsten Seite). BASEOPT: In dieses Basisverzeichnis werden die Pakete installiert. Wie in Listing 3.2 auf Seite 28 ersichtlich, wird zum vollständigen Installationspfad noch der Name des Programms und dessen Version angehängt. LINKBIN: In diesem Verzeichnis werden relative Verknüpfungen angelegt, welche auf die Programme des bin-Verzeichnisses des installierten Paketes zeigen. Reguläre Benutzer können ihre PATH-Umgebungsvariable auf dieses Verzeichnis setzen und so immer auf die aktuellsten Programme, die mit fbuild kompiliert wurden, zugreifen. LINKSBIN: Wie bei LINKBIN werden in diesem Verzeichnis Verknüpfungen angelegt. Diese zeigen jedoch auf die Programme des sbin-Verzeichnisses des installierten Paketes. Programme die dort angelegt werden sind meist nur für den Administrator interessant, es kann aber durchaus auch vorkommen, dass diese Programme für reguläre Benutzer nützlich sind. 20 Cross-Plattform-Kompilieren ist das Kompilieren eines Programms für eine bestimmte Plattform (z. B. powerpc64-unknown-linux-uclibc ) auf einer anderen Plattform (z. B. i686-pc-linux-gnu ). Dazu sind Cross-Compiler, Cross-Assembler, Cross-Linker, Cross-Include-Dateien und Cross-Bibliotheken notwendig. 42 KAPITEL 3. KOMPILIEREN Variable BASEOPT LINKBIN LINKSBIN LINKINC LINKLIB LINKMAN LINKINFO 3.3. FBUILD – IM DETAIL Grundeinstellung $BASE/opt $BASE/bin $BASE/sbin $BASE/include $BASE/lib $BASE/man $BASE/info Tabelle 3.3: fbuild.sh Variablendetails (3) LINKINC: Verknüpfungen in das include-Verzeichnis des installierten Paketes. Sollte die Installation des Paketes hier auch Verzeichnisse angelegt haben, so werden diese im LINKINC-Verzeichnis ebenfalls angelegt und in diesem die Verknüpfungen erzeugt. LINKLIB: Verknüpfungen in das lib-Verzeichnis und somit zu den Bibliotheken des installierten Paketes. LINKMAN: Verknüpfungen in das man-Verzeichnis des installierten Paketes. Wie bei LINKINC werden auch hier gegebenenfalls Verzeichnisse erzeugt. LINKINFO: Verknüpfungen in das info-Verzeichnis des installierten Paketes. Zeile 516-521: Die in diesem Abschnitt gesetzten Variablen (LIB2OPT, INC2OPT, BIN2OPT, SBIN2OPT, MAN2OPT, INFO2OPT) geben an, wie, vom jeweiligen Verknüpfungsverzeichnis (siehe oben) in das opt-Verzeichnis gewechselt wird. Sollte ein Anwender die Hierarchieebene der Verknüpfungsverzeichnisse oder des opt-Verzeichnisses ändern, so sind auch diese Variablen anzupassen. Standardwert ist für alle Variablen ../opt. Eine Erweiterung (siehe Abschnitt 3.6 auf Seite 53) ist in Planung um diese Variablen automatisch zu setzen. Zeile 523-531: Hier werden die Namen der Standardprogramme gesetzt. Auch diese können direkt auf der Kommandozeile überschrieben werden. Zum Beispiel: PERL=miniperl ./fbuild.sh FBUILD/autoconf-2.59d.fbuild 43 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Zeile 533-540: Dieser Abschnitt ist besonders wichtig beim Kompilieren von Programmen. Die Pfade zu den Include-Dateien, die Optimierungsoptionen und die Pfade zu den Bibliotheken werden für Compiler und Linker gesetzt. Der Autor möchte hier speziell auf die Option -Wl,--enable-new-dtags hinweisen, die über den Compiler den Linker anweist in den Binärdateien eine Option zu setzen. Damit wird die Umgebungsvariable LD LIBRARY PATH reaktiviert, die bei manchen Systemen deaktiviert wird, wenn -Wl,--rpath -Wl,$LINKLIB verwendet wird (was bei fbuild der Fall ist). Zeile 542-548: Die Umgebungsvariable PATH wird mit den Pfaden der Variablen LINKBIN und LINKSBIN erweitert. PRE PATH bzw. POST PATH werden anschließend vorne hinzugefügt bzw. hinten angehängt. Zeile 550-552: An dieser Stelle werden die Variablen rev und suf aus den Variablen REV und SUF (welche in den fbuild-Dateien gesetzt werden können) generiert. Dabei gilt: rev="-r$REV" und suf=" $SUF" . REV soll in der fbuild-Datei angegeben werden, wenn in einer fbuildDatei Verbesserungen vorgenommen werden, sich die Version des Paketes aber nicht ändert. SUF soll in der fbuild-Datei angegeben werden, wenn eine fbuild-Datei noch in Arbeit ist, diese aber trotzdem veröffentlicht werden soll. rev und suf werden direkt an die Version des Paketes angehängt. Mit N="pkg"; V="1.7"; REV="2"; SUF="alpha3" in der fbuild-Datei wäre das Installationsverzeichnis dann $BASEOPT/pkg/1.7-r2 alpha2 und die fbuild-Datei würde man pkg-1.7-r2 alpha3.fbuild nennen. Zeile 554-563: PREFIX wird hier gesetzt. Diese Variable gibt das Installationsverzeichnis des Paketes an. Die Installationsfunktion (f makeinstall ()) darf an keiner anderen Stelle Daten ablegen. Die Variable wird grundsätzlich auf $BASEOPT/$N/$V$suf$rev gesetzt. Dabei müssen N (Name des Paketes) und V (Version des Paketes) in jeder fbuild-Datei angegeben werden. Die anderen drei Variablen wurden weiter oben schon besprochen. Ist PREFIX bereits gesetzt, so ändert fbuild.sh den Standardwert von USE MOVE PREV PACKAGE auf no . Das bedeutet, dass ein – an der Stelle – existierendes Paket nicht vorher verschoben (gesichert) wird. Diese Funktionalität ist für Perl -Module notwendig, auf die in dieser Arbeit nicht näher eingegangen wird. 44 KAPITEL 3. KOMPILIEREN Variable ID DIR URL 3.3. FBUILD – IM DETAIL Grundeinstellung $N-$V. $N-$V nicht gesetzt Tabelle 3.4: fbuild.sh Variablendetails (4) Aus dem selben Grund (Perl -Module) werden die Standardwerte für USE DEFAULT LINK und USE LINKDIR LINKS auf no geändert und PREFIX und PERLFLAGS initialisiert. Zeile 565-567: ID , DIR und URL werden initialisiert. Sollen diese Umgebungsvariablen geändert werden, so sind sie direkt in den fbuild-Dateien anzugeben (siehe Listing B.33 auf Seite 131). ID : Dateiname des Quellpaketes – sollte ohne Dateierweiterung angegeben werden, da f unpack () diese selbstständig findet und sich die Dateierweiterung auch ändern kann21 . Wenn der Paketname nicht dem Standard ($N-$V. ) entspricht, ist ID zu setzen. DIR : Wird das Quellpaket entpackt, dann befinden sich meist alle Daten in einem Verzeichnis. Dieses Verzeichnis ist mit DIR anzugeben, falls es sich vom Standardwert ($N-$V ) unterscheidet. URL : Sollte angegeben werden, damit fbuild.sh das Quellcode-Paket vom Internet laden kann. Wenn es möglich ist sollten $N und $V im URL verwendet werden (diese Variablen müssen in der fbuild-Datei direkt gesetzt werden – siehe oben). Zeile 569-573: Hier erfolgt die Initialisierung von MAKETHREADS . Sollte USE MAKETHREADS auf no gesetzt sein, so wird MAKETHREADS in jedem Fall auf -j1 22 gesetzt. Ist USE MAKETHREADS nicht angegeben, so ist der Standardwert -j3 23 , welcher mit MAKETHREADS überschrieben werden kann. Zeile 575-589: USE X11 sollte nur in Ausnahmefällen verwendet werden. Und zwar genau dann, wenn die vom Betriebssystem zur Verfügung gestellten X11-Bibliotheken24 verwendet werden sollen (der Autor rät jedoch auch diese zu kompilieren!). 21 Dateiname des Quellpaketes: zlib-1.2.3.tar.gz ID="zlib-1.2.3." jeweils nur ein Prozess gleichzeitig 23 jeweils drei Prozesse gleichzeitig 24 Eine genaue Erläuterung des X11-Grafiksystems würde hier zu weit führen. 22 45 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Zeile 591-598: USE PERL ist auf yes zu setzen wenn Perl oder Perl Module kompiliert werden. Zeile 600-602: An dieser Stelle wird f setvars () aufgerufen, jene Hauptfunktion (siehe Abschnitt 3.3.3 auf Seite 37) die gundsätzlich nichts ausführt, außer sie wird in der fbuild-Datei überschrieben. Zeile 604-639: Alle relevanten, den Kompiliervorgang beeinflussenden Umbebungsvariablen werden angezeigt. Zeile 641-643: f info () wird aufgerufen. Wie f setvars () ist f info () eine Hauptfunktion (siehe Abschnitt 3.3.3 auf Seite 37) die gundsätzlich nichts ausführt, außer sie wird in der fbuild-Datei überschrieben. Zeile 646-664: Es wird in das SRC DIR-Verzeichnis gewechselt, ein eventuell vorhandenes Quellcodeverzeichnis (DIR ) gelöscht und der Quellcode ausgepackt. Sollte das Auspacken des Quellcodes fehlschlagen, so wird versucht den Quellcode vom Internet zu laden und dann auszupacken. Gelingt auch dies nicht beendet sich fbuild.sh . Zeile 666-668: Hier wird in das BUILD DIR-Verzeichnis gewechselt (normalerweise, wenn nicht verändert, dasselbe Verzeichnis wie SRC DIR). Dann wird, falls BUILD DIR und SRC DIR unterschiedlich sind, das Verzeichnis DIR vollständig gelöscht und neu angelegt. Danach wird in das Verzeichnis DIR gewechselt. Zeile 671-689: f pre configure (), f configure (), f post configure () und f pre make (), f make (), f post make () werden (in der angegebenen Reihenfolge) aufgerufen. Falls in der fbuild-Datei nicht anders definiert, führen nur die Hauptfunktionen f configure () und f make () Kommandos25 aus. Sobald eine der Funktionen mit einem Fehler (Rückgabewert ungleich 0) abschließt, beendet sich fbuild.sh . Enden alle Hauptfunktionen (siehe Abschnitt 3.3.3 auf Seite 37) mit dem Rückgabewert 0, so wird das Programm fbuild.sh weiter abgearbeitet, und das angegebene Paket wurde erfolgreich konfiguriert und kompiliert. 25 die Standardfunktionen def configure () und def make () (siehe Abschnitt 3.3.4 auf Seite 38) 46 KAPITEL 3. KOMPILIEREN 3.3. FBUILD – IM DETAIL Zeile 692-699: An dieser Stelle wird ein bereits existierendes Paket, mit gleichem Namen und gleicher Version, umbenannt. Die Umgebungsvariable USE MOVE PREV PACKAGE (Standardwert ist yes ) kann dies gegebenenfalls verhindern. Falls für ein Paket die Variable PREFIX gesetzt wird oder falls USE PERL verwendet wird, ändert sich der Standardwert auf no und ein existierendes Installationsverzeichnis wird nicht verschoben. Zeile 702-710: Das Paket wird nun mit Hilfe der Hauptfunktionen (siehe Abschnitt 3.3.3 auf Seite 37) f pre makeinstall (), f makeinstall () und f post makeinstall () installiert. fbuild.sh endet, falls eine der Funktionen einen Fehler (Rückgabewert nicht 0) zurückliefert. Lediglich die Funktion f makeinstall () ist mit der Standardfunktion (siehe Abschnitt 3.3.4 auf Seite 38) def makeinstall () vordefiniert. Die beiden anderen Funktionen führen, falls in der fbuild-Datei nicht anders angegeben, keine Operationen aus. 3.3.6 Verknüpfungen An dieser Stelle, im Programm fbuild.sh , ist das Paket bereits kompiliert und – an der Stelle die mit der Umgebungsvariablen PREFIX angegeben war – installiert. Es folgen nun, um eine Installationsstruktur wie in Listing 3.2 auf Seite 28 zu generieren, eine Reihe von Befehlen die schließlich die Verknüpfungen erzeugen. Zeile 714-725: Hier wird eine Verknüpfung erzeugt die default heißt und auf die gerade installierte Version des Paketes zeigt. Die Verknüpfung dient lediglich dem Anwender um sich zu orientieren und schnell, ohne die Version wissen zu müssen, in das Verzeichnis des installierten Paketes wechseln zu können. Existiert die Verknüpfung bereits, wird sie (mit einem Zeitstempel versehen) umbenannt. So kann jederzeit festgestellt werden wann ein Paket installiert wurde. Sollte USE DEFAULT LINK auf no gesetzt sein oder (wenn PREFIX geändert wurde) das Verzeichnis $BASEOPT/$N/$V$suf$rev nicht existieren, so wird diese default-Verknüpfung nicht angelegt. 47 3.3. FBUILD – IM DETAIL KAPITEL 3. KOMPILIEREN Zeile 727-879: Sofern USE LINKDIR LINKS nicht auf no gesetzt ist, werden im folgenden Programmcode die Verknüpfungen in den Verzeichnissen LINKBIN, LINKSBIN, LINKLIB, LINKINC, LINKMAN und LINKINFO erzeugt. In den Zeilen 742 bis 747 werden die Verknüpfungsverzeichnisse erzeugt, falls diese noch nicht existieren. In den Zeilen 749 bis 761 werden die Verknüpfungen im Verzeichnis $LINKBIN zum Verzeichnis $PREFIX/bin generiert. Lediglich Dateien und Verknüpfungen der ersten Verzeichnisebene in $PREFIX/bin werden verknüpft. Existieren Verknüpfungen mit dem selben Namen in $LINKBIN bereits, so werden diese umbenannt und mit einem Zeitstempel versehen. Existiert $PREFIX/bin nicht oder entspricht das Verknüpfungsverzeichnis dem Verzeichnis $PREFIX/bin, so werden keine Verknüpfungen angelegt. Zeilen 763 bis 775 erledigen die gleichen Aufgaben für $LINKSBIN und $PREFIX/sbin wie im obigen Absatz für $LINKBIN und $PREFIX/bin beschrieben. Zeilen 777 bis 791 erledigen fast die gleichen Aufgaben für $LINKLIB und $PREFIX/lib wie im oben für $LINKBIN und $PREFIX/bin beschrieben; allerdings nur für Dateien oder Verknüpfungen deren Namen auf .so endet oder in deren Namen .so. vorkommt. In den Zeilen 793 bis 808 wird für $LINKINC und $PREFIX/include nahezu das Selbe ausgeführt wie weiter oben für $LINKBIN und $PREFIX/bin beschrieben; in diesem Fall werden zusätzlich noch Verzeichnisse in $PREFIX/ include berücksichtigt – diese werden gegebenenfalls in $LINKINC ebenfalls angelegt. Zeilen 810 bis 824: Wie im vorigen Absatz für $LINKINC und $PREFIX/ include – hier aber für $LINKMAN und $PREFIX/man. Zeilen 826 bis 844: Ähnlich wie oben bei $LINKLIB und $PREFIX/lib – hier allerdings für $LINKINFO und $PREFIX/info; wobei die Dateien in denen .info vorkommt verknüpft werden. Zusätzlich wird das Programm $INSTALLINFO 26 für jede Datei aufgerufen die auf .info endet, um somit den info-Index ($LINKINFO/dir) neu zu generieren. In den Zeilen 846 bis 874 werden Verknüpfungen für die Programme aclocal (automake ) und pkg-config angelegt. Diese befinden sich in den Installationsverzeichnissen der genannten Pakete27 . Zeile 881: Zum Abschluss werden der Name der fbuild-Datei, der StartZeitstempel und der aktuelle Zeitstempel ausgegeben. 26 falls nicht anders angegeben: installinfo $BASEOPT/pkgconfig/default/lib/pkgconfig $BASEOPT/automake/default/share/aclocal 27 48 KAPITEL 3. KOMPILIEREN Variable BASE NOPLAT BASE BASEOPT LINKBIN LINKSBIN LINKINC LINKLIB LINKMAN LINKINFO LIB2OPT INC2OPT BIN2OPT SBIN2OPT MAN2OPT INFO2OPT 3.4. FBUILD – DIE ARBEITSWEISE Grundeinstellung /misc $BASE NOPLAT/$PLAT $BASE/opt $BASE/bin $BASE/sbin $BASE/include $BASE/lib $BASE/man $BASE/info ../opt ../opt ../opt ../opt ../opt ../opt Tabelle 3.5: fbuild.sh Installationsvariablen 3.4 fbuild – Die Arbeitsweise Die Programmpakete werden mit einem Aufruf, von zum Beispiel ./fbuild.sh FBUILD/nmap-4.11.fbuild vom Internet geladen, konfiguriert, kompiliert und in die Standard-fbuild Verzeichnisstruktur (wie z. B. in Listing 3.2 auf Seite 28) installiert. Soll diese Verzeichnisstruktur geändert werden, so bietet das fbuild -System Variablen zur Modifikation an (siehe Tabelle 3.5; und Abschnitt 3.3.5 auf Seiten 39–47 für eine genaue Beschreibung der Variablen). Alle Variablen können geändert werden, indem diese in einer der Konfigurationsdateien28 oder direkt auf der Kommandozeile angegeben werden. Damit die Angabe einer Variable auf der Kommandozeile (im folgenden Beispiel BASE NOPLAT ), die Angaben in den Konfigurationsdateien überschreiben kann (dieses Verhalten ist normalerweise erwünscht), so ist es notwendig diese Variable, in der gewünschten Konfigurationsdatei, wie folgt zu deklarieren: f setifenv BASE NOPLAT "/usr/local" Somit überschreibt BASE NOPLAT="/home/bob" ./fbuild.sh FBUILD/nmap-4.11.fbuild die Einstellung der Konfigurationsdatei. Wird in den Konfigurationsdateien f setenv statt f setifenv verwendet oder gar VARIABLE="WERT" direkt, so ist ein überschrei/etc/fbuild.d/fbuild.conf, $FBUILDHOME/etc/fbuild.d/fbuild.conf, $FBUILDHOME/fbuild.conf, $HOME/.fbuildrc 28 49 3.4. FBUILD – DIE ARBEITSWEISE Variable FBUILDHOME PATCH DIR DL DIR SRC DIR BUILD DIR KAPITEL 3. KOMPILIEREN Grundeinstellung aktuelles Verzeichnis $FBUILDHOME/patches /home/download /tmp /tmp Tabelle 3.6: fbuild.sh Verzeichnisvariablen ben der Variablen via Kommandozeile nicht möglich – der Autor rät von solch einer Konfiguration ab! fbuild.sh verwendet einige weitere Variablen für Verzeichnisse deren Namen und Standardwerte in Tabelle 3.6 angegeben sind. Eine Änderung erfolgt, genau wie bei den Installationsvariablen, entweder über die Konfigurationsdateien oder die Kommandozeile. Auch diese Variablen sind im Detail in Abschnitt 3.3.5 auf Seiten 39–47 beschrieben. Ob die Variablen auf die richtigen Werte gesetzt wurden, kann direkt nach dem Aufruf von fbuild.sh mit einer Konfigurationsdatei überprüft werden. fbuild.sh erzeugt eine Ausgabe, von der ein Ausschnitt in Listing 3.7 zu sehen ist. Listing 3.7: fbuild.sh – Ausgabe der Variablen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# #fbuild# f_setvars () f_setvars () done URL=http://www.insecure.org/nmap/dist/nmap-4.11.tar.bz2 DL_DIR=/home/download SRC_DIR=/tmp BUILD_DIR=/tmp ID=nmap-4.11. DIR=nmap-4.11 PLAT=i686-pc-linux-gnu BASE_NOPLAT=/misc BASE=/misc/i686-pc-linux-gnu BASEOPT=/misc/i686-pc-linux-gnu/opt PREFIX=/misc/i686-pc-linux-gnu/opt/nmap/4.11 LINKBIN=/misc/i686-pc-linux-gnu/bin Die Variablen, die in Tabelle 3.7 auf der nächsten Seite angegeben sind, bestimmen welche Programme fbuild.sh aufruft und welche Parameter diesen übergeben werden. Bis auf die Variable PATH29 können alle Programmvariablen auf gleiche Weise geändert werden (Konfigurationsdateien, Kommandozeile) wie die 29 PATH kann indirekt über PRE PATH, POST PATH, LINKBIN oder LINKSBIN geändert werden. 50 KAPITEL 3. KOMPILIEREN Variable MAKE PERL INSTALLINFO CROSS CC CXX FC CPP CXXCPP FCCPP MAKEFLAGS PERLFLAGS CPPFLAGS CXXCPPFLAGS FCCPPFLAGS OPTIMIZE MAKETHREADS CFLAGS CXXFLAGS FFLAGS LDFLAGS PRE PATH POST PATH LINKBIN LINKSBIN PATH 3.4. FBUILD – DIE ARBEITSWEISE Grundeinstellung make perl install-info nicht gesetzt ${CROSS}gcc ${CROSS}g++ ${CROSS}gfortran ${CROSS}cpp $CPP $CPP nicht gesetzt nicht gesetzt -I$LINKINC $CPPFLAGS $CPPFLAGS -O2 -j3 -Wall $OPTIMIZE $CPPFLAGS $CFLAGS $CFLAGS -Wl,--enable-new-dtags -L$LINKLIB -Wl,--rpath -Wl,$LINKLIB $CROSS LDFLAGS nicht gesetzt nicht gesetzt $BASE/bin $BASE/sbin $PRE PATH :$LINKBIN:$LINKSBIN :/bin:/usr/bin :$POST PATH Tabelle 3.7: fbuild.sh Programmvariablen 51 3.5. FBUILD – DIE FBUILD-DATEIEN Variable USE MAKETHREADS USE MOVE PREV PACKAGE USE DEFAULT LINK USE LINKDIR LINKS USE X11 USE PERL USE CROSSPLAT KAPITEL 3. KOMPILIEREN Grundeinstellung yes yes yes yes no no nicht gesetzt Tabelle 3.8: fbuild.sh USE-Variablen Verzeichnis- und die Installationsvariablen (siehe oben). Zusätzlich gibt es die Möglichkeit einige grundlegende Eigenschaften von fbuild.sh mit den so genannten USE-Variablen zu beeinflussen. Diese sind in Tabelle 3.8 ersichtlich und in Abschnitt 3.3.5 auf Seiten 39–47 genauer beschrieben. 3.5 fbuild – Die fbuild-Dateien Die fbuild-Paketbeschreibungsdateien (wie z. B. in Listing 3.3 auf Seite 29) sind im Grunde nichts anderes als Ausschnitte aus /bin/sh -Programmen (Shell-Scripten), die vom Programm fbuild.sh geladen werden. Deshalb gelten in diesen Dateien auch, ganz allgemein, die Regeln der Shell-Programmierung. Soll für einen bestimmten Quellcode eine neue fbuild-Datei angelegt werden, weil für diesen Quellcode noch keine solche existiert, so muss der Ersteller nicht unbedingt ein Experte im /bin/sh -Programmieren sein. Oft reicht es, die Versionsnummer (V -Variable) an den neuen Quellcode anzupassen. Existiert noch keine fbuild-Datei zu einem bestimmten Quellcodepaket, und muss diese komplett neu erstellt werden (eine fbuild-Datei mit einer älteren Version existiert auch nicht), so ist auch dies in vielen Fällen nicht sehr schwierig. Im einfachsten Fall reicht es die Variablen N (Name des Quellcodepaketes) und V (Version des Quellcodepaketes) anzugeben. Soll der Code automatisch vom Internet geladen werden, so ist die Variable URL zu setzen. fbuild.sh geht dann davon aus, dass der Name des Quellcodepaketes auf $N-$V.x lautet (wobei x eine der gängigen Archiv- und Komprimierungserweiterungen – z. B. : tar.bz2, tgz, zip, tar.Z – ist) und das Paket nach dem Entpacken ein Verzeichnis erzeugt, welches $N-$V heißt. Dabei kann der Name mit der Variablen ID (ohne Angabe von x) und das Verzeichnis mit der Variablen DIR angepasst werden. 52 KAPITEL 3. KOMPILIEREN 3.6. FBUILD – ERWEITERUNGEN Konfiguriert wird das Paket dann mit "$SRC DIR/$DIR/configure" --prefix="$PREFIX" --disable-static --enable-shared --with-gnu-ld was in vielen Fällen kaum angepasst werden muss. In Listing 3.3 auf Seite 29 ist eine solche Anpassung, mit Hilfe der Funktion f configure, zu sehen. Dabei führt def configure den oben angegebenen Code aus, die zusätzlichen Parameter werden angehängt. Die Standardeinstellung für das Kompilieren ist das Kommando "$MAKE" $MAKEFLAGS $MAKETHREADS welches in der Funktion def make definiert ist. Auch hier können Anpassungen, wie in Listing 3.3 auf Seite 29 angedeutet, mit Hilfe der Hauptfunktion f make, recht einfach erfolgen. Zum Installieren des Paketes wird die Funktion def makeinstall aufgerufen, die "$MAKE" $MAKEFLAGS -j1 install ausführt. Dieses Verhalten kann mit der Hauptfunktion f makeinstall angepasst werden. Sollten vor oder nach dem Konfigurieren, Kompilieren oder Installieren weitere Anpassungen notwendig sein, so können weitere Hauptfunktionen (siehe dazu Abschnitt 3.3.3 auf Seiten 37–38) definiert werden. 3.6 fbuild – Erweiterungen fbuild ist ein freies und offenes Projekt, das entstanden ist, weil bestimmte Funktionalitäten nicht vorhanden oder in bestehenden Projekten zu kompliziert anzuwenden waren. Das Projekt ist nun in einem Zustand, indem es für eine bestimmte Anwendung, eine große Hilfestellung bietet. Trotzdem – wie bei den meisten auf Software beruhenden Projekten – ist es nicht fertiggestellt. Sobald dem Autor Fehler oder Verbesserungsvorschläge berichtet werden, wird er diese prüfen und versuchen zu implementieren. Weiters sind dem Autor einige Dinge bereits bekannt, die er gerne implementiert haben möchte. Diese werden hier vorgestellt. Integritätsprüfung: Die vom Internet geladenen Dateien, und eventuell auch die fbuild-Dateien selbst, sollten auf ihre Integrität geprüft werden. Das soll verhindern, dass veränderter Code kompilieriert wird, der Schaden anrichten kann. 53 3.6. FBUILD – ERWEITERUNGEN KAPITEL 3. KOMPILIEREN Der Autor kann sich verschiedene Varianten mit Hilfe der Programme gpg 30 und openssl 31 vorstellen. So könnte z. B. openssl so genannte Hashes erzeugen, die mit gpg signiert werden. fbuild.sh könnte dann, wieder mit Hilfe beider Programme, die Dateien prüfen. Es wäre von Vorteil wenn die Hashes und die Signatur direkt in der fbuild-Datei untergebracht werden könnten. Die Funktionalität von fbuild.sh sollte jedoch, falls keine Hashes oder Signaturen vorhanden sind, nicht beeinflusst, der Benutzer aber auf jeden Fall gewarnt werden. Alternative Quellcode Server: Es sollte möglich sein, bei allen Dateien, die vom Internet geladen werden, alternative Server anzugeben. Falls ein bestimmter Server nicht erreichbar ist, könnten dann andere zum Laden der Datei verwendet werden. Vereinfachung der Fehlerbehebungsfunktion: f patch sollte dahingehend erweitert werden, dass der zweite Parameter nicht mehr zwingend angegeben werden muss. Die Hilfsfunktion sollte selbstständig herausfinden ob -p0 oder -p1 angegeben werden muss. Befreiung der Funktionsabhängigkeit der Shell: Falls /bin/sh keine Unterstützung von Funktionen bietet, sollte selbstständig eine andere Shell gesucht werden die damit umgehen kann. Autoconf verfügt z. B. über solch einen intelligenten Mechanismus. Optionales strip pen“ von Programmen und Bibliotheken. strip ist ” ein Programm, welches Programme und Bibliotheken von Symbolen befreit. Dadurch werden diese kleiner, eignen sich unter Umständen aber nicht mehr zur Fehlersuche mit so genannten Debuggern oder erschweren diese. Speziell für Minimalsysteme macht es Sinn möglichst kleine Programme und Bibliotheken zu generieren. Deshalb sollte fbuild.sh einen Mechanismus besitzen, optional die erzeugten Programme und Bibliotheken mit dem Programm strip zu verkleinern. Prüfen der Programme: Automake führt einen Mechanismus ein, der das Prüfen der erzeugten Programme ermöglicht. Viele Quellcodepakete unterstützen diese Funktionalität. Dazu ist make check auszuführen, was bislang in fbuild.sh nicht implementiert ist. Internationalization (I18n) / Localization (L10n): Damit ist speziell ein Übersetzen der Ausgaben von fbuild.sh gemeint. Dies könnte recht einfach mit dem Paket gettext erledigt werden. Der Autor ist 30 31 GNU Privacy Guard [24] OpenSSL [30] 54 KAPITEL 3. KOMPILIEREN 3.6. FBUILD – ERWEITERUNGEN sich aber bewusst, dass dies einen sehr großen und ständigen Aktualisierungsaufwand bedeutet und dazu einige aktive Übersetzer am Projekt beteiligt sein sollten. Solange nicht speziell eine I18n bzw. L10n von mehreren Anwendern gewünscht ist, wird diese Erweiterung wohl mit sehr niedriger Priorität behandelt werden. f sed sollte die Möglichkeit bieten die Option -i , sofern sed diese nicht unterstützt, nachzubilden. Im Moment wird davon ausgegangen, dass die Option -i von sed verstanden wird. f download sollte zum einen nicht ausschließlich das Programm wget verwenden (alternative Programme zum Laden vom Internet sollten automatisch verwendet werden, falls wget nicht vorhanden ist). Zum anderen sollte die Hilfsfunktion selbstständig prüfen ob die zu ladende Datei bereits vorhanden, vollständig und korrekt ist. Ist die Datei unvollständig geladen, sollte lediglich der Rest der Datei geladen werden und nicht die gesamte Datei nochmal. Einführung von USE NLS : Viele Pakete unterstützen die beim Konfigurieren die Optionen --disable-nls und --enable-nls . fbuild.sh sollte in so einem Fall die Variable USE NLS prüfen und je nach Inhalt die eine oder die andere Option setzen. Das Setzen von FBUILDHOME sollte intelligenter gestaltet werden, damit fbuild.sh von jedem Verzeichnis aus gestartet werden kann. Benutzerdefinierbare Umgebungsvariablen sollen deutlich markiert“ ” werden und F vorangestellt bekommen. Entfernen und automatisieren von: SBIN2OPT , MAN2OPT , INFO2OPT 55 LIB2OPT , INC2OPT , BIN2OPT , 56 Kapitel 4 Anwendung Im Folgenden wird die Anwendung des in Kapitel 3 (auf Seiten 25–55) vorgestellten Programms (fbuild.sh ), anhand der in Kapitel 2 (auf Seiten 5–23) beschriebenen Überwachungs- und Analyseprogrammen1 , beschrieben. Im ersten Abschnitt (Abschnitt 4.1) wird auf die Erstellung des Entwicklungssystems eingegangen, was oft auch als bootstrap“ bezeichnet wird. ” Der zweite Abschnitt (Abschnitt 4.2 auf Seite 63) beschreibt ausführlich das Anwenden von fbuild anhand des in Abschnitt 2.1 auf Seite 6 vorgestellten Programms – die folgenden Abschnitte sollen als Nachschlagewerk verstanden werden und behandeln die Programme ab Abschnitt 2.2. 4.1 Entwicklungssystem Es wird in den folgenden Abschnitten davon ausgegangen, dass ein Entwicklungssystem mit fbuild und den entsprechenden Programmen existiert. Hier wird die Erstellung eines solchen Entwicklungssystem beschrieben (welche nicht vollständig mit fbuild erfolgen kann). fbuild kann, wie in Abschnitt 3.1 auf Seite 30 angegeben, auf das Entwicklungsssystem geladen bzw. kopiert werden. Auf aktuellen Linuxsystemen (Fedora, Gentoo, Redhat, Suse, . . . ) existieren meist alle notwendigen Programme um fbuild direkt zu verwenden. Auf anderen Systemem (z. B. Solaris) müssen meist einige modernere Programme installiert werden um eine geeignete fbuild -Umgebung zu schaffen. Im Speziellen ist darauf zu achten, dass gcc , as , ld , make , sed , find , gzip oder gzcat , tar , bzip2 oder bzcat , awk , patch , wget , install-info und compress vorhanden sind; wobei sed den Parameter -i und find 1 mit Ausnahme von Nessus, da der Quellcode nicht mehr verfügbar ist 57 4.1. ENTWICKLUNGSSYSTEM KAPITEL 4. ANWENDUNG den Parameter -maxdepth verstehen müssen; patch muss mit unified2 -diffs umgehen können. Fehlen die genannten Programme oder unterstützen sie die Parameter nicht, so sind entweder entsprechende Versionen zu installieren oder manuell zu übersetzen. In Abschnitt 4.1.1 bis Abschnitt 4.1.4 wird auf das manuelle Übersetzen ohne fbuild-Umgebung eingegangen. Am häufigsten treten Probleme mit find , sed und patch auf. Vor dem ersten Verwenden von fbuild ist unbedingt abzuklären ob diese Programme die oben genannten Parameter unterstützen. Ein Fehlen von bzip / bzcat , gzip / gzcat , wget und einer modernen Version von tar ist auch recht häufig. Ein anderes Problem könnte weiters das Fehlen der System-includeDateien sein, die sich meist im Verzeichnis /usr/include befinden. Fehlen diese Dateien, oder sind nicht alle notwendigen vorhanden, so sind sie auf dem Entwicklungssystem mit der zum Betriebssystem gehörenden Paketverwaltung zu installieren. Fehlen gcc , as , ld und / oder make , so sind auch diese Programme zu installieren3 . Um den Namen der Plattform herauszufinden lädt fbuild mit Hilfe von wget das Programm config.guess vom Internet. Soll dies vermieden werden, so ist die Variable PLAT zu setzen. Auch der Quellcode der Pakete wird, falls nicht vorhanden, vom Internet geladen. Steht keine Internetverbindung zur Verfügung, so ist der Quellcode vorab in das entsprechende Verzeichnis ($DL DIR ) zu kopieren. Der Autor empfiehlt sobald wie möglich binutils und gcc mit Hilfe von fbuild zu installieren (ansonsten können Abhängigkeiten zu Bibliotheken des Compilers der Plattform entstehen). Auch die oben genannten Programme sollten mit fbuild installiert werden, auch wenn diese auf der Plattform schon vorhanden sind. Als Entwicklungssystem kommt ein freies Linux Betriebssystem zum Einsatz, das während des Schreibens dieser Arbeit bewusst ständig aktualisiert wurde: Fedora Core [4] in den Versionen 3, 4, 5 und 6 mit den jeweils aktuellen Versionen der Pakete des Betriebssystems4 auf einer i686-pc-linuxgnu Plattform. Durch das spezielle Kompilieren und Installieren mit fbuild hatten alle diese Aktualisierungen keine Auswirkungen auf die so kompilierten und installierten Programme. Weiters testet der Autor das fehlerfreie Kompilieren und Installieren auch auf diversen anderen Plattformen5 . 2 das sind Dateien, die mit diff -u erzeugt worden sind Ein manuelles Kompilieren und Installieren ist beim Fehlen von gcc , as , und / oder make ist nicht möglich, da Compiler, Assembler, Linker und make zum Kompileren selbst notwendig sind. 4 meist wöchentlich, oft täglich aktualisiert 5 in dieser Arbeit im speziellen: x86 64-unknown-linux-gnu, sparc-sun-solaris2.{8,9,10} 3 58 KAPITEL 4. ANWENDUNG 4.1.1 4.1. ENTWICKLUNGSSYSTEM sed Sollte das Programm sed den Anforderungen von fbuild nicht entsprechen (die Option -i nicht unterstützen) oder nicht vorhanden sein, so ist das Programm ohne fbuild zu kompilieren6 . Unglücklicherweise setzt das sedKonfigurationsprogramm selbst voraus, dass sed in einer aktuellen Version vorliegt, was das Kompilieren verkompliziert. Listing 4.1 ist eine Anleitung wie sed in der Version 4.1.5 [34] (vom 3. Februar 2006) ohne aktuelle Version von sed zu kompilieren ist. In Zeile 1 wird die Variable PREFIX gesetzt, die gegebenenfalls angepasst werden kann. Zeile 12 installiert das Programm in $PREFIX/bin/sed. Listing 4.1: Kompilieren und installieren von sed-4.1.5 ohne fbuild 1 2 3 4 5 6 7 8 9 10 11 12 PREFIX="$HOME" # Installationsprefix gzip -dc sed-4.1.5.tar.gz \ | tar -xf # Entpacken des Quellcode-Archivs cd sed-4.1.5 # Wechsel in das Quellcode-Verzeichnis CC="gcc -w -include stdbool.h" \ ./bootstrap.sh # einfache Version kompilieren PATH="‘pwd‘/sed:$PATH" ./configure \ --prefix="$PREFIX" \ --disable-nls # Konfiguration und Anpassung an die Plattform make clean # Entfernen der einfachen Version make # Kompilieren des Quellcodes make install-exec # Installieren des Programms Je nach Betriebssystem und Compiler muss eventuell Zeile 5 angepasst werden (z. B.: -include stdbool.h entfernen). 4.1.2 find (findutils) Sollte das Programm find den Anforderungen von fbuild nicht entsprechen (die Option -maxdepth nicht unterstützen) oder nicht vorhanden sein, so ist das Programm ohne fbuild zu kompilieren. Es folgt eine Anleitung (Listing 4.2 auf der nächsten Seite) wie find (findutils ) in der Version 4.3.2 [23] (vom 28. November 2006) zu kompilieren ist. In Zeile 1 wird die Variable PREFIX gesetzt, die gegebenenfalls angepasst werden kann. Das Programm wird in $PREFIX/bin/find installiert. 6 Als Alternative könnte auch eine schon kompilierte Version des Programms installiert werden. 59 4.1. ENTWICKLUNGSSYSTEM KAPITEL 4. ANWENDUNG Listing 4.2: Kompilieren und installieren von find-4.3.2 ohne fbuild 1 2 3 4 5 6 7 8 9 PREFIX="$HOME" # Installationsprefix gzip -dc findutils-4.3.2.tar.gz \ | tar -xf # Entpacken des Quellcode-Archivs cd findutils-4.3.2 # Wechsel in das Quellcode-Verzeichnis PATH="$HOME/bin:$PATH" ./configure \ --prefix="$PREFIX" \ --disable-nls # Konfiguration und Anpassung an die Plattform make # Kompilieren des Quellcodes make install-exec # Installieren des Programms 4.1.3 gzip oder gzcat Auch eines dieser beiden Programme ist für den einwandfreien Betrieb von fbuild notwendig. Kaum eine Plattform besitzt keines der beiden Programme. Sollten sie tatsächlich nicht vorhanden sein, so ist es auch nicht möglich sed und find (vorige zwei Abschnitte) wie angegeben zu kompilieren. In solch einem Fall sind die Quellcodepakete auf einem anderem System zu entpacken, dann zu kopieren und erst anschließend – wie angegeben – zu kompilieren. Es folgt eine Anleitung (Listing 4.3) wie gzip in der Version 1.3.6 [25] (vom 23. November 2006) zu kompilieren ist. In Zeile 1 wird die Variable PREFIX gesetzt, die gegebenenfalls angepasst werden kann. Das Programm wird in $PREFIX/bin/gzip installiert. Listing 4.3: Kompilieren und installieren von gzip-1.3.6 ohne fbuild 1 2 3 4 5 6 7 PREFIX="$HOME" # Installationsprefix # Entpacken des Quellcode-Archivs erfolgte auf einem anderen System cd gzip-1.3.6 # Wechsel in das Quellcode-Verzeichnis PATH="$HOME/bin:$PATH" ./configure \ --prefix="$PREFIX" # Konfiguration und Anpassung an die Plattform make # Kompilieren des Quellcodes make install-exec # Installieren des Programms 4.1.4 tar Wie gzip (siehe Abschnitt 4.1.3) ist tar auf praktisch allen Plattformen verfügbar. Sollte das Programm tatsächlich nicht vorhanden sein, so ist – wie beim Fehlen von gzip – das ohne fbuild zu kompilierende Paket auf einem anderen System zu entpacken und anschließend zu kopieren. Es folgt eine Anleitung (Listing 4.4 auf der nächsten Seite) wie tar in der Version 1.16 [37] (vom 21. Oktober 2006) zu kompilieren ist. In Zeile 1 60 KAPITEL 4. ANWENDUNG 4.1. ENTWICKLUNGSSYSTEM Listing 4.4: Kompilieren und installieren von tar-1.16 ohne fbuild 1 2 3 4 5 6 7 8 PREFIX="$HOME" # Installationsprefix # Entpacken des Quellcode-Archivs erfolgte auf einem anderen System cd tar-1.16 # Wechsel in das Quellcode-Verzeichnis PATH="$HOME/bin:$PATH" ./configure \ --prefix="$PREFIX" \ --disable-nls # Konfiguration und Anpassung an die Plattform make # Kompilieren des Quellcodes make install-exec # Installieren des Programms wird die Variable PREFIX gesetzt, die gegebenenfalls angepasst werden kann. Das Programm wird in $PREFIX/bin/tar installiert. 4.1.5 fbuild.conf Nun (sed und find sind in den entsprechend modernen Versionen verfügbar; gzip / gzcat und tar sind installiert) ist fbuild selbst soweit einsetzbar um die fehlenden, abhängigen Programme zu installieren. Auch die eventuell bereits kompilierten oder von der Plattform verwendeten Programme (einschließlich Compiler, Assembler, Linker und make ) sollen mit fbuild kompiliert und installiert werden. Dazu ist jetzt die Konfigurationsdatei (fbuild.conf) anzupassen. Der Autor hat auf einem Testsystem, welches keinen Internetzugang besitzt, Variablen gesetzt, die in Listing 4.5 ersichtlich sind. Listing 4.5: fbuild.conf 1 2 3 4 5 f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv 4.1.6 DL_DIR "$HOME/download" SRC_DIR "/usr/tmp/nikiwaibel" BUILD_DIR "/usr/tmp/nikiwaibel" BASE_NOPLAT "/home/users/n/ni/nikiwaibel/opt" PLAT ‘sh $HOME/download/config.guess_fbuild‘ fbuild.sh (Solaris Linker) Wird auf dem Entwicklungssystem der Solaris Linker (/use/ccs/bin/ln ) vom Compiler verwendet, so muss fbuild.sh angepasst (Listing 4.6 auf der nächsten Seite) werden7 . Sobald mit fbuild der Compiler erzeugt und installiert worden ist (Abschnitt 4.1.9 auf Seite 63), muss diese Änderung 7 entweder via patch -p0 < fbuild-solaris-ld.diff oder manuell, falls patch nicht vorhanden ist – patch -R -p0 < fbuild-solaris-ld.diff macht die Änderung wieder rückgängig 61 4.1. ENTWICKLUNGSSYSTEM KAPITEL 4. ANWENDUNG rückgängig gemacht werden, da der neue Compiler dann den GNU Linker verwendet. Listing 4.6: fbuild-solaris-ld.diff 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Index: fbuild.sh =================================================================== --- fbuild.sh (revision 380) +++ fbuild.sh (working copy) @@ -94,7 +94,7 @@ CXXFLAGS: "$CFLAGS" FFLAGS: "$CFLAGS" MAKETHREADS: ’-j3’ LDFLAGS: "-Wl,--enable-new-dtags -L$LINKLIB -Wl,--rpath -Wl,$LINKLIB $CROSS_LDFLAGS" + LDFLAGS: "-L$LINKLIB -Wl,--rpath -Wl,$LINKLIB $CROSS_LDFLAGS" defining the optional shell functions: f_setvars, f_info, f_pre_configure, f_configure, f_post_configure, @@ -537,7 +537,7 @@ f_setifenv CFLAGS "-Wall $OPTIMIZE $CPPFLAGS" f_setifenv CXXFLAGS "$CFLAGS" f_setifenv FFLAGS "$CFLAGS" -f_setifenv LDFLAGS "-Wl,--enable-new-dtags -L$LINKLIB -Wl,--rpath -Wl,$LINKLIB $CROSS_LDFLAGS" +f_setifenv LDFLAGS "-L$LINKLIB -R$LINKLIB $CROSS_LDFLAGS" 20 21 22 if test "x$USE_CROSSPLAT" = ’xyes’; then f_prependenv PATH "$BASE_NOPLAT/$PLAT/bin:$BASE_NOPLAT/$PLAT/sbin" ’:’ 4.1.7 fbuild-Pakete fbuild kann nun verwendet werden um die in Abschnitt 4.1 auf Seite 57 angegebenen Programme selbst zu übersetzen und zu installieren. Listing 4.7: fbuild-Pakete 1 2 3 4 5 6 7 8 9 PRE_PATH="$HOME/bin" POST_PATH="$PATH" ./fbuild.sh FBUILD/bzip2-1.0.3.fbuild PRE_PATH="$HOME/bin" POST_PATH="$PATH" ./fbuild.sh FBUILD/make-3.81.fbuild PRE_PATH="$HOME/bin" POST_PATH="$PATH" ./fbuild.sh FBUILD/sed-4.1.5.fbuild PRE_PATH="$HOME/bin" POST_PATH="$PATH" ./fbuild.sh FBUILD/findutils-4.3.2.fbuild PRE_PATH="$HOME/bin" POST_PATH="$PATH" ./fbuild.sh FBUILD/gzip-1.3.6.fbuild PRE_PATH="$HOME/bin" POST_PATH="$PATH" ./fbuild.sh FBUILD/tar-1.16.fbuild POST_PATH="$PATH" ./fbuild.sh FBUILD/gawk-3.1.5.fbuild POST_PATH="$PATH" ./fbuild.sh FBUILD/patch-2.5.4.fbuild POST_PATH="$PATH" ./fbuild.sh FBUILD/texinfo-4.8a.fbuild 62 KAPITEL 4. ANWENDUNG 4.1.8 4.1. ENTWICKLUNGSSYSTEM Assembler und Linker (binutils) Im ersten Schritt sollten mit fbuild Assembler und Linker kompiliert werden. Listing 4.8: Assembler und Linker (binutils) 1 2 3 4 5 POST_PATH="$PATH" POST_PATH="$PATH" POST_PATH="$PATH" POST_PATH="$PATH" POST_PATH="$PATH" 4.1.9 ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh FBUILD/m4-1.4.8.fbuild FBUILD/bison-2.3.fbuild FBUILD/indent-2.2.9.fbuild FBUILD/flex-2.5.33.fbuild FBUILD/binutils-2.17.50.0.7.fbuild Compiler (gcc) Nun kann ein neuer Compiler kompiliert werden, der den vorher kompilierten GNU Assembler und GNU Linker verwendet. Listing 4.9: Compiler (gcc) 1 2 3 4 POST_PATH="$PATH" POST_PATH="$PATH" POST_PATH="$PATH" POST_PATH="$PATH" ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh FBUILD/zlib-1.2.3-r1.fbuild FBUILD/gmp-4.2.1.fbuild FBUILD/mpfr-2.2.1.fbuild FBUILD/gcc-4.1.1-c.fbuild Nach diesem Schritt ist eine eventuell in Abschnitt 4.1.6 auf Seite 61 vorgenommene Modifikation von fbuild.sh wieder rückgängig zu machen8 . 4.1.10 fbuild-Pakete mit GNU-Compiler, -Assembler und Linker Der Autor empfiehlt im nächsten Schritt (Listing 4.10 auf der nächsten Seite) nochmals alle Pakete aus Abschnitt 4.1.7, Abschnitt 4.1.8 und Abschnitt 4.1.9 zu übersetzen und zu installieren. Dabei werden diesmal die in den vorigen zwei Abschnitten kompilierten Programme verwendet – Compiler und Hilfsprogramme des Systems werden jetzt nicht mehr benötigt. Nach diesem Schritt steht ein fast vollkommen9 vom ursprünglichen System eigenständiges fbuild -System zur Verfügung. 8 patch -R -p0 < fbuild-solaris-ld.diff Die einzig, immer noch bestehende Abhängigkeit ist die sog. C-Bibliothek (libc) und ein paar wenige andere grundlegende Bibliotheken des Systems. 9 63 4.2. TCPDUMP KAPITEL 4. ANWENDUNG Listing 4.10: fbuild-Pakete mit GNU-Compiler, -Assembler und -Linker 1 2 3 4 ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh FBUILD/zlib-1.2.3-r1.fbuild FBUILD/gcc-4.1.1.fbuild FBUILD/gmp-4.2.1.fbuild FBUILD/mpfr-2.2.1.fbuild ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh FBUILD/m4-1.4.8.fbuild FBUILD/bison-2.3.fbuild FBUILD/indent-2.2.9.fbuild FBUILD/flex-2.5.33.fbuild FBUILD/binutils-2.17.50.0.7.fbuild ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh FBUILD/bzip2-1.0.3.fbuild FBUILD/make-3.81.fbuild FBUILD/sed-4.1.5.fbuild FBUILD/findutils-4.3.2.fbuild FBUILD/gzip-1.3.6.fbuild FBUILD/tar-1.16.fbuild FBUILD/gawk-3.1.5.fbuild FBUILD/patch-2.5.4.fbuild FBUILD/ncurses-5.5-20060603.fbuild FBUILD/texinfo-4.8a.fbuild 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 4.2 Tcpdump Tcpdump [19] wurde in Abschnitt 2.1 auf Seiten 6–8 vorgestellt. Es ist praktisch auf fast jeder Linux-Plattform enthalten. Um das Programm auch auf anderen Plattformen verwenden zu können oder um eine aktuellere Version zu installieren, soll hier die Installation mit fbuild erläutert werden. 4.2.1 Abhängigkeiten Tcpdump verwendet einige Bibliotheken und benötigt einige Programme um übersetzt zu werden. Die Meisten sollen ebenfalls kompiliert werden, bei den anderen werden jene vom Betriebssystem verwendet. Listing 4.11: Abhängigkeiten von Tcpdump 1 2 3 4 5 6 7 8 9 10 11 :m4: :bison: m4 :indent: :flex: bison :libpcap: flex bison :pkgconfig: :zlib: :db: :perl: db :openssl: pkgconfig zlib perl :tcpdump: libpcap openssl 64 KAPITEL 4. ANWENDUNG 4.2. TCPDUMP Zum Start und während des Betriebs von tcpdump werden die Bibliotheken aus den Paketen libpcap , OpenSSL und Zlib benötigt. Alle anderen Abhängigkeiten (Perl , db , pkgconfig , flex , indent , bison und m4 ; siehe auch Listing 4.11) bestehen lediglich zur Kompilierzeit. Perl und dessen abhängiges Paket db sollen nicht kompiliert werden, da es lediglich vom Programm c rehash und vom Hilfsprogramm CA.pl des OpenSSL Paketes aufgerufen wird und diese zwei Programme keine spezielle Version von Perl voraussetzen. Weiters werden lediglich die OpenSSL Bibliotheken verwendet, welche an und für sich keine Abhängigkeit zu Perl aufweisen. 4.2.2 Kompilieren und Installieren Die abhängigen fbuild-Dateien sind mit einer kurzen Beschreibung im Anhang B (ab Seite 97) zu finden. m4-1.4.8.fbuild: Listing B.27 auf Seite 126 bison-2.3.fbuild: Listing B.7 auf Seite 117 indent-2.2.9.fbuild: Listing B.19 auf Seite 122 flex-2.5.33.fbuild: Listing B.12 auf Seite 119 libpcap-0.9.5.fbuild: Listing B.24 auf Seite 124 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 Diese fbuild-Dateien sind in der angegebenen Reihenfolge aufzurufen: 1 2 3 4 5 6 7 8 ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh ./fbuild.sh m4-1.4.8.fbuild bison-2.3.fbuild indent-2.2.9.fbuild flex-2.5.33.fbuild libpcap-0.9.5.fbuild pkgconfig-0.19.fbuild zlib-1.2.3-r1.fbuild openssl-0.9.8d.fbuild Sind alle oder einzelne Pakete mit fbuild schon kompiliert und installiert worden, so ist es nicht notwendig diese(s) Paket(e) noch einmal zu übersetzen / zu installieren. Sollte der Aufruf trotzdem erfolgen ist dies in Ordnung. Es ist dann sichergestellt, dass das Paket mit dem aktuellen Compiler übersetzt wurde. 65 4.2. TCPDUMP KAPITEL 4. ANWENDUNG In den nächsten Abschnitten wird auf die Angabe der Aufrufe verzichtet, und es werden lediglich die Namen der fbuild-Dateien in der entsprechenden Reihenfolge angegeben. Die Beschreibung beinhaltet jeweils einen Hinweis auf den Anhang in dem die fbuild-Dateien abgedruckt sind. Tcpdump selbst kann mit Hilfe der fbuild-Datei in Listing 4.12 auf Seite 81 (tcpdump-3.9.5.fbuild) kompiliert und installiert werden. In dieser Datei fallen folgende Besonderheiten auf: f pre configure : Beim Solaris Betriebssystem müssen zum Übersetzen des Quellcodes ETHER ADDR LEN und ETHER HDRLEN gesetzt werden. Sonst tritt ein Konflikt mit den Include-Dateien des Betriebssystems auf (Zeilen 24 bis 27). Damit libpcap richtig verwendet wird, darf der Quelllcode dieses Paketes nicht in einem bestimmten Verzeichnis vorhanden sein. Deshalb wird dieses Verzeichnis zur Sicherheit verschoben (Zeilen 28 bis 30). Im Konfigurationsprogramm muss $Xprefix mit dem Basispfad zum OpenSSL -Paket ersetzt werden, da sonst eventuell die Bibliothek des Betriebssytems verwendet werden könnte (Zeile 31). f configure : Nachdem Tcpdump mit administrativen Rechten gestartet wurde und alle notwendigen administrativen Aufgaben ausgeführt sind, soll Tcpdump zum Benutzer pcap wechseln (siehe Zeile 35 --with-user=pcap ). Zusätzlich wird aus Sicherheitsgründen (Zeile 36) ein Verzeichnis angegeben, welches während des Betriebs zum Haupt- / Wurzelverzeichnis gemacht werden soll (--with-chroot="$PREFIX/var/empty" ). f post configure : Nach der Konfiguration soll, falls libpcap (zuvor in f pre configure ) verschoben wurde, dieses Paket wieder an den ursprünglichen Platz zurückgeschoben werden. f post makeinstall : Das Sicherheitsverzeichnis (siehe f configure ) wird angelegt und dessen Berechtigungen werden gesetzt (Zeilen 50 und 51). Die Hauptfunktionen f make und f makeinstall sind in tcpdump3.9.5.fbuild (Listing 4.12 auf Seite 81) angegeben. Sie rufen lediglich die fbuild-Standardfunktionen auf. Dies geschähe auch, wenn die Hauptfunktionen nicht angegeben worden wären. In den folgenden Listings sind die fbuild-Dateien möglichst kurz gehalten, solche Hauptfunktionen nicht enthalten und die Copyright Hinweise entfernt. 66 KAPITEL 4. ANWENDUNG 4.3 4.3. WIRESHARK Wireshark Wireshark [18] wurde in Abschnitt 2.2 auf Seiten 8–11 vorgestellt. Es ist – wie Tcpdump (Abschnitt 2.1 und Abschnitt 4.2) – praktisch auf fast jeder Linux-Plattform enthalten. 4.3.1 Abhängigkeiten Bei Wireshark gibt es zwei Möglichkeiten das Paket zu kompilieren. Zum einen komplett mit grafischer Benutzerschnittstelle (wireshark ), zum anderen ausschließlich als textbasierendes Programm (tshark ; Listing 4.14 auf Seite 82). Hier soll auf Letzteres eingegangen werden. Zum Start und während des Betriebs von tshark werden die Bibliotheken der Pakete libpcap , libiconv , Zlib , pcre , OpenSSL , net-snmp und glib benötigt10 . Alle anderen Abhängigkeiten bestehen lediglich zur Kompilierzeit. Listing 4.13: Abhängigkeiten von tshark 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 :m4: :bison: m4 :indent: :flex: bison indent :libpcap: flex bison :libiconv: :zlib: :pkgconfig: :pcre: pkgconfig :db: :perl: db :openssl: pkgconfig zlib perl :bzip2: :net-snmp: openssl zlib bzip2 perl :coreutils: :diffutils: coreutils :expat: diffutils :gettext: libiconv expat :glib: gettext libiconv pkgconfig :tshark: libpcap libiconv zlib pcre openssl net-snmp glib Wie bei Tcpdump sollten Perl und dessen abhängiges Paket db nicht kompiliert werden (siehe dazu Abschnitt 4.2 auf Seite 63). 10 Möglicherweise bindet die Konfiguration noch andere – optionale – Bibliotheken ein. 67 4.3. WIRESHARK 4.3.2 KAPITEL 4. ANWENDUNG Kompilieren und Installieren Die abhängigen fbuild-Dateien sind mit einer kurzen Beschreibung im Anhang B (ab Seite 97) zu finden. m4-1.4.8.fbuild: Listing B.27 auf Seite 126 bison-2.3.fbuild: Listing B.7 auf Seite 117 indent-2.2.9.fbuild: Listing B.19 auf Seite 122 flex-2.5.33.fbuild: Listing B.12 auf Seite 119 libpcap-0.9.5.fbuild: Listing B.24 auf Seite 124 libiconv-1.11.fbuild: Listing B.23 auf Seite 124 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 pcre-6.7.fbuild: Listing B.32 auf Seite 130 openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 bzip2-1.0.3-r1.fbuild: Listing B.8 auf Seite 117 net-snmp-5.1.3.1.fbuild: Listing B.30 auf Seite 128 coreutils-6.6.fbuild: Listing B.9 auf Seite 118 diffutils-2.8.7.fbuild: Listing B.10 auf Seite 118 expat-2.0.0.fbuild: Listing B.11 auf Seite 119 gettext-0.16.1.fbuild: Listing B.16 auf Seite 121 glib-2.12.4.fbuild: Listing B.17 auf Seite 121 Obige Pakete müssen in der angegebenen Reihenfolge kompiliert und installiert werden, damit schließlich tshark-0.99.4.fbuild mit fbuild.sh verarbeitet werden kann. Falls ein Paket schon installiert ist, so muss es nicht noch einmal übersetzt werden – es darf allerdings kompiliert werden um sicherzustellen, dass es mit dem aktuellen Compiler übersetzt wurde. In Listing 4.14 auf Seite 82 (tshark-0.99.4.fbuild) sind folgende Besonderheiten ersichtlich: ID="wireshark-$V." : Da das Paket den Namen wireshark-0.99.4.tar.bz2 trägt, es aber im Verzeichnis tshark (N=tshark ) installiert werden soll, muss ID angegeben werden. 68 KAPITEL 4. ANWENDUNG 4.4. NMAP DIR="wireshark-$V" : Da N=tshark gesetzt ist, wäre das Verzeichnis zum Entpacken des Quellcodes tshark-0.99.4 . . . tatsächlich heißt es aber wireshark-0.99.4. --disable-use-local : Das Verzeichnis /usr/local soll beim Kompilieren nicht beachtet werden – alle relevanten Dateien befinden sich sowieso in der fbuild-Verzeichnisstruktur. --disable-wireshark : Das Übersetzen der grafischen Schnittstelle wird abgeschaltet. --with-ssl="$BASE" : Das Basisverzeichnis von OpenSSL . 4.4 Nmap Nmap [12] wurde in Abschnitt 2.3 auf Seiten 11–13 vorgestellt. Das Programm ist auf fast jeder UNIX[57]-Distribution enthalten und wird oft bei der Standardinstallation des Betriebssystems installiert. Für Systeme die Nmap nicht enthalten, lediglich eine alte Version installieren oder für eine allgemeine, plattformunabhängige Installation mit fbuild folgen die Instruktionen Nmap zu kompilieren. 4.4.1 Abhängigkeiten Nmap verwendet einige Bibliotheken und benötigt einige Programme um übersetzt zu werden. Listing 4.15: Abhängigkeiten von Nmap 1 2 3 4 5 6 7 :pkgconfig: :pcre: pkgconfig :zlib: :db: :perl: db :openssl: pkgconfig zlib perl :nmap: pcre openssl Perl und dessen abhängiges Paket db sollen – wie bei Tcpdump und Wireshark – nicht kompiliert werden. 69 4.5. ARPWATCH-NG 4.4.2 KAPITEL 4. ANWENDUNG Kompilieren und Installieren pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 pcre-6.7.fbuild: Listing B.32 auf Seite 130 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 Obige Pakete müssen in der angegebenen Reihenfolge kompiliert und installiert werden, damit schließlich nmap-4.20.fbuild mit fbuild.sh verarbeitet werden kann. In Listing 4.16 auf Seite 82 (nmap-4.20.fbuild) sind folgende Besonderheiten ersichtlich: --enable-static : Nmap kompiliert intern Bibliotheken, die es anschließend statisch verlinkt. Ohne diese Option sind lediglich die sog. sha” red“-Libraries vorhanden und das Linken schlägt fehl. --with-libpcap=included : Es soll die interne libpcap verwendet werden. --with-openssl="$BASE" : Das Basisverzeichnis von OpenSSL . --with-pcre="$BASE" : Das Basisverzeichnis von pcre . --without-nmapfe : Ein übersetzen der grafischen Schnittstelle wird abgeschaltet. 4.5 Arpwatch-NG Arpwatch-NG [11] wurde in Abschnitt 2.4 auf Seiten 13–14 vorgestellt. 4.5.1 Abhängigkeiten Listing 4.17: Abhängigkeiten von Arpwatch-NG 1 2 3 4 5 6 :m4: :bison: m4 :indent: :flex: bison indent :libpcap: flex bison :arpwatch-ng: libpcap 70 KAPITEL 4. ANWENDUNG 4.5.2 4.6. SNORT Kompilieren und Installieren m4-1.4.8.fbuild: Listing B.27 auf Seite 126 bison-2.3.fbuild: Listing B.7 auf Seite 117 indent-2.2.9.fbuild: Listing B.19 auf Seite 122 flex-2.5.33.fbuild: Listing B.12 auf Seite 119 libpcap-0.9.5.fbuild: Listing B.24 auf Seite 124 In Listing 4.18 auf Seite 83 (arpwatch-ng-1.5.fbuild) sind folgende Besonderheiten ersichtlich: ID und DIR : sind gesetzt, da der Name nicht $N-$V lautet f setvars: $LDFLAGS wird ignoriert, falls es nicht zu $CFLAGS hinzugefügt wird. f pre configure: Die Dateien config.sub und config.guess werden aktualisiert damit das Konfigurieren auch auf modernen Systemen klappt. Weiters wird ein Verzeichnis erzeugt in das gegebenenfalls bestimmte libpcap -Verzeichnisse verschoben werden. Das ist notwendig, da sonst die dynamische libpcap -Bibliothek nicht verwendet wird. f post configure: Die libpcap -Verzeichnisse werden wieder zurück an ihren ursprünglichen Ort verschoben und das Hilfsverzeichnis wird gelöscht. f pre makeinstall: Das Verzeichnis $PREFIX/man/man8 wird fälschlicherweise nicht angelegt und somit schlägt ein Befehl fehl. Deshalb muss das Verzeichnis an dieser Stelle erzeugt werden. 4.6 Snort Snort [17] wurde in Abschnitt 2.5 auf Seiten 14–15 vorgestellt. 71 4.6. SNORT 4.6.1 KAPITEL 4. ANWENDUNG Abhängigkeiten Listing 4.19: Abhängigkeiten von Snort 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 :m4: :bison: m4 :indent: :flex: bison indent :libpcap: flex bison :pkgconfig: :pcre: pkgconfig :coreutils: :ncurses: coreutils (sort) :zlib: :db: :perl: db :openssl: pkgconfig zlib perl :sed: :readline: ncurses sed # gnu sed for proper configure, ncurses opt :mysql: ncurses zlib openssl readline :libdnet: :snort: libpcap pcre mysql libdnet 4.6.2 Kompilieren und Installieren m4-1.4.8.fbuild: Listing B.27 auf Seite 126 bison-2.3.fbuild: Listing B.7 auf Seite 117 indent-2.2.9.fbuild: Listing B.19 auf Seite 122 flex-2.5.33.fbuild: Listing B.12 auf Seite 119 libpcap-0.9.5.fbuild: Listing B.24 auf Seite 124 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 pcre-6.7.fbuild: Listing B.32 auf Seite 130 coreutils-6.6.fbuild: Listing B.9 auf Seite 118 ncurses-5.5-20060603.fbuild: Listing B.29 auf Seite 127 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 sed-4.1.5.fbuild: Listing B.36 auf Seite 132 readline-5.2.fbuild: Listing B.34 auf Seite 132 mysql-5.0.27.fbuild: Listing B.28 auf Seite 126 72 KAPITEL 4. ANWENDUNG 4.7. COLLECTD libdnet-1.10.fbuild: Listing B.22 auf Seite 123 In Listing 4.20 auf Seite 84 (snort-2.6.1.1.fbuild) sind folgende Besonderheiten ersichtlich: Zeile 5: USE MAKETHREADS wird auf no gesetzt, damit beim Kompilieren von Snort lediglich ein Prozess zur gleichen Zeit läuft. Ansonsten schlägt das Übersetzen fehl. f pre configure: Die öffentliche und freie Regel-Datenbank wird – falls nicht vorhanden – von Internet geladen. In einigen Dateien müssen Anpassungen der Pfade vorgenommen werden, damit das Paket an beliebigen Stellen installiert werden kann. f configure: Optionen werden gesetzt um zusätzliche Eigenschaften von Snort zu aktivieren und andere abzuschalten. f post makeinstall: make install kopiert nicht alle Dateien und legt auch nicht alle Verzeichnisse an. Hier wird das noch Notwendige erledigt. 4.7 Collectd Collectd [15] wurde in Abschnitt 2.6 auf Seiten 16–17 vorgestellt. 4.7.1 Abhängigkeiten Listing 4.21: Abhängigkeiten von Collectd 1 2 3 4 5 6 7 :libart_lgpl: :zlib: :pkgconfig: :libpng: zlib pkgconfig :freetype: zlib pkgconfig :rrdtool: libart_lgpl zlib libpng freetype # optional: perl tcl :collectd: rrdtool 73 4.8. CACTI 4.7.2 KAPITEL 4. ANWENDUNG Kompilieren und Installieren libart lgpl-2.3.17.fbuild: Listing B.21 auf Seite 123 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 libpng-1.2.14.fbuild: Listing B.25 auf Seite 125 freetype-2.2.1.fbuild: Listing B.14 auf Seite 120 rrdtool-1.2.15.fbuild: Listing B.35 auf Seite 132 In Listing 4.22 auf Seite 85 (collectd-3.10.3.fbuild) sind folgende Besonderheiten ersichtlich: f pre configure: Die Option -Werror wird aus einer Datei entfernt, damit der Compiler bei Warnungen (die bei verschiedenen Betriebssystemen durchaus auftreten können) nicht abbricht. f post makeinstall: Eine Verknüpfung zu den Hilfsdateien wird angelegt, damit fbuild.sh diese Dateien auch findet und schließlich selbst Verknüpfungen anlegen kann. 4.8 Cacti Cacti [13] wurde in Abschnitt 2.7 auf Seite 17 vorgestellt. Dieses Paket wird weder kompiliert noch installiert im herkömmlichen Sinn11 . Statt dessen muss in einer bestehenden MySQL [27]-Datenbank eine Datenbank mit einem bestimmten Inhalt angelegt werden. Weiters ist einem Apache [20]-Webserver mit PHP [32]-Erweiterung das extrahierte Paketverzeichnis bekanntzugeben, und ein PHP-Script ist alle 5 Minuten auszuführen (cron [22]). fbuild ist im Moment nicht für derartige Aufgaben ausgelegt, deshalb müssen einige Schritte manuell ausgeführt werden. Der Inhalt des Quellcodepaketes wird in das Installationsverzeichnis kopiert. Zusätzlich wird eine Apache [20]-Webserver-Konfigurationsdatei (httpd-cacti-0.8.6i.conf) erzeugt, welche meist direkt in ein Verzeichnis des Webservers kopiert werden kann, um diesem die Cacti-Webseiten bekanntzumachen. Der Autor empfiehlt in diesem Fall den Apache-Webserver mit PHPund MySQL-Erweiterung des Betriebssystems zu verwenden. Dasselbe gilt auch für die MySQL-Datenbank selbst und Perl. Somit fallen die meisten Abhängigkeiten aus dem folgendem Abschnitt weg. 11 es besteht ausschließlich aus PHP-Script-, JAVA-Script-, Shell-Script, Perl-Script-, SQL-, HTML-Dateien, Bildern und Dokumentation 74 KAPITEL 4. ANWENDUNG 4.8.1 4.8. CACTI Abhängigkeiten Listing 4.23: Abhängigkeiten von Cacti 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 :pkgconfig: :pcre: pkgconfig :zlib: :db: :perl: db :openssl: pkgconfig zlib perl :coreutils: :diffutils: coreutils :expat: diffutils :libiconv: :httpd: pcre zlib openssl expat libiconv pkgconfig perl :ncurses: coreutils (sort) :sed: :readline: ncurses sed # gnu sed for proper configure, ncurses opt :mysql: ncurses zlib openssl readline :bzip2: :gettext: libiconv expat :m4: :gmp: m4 :php: httpd pcre openssl zlib bzip2 gettext gmp libiconv mysql ncurses readline pkgconfig :net-snmp: openssl zlib bzip2 perl :cacti: httpd mysql php net-snmp 4.8.2 Kompilieren und Installieren pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 bzip2-1.0.3-r1.fbuild: Listing B.8 auf Seite 117 net-snmp-5.1.3.1.fbuild: Listing B.30 auf Seite 128 In Listing 4.24 auf Seite 85 (cacti-0.8.6i.fbuild) sind folgende Besonderheiten ersichtlich: f configure, f make: In diesen Funktionen soll nichts gemacht werden. f makeinstall: Hier werden die Dateien für den Webserver in das Installationsverzeichnis kopiert. Wie oben schon erwähnt ist kein übersetzen mit Hilfe eines Compilers notwendig. Es werden lediglich Daten kopiert. 75 4.9. ZABBIX KAPITEL 4. ANWENDUNG f post makeinstall: Die Konfigurationsdatei für den Apache Webserver wird erzeugt. Die weiteren Schritte zur kompletten Installation, die fbuild zur Zeit nicht durchführt, sind in der Datei cacti-0.8.6i/docs/INSTALL des Quellcodes zu finden. 4.9 Zabbix Zabbix [10] wurde in Abschnitt 2.8 auf Seiten 17–18 vorgestellt. Wie bei Cacti (Abschnitt 4.8 auf Seite 73) sind auch bei Zabbix einige Schritte manuell zu erledigen. Zabbix besitzt (wie Cacti) eine Webschnittstelle – zusätzlich jedoch auch ein Serverprogramm und einen sogenannten Agent (Clientprogramm). Deshalb ist Zabbix auf drei Pakete aufgeteilt: zabbix-frontend , zabbix-server und zabbix-agent . 4.9.1 Abhängigkeiten Listing 4.25: Abhängigkeiten von zabbix-frontend 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 :pkgconfig: :pcre: pkgconfig :zlib: :db: :perl: db :openssl: pkgconfig zlib perl :coreutils: :diffutils: coreutils :expat: diffutils :libiconv: :httpd: pcre zlib openssl expat libiconv pkgconfig perl :ncurses: coreutils (sort) :sed: :readline: ncurses sed # gnu sed for proper configure, ncurses opt :mysql: ncurses zlib openssl readline :bzip2: :gettext: libiconv expat :m4: :gmp: m4 :php: httpd pcre openssl zlib bzip2 gettext gmp libiconv mysql ncurses readline pkgconfig :zabbix-frontend: httpd mysql php Listing 4.26: Abhängigkeiten von zabbix-server 1 2 3 :zlib: :coreutils: :ncurses: coreutils (sort) 76 KAPITEL 4. ANWENDUNG 4 5 6 7 8 9 10 11 12 13 4.9. ZABBIX :pkgconfig: :db: :perl: db :openssl: pkgconfig zlib perl :sed: :readline: ncurses sed # gnu sed for proper configure, ncurses opt :mysql: ncurses zlib openssl readline :bzip2: :net-snmp: openssl zlib bzip2 perl :zabbix-server: zlib mysql net-snmp openssl Listing 4.27: Abhängigkeiten von zabbix-agent 1 :zabbix-agent: 4.9.2 4.9.2.1 Kompilieren und Installieren zabbix-frontend Hier gibt es keine Abhängigkeiten, sofern der Apache Webserver, die MySQL Datenbank und PHP des Betriebssystems verwendet werden (was der Autor auch – wie bei Cacti , Abschnitt 4.8 auf Seite 73 – empfiehlt). In Listing 4.28 auf Seite 86 (zabbix-frontend-1.1.4.fbuild) sind folgende Besonderheiten ersichtlich: ID, DIR: In Zeile 3 und 4 werden ID und DIR gesetzt, da der Name des Paketes nicht $N-$V lautet. f configure, f make: In diesen Funktionen soll nichts gemacht werden. f makeinstall: Hier werden die Dateien für den Webserver und das Erzeugen der SQL-Datenbank in das Installationsverzeichnis kopiert. Wie bei Cacti ist kein übersetzen mit Hilfe eines Compilers notwendig. Es werden lediglich Daten kopiert. f post makeinstall: Die Konfigurationsdatei für den Apache Webserver wird erzeugt. 4.9.2.2 zabbix-server zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 coreutils-6.6.fbuild: Listing B.9 auf Seite 118 ncurses-5.5-20060603.fbuild: Listing B.29 auf Seite 127 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 77 4.9. ZABBIX KAPITEL 4. ANWENDUNG openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 bzip2-1.0.3-r1.fbuild: Listing B.8 auf Seite 117 net-snmp-5.1.3.1.fbuild: Listing B.30 auf Seite 128 In Listing 4.29 auf Seite 87 (zabbix-server-1.1.4.fbuild) sind folgende Besonderheiten ersichtlich: ID, DIR: In Zeile 3 und 4 werden ID und DIR gesetzt, da der Name des Paketes nicht $N-$V lautet. f configure: Optionen werden gesetzt um zusätzliche Eigenschaften von Zabbix zu aktivieren und andere abzuschalten. f pre make: In einigen Dateien sind diverse Pfade fest vorgegeben. Um eine Installation in ein beliebiges Verzeichnis zu ermöglichen werden diese Pfade hier geändert. f post makeinstall: make install legt nicht alle nötigen Verzeichnisse an und es wird auch die Konfigurationsdatei nicht kopiert. Somit wird dies hier erledigt. Weiters wird auch das Verzeichnis mit den Dateien zum Anlegen der Datenbank in den Installationspfad kopiert. 4.9.2.3 zabbix-agent Der Agent besitzt keine Abhängigkeiten zu anderen Paketen. In Listing 4.30 auf Seite 88 (zabbix-agent-1.1.4.fbuild) sind folgende Besonderheiten ersichtlich: ID, DIR: In Zeile 3 und 4 werden ID und DIR gesetzt, da der Name des Paketes nicht $N-$V lautet. f configure: Optionen werden gesetzt um zusätzliche Eigenschaften von Zabbix zu aktivieren und andere abzuschalten. f pre make: In einigen Dateien sind diverse Pfade fest vorgegeben. Um eine Installation in ein beliebiges Verzeichnis zu ermöglichen werden diese Pfade hier geändert. f post makeinstall: make install legt nicht alle nötigen Verzeichnisse an und es werden auch die Konfigurationsdateien nicht kopiert. Dies wird hier erledigt. 78 KAPITEL 4. ANWENDUNG 4.10 4.10. NAGIOS Nagios Nagios [7] wurde in Abschnitt 2.9 auf Seiten 18–19 vorgestellt. 4.10.1 Abhängigkeiten Listing 4.31: Abhängigkeiten von nagios 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 :libiconv: :zlib: :pkgconfig: :libpng: zlib pkgconfig :db: :perl: db :m4: :pcre: pkgconfig :coreutils: :diffutils: coreutils :expat: diffutils :gettext: libiconv expat :grep: pcre libiconv gettext :autoconf: m4 perl grep :automake: perl autoconf :libtool: :jpeg: automake libtool :freetype: zlib pkgconfig :fontconfig: expat freetype libiconv :gd: libpng jpeg freetype fontconfig libiconv :openssl: pkgconfig zlib perl :httpd: pcre zlib openssl expat libiconv pkgconfig perl :nagios: libiconv gd libpng jpeg perl httpd Listing 4.32: Abhängigkeiten von nagios-plugins 1 2 3 4 5 6 7 8 9 10 11 :coreutils: :ncurses: coreutils (sort) :zlib: :pkgconfig: :db: :perl: db :openssl: pkgconfig zlib perl :sed: :readline: ncurses sed # gnu sed for proper configure, ncurses opt :mysql: ncurses zlib openssl readline :nagios-plugins: mysql openssl 4.10.2 4.10.2.1 Kompilieren und Installieren nagios libiconv-1.11.fbuild: Listing B.23 auf Seite 124 79 4.10. NAGIOS KAPITEL 4. ANWENDUNG zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 libpng-1.2.14.fbuild: Listing B.25 auf Seite 125 m4-1.4.8.fbuild: Listing B.27 auf Seite 126 pcre-6.7.fbuild: Listing B.32 auf Seite 130 coreutils-6.6.fbuild: Listing B.9 auf Seite 118 diffutils-2.8.7.fbuild: Listing B.10 auf Seite 118 expat-2.0.0.fbuild: Listing B.11 auf Seite 119 gettext-0.16.1.fbuild: Listing B.16 auf Seite 121 grep-2.5.1a.fbuild: Listing B.18 auf Seite 122 autoconf-2.61.fbuild: Listing B.5 auf Seite 116 automake-1.10.fbuild: Listing B.6 auf Seite 116 libtool-1.5.22.fbuild: Listing B.26 auf Seite 125 jpeg-6b-r4.fbuild: Listing B.20 auf Seite 123 freetype-2.2.1.fbuild: Listing B.14 auf Seite 120 fontconfig-2.4.2.fbuild: Listing B.13 auf Seite 120 gd-2.0.33.fbuild: Listing B.15 auf Seite 120 In Listing 4.33 auf Seite 89 (nagios-2.6.fbuild) sind folgende Besonderheiten ersichtlich: f configure: Der Pfad zum Script-Verzeichnis muss geändert werden, da sonst die Installation mit regulären Benutzerrechten nicht möglich wäre. f make: Dem Programm make muss der Parameter all übergeben werden. f makeinstall: Um Nagios mit regulären Benutzerrechten zu installieren, muss make install mit zusätzlichen Parametern ausgeführt werden, welche hier angegeben sind. f post makeinstall: Hier werden die Konfigurationsdateien kopiert und der Pfad zu den Nagios-Plugins angepasst. Weiters werden Konfigurationsdateien für den Apache Webserver angelegt. 80 KAPITEL 4. ANWENDUNG 4.10.2.2 4.10. NAGIOS nagios-plugins coreutils-6.6.fbuild: Listing B.9 auf Seite 118 ncurses-5.5-20060603.fbuild: Listing B.29 auf Seite 127 zlib-1.2.3-r1.fbuild: Listing B.37 auf Seite 133 pkgconfig-0.19.fbuild: Listing B.33 auf Seite 131 openssl-0.9.8d.fbuild: Listing B.31 auf Seite 129 sed-4.1.5.fbuild: Listing B.36 auf Seite 132 readline-5.2.fbuild: Listing B.34 auf Seite 132 mysql-5.0.27.fbuild: Listing B.28 auf Seite 126 In Listing 4.34 auf Seite 90 (nagios-plugins-1.4.5.fbuild) sind folgende Besonderheiten ersichtlich: f configure: Optionen werden gesetzt um zusätzliche Eigenschaften von Nagios zu aktivieren und andere abzuschalten. f post makeinstall: Ein Verzeichnis wird angelegt und eine Konfigurationsdatei kopiert. 81 4.10. NAGIOS KAPITEL 4. ANWENDUNG Listing 4.12: tcpdump-3.9.5.fbuild 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # # # # # # # # # # # # # # # # # tcpdump-3.9.5.fbuild This file is part of fbuild.sh. Copyright (C) 2006 Niki W. Waibel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 20 21 N="tcpdump" V="3.9.5" URL="http://www.tcpdump.org/release/$N-$V.tar.gz" 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 f_pre_configure () { if test "x‘uname -s‘" = ’xSunOS’; then f_appendenv CPPFLAGS "-DETHER_ADDR_LEN=6 -DETHER_HDRLEN=14" f_appendenv CFLAGS "-DETHER_ADDR_LEN=6 -DETHER_HDRLEN=14" fi mkdir "tmp_remove_libpcap" \ && (mv "$BUILD_DIR/$DIR"/../libpcap* tmp_remove_libpcap 2>/dev/null true) f_sed -i -e "s/\$Xprefix/$sedBASE/" "$SRC_DIR/$DIR/configure" } f_configure () { def_configure \ --with-user=pcap \ --with-chroot="$PREFIX/var/empty" } f_post_configure () { (mv tmp_remove_libpcap/* "$BUILD_DIR/$DIR"/.. 2>/dev/null true) \ && rmdir "tmp_remove_libpcap" } f_make () { def_make } f_makeinstall () { def_makeinstall } f_post_makeinstall () { mkdir -p "$PREFIX/var/empty" \ && chmod ugo=x "$PREFIX/var/empty" } 82 KAPITEL 4. ANWENDUNG 4.10. NAGIOS Listing 4.14: tshark-0.99.4.fbuild 1 2 3 4 5 N="tshark" V="0.99.4" ID="wireshark-$V." DIR="wireshark-$V" URL="http://www.wireshark.org/download/src/wireshark-$V.tar.bz2" 6 7 8 9 10 11 12 f_configure () { def_configure \ --disable-usr-local \ --disable-wireshark \ --with-ssl="$BASE" } Listing 4.16: nmap-4.20.fbuild 1 2 3 N="nmap" V="4.20" URL="http://www.insecure.org/$N/dist/$N-$V.tar.bz2" 4 5 6 7 8 9 10 11 12 f_configure () { def_configure \ --enable-static \ --with-libpcap=included \ --with-openssl="$BASE" \ --with-pcre="$BASE" \ --without-nmapfe } 83 4.10. NAGIOS KAPITEL 4. ANWENDUNG Listing 4.18: arpwatch-ng-1.5.fbuild 1 2 3 4 5 N="arpwatch-ng" V="1.5" URL="http://freequaos.host.sk/arpwatch/arpwatch-NG1.5.tar.bz2" ID="arpwatch-NG$V." DIR="arpwatch-NG$V" 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 f_setvars () { f_setenv CFLAGS "$CFLAGS $LDFLAGS" } f_pre_configure () { f_patch "$PATCH_DIR/$N-$V.nww.patch" -p1 \ && mkdir "tmp_remove_libpcap" \ && (mv "$BUILD_DIR/$DIR"/../libpcap* tmp_remove_libpcap 2>/dev/null true) } f_post_configure () { (mv tmp_remove_libpcap/* "$BUILD_DIR/$DIR"/.. 2>/dev/null true) \ && rmdir "tmp_remove_libpcap" } f_pre_makeinstall () { mkdir -p "$PREFIX/man/man8" } 84 KAPITEL 4. ANWENDUNG 4.10. NAGIOS Listing 4.20: snort-2.6.1.1.fbuild 1 2 3 N="snort" V="2.6.1.1" URL="http://www.snort.org/dl/current/$N-$V.tar.gz" 4 5 USE_MAKETHREADS=no 6 7 8 9 10 11 12 13 14 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 f_pre_configure () { test -f "$DL_DIR/Community-Rules-CURRENT.tar.gz" \ || f_download "http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-CURRENT.tar.gz" f_sed -i -e \ "s/\/etc\/snort.conf/$sedPREFIX\/etc\/snort\/snort.conf\", \"&/" \ "$SRC_DIR/$DIR/src/snort.c" \ && f_sed -i -e "s/\/var\/log\/snort/$sedPREFIX&/" \ "$SRC_DIR/$DIR/src/snort.h" \ && f_sed -i -e "s/\/var\/log\/snort/$sedPREFIX&/" \ "$SRC_DIR/$DIR/src/parser.c" \ && f_sed -i -e "s/\/var\/run\//$sedPREFIX\/var\/run\//" \ "$SRC_DIR/$DIR/src/util.c" \ && f_sed -i -e \ "s/\(var RULE_PATH \)..\/rules/\1$sedPREFIX\/etc\/snort\/rules/" \ "$SRC_DIR/$DIR/etc/snort.conf" } f_configure () { def_configure \ --enable-pthread \ --enable-stream4udp \ --enable-timestats \ --enable-flexresp2 \ --with-mysql="$BASE" \ --without-odbc \ --without-postgresql \ --without-oracle } f_post_makeinstall () { mkdir -p "$PREFIX/etc/snort/rules" cd "$PREFIX/etc/snort" f_unpack "$DL_DIR/Community-Rules-CURRENT.tar.gz" cp -r \ "$SRC_DIR/$DIR/etc/"*.map \ "$SRC_DIR/$DIR/etc/"*.config \ "$SRC_DIR/$DIR/etc/snort.conf" \ "$PREFIX/etc/snort" mkdir -p "$PREFIX/var/log/snort" mkdir -p "$PREFIX/var/run" mkdir -p "$PREFIX/etc/init.d" } 85 4.10. NAGIOS KAPITEL 4. ANWENDUNG Listing 4.22: collectd-3.10.3.fbuild 1 2 3 N="collectd" V="3.10.3" URL="http://collectd.org/files/$N-$V.tar.bz2" 4 5 6 7 8 9 10 f_pre_configure () { f_sed -i -e ’s/-Werror//’ "$SRC_DIR/$DIR/src/Makefile.in" } f_post_makeinstall () { ln -s share/man "$PREFIX/man" } Listing 4.24: cacti-0.8.6i.fbuild 1 2 3 N="cacti" V="0.8.6i" URL="http://www.cacti.net/downloads/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 14 15 16 17 f_configure () { true } f_make () { true } f_makeinstall () { mkdir -p "$PREFIX/htdocs" (cd "$SRC_DIR/$DIR"; tar -cf - .) | (cd "$PREFIX/htdocs"; tar -xvf -) } f_post_makeinstall () { cat > "$PREFIX/httpd-$N-$V.conf" << EOF Alias /$N-$V "$PREFIX/htdocs" 18 19 20 21 22 23 24 25 <Directory "$PREFIX/htdocs/"> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Directory> EOF } 86 KAPITEL 4. ANWENDUNG 4.10. NAGIOS Listing 4.28: zabbix-frontend-1.1.4.fbuild 1 2 3 4 5 N="zabbix-frontend" V="1.1.4" ID="zabbix-$V." DIR="zabbix-$V" URL="$DLSF/zabbix/zabbix-$V.tar.gz" 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 f_configure () { true } f_make () { true } f_makeinstall () { true \ && mkdir -p "$PREFIX/htdocs" \ && mkdir -p "$PREFIX/create" \ && (cd "$SRC_DIR/$DIR/frontends/php"; tar -cf - .) \ | (cd "$PREFIX/htdocs"; tar -xf -) \ && (cd "$SRC_DIR/$DIR/create"; tar -cf - .) \ | (cd "$PREFIX/create"; tar -xf -) } f_post_makeinstall () { cat > "$PREFIX/httpd-$N-$V.conf" << EOF Alias /$N-$V "$PREFIX/htdocs" 25 26 27 28 29 30 31 32 <Directory "$PREFIX/htdocs/"> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Directory> EOF } 87 4.10. NAGIOS KAPITEL 4. ANWENDUNG Listing 4.29: zabbix-server-1.1.4.fbuild 1 2 3 4 5 N="zabbix-server" V="1.1.4" ID="zabbix-$V." DIR="zabbix-$V" URL="$DLSF/zabbix/zabbix-$V.tar.gz" 6 7 8 9 10 11 12 13 14 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 f_configure () { "$SRC_DIR/$DIR/configure" --prefix="$PREFIX" \ --enable-shared \ --enable-server \ --disable-agent \ --with-mysql="$BASE" \ --with-net-snmp="$BASE" \ --without-ldap } f_pre_make () { true \ && sed -i \ -e "s/\<strdup(\"\/etc/strdup(\"$sedPREFIX\/etc/" \ -e "s/\<strdup(\"\/.*\(zabbix.*.pid\)/strdup(\"$sedPREFIX\/var\/run\/\1/" \ -e "s/\<strdup(\".*\/fping/strdup(\"fping/" \ -e "s/\<strdup(\".*\/bin/strdup(\"$sedPREFIX\/bin/" \ "$SRC_DIR/$DIR/src/zabbix_server/server.c" \ && sed -i \ -e "s/^PidFile=.*\//PidFile=$sedPREFIX\/var\/run\//" \ -e "s/^LogFile=.*\//LogFile=$sedPREFIX\/var\/log\//" \ -e "s/^\(AlertScriptsPath=\).*\//\1$sedPREFIX\/bin/" \ "$SRC_DIR/$DIR/misc/conf/zabbix_server.conf" } f_post_makeinstall () { true \ && mkdir -p "$PREFIX/etc/zabbix" \ && mkdir -p "$PREFIX/var/run" \ && mkdir -p "$PREFIX/var/log" \ && mkdir -p "$PREFIX/create" \ && cp "$SRC_DIR/$DIR/misc/conf/zabbix_server.conf" \ "$PREFIX/etc/zabbix" \ && (cd "$SRC_DIR/$DIR/create"; tar -cf - .) \ | (cd "$PREFIX/create"; tar -xf -) } 88 KAPITEL 4. ANWENDUNG 4.10. NAGIOS Listing 4.30: zabbix-agent-1.1.4.fbuild 1 2 3 4 5 N="zabbix-agent" V="1.1.4" ID="zabbix-$V." DIR="zabbix-$V" URL="$DLSF/zabbix/zabbix-$V.tar.gz" 6 7 8 9 10 11 12 13 14 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 f_configure () { "$SRC_DIR/$DIR/configure" --prefix="$PREFIX" \ --enable-shared \ --disable-server \ --enable-agent \ --with-mysql="$BASE" \ --with-net-snmp="$BASE" \ --without-ldap } f_pre_make () { true \ && sed -i \ -e "s/\<strdup(\"\/etc/strdup(\"$sedPREFIX\/etc/" \ src/zabbix_agent/zabbix_agent.c \ && sed -i \ -e "s/\<strdup(\"\/etc/strdup(\"$sedPREFIX\/etc/" \ -e "s/\<strdup(\"\/.*\(zabbix.*.pid\)/strdup(\"$sedPREFIX\/var\/run\/\1/" \ -e "s/\<strdup(\".*\/fping/strdup(\"fping/" \ -e "s/\<strdup(\".*\/bin/strdup(\"$sedPREFIX\/bin/" \ "$SRC_DIR/$DIR/src/zabbix_agent/zabbix_agentd.c" \ && sed -i -e "s/\<parse_cfg_file(\"/parse_cfg_file(\"$sedPREFIX/" \ "$SRC_DIR/$DIR/src/zabbix_snmptrapper/zabbix_snmptrapper.c" \ && sed -i \ -e "s/^PidFile=.*\//PidFile=$sedPREFIX\/var\/run\//" \ -e "s/^LogFile=.*\//LogFile=$sedPREFIX\/var\/log\//" \ -e "s/^\(AlertScriptsPath=\).*\//\1$sedPREFIX\/bin/" \ "$SRC_DIR/$DIR/misc/conf/zabbix_agentd.conf" } f_post_makeinstall () { true \ && mkdir -p "$PREFIX/etc/zabbix" \ && mkdir -p "$PREFIX/var/run" \ && mkdir -p "$PREFIX/var/log" \ && cp "$SRC_DIR/$DIR/misc/conf/zabbix_agent.conf" \ "$PREFIX/etc/zabbix" \ && cp "$SRC_DIR/$DIR/misc/conf/zabbix_agentd.conf" \ "$PREFIX/etc/zabbix" \ && cp "$SRC_DIR/$DIR/misc/conf/zabbix_trapper.conf" \ "$PREFIX/etc/zabbix" } 89 4.10. NAGIOS KAPITEL 4. ANWENDUNG Listing 4.33: nagios-2.6.fbuild 1 2 3 N="nagios" V="2.6" URL="$DLSF/$N/$N-$V.tar.gz" 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 30 31 32 33 34 35 36 37 38 39 40 f_configure () { def_configure --with-init-dir="$PREFIX/etc/init.d" } f_make () { def_make all } f_makeinstall () { def_makeinstall \ INSTALL_OPTS= \ INIT_OPTS= \ COMMAND_OPTS= \ fullinstall \ install-config } f_post_makeinstall () { true \ && mkdir -p "$PREFIX/etc/httpd/conf.d" \ && cp "$SRC_DIR/$DIR/sample-config/httpd.conf" \ "$PREFIX/etc/httpd/conf.d/nagios.conf" \ && cp "$PREFIX/etc/cgi.cfg-sample" "$PREFIX/etc/cgi.cfg" \ && cp "$PREFIX/etc/nagios.cfg-sample" "$PREFIX/etc/nagios.cfg" \ && cp "$PREFIX/etc/commands.cfg-sample" "$PREFIX/etc/commands.cfg" \ && cp "$PREFIX/etc/localhost.cfg-sample" "$PREFIX/etc/localhost.cfg" \ && sed -e "s/^\$USER1\$=.*/\$USER1\$=$sedBASEOPT\/nagios-plugins\/default\/libexec/" \ "$PREFIX/etc/resource.cfg-sample" \ > "$PREFIX/etc/resource.cfg" \ && cat > "$PREFIX/etc/httpd/.htaccess" << EOF AuthName "Nagios Access" AuthType Basic AuthUserFile "$PREFIX/etc/htpasswd.users" require valid-user EOF test "x$?" = ’x0’ \ && touch "$PREFIX/etc/htpasswd.users" \ && chmod go= "$PREFIX/etc/htpasswd.users" } 90 KAPITEL 4. ANWENDUNG 4.10. NAGIOS Listing 4.34: nagios-plugins-1.4.5.fbuild 1 2 3 N="nagios-plugins" V="1.4.5" URL="$DLSF/nagiosplug/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 14 f_configure () { def_configure \ --disable-nls \ --without-pgsql \ --with-openssl="$BASE" } f_post_makeinstall () { mkdir -p "$PREFIX/etc" \ && cp "$SRC_DIR/$DIR/command.cfg" "$PREFIX/etc" } 91 92 Anhang A Literaturverzeichnis [1] Unternehmen: CheckPoint. http://www.checkpoint.com/ (15. November 2006). [2] Unternehmen: Sourcefire. http://www.sourcefire.com/ (15. November 2006). [3] Unternehmen: SourceForge.net. http://SourceForge.net/ (25. Dezember 2006). [4] Fedora Core Linux. http://fedora.redhat.com/ (4. August 2006). [5] FreeBSD. http://www.freebsd.org/ (25. Dezember 2006). [6] Gentoo Linux. http://www.gentoo.org/ (4. August 2006). [7] Galstad, Ethan, Karl DeBisschop, Subhendu Ghosh, Ton Voon, Stanley Hopcroft und http://www.nagios.org/ about/contributors.php: Nagios (Rechner-, Dienst- und Netzwerküberwachung). http://www.nagios.org/ (20. November 2006). [8] Tobias Oetiker <[email protected]>: Hilfsprogramm: RRDTool (Round Robin Database Tool). http://people.ee.ethz.ch/ ~oetiker/webtools/rrdtool/ (8. August 2006). [9] Lawrence Berkeley National Laboratory – Network Research Group – [email protected]: Arpwatch (Netzwerk ARP-Überwachung). ftp://ftp.ee.lbl.gov/arpwatch-2.1a13.tar. gz (10. März 2006). [10] Alexei Vladishev <[email protected]>: Zabbix (Rechner-, Dienst- und Netzwerküberwachung). http://www.zabbix. com/ (15. November 2006). 93 ANHANG A. LITERATURVERZEICHNIS [11] [email protected]: Arpwatch NG (Netzwerk ARPhttp://freequaos.host.sk/arpwatch/ (8. AuÜberwachung). gust 2006). [12] Fyodor Yarochkini <[email protected]>: Nmap (aktiver Netzwerk Portscanner). http://insecure.org/nmap/ (8. August 2006). [13] Ian Berry <[email protected]>: Cacti. net/ (8. August 2006). http://www.cacti. [14] Niki Waibel <[email protected]>: fbuild (flexibles Software übersetzungs und installier Werkzeug). http://sourceforge.net/ projects/fbuild (26. Dezember 2006). [15] Florian octo Forster <[email protected]>: Collectd (Dienstüberwachung). http://collectd.org/ (8. August 2006). [16] Nessus (aktiver Sicherheitsscanner). http://www.nessus.org/ (8. August 2006). [17] Snort (passiver Sicherheitsscanner). http://www.snort.org/ (8. August 2006). [18] Wireshark (Netzwerküberwachung und Protokollanalysierer). http:// www.wireshark.org/ (7. November 2006). [19] The Tcpdump Group ([email protected]): Tcpdump (Netzwerküberwachung und -datensammler). http://www. tcpdump.org/ (30. November 2006). [20] Hilfsprogramm: Apache Webserver. (15. November 2006). http://httpd.apache.org/ [21] Hilfsprogramm: Gnu Binutils (Assembler, Linker, . . . ). http://www. kernel.org/pub/linux/devel/binutils/ (21. Juli 2006). [22] Hilfsprogramm: Cron. (15. November 2006), (15. November 2006). http://de.wikipedia.org/wiki/Crontab http://en.wikipedia.org/wiki/Crontab [23] Hilfsprogramm: find (findutils). findutils/ (3. Dezember 2006). [24] Hilfsprogramm: GNU Privacy Guard. (20. September 2006). ftp://alpha.gnu.org/gnu/ http://www.gnupg.org/ [25] Hilfsprogramm: gzip. ftp://alpha.gnu.org/gnu/gzip/ (3. Dezember 2006). 94 ANHANG A. LITERATURVERZEICHNIS [26] Hilfsprogramm: Monarch (Nagios Erweiterung zur grafischen Konfiguration). http://sourceforge.net/projects/monarch/ (20. November 2006). [27] Hilfsprogramm: MySQL (Multi-User-SQL-Datenbankserver). http:// www.mysql.com/ (13. Juni 2006). [28] Hilfsprogramm: NET-SNMP. (15. November 2006). http://net-snmp.sourceforge.net/ [29] Hilfsprogramm: NRPE (Nagios Remote Plugin Executor). http://www. nagios.org/ (20. November 2006). [30] Hilfsprogramm: OpenSSL (Kryptographie Bibliothek). openssl.org/ (27. Juni 2006). http://www. [31] Hilfsprogramm: PerfParse (Nagios Erweiterung zum Anzeigen der Performancedaten). http://perfparse.sourceforge.net/ (20. November 2006). [32] Hilfsprogramm: PHP: Hypertext Preprocessor. http://www.php.net/ (15. November 2006). [33] Hilfsprogramm: PostgreSQL (Multi-User-SQL-Datenbankserver). http://www.postgresql.org/ (20. November 2006). [34] Hilfsprogramm: sed. ber 2006). http://ftp.gnu.org/gnu/sed/ (3. Dezem- [35] Hilfsprogramm: SnortSam (Snort Erweiterung für aktives Blocken). http://www.snortsam.net/ (8. August 2006). [36] Hilfsprogramm: Subversion. http://subversion.tigris.org/ (4. Juni 2006). [37] Hilfsprogramm: tar. ber 2006). http://ftp.gnu.org/gnu/tar/ (3. Dezem- [38] Vaughan, Gary V., Ben Elliston, Tom Tromey und Ian Lance Taylor: Buch: GNU Autoconf, Automake, and Libtool. Sams, Erste Auflage, Oktober 2000. [39] Wikipedia. http://de.wikipedia.org/ (21. September 2006), http: //en.wikipedia.org/ (21. September 2006). [40] Wikipedia: Address Resolution Protocol. http://de.wikipedia.org/ wiki/Address_Resolution_Protocol (25. Dezember 2006), http: //en.wikipedia.org/wiki/Address_Resolution_Protocol (25. Dezember 2006). 95 ANHANG A. LITERATURVERZEICHNIS [41] Wikipedia: ARP spoofing. http://de.wikipedia.org/wiki/ARP_ Spoofing (25. Dezember 2006), http://en.wikipedia.org/wiki/ ARP_spoofing (25. Dezember 2006). [42] Wikipedia: C. http://de.wikipedia.org/wiki/C_ (26. Dezember 2006), http: %28Programmiersprache%29 //en.wikipedia.org/wiki/C_programming_language (26. Dezember 2006). [43] Wikipedia: File Transfer Protocol. http://de.wikipedia. (25. Dezember 2006), org/wiki/File_Transfer_Protocol http://en.wikipedia.org/wiki/File_Transfer_Protocol (25. Dezember 2006). [44] Wikipedia: HyperText Transfer Protocol. http://de.wikipedia.org/ wiki/HTTP (25. Dezember 2006), http://en.wikipedia.org/wiki/ HTTP (25. Dezember 2006). [45] Wikipedia: Internet Control Message Protocol. http://de.wikipedia. org/wiki/ICMP (7. November 2006), http://en.wikipedia.org/ wiki/Internet_Control_Message_Protocol (7. November 2006). [46] Wikipedia: Internet Protocol. http://de.wikipedia.org/wiki/ Internet_Protocol (25. Dezember 2006), http://en.wikipedia. org/wiki/Internet_Protocol (25. Dezember 2006). [47] Wikipedia: Informationstechnik (de) / Information technology (en). http://de.wikipedia.org/wiki/Informationstechnik (5. November 2006), http://en.wikipedia.org/wiki/Information_ Technology (5. November 2006). [48] Wikipedia: Pcap. http://en.wikipedia.org/wiki/Pcap (21. November 2006). [49] Wikipedia: Remote procedure call. http://de.wikipedia.org/ wiki/Remote_Procedure_Call (15. November 2006), http://en. wikipedia.org/wiki/Remote_procedure_call (15. November 2006). [50] Wikipedia: Simple Mail Transfer Protocol. http://de.wikipedia. org/wiki/SMTP (25. Dezember 2006), http://en.wikipedia.org/ wiki/SMTP (25. Dezember 2006). [51] Wikipedia: Simple Network Management Protocol. http:// de.wikipedia.org/wiki/SNMP (21. November 2006), http://en. wikipedia.org/wiki/SNMP (21. November 2006). [52] Wikipedia: Secure Shell. http://de.wikipedia.org/wiki/Ssh (21. November 2006), http://en.wikipedia.org/wiki/Ssh (21. November 2006). 96 ANHANG A. LITERATURVERZEICHNIS [53] Wikipedia: Syslog. http://de.wikipedia.org/wiki/Syslog (25. Dezember 2006), http://en.wikipedia.org/wiki/Syslog (25. Dezember 2006). [54] Wikipedia: Transmission Control Protocol. http://de.wikipedia. org/wiki/Transmission_Control_Protocol (23. Dezember 2006), http://en.wikipedia.org/wiki/Transmission_Control_Protocol (23. Dezember 2006). [55] Wikipedia: User Datagram Protocol. http://de.wikipedia. org/wiki/User_Datagram_Protocol (23. Dezember 2006), http: //en.wikipedia.org/wiki/User_Datagram_Protocol (23. Dezember 2006). [56] Wikipedia: Unicode. (23. Dezember 2006), (23. Dezember 2006). http://de.wikipedia.org/wiki/Unicode http://en.wikipedia.org/wiki/Unicode [57] Wikipedia: UNIX. http://de.wikipedia.org/wiki/UNIX (25. Dezember 2006), http://en.wikipedia.org/wiki/UNIX (22. August 2006). [58] Wikipedia: Extensible Markup Language. http://de.wikipedia.org/ wiki/XML (5. November 2006), http://en.wikipedia.org/wiki/XML (5. November 2006). 97 98 Anhang B Listings – fbuild B.1 fbuild.sh Listing B.1: fbuild.sh 1 #! /bin/sh 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # # # # # # # # # # # # # # # # fbuild.sh Copyright (C) 2006 Niki W. Waibel This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 19 20 # $Id: fbuild.sh 346 2006-11-23 04:08:01Z nikiwaibel $ 21 22 23 OLDPATH="$PATH"; PATH=’/bin:/usr/bin’ export PATH 24 25 26 27 LANG=’C’ LC_ALL=’C’ export LANG LC_ALL 28 29 30 31 unset LD_PRELOAD unset LD_LIBRARY_PATH unset LD_RUN_PATH 32 99 USA ANHANG B. LISTINGS – FBUILD 33 34 35 36 cmdARG0="$0" cmdARG1="$1" cmdARG2="$2" cmdARG3="$3" 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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 Usage () { echo "USAGE: $cmdARG0 <fbuild-file> [platform]" cat << ’EOF’ fbuild-file: a file, defining the shell variables: N, V: req, "" SUF, REV: opt, "" ID: opt, $N-$V. DIR: opt, $N-$V URL: opt, "" USE_MAKETHREADS: opt, yes USE_MOVE_PREV_PACKAGE: opt, yes USE_DEFAULT_LINK: opt, yes USE_LINKDIR_LINKS: opt, yes USE_X11: opt, no USE_PERL: opt, no USE_CROSSPLAT: opt, "" provided by the following variables (def, if var was not set or empty): FBUILDHOME "‘pwd‘" PATCH_DIR "$FBUILDHOME/patches" DL_DIR "/home/download" SRC_DIR "/tmp" BUILD_DIR "/tmp" PLAT cmdline, env, cfg-files, then guess BASE_NOPLAT "/misc" BASE "/misc/$PLAT" BASEOPT "$BASE/opt" LINKBIN "$BASE/bin" LINKSBIN "$BASE/sbin" LINKLIB "$BASE/lib" LINKINC "$BASE/include" LINKMAN "$BASE/man" LINKINFO "$BASE/info" BIN2OPT ’../opt’ SBIN2OPT ’../opt’ LIB2OPT ’../opt’ INC2OPT ’../opt’ MAN2OPT ’../opt’ INFO2OPT ’../opt’ PATH "$PRE_PATH:$LINKBIN:$LINKSBIN:/bin:/usr/bin:$POST_PATH" INSTALLINFO: ’install-info’ PERL: ’perl’ MAKE: ’make’ CC: "${CROSS}gcc" CXX: "${CROSS}g++" FC: "${CROSS}gfortran" CPP: "${CROSS}cpp" CXXCPP: "$CPP" 100 ANHANG B. LISTINGS – FBUILD 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 FCCPP: "$CPP" PERLFLAGS: ’’ MAKEFLAGS: ’’ CPPFLAGS: "-I$LINKINC" CXXCPPFLAGS: "$CPPFLAGS" FCCPPFLAGS: "$CPPFLAGS" OPTIMIZE: ’-O2’ CFLAGS: "-Wall $OPTIMIZE $CPPFLAGS" CXXFLAGS: "$CFLAGS" FFLAGS: "$CFLAGS" MAKETHREADS: ’-j3’ LDFLAGS: "-Wl,--enable-new-dtags -L$LINKLIB -Wl,--rpath -Wl,$LINKLIB $CROSS_LDFLAGS" defining the optional shell functions: f_setvars, f_info, f_pre_configure, f_configure, f_post_configure, f_pre_make, f_make, f_post_make, f_pre_makeinstall, f_makeinstall, f_post_makeinstall, provided by the following shell functions: f_echo, f_sed, f_awk, f_which, f_patch, f_source, f_unpack, f_download, f_setenv, f_setifenv, f_unsetenv, f_appendenv, f_prependenv, f_subenv, def_configure, def_perl_configure, def_make, def_perl_make; which functions can use the following vars in addition to the vars on top: suf: "_$SUF" rev: "-r$REV" PREFIX "$BASEOPT/$N/$V$suf$rev" platform: i686-pc-linux-gnu x86_64-unknown-linux-gnu alpha-unknown-linux-gnu sparc-sun-solaris2.10 i386-sun-solaris2.10 amd64-sun-solaris2.10 ... EOF } 124 125 126 127 128 129 130 131 132 133 134 135 f_which () { ( oldIFS="$IFS" foundall=’1’ found=’0’ for prg in "$@"; do IFS=’:’ for path in $PATH; do if test -x "$path"/"$prg"; then echo "$path/$prg" found=’1’ 136 137 fi break 101 ANHANG B. LISTINGS – FBUILD done 138 IFS="$oldIFS" test "x$found" = ’x0’ && foundall=’0’ found=’0’ 139 140 141 done test "x$foundall" = ’x1’ && return 0 || return 1 142 143 144 145 ) } 146 147 f_echo () { echo ’#fbuild#’ "$@"; } 148 149 150 f_sed () { sed "$@"; } f_awk () { awk "$@"; } 151 152 153 154 155 156 f_source () { if test "x$2" != ’x’; then # f_source arg1 arg2 [arg3 ...] echo ’USAGE: f_source’ >&2 echo ’USAGE: f_source <file>’ >&2 return 1 fi if test "x$1" = ’x’; then # f_source test -r "/etc/fbuild.d/fbuild.conf" \ 157 158 159 && . "/etc/fbuild.d/fbuild.conf" 160 161 162 163 164 165 166 167 fi 168 # f_source arg1 test -r "/etc/fbuild.d/$1" \ && . "/etc/fbuild.d/$1" test -r "$FBUILDHOME/etc/fbuild.d/$1" \ && . "$FBUILDHOME/etc/fbuild.d/$1" test -r "$FBUILDHOME/$1" \ && . "$FBUILDHOME/$1" return 0 169 170 171 172 173 174 175 176 177 test -r "$FBUILDHOME/etc/fbuild.d/fbuild.conf" \ && . "$FBUILDHOME/etc/fbuild.d/fbuild.conf" test -r "$FBUILDHOME/fbuild.conf" \ && . "$FBUILDHOME/fbuild.conf" test -r "$HOME/.fbuildrc" \ && . "$HOME/.fbuildrc" return 0 } 178 179 180 181 182 f_unsetenv () { if test "x$1" = ’x’ || test "x$2" != ’x’; then echo ’USAGE: f_unsetenv <variable>’ >&2 return 1 fi eval $1=’’ eval sed$1=’’ eval ’unset’ ’"$1"’ eval ’unset’ ’"sed$1"’ return 0 183 184 185 186 187 188 189 } 190 191 f_setenv () { 102 ANHANG B. LISTINGS – FBUILD if test $# -lt 2 || test $# -gt 2; then echo ’USAGE: f_setenv <variable> <value>’ >&2 return 1 fi newval="$2" sednewval=‘echo "$newval" | sed -e ’s/\//\\\\\//g’‘ eval $1=’$newval’ eval sed$1=’$sednewval’ eval ’export’ ’"$1"’ eval ’export’ ’"sed$1"’ 192 193 194 195 196 197 198 199 200 201 202 } 203 204 205 206 207 f_setifenv () { if test $# -lt 2 || test $# -gt 2; then echo ’USAGE: f_setifenv <variable> <value>’ >&2 return 1 fi eval varval=’${’$1’}’ if test "x$varval" = ’x’; then 208 209 210 211 212 # if <variable> is empty, set <variable> and sed<variable> to <value> f_setenv "$@" else 213 214 215 216 217 # if <variable> is set, init sed<variable> sedvarval=‘echo "$varval" | sed -e ’s/\//\\\\\//g’‘ eval sed$1=’$sedvarval’ eval ’export’ ’"sed$1"’ fi 218 219 } 220 221 222 223 AppendOrPrependEnv () { # AppendOrPrependEnv <append|prepend> <var> <val> [sep] test "x$3" = ’x’ && return 0 224 225 if test $# -eq 3; then sep=’ ’ 226 227 else 228 229 fi sep="$4" 230 231 eval varval=’${’$2’}’ 232 233 234 235 236 if test "x$varval" = ’x’; then f_setenv "$2" "$3" return $? fi 237 238 239 240 241 242 243 244 245 case "x$1" in xappend) newval="$varval$sep$3" ;; xprepend) newval="$3$sep$varval" ;; *) 103 ANHANG B. LISTINGS – FBUILD echo ’USAGE: AppendOrPrependEnv <append|prepend> <variable> <value> 246 [sep]’ >&2 return 1 247 ;; esac f_setenv "$2" "$newval" 248 249 250 251 } 252 253 254 255 256 f_appendenv () { if test $# -lt 2 || test $# -gt 3; then echo ’USAGE: f_appendenv <variable> <value> [sep]’ >&2 return 1 fi 257 AppendOrPrependEnv ’append’ "$@" 258 259 } 260 261 262 263 264 f_prependenv () { if test $# -lt 2 || test $# -gt 3; then echo ’USAGE: f_prepedenv <variable> <value> [sep]’ >&2 return 1 fi 265 AppendOrPrependEnv ’prepend’ "$@" 266 267 } 268 269 270 271 272 f_subenv () { if test $# -lt 4 || test $# -gt 4; then echo ’USAGE: f_subenv <variable> <old_regex_value> <new_value> <sep>’ >&2 return 1 fi eval varval=’${’$1’}’ if test "x$varval" = ’x’; then return 0 fi v=‘echo "$2" | sed -e ’s/\//\\\\\//g’‘ n=‘echo "$3" | sed -e ’s/\//\\\\\//g’‘ s=‘echo "$4" | sed -e ’s/\//\\\\\//g’‘ if test "x$n" = ’x’; then newvarval=‘echo "$varval" \ | f_sed -e "s/$s$v$s/$s/g" \ -e "s/^$v$s//" \ -e "s/$s$v$//" \ -e "s/^$v$//"‘ else newvarval=‘echo "$varval" \ | f_sed -e "s/$s$v$s/$s$n$s/g" \ -e "s/^$v$s/$n$s/" \ -e "s/$s$v$/$s$n/" \ -e "s/^$v$/$n/"‘ fi 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 f_setenv "$1" "$newvarval" 295 296 } 297 104 ANHANG B. LISTINGS – FBUILD 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 f_unpack () { if test -r "${1}tar.bz2"; then $BZIP2 "${1}tar.bz2" | tar -xf elif test -r "${1}.tar.bz2"; then $BZIP2 "${1}.tar.bz2" | tar -xf elif test -r "${1}tar.gz"; then $GZIP "${1}tar.gz" | tar -xf elif test -r "${1}.tar.gz"; then $GZIP "${1}.tar.gz" | tar -xf elif test -r "${1}tgz"; then $GZIP "${1}tgz" | tar -xf elif test -r "${1}.tgz"; then $GZIP "${1}.tgz" | tar -xf elif test -r "${1}tar.Z"; then compress -dc "${1}tar.Z" | tar -xf elif test -r "${1}.tar.Z"; then compress -dc "${1}.tar.Z" | tar -xf elif test -r "${1}tar"; then tar -xf "${1}tar" elif test -r "${1}.tar"; then tar -xf "${1}.tar" elif test -r "${1}"; then case "x${1}" in x*.tar.bz2) $BZIP2 "${1}" | tar -xf - ;; x*.tar.gz) $GZIP "${1}" | tar -xf - ;; x*.tgz) $GZIP "${1}" | tar -xf - ;; x*.tar.Z) compress -dc "${1}" | tar -xf - ;; x*.tar) tar -xf "${1}" ;; x*) return 1 ;; esac else return 1 fi return 0 328 329 330 331 332 } 333 334 335 336 337 338 339 340 341 342 f_download () { OLDDIR="‘pwd‘" test "x$1" = ’x’ && return 10 cd "$DL_DIR" wget -c -t 3 --progress=dot:mega "$1" r="$?" cd "$OLDDIR" return $r } 343 344 345 346 f_patch () { test -f "$1" || return 1 test "x$2" = ’x’ && return 1 347 348 349 f_patch_file="$1" shift 350 351 f_echo "f_patch: $f_patch_file" 105 ANHANG B. LISTINGS – FBUILD 352 if test -r "${f_patch_file}bz2"; then $BZIP2 "${f_patch_file}bz2" | patch "$@" elif test -r "${f_patch_file}.bz2"; then $BZIP2 "${f_patch_file}.bz2" | patch "$@" elif test -r "${f_patch_file}gz"; then $GZIP "${f_patch_file}gz" | patch "$@" elif test -r "${f_patch_file}.gz"; then $GZIP "${f_patch_file}.gz" | patch "$@" elif test -r "${f_patch_file}Z"; then compress -dc "${f_patch_file}Z" | patch "$@" elif test -r "${f_patch_file}.Z"; then compress -dc "${f_patch_file}.Z" | patch "$@" elif test -r "${f_patch_file}"; then case "x${f_patch_file}" in x*.bz2) $BZIP2 "${f_patch_file}" | patch "$@" ;; x*.gz) $GZIP "${f_patch_file}" | patch "$@" ;; x*.Z) compress -dc "${f_patch_file}" | patch "$@" ;; x*) cat "${f_patch_file}" | patch "$@" ;; 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 esac 371 else return 1 fi return 0 372 373 374 375 376 } 377 378 379 f_setvars () { true; } f_info () { true; } 380 381 382 383 f_configure () f_pre_configure () f_post_configure () { def_configure; } { true; } { true; } f_make () f_pre_make () f_post_make () { def_make; } { true; } { true; } 384 385 386 387 388 389 390 391 f_makeinstall () { def_makeinstall; } f_pre_makeinstall () { true; } f_post_makeinstall () { true; } 392 393 394 395 396 397 398 399 400 401 402 403 404 405 def_configure () { "$SRC_DIR/$DIR/configure" --prefix="$PREFIX" \ --disable-static --enable-shared \ --with-gnu-ld "$@" } def_perl_configure () { "$PERL" Makefile.PL $PERLFLAGS "$@" } def_make () { "$MAKE" $MAKEFLAGS $MAKETHREADS "$@" } def_perl_make () { "$MAKE" $MAKEFLAGS $MAKETHREADS \ 106 ANHANG B. LISTINGS – FBUILD "PATH=$PATH" \ "CPP=$CROSS$CPP" \ "CC=$CROSS$CC" \ "CXX=$CROSS$CXX" \ "CXXCPP=$CROSS$CXXCPP" \ "CPPFLAGS=$CPPFLAGS" \ "CFLAGS=$CFLAGS" \ "CXXFLAGS=$CXXFLAGS" \ "CXXCPPFLAGS=$CXXCPPFLAGS" \ "LDFLAGS=$LDFLAGS" \ "$@" 406 407 408 409 410 411 412 413 414 415 416 417 418 } def_makeinstall () { "$MAKE" $MAKEFLAGS -j1 "$@" install; } 419 420 # main 421 422 423 424 425 426 427 428 429 430 431 #argument check if test "x$cmdARG1" = ’x’; then Usage exit 1 elif test "x$cmdARG2" = ’x’; then cmdFILE="$1" elif test "x$cmdARG3" = ’x’; then cmdFILE="$1" cmdPLAT="$2" else # fbuild.sh fbuild-file # fbuild.sh fbuild-file platform # fbuild.sh arg1 arg2 arg3 [arg4 ...] Usage 432 433 434 # fbuild.sh fi exit 1 435 436 437 438 439 440 441 BZIP2="‘f_which bzip2‘ -dc" \ || BZIP2=‘f_which bzcat‘ \ || { f_echo "cannot find bzip2 or bzcat"; exit; } GZIP="‘f_which gzip‘ -dc" \ || GZIP=‘f_which gzcat‘ \ || { f_echo "cannot find gzip or gzcat"; exit; } 442 443 444 445 # init (Initialisierung der Variablen) f_setenv D "‘date ’+%Y%m%d%H%M%S’‘" f_echo "PACKAGE: $cmdFILE $D" 446 447 448 449 f_setifenv FBUILDHOME "‘pwd‘" f_source f_source "$cmdFILE" 450 451 452 453 454 455 f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv PATCH_DIR "$FBUILDHOME/patches" DL_DIR ’/home/download’ SRC_DIR ’/tmp’ BUILD_DIR ’/tmp’ BASE_NOPLAT ’/misc’ 456 457 458 459 # commandline overwrites config files test "x$PLAT" = ’x’ || f_setenv PLAT "$PLAT" test "x$cmdPLAT" = ’x’ || f_setenv PLAT "$cmdPLAT" 107 ANHANG B. LISTINGS – FBUILD 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 if test "x$PLAT" = ’x’; then cat << EOF ##################################### # W A R N I N G : PLAT is not set # neither on the command-line, # nor in the config files! ##################################### # Trying to fetch config.guess from # savannah.gnu.org to set PLAT ##################################### EOF test -f "$DL_DIR/config.guess" || ( PATH="$PATH:$OLDPATH" f_download ’http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess’ ) f_setifenv PLAT ‘sh "$DL_DIR/config.guess"‘ mv -f "$DL_DIR/config.guess" "$DL_DIR/config.guess_fbuild" if test "x$PLAT" = ’x’; then cat << EOF ##################################### # failed to set PLAT !!!!!!!!!!!!!!!! # continuing anyway -- double check ! # dirs in the following output !!!!!! ##################################### EOF else cat << EOF 484 485 486 487 488 489 490 ##################################### # success # PLAT is set to: $PLAT ##################################### EOF 491 492 fi fi 493 494 495 496 497 498 499 500 501 502 503 504 505 506 if test "x$USE_CROSSPLAT" = ’xyes’; then f_setifenv BASE "$BASE_NOPLAT/CROSS-$CROSSPLAT" else f_setifenv BASE "$BASE_NOPLAT/$PLAT" fi if test "x$PLAT" = ’x’; then cat << EOF # BASE set to: $BASE # if you compile for single platform # only this might be ok for you. ##################################### EOF fi 507 508 509 510 511 f_setifenv f_setifenv f_setifenv f_setifenv BASEOPT LINKBIN LINKSBIN LINKINC "$BASE/opt" "$BASE/bin" "$BASE/sbin" "$BASE/include" 108 ANHANG B. LISTINGS – FBUILD 512 513 514 f_setifenv LINKLIB "$BASE/lib" f_setifenv LINKMAN "$BASE/man" f_setifenv LINKINFO "$BASE/info" 515 516 517 518 519 520 521 f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv LIB2OPT INC2OPT BIN2OPT SBIN2OPT MAN2OPT INFO2OPT ’../opt’ ’../opt’ ’../opt’ ’../opt’ ’../opt’ ’../opt’ f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv f_setifenv INSTALLINFO ’install-info’ PERL ’perl’ MAKE ’make’ CPP "${CROSS}cpp" CXXCPP "$CPP" FCCPP "$CPP" CC "${CROSS}gcc" CXX "${CROSS}g++" FC "${CROSS}gfortran" 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 f_setifenv CPPFLAGS "-I$LINKINC" f_setifenv CXXCPPFLAGS "$CPPFLAGS" f_setifenv FCCPPFLAGS "$CPPFLAGS" f_setifenv OPTIMIZE ’-O2’ f_setifenv CFLAGS "-Wall $OPTIMIZE $CPPFLAGS" f_setifenv CXXFLAGS "$CFLAGS" f_setifenv FFLAGS "$CFLAGS" f_setifenv LDFLAGS "-Wl,--enable-new-dtags -L$LINKLIB -Wl,--rpath -Wl,$LINKLIB $CROSS_LDFLAGS" 541 542 543 544 545 546 547 548 if test "x$USE_CROSSPLAT" = ’xyes’; then f_prependenv PATH "$BASE_NOPLAT/$PLAT/bin:$BASE_NOPLAT/$PLAT/sbin" ’:’ else f_prependenv PATH "$LINKBIN:$LINKSBIN" ’:’ fi f_prependenv PATH "$PRE_PATH" ’:’ f_appendenv PATH "$POST_PATH" ’:’ 549 550 551 552 suf=’’; test "x$SUF" = ’x’ || suf="_$SUF" rev=’’; test "x$REV" = ’x’ || rev="-r$REV" export suf rev 553 554 555 556 557 if test "x$PREFIX" = ’x’; then f_setenv PREFIX "$BASEOPT/$N/$V$suf$rev" else test "x$USE_MOVE_PREV_PACKAGE" = ’xyes’ \ || USE_MOVE_PREV_PACKAGE=’no’ 558 559 560 561 562 563 fi test "x$USE_DEFAULT_LINK" = ’xyes’ || USE_DEFAULT_LINK=’no’ test "x$USE_LINKDIR_LINKS" = ’xyes’ || USE_LINKDIR_LINKS=’no’ f_setenv PREFIX "$PREFIX" f_setenv PERLFLAGS "PREFIX=\"$PREFIX\"" 564 109 ANHANG B. LISTINGS – FBUILD 565 566 567 f_setifenv ID "$N-$V." f_setifenv DIR "$N-$V" f_setifenv URL ’’ 568 569 if test "x$USE_MAKETHREADS" = ’xno’; then f_setenv MAKETHREADS ’-j1’ 570 571 else 572 573 fi f_setifenv MAKETHREADS ’-j3’ 574 575 if test "x$USE_X11" = ’xyes’ ; then 576 577 578 579 580 581 582 583 584 585 586 587 588 589 fi f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv f_appendenv PATH ’/usr/X11R6/bin’ ’:’ PATH ’/usr/openwin/bin’ ’:’ CPPFLAGS ’-I/usr/X11R6/include’ CPPFLAGS ’-I/usr/openwin/include’ CFLAGS ’-I/usr/X11R6/include’ CFLAGS ’-I/usr/openwin/include’ CXXCPPFLAGS ’-I/usr/X11R6/include’ CXXCPPFLAGS ’-I/usr/openwin/include’ CXXFLAGS ’-I/usr/X11R6/include’ CXXFLAGS ’-I/usr/openwin/include’ LDFLAGS ’-L/usr/X11R6/lib64 -Wl,-rpath -Wl,/usr/X11R6/lib64’ LDFLAGS ’-L/usr/X11R6/lib -Wl,-rpath -Wl,/usr/X11R6/lib’ LDFLAGS ’-L/usr/openwin/lib -Wl,-rpath -Wl,/usr/openwin/lib’ 590 591 592 if test "x$USE_PERL" = ’xyes’ ; then test "x$USE_MOVE_PREV_PACKAGE" = ’xyes’ \ || USE_MOVE_PREV_PACKAGE=’no’ 593 594 595 596 597 598 fi test "x$USE_DEFAULT_LINK" = ’xyes’ || USE_DEFAULT_LINK=’no’ test "x$USE_LINKDIR_LINKS" = ’xyes’ || USE_LINKDIR_LINKS=’no’ f_prependenv PERL5LIB "$PREFIX/lib" ’:’ f_prependenv PERL5LIB "$PREFIX/lib/site_perl" ’:’ 599 600 601 602 f_echo ’f_setvars ()’ f_setvars || exit 3 f_echo ’f_setvars () done’ 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo " URL=$URL" " DL_DIR=$DL_DIR" " SRC_DIR=$SRC_DIR" "BUILD_DIR=$BUILD_DIR" " ID=$ID" " DIR=$DIR" "" " PLAT=$PLAT" "BASE_NOPLAT=$BASE_NOPLAT" " BASE=$BASE" " BASEOPT=$BASEOPT" " PREFIX=$PREFIX" " LINKBIN=$LINKBIN" " LINKSBIN=$LINKSBIN" " LINKLIB=$LINKLIB" 110 ANHANG B. LISTINGS – FBUILD 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo f_echo " LINKINC=$LINKINC" " LINKMAN=$LINKMAN" " LINKINFO=$LINKINFO" "" " CPP=$CPP" " CPPFLAGS=$CPPFLAGS" " CXXCPP=$CXXCPP" " CXXCPPFLAGS=$CXXCPPFLAGS" " FCCPPFLAGS=$FCCPPFLAGS" " CC=$CC" " CXX=$CXX" " FC=$FC" " CFLAGS=$CFLAGS" " CXXFLAGS=$CXXFLAGS" " FFLAGS=$FFLAGS" " LDFLAGS=$LDFLAGS" " LD_RUN_PATH=$LD_RUN_PATH" "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" " LIBS=$LIBS" " PATH=$PATH" "" 640 641 642 643 f_echo ’f_info ()’ f_info || exit 3 f_echo ’f_info () done’ 644 645 646 647 648 649 650 651 #unpack and maybe download cd "$SRC_DIR" rm -rf "$DIR" 2>/dev/null f_unpack "$DL_DIR/$ID" || { if test "x$URL" = ’x’; then f_echo ’Unpack failed and URL not specified. Exiting.’ exit 3 else 652 f_echo ’Unpack failed. Trying to download.’ if f_download "$URL"; then f_unpack "$DL_DIR/$ID" || { f_echo ’Unpack failed again. Exiting.’ exit 5 } 653 654 655 656 657 658 else 659 660 661 662 fi 663 664 fi f_echo ’Download failed. Exiting.’ exit 4 } 665 666 667 668 cd "$BUILD_DIR" test "x$BUILD_DIR" = "x$SRC_DIR" || { rm -rf "$DIR"; mkdir -p "$DIR"; } cd "$DIR" 669 670 671 672 #configure f_echo ’f_pre_configure ()’ f_pre_configure || exit 3 111 ANHANG B. LISTINGS – FBUILD 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 f_echo ’f_pre_configure () done’ f_echo ’f_configure ()’ f_configure || exit 3 f_echo ’f_configure () done’ f_echo ’f_post_configure ()’ f_post_configure || exit 3 f_echo ’f_post_configure () done’ #make f_echo ’f_pre_make ()’ f_pre_make || exit 3 f_echo ’f_pre_make () done’ f_echo ’f_make ()’ f_make || exit 3 f_echo ’f_make () done’ f_echo ’f_post_make ()’ f_post_make || exit 3 f_echo ’f_post_make () done’ 690 691 692 693 694 695 696 697 #move prev package if test "x$USE_MOVE_PREV_PACKAGE" != "xno"; then f_echo "MOVE PREV PACKAGE:" echo mv "$PREFIX" "${PREFIX}_$D" mv "$PREFIX" "${PREFIX}_$D" f_echo "MOVE PREV PACKAGE: done" else 698 699 fi f_echo "MOVE PREV PACKAGE: disabled" 700 701 702 703 704 705 706 707 708 709 710 #make install f_echo ’f_pre_makeinstall ()’ f_pre_makeinstall || exit 3 f_echo ’f_pre_makeinstall () done’ f_echo ’f_makeinstall ()’ f_makeinstall || exit 3 f_echo ’f_makeinstall () done’ f_echo ’f_post_makeinstall ()’ f_post_makeinstall || exit 3 f_echo ’f_post_makeinstall () done’ 711 712 #links 713 714 715 if test "x$USE_DEFAULT_LINK" != ’xno’; then if test -d "$BASEOPT/$N/$V$suf$rev"; then f_echo ’DEFAULT LINK: ’ mv "$BASEOPT/$N/default" "$BASEOPT/$N/default_$D" ln -s "$V$suf$rev" "$BASEOPT/$N/default" f_echo ’DEFAULT LINK: done’ 716 717 718 719 else 720 721 722 723 fi else 724 725 fi f_echo "DEFAULT LINK: disabled (no $V$suf$rev dir)" f_echo "DEFAULT LINK: disabled" 726 112 ANHANG B. LISTINGS – FBUILD 727 728 729 730 731 732 733 734 735 736 737 738 739 740 if test "x$USE_LINKDIR_LINKS" != ’xno’; then awkprg=’{ printf("ln -s "); for(i=6;i<NF;i++) printf("../"); printf("%s ", $0); for(i=6;i<=NF;i++) { printf("%s", $i); if(i<NF) printf("/"); } printf("\n"); }’ f_echo ’LINKDIR LINKS: ’ 741 742 743 744 745 746 747 test test test test test test -d -d -d -d -d -d "$LINKBIN" "$LINKSBIN" "$LINKLIB" "$LINKINC" "$LINKMAN" "$LINKINFO" || || || || || || mkdir mkdir mkdir mkdir mkdir mkdir -p -p -p -p -p -p "$LINKBIN" "$LINKSBIN" "$LINKLIB" "$LINKINC" "$LINKMAN" "$LINKINFO" 748 749 750 751 752 753 754 755 756 if test -d "$PREFIX/bin" \ && test "x$PREFIX/bin" != "x$LINKBIN" then cd "$PREFIX/bin" find ./* -maxdepth 0 \( -type f -o -type l \) \ -exec mv "$LINKBIN/{}" "$LINKBIN/{}_$D" \; cd "$LINKBIN" find "$BIN2OPT/$N/$V$suf$rev/bin/"* \ 757 758 759 else 760 761 fi -maxdepth 0 \( -type f -o -type l \) \ -exec ln -s {} \; f_echo "LINKDIR LINKS: disabled $PREFIX/bin" 762 763 764 765 766 767 768 769 770 if test -d "$PREFIX/sbin" \ && test "x$PREFIX/sbin" != "x$LINKSBIN" then cd "$PREFIX/sbin" find ./* -maxdepth 0 \( -type f -o -type l \) \ -exec mv "$LINKSBIN/{}" "$LINKSBIN/{}_$D" \; cd "$LINKSBIN" find "$SBIN2OPT/$N/$V$suf$rev/sbin/"* \ 771 772 773 else 774 775 fi -maxdepth 0 \( -type f -o -type l \) \ -exec ln -s {} \; f_echo "LINKDIR LINKS: disabled $PREFIX/sbin" 776 777 778 779 780 if test -d "$PREFIX/lib" \ && test "x$PREFIX/lib" != "x$LINKLIB" then cd "$PREFIX/lib" 113 ANHANG B. LISTINGS – FBUILD find ./* -maxdepth 0 \( -type f -o -type l \) \ 781 \( -name "*.so" -o -name "*.so.*" \) \ -exec mv "$LINKLIB/{}" "$LINKLIB/{}_$D" \; cd "$LINKLIB" find "$LIB2OPT/$N/$V$suf$rev/lib/"* -maxdepth 0 \ \( -type f -o -type l \) \ \( -name "*.so" -o -name "*.so.*" \) \ -exec ln -s {} \; 782 783 784 785 786 787 788 789 else 790 791 fi f_echo "LINKDIR LINKS: disabled $PREFIX/lib" 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 if test -d "$PREFIX/include" \ && test "x$PREFIX/include" != "x$LINKINC" then cd "$PREFIX/include" # remove links to dirs (gen by prev version of this script) find ./* \( -type d \) -exec rm "$LINKINC/{}" \; find ./* \( -type d \) -exec mkdir -p "$LINKINC/{}" \; find ./* \( -type f -o -type l \) \ -exec mv "$LINKINC/{}" "$LINKINC/{}_$D" \; cd "$LINKINC" eval "‘find \"$INC2OPT/$N/$V$suf$rev/include/\"* \ \( -type f -o -type l \) \ | awk -F/ \"$awkprg\"‘" else 807 808 fi f_echo "LINKDIR LINKS: disabled $PREFIX/include" 809 810 811 812 813 814 815 816 817 818 819 if test -d "$PREFIX/man" \ && test "x$PREFIX/man" != "x$LINKMAN" then cd "$PREFIX/man" find ./* \( -type d \) \ -exec mkdir -p "$LINKMAN/{}" \; find ./* \( -type f -o -type l \) \ -exec mv "$LINKMAN/{}" "$LINKMAN/{}_$D" \; cd "$LINKMAN" eval "‘find \"$MAN2OPT/$N/$V$suf$rev/man/\"* \ 820 821 822 else 823 824 fi \( -type f -o -type l \) \ | awk -F/ \"$awkprg\"‘" f_echo "LINKDIR LINKS: disabled $PREFIX/man" 825 826 827 828 829 830 831 832 833 834 if test -d "$PREFIX/info" \ && test "x$PREFIX/info" != "x$LINKINFO" then cd "$PREFIX/info" find ./* -maxdepth 0 \( -type f -o -type l \) \ -name "*.info*" \ -exec mv "$LINKINFO/{}" "$LINKINFO/{}_$D" \; cd "$LINKINFO" find "$INFO2OPT/$N/$V$suf$rev/info/"* \ 114 ANHANG B. LISTINGS – FBUILD -maxdepth 0 \( -type f -o -type l \) \ -name "*.info*" \ -exec ln -s {} \; find "$INFO2OPT/$N/$V$suf$rev/info/"* \ -maxdepth 0 \( -type f -o -type l \) \ -name "*.info" \ -exec "$INSTALLINFO" {} "$LINKINFO/dir" \; 835 836 837 838 839 840 841 else 842 843 fi 844 f_echo "LINKDIR LINKS: disabled $PREFIX/info" 845 if test -d "$PREFIX/lib/pkgconfig" \ && test "x$PREFIX/lib/pkgconfig" \ != "x$BASEOPT/pkgconfig/default/lib/pkgconfig" then cd "$PREFIX/lib/pkgconfig" find ./* -maxdepth 0 \( -type f -o -type l \) \ -exec rm "$BASEOPT/pkgconfig/default/lib/pkgconfig/{}" \; cd "$BASEOPT/pkgconfig/default/lib/pkgconfig" find "../../../../$N/$V$suf$rev/lib/pkgconfig/"* \ 846 847 848 849 850 851 852 853 854 855 856 else 857 858 fi 859 -maxdepth 0 \( -type f -o -type l \) \ -exec ln -s {} \; f_echo "LINKDIR LINKS: disabled $PREFIX/lib/pkgconfig" 860 if test -d "$PREFIX/share/aclocal" \ && test "x$PREFIX/share/aclocal" \ != "x$BASEOPT/automake/$V/share/aclocal" then cd "$PREFIX/share/aclocal" find ./* -maxdepth 0 \( -type f -o -type l \) \ -exec rm "$BASEOPT/automake/default/share/aclocal/{}" \; cd "$BASEOPT/automake/default/share/aclocal"* find "../../../../$N/$V$suf$rev/share/aclocal/"* \ 861 862 863 864 865 866 867 868 869 870 871 else 872 873 fi 874 -maxdepth 0 \( -type f -o -type l \) \ -exec ln -s {} \; f_echo "LINKDIR LINKS: disabled $PREFIX/share/aclocal" 875 f_echo ’LINKDIR LINKS: done’ 876 877 else 878 879 fi f_echo ’LINKDIR LINKS: disabled’ 880 881 f_echo "PACKAGE: $cmdFILE $D @‘date ’+%Y%m%d%H%M%S’‘ done" 115 ANHANG B. LISTINGS – FBUILD B.2 helloworld.c Ein Programmbeispiel (Programmcode / Quellcode) in der Programmiersprache C um den Text Hello World! auszugeben. Listing B.2: helloworld.c 1 #include <stdio.h> 2 3 int main(int argc, char **argv); 4 5 6 7 8 9 10 int main(int argc, char **argv) { printf("Hello World!\n"); return 0; } /* int main(int argc, char **argv) */ B.3 helloworld.s Der Assemblercode für x86 Prozessoren des obigen (Listing B.2) Programmbeispieles. Listing B.3: helloworld.s .file "helloworld.c" .section .rodata 1 2 3 .LC0: 4 5 .string "Hello World!" .text 7 .globl main .type 8 main: 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 main, @function leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp movl $.LC0, (%esp) call puts movl $0, %eax addl $4, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits 116 ANHANG B. LISTINGS – FBUILD B.4 helloworld.bincode Der Binärcode für x86 Prozessoren ist in Hexadezimaldarstellung in der dritten Spalte ersichtlich. Der Datenbinärcode beginnt in Zeile 7 mit 48656C6C ; der Programmbinärcode beginnt in Zeile 15 mit 8D4C2404 . Listing B.4: helloworld.bincode 1 page 1 GAS LISTING helloworld.s 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 30 31 32 33 34 35 36 1 2 3 .LC0: 4 0000 48656C6C 4 6F20576F 4 726C6421 4 00 5 6 .globl 7 8 main: 9 0000 8D4C2404 10 0004 83E4F0 11 0007 FF71FC 12 000a 55 13 000b 89E5 14 000d 51 15 000e 83EC04 16 0011 C7042400 16 000000 17 0018 E8FCFFFF 17 FF 18 001d B8000000 18 00 19 0022 83C404 20 0025 59 21 0026 5D 22 0027 8D61FC 23 002a C3 24 25 26 .note.GNU-stack,"",@progbits GAS LISTING helloworld.s .file "helloworld.c" .section .rodata .string "Hello World!" .text main .type main, @function leal andl pushl pushl movl pushl subl movl 4(%esp), %ecx $-16, %esp -4(%ecx) %ebp %esp, %ebp %ecx $4, %esp $.LC0, (%esp) call puts movl $0, %eax addl $4, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.1" .section page 2 37 38 39 DEFINED SYMBOLS 40 41 helloworld.s:8 *ABS*:0000000000000000 helloworld.c .text:0000000000000000 main 42 43 44 UNDEFINED SYMBOLS puts 117 ANHANG B. LISTINGS – FBUILD B.5 autoconf-2.61.fbuild Autoconf darf nicht von mehreren parallel laufenden Prozessen übersetzt werden. Dies wird in Zeile 5 sichergestellt. Nach make install (f post makeinstall) werden zwei Verknüpfungen erstellt damit fbuild.sh die entsprechenden Dateien finden kann. Listing B.5: autoconf-2.61.fbuild 1 2 3 N="autoconf" V="2.61" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 USE_MAKETHREADS=no 6 7 8 9 10 f_post_makeinstall () { ln -s share/man "$PREFIX/man" \ && ln -s share/info "$PREFIX/info" } B.6 automake-1.10.fbuild Automake darf nicht (wie Autoconf) von mehreren parallel laufenden Prozessen übersetzt werden. Dies wird in Zeile 5 sichergestellt. In Zeile 8 wird eine Verknüpfung erstellt, damit fbuild.sh die entsprechenden Dateien finden kann. Zeilen 9 bis 12 stellen sicher, dass die Verknüpfungen zu allen .m4Dateien erstellt werden. Listing B.6: automake-1.10.fbuild 1 2 3 N="automake" V="1.10" URL="$DLGNU/$N/$N-$V.tar.bz2" 4 5 USE_MAKETHREADS=no 6 7 8 9 10 11 12 13 f_post_makeinstall () { ln -s share/info "$PREFIX/info" \ && mkdir "$PREFIX/share/aclocal" \ && cd "$PREFIX/share/aclocal" \ && ln -s ../../../../*/default/share/aclocal/*.m4 . \ && cd "$BUILD_DIR/$DIR" } 118 ANHANG B. LISTINGS – FBUILD B.7 bison-2.3.fbuild Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 6 ausgeschaltet. Listing B.7: bison-2.3.fbuild 1 2 3 N="bison" V="2.3" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 6 7 f_configure () { def_configure --disable-nls } B.8 bzip2-1.0.3-r1.fbuild Leider besitzt bzip2 kein standard configure -Script. Deshalb ist die Konfiguration, das Kompilieren und das Installieren relativ kompliziert. Listing B.8: bzip2-1.0.3-r1.fbuild 1 2 3 N="bzip2" V="1.0.3" URL="http://www.bzip.org/$V/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 f_configure () { true; } f_make () { "$MAKE" CFLAGS="-fpic -fPIC $CFLAGS -D_FILE_OFFSET_BITS=64" -f Makefile-libbz2_so "$MAKE" CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64" } f_makeinstall () { "$MAKE" PREFIX="$PREFIX" install } f_post_makeinstall () { cp bzip2-shared "$PREFIX/bin" cp libbz2.so.1.0.3 "$PREFIX/lib" cd "$PREFIX/lib" ln -s libbz2.so.1.0.3 libbz2.so.1.0 ln -s libbz2.so.1.0 libbz2.so.1 ln -s libbz2.so.1 libbz2.so } B.9 coreutils-6.6.fbuild Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 6 ausgeschaltet. 119 ANHANG B. LISTINGS – FBUILD Das Paket kann mit und ohne perl übersetzt und installiert werden. Falls perl nicht verwendet wird ($NO PERL ist gesetzt) können jedoch die Hilfsdateien nicht installiert werden. Nach make install (f post makeinstall) werden zwei Verknüpfungen erstellt, damit fbuild.sh die entsprechenden Dateien finden kann. Listing B.9: coreutils-6.6.fbuild 1 2 3 N="coreutils" V="6.6" URL="$DLGNUALPHA/$N/$N-$V.tar.bz2" 4 5 6 7 8 9 10 f_configure () { def_configure --disable-nls } f_make () { if test "x$NO_PERL" = ’x’ || test "x$NO_PERL" = ’xno’; then def_make else 11 # we have no perl yet, so we cannot build the man pages. def_make SUBDIRS="lib src doc m4 po" 12 13 fi 14 15 16 17 18 19 } f_makeinstall () { if test "x$NO_PERL" = ’x’ || test "x$NO_PERL" = ’xno’; then def_makeinstall \ INSTALL="$BUILD_DIR/$DIR/src/ginstall" else 20 21 22 23 24 fi 25 26 27 28 29 30 # we have no perl yet, so we cannot build the man pages. def_makeinstall \ SUBDIRS="lib src doc m4 po" \ INSTALL="$BUILD_DIR/$DIR/src/ginstall" } f_post_makeinstall () { ln -s share/man "$PREFIX/man" \ && ln -s share/info "$PREFIX/info" } B.10 diffutils-2.8.7.fbuild Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 6 ausgeschaltet. Listing B.10: diffutils-2.8.7.fbuild 1 2 3 N="diffutils" V="2.8.7" URL="$DLGNUALPHA/$N/$N-$V.tar.bz2" 4 5 f_configure () { 120 ANHANG B. LISTINGS – FBUILD def_configure --disable-nls 6 7 } B.11 expat-2.0.0.fbuild Listing B.11: expat-2.0.0.fbuild 1 2 3 N="expat" V="2.0.0" URL="$DLSF/$N/$N-$V.tar.gz" B.12 flex-2.5.33.fbuild Eine Verbesserung des Quellcodes (Listing C.1 auf Seite 135) vom Gentoo[6]Team wird in Zeile 8 installiert. Weiters wird GNUC definiert, um Fehler beim Kompilieren zu vermeiden. Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 12 ausgeschaltet. Listing B.12: flex-2.5.33.fbuild 1 2 N="flex" V="2.5.33" 3 4 URL="$DLSF/$N/$N-$V.tar.bz2" 5 6 7 8 9 10 11 12 13 f_pre_configure () { # thanks to the gentoo team! f_patch "$PATCH_DIR/$N-$V-isatty.patch" -p1 f_appendenv CPPFLAGS "-D__GNUC__" } f_configure () { def_configure --disable-nls } B.13 fontconfig-2.4.2.fbuild Das Erzeugen der Dokumentation wird ausgeschaltet und ein Verzeichnis zum Auffinden weiterer Schriften (Fonts) wird hinzugefügt. 121 ANHANG B. LISTINGS – FBUILD Listing B.13: fontconfig-2.4.2.fbuild 1 2 3 N="fontconfig" V="2.4.2" URL="http://www.fontconfig.org/release/$N-$V.tar.gz" 4 5 6 7 8 9 f_configure () { def_configure \ --disable-docs \ --with-add-fonts=$BASE_NOARCH/share/fonts } B.14 freetype-2.2.1.fbuild Ein Pfad zum Finden der include-Dateien muss angegeben werden damit das Kompilieren unter allen Umständen funktioniert. Weiters wird mit Zeile 10 der sogenannte bytecode interpreter“ akti” viert. Diese Datei kommt vom Gentoo[6]-Team (Listing C.2 auf Seite 136). Listing B.14: freetype-2.2.1.fbuild 1 2 3 N="freetype" V="2.2.1" URL="http://savannah.nongnu.org/download/$N/$N-$V.tar.bz2" 4 5 6 7 8 9 10 11 f_setvars () { f_prependenv CPPFLAGS "-I$SRC_DIR/$DIR/include" f_prependenv CFLAGS "-I$SRC_DIR/$DIR/include" } f_pre_configure () { f_patch "$PATCH_DIR/freetype-2-enable_bci.patch" -p1 } B.15 gd-2.0.33.fbuild Listing B.15: gd-2.0.33.fbuild 1 2 3 N="gd" V="2.0.33" URL="http://www.boutell.com/gd/http/$N-$V.tar.gz" 122 ANHANG B. LISTINGS – FBUILD B.16 gettext-0.16.1.fbuild Dem configure -Programm werden unter anderem Optionen übergeben um die abhängigen Pakete zu finden. Beim Installieren muss die PATH -Variable geändert werden und anschließend – nach der Installation – muss noch eine Verknüpfung erstellt werden. Listing B.16: gettext-0.16.1.fbuild 1 2 3 N="gettext" V="0.16.1" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 f_configure () { def_configure \ --disable-libasprintf \ --with-libexpat-prefix="$BASE" \ --with-libiconv-prefix="$BASE" \ --with-libintl-prefix="$BASE" \ --with-included-gettext } f_makeinstall () { PATH="/bin:/usr/bin:$PATH" def_makeinstall } f_post_makeinstall () { ln -s share/man "$PREFIX/man" } B.17 glib-2.12.4.fbuild In Zeile 6 wird ein Problem mit Autoconf beseitigt (Listing C.3 auf Seite 137). Zeile 10 schaltet auf das GNU-libiconv-Paket um, und Zeile 11 schaltet das Generieren der Dokumentation aus. Listing B.17: glib-2.12.4.fbuild 1 2 3 N="glib" V="2.12.4" URL="$DLGNOME/$N/2.12/$N-$V.tar.bz2" 4 5 6 7 8 9 10 11 12 f_pre_configure () { f_patch "$PATCH_DIR/$N-$V-timer.diff" -p0 } f_configure () { def_configure \ --with-libiconv=gnu \ --disable-gtk-doc } 123 ANHANG B. LISTINGS – FBUILD B.18 grep-2.5.1a.fbuild Grep, kompiliert mit dem fbuild-System, benötigt die intl -Bibliothek, welche in Zeile 6 eingebunden wird. Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 9 ausgeschaltet. Listing B.18: grep-2.5.1a.fbuild 1 2 3 N="grep" V="2.5.1a" URL="http://ftp.gnu.org/pub/gnu/grep/$N-$V.tar.bz2" 4 5 6 7 8 9 10 f_pre_configure () { f_prependenv LIBS ’-lintl’ } f_configure () { def_configure --disable-nls } B.19 indent-2.2.9.fbuild Zwei Verbesserungen (Listing C.5 auf Seite 139 und Listing C.4 auf Seite 137) des Gentoo[6]-Teams werden hinzugefügt und die Sprachenunterstützung (Native Language Support, NLS) wird ausgeschaltet. Listing B.19: indent-2.2.9.fbuild 1 2 3 4 5 N="indent" V="2.2.9" ID="${N}_$V." DIR="${N}-$V" URL="http://mysite.wanadoo-members.co.uk/indent/${N}_$V.tar.gz" 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 f_pre_configure () { # the following two patches are from gentoo -- good work! f_patch "$PATCH_DIR/$N-$V-malloc.patch" -p1 f_patch "$PATCH_DIR/$N-$V-deb-gentoo.patch" -p1 } f_configure () { def_configure --disable-nls } f_make () { def_make -C "$BUILD_DIR/$DIR/man" texinfo2man def_make } f_post_makeinstall () { rm -f "$PREFIX/bin/texinfo2man" } 124 ANHANG B. LISTINGS – FBUILD B.20 jpeg-6b-r4.fbuild Zwei Verbesserungen (Listing C.6 auf Seite 140 und Listing C.7 auf Seite 140) des Gentoo[6]- und FreeBSD[5]-Teams werden hinzugefügt. Diverse Verzeichnisse werden erstellt damit die Installation ohne Fehler beendet wird. Listing B.20: jpeg-6b-r4.fbuild 1 2 3 4 5 6 N="jpeg" V="6b" REV="4" ID="${N}src.v${V}." DIR="$N-$V" URL="http://www.ijg.org/files/${N}src.v${V}.tar.gz" 7 8 9 10 11 12 13 14 15 16 17 18 f_pre_configure () { cp -f "$BASEOPT"/automake/default/share/automake*/config.sub . \ && f_patch "$PATCH_DIR/$N-$V-freebsd.patch" -p0 \ && f_patch "$PATCH_DIR/$N-$V-gentoo.patch" -p1 } f_pre_makeinstall () { mkdir -p "$PREFIX/include" \ && mkdir -p "$PREFIX/lib" \ && mkdir -p "$PREFIX/bin" \ && mkdir -p "$PREFIX/man/man1" } B.21 libart lgpl-2.3.17.fbuild Listing B.21: libart lgpl-2.3.17.fbuild 1 2 3 N="libart_lgpl" V="2.3.17" URL="$DLGNOME/$N/2.3/$N-$V.tar.bz2" B.22 libdnet-1.10.fbuild Eine Verbesserung (Listing C.8 auf Seite 141) des Gentoo[6]-Teams wird hinzugefügt und bei der Konfiguration wird die Python-Unterstützung abgeschaltet. Listing B.22: libdnet-1.10.fbuild 1 2 3 N="libdnet" V="1.10" URL="$DLSF/$N/$N-$V.tar.gz" 4 125 ANHANG B. LISTINGS – FBUILD 5 6 7 8 9 10 11 f_pre_configure () { # thanks to gentoo team f_patch "$PATCH_DIR/$N-1.10-gcc4.diff" -p1 } f_configure () { def_configure --without-python } B.23 libiconv-1.11.fbuild Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 6 ausgeschaltet und alle sog. encodings“ werden aktiviert (Zeile 7). ” Der Pfad muss für die Installation erweitert werden, und nach der Installation wird eine Verknüpfung erstellt damit fbuild.sh die entsprechenden Dateien findet. Listing B.23: libiconv-1.11.fbuild 1 2 3 N="libiconv" V="1.11" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 14 f_configure () { def_configure --disable-nls \ --enable-extra-encodings } f_makeinstall () { PATH="/bin:/usr/bin:$PATH" def_makeinstall } f_post_makeinstall () { ln -s share/man "$PREFIX/man" } B.24 libpcap-0.9.5.fbuild Auch hier müssen einige Dinge gemacht werden um eine korrekte Konfiguration, Kompilation und Installation zu gewährleisten. Listing B.24: libpcap-0.9.5.fbuild 1 2 3 N="libpcap" V="0.9.5" URL="http://www.tcpdump.org/release/$N-$V.tar.gz" 4 5 6 7 8 f_setvars () { f_prependenv CPPFLAGS "-I./ -I\"$SRC_DIR/$DIR\"" f_prependenv CFLAGS "-I./ -I\"$SRC_DIR/$DIR\"" } 126 ANHANG B. LISTINGS – FBUILD 9 10 11 12 13 14 15 16 17 18 19 20 21 22 f_pre_configure () { f_patch "$PATCH_DIR/$N-0.8.1-fPIC.patch" -p0 } f_configure () { def_configure --enable-ipv6 } f_post_make () { "$CC" -Wl,-soname,$N.so.0 -shared -fPIC -o "$N.so.0.9" *.o } f_post_makeinstall () { cp -p "$N.so.0.9" "$PREFIX/lib" ln -s "$N.so.0.9" "$PREFIX/lib/$N.so.0" ln -s "$N.so.0" "$PREFIX/lib/$N.so" } B.25 libpng-1.2.14.fbuild Die Prozesse zum Kompilieren dürfen nicht parallel ausgeführt werden (Zeile 5). Weiters wird eine Verknüpfung angelegt damit fbuild.sh alle Dateien findet. Listing B.25: libpng-1.2.14.fbuild 1 2 3 N="libpng" V="1.2.14" URL="$DLSF/$N/$N-$V.tar.bz2" 4 5 USE_MAKETHREADS=no 6 7 8 9 f_post_makeinstall () { ln -s share/man "$PREFIX/man" } B.26 libtool-1.5.22.fbuild Listing B.26: libtool-1.5.22.fbuild 1 2 3 N="libtool" V="1.5.22" URL="$DLGNU/$N/$N-$V.tar.gz" 127 ANHANG B. LISTINGS – FBUILD B.27 m4-1.4.8.fbuild Eine Erweiterung wird aktiviert und Verknüpfungen werden erstellt. Listing B.27: m4-1.4.8.fbuild 1 2 3 N="m4" V="1.4.8" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 f_configure () { def_configure \ --enable-changeword } f_post_makeinstall () { ln -s m4 "$PREFIX/bin/gm4" \ && ln -s share/man "$PREFIX/man" \ && ln -s share/info "$PREFIX/info" } B.28 mysql-5.0.27.fbuild Eine Verbesserung (Listing C.10 auf Seite 142) wird hinzugefügt um das Kompilieren unter Solaris zu ermöglichen. Weiters werden bei der Konfiguration einige Optionen übergeben um diverse Erweiterungen ein- bzw. auzzuschalten. Nach der Installation werden Verknüpfungen zu den Bibliotheken erzeugt, da sich diese in einem Unterverzeichnis befinden. Listing B.28: mysql-5.0.27.fbuild 1 2 3 N="mysql" V="5.0.27" URL="http://mirror.switch.ch/ftp/mirror/mysql/Downloads/MySQL-5.0/mysql-5.0.27.tar.gz" 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 f_pre_configure () { f_patch "$PATCH_DIR/$N-$V.nww.patch" -p1 } f_configure () { def_configure \ --enable-thread-safe-client \ --enable-assembler \ --enable-local-infile \ --with-charset=utf8 \ --with-extra-charsets=all \ --with-pthread \ --with-zlib-dir="$BASE" \ --without-debug \ --with-openssl="$BASE" \ --with-libedit=no \ 128 ANHANG B. LISTINGS – FBUILD --with-big-tables \ --without-berkeley-db \ --with-archive-storage-engine \ --with-csv-storage-engine \ --with-blackhole-storage-engine \ --with-federated-storage-engine 20 21 22 23 24 25 26 27 28 29 30 } f_post_makeinstall () { cd "$PREFIX/lib" ln -s mysql/lib*.so* . } B.29 ncurses-5.5-20060603.fbuild Bei diesem Paket muss einiges unternommen werden damit es korrekt konfiguriert, kompiliert und installiert wird. Besonders das Einspielen der Verbesserungen ist recht aufwändig. Listing B.29: ncurses-5.5-20060603.fbuild 1 2 3 4 5 6 7 8 9 10 #w=w # uncomment for wide version n=ncurses # name v=5.5 # major version p=-20060603 # patchlevel N="$n$w" V="$v$p" ID="$n-$v." DIR="$n-$v" URL="ftp://invisible-island.net/$n/$n-$v.tar.gz" USE_MAKETHREADS=no 11 12 13 14 15 16 17 18 19 20 21 22 f_pre_configure () { LD=gcc export LD for i in 20060128-patch.sh.bz2 \ 20060204.patch.gz 20060211.patch.gz 20060225.patch.gz 20060311.patch.gz 20060318.patch.gz 20060401.patch.gz 20060415.patch.gz 20060416.patch.gz 20060506.patch.gz 20060513.patch.gz 20060527.patch.gz 20060603.patch.gz do 23 24 25 26 27 28 29 30 31 done 20060218.patch.gz 20060312.patch.gz 20060408.patch.gz 20060422.patch.gz 20060520.patch.gz test -f "$DL_DIR/$n-$v-$i" || f_download \ "ftp://invisible-island.net/$n/$v/$n-$v-$i" f_patch "$DL_DIR/$n-$v-$i" -p1 \ || { f_echo "failed to patch"; false; } } f_configure () { test "x$w" = ’xw’ && ENABLE_WIDEC=’--enable-widec’ "$SRC_DIR/$DIR/configure" --prefix="$PREFIX" \ 129 \ \ \ \ \ ANHANG B. LISTINGS – FBUILD --with-shared --without-normal \ --without-debug --without-profile \ --without-ada \ --without-gpm \ --without-xterm-new \ --disable-termcap \ --enable-symlinks \ --enable-bsdpad \ $ENABLE_WIDEC 32 33 34 35 36 37 38 39 40 41 42 43 44 45 } f_makeinstall () { LD_LIBRARY_PATH="$PREFIX/lib:$LD_LIBRARY_PATH" def_makeinstall \ LD_LIBRARY_PATH="$PREFIX/lib:$LD_LIBRARY_PATH" } B.30 net-snmp-5.1.3.1.fbuild Auch dieses Paket darf nicht von mehreren Prozessen parallel kompiliert werden. Bei einigen Optionen muss das Basisverzeichnis übergeben werden. Listing B.30: net-snmp-5.1.3.1.fbuild 1 2 3 N="net-snmp" V="5.1.3.1" URL="$DLSF/$N/$N-$V.tar.gz" 4 5 USE_MAKETHREADS="no" 6 7 8 9 10 11 12 13 14 f_configure () { def_configure \ --without-rpm \ --with-defaults \ --with-openssl="$BASE" \ --with-zlib="$BASE" \ --with-bzip2="$BASE" } B.31 openssl-0.9.8d.fbuild OpenSSL besitzt kein standard autoconf -configure -Programm. Deshalb sind die Parameter des Programs etwas anders anzugeben. Weiters wurde darauf geachtet, dass OpenSSL mit dem Paket Perl und auch mit Microperl kompiliert werden kann. Letzteres ist recht kompliziert, da einige Dinge im Quellcode geändert werden müssen. 130 ANHANG B. LISTINGS – FBUILD Listing B.31: openssl-0.9.8d.fbuild 1 2 3 N="openssl" V="0.9.8d" URL="ftp://ftp.openssl.org/source/$N-$V.tar.gz" 4 5 6 7 8 9 f_setvars () { thisPERL=‘f_which perl‘ || thisPERL=‘f_which microperl‘ if test "x$thisPERL" = ’x’ && test "x$thisPERL" = ’x’; then f_echo "cannot find perl or microperl, neither you’ve set PERL" exit 1 fi 10 11 12 then f_setifenv PERL "$thisPERL" if test "x‘uname -s‘" = ’xSunOS’ && test "x‘uname -p‘" = ’xsparc’; 13 14 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 fi f_appendenv OPTIMIZE ’-mcpu=v9’ f_appendenv CFLAGS ’-mcpu=v9’ } f_pre_configure () { if test "x$PERL" = "x‘f_which microperl‘"; then f_sed -i -e ’s/use strict;/#use strict;/’ "$SRC_DIR/$DIR/Configure" f_sed -i -e ’s/use integer;/#use integer;/’ "$SRC_DIR/$DIR/crypto/objects/obj_dat.pl" f_sed -i -e ’s/use Getopt::Long;/#use Getopt::Long;/’ "$SRC_DIR/$DIR/util/pod2man.pl" fi } f_configure () { # a big "thank you" to the gentoo team to the parallel build patch!!! f_patch "$PATCH_DIR/$N-0.9.8b-parallel-build.patch" -p1 PERL="$PERL" \ "$SRC_DIR/$DIR/config" --prefix="$PREFIX" shared zlib \ -DDEVRANDOM_EGD=NULL } f_post_configure () { if test "x$PERL" = "x‘f_which microperl‘"; then f_sed -i -e "s/\$(PERL)/$sedPERL/" "$SRC_DIR/$DIR/Makefile" f_sed -i -e "s/\$(PERL)/$sedPERL/" "$SRC_DIR/$DIR/tools/Makefile" fi f_sed -i -e "s/ -mcpu=[^ ]* / /" \ -e "s/ -fomit-frame-pointer / /" \ -e "s/ -O[^ ]* / $OPTIMIZE /" \ "$SRC_DIR/$DIR/Makefile" 40 41 42 43 44 f_sed -i -e "s/^CC=.*/CC=$CC/" \ -e "s/^\(CFLAGS=.*\)/\\1 $sedCFLAGS -L.. $sedLDFLAGS/" \ -e "s/^LDFLAGS=.*/LDFLAGS=$sedLDFLAGS/" \ -e "s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=-shared $sedLDFLAGS/" \ 131 ANHANG B. LISTINGS – FBUILD 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 "$SRC_DIR/$DIR/Makefile.shared" } f_make () { $MAKE $MAKEFLAGS $MAKETHREADS \ PERL="$PERL" } f_pre_makeinstall () { if test "x$PERL" = "x‘f_which microperl‘"; then mkdir -p "$PREFIX/ssl/man/man1" mkdir -p "$PREFIX/ssl/man/man3" mkdir -p "$PREFIX/ssl/man/man5" mkdir -p "$PREFIX/ssl/man/man7" mkdir -p "$PREFIX/bin" mkdir -p "$PREFIX/lib/engines" mkdir -p "$PREFIX/lib/pkgconfig" mkdir -p "$PREFIX/include/openssl" mkdir -p "$PREFIX/ssl/misc" mkdir -p "$PREFIX/ssl/certs" mkdir -p "$PREFIX/ssl/private" fi 64 65 66 67 68 69 70 } f_post_makeinstall () { cd "$PREFIX" ln -s libssl.so.0.9.8 "$PREFIX/lib/libssl.so.0" ln -s libcrypto.so.0.9.8 "$PREFIX/lib/libcrypto.so.0" } B.32 pcre-6.7.fbuild pcre ist deshalb etwas heikler zu kompilieren da die Bibliothek dieses Paketes vom Programm grep verwendet wird, welches wiederum von fbuild.sh verwendet wird. In den Zeilen 9 bis 11 wird dieser Umstand berücksichtigt, indem temporär eine Kopie der Bibliothek angelegt wird. Die Optionen --enable-utf8 und --enable-unicode-properties aktivieren die Unicode[56] Unterstützung von pcre . Listing B.32: pcre-6.7.fbuild 1 2 3 N="pcre" V="6.7" URL="ftp://ftp.csx.cam.ac.uk/pub/software/programming/$N/$N-$V.tar.bz2" 4 5 6 7 8 9 10 11 12 13 f_pre_configure () { f_echo "WARNING: grep usually needs libpcre.so.0" f_echo " copying libpcre.so* and setting" f_echo " LD_LIBRARY_PATH!!!" cp "$LINKLIB/libpcre.so"* . LD_LIBRARY_PATH=".:$BUILD_DIR/DIR:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH } f_configure () { 132 ANHANG B. LISTINGS – FBUILD def_configure \ --enable-utf8 \ --enable-unicode-properties 14 15 16 17 } B.33 pkgconfig-0.19.fbuild Der Name des Paketes wurde von pkgconfig auf pkg-config geändert. Aus dem Grund sind die optionalen Variablen ID und DIR angegeben. Bei configure wird die Option --enable-indirect-maps angegeben damit immer alle Abhängigkeiten angezeigt werden. Nach dem Aufruf von make install (f post makeinstall()) wird das Verzeichnis $PREFIX/lib/pkgconfig angelegt. Darin wird fbuild.sh von nun an alle Verknüpfungen zu pkgconfig -Dateien (lib/pkgconfig/*.pc) anlegen. Dieses Programm wird beim Konfigurieren von einigen Quellcodepaketen verwendet. Diverse Programme speichern ihre Kompilier-Konfigurationsdateien in einem speziellen Format ab um anderen Programmen und Bibliotheken über diese pkgconfig -Schnittstelle die Optionen zum Kompilieren mitzuteilen. Listing B.33: pkgconfig-0.19.fbuild 1 2 3 4 5 N="pkgconfig" V="0.19" ID="pkg-config-$V." DIR="pkg-config-$V" URL="$DLGNOME/pkg-config/0.19/pkg-config-$V.tar.bz2" 6 7 8 9 10 11 12 f_configure () { def_configure --enable-indirect-deps } f_post_makeinstall () { mkdir -p "$PREFIX/lib/pkgconfig" } B.34 readline-5.2.fbuild Ein Teil des Quellcodes wird geändert damit beim Kompilieren die richtigen Optionen dem Compiler übergeben werden (Zeile 6). In Zeile 10 wird die Unterstützung für Unicode[56]-Zeichen eingeschaltet. 133 ANHANG B. LISTINGS – FBUILD Listing B.34: readline-5.2.fbuild 1 2 3 N="readline" V="5.2" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 f_pre_configure () { sed -i -e "s/-shared -Wl,-i /-shared /" support/shobj-conf } f_configure () { def_configure \ --enable-multibyte \ --with-curses } B.35 rrdtool-1.2.15.fbuild Einige Optionen werden aktiviert – andere werden ausgeschaltet. Listing B.35: rrdtool-1.2.15.fbuild 1 2 3 N="rrdtool" V="1.2.15" URL="http://oss.oetiker.ch/rrdtool/pub/$N-$V.tar.gz" 4 5 6 7 8 9 10 11 12 13 f_configure () { def_configure \ --enable-local-libpng \ --enable-local-zlib \ --disable-rrdcgi \ --disable-perl \ --disable-tcl \ --disable-python } B.36 sed-4.1.5.fbuild Die Sprachenunterstützung (Native Language Support, NLS) wird in Zeile 6 ausgeschaltet. Listing B.36: sed-4.1.5.fbuild 1 2 3 N="sed" V="4.1.5" URL="$DLGNU/$N/$N-$V.tar.gz" 4 5 6 7 f_configure () { def_configure --disable-nls } 134 ANHANG B. LISTINGS – FBUILD B.37 zlib-1.2.3-r1.fbuild Das Zlib -Paket verwendet kein autoconf configure -Programm. Aus diesem Grund müssen 2 Umgebungsvariablen (zurück)gesetzt werden wie in den Zeilen 7 und 8 ersichtlich ist. Damit die Optimierungsoptionen richtig übergeben werden wird in Zeile 16 das Makefile im Quellcode geändert. Schließlich wird eine Verknüpfung erstellt damit fbuild.sh alle Dateien findet. Listing B.37: zlib-1.2.3-r1.fbuild 1 2 3 4 N="zlib" V="1.2.3" REV="1" URL="http://www.zlib.net/$N-$V.tar.gz" 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 f_setvars () { f_appendenv LDSHARED "$CC -shared -Wl,-soname,libz.so.1 $LDFLAGS" f_unsetenv CFLAGS } f_configure () { "$SRC_DIR/$DIR/configure" \ --prefix="$PREFIX" \ --shared } f_post_configure () { f_sed -i -e "s/ -O[0-9] / $sedOPTIMIZE /" "$SRC_DIR/$DIR/Makefile" } f_post_makeinstall () { ln -s share/man "$PREFIX/man" } 135 136 Anhang C Listings – patches C.1 flex-2.5.33-isatty.patch Eine Verbesserung des flex-Quellcodes durch das Gentoo[6]-Team. Listing C.1: flex-2.5.33-isatty.patch 1 2 Declare the isatty prototype all the time ... otherwise packages like doxygen and ttmkfdir fail to build. 3 4 http://bugs.gentoo.org/119598 5 6 7 8 --- flex/scan.c +++ flex/scan.c @@ -4179,9 +4179,19 @@ 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #ifndef YY_ALWAYS_INTERACTIVE #ifndef YY_NEVER_INTERACTIVE +#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ -#ifndef __cplusplus +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __THROW /* this is a gnuism */ +extern int isatty YY_PARAMS(( int )) __THROW; +#else extern int isatty YY_PARAMS(( int )); +#endif -#endif /* __cplusplus */ +#ifdef __cplusplus +} +#endif +#endif #endif /* !YY_NEVER_INTERACTIVE */ #endif /* !YY_ALWAYS_INTERACTIVE */ 29 30 --- flex/skel.c 137 ANHANG C. LISTINGS – PATCHES 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 +++ flex/skel.c @@ -2183,9 +2183,19 @@ "[[", " m4_ifdef( [[M4_YY_NEVER_INTERACTIVE]],,", " [[", + "#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */", - "#ifndef __cplusplus", + "#ifdef __cplusplus", + "extern \"C\" {", + "#endif", + "#ifdef __THROW /* this is a gnuism */", + "extern int isatty M4_YY_PARAMS( int ) __THROW;", + "#else", "extern int isatty M4_YY_PARAMS( int );", + "#endif", - "#endif /* __cplusplus */", + "#ifdef __cplusplus", + "}", + "#endif", + "#endif", " ]])", "]])", "%endif", C.2 freetype-2-enable bci.patch Eine Verbesserung des freetype-Quellcodes durch das Gentoo[6]-Team. Im Speziellen wird der bytecode interpreter“ aktiviert, mit dessen Hilfe ” das sogenannte hinting“ ermöglicht wird, was zu einer besseren Darstellung ” gewisser Schriftarten führen kann. Listing C.2: freetype-2-enable bci.patch 1 2 3 4 5 6 7 8 9 diff -uNr freetype-2.2.1/include/freetype/config/ftoption.h freetype-2.2.1.patched/include/freetype/config/ftoption.h --- freetype-2.2.1/include/freetype/config/ftoption.h 2006-05-11 20:05:49.000000000 +0200 +++ freetype-2.2.1.patched/include/freetype/config/ftoption.h 2006-06-19 18:24:08.000000000 +0200 @@ -436,7 +436,7 @@ /* Do not #undef this macro here, since the build system might */ /* define it for certain configurations only. */ /* */ -/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER 10 11 138 ANHANG C. LISTINGS – PATCHES 12 /*************************************************************************/ C.3 glib-2.12.4-timer.diff Eine Verbesserung des glib-Quellcodes. Listing C.3: glib-2.12.4-timer.diff 1 2 3 --- glib/gtimer.orig Mon Oct 2 17:53:45 2006 +++ glib/gtimer.c Mon Oct 2 17:58:35 2006 @@ -257,7 +257,7 @@ g_timer_elapsed (GTimer *timer, 4 5 6 7 8 9 10 if (microseconds) *microseconds = (elapsed / 10) % 1000000; -#elif HAVE_CLOCK_GETTIME +#elif USE_CLOCK_GETTIME if (timer->active) GETTIME (timer->end); C.4 indent-2.2.9-deb-gentoo.patch Eine Verbesserung des indent-Quellcodes durch das Gentoo[6]-Team. Listing C.4: indent-2.2.9-deb-gentoo.patch 1 This patch is mostly from the debian indent_2.2.9-6.diff. 2 3 4 Also added a patch to check usage of ‘texinfo2man‘. http://bugs.gentoo.org/show_bug.cgi?id=71690 5 6 7 8 9 10 11 12 --- indent-2.2.9.orig/man/texinfo2man.c +++ indent-2.2.9/man/texinfo2man.c @@ -2,6 +2,7 @@ #include <malloc.h> #include <string.h> #include <ctype.h> +#include <stdlib.h> 13 14 15 16 /* texinfo2man. * Convert a texinfo document to man format. @@ -162,7 +163,7 @@ 17 18 static char value_updated[64], value_edition[64], value_version[64]; 19 20 21 22 23 24 -process_texi (FILE * in) +void process_texi (FILE * in) { char buf[1024]; int in_block = 0; 139 ANHANG C. LISTINGS – PATCHES 25 26 27 @@ -252,6 +254,12 @@ char buf[1024]; int line_no = 0; 28 29 30 31 32 33 34 35 + if (argc != 3) { + fprintf(stderr, "Usage: %s <man template> <info file>\n", argv[0]); + fprintf(stderr, " The man page will be written to stdout.\n"); + return -1; + } + texinfoname = argv[2]; 36 37 38 39 40 in = fopen (argv[2], "r"); --- indent-2.2.9.orig/src/output.c +++ indent-2.2.9/src/output.c @@ -13,8 +13,10 @@ 41 42 43 44 45 46 47 #include #include +#include #include #include +#include <stdio.h> <sys/types.h> <time.h> <utime.h> <sys/stat.h> <stdlib.h> 48 49 50 51 52 53 #include "indent.h" #include "sys.h" @@ -1206,7 +1208,7 @@ } } 54 55 56 57 58 59 60 61 62 63 64 -extern inhibit_indenting( +extern void inhibit_indenting( BOOLEAN flag) { inhibited = flag; --- indent-2.2.9.orig/src/indent.h +++ indent-2.2.9/src/indent.h @@ -96,8 +96,6 @@ /* Size of the input program, not including the ’ \n\0’ we add at the end */ extern unsigned long in_prog_size; 65 66 67 -/* The output file. */ -extern FILE *output; 68 69 70 71 72 73 --- indent-2.2.9.orig/src/indent.c +++ indent-2.2.9/src/indent.c @@ -875,6 +875,7 @@ * imply we are in a stmt 74 */ 140 ANHANG C. LISTINGS – PATCHES 75 76 77 + 78 79 for (t_ptr = s_code; *t_ptr; ++t_ptr) { check_lab_size(); *e_lab++ = *t_ptr; /* turn everything so far into a label */ } 80 81 82 83 @@ -3062,8 +3063,8 @@ BOOLEAN using_stdin = false; exit_values_ty exit_status; 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 -#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) setlocale (LC_MESSAGES, ""); +#if defined (HAVE_SETLOCALE) + setlocale (LC_ALL, ""); #endif bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); --- indent-2.2.9.orig/src/comments.c +++ indent-2.2.9/src/comments.c @@ -20,6 +20,7 @@ #include "comments.h" #include "globs.h" #include "parse.h" +#include "output.h" 99 100 RCSTAG_CC ("$Id: 2.2.9-deb-gentoo.patch,v 1.2 2005/01/04 08:23:53 vapier Exp $"); 101 102 103 104 105 106 --- indent-2.2.9.orig/src/output.h +++ indent-2.2.9/src/output.h @@ -47,7 +47,7 @@ struct stat * file_stats, const char * filename); 107 108 109 110 -extern inhibit_indenting( +extern void inhibit_indenting( BOOLEAN flag); C.5 indent-2.2.9-malloc.patch Eine weitere Verbesserung des indent-Quellcodes durch das Gentoo[6]-Team. Listing C.5: indent-2.2.9-malloc.patch 1 2 3 4 5 6 diff -ur indent-2.2.9/man/texinfo2man.c indent-2.2.9-freebsd/man/texinfo2man.c --- indent-2.2.9/man/texinfo2man.c 2002-01-17 20:28:51.000000000 +0100 +++ indent-2.2.9-freebsd/man/texinfo2man.c 2005-07-30 11:13:26.616498832 +0200 @@ -1,5 +1,5 @@ #include <stdio.h> -#include <malloc.h> 141 ANHANG C. LISTINGS – PATCHES 7 8 9 +#include <stdlib.h> #include <string.h> #include <ctype.h> C.6 jpeg-6b-freebsd.patch Eine Verbesserung des jpeg-Quellcodes durch das FreeBSD[5]-Team. Listing C.6: jpeg-6b-freebsd.patch 1 2 3 4 5 6 7 8 9 10 --- configure.orig Sat Mar 21 14:08:57 1998 +++ configure Mon Aug 4 21:49:44 2003 @@ -1559,7 +1559,8 @@ if test "x$LTSTATIC" = xno; then disable_static="--disable-static" fi - $srcdir/ltconfig $disable_shared $disable_static $srcdir/ltmain.sh + pic_flag="-fPIC" + $ac_aux_dir/ltconfig $disable_shared $disable_static $ac_aux_dir/ltmain.sh fi 11 12 # Select memory manager depending on user input. C.7 jpeg-6b-gentoo.patch Eine Verbesserung des jpeg-Quellcodes durch das Gentoo[6]-Team. Listing C.7: jpeg-6b-gentoo.patch 1 2 3 4 diff -Naur jpeg-6b.orig/configure jpeg-6b/configure --- jpeg-6b.orig/configure 2005-01-04 15:34:08.000000000 +0100 +++ jpeg-6b/configure 2005-01-04 15:39:10.620128760 +0100 @@ -1529,7 +1529,7 @@ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 if test "x$LTSHARED" != xno -o "x$LTSTATIC" != xno; then USELIBTOOL="yes" - LIBTOOL="./libtool" + LIBTOOL="libtool" O="lo" A="la" LN=’$(LIBTOOL) --mode=link $(CC)’ diff -Naur jpeg-6b.orig/ltconfig jpeg-6b/ltconfig --- jpeg-6b.orig/ltconfig 2005-01-04 15:41:06.025584464 +0100 +++ jpeg-6b/ltconfig 2005-01-04 15:34:08.315086112 +0100 @@ -553,7 +553,7 @@ # On HP-UX, both CC and GCC only warn that PIC is supported... then they # create non-PIC objects. So, if there were any warnings, we assume that 142 ANHANG C. LISTINGS – PATCHES 19 20 21 22 23 24 + # PIC is not supported. if test -s conftest.err; then if test -s conftest.err -a $pic_flag -eq ’+Z’; then echo "$ac_t"no 1>&6 can_build_shared=no pic_flag= C.8 libdnet-1.10-gcc4.diff Eine Verbesserung des libdnet-Quellcodes durch das Gentoo[6]-Team. Listing C.8: libdnet-1.10-gcc4.diff 1 2 3 4 5 6 7 8 9 diff --exclude=’*~’ --exclude=’.*’ -I ’$Id:’ -urN libdnet-1.10.orig/python/dnet.c libdnet-1.10/python/dnet.c --- libdnet-1.10.orig/python/dnet.c 2005-05-16 14:47:35.000000000 -0400 +++ libdnet-1.10/python/dnet.c 2005-05-16 14:52:54.000000000 -0400 @@ -2552,7 +2552,7 @@ PyObject *__pyx_3 = 0; unsigned short __pyx_4; Py_INCREF(__pyx_v_self); - ((PyObject*)__pyx_v_next) = Py_None; Py_INCREF(((PyObject*)__pyx_v_next)); + __pyx_v_next = Py_None; Py_INCREF(((PyObject*)__pyx_v_next)); 10 11 12 13 14 15 16 17 18 19 /* "/misc/projects/libdnet/python/./dnet.pyx":628 */ __pyx_1 = (((struct __pyx_obj_4dnet___addr_ip4_iter *)__pyx_v_self)->cur <= ((struct __pyx_obj_4dnet___addr_ip4_iter *)__pyx_v_self)->max); @@ -2564,7 +2564,7 @@ Py_DECREF(__pyx_2); __pyx_2 = 0; if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_4dnet_addr)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 629; goto __pyx_L1;} Py_DECREF(((PyObject *)__pyx_v_next)); ((PyObject *)__pyx_v_next) = __pyx_3; + __pyx_v_next = __pyx_3; __pyx_3 = 0; 20 21 /* "/misc/projects/libdnet/python/./dnet.pyx":630 */ C.9 libpcap-0.8.1-fPIC.patch Eine Verbesserung des libpcap-Quellcodes durch das Gentoo[6]-Team. Listing C.9: libpcap-0.8.1-fPIC.patch 1 2 3 4 --- Makefile.in 2004-01-03 12:51:50.914715352 +0000 +++ Makefile.in 2004-01-03 13:04:17.524952464 +0000 @@ -48,7 +48,7 @@ LIBS = @V_LIBS@ 5 143 ANHANG C. LISTINGS – PATCHES 6 7 8 # Standard CFLAGS -CFLAGS = $(CCOPT) $(INCLS) $(DEFS) +CFLAGS = $(CCOPT) $(INCLS) $(DEFS) -fPIC 9 10 11 INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ C.10 mysql-5.0.27.nww.patch Eine Verbesserung des MySQL-Quellcodes durch den Autor. Listing C.10: mysql-5.0.27.nww.patch 1 2 3 4 5 diff -u -r mysql-5.0.27.orig/include/my_global.h mysql-5.0.27/include/my_global.h --- mysql-5.0.27.orig/include/my_global.h 2006-10-21 02:22:53.000000000 +0200 +++ mysql-5.0.27/include/my_global.h 2006-12-17 20:12:01.000000000 +0100 @@ -275,6 +275,12 @@ #endif 6 7 8 9 10 11 12 13 14 15 16 #include <math.h> +#ifdef HAVE_IEEEFP_H +#include <ieeefp.h> +#if __sun__ +#define isinf(x) (fpclass(x) == FP_NINF || fpclass(x) == FP_PINF) +#endif /* __sun__ */ +#endif /* HAVE_IEEEFP_H */ #ifdef HAVE_LIMITS_H #include <limits.h> #endif C.11 openssl-0.9.8b-parallel-build.patch Eine Verbesserung des OpenSSL-Quellcodes durch das Gentoo[6]-Team. Listing C.11: openssl-0.9.8b-parallel-build.patch 1 2 3 --- openssl-0.9.8b/Makefile.org +++ openssl-0.9.8b/Makefile.org @@ -229,15 +229,15 @@ 4 5 6 7 8 9 10 11 12 build_crypto: @dir=crypto; target=all; $(BUILD_ONE_CMD) -build_ssl: +build_ssl: build_crypto @dir=ssl; target=all; $(BUILD_ONE_CMD) -build_engines: +build_engines: build_crypto @dir=engines; target=all; $(BUILD_ONE_CMD) 144 ANHANG C. LISTINGS – PATCHES 13 14 15 16 17 18 19 20 21 -build_apps: +build_apps: build_libs @dir=apps; target=all; $(BUILD_ONE_CMD) -build_tests: +build_tests: build_libs @dir=test; target=all; $(BUILD_ONE_CMD) -build_tools: +build_tools: build_libs @dir=tools; target=all; $(BUILD_ONE_CMD) 22 23 all_testapps: build_libs build_testapps 145 146 Appendix D GNU Free Documentation License Copyright Version 1.2, November 2002 2000,2001,2002 Free Software Foundation, Inc. © 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The purpose of this License is to make a manual, textbook, or other functional and useful document “free” in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 147 APPENDIX D. GNU FREE DOCUMENTATION LICENSE 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royaltyfree license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”. 148 APPENDIX D. GNU FREE DOCUMENTATION LICENSE Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text. A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 149 APPENDIX D. GNU FREE DOCUMENTATION LICENSE 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: 150 APPENDIX D. GNU FREE DOCUMENTATION LICENSE A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the sub151 APPENDIX D. GNU FREE DOCUMENTATION LICENSE stance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles. You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties–for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant 152 APPENDIX D. GNU FREE DOCUMENTATION LICENSE Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements”. 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 153 APPENDIX D. GNU FREE DOCUMENTATION LICENSE 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents 154 APPENDIX D. GNU FREE DOCUMENTATION LICENSE To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: © Copyright YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with. . . Texts.” line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. 155