Samba-Update auf neues Patchlevel. Jaja, die Sicherheitsluecken oder sowas...
[ipfire-2.x.git] / make.sh
1 #!/bin/bash
2 ############################################################################
3 #                                                                          #
4 # This file is part of the IPFire Firewall.                                #
5 #                                                                          #
6 # IPFire is free software; you can redistribute it and/or modify           #
7 # it under the terms of the GNU General Public License as published by     #
8 # the Free Software Foundation; either version 2 of the License, or        #
9 # (at your option) any later version.                                      #
10 #                                                                          #
11 # IPFire is distributed in the hope that it will be useful,                #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of           #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
14 # GNU General Public License for more details.                             #
15 #                                                                          #
16 # You should have received a copy of the GNU General Public License        #
17 # along with IPFire; if not, write to the Free Software                    #
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
19 #                                                                          #
20 # Copyright (C) 2006 IPFire-Team <info@ipfire.eu>.                         #
21 #                                                                          #
22 ############################################################################
23 #
24
25 NAME="IPFire"                           # Software name
26 SNAME="ipfire"                  # Short name
27 VERSION="2.0t4"                 # Version number
28 SLOGAN="www.ipfire.org"         # Software slogan
29 CONFIG_ROOT=/var/ipfire         # Configuration rootdir
30 NICE=10                         # Nice level
31 MAX_RETRIES=1                           # prefetch/check loop
32 KVER=`grep --max-count=1 VER lfs/linux | awk '{ print $3 }'`
33 MACHINE=`uname -m`
34 SVN_REVISION=`svn info | grep Revision | cut -c 11-`
35
36 IPFVER="full"                           # Which versions should be compiled? (full|light|devel)
37
38 # Set an information about the build number
39 if [ -e ./.svn ]; then
40         FIREBUILD=`cat .svn/entries |sed -n 's/^[ \t]*revision=\"// p' | sed -n 's/\".*$// p'`
41 fi
42
43 # Debian specific settings
44 if [ ! -e /etc/debian_version ]; then
45         FULLPATH=`which $0`
46 else
47         if [ -x /usr/bin/realpath ]; then
48                 FULLPATH=`/usr/bin/realpath $0`
49         else
50                 echo "ERROR: Need to do apt-get install realpath"
51                 exit 1
52         fi
53 fi
54
55 PWD=`pwd`
56 BASENAME=`basename $0`
57 BASEDIR=`echo $FULLPATH | sed "s/\/$BASENAME//g"`
58 LOGFILE=$BASEDIR/log/_build.preparation.log
59 export BASEDIR LOGFILE
60 DIR_CHK=$BASEDIR/cache/check
61 mkdir $BASEDIR/log/ 2>/dev/null
62
63 # Include funtions
64 . tools/make-functions
65
66 if [ -f .config ]; then
67         . .config
68 else
69         echo -e  "${BOLD}No configuration found!${NORMAL}"
70         echo -ne "Do you want to create one (y/N)?"
71         read CREATE_CONFIG
72         echo ""
73         if [ "$CREATE_CONFIG" == "y" ]; then
74                 make_config
75         fi
76 fi
77
78 prepareenv() {
79     ############################################################################
80     #                                                                          #
81     # Are we running the right shell?                                          #
82     #                                                                          #
83     ############################################################################
84     if [ ! "$BASH" ]; then
85         exiterror "BASH environment variable is not set.  You're probably running the wrong shell."
86     fi
87
88     if [ -z "${BASH_VERSION}" ]; then
89         exiterror "Not running BASH shell."
90     fi
91
92
93     ############################################################################
94     #                                                                          #
95     # Trap on emergency exit                                                   #
96     #                                                                          #
97     ############################################################################
98     trap "exiterror 'Build process interrupted'" SIGINT SIGTERM SIGKILL SIGSTOP SIGQUIT
99
100
101     ############################################################################
102     #                                                                          #
103     # Resetting our nice level                                                 #
104     #                                                                          #
105     ############################################################################
106     echo -ne "Resetting our nice level to $NICE" | tee -a $LOGFILE
107     renice $NICE $$ > /dev/null
108     if [ `nice` != "$NICE" ]; then
109         beautify message FAIL
110         exiterror "Failed to set correct nice level"
111     else
112         beautify message DONE
113     fi
114
115
116     ############################################################################
117     #                                                                          #
118     # Checking if running as root user                                         #
119     #                                                                          #
120     ############################################################################
121     echo -ne "Checking if we're running as root user" | tee -a $LOGFILE
122     if [ `id -u` != 0 ]; then
123         beautify message FAIL
124         exiterror "Not building as root"
125     else
126         beautify message DONE
127     fi
128
129
130     ############################################################################
131     #                                                                          #
132     # Checking for necessary temporary space                                   #
133     #                                                                          #
134     ############################################################################
135     echo -ne "Checking for necessary space on disk $BASE_DEV" | tee -a $LOGFILE
136     BASE_DEV=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $1 }'`
137     BASE_ASPACE=`df -P -k $BASEDIR | tail -n 1 | awk '{ print $4 }'`
138     if (( 2048000 > $BASE_ASPACE )); then
139         BASE_USPACE=`du -skx $BASEDIR | awk '{print $1}'`
140         if (( 2048000 - $BASE_USPACE > $BASE_ASPACE )); then
141                 beautify message FAIL
142                 exiterror "Not enough temporary space available, need at least 2GB on $BASE_DEV"
143         fi
144     else
145         beautify message DONE
146     fi
147
148     ############################################################################
149     #                                                                          #
150     # Building Linux From Scratch system                                       #
151     #                                                                          #
152     ############################################################################
153     # Set umask
154     umask 022
155
156     # Set LFS Directory
157     LFS=$BASEDIR/build
158
159     # Check /tools symlink
160     if [ -h /tools ]; then
161         rm -f /tools
162     fi
163     if [ ! -a /tools ]; then
164         ln -s $BASEDIR/build/tools /
165     fi
166     if [ ! -h /tools ]; then
167         exiterror "Could not create /tools symbolic link."
168     fi
169
170     # Setup environment
171     set +h
172     LC_ALL=POSIX
173     MAKETUNING="-j6"
174     export LFS LC_ALL CFLAGS CXXFLAGS MAKETUNING
175     unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
176
177     # Make some extra directories
178     mkdir -p $BASEDIR/build/{tools,etc,usr/src} 2>/dev/null
179     mkdir -p $BASEDIR/build/{dev/{shm,pts},proc,sys}
180     mkdir -p $BASEDIR/{cache,ccache} 2>/dev/null
181     mkdir -p $BASEDIR/build/usr/src/{cache,config,doc,html,langs,lfs,log,src,ccache}
182
183     mknod -m 600 $BASEDIR/build/dev/console c 5 1 2>/dev/null
184     mknod -m 666 $BASEDIR/build/dev/null c 1 3 2>/dev/null
185
186     # Make all sources and proc available under lfs build
187     mount --bind /dev            $BASEDIR/build/dev
188     mount --bind /dev/pts        $BASEDIR/build/dev/pts
189     mount --bind /dev/shm        $BASEDIR/build/dev/shm
190     mount --bind /proc           $BASEDIR/build/proc
191     mount --bind /sys            $BASEDIR/build/sys
192     mount --bind $BASEDIR/cache  $BASEDIR/build/usr/src/cache
193     mount --bind $BASEDIR/ccache $BASEDIR/build/usr/src/ccache
194     mount --bind $BASEDIR/config $BASEDIR/build/usr/src/config
195     mount --bind $BASEDIR/doc    $BASEDIR/build/usr/src/doc
196     mount --bind $BASEDIR/html   $BASEDIR/build/usr/src/html
197     mount --bind $BASEDIR/langs  $BASEDIR/build/usr/src/langs
198     mount --bind $BASEDIR/lfs    $BASEDIR/build/usr/src/lfs
199     mount --bind $BASEDIR/log    $BASEDIR/build/usr/src/log
200     mount --bind $BASEDIR/src    $BASEDIR/build/usr/src/src
201
202     # This is a temporary hack!!!
203     if [ ! -f /tools/bin/hostname ]; then
204       cp -f /bin/hostname /tools/bin/hostname 2>/dev/null
205     fi
206
207     # Run LFS static binary creation scripts one by one
208     export CCACHE_DIR=$BASEDIR/ccache
209     export CCACHE_HASHDIR=1
210
211     # Remove pre-install list of installed files in case user erase some files before rebuild
212     rm -f $BASEDIR/build/usr/src/lsalr 2>/dev/null
213 }
214
215 buildtoolchain() {
216     LOGFILE="$BASEDIR/log/_build.toolchain.log"
217     export LOGFILE
218     ORG_PATH=$PATH
219     NATIVEGCC=`gcc --version | grep GCC | awk {'print $3'}`
220     export NATIVEGCC GCCmajor=${NATIVEGCC:0:1} GCCminor=${NATIVEGCC:2:1} GCCrelease=${NATIVEGCC:4:1}
221     lfsmake1 ccache
222     lfsmake1 binutils   PASS=1
223     lfsmake1 gcc                PASS=1
224     export PATH=$BASEDIR/build/usr/local/bin:$BASEDIR/build/tools/bin:$PATH
225     lfsmake1 linux-libc-header
226     lfsmake1 glibc
227     lfsmake1 cleanup-toolchain PASS=1
228     lfsmake1 tcl
229     lfsmake1 expect
230     lfsmake1 dejagnu
231     lfsmake1 gcc                PASS=2
232     lfsmake1 binutils   PASS=2
233     lfsmake1 ncurses
234     lfsmake1 bash
235     lfsmake1 bzip2
236     lfsmake1 coreutils
237     lfsmake1 diffutils
238     lfsmake1 findutils
239     lfsmake1 gawk
240     lfsmake1 gettext
241     lfsmake1 grep
242     lfsmake1 gzip
243     lfsmake1 m4
244     lfsmake1 make
245     lfsmake1 patch
246     lfsmake1 perl
247     lfsmake1 sed
248     lfsmake1 tar
249     lfsmake1 texinfo
250     lfsmake1 util-linux
251     lfsmake1 cleanup-toolchain  PASS=2
252     export PATH=$ORG_PATH
253 }
254
255 buildbase() {
256     LOGFILE="$BASEDIR/log/_build.base.log"
257     export LOGFILE
258     lfsmake2 stage2
259     lfsmake2 linux-libc-header
260     lfsmake2 man-pages
261     lfsmake2 glibc
262     lfsmake2 cleanup-toolchain  PASS=3
263     lfsmake2 binutils
264     lfsmake2 gcc
265     lfsmake2 berkeley
266     lfsmake2 coreutils
267     lfsmake2 iana-etc
268     lfsmake2 m4
269     lfsmake2 bison
270     lfsmake2 ncurses
271     lfsmake2 procps
272     lfsmake2 sed
273     lfsmake2 libtool
274     lfsmake2 perl
275     lfsmake2 readline
276     lfsmake2 zlib
277     lfsmake2 autoconf
278     lfsmake2 automake
279     lfsmake2 bash
280     lfsmake2 bzip2
281     lfsmake2 diffutils
282     lfsmake2 e2fsprogs
283     lfsmake2 ed
284     lfsmake2 file
285     lfsmake2 findutils
286     lfsmake2 flex
287     lfsmake2 gawk
288     lfsmake2 gettext
289     lfsmake2 grep
290     lfsmake2 groff
291     lfsmake2 gzip
292     lfsmake2 inetutils
293     lfsmake2 iproute2
294     lfsmake2 kbd
295     lfsmake2 less
296     lfsmake2 libaal
297     lfsmake2 make
298     lfsmake2 man
299     lfsmake2 mktemp
300     lfsmake2 modutils
301     lfsmake2 mtd
302     lfsmake2 net-tools
303     lfsmake2 patch
304     lfsmake2 psmisc
305     lfsmake2 reiser4progs
306     lfsmake2 shadow
307     lfsmake2 sysklogd
308     lfsmake2 sysvinit
309     lfsmake2 tar
310     lfsmake2 texinfo
311     lfsmake2 udev
312     lfsmake2 util-linux
313     lfsmake2 vim
314     lfsmake2 grub
315 }
316
317 buildipfire() {
318   LOGFILE="$BASEDIR/log/_build.ipfire.log"
319   export LOGFILE
320   ipfiremake configroot
321   ipfiremake dhcp
322   ipfiremake dhcpcd
323   ipfiremake libusb
324   ipfiremake libpcap
325   ipfiremake linux-atm
326   ipfiremake ppp
327   ipfiremake rp-pppoe
328   ipfiremake unzip
329   ipfiremake linux                      SMP=1
330   ipfiremake ipp2p                      SMP=1
331   ipfiremake fcdsl                      SMP=1
332   ipfiremake fcdsl2                     SMP=1
333   ipfiremake fcdslsl            SMP=1
334   ipfiremake fcdslusb           SMP=1
335   ipfiremake fcdslslusb SMP=1
336 #  ipfiremake promise-sata-300-tx       SMP=1
337   ipfiremake zaptel                     SMP=1
338   ipfiremake fuse                               SMP=1
339   #ipfiremake linux                     XEN=1
340   ipfiremake linux
341   ipfiremake ipp2p
342   ipfiremake fcdsl
343   ipfiremake fcdsl2
344   ipfiremake fcdslsl
345   ipfiremake fcdslusb
346   ipfiremake fcdslslusb
347 #  ipfiremake promise-sata-300-tx
348   ipfiremake zaptel
349   ipfiremake fuse
350   ipfiremake pkg-config
351   ipfiremake cpio
352   ipfiremake klibc
353   ipfiremake mkinitcpio
354   ipfiremake udev                               KLIBC=1
355   ipfiremake expat
356   ipfiremake gdbm
357   ipfiremake gmp
358   ipfiremake pam
359   ipfiremake openssl
360   ipfiremake python
361   ipfiremake libnet
362   ipfiremake libjpeg
363   ipfiremake libpng
364   ipfiremake libtiff
365   ipfiremake libart
366   ipfiremake freetype
367   ipfiremake gd
368   ipfiremake popt
369   ipfiremake pcre
370   ipfiremake slang
371   ipfiremake newt
372   ipfiremake libcap
373   ipfiremake pciutils
374   ipfiremake libxml2
375   ipfiremake libxslt
376   ipfiremake BerkeleyDB
377   ipfiremake mysql
378   ipfiremake cyrus-sasl
379   ipfiremake openldap
380   ipfiremake apache2
381   ipfiremake php
382   ipfiremake apache2                    PASS=C
383   ipfiremake arping
384   ipfiremake beep
385   ipfiremake bind
386   ipfiremake capi4k-utils
387   ipfiremake cdrtools
388   ipfiremake dnsmasq
389   ipfiremake dosfstools
390   ipfiremake reiserfsprogs
391   ipfiremake squashfstools
392   ipfiremake sysfsutils
393   ipfiremake ntfs-3g
394   ipfiremake ethtool
395   ipfiremake ez-ipupdate
396   ipfiremake fcron
397   ipfiremake GD
398   ipfiremake GD-Graph
399   ipfiremake GD-TextUtil
400   ipfiremake gnupg
401   ipfiremake hdparm
402   ipfiremake ibod
403   ipfiremake initscripts
404   ipfiremake whatmask
405   ipfiremake iptables
406   ipfiremake libupnp
407   ipfiremake ipp2p                      IPT=1
408   ipfiremake moblock
409   ipfiremake linux-igd
410   ipfiremake ipac-ng
411   ipfiremake ipaddr
412   ipfiremake iptstate
413   ipfiremake iputils
414   ipfiremake l7-protocols
415   ipfiremake isdn4k-utils
416   ipfiremake mISDN
417   ipfiremake hwdata
418   ipfiremake kudzu
419   ipfiremake logrotate
420   ipfiremake logwatch
421   ipfiremake misc-progs
422   ipfiremake mtools
423   ipfiremake nano
424   ipfiremake nasm
425   ipfiremake URI
426   ipfiremake HTML-Tagset
427   ipfiremake HTML-Parser
428   ipfiremake Compress-Zlib
429   ipfiremake Digest
430   ipfiremake Digest-SHA1
431   ipfiremake Digest-HMAC
432   ipfiremake libwww-perl
433   ipfiremake Net-DNS
434   ipfiremake Net-IPv4Addr
435   ipfiremake Net_SSLeay
436   ipfiremake IO-Stringy
437   ipfiremake Unix-Syslog
438   ipfiremake Mail-Tools
439   ipfiremake MIME-Tools
440   ipfiremake Net-Server
441   ipfiremake Convert-TNEF
442   ipfiremake Convert-UUlib
443   ipfiremake Archive-Tar
444   ipfiremake Archive-Zip
445   ipfiremake Text-Tabs+Wrap
446   ipfiremake Locale-Country
447   ipfiremake XML-Parser
448   ipfiremake MP3-Info
449   ipfiremake MP3-Tag
450   ipfiremake glib
451   ipfiremake GeoIP
452   ipfiremake fwhits
453   ipfiremake noip_updater
454   ipfiremake ntp
455   ipfiremake openssh
456   ipfiremake openswan
457   ipfiremake pptpclient
458   ipfiremake rrdtool
459   ipfiremake setserial
460   ipfiremake setup
461   ipfiremake snort
462   ipfiremake snortsnarf
463   ipfiremake oinkmaster
464   ipfiremake squid
465   ipfiremake squid-graph
466   ipfiremake squidguard
467   ipfiremake calamaris
468   ipfiremake tcpdump
469   ipfiremake traceroute
470   ipfiremake vlan
471   ipfiremake wireless
472   ipfiremake libsafe
473   ipfiremake 3c5x9setup
474   ipfiremake pakfire
475   ipfiremake java
476   ipfiremake spandsp
477   ipfiremake lzo
478   ipfiremake openvpn
479   ipfiremake pammysql
480   ipfiremake ghostscript
481   ipfiremake cups
482   ipfiremake samba
483   ipfiremake sudo
484   ipfiremake mc
485   ipfiremake wget
486   ipfiremake bridge-utils
487   ipfiremake screen
488   ipfiremake hddtemp
489   ipfiremake smartmontools
490   ipfiremake htop
491   ipfiremake postfix
492   ipfiremake fetchmail
493   ipfiremake cyrusimap
494   ipfiremake webcyradm
495   ipfiremake mailx
496   ipfiremake clamav
497   ipfiremake spamassassin
498   ipfiremake amavisd
499   ipfiremake stund
500   ipfiremake libpri
501 # ipfiremake bristuff
502   ipfiremake asterisk
503   ipfiremake mpg123
504   ipfiremake libmad
505   ipfiremake libogg
506   ipfiremake libvorbis
507   ipfiremake lame
508   ipfiremake sox
509   ipfiremake gnump3d
510   ipfiremake ctorrent
511   ipfiremake applejuice
512   ipfiremake ocaml
513   ipfiremake mldonkey
514   ipfiremake rsync
515   ipfiremake tcpwrapper
516   ipfiremake portmap
517   ipfiremake nfs
518   ipfiremake nmap
519   ipfiremake mbmon
520   ipfiremake iftop
521   ipfiremake ncftp
522   ipfiremake cftp
523   ipfiremake etherwake
524   ipfiremake ethereal
525   ipfiremake tftp-hpa
526   ipfiremake bwm-ng
527   ipfiremake tripwire
528   ipfiremake sysstat
529   ipfiremake vsftpd
530   ipfiremake alsa
531   ipfiremake mp3blaster
532 }
533
534 buildinstaller() {
535   # Run installer scripts one by one
536   LOGFILE="$BASEDIR/log/_build.installer.log"
537   export LOGFILE
538   ipfiremake syslinux
539   ipfiremake as86
540   ipfiremake mbr
541   ipfiremake memtest
542   installmake linux-libc-header
543   installmake binutils
544   ipfiremake uClibc                     PASS=1
545   ipfiremake gcc                        INST=1
546   installmake uClibc                    PASS=2
547   installmake gcc                       INST=2
548   installmake uClibc                    PASS=3
549   installmake busybox
550   installmake udev
551   installmake slang
552   installmake newt
553   installmake gettext
554   installmake kbd
555   installmake popt
556   installmake sysvinit
557   installmake misc-progs
558   installmake e2fsprogs
559   installmake libaal
560   installmake reiser4progs
561   installmake reiserfsprogs
562   installmake sysfsutils
563   installmake util-linux
564   installmake pciutils
565   installmake zlib
566   installmake mtd
567   installmake wget
568   installmake hwdata
569   installmake kudzu
570   installmake installer
571   installmake initrd
572 }
573
574 buildpackages() {
575   LOGFILE="$BASEDIR/log/_build.packages.log"
576   export LOGFILE
577   echo "... see detailed log in _build.*.log files" >> $LOGFILE
578
579   installmake strip
580   
581   # Generating list of packages used
582   echo -n "Generating packages list from logs" | tee -a $LOGFILE
583   rm -f $BASEDIR/doc/packages-list
584   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
585         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
586                 echo "* `basename $i`" >>$BASEDIR/doc/packages-list
587         fi
588   done
589   echo "== List of softwares used to build $NAME Version: $VERSION ==" > $BASEDIR/doc/packages-list.txt
590   grep -v 'configroot$\|img$\|initrd$\|initscripts$\|installer$\|install$\|setup$\|pakfire$\|stage2$\|smp$\|tools$\|tools1$\|tools2$\|.tgz$\|-config$\|_missing_rootfile$' \
591         $BASEDIR/doc/packages-list | sort >> $BASEDIR/doc/packages-list.txt
592   rm -f $BASEDIR/doc/packages-list
593   # packages-list.txt is ready to be displayed for wiki page
594   beautify message DONE
595
596   # Create images for install
597   if [ "$DEVEL" == "1" ]; then
598                 ipfiremake cdrom ED=devel
599         fi
600         ipfiremake cdrom ED=full
601         
602   # Check if there is a loop device for building in virtual environments
603   if [ -e /dev/loop0 ]; then
604         ipfiremake usb-stick
605   fi
606   ipfiremake pxe
607   mv $LFS/install/images/{*.iso,*.tgz,*.img.gz} $BASEDIR >> $LOGFILE 2>&1
608
609   ipfirepackages
610
611   # Cleanup
612   stdumount
613   rm -rf $BASEDIR/build/tmp/*
614
615   # Generating total list of files
616   echo -n "Generating files list from logs" | tee -a $LOGFILE
617   rm -f $BASEDIR/log/FILES
618   for i in `ls -1tr $BASEDIR/log/[^_]*`; do
619         if [ "$i" != "$BASEDIR/log/FILES" -a -n $i ]; then
620                 echo "##" >>$BASEDIR/log/FILES
621                 echo "## `basename $i`" >>$BASEDIR/log/FILES
622                 echo "##" >>$BASEDIR/log/FILES
623                 cat $i | sed "s%^\./%#%" | sort >> $BASEDIR/log/FILES
624         fi
625   done
626   beautify message DONE
627
628   cd $PWD
629 }
630
631 ipfirepackages() {
632   ipfiredist alsa
633 #  ipfiredist amavisd
634 #  ipfiredist applejuice
635 #  ipfiredist asterisk
636   ipfiredist clamav
637   ipfiredist cups
638   ipfiredist cyrus-sasl
639 #  ipfiredist fetchmail
640 #  ipfiredist gnump3d
641 #  ipfiredist java
642   ipfiredist libogg
643   ipfiredist libvorbis
644 #  ipfiredist mailx
645 #  ipfiredist mldonkey
646   ipfiredist mp3blaster
647   ipfiredist mpg123
648 #  ipfiredist nfs
649   ipfiredist openldap
650 #  ipfiredist postfix
651   ipfiredist samba
652 #  ipfiredist sox
653 #  ipfiredist spamassassin
654   ipfiredist tripwire
655   ipfiredist vsftpd
656 #  ipfiredist webcyradm
657   test -d $BASEDIR/packages || mkdir $BASEDIR/packages
658   mv -f $LFS/install/packages/* $BASEDIR/packages >> $LOGFILE 2>&1
659   rm -rf  $BASEDIR/build/install/packages/*
660 }
661
662 # See what we're supposed to do
663 case "$1" in 
664 build)
665         clear
666         BUILDMACHINE=`uname -m`
667         DEVEL=0
668         if [ "$2" == "--devel" ]; then
669           DEVEL=1
670         fi
671         PACKAGE=`ls -v -r $BASEDIR/cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz 2> /dev/null | head -n 1`
672         #only restore on a clean disk
673         if [ ! -f log/cleanup-toolchain-2-tools ]; then
674                 if [ ! -n "$PACKAGE" ]; then
675                         beautify build_stage "Full toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
676                         prepareenv
677                         buildtoolchain
678                 else
679                         PACKAGENAME=${PACKAGE%.tar.gz}
680                         beautify build_stage "Packaged toolchain compilation"
681                         if [ `md5sum $PACKAGE | awk '{print $1}'` == `cat $PACKAGENAME.md5 | awk '{print $1}'` ]; then
682                                 tar zxf $PACKAGE
683                                 prepareenv
684                         else
685                                 exiterror "$PACKAGENAME md5 did not match, check downloaded package"
686                         fi
687                 fi
688         else
689                 echo -n "Using installed toolchain" | tee -a $LOGFILE
690                 beautify message SKIP
691                 prepareenv
692         fi
693
694         beautify build_start
695         beautify build_stage "Building LFS"
696         buildbase
697
698         beautify build_stage "Building IPFire"
699         buildipfire
700
701         # Setzen des IPFire Builds
702         if [ "$FIREBUILD" ]; then
703                 echo "$FIREBUILD" > $BASEDIR/build/var/ipfire/firebuild
704         else
705                 echo "_(OvO)_" > $BASEDIR/build/var/ipfire/firebuild
706         fi
707
708         beautify build_stage "Building installer"
709         buildinstaller
710
711         beautify build_stage "Building packages"
712         buildpackages
713         beautify build_end
714         ;;
715 shell)
716         # enter a shell inside LFS chroot
717         # may be used to changed kernel settings
718         prepareenv
719         entershell
720         ;;
721 changelog)
722         echo -n "Loading new Changelog from SVN: "
723         svn log http://svn.ipfire.org/svn/ipfire > doc/ChangeLog
724         beautify message DONE
725         ;;
726 clean)
727         echo -en "${BOLD}Cleaning build directory...${NORMAL}"
728         for i in `mount | grep $BASEDIR | sed 's/^.*loop=\(.*\))/\1/'`; do
729                 $LOSETUP -d $i 2>/dev/null
730         done
731         for i in `mount | grep $BASEDIR | cut -d " " -f 1`; do
732                 umount $i
733         done
734         stdumount
735         for i in `seq 0 7`; do
736             if ( losetup /dev/loop${i} 2>/dev/null | grep -q "/install/images" ); then
737                 umount /dev/loop${i}     2>/dev/null;
738                 losetup -d /dev/loop${i} 2>/dev/null;
739             fi;
740         done
741         rm -rf $BASEDIR/build
742         rm -rf $BASEDIR/cdrom
743         rm -rf $BASEDIR/packages
744         rm -rf $BASEDIR/log
745         if [ -h /tools ]; then
746                 rm -f /tools
747         fi
748         beautify message DONE
749         ;;
750 downloadsrc)
751         if [ ! -d $BASEDIR/cache ]; then
752                 mkdir $BASEDIR/cache
753         fi
754         mkdir -p $BASEDIR/log
755         echo -e "${BOLD}Preload all source files${NORMAL}" | tee -a $LOGFILE
756         FINISHED=0
757         cd $BASEDIR/lfs
758         for c in `seq $MAX_RETRIES`; do
759                 if (( FINISHED==1 )); then 
760                         break
761                 fi
762                 FINISHED=1
763                 cd $BASEDIR/lfs
764                 for i in *; do
765                         if [ -f "$i" -a "$i" != "Config" ]; then
766                                 echo -ne "Loading $i"
767                                 make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t ($c/$MAX_RETRIES)" download >> $LOGFILE 2>&1
768                                 if [ $? -ne 0 ]; then
769                                         beautify message FAIL
770                                         FINISHED=0
771                                 else
772                                         if [ $c -eq 1 ]; then
773                                         beautify message DONE
774                                         fi
775                                 fi
776                         fi
777                 done
778         done
779         echo -e "${BOLD}***Verifying md5sums${NORMAL}"
780         ERROR=0
781         for i in *; do
782                 if [ -f "$i" -a "$i" != "Config" ]; then
783                         make -s -f $i LFS_BASEDIR=$BASEDIR MESSAGE="$i\t " md5 >> $LOGFILE 2>&1
784                         if [ $? -ne 0 ]; then
785                                 echo -ne "MD5 difference in lfs/$i"
786                                 beautify message FAIL
787                                 ERROR=1
788                         fi
789                 fi
790         done
791         if [ $ERROR -eq 0 ]; then
792                 echo -ne "${BOLD}all files md5sum match${NORMAL}"
793                 beautify message DONE
794         else
795                 echo -ne "${BOLD}not all files were correctly download${NORMAL}"
796                 beautify message FAIL
797         fi
798         cd - >/dev/null 2>&1
799         ;;
800 toolchain)
801         clear
802         prepareenv
803         beautify build_stage "Toolchain compilation - Native GCC: `gcc --version | grep GCC | awk {'print $3'}`"
804         buildtoolchain
805         BUILDMACHINE=`uname -m`
806         echo "`date -u '+%b %e %T'`: Create toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
807         test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
808         cd $BASEDIR && tar -zc --exclude='log/_build.*.log' -f cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
809                 build/{bin,etc,usr/bin,usr/local} \
810                 build/tools/{bin,etc,*-linux-gnu,include,lib,libexec,sbin,share,var} \
811                 log >> $LOGFILE
812         md5sum cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.tar.gz \
813                 > cache/toolchains/$SNAME-$VERSION-toolchain-$BUILDMACHINE.md5
814         stdumount
815         ;;
816 gettoolchain)
817         BUILDMACHINE=`uname -m`
818         # arbitrary name to be updated in case of new toolchain package upload
819         PACKAGE=$SNAME-$VERSION-toolchain-$BUILDMACHINE
820         if [ ! -f $BASEDIR/cache/toolchains/$PACKAGE.tar.gz ]; then
821                 URL_TOOLCHAIN=`grep URL_TOOLCHAIN lfs/Config | awk '{ print $3 }'`
822                 test -d $BASEDIR/cache/toolchains || mkdir $BASEDIR/cache/toolchains
823                 echo "`date -u '+%b %e %T'`: Load toolchain tar.gz for $BUILDMACHINE" | tee -a $LOGFILE
824                 cd $BASEDIR/cache/toolchains
825                 wget $URL_TOOLCHAIN/$PACKAGE.tar.gz $URL_TOOLCHAIN/$PACKAGE.md5 >& /dev/null
826                 if [ $? -ne 0 ]; then
827                         echo "`date -u '+%b %e %T'`: error downloading toolchain for $BUILDMACHINE machine" | tee -a $LOGFILE
828                 else
829                         if [ "`md5sum $PACKAGE.tar.gz | awk '{print $1}'`" = "`cat $PACKAGE.md5 | awk '{print $1}'`" ]; then
830                                 echo "`date -u '+%b %e %T'`: toolchain md5 ok" | tee -a $LOGFILE
831                         else
832                                 exiterror "$PACKAGE.md5 did not match, check downloaded package"
833                         fi
834                 fi
835         else
836                 echo "Toolchain is already downloaded. Exiting..."
837         fi
838         ;;
839 othersrc)
840         prepareenv
841         echo -ne "`date -u '+%b %e %T'`: Build sources iso for $MACHINE" | tee -a $LOGFILE
842         chroot $LFS /tools/bin/env -i   HOME=/root \
843         TERM=$TERM PS1='\u:\w\$ ' \
844         PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin \
845         VERSION=$VERSION NAME="$NAME" SNAME="$SNAME" MACHINE=$MACHINE \
846         /bin/bash -x -c "cd /usr/src/lfs && make -f sources-iso LFS_BASEDIR=/usr/src install" >>$LOGFILE 2>&1
847         mv $LFS/install/images/ipfire-* $BASEDIR >> $LOGFILE 2>&1
848         if [ $? -eq "0" ]; then
849                 beautify message DONE
850         else
851                 beautify message FAIL
852         fi
853         stdumount
854         ;;
855 svn)
856         case "$2" in
857           update|up)
858                 # clear
859                 echo -ne "Loading the latest source files...\n"
860                 if [ $3 ]; then
861                         svn update -r $3 | tee -a $PWD/log/_build.svn.update.log
862                 else
863                         svn update | tee -a $PWD/log/_build.svn.update.log
864                 fi
865                 if [ $? -eq "0" ]; then
866                         beautify message DONE
867                 else
868                         beautify message FAIL
869                         exit 1
870                 fi
871                 echo -ne "Writing the svn-info to a file"
872                 svn info > $PWD/svn_status
873                 if [ $? -eq "0" ]; then
874                         beautify message DONE
875                 else
876                         beautify message FAIL
877                         exit 1
878                 fi
879                 chmod 755 $0
880                 exit 0
881           ;;
882           commit|ci)
883                 clear
884                 if [ -f /usr/bin/mcedit ]; then
885                         export EDITOR=/usr/bin/mcedit
886                 fi
887                 if [ -f /usr/bin/nano ]; then
888                         export EDITOR=/usr/bin/nano
889                 fi
890                 echo -ne "Selecting editor $EDITOR..."
891                 beautify message DONE
892                 if [ -e /sbin/yast ]; then
893                         if [ "`echo $SVN_REVISION | cut -c 3`" -eq "0" ]; then
894                                 $0 changelog
895                         fi
896                 fi
897                 update_langs
898                 svn commit
899                 $0 svn up
900                 if [ -n "$FTP_CACHE_URL" ]; then
901                         $0 uploadsrc
902                 fi
903           ;;
904           dist)
905                 if [ $3 ]; then
906                         SVN_REVISION=$3
907                 fi
908                 if [ -f ipfire-source-r$SVN_REVISION.tar.gz ]; then
909                         echo -ne "REV $SVN_REVISION: SKIPPED!\n"
910                         exit 0
911                 fi
912                 echo -en "REV $SVN_REVISION: Downloading..."
913                 svn export http://svn.ipfire.org/svn/ipfire/trunk ipfire-source/ --force > /dev/null
914                 svn log http://svn.ipfire.org/svn/ipfire/trunk -r 1:$SVN_REVISION > ipfire-source/Changelog
915                 #svn info http://svn.ipfire.org/svn/ipfire/trunk -r $SVN_REVISION > ipfire-source/svn_status
916                 evaluate 1
917
918                 echo -en "REV $SVN_REVISION: Compressing files..."
919                 if [ -e ipfire-source/trunk/make.sh ]; then
920                         chmod 755 ipfire-source/trunk/make.sh
921                 fi
922                 tar cfz ipfire-source-r$SVN_REVISION.tar.gz ipfire-source
923                 evaluate 1
924                 echo -en "REV $SVN_REVISION: Cleaning up..."
925                 rm ipfire-source/ -r
926                 evaluate 1
927           ;;
928           diff|di)
929           update_langs
930                 echo -ne "Make a local diff to last svn revision"
931                 svn diff > ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff
932                 evaluate 1
933                 echo "Diff was successfully saved to ipfire-diff-`date +'%Y-%m-%d-%H:%M'`-r`svn info | grep Revision | cut -c 11-`.diff"
934                 svn status
935           ;;
936         esac
937         ;;
938 uploadsrc)
939         PWD=`pwd`
940         cd $BASEDIR/cache/
941         echo -e "Uploading cache to ftp server:"
942         ncftpls -u $FTP_CACHE_USER -p $FTP_CACHE_PASS ftp://$FTP_CACHE_URL$FTP_CACHE_PATH/ > /tmp/ftplist
943         for i in *; do
944                 if [ "$i" == "toolchains" ]; then continue; fi
945                 grep -q $i /tmp/ftplist
946                 if [ "$?" -ne "0" ]; then
947                         echo -ne "$i"
948                         ncftpput -u $FTP_CACHE_USER -p $FTP_CACHE_PASS $FTP_CACHE_URL $FTP_CACHE_PATH/ $i
949                         if [ "$?" -ne "0" ]; then
950                                 beautify message FAIL
951                         fi
952                 fi
953         done
954         rm -f /tmp/ftplist
955         cd $PWD
956         exit 0
957         ;;
958 upload)
959         case "$2" in
960           iso)
961                 echo -e "Uploading the iso to $FTP_ISO_PATH/$SVN_REVISION."
962                 cat <<EOF > .ftp-commands
963 mkdir -p $FTP_ISO_PATH$SVN_REVISION
964 ls -lah
965 quit
966 EOF
967                 ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL < .ftp-commands
968                 rm -f .ftp-commands
969                 md5sum ipfire-$VERSION.$MACHINE-full.iso > ipfire-$VERSION.$MACHINE-full.iso.md5
970                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-full.iso
971                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-full.iso.md5
972                 if [ -e ipfire-$VERSION.$MACHINE-devel.iso ]; then
973                         md5sum ipfire-$VERSION.$MACHINE-devel.iso > ipfire-$VERSION.$MACHINE-devel.iso.md5
974                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-devel.iso
975                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-$VERSION.$MACHINE-devel.iso.md5
976                 fi
977                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ ipfire-source-r$SVN_REVISION.tar.gz
978                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/ svn_status
979                 if [ "$?" -eq "0" ]; then
980                         echo -e "The iso of Revision $SVN_REVISION was successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
981                 else
982                         echo -e "There was an error while uploading the iso to the ftp server."
983                         exit 1
984                 fi
985                 if [ "$3" = "--with-sources-cd" ]; then
986                         ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH/$SVN_REVISION/ ipfire-sources-cd-$VERSION.$MACHINE.iso
987                 fi
988                 ;;
989           paks)
990                 cat <<EOF > .ftp-commands
991 mkdir -p $FTP_ISO_PATH$SVN_REVISION/paks
992 ls -lah
993 quit
994 EOF
995                 ncftp -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL < .ftp-commands
996                 rm -f .ftp-commands
997                 ncftpput -u $FTP_ISO_USER -p $FTP_ISO_PASS $FTP_ISO_URL $FTP_ISO_PATH$SVN_REVISION/paks packages/*
998                 if [ "$?" -eq "0" ]; then
999                         echo -e "The packages were successfully uploaded to $FTP_ISO_URL$FTP_ISO_PATH$SVN_REVISION/."
1000                 else
1001                         echo -e "There was an error while uploading the packages to the ftp server."
1002                         exit 1
1003                 fi
1004           ;;
1005         esac
1006         ;;
1007 batch)
1008         if [ "$2" = "--background" ]; then
1009                 batch_script
1010                 exit $?
1011         fi
1012         if [ `screen -ls | grep -q ipfire` ]; then
1013                 echo "Build is already running, sorry!"
1014                 exit 1
1015         else
1016                 if [ "$2" = "--rebuild" ]; then
1017                         export IPFIRE_REBUILD=1
1018                         echo "REBUILD!"
1019                 else
1020                         export IPFIRE_REBUILD=0
1021                 fi
1022                 echo -en "${BOLD}***IPFire-Batch-Build is starting...${NORMAL}"
1023                 screen -dmS ipfire $0 batch --background
1024                 evaluate 1
1025                 exit 0
1026         fi
1027         ;;
1028 watch)
1029         watch_screen
1030         ;;
1031 pxe)
1032         case "$2" in
1033           start)
1034                 start_tftpd
1035                 ;;
1036           stop)
1037                 stop_tftpd
1038                 ;;
1039           reload|restart)
1040                 reload_tftpd
1041                 ;;              
1042         esac
1043         exit 0
1044         ;;
1045 lang)
1046         update_langs
1047         ;;
1048 packages)
1049         case "$2" in
1050                 sign)
1051                         sign_packages
1052                         ;;
1053         esac
1054         ;;
1055 "")
1056         clear
1057         svn info
1058         select name in "Exit" "IPFIRE: Downloadsrc" "IPFIRE: Build (silent)" "IPFIRE: Watch Build" "IPFIRE: Batch" "IPFIRE: Clean" "SVN: Commit" "SVN: Update" "SVN: Status" "SVN: Diff" "LOG: Tail" "Help"
1059         do
1060         case $name in
1061         "IPFIRE: Downloadsrc")
1062                 $0 downloadsrc
1063                 ;;
1064         "IPFIRE: Build (silent)")
1065                 $0 build-silent
1066                 ;;
1067         "IPFIRE: Watch Build")
1068                 $0 watch
1069                 ;;
1070         "IPFIRE: Batch")
1071                 $0 batch
1072                 ;;
1073         "IPFIRE: Clean")
1074                 $0 clean
1075                 ;;
1076         "SVN: Update")
1077                 $0 svn update
1078                 ;;
1079         "Help")
1080                 echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1081                 cat doc/make.sh-usage
1082                 ;;
1083         "LOG: Tail")
1084                 tail -f log/_*
1085                 ;;
1086         "Exit")
1087                 break
1088                 ;;
1089         esac
1090         done
1091         ;;
1092 config)
1093         make_config
1094         ;;
1095 *)
1096         echo "Usage: $0 {build|changelog|clean|gettoolchain|downloadsrc|shell|sync|toolchain}"
1097         cat doc/make.sh-usage
1098         ;;
1099 esac