source: branches/2.2.10/mindi/mindi @ 2382

Last change on this file since 2382 was 2382, checked in by Bruno Cornec, 11 years ago
  • Change NFS support into a NetFS support to allow for multiple protocol in addition to NFS (NEEDS TESTING)

(Backport from 2.2.9)

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