source: branches/2.2.10/mindi/mindi @ 2391

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