source: MondoRescue/branches/2.2.10/mindi/mindi @ 2345

Last change on this file since 2345 was 2345, checked in by Bruno Cornec, 11 years ago

In NFS mode also propose access to expert, interactive, ... entry at boot prompt
(backport from 2.2.9)

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