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

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