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

Similar documents