source: branches/2.2.9/mindi/mindi @ 2175

Last change on this file since 2175 was 2175, checked in by bruno, 10 years ago

Reverse the result of the test as it returns 0 when it finds the ../ sequence and then proceed with the treatment

  • Property svn:keywords set to Rev Id
File size: 103.8 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2175 2009-04-17 23:00:26Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-image boot/root kit. The first image is the boot
9# disk: it contains a kernel, a ramdisk etc. The second disk is data disk #1;
10# the third disk is data disk #2; and so it goes.
11#
12# See http://www.mondorescue.org for details.
13#-----------------------------------------------------------------------------
14
15### Which arch are we on (useful for ia64 port)
16ARCH=`/bin/uname -m`
17
18ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off"
19
20MINDI_REV=PBREV
21MINDI_VER=PBVER
22
23MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
24MINDI_PREFIX=XXX
25MINDI_CONF=YYY
26MINDI_SBIN=${MINDI_PREFIX}/sbin
27MINDI_LIB=LLL
28
29# Temporary directory for mindi
30TMPDIR=/tmp
31
32EXTRA_SPACE=49152       # increase if you run out of ramdisk space
33BOOT_SIZE=16384         # size of the boot disk
34
35PROMPT_MAKE_CD_IMAGE="yes"
36    # Ask if you want to make a CD Image to be written?
37    # if this is set to 'no', then the image will be created automatically
38
39PROMPT_MAKE_USB_IMAGE="yes"
40    # Ask if you want to make a USB Image to be written?
41    # if this is set to 'no', then the image will be created automatically
42
43USE_OWN_KERNEL="yes"
44    # If set to "no", you will be prompted for whether or not
45    # you want to use your own kernel, or the supplied default.
46    # If "yes" mindi will automatically use your own kernel.
47
48MY_FSTAB=/etc/fstab
49TAPE_MODS="ht st osst ide-tape ide_tape"
50SCSI_MODS="3w-xxxx 3w_xxxx 3w_9xxx 3w-9xxx 53c7,8xx a100u2w a320raid aacraid adpahci advansys aha152x aha1542 aha1740 aic79xx aic79xx_mod aic7xxx aic7xxx_mod aic7xxx_old AM53C974 atp870u BusLogic cciss cpqfc dmx3191d dpt_i2o dtc eata eata_dma eata_pio fdomain gdth g_NCR5380 i2o_block i2o_core ide-scsi ieee1394 imm in2000 initio ips iscsi iscsi_tcp libiscsi scsi_transport_iscsi isp megaraid megaraid_mm megaraid_mbox megaraid_sas mptbase mptscsih mptsas mptspi mptfc mptscsi mptctl NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp dc395x"
51
52# ide-probe-mod
53IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod edd paride ata_generic ata_piix libata dock via82cxxx generic nvidia ahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks pata_sis amd74xx sis5513 jmicron sata_promise sata_via serverworks"
54PCMCIA_MODS="pcmcia_core ds yenta_socket"
55USB_MODS="usb-storage usb-ohci usb-uhci usbcore usb_storage input hid uhci_hcd ehci_hcd uhci-hcd ehci-hcd ohci-hcd ohci_hcd usbkbd usbhid keybdev mousedev libusual scsi_mod ff-memless"
56NET_MODS="sunrpc nfs nfs_acl lockd fscache loop mii 3c59x e100 bcm5700 bnx2 e1000 e1000e eepro100 ne2k-pci tg3 libphy pcnet32 8139cp 8139too 8390 forcedeth vmxnet vmnet exportfs"
57CDROM_MODS="$TAPE_MODS $IDE_MODS $USB_MODS $PCMCIA_MODS $SCSI_MODS $NET_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_base nls_cp437 nls_utf8 sg sr_mod zlib_inflate iso9660"
58# Those modules will only go on the backup media, not the boot media.
59EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid10 raid5 raid456 lvm-mod dm-mod dm_mod dm-snapshot dm_snapshot dm-zero dm_zero dm-mirror dm_mirror dm-multipath dm-round-robin dm-emc dm-hp-sw dm-rdac multipath jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16 fuse"
60# Replace with that line for HP OCMP e.g.
61#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
62DENY_MODS="kqemu"
63# Force some modules to be included
64FORCE_MODS=""
65
66LOGFILE=/var/log/mindi.log
67MINDI_CACHE=/var/cache/mindi
68BOOT_MEDIA_MESSAGE="\
69To format and restore all files automatically, type 'nuke' <enter>.\n\
70To restore some/all files interactively, type 'interactive' <enter>.\n\
71To compare the archives with your filesystem, type 'compare' <enter>.\n\
72To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
73You may add one or more of the following parameters as well:-\n\n\
74        donteject - mondorestore will not eject the CD; this is useful if, for\n\
75                    instance, your PC's case has a concealed CD-ROM drive\n\
76        noresize  - your mountlist will not be adjusted to use your unallocated\n\
77                    hard disk space\n\
78        textonly  - do not call any Newt library routines; this is unattractive\n\
79                    but valuable if you find your Newt library has bugs in it\n\n\
80e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
81a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
82"
83FDISK=$MINDI_SBIN/parted2fdisk
84
85# Using a config file allow to overwrite some values
86MINDI_CONFIG="$MINDI_CONF/mindi.conf"
87if [ -f $MINDI_CONFIG ]; then
88    . $MINDI_CONFIG
89fi
90DEPLIST_FILE="$MINDI_CONF/deplist.txt"
91ISO_CMD="/usr/bin/mkisofs"
92ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
93
94# Now we can create what we need
95MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
96if [ $? -ne 0 ]; then
97    df $TMPDIR
98    Die "Unable to create a temporary directory ! Check space on $TMPDIR"
99fi
100if [ _"$MINDI_TMP" = _"" ]; then
101    Die "MINDI_TMP is empty, aborting"
102fi
103if [ _"$MINDI_TMP" = _"/" ]; then
104    Die "MINDI_TMP is /, aborting"
105fi
106export MINDI_TMP
107
108# ----------------------------------------------------------------------------
109
110
111AbortHere() {
112    [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
113    Die "Program is terminating in response to signal received from OS/user"
114}
115
116
117Aborted() {
118    trap SIGHUP SIGTERM SIGTRAP SIGINT
119    [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
120    [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
121    Die "User abort."
122}
123
124
125AddFileToCfgIfExists() {
126    [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
127}
128
129
130AddKeyboardMappingFile() {
131    local mappath r included_list included_item i res ii sss
132    mappath=$1
133    KBDEPTH=$(($KBDEPTH+1))
134    [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
135    if [ -e "$bigdir/$mappath" ] ; then
136        echo "$mappath already added" >> $LOGFILE
137        return
138    elif [ -d "$bigdir/$mappath" ] ; then
139        echo "Cannot add $mappath: it's a directory. Sorry."
140        return
141    fi
142    echo "Added kbd map $mappath" >> $LOGFILE
143    if [ ! -e "$mappath" ] ; then
144            mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
145        if [ ! -e "$mappath" ] ; then
146            LogIt "Cannot add $mappath: kbd map file not found"
147            return
148        fi
149    else
150        echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
151    fi
152
153    mkdir -p $bigdir/etc
154    tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
155    if [ "`echo $mappath | grep -F ".gz"`" ] ; then
156        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
157    else
158        included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
159    fi
160    for included_item in $included_list ; do
161        if [ ! -e "$included_item" ] ; then
162                sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
163            [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
164            for ii in $sss ; do
165                [ -e "$ii" ] && AddKeyboardMappingFile $ii
166            done
167        else
168            AddKeyboardMappingFile $included_item
169        fi
170    done
171}
172
173
174CopyDependenciesToDirectory() {
175    local outdir incoming fname counter d found
176    outdir=$1
177    mkdir -p $outdir
178    incoming=`ReadLine`
179    counter=0
180    while [ "$incoming" != "" ] ; do
181        # Non absolute file names should not arrive till here => skipped
182        if [ `echo "$incoming" | cut -c1` != '/' ]; then
183            LogIt "Unable to handle $incoming"
184            incoming=`ReadLine`
185            continue
186        fi
187        # no parent directory of incoming should be a link, copy is not possible in that case
188        d=`dirname "$incoming"`
189        found="false"
190        while [ $d != "/" -a $found = "false" ]; do
191            [ -h "$d" ] && found="true"
192            d=`dirname "$d"`
193        done
194        if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
195            find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
196        elif [ -e "$incoming" ] && [ $found = "false" ]; then
197            tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd $outdir ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
198
199            # Only uncompress modules if not using udevd
200            if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
201                gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming"
202            fi
203            [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
204            counter=$(($counter+1))
205            if [ "$counter" -ge "5" ] ; then
206                counter=0
207                echo -en "."
208            fi
209        fi
210        incoming=`ReadLine`
211    done
212}
213
214
215CountItemsIn() {
216    local r
217    r=0
218    for q in $1 ; do
219        r=$(($r+1))
220    done
221    echo $r
222}
223
224
225# Last function called before exiting
226# Parameter is exit code value
227MindiExit() {
228    local my_partitions
229
230    echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
231    echo "End date : `date`" >> $LOGFILE
232    if [ _"$MONDO_SHARE" != _"" ] ; then
233        echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
234        cat $LOGFILE >> /var/log/mondoarchive.log
235        echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
236    fi
237
238    cd /
239    sync&
240
241    # Unmount what could remain mounted
242    my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
243    [ "$my_partitions" != "" ] && umount $my_partitions
244    # Clean temporary files only when standalone mindi
245    if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
246        rm -Rf $MINDI_TMP
247    fi
248    exit $1
249}
250
251Die() {
252    local i
253    if [ "$1" = "" ] ; then
254        LogIt "FATAL ERROR"
255    else
256        LogIt "FATAL ERROR. $1"
257    fi
258    if [ _"$2" != _"" ]; then
259        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
260    fi
261    rm -f "$2"
262
263    LogIt "Please e-mail a copy of $LOGFILE to the mailing list."
264    LogIt "See http://www.mondorescue.org for more information."
265    LogIt "WE CANNOT HELP unless you enclose that file.\n"
266    MindiExit -1
267}
268
269
270DropOptimizedLibraries() {
271    local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
272    filelist=$1
273    outdir=$2
274
275    list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
276    if [ "$list_of_optimized_libraries" = "" ] ; then
277        return 0
278    fi
279    echo -en "Dropping i686-optimized libraries if appropriate"
280    for optimized_lib_name in $list_of_optimized_libraries ; do
281        echo -en "."
282        reason=""
283        vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
284        echo "$vanilla_lib_name" >> $filelist
285        echo "Adding $vanilla_lib_name to filelist" >> $LOGFILE
286        mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
287        rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
288
289        # This may return multiple files
290        for resolved in `ReadAllLink $vanilla_lib_name`; do
291            echo "Adding as deps $resolved to filelist" >> $LOGFILE
292            vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
293            mkdir -p $outdir$resolved> /dev/null 2> /dev/null
294            rmdir $outdir$resolved > /dev/null 2> /dev/null
295            ln -sf $vanilla_resolved_name $outdir$resolved
296            echo "Excluding deps $resolved" >> $LOGFILE
297            grep -Fvx "$resolved" "$filelist" > $filelist.tmp
298            echo "Replacing it with $vanilla_resolved_name" >> $LOGFILE
299            echo "$vanilla_resolved_name" >> $filelist.tmp
300            mv -f $filelist.tmp $filelist
301        done
302    done
303    $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
304    mv -f $filelist.tmp $filelist
305    echo -e "$DONE"
306}
307
308
309FindAndAddUserKeyboardMappingFile() {
310    local r res mapfile mappath included_item included_list keyfile mp locale
311    LogIt "Analyzing your keyboard's configuration."
312    KEYDIR=/lib/kbd
313    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd     # Slackware
314    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
315    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
316    [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
317    [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
318    if [ ! -e "$KEYDIR" ] ; then
319        LogIt "Keyboard mapping directory not found. I shall use default map at boot-time."
320        return 0
321    fi
322    if [ -e "/etc/sysconfig/keyboard" ] ; then
323        echo "Red Hat-style config detected." >> $LOGFILE
324        keyfile=/etc/sysconfig/keyboard
325    elif [ -e "/etc/rc.d/rc.keymap" ] ; then
326        echo "Slackware-style config detected." >> $LOGFILE
327        keyfile=/etc/rc.d/rc.keymap
328    elif [ -e "/etc/rc.config" ] ; then
329        echo "Debian-style config detected." >> $LOGFILE
330        keyfile=/etc/rc.config
331    elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
332        echo "Debian-style config detected." >> $LOGFILE
333        echo -en "Adding the following keyboard mapping tables: "
334        mkdir -p $bigdir/tmp
335        echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
336        KBDEPTH=0
337        mkdir -p $bigdir/etc/console
338        cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
339        echo -e "$DONE"
340        return 0
341    elif [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
342        echo "Ubuntu-style config detected." >> $LOGFILE
343        echo -en "Adding the following keyboard mapping tables: "
344        mkdir -p $bigdir/tmp
345        echo "/etc/console-setup/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
346        KBDEPTH=0
347        mkdir -p $bigdir/etc/console-setup
348        cp /etc/console-setup/boottime.kmap.gz $bigdir/etc/console-setup 2>> $LOGFILE
349        echo -e "$DONE"
350        return 0
351    elif [ -e "/etc/conf.d/keymaps" ] ; then
352        echo "Gentoo-style config detected." >> $LOGFILE
353        keyfile=/etc/conf.d/keymaps
354    else
355        echo -en "Searching for rc.config ..."
356        keyfile=`find /etc -name rc.config | head -n1`
357        if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
358            LogIt "Unknown config detected. Default keyboard map will be used."
359            return
360        else
361            echo "Found $keyfile" >> $LOGFILE
362        fi
363    fi
364    if [ ! -e "$KEYDIR/keymaps" ] ; then
365        LogIt "Keyboard mapping directory not found. Default keyboard map will be used."
366        return
367    fi
368    echo "keyfile=$keyfile" >> $LOGFILE
369    locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
370    [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'`        # Slackware
371    [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2`        # Gentoo
372    echo "locale=$locale" >> $LOGFILE
373    #
374    # Process the keymaps dir once for all
375    # AddKeyboardMappingFile will use it recursively
376    #
377    find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
378    mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
379    [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
380    # If we have multiple keymaps then log it !!
381    echo "$mp" | grep -q " "
382    if [ $? -eq 0 ]; then
383        echo "WARNING: Multiple keymaps found: $mp" | tee -a $LOGFILE
384        echo "The following one will be used" >> $LOGFILE
385    fi
386    for i in $mp ; do
387        mappath=$i
388        [ -e "$i" ] && [ ! -d "$i" ] && break
389    done
390    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
391            mappath=$(find / -name "*/kbd/keymaps/*/$locale")
392    fi
393    echo "mappath = $mappath" >> $LOGFILE
394    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
395        LogIt "Keyboard mapping file not found. Default keyboard map will be used."
396        return
397    fi
398    echo -en "Adding the following keyboard mapping tables: "
399    mkdir -p $bigdir/tmp
400    echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
401    KBDEPTH=0
402    AddKeyboardMappingFile $mappath
403    echo -e "$DONE"
404    rm -f $MINDI_TMP/keymaps.find
405    return 0
406}
407
408
409FindIsolinuxBinary() {
410    ISOLINUX=/usr/lib/isolinux.bin
411    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
412    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
413    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
414    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
415    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
416    [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
417    [ ! -e "$ISOLINUX" ] && Die "Please install isolinux first. If your syslinux RPM doesn't include isolinux, you may download an isolinux RPM from Mondo's website - go to http://www.mondorescue.com and click on 'Download'"
418    echo "Found isolinux.bin at $ISOLINUX" >> $LOGFILE
419}
420
421
422FindSpecificModuleInPath() {
423    local modpaths pwd line
424    pwd=`pwd`
425    if [ "$YOUR_KERNEL_SUCKS" ] ; then
426        cd $MINDI_TMP
427    else
428        cd /
429    fi
430    if [ ! -e "$1" ] ; then
431        LogIt "WARNING - cannot search specific path '$1'"
432        return 1
433    fi
434    modpaths=`find $1 -name $2.*o -type f`
435    #[ "$?" -ne "0" ] && Die "find $1 -name $2.o -type f --- failed"
436    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f`
437    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f`
438    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f`
439    echo "$modpaths"
440    cd $pwd
441}
442
443
444GenerateGiantDependencyList() {
445    local incoming loc fname list_of_files i tempfile outfile progress filelist res r mapfile mappath included_list included_item old_pwd tempdepfile modres noof_lines lvmversion lvmresolved
446
447    echo -en "Analyzing dependency requirements"
448    outfile=$1
449    tempfile=$MINDI_TMP/$$.txt
450    incoming=`ReadLine`
451
452    > $tempfile
453    progress=0
454    res=0
455    noof_lines=$2
456    while [ "$incoming" != "" ] ; do
457        if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
458            incoming=`ReadLine`
459            continue
460        fi
461        if [ "$incoming" = "LVMFILES:" ] ; then
462            break
463        fi
464        filelist=`GenerateListForFile "$incoming"`
465        r=$?
466        [ "$r" -ne "0" ] && LogIt "$incoming not found"
467        res=$(($res+$r))
468#       echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
469        for fname in $filelist ; do
470            [ "$fname" != "" ] && echo "$fname" >> $tempfile
471        done
472        progress=$(($progress+1))
473        echo -en "\r\t\t\t\t\t\t\t\t"
474        i=$(($progress*100))
475        i=$(($i/$noof_lines))
476        echo -en "$i"
477        echo -en "%"
478        modres=$(($progress%4))
479        [ "$modres" -eq "0" ] && echo -en "\t/"
480        [ "$modres" -eq "1" ] && echo -en "\t-"
481        [ "$modres" -eq "2" ] && echo -en "\t\\"
482        [ "$modres" -eq "3" ] && echo -en "\t|"
483        incoming=`ReadLine`
484    done
485    if  [ "$incoming" = "LVMFILES:" ] ; then
486        incoming=`ReadLine`
487        lvmversion=""
488        while [ "$incoming" != "" ] ; do
489            if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
490                incoming=`ReadLine`
491                continue
492            fi
493            filelist=`GenerateListForFile "$incoming"`
494            for tool in $filelist ; do
495                lvmresolved=`readlink -f $tool`
496                if [ "$tool" = "$lvmresolved" ]; then
497                    echo "$tool" >> $tempfile
498                elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
499                    if [ "$lvmversion" = "" ] ; then
500                        lvmversion=`$lvmresolved`
501                        echo "$lvmresolved" >> $tempfile
502                    fi
503                    toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
504                    if [ "$lvmversion" = "200" ]; then
505                        # pvdata and lvmcreate_initrd don't exist in LVM2
506                        case "$toolstripped" in
507                        "pvdata")
508                            continue
509                            ;;
510                        "lvmcreate_initrd")
511                            continue
512                            ;;
513                        esac
514                    fi
515                    toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
516                    if [ -e "$toolpath" ] ; then
517                        echo "$toolpath" >> $tempfile
518                        echo "$tool" >> $tempfile
519                    else
520                        toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
521                    fi
522                    if [ -e "$toolpath" ] ; then
523                        echo "$toolpath" >> $tempfile
524                        echo "$tool" >> $tempfile
525                    else
526                        echo "Where are your LVM-Tools? Couldn't find $tool"
527                    fi
528                else
529                    echo "$tool" >> $tempfile
530                fi
531            done
532            progress=$(($progress+1))
533            echo -en "\r\t\t\t\t\t\t\t\t"
534            i=$(($progress*100))
535            i=$(($i/$noof_lines))
536            echo -en "$i"
537            echo -en "%"
538            modres=$(($progress%4))
539            [ "$modres" -eq "0" ] && echo -en "\t/"
540            [ "$modres" -eq "1" ] && echo -en "\t-"
541            [ "$modres" -eq "2" ] && echo -en "\t\\"
542            [ "$modres" -eq "3" ] && echo -en "\t|"
543            incoming=`ReadLine`
544        done
545    fi
546    echo -en "$DONE\nMaking complete dependency list"
547
548    tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
549    mv -f $tempfile.new $tempfile
550    > $outfile.pre
551    progress=0
552    noof_lines=`cat $tempfile | wc -l`
553    echo "---------------------------------" >> $LOGFILE
554    echo "List of dependencies:             " >> $LOGFILE
555    echo "---------------------------------" >> $LOGFILE
556    for fname in `cat $tempfile` ; do
557        echo "$fname" | tee -a $LOGFILE >> $outfile.pre
558        LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
559        progress=$(($progress+1))
560        echo -en "\r\t\t\t\t\t\t\t\t"
561        i=$(($progress*100))
562        i=$(($i/$noof_lines))
563        echo -en "$i"
564        echo -en "%"
565        modres=$(($progress%4))
566        [ "$modres" -eq "0" ] && echo -en "\t/"
567        [ "$modres" -eq "1" ] && echo -en "\t-"
568        [ "$modres" -eq "2" ] && echo -en "\t\\"
569        [ "$modres" -eq "3" ] && echo -en "\t|"
570    done
571    if [ _"$MONDO_SHARE" != _"" ]; then
572        mkdir -p $bigdir/tmp
573        mkdir -p $bigdir/sbin
574        mkdir -p $bigdir/bin
575        if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
576            LogIt "\nIncorporating post-nuke tarball"
577            old_pwd=`pwd`
578            cd $bigdir
579            tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogIt "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
580            cd $old_pwd
581        fi
582        if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
583            LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
584        else
585            LogIt "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
586            LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system."
587            LogIt "If Mindi was called by Mondo then send me a bug report.\n It not, type 'ps ax' to see which Mondo-related process is still running;\n then kill it. :-)\n Finally, run Mindi again."
588            Die "Odd."
589        fi
590        cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
591        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
592            LogIt "\nIncorporating NFS-related settings"
593            for r in NFS-* ISO-PREFIX ; do
594                cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
595                echo "Copying $r to ramdisk" >> $LOGFILE
596            done
597        fi
598    fi
599    tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
600    rm -f $tempfile $outfile.pre
601    [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
602    return $res
603}
604
605
606GenerateListForFile() {
607    local files_found loc fname incoming i res
608    incoming="$1"
609    files_found=""
610    res=0
611
612    for fname in $incoming ; do
613        files_found="$files_found `LocateFile $fname`"
614    done
615
616    echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
617}
618
619
620# Returns all disk devices which are part of a raid array
621GetAllRaidMembers() {
622    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
623}
624
625
626GetFileSizeList() {
627    local i
628    for i in `find $1 -type d -o -print` ; do
629        du -sk $i
630    done
631}
632
633
634GetHomeDir() {
635    local res loc
636    loc=`which $1 2>/dev/null`
637    res=`file $loc | $AWK '{print $NF;}'`
638    dirname $res
639}
640
641
642# Check kernel filesystem capabilites for accessing initrd image
643#
644# Interface definition:
645# param #1: absolute path to kernel image
646GetInitrdFilesystemToUse() {
647
648    # interface test: make sure we have one parameter
649    if [ $# -ne 1 ]; then
650        Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
651    fi
652
653    # interface parameters
654    local lvKernelImage=$1
655
656    # local constants (filesystem magic strings)
657    local lcMagicCramfs="<3>cramfs: wrong magic"
658    local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
659    local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs..."
660
661    # local variables
662    local lvOffset
663    local lvScanRes
664    local lvUseFilesystem
665
666    # say where we are.
667    echo "  GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage.\n" >> $LOGFILE
668
669    # verify that file exists
670    [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
671
672    # Kernel may be gzip compressed
673    file $lvKernelImage 2>&1 | grep -q gzip
674    if [ $? -eq 0 ]; then
675        lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicInitfs"`
676    else
677        # get offet of gzip magic "1f8b0800" in file
678        lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}'`
679        [ $lvOffset -eq 0 ] && Die "gzip magic not found in file $lvKernelImage. Terminating."
680        lvOffset=`expr $lvOffset / 2`
681        echo "  GetInitrdFilesystemToUse(): gzip magic found at lvOffset $lvOffset.\n" >> $LOGFILE
682
683        # scan kernel image for initrd filessystem support
684        lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | gunzip -c 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicInitfs"`
685    fi
686
687    # determine which filesystem to use for initrd image: ext2fs, gzip'ed cpio (initramfs ) or cramfs
688    if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
689        lvUseFilesystem="ext2fs"
690    elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
691        lvUseFilesystem="initramfs"
692    elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
693        lvUseFilesystem="cramfs"
694    else
695        lvUseFilesystem="UNSUPPORTED"
696    fi
697
698    # say what we are using
699    echo "  GetInitrdFilesystemToUse(): Filesytem to use for initrd is $lvUseFilesystem.\n" >> $LOGFILE
700
701    # return file system to use
702    echo "$lvUseFilesystem"
703
704}
705
706# Searches parent raid device of given disk device
707# $1: disk device (i.e. /dev/hda1)
708GetParentRaidDev() {
709    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
710}
711
712
713# Searches members of raid device
714# $1: raid device (/dev/md...)
715GetRaidDevMembers() {
716    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
717}
718
719
720HackPathsToFailsafe() {
721    local incoming newpath kver stub i pwd
722    kver=`uname -r`
723    incoming=`ReadLine`
724    pwd=`pwd`
725    cd $MINDI_TMP
726    while [ "$incoming" != "" ] ; do
727        stub=`basename $incoming`
728        newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
729        for i in $newpath ; do
730            echo "$i"
731        done
732        read incoming
733    done
734    cd $pwd
735}
736
737
738ListAllPartitions() {
739    local res currline partition all_partitions ap_orig remaining i j
740
741    grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
742    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
743    if [ -e "/vmfs/volumes" ]; then
744        # For VMWare ESX 3 get the device names of these volumes
745        vdf -P | grep -E '/vmfs/volumes' | awk '{print $1}'
746    fi
747    return
748}
749
750
751ListImagesForUser() {
752    local path fname
753    path=$MINDI_CACHE
754    echo -en "In the directory '$path' you will find the images:-\n"
755    for fname in `ls $path | grep -F mindi-` ; do
756        printf "%19s " $fname
757    done
758    echo " "
759}
760
761
762ListKernelModulePaths() {
763    local module_list module fname oss r kern
764    oss="/root/oss/modules"
765    module_list="$MODULES"
766    # Remove unwanted modules from list
767    for i in $DENY_MODS; do
768        module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
769        EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
770    done
771###
772### Sq-Modification ... Use kernelname for module search path if specified
773###
774    # kern="`uname -r`"
775    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
776    then
777        kern=${kernelname}
778    else
779        kern="`uname -r`"
780    fi
781###
782### Sq-Mod End
783###
784    for module in $module_list $EXTRA_MODS ; do
785        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
786        echo "module $module --> $r" >> $LOGFILE
787        [ "$r" ] && echo "$r"
788        [ -f "$oss" ] && find $oss | grep -F $module
789    done
790    find /lib/modules/$kern/modules.* -type f 2> /dev/null
791    [ -f "$oss" ] && find $oss.* 2> /dev/null
792}
793
794#
795# Critical function which computes all dependencies (dyn. lib.)
796# for a list of binaries
797#
798LocateDeps() {
799    local incoming fname deps
800    incoming="$*"
801    for fname in $incoming ; do
802        if [ ! -e "$fname" ] ; then
803            echo "WARNING - $fname does not exist; cannot be LDD'd." >> $LOGFILE
804            if echo $fname | grep lvm &> /dev/null ; then
805                echo "This warning only affects you if you are using LVM." >> $LOGFILE
806                if echo "$MODULES" | grep lvm &> /dev/null ; then
807                    echo "I think you are, so please take heed!" >> $LOGFILE
808                else
809                    echo "I don't think you are, so don't worry about it." >> $LOGFILE
810                fi
811            fi
812        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
813            echo "$fname is softlink" >> $LOGFILE
814        else
815            ldd $fname 2> /dev/null | ProcessLDD
816        fi
817    done
818}
819
820
821# Give all symlinks recursively of a full path name
822ReadAllLink() {
823    file="$1"
824
825    echo $file | grep -q '\.\./'
826    if [ $? -eq 0 ]; then
827        # We need to normalise the path with .. in it
828        file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
829    fi
830    echo "$file"
831    if [ ! -h $file ]; then
832        return 0
833    fi
834
835    link=`readlink $file`
836    d=`dirname $file`
837    fchar=`echo $link | cut -c1`
838    # If mother dir is a link print it
839    if [ -h "$d" ]; then
840        echo "$d"
841        d=`readlink $d`
842    fi
843    if [ "$fchar" != "/" ]; then
844        # Relative or local link
845        ReadAllLink "$d/$link" 
846    else
847        # Absolute path
848        ReadAllLink $link 
849    fi
850}
851
852
853LocateFile() {
854    local i path fname_to_find location output resolved tmp stub cache_id loclist
855    fname_to_find="$1"
856    # It's an absolute path
857    if echo "$fname_to_find" | grep -x "/.*" ; then
858        output="$fname_to_find"
859        if [ -h "$output" ] ; then
860            output="`ReadAllLink $output` $output"
861        fi
862        echo "$output"
863        return 0
864    fi
865    # It's not an absolute path
866    output=""
867    for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin `find /usr/lib /lib /usr/local/lib /usr/X11R6/lib /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d -maxdepth 1 2> /dev/null` ; do
868    #for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/lib64 /usr/lib64/* /lib /lib64 /lib64/* /usr/local/lib /usr/local/lib64 /usr/local/lib64/* /usr/X11R6/lib /usr/X11R6/lib64 /usr/X11R6/lib64/* ; do
869        [ -h "$path" ] && continue
870        [ ! -e "$path/$fname_to_find" ] && continue
871        output="$path/$fname_to_find $output"
872        if [ -h "$path/$fname_to_find" ] ; then
873            output="`ReadAllLink $path/$fname_to_find` $output"
874        fi
875    done
876    if [ "$output" = "" ] ; then
877        return 1
878    fi
879    echo "$output"
880    return 0
881}
882
883
884LogIt() {
885    if [ -e /dev/stderr ] ; then
886        echo -e "$1" >> /dev/stderr
887    elif [ -e /usr/bin/logger ] ; then
888        /usr/bin/logger -s $1
889    fi
890    echo -e "$1" >> $LOGFILE
891    if [ _"$2" != _"" ]; then
892        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
893    fi
894    rm -f "$2"
895}
896
897
898# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
899MakeMondoConfigFile() {
900    local outfile use_lzo use_comp use_star
901    outfile=$1
902    > $outfile
903    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
904    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
905    [ "$USBDEVICE" ]            && echo "usb-dev $USBDEVICE" >> $outfile
906    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
907    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
908    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
909    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
910    use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
911    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
912    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
913    echo "use-lzo $use_lzo" >> $outfile
914    echo "use-gzip $use_gzip" >> $outfile
915    echo "use-star $use_star" >> $outfile
916    echo "use-comp $use_comp" >> $outfile
917    echo "datestamp `date`" >> $outfile
918    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
919    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-IPADDR nfs-client-ipaddr $outfile
920    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-NETMASK nfs-client-netmask $outfile
921    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-BROADCAST nfs-client-broadcast $outfile
922    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-DEFGW  nfs-client-defgw  $outfile
923    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-MOUNT  nfs-server-mount  $outfile
924    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-PATH   nfs-server-path   $outfile
925    AddFileToCfgIfExists $MINDI_TMP/NFS-DEV           nfs-dev           $outfile
926    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-IPADDR nfs-server-ipaddr $outfile
927    AddFileToCfgIfExists $MINDI_TMP/ISO-DEV           iso-dev           $outfile
928    AddFileToCfgIfExists $MINDI_TMP/ISO-MNT           iso-mnt           $outfile
929    AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX        iso-prefix        $outfile
930    AddFileToCfgIfExists $MINDI_TMP/ISODIR            isodir            $outfile
931    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
932    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
933    AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
934    AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
935    AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
936    AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL      differential      $outfile
937    AddFileToCfgIfExists $MINDI_TMP/ACL      acl      $outfile
938    AddFileToCfgIfExists $MINDI_TMP/XATTR      xattr      $outfile
939    AddFileToCfgIfExists $MINDI_TMP/OBDR      obdr      $outfile
940}
941
942
943MakeMountlist() {
944    local scratchdir mountlist all_partitions current_partition \
945partition_size partition_format outstring partition_number \
946partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
947absolute_partition old_partition_fmt current_lvolume uname skip
948
949    echo "Your raw fstab file looks like this:" >> $LOGFILE
950    echo "------------------------------------" >> $LOGFILE
951    cat $MY_FSTAB >> $LOGFILE
952    echo "Your mountlist will look like this:" | tee -a $LOGFILE
953    echo "-----------------------------------" >> $LOGFILE
954
955# scratchdir, mountlist(OUT)
956    scratchdir=$MINDI_TMP
957    mountlist=$1
958
959# NB: partition = device
960# NB: mountpt = where the device is mounted
961
962    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
963
964    [ "$mountlist" != "" ] && rm -Rf $mountlist
965    > $mountlist
966    all_partitions=""
967   
968    if [ $LVM != "false" ]; then
969        echo -en "Analyzing LVM...\n"
970        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
971        if [ $? -ne 0 ]; then
972            LVM="false"
973        fi
974        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-32`
975    fi
976    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
977#    echo "all partitions = $all_partitions" > /dev/stderr
978    for i in $IMAGE_DEVS ; do
979        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
980    done
981    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
982    printf "        %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
983    useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1"
984    for c_p in $all_partitions ; do
985        [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
986        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
987        if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
988            current_partition=`readlink -f $c_p`
989            [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
990            [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
991        else
992            current_partition="$c_p"
993        fi
994        [ "$c_p" = "none" ] && continue
995        redhat_label=""
996        label=""
997        uuid=""
998        absolute_partition=`readlink -f $c_p`
999        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1000
1001        # Detects noauto partitions not mounted and exclude them
1002        partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1003        if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" =  "" ] ; then
1004            continue
1005        fi
1006
1007        # set default in case we dont't find it
1008        str_to_find_fmt_with=$current_partition
1009
1010        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1011        # current_partition contains only first column of /etc/fstab
1012        if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1013            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1014            actual_dev=""
1015
1016            # 1st try, findfs - the RHEL way of finding labels and their partitions
1017            if [ -x "/sbin/findfs" ]; then
1018                actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1019            fi
1020   
1021            # 2nd try : blkid, the good way for all LABEL except swap
1022            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1023                actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1024                # For LVM FS it will give a /dev/dm-# which should then be converted
1025                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1026                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1027                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1028                    for dev in `ls /dev/mapper/*`; do
1029                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1030                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1031                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1032                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1033                            break
1034                        fi
1035                    done
1036                fi
1037            fi
1038   
1039            # 3rd try, which works on a standard partition (ext2/3), but not on swap
1040            # For LVM gives a /dev/mapper entry
1041            if [ "x$actual_dev" = "x" ]; then
1042                actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1043            fi
1044   
1045            # 4th try, with vol_id
1046            # SWAP only
1047            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1048                list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1049                for dev_swap in $list_swaps ; do
1050                    dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1051                    if [ "x$dev_exists" != "x" ]; then
1052                        actual_dev=$dev_swap
1053                        break;
1054                    fi
1055                done
1056            fi
1057
1058            # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1059            # LABEL=SW-cciss/c0d0p3 (RDP)
1060            # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1061            # SWAP only
1062            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1063                    skip=""
1064                    uname="`uname -r`"
1065                    [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1066                    # 2.6.12 needs 16 (FC3)
1067                    [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1068                    # 2.6.19 and upper needs 1052
1069                    [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1070                    [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1071                    if [ $skip = "" ]; then
1072                        Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1073                    fi
1074                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1075                    do
1076                        # Location of the swap label for kernel 2.6
1077                        try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1078                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1079                            actual_dev=$try_dev
1080                        fi
1081                    done
1082            fi
1083
1084            # Check if one of all those tries has known success
1085            if [ "x$actual_dev" != "x" ]; then
1086                current_partition=$actual_dev
1087            else
1088                Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or install findfs|blkid|vol_id"
1089            fi
1090        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1091        # current_partition contains only first column of /etc/fstab
1092        elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1093            uuid=`echo "$current_partition" | cut -d'=' -f2`
1094            actual_dev=""
1095
1096            # 1st try, findfs - the RHEL way of finding labels and their partitions
1097            if [ -x "/sbin/findfs" ]; then
1098                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1099            fi
1100   
1101            # 2nd try : blkid, the good way for all UUID except swap
1102            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1103                actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1104                # For LVM FS it will give a /dev/dm-# which should then be converted
1105                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1106                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1107                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1108                    for dev in `ls /dev/mapper/*`; do
1109                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1110                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1111                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1112                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1113                            break
1114                        fi
1115                    done
1116                fi
1117            fi
1118   
1119            # 3th try, with vol_id
1120            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1121                list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1122                for dev in $list_dev ; do
1123                    dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1124                    if [ "x$dev_exists" != "x" ]; then
1125                        actual_dev=$dev
1126                        break;
1127                    fi
1128                done
1129            fi
1130
1131            # 4th try, with dumpuuid (VMWare only ?) for swap
1132            if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1133                list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1134                for dev in $list_dev ; do
1135                    dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1136                    if [ "x$dev_exists" != "x" ]; then
1137                        actual_dev=$dev
1138                        break;
1139                    fi
1140                done
1141            fi
1142
1143            # Check if one of all those tries has known success
1144            if [ "x$actual_dev" != "x" ]; then
1145                current_partition=$actual_dev
1146            else
1147                Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
1148            fi
1149        else
1150            # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1151            # they use symlinks in fstab unrelated to what is shown in mount !
1152            if [ _"$partition_mountpt" = _"" ]; then
1153                # set default in case we dont't find it
1154                for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1155                        if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1156                            str_to_find_fmt_with=$tmpp
1157                            partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1158                            break;
1159                        fi
1160                done
1161            fi
1162        fi
1163
1164        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1165        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1166        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1167        # the former is then a link to the latter, so we test whether
1168        # $current_partition is actually such a link or not and set
1169        # $current_lvolume accordingly. On Debian you may find more than one answer
1170        # so we remove the one corresponding to /dev/.static
1171        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1172        # principle is the same and we need to find the link to it as well.
1173        # Note that $current_lvolume may well be an
1174        # ordinary device. It is just to make sure that we feed the right value
1175        # into any of the LVM tools if possible.
1176
1177        current_lvolume="$current_partition"
1178        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1179            # .static dir are a Debian specificity
1180            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1181            echo $current_lvolume | grep -q ' '
1182            if [ $? -eq 0 ]; then
1183                echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE 
1184            fi
1185            # if it's not found, it may well be a real device such as a multipath one
1186            # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1187            if [ _"$current_lvolume" = _"" ]; then
1188                current_lvolume="$current_partition"
1189            fi
1190        fi
1191        #
1192        # End of LVM device style variation code (other than $current_lvolume).
1193
1194        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1195            # Size computed via LVM not directly
1196            partition_size="lvm"
1197        else
1198            partition_size=`SizeOfPartition $current_partition`
1199            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1200            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1201            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1202                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1203                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1204                [ "$partition_format" != "swap" ] && partition_format="swap"
1205                if [ "$partition_size" = "" ] ; then
1206                    totalsize=0
1207                    items=0
1208                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1209                        totalsize=$(($totalsize+$i))
1210                        items=$(($items+1))
1211                    done
1212                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1213                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1214                    echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1215                fi
1216            fi
1217        fi
1218        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1219        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1220        if [ "$partition_mountpt" = "" ] ; then
1221            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1222                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1223                    partition_mountpt="raid"
1224                    partition_format="raid"
1225                else
1226                    partition_mountpt="lvm"
1227                    partition_format="lvm"
1228                fi
1229            fi
1230        fi
1231        psz=$partition_size
1232        echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1233        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1234        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1235            partition_mountpt="image"
1236            old_partition_fmt=$partition_format
1237            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1238            partition_size=$(($partition_size+1)); # just in case
1239            if [ "$partition_format" = "Linux" ] ; then
1240                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1241                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1242                partition_format=$old_partition_fmt
1243            fi
1244        fi
1245        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1246            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1247            continue
1248        fi
1249        if [ ! "$partition_mountpt" ] ; then
1250            echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1251            for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1252                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1253                [ "$partition_format" ] && break
1254            done
1255            echo "------- $FDISK log end ------------" >> $LOGFILE
1256            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1257                partition_format="compaq"
1258            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1259                LogIt "Unable to find mountpoint of $current_partition - ignoring"
1260                continue
1261            fi
1262        fi
1263        if [ "$redhat_label" ]; then
1264            label="$redhat_label"
1265        elif [ "$uuid" ]; then
1266            label="$uuid"
1267        fi
1268        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1269        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1270        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1271        if [ "$current_partition" = "" ] ; then
1272            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1273        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1274            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1275                partition_mountpt=raid
1276                partition_format=raid
1277                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1278                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1279            else
1280                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1281            fi
1282        elif [ "$partition_format" = "" ] ; then
1283            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1284        elif [ "$partition_size" = "" ] ; then
1285            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1286        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1287            continue
1288        else
1289            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1290                echo "Stupid bastard..." >> $LOGFILE
1291                partition_format="vfat"
1292            fi
1293            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1294            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1295        fi
1296    done
1297}
1298
1299
1300MakeSureNumberIsInteger() {
1301    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1302    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1303    echo "result = '$res'"
1304        Die "$1 should be an integer"
1305    fi
1306}
1307
1308
1309OfferToMakeBootableISO() {
1310    local i old_pwd
1311    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1312        echo -en "Shall I make a bootable CD image? (y/[n]) "
1313        read i
1314        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1315    fi
1316    rm -Rf $MINDI_TMP/iso
1317    mkdir -p $MINDI_TMP/iso/{images,archives}
1318    cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1319    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1320    for i in memdisk memtest.bin memtest.img ; do
1321        j=$MINDI_LIB/$i
1322        k=$MINDI_TMP/iso
1323        if [ -e "$j" ] ; then
1324            LogIt "Copying $j to $k"
1325            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1326            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1327            if [ _"$MONDO_SHARE" != _"" ]; then 
1328                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1329            fi
1330        fi
1331    done
1332    MakeMessageFile > $MINDI_TMP/iso/message.txt
1333    cp $kernelpath $MINDI_TMP/iso/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/iso/vmlinuz). Did you run out of disk space?"
1334    cp $MINDI_TMP/initrd.img $MINDI_TMP/iso/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MINDI_TMP/iso/initrd.img. Did you run out of disk space?"
1335    if [ _"$MONDO_SHARE" != _"" ]; then 
1336        cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
1337        cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
1338    fi
1339    MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1340    if [ "$ARCH" != "ia64" ] ; then
1341        cp $ISOLINUX $MINDI_TMP/iso/isolinux.bin 2>> $LOGFILE || Die "Cannot copy isolinux.bin ($ISOLINUX) to $MINDI_TMP/iso - did you run out of disk space?"
1342    fi
1343    old_pwd=`pwd`
1344    cd $MINDI_TMP/iso
1345    if [ "$ARCH" != "ia64" ] ; then
1346        if [ _"$MONDO_SHARE" != _"" ]; then 
1347            cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1348            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1349        fi
1350        $ISO_CMD -U $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
1351    else
1352        $ISO_CMD $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c images/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
1353        rm -f images/mindi-bootroot.$BOOT_SIZE.img
1354    fi
1355    if [ "$?" -ne "0" ] ; then
1356        echo "----------- $ISO_CMD's errors --------------" >> $LOGFILE
1357        cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1358        echo "$ISO_CMD returned the following errors:-"
1359        cat $MINDI_TMP/mkisofs.log
1360        LogIt "Failed to create ISO image."
1361    else
1362        echo "Created bootable ISO image at $MINDI_CACHE/mindi.iso" | tee -a $LOGFILE
1363    fi
1364    rm -f $MINDI_TMP/mkisofs.log
1365    cd $old_pwd
1366}
1367
1368
1369OfferToMakeBootableUSB() {
1370    local i
1371    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1372        echo -n "Shall I make a bootable USB image ? (y/[n]) "
1373        read i
1374        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1375        if [ "$USBDEVICE" = "" ]; then
1376            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1377            read dev
1378            USBDEVICE=$dev
1379        fi
1380        echo "WARNING: This will erase all content on $USBDEVICE"
1381        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1382        read i
1383        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1384    fi
1385    rm -Rf $MINDI_TMP/usb
1386    mkdir -p $MINDI_TMP/usb
1387    USBPART="${USBDEVICE}1"
1388
1389    echo -en "Transforming $USBDEVICE in a Bootable device " 
1390    echo -en "."
1391    echo "Transforming $USBDEVICE in a Bootable device"  >> $LOGFILE
1392    echo "Checking $USBDEVICE" >> $LOGFILE
1393    $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1394    if [ $? -ne 0 ]; then
1395        echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1396        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1397        exit -1
1398    fi
1399    echo -en "."
1400    echo "Unmounting $USBDEVICE just in case" >> $LOGFILE
1401    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1402    # If your key has no MBR it may cause an issue
1403    # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1404    echo "Preparing $USBDEVICE" >> $LOGFILE
1405    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1406d
1407d
1408d
1409d
1410n
1411p
14121
1413
1414
1415t
1416b
1417a
14181
1419w
1420EOF
1421    if [ $? -ne 0 ]; then
1422        echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1423        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1424        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1425        MindiExit -1
1426    fi
1427    echo -en "."
1428    echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
1429    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1430    if [ $? -ne 0 ]; then
1431        echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1432        echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1433        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1434        MindiExit -1
1435    fi
1436    echo -en "."
1437    echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1438    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1439    if [ $? -ne 0 ]; then
1440        echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1441        echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1442        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1443        MindiExit -1
1444    fi
1445    echo -en "."
1446    mkdir -p $MINDI_TMP/usb/images
1447    cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1448    echo -en "."
1449    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1450    for i in memdisk memtest.bin memtest.img ; do
1451        j=$MINDI_LIB/$i
1452        k=$MINDI_TMP/usb
1453        if [ -e "$j" ] ; then
1454            LogIt "Copying $j to $k"
1455            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1456            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1457        fi
1458    done
1459    echo -en "."
1460    MakeMessageFile > $MINDI_TMP/usb/message.txt
1461    echo -en "."
1462    cp $kernelpath $MINDI_TMP/usb/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/vmlinuz). Did you run out of disk space?"
1463    echo -en "."
1464    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1465    echo -en "."
1466    MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1467    echo -en "."
1468    umount $MINDI_TMP/usb
1469    if [ "$ARCH" != "ia64" ] ; then
1470        syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1471        if [ "$?" -ne "0" ] ; then
1472            echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1473            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1474            LogIt "Failed to create USB image."
1475        else
1476            echo -e "$DONE"
1477            echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1478        fi
1479        rm -f $MINDI_TMP/syslinux.log
1480    else
1481        echo "No USB boot support for ia64" | tee -a $LOGFILE
1482        MindiExit -1
1483    fi
1484}
1485
1486
1487MakeMessageFile() {
1488    iss="/dev/null"
1489    [ -e /etc/issue ] && iss="/etc/issue"
1490    [ -e /etc/issue.net ] && iss="/etc/issue.net"
1491    if [ "`grep -Fi "debian" $iss 2> /dev/null`" ] ; then
1492        sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s%DDDDD%"Debian GNU\/`uname -s` `cut -d ' ' -f 3 $iss` `hostname`"% | sed s/KKKKK/"Kernel `uname  -r` on a `uname -m`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/%r/"`uname -r`"/ | sed s/%t/"`hostname`"/
1493    else
1494        sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s/DDDDD/"`grep -i "linux" $iss | sed s~/~~ | head -n1 | tr -s ' ' ' '`"/ | sed s/KKKKK/"`grep -i "kernel" $iss | sed s~/~~ | head -n1 | tr -s ' ' ' '`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/' 'r' 'on' 'an' 'm/' '`uname -r`' 'on' 'an' '`uname -m`/ | sed s/%r/"`uname -r`"/ | sed s/%t/"`hostname`"/
1495    fi
1496    if [ _"$MONDO_SHARE" != _"" ]; then
1497        if [ "$CDRECOVERY" != "yes" ] ; then
1498            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1499                echo -en "Press <enter> to continue.\n"
1500            elif [ ! "$MINDI_TMP" ] ; then
1501                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1502                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1503                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1504                fi
1505            else
1506                echo -en "$BOOT_MEDIA_MESSAGE"
1507            fi
1508        else
1509            echo -en "\
1510To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1511CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1512        fi
1513    fi
1514    echo -en "\n\n\n"
1515}
1516
1517
1518MakeBootConfFile() {
1519    local options i ooo
1520    options=""
1521    # Type of boot file (elilo or syslinux/isolinux)
1522    type=$1
1523    if [ "$type" = "elilo" ]; then
1524        sep="="
1525    else
1526        sep=" "
1527    fi
1528
1529    # Generic header for conf file
1530    if [ "$type" != "elilo" ] ; then
1531        echo -en "prompt 1\ndisplay message.txt\n"
1532    else
1533        echo -en "prompt\n"
1534    fi
1535
1536    # Compute which default option to boot from
1537    if [ "$CDRECOVERY" = "yes" ] ; then
1538        echo -en "default${sep}RESTORE\n"
1539    # In case it's mondoarchive
1540    elif [ _"$MONDO_SHARE" != _"" ]; then
1541        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1542            echo -en "default${sep}iso\n"
1543        else
1544            echo -en "default${sep}interactive\n"
1545        fi
1546    else
1547        echo -en "default${sep}expert\n"
1548    fi
1549
1550    # Handle timeout
1551    if [ "$CDRECOVERY" != "yes" ] ; then
1552        echo -en "timeout${sep}300\n"
1553    else
1554        echo -en "timeout${sep}10000\n"
1555    fi
1556    echo -en "\n"
1557
1558    # prepare which labels will be generated
1559    if [ "$CDRECOVERY" = "yes" ] ; then
1560        options="RESTORE expert"
1561    else
1562        if [ _"$MONDO_SHARE" != _"" ]; then
1563            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1564                options="iso"
1565            else
1566                options="interactive expert compare iso nuke isonuke"
1567            fi
1568        else
1569            options="expert"
1570        fi
1571    fi
1572
1573    # Generate rest of conf file
1574    for i in $options ; do
1575        ooo=$i
1576        [ "$ooo" = "RESTORE" ] && ooo="nuke"
1577        if [ "$type" = "elilo" ]; then
1578            outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/initrd.img\n\troot=/dev/ram0 append=\" rw ramdisk_size=$ramdisk_size $ooo $ADDITIONAL_BOOT_PARAMS \"\n"
1579        else
1580            ps="/"
1581            if [ "$type" = "syslinux" ]; then
1582                ps=""
1583            fi
1584            outstr="label $i\n\tkernel ${ps}vmlinuz\n\tappend initrd=${ps}initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $ADDITIONAL_BOOT_PARAMS\n"
1585        fi
1586        echo -en "$outstr"
1587    done
1588
1589    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1590        if [ "$type" = "elilo" ]; then
1591            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1592            echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1593        else
1594            ps="/"
1595            if [ "$type" = "syslinux" ]; then
1596                ps=""
1597            fi
1598            echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1599            echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1600        fi
1601    fi
1602}
1603
1604
1605PrepareBootDiskImage_LILO() {
1606    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1607    imagesdir=$MINDI_CACHE
1608    kernelpath=$1
1609
1610    retval=0
1611    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1612    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1613    TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1614    echo -en "..."
1615    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1616    mountpoint=$MINDI_TMP/mountpoint.$$
1617    mkdir -p $mountpoint
1618    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1619    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1620    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1621    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1622    mkdir -p $mountpoint/etc
1623    liloconf=$mountpoint/elilo.conf
1624
1625    MakeBootConfFile elilo > $liloconf
1626
1627    # Copy it so that CD-ROM menu entry is satisfied
1628    mountefi=0
1629    df -T | grep /boot/efi | grep -q vfat
1630    if [ $? -ne 0 ]; then
1631        mount /boot/efi
1632        if [ $? -ne 0 ]; then
1633            echo "You have to mount your EFI partition when using mindi"
1634            MindiExit -1
1635        fi
1636        mountefi=1
1637    fi
1638    el=`find /boot/efi -name elilo.efi`
1639    cp $el $mountpoint
1640    cp $liloconf $mountpoint
1641    if [ $mountefi -eq 1 ]; then
1642        umount /boot/efi 2>&1 > /dev/null
1643    fi
1644
1645    echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1646    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1647    if [ "$?" -ne "0" ] ; then
1648        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1649        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1650        LogIt "Please unload some of your modules and try again."
1651        rm -f $MINDI_TMP/mtpt.$$
1652        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1653        retval=$(($retval+1))
1654    fi
1655    MakeMessageFile > $mountpoint/message.txt
1656
1657    mkdir -p $mountpoint/tmp
1658    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1659        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1660    fi
1661
1662    # copy the kernel across
1663    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1664    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1665    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1666    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1667    if [ "$?" -ne "0" ] ; then
1668        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1669        du -sk $mountpoint/* >> $LOGFILE
1670        echo "--- end of list of files ---" >> $LOGFILE
1671        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1672Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1673        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1674        cd $old_pwd
1675        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1676        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1677    #   losetup /dev/loop0 -d
1678        [ "$imagefile" != "" ] && rm -f $imagefile
1679        return 0
1680    fi
1681    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1682    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1683    echo "Free space left on image = $free_space KB" >> $LOGFILE
1684    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1685    # make it bootable
1686    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1687    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1688    if [ "$KERN_DISK_MADE" ] ; then
1689        echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1690    fi
1691
1692    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1693    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1694    echo -en "..."
1695    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1696    if [ "$retval" -eq "0" ] ; then
1697        echo -en "...$DONE\n"
1698        if [ "$KERN_DISK_MADE" ] ; then
1699            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1700        fi
1701    else
1702        echo -en "...failed\n"
1703        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1704        [ "$imagefile" != "" ] && rm -f $imagefile
1705    fi
1706    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1707    return $retval
1708}
1709
1710
1711PrepareBootDiskImage_ISOLINUX() {
1712    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1713    imagesdir=$MINDI_CACHE
1714    kernelpath=$1
1715    do_boot_root_thingy=""
1716    local retval old_pwd
1717    retval=0
1718
1719    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1720    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1721    TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1722    echo -en "..."
1723    imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1724    mountpoint=$MINDI_TMP/mountpoint.$$
1725    mkdir -p $mountpoint
1726    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1727    echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1728    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1729    # syslinux should be run on a  local file (doen't work through NFS Cf: #297)
1730    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1731
1732    # Only move it now to its final destination abd use it now
1733    mv $imagefile $imagesdir
1734    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1735
1736    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1737
1738    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1739    MakeMessageFile > $mountpoint/message.txt
1740    MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1741    echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1742    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1743    if [ "$?" -ne "0" ] ; then
1744        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1745        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1746        LogIt "Please unload some of your modules and try again."
1747        rm -f $MINDI_TMP/mtpt.$$
1748        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1749        retval=$(($retval+1))
1750    fi
1751
1752    mkdir -p $mountpoint/tmp
1753    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1754        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1755    fi
1756
1757    # copy the kernel across
1758    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1759    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1760    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1761    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1762    if [ "$?" -ne "0" ] ; then
1763        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1764        du -sk $mountpoint/* >> $LOGFILE
1765        echo "--- end of list of files ---" >> $LOGFILE
1766        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1767Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1768        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1769        cd $old_pwd
1770        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1771        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1772
1773        [ "$imagefile" != "" ] && rm -f $imagefile
1774        return 0
1775    fi
1776    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1777    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1778    echo "Free space left on image = $free_space KB" >> $LOGFILE
1779    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1780
1781    # make it bootable
1782    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1783    mkdir -p $mountpoint/etc
1784    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1785    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1786    echo -en "..."
1787    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1788
1789    if [ "$retval" -eq "0" ] ; then
1790        echo -en "...$DONE\n"
1791        if [ "$KERN_DISK_MADE" ] ; then
1792            [ "$imagefile" != "" ] && rm -f $imagefile
1793            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1794        fi
1795    else
1796        echo -en "...failed\n"
1797        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1798        [ "$imagefile" != "" ] && rm -f $imagefile
1799    fi
1800    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1801    return $retval
1802}
1803
1804
1805ParseModprobeForIncludes() {
1806local MODPROBE_CONF mpincfile includes include
1807
1808MODPROBE_CONF=/etc/modprobe.conf
1809mpincfile=$1
1810touch $mpincfile
1811if [ -a $MODPROBE_CONF ]; then
1812    includes=$(awk '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
1813    if [ -n "$includes" ]; then
1814        for include in $includes
1815        do
1816            if [ -a "$include" ]; then
1817                echo $include >> $mpincfile
1818            fi
1819        done
1820    fi
1821fi
1822}
1823
1824
1825PrepareDataDiskImages() {
1826    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
1827
1828    imagesdir=$MINDI_CACHE
1829    rm -f $imagesdir/mindi.iso
1830    needlist=$MINDI_TMP/what-we-need.txt
1831    bigdir=$MINDI_TMP/bigdir
1832    mkdir -p $bigdir/usr/bin
1833    mkdir -p $bigdir/usr/sbin
1834    includefile=$MINDI_TMP/$$.includefile.txt
1835
1836    lfiles="$DEPLIST_FILE"
1837    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1838    ParseModprobeForIncludes $includefile
1839    lines=$(($lines+`cat $includefile | wc -l`))
1840    cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
1841    res=$?
1842    rm -f $includefile
1843    if [ "$YOUR_KERNEL_SUCKS" ]; then
1844        pwd=`pwd`
1845        cd $MINDI_TMP
1846        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1847            tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
1848        done
1849        for i in $EXTRA_MODS ; do
1850            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1851            [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
1852            for k in $j ; do
1853                tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
1854                echo "Added failsafe module $k to ramdisk" >> $LOGFILE
1855            done
1856        done
1857        cd $pwd
1858    else
1859        ListKernelModulePaths >> $needlist
1860    fi
1861    if [ "$res" -ne "0" ] ; then
1862        Die "You have $res files present in dependency list\nbut absent from filesystem."
1863    fi
1864    FindAndAddUserKeyboardMappingFile
1865    mkdir -p $bigdir/tmp
1866    if [ _"$MONDO_SHARE" != _"" ]; then
1867        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1868        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1869    fi
1870    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1871    DropOptimizedLibraries $needlist $bigdir
1872    echo -en "Assembling dependency files"
1873    CopyDependenciesToDirectory < $needlist $bigdir
1874
1875    # also copy io.sys and msdos.sys, if we can find them
1876    for i in `mount | cut -d' ' -f3` ; do
1877        for j in io.sys msdos.sys ; do
1878            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1879        done
1880    done
1881
1882    # master boot record, too
1883    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1884    if [ "$i" ] ; then
1885        LogIt "Backing up $i's MBR"
1886        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1887        sleep 1
1888        sync
1889        j=$i
1890        [ -h "$j" ] && j=`readlink -f $j`
1891        LogIt "Creating /dev/boot_device ($j)"
1892        mkdir -p $bigdir/dev
1893        cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
1894    fi
1895
1896    old_pwd=`pwd`
1897    cd $bigdir
1898
1899    # Get terminfo content
1900    ti="usr/share/terminfo/l"
1901    if [ -d /$ti ]; then
1902        mkdir -p $ti
1903        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
1904    fi
1905    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1906        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1907        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1908    fi
1909    [ -d "/lib/dev-state" ] && tar cf - -C / /lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1910    cd $old_pwd
1911    echo -e "$DONE"
1912    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1913    MakeMountlist $MINDI_TMP/mountlist.txt
1914    mkdir -p $bigdir/tmp
1915    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1916    if [ _"$MONDO_SHARE" != _"" ]; then
1917        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1918    fi
1919    if [ $LVM != "false" ]; then
1920        $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1921        if [ "$?" -ne "0" ]; then
1922            LVM="false"
1923            rm -f $bigdir/tmp/i-want-my-lvm
1924        fi
1925    fi
1926    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
1927    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1928    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
1929    if [ _"$MONDO_SHARE" != _"" ]; then
1930        for q in filelist.full.gz biggielist.txt ; do
1931            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1932            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1933        done
1934    fi
1935
1936    echo -en "Tarring and zipping the data content..."
1937    size_of_all_tools=`du -sk $bigdir | cut -f1`
1938    (cd $bigdir ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogIt "Problem creating all.tar.gz" $MINDI_TMP/$$.log)
1939    du -sk $imagesdir/*gz >> $LOGFILE
1940    echo -e "$DONE"
1941
1942    FRIENDLY_OUTSTRING="Boot and data disk images were created."
1943    rm -rf $bigdir
1944    rm -f $needlist
1945}
1946
1947
1948ProcessLDD() {
1949    local incoming f d nd bd bnd
1950    read incoming
1951    while [ "$incoming" != "" ]; do
1952        # We take the full path name of the dyn. lib. we want
1953        incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1954        for f in $incoming ; do
1955            # echo modified file name if one of the parent dir is a link
1956            # by replacing the original dirname by the destination of the link
1957            d="`dirname $f`"
1958            found="false"
1959            while [ "$d" != "/" ]; do
1960                if [ -h "$d" ]; then
1961                    nd=`readlink -f $d`
1962                    bd=`basename $d`
1963                    bnd=`basename $nd`
1964                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
1965                    echo $d
1966                fi
1967                d="`dirname $d`"
1968            done
1969
1970            echo "$f"
1971            echo "`ReadAllLink $f`"
1972        done
1973        read incoming
1974    done
1975}
1976
1977
1978Prompt() {
1979    echo -en "$1"
1980    read line
1981}
1982
1983
1984ReadLine() {
1985    local i incoming
1986    read incoming
1987    i=0
1988    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
1989        i=$(($i+1))
1990        read incoming
1991    done
1992    echo "$incoming"
1993}
1994
1995
1996SizeOfPartition() {
1997    local devpath drive res stub
1998    device=$1
1999    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2000        res=`SizeOfRaidPartition $device`
2001        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2002        echo "$res"
2003        return 0
2004    fi
2005    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2006    res=`$FDISK -s $device 2>> $LOGFILE`
2007    # end patch
2008    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2009    [ "$res" = "" ] && res="-1"
2010    echo $res
2011    return 0
2012}
2013
2014
2015SizeOfRaidPartition() {
2016    local real_dev smallest_size silly tmp
2017
2018    silly=999999999
2019    smallest_size=$silly
2020
2021    for real_dev in `GetRaidDevMembers $1` ; do
2022        tmp=`SizeOfPartition $real_dev`
2023        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2024    done
2025
2026    if [ "$smallest_size" = "$silly" ] ; then
2027        echo "-1"
2028        return 1
2029    else
2030        echo "$smallest_size"
2031        return 0
2032    fi
2033}
2034
2035
2036StripComments()
2037{
2038    local tempfile
2039
2040    tempfile=$MINDI_TMP/$$.strip.txt
2041    cp -f $1 $tempfile 2>> $LOGFILE
2042    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2043    rm -f $tempfile
2044    echo "Stripped comments from $2" >> $LOGFILE
2045}
2046
2047
2048
2049StripExecutable()
2050{
2051    local tmpfile
2052
2053    tmpfile=$MINDI_TMP/stripped.$$.dat
2054    [ -d "$1" ] || [ -h "$1" ] && return
2055    cp -f $1 $tmpfile 2>> $LOGFILE
2056    strip $tmpfile 2> /dev/null
2057    if [ "$?" -eq "0" ] ; then
2058        cp -f $tmpfile $1 2>> $LOGFILE
2059        echo "Stripped binary $2" >> $LOGFILE
2060    fi
2061    rm -f $tmpfile
2062}
2063
2064
2065TryToFindKernelPath() {
2066    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2067
2068    we_want_version=`uname -r`
2069    possible_kernels=""
2070    duff_kernels=""
2071   
2072    if [ "$ARCH" = "ia64" ] ; then
2073       root="/boot/efi/efi"
2074    else
2075       root="/"
2076    fi
2077    for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2078        [ ! -e "$fname" ] && continue
2079        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2080        file $fname | grep -q gzip
2081        if [ "$?" -eq "0" ] ; then
2082            # Used by ia64
2083            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2084        else
2085            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2086        fi
2087        [ "$fkern_ver" = "" ] && continue
2088        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2089        [ -f "$fname" ] || continue
2090        [ -h "$fname" ] && continue
2091        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2092        file $fname | grep -q gzip
2093        if [ "$?" -eq "0" ] ; then
2094            # Used by ia64
2095            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2096                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2097                duff_kernels="$fname $duff_kernels"
2098            else
2099                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2100                possible_kernels="$fname $possible_kernels"
2101            fi
2102        else
2103            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2104                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2105                duff_kernels="$fname $duff_kernels"
2106            else
2107                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2108                possible_kernels="$fname $possible_kernels"
2109            fi
2110        fi
2111    done
2112    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2113        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2114    fi
2115    if [ ! "$possible_kernels" ] ; then
2116        LogIt "No kernel matches exactly. Are there any duff kernels?"
2117        possible_kernels="$duff_kernels"
2118        if [ ! "$possible_kernels" ] ; then
2119            LogIt "Sorry, no duff kernels either"
2120        else
2121            LogIt "I bet you're running Debian or Gentoo, aren't you?"
2122            LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2123        fi
2124    fi
2125    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2126    noof_kernels=`CountItemsIn "$possible_kernels"`
2127    if [ "$noof_kernels" -eq "0" ] ; then
2128        LogIt "Could not find your kernel."
2129        if [ -e "/boot/vmlinuz" ] ; then
2130            LogIt "Using /boot/vmlinuz as a last resort."
2131            output=/boot/vmlinuz
2132        else
2133            output=""
2134        fi
2135    elif [ "$noof_kernels" -eq "1" ] ; then
2136        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2137        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2138        output="$kernelpath"
2139    else
2140        for i in $possible_kernels ; do
2141            if echo $i | grep "`uname -r`" ; then
2142                LogIt "OK, I used my initiative and found that "
2143                LogIt "$i is probably your kernel. "
2144                output="$i"
2145                return
2146            fi
2147        done
2148        if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2149            output=/boot/vmlinuz
2150            echo "Schlomo, this one's for you." >> $LOGFILE
2151        else
2152            LogIt "Two or more possible kernels found. You may specify any one of them and the "
2153            LogIt "boot disks will still work, probably. If one does not work, try another."
2154            LogIt "$possible_kernels"
2155            echo ""
2156        fi
2157    fi
2158    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2159}
2160
2161
2162TurnTgzIntoRdz() {
2163    local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2164
2165    tgz_dir_fname=$1
2166    rdz_fname=$2
2167    kernelsize=$3
2168    maxsize=$(($BOOT_SIZE-$kernelsize))
2169    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2170    tempfile=$MINDI_TMP/temp.rd
2171    mountpoint=$MINDI_TMP/mnt1
2172    res=0
2173    echo -en "..."
2174    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2175    echo -en "..."
2176    echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2177    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2178    echo -en "..."
2179    mkdir -p $mountpoint
2180    mount -t ext2 -o loop $tempfile $mountpoint || Die "Cannot loopmount $tempfile to $mountpoint! The reason may be missing support for loopfs or ext2 (or both) in the running kernel."
2181    echo -en "..."
2182    old_pwd=`pwd`
2183    cd $mountpoint
2184
2185    # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2186    if [ -h "/lib64" ]; then
2187        mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2188        ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2189    fi
2190
2191    cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2192    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2193
2194    cd dev || Die "Can't cd to dev"
2195    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2196    rm -f dev-entries.tgz
2197    cd ..
2198
2199    for w in insmod.static insmod.static.old ; do
2200        s=`which $w 2> /dev/null`
2201        if [ -e "$s" ] ; then
2202            tar cf - -C / $s 2> /dev/null | tar xf -
2203        fi
2204    done
2205
2206    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2207
2208    # Handle the case where busybox and mount are dynamically linked
2209    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2210    if [ $? -eq 0 ]; then
2211        # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2212        rm -f bin/mount $MINDI_TMP/busy.lis
2213        mountlis=`grep mount $DEPLIST_FILE`
2214        for f in $MINDI_LIB/rootfs/bin/busybox $mountlis ; do
2215            if [ -f $f ]; then
2216                LocateDeps $f >> $MINDI_TMP/busy.lis
2217            fi
2218        done
2219        tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
2220        rm -f $MINDI_TMP/busy.lis
2221    fi
2222
2223    # Copy of files mandatory for ld.so
2224    cp -rp /etc/ld.so.c* $mountpoint/etc
2225
2226    # Avoid an issue on some distro (RHEL5)
2227    rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2228
2229    mkdir -p $mountpoint/tmp
2230    # Management of udev (which includes modprobe in rules)
2231    ps auxww | grep -v grep | grep -qw udevd
2232    if [ $? -eq 0 ]; then
2233        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2234        LogIt "udev device manager found"
2235        tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2236        # This avoids NIC remapping if on another machine at restore time on Debian at least
2237        rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2238        # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2239        rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2240        tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2241        if [ -x /sbin/udevd ]; then
2242            lis2=`grep -Ev '^#' $MINDI_CONF/udev.files` 
2243            lis=""
2244            # Get only the files which exist in that list
2245            # and potentially their symlink structure
2246            for i in $lis2; do
2247                if [ -h $i ]; then
2248                    j=$i
2249                    while [ -h $j ]; do
2250                        lis="$lis $j"
2251                        j=`readlink $j`
2252                    done
2253                    lis="$lis $j"
2254                elif [ -f $i ]; then
2255                    lis="$lis $i"
2256                fi
2257            done
2258            # And their deps
2259            LocateDeps $lis > $MINDI_TMP/udev.lis
2260            for i in $lis; do
2261                if [ "`echo $i | cut -c1`" = "/" ]; then
2262                    j=`echo $i | cut -c2-`
2263                    [ "$j" != "" ] && rm -f $j
2264                fi
2265            done
2266            tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in udev.lis analysis" $MINDI_TMP/$$.log
2267            rm -f $MINDI_TMP/udev.lis
2268        else
2269            echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2270            echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2271            rm -f $mountpoint/tmp/USE-UDEV
2272        fi
2273    fi
2274
2275    # Management of potential HW info (Proliant only at the moment)
2276    rm -rf $MINDI_CACHE/bkphw
2277    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2278    if [ -d $MINDI_CACHE/bkphw ]; then
2279        LogIt "Hardware Information found and saved ..."
2280        cp -rp $MINDI_CACHE/bkphw .
2281        if [ -f $MINDI_CACHE/tools.files ]; then
2282            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2283            LocateDeps $lis > $MINDI_TMP/tools.lis
2284            tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2285        fi
2286        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2287            mv -f $MINDI_CACHE/mindi-rsthw .
2288            chmod 755 ./mindi-rsthw
2289        fi
2290        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2291    fi
2292
2293    for w in cdrom groovy-stuff ; do
2294        mkdir -p mnt/$w
2295    done
2296
2297    tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in fd dev analysis" $MINDI_TMP/$$.log
2298
2299    cd $old_pwd
2300    echo -en "..."
2301    old_pwd=`pwd`
2302    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2303        cd $MINDI_TMP
2304        needed_modules_path=lib/modules/$FAILSAFE_KVER
2305    else
2306        cd /
2307        if [ "${kernelname}" != "" ]
2308        then
2309            needed_modules_path=lib/modules/${kernelname}
2310        else
2311            needed_modules_path=lib/modules/`uname -r`
2312        fi
2313    fi
2314
2315    needed_modules=""
2316    list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2317
2318    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
2319        # For PXE boot
2320        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2321    fi
2322    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2323        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2324    fi
2325    for i in $DENY_MODS; do
2326        echo "Removing $i from the list of modules to load" >> $LOGFILE
2327        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2328    done
2329
2330    [ -e "$needed_modules_path" ] || LogIt "path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
2331    for i in $list_of_groovy_mods ; do
2332        needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2333    done
2334
2335    for i in $needed_modules ; do
2336        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2337        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2338        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2339        tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2340        # Uncompress modules if not using udev and native modprobe
2341        if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2342            if [ "`echo "$i" | grep -F ".gz"`" ]; then
2343                echo "Uncompressing $i" >> $LOGFILE
2344                gunzip -f $mountpoint/$i
2345            fi
2346        fi
2347    done
2348
2349    # Also copy modules.dep in case of udev so that normal modprobe works
2350    tar cf - -C / /$needed_modules_path/modules.dep 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy modules.dep to $mountpoint" $MINDI_TMP/$$.log
2351
2352    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2353        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2354        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2355        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2356        rm -f $mountpoint/sbin/devfsd
2357    fi
2358    cd $old_pwd
2359    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2360    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2361    rm -f $mountpoint/zero
2362    if [ _"$MONDO_SHARE" != _"" ]; then
2363        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2364        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2365        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2366        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2367        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2368        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2369        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2370        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2371        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2372    fi
2373    mkdir -p $mountpoint/proc
2374    echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2375    # Determine what filesystem to use for initrd image
2376    echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2377    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2378    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2379    case "$gvFileSystem" in
2380    "ext2fs")
2381        # say what will be used
2382        echo "Creating an ext2 initrd image..." >> $LOGFILE
2383        # kernel expects linuxrc in ext2 filesystem
2384        ( cd $mountpoint && ln -sf sbin/init linuxrc )
2385        # unmount loop filesystem and create image file using the standard approach
2386        umount $mountpoint || Die "Cannot unmount $tempfile"
2387        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2388        bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2389        ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2390        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2391        rm -f ${rdz_fname}.tmp
2392        # log that we are done
2393        echo "...done." >> $LOGFILE
2394    ;;
2395    "initramfs")
2396        # say what will be used
2397        echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2398        # make sure that cpio is there
2399        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2400        # go into filesystem
2401        cd $mountpoint
2402        # kernel expects init in cpio filesystem
2403        ln -sf sbin/init init
2404        # create cpio image file and unmount loop filesystem
2405        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2406        cd $old_pwd
2407        umount $mountpoint || Die "Cannot unmount $tempfile"
2408        # log that we are done
2409        echo "...done." >> $LOGFILE
2410    ;;
2411    *)
2412        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2413    ;;
2414    esac
2415    if [ "$res" -eq "0" ] ; then
2416        echo -en "..."
2417    else
2418        echo -en "\rMade an rdz WITH ERRORS.           \n"
2419    fi
2420    return 0
2421}
2422
2423
2424##############################################################################
2425#----------------------------------- Main -----------------------------------#
2426##############################################################################
2427
2428# Now we can create what we need
2429mkdir -p $MINDI_TMP
2430
2431# Purge from potential old run
2432if [ _"$MINDI_CACHE" = _"" ]; then
2433    Die "MINDI_CACHE undefined"
2434fi
2435rm -rf $MINDI_CACHE/* 2> /dev/null
2436mkdir -p $MINDI_CACHE
2437
2438if [ "$1" = "--printvar" ] ; then
2439    shift
2440    if [ _"$1" != _"" ] ; then
2441        set | grep -Ew "^$1" | cut -d= -f2
2442    fi
2443    MindiExit 0
2444fi
2445
2446> $LOGFILE
2447echo "mindi v$MINDI_VERSION" >> $LOGFILE
2448echo "$ARCH architecture detected" >> $LOGFILE
2449echo "mindi called with the following arguments:" >> $LOGFILE
2450echo "$@" >> $LOGFILE
2451echo "Start date : `date`" >> $LOGFILE
2452echo "-----------------------------" >> $LOGFILE
2453
2454[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2455
2456# Log some capital variables
2457[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2458echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
2459echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2460echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2461[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2462echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
2463if [ -f $MINDI_CONFIG ]; then
2464    echo "-----------------------------" >> $LOGFILE
2465    echo " Mindi configuration file    " >> $LOGFILE
2466    echo "-----------------------------" >> $LOGFILE
2467    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2468    echo "-----------------------------" >> $LOGFILE
2469fi
2470
2471
2472trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2473
2474# Sanity checks
2475which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2476which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2477which gawk > /dev/null 2> /dev/null || Die "Gawk is missing from your computer. Please install gawk. You may find the package on Debian's website. How did I know you're running Debian? Because only Debian would be stupid enough not to include gawk in your distribution."
2478which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2479if which awk &> /dev/null ; then
2480    if ! which gawk &> /dev/null ; then
2481        LogIt "You have awk but not gawk.\nPlease note that mindi works fine with a _sane_ awk binary.\nIf your awk binary misbehaves then please contact your vendor\nor distribution's mailing list for technical support.\n"
2482    fi
2483fi
2484which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2485[ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
2486
2487[ "`uname -r | grep "2.4.[0-6]" | grep -v "2.4.[0-9][0-9]"`" != "" ] &&  echo "WARNING! Your kernel may have buggy loopfs code. Consider upgrading to 2.4.7"
2488
2489# Update the PATH variable if incomplete
2490if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2491    PATH=$PATH:/sbin:/usr/sbin
2492    export PATH
2493    echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2494    echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2495    echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2496fi
2497
2498# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2499if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2500    source $MINDI_LIB/FindDistroFailsafe
2501    # Log kernel image
2502    LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2503else
2504    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2505fi
2506
2507if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2508    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2509fi
2510
2511### BERLIOS
2512### Fix as it's not mandatory on ia64
2513if [ "$ARCH" = "ia64" ] ; then
2514    if which elilo &> /dev/null ; then
2515        LILO_EXE=elilo
2516    else
2517        LILO_EXE=`which false 2> /dev/null`
2518    fi
2519else
2520    FindIsolinuxBinary
2521fi
2522trap "Aborted" SIGTERM
2523DONE="\r\t\t\t\t\t\t\t\tDone.         "
2524kernelpath=""
2525MONDO_ROOT=/var/cache/mondo
2526mkdir -p $MONDO_ROOT
2527
2528if [ -d "/proc/lvm" ]; then
2529    # LVM v1
2530    LVMCMD=""
2531    LVM="v1"
2532elif [ -d "/dev/mapper" ]; then
2533    # LVM v2
2534    LVMCMD="lvm"
2535    LVM="v2"
2536else
2537    LVM="false"
2538fi
2539echo "LVM set to $LVM" >> $LOGFILE
2540echo "----------" >> $LOGFILE
2541echo "mount result:" >> $LOGFILE
2542echo "-------------" >> $LOGFILE
2543mount >> $LOGFILE
2544echo "-------------" >> $LOGFILE
2545if [ -e /etc/raidtab ]; then
2546    echo "-------------" >> $LOGFILE
2547    echo "/etc/raidtab content:" >> $LOGFILE
2548    echo "-------------" >> $LOGFILE
2549    cat /etc/raidtab >> $LOGFILE
2550fi
2551echo "-------------" >> $LOGFILE
2552echo "cat /proc/cmdline:" >> $LOGFILE
2553echo "-------------" >> $LOGFILE
2554cat /proc/cmdline >> $LOGFILE
2555echo "-------------" >> $LOGFILE
2556echo "cat /proc/swaps:" >> $LOGFILE
2557echo "-------------" >> $LOGFILE
2558cat /proc/swaps >> $LOGFILE
2559echo "-------------" >> $LOGFILE
2560echo "cat /proc/partitions:" >> $LOGFILE
2561echo "-------------" >> $LOGFILE
2562cat /proc/partitions >> $LOGFILE
2563echo "-------------" >> $LOGFILE
2564echo "cat /proc/filesystems:" >> $LOGFILE
2565echo "-------------" >> $LOGFILE
2566cat /proc/filesystems >> $LOGFILE
2567echo "-------------" >> $LOGFILE
2568echo "lsmod result:" >> $LOGFILE
2569echo "-------------" >> $LOGFILE
2570lsmod >> $LOGFILE
2571MODULES="`cat /proc/modules | awk '{print $1}'`"
2572if [ -x /usr/sbin/esxcfg-module ]; then
2573    echo "-------------" >> $LOGFILE
2574    echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2575    echo "-------------" >> $LOGFILE
2576    echo "VMWare modules" >> $LOGFILE
2577    echo "-------------" >> $LOGFILE
2578    /usr/sbin/esxcfg-module -l >> $LOGFILE
2579    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | awk '{print $1}'`"
2580fi
2581echo "FORCE_MODS:" >> $LOGFILE
2582echo "-------------" >> $LOGFILE
2583echo $FORCE_MODS >> $LOGFILE
2584echo "-------------" >> $LOGFILE
2585echo "DENY_MODS:" >> $LOGFILE
2586echo "-------------" >> $LOGFILE
2587echo $DENY_MODS >> $LOGFILE
2588echo "-------------" >> $LOGFILE
2589echo "df result:" >> $LOGFILE
2590echo "----------" >> $LOGFILE
2591df -T >> $LOGFILE
2592echo "-------------" >> $LOGFILE
2593echo "Liste of extra modules is:" >> $LOGFILE
2594echo "$EXTRA_MODS" >> $LOGFILE
2595echo "-------------" >> $LOGFILE
2596
2597# Compute libata version
2598laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
2599# If libata v2 is used then remove ide-generic as it will perturbate boot
2600if [ "`echo $MODULES | grep libata`" ]; then
2601    if [ "$laver" = "2" ]; then
2602        DENY_MODS="$DENY_MODS ide-generic"
2603        echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
2604        echo "-------------" >> $LOGFILE
2605    fi
2606fi
2607
2608FLOPPY_WAS_MOUNTED=""
2609for mtpt in /media/floppy /mnt/floppy /floppy ; do
2610    if mount | grep -w $mtpt &> /dev/null ; then
2611        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2612        umount $mtpt
2613    fi
2614done
2615
2616#
2617# If we have a USB device we need to store info
2618# and remove it from the parameters line
2619#
2620if [ "$#" -ne "0" ] ; then
2621    if [ "$1" = "--usb" ] ; then
2622        shift
2623        USBDEVICE=$1
2624        if [ _"$USBDEVICE" = _"" ]; then
2625            Die "No USB device specified"
2626        fi
2627        shift
2628    fi
2629fi
2630
2631if [ "$#" -ne "0" ] ; then
2632    if [ "$1" = "--findkernel" ] ; then
2633        res=`TryToFindKernelPath`
2634        # Avoids logfile content for mondo
2635        export MONDO_SHARE=""
2636        if [ "$res" = "" ] ; then
2637            MindiExit -1
2638        else
2639            echo "$res"
2640            MindiExit 0
2641        fi
2642    elif [ "$1" = "--locatedeps" ] ; then
2643        [ ! "$2" ] && Die "Please specify the binary to look at"
2644        LocateDeps $2
2645        # Avoids logfile content for mondo
2646        export MONDO_SHARE=""
2647        MindiExit $?
2648    elif [ "$1" = "--readalllink" ] ; then
2649        [ ! "$2" ] && Die "Please specify the binary to look at"
2650        ReadAllLink $2
2651        # Avoids logfile content for mondo
2652        export MONDO_SHARE=""
2653        MindiExit $?
2654    elif [ "$1" = "--makemountlist" ] ; then
2655        [ ! "$2" ] && Die "Please specify the output file"
2656        MakeMountlist $2
2657        # Avoids logfile content for mondo
2658        export MONDO_SHARE=""
2659        MindiExit $?
2660    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2661        echo "Mindi v$MINDI_VERSION"
2662        # Avoids logfile content for mondo
2663        export MONDO_SHARE=""
2664        MindiExit 0
2665    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2666        MONDO_TMP=$2
2667        # Change MINDI_TMP for the one provided by mondo
2668        # So that it can get back the built files
2669        if [ _"$MONDO_TMP" = _"" ]; then
2670            Die "MONDO_TMP is empty, aborting"
2671        fi
2672        if [ _"$MONDO_TMP" = _"/" ]; then
2673            Die "MONDO_TMP is /, aborting"
2674        fi
2675        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2676        rmdir $MINDI_TMP
2677        export MINDI_TMP=$MONDO_TMP
2678        mkdir -p $MINDI_TMP
2679        # This is the scratch dir in mondo - subdir images
2680        MINDI_CACHE=$3
2681        if [ _"$MINDI_CACHE" != _"" ]; then
2682            mkdir -p $MINDI_CACHE
2683        fi
2684        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2685###
2686### Sq-Modification...
2687### Attempt to locate kernel specific module path
2688### if module path is found then use it other wise use uname -r to set it...
2689###
2690        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2691        LogIt "kernelname = $kernelname"
2692        LogIt "kernelpath = $kernelpath"
2693        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2694        then
2695           LogIt "Module path for ${kernelpath} not found..."
2696           LogIt "using running kernel\'s modules."
2697           kernelname=`uname -r`
2698        else
2699           LogIt "Using modules for kernel: ${kernelname}"
2700        fi
2701###
2702### end of Sq-Modification
2703###
2704        TAPEDEV=$5
2705        TAPESIZE=$6
2706        FILES_IN_FILELIST=$7
2707        USE_LZO=$8
2708        CDRECOVERY=$9
2709        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2710            IMAGE_DEVS=""
2711        else
2712            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2713        fi
2714        if [ "${11}" ] ; then
2715            LILO_OPTIONS=""
2716    #       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2717        fi
2718        LAST_FILELIST_NUMBER=${12}
2719        ESTIMATED_TOTAL_NOOF_SLICES=${13}
2720        EXCLUDE_DEVS="${14}"
2721        USE_COMP="${15}"
2722        USE_LILO="${16}"
2723        USE_STAR="${17}"
2724        INTERNAL_TAPE_BLOCK_SIZE="${18}"
2725        DIFFERENTIAL="${19}"
2726        USE_GZIP="${20}"
2727        NOT_BOOT="${21}"
2728        [ "$USE_COMP" = "" ] && USE_COMP=yes
2729        [ "$USE_GZIP" = "" ] && USE_GZIP=no
2730        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2731        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
2732        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2733        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2734        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2735        then
2736           LogIt "Module path for ${kernelpath} not found..."
2737           LogIt "using running kernel\'s modules."
2738           kernelname=`uname -r`
2739        else
2740           LogIt "Using modules for kernel: ${kernelname}"
2741        fi
2742        # MONDO_ROOT is the real scratchdir
2743        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2744        if [ _"$MONDO_ROOT" != _"" ]; then
2745            mkdir -p $MONDO_ROOT
2746        else
2747            Die "MONDO_ROOT is undefined"
2748        fi
2749    else
2750        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2751        MindiExit -1
2752    fi
2753fi
2754[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2755
2756if [ _"$MONDO_SHARE" = _"" ]; then
2757    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2758    LogIt "Latest Mindi is available from http://www.mondorescue.org"
2759    LogIt "BusyBox sources are available from http://www.busybox.net"
2760    LogIt "------------------------------------------------------------------------------"
2761else
2762    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
2763fi
2764if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2765    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2766else
2767    LogIt "Unable to find mindi-busybox, please install it"
2768    MindiExit -1
2769fi
2770
2771# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2772insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2773for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2774    insmod $i >> $LOGFILE 2>> $LOGFILE
2775done
2776
2777KERN_DISK_MADE=""
2778
2779echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2780echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2781echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2782if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2783    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2784    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2785    MakeMountlist $MINDI_TMP/mountlist.txt
2786    mkdir -p $MINDI_TMP/small-all/tmp
2787    cd $MINDI_TMP/small-all
2788    cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
2789    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
2790    sleep 2
2791    LogIt "Done. Exiting."
2792    MindiExit 0
2793fi
2794
2795if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2796    LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
2797fi
2798
2799if [ "$kernelpath" = "" ] ; then
2800    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2801    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2802    read ch
2803    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2804        USE_OWN_KERNEL="yes"
2805    else
2806        USE_OWN_KERNEL="no"
2807    fi
2808    if [ "$USE_OWN_KERNEL" = "yes" ]; then
2809        YOUR_KERNEL_SUCKS=""
2810        kernelpath=`TryToFindKernelPath`
2811        if [ "$kernelpath" = "" ] ; then
2812            echo -n "Please enter kernel path : "
2813            read kernelpath
2814        fi
2815    else
2816        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2817    fi
2818fi
2819if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2820    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2821    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2822        source $MINDI_LIB/FindDistroFailsafe
2823        # Log kernel image
2824        LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2825        kernelpath="$FAILSAFE_KBIN"
2826        LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2827        LogIt "The failsafe kernel is $kernelpath.\n"
2828        LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2829        LogIt "disks then it may still be a result of a problem with your kernel.\n"
2830        pwd=`pwd`
2831        cd $MINDI_TMP
2832        mkdir -p lib/modules
2833        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2834        cd $pwd
2835    else
2836        kernelpath=$MINDI_LIB/vmlinuz
2837        LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2838        LogIt "However, you are still running your kernel. If Mindi fails to create your"
2839        LogIt "disks then it may still be a result of a problem with your kernel."
2840        pwd=`pwd`
2841        cd $MINDI_TMP
2842        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2843        cd $pwd
2844    fi
2845    YOUR_KERNEL_SUCKS="Your kernel sucks"
2846fi
2847echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
2848[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
2849
2850[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it.\nGo to http://www.mondorescue.org and download it, then install it."
2851
2852PrepareDataDiskImages
2853
2854ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2855rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2856export ramdisk_size=$rds
2857
2858echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2859if [ "$ARCH" = "ia64" ] ; then
2860    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2861else
2862    PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2863fi
2864
2865[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2866...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2867
2868if [ _"$MONDO_SHARE" = _"" ]; then
2869    ListImagesForUser
2870    OfferToMakeBootableISO
2871    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2872        OfferToMakeBootableUSB
2873    fi
2874    LogIt "Finished."
2875elif [ "$TAPEDEV" ] ; then
2876    if [ "$ARCH" != "ia64" ] ; then
2877        # We need to keep the img file as boot file for ia64 platform
2878        rm -f $MINDI_CACHE/{*img,*iso}
2879    else
2880        rm -f $MINDI_CACHE/*iso
2881    fi
2882    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2883        OfferToMakeBootableUSB
2884    fi
2885    OfferToMakeBootableISO
2886    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2887        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2888    else
2889        Die "Cannot find all.tar.gz, to be written to tape"
2890    fi
2891elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2892    OfferToMakeBootableUSB
2893else
2894    OfferToMakeBootableISO
2895fi
2896# cleanup
2897LogIt "$FRIENDLY_OUTSTRING"
2898for mtpt in $FLOPPY_WAS_MOUNTED ; do
2899    mount $mtpt
2900done
2901MindiExit 0
Note: See TracBrowser for help on using the repository browser.