source: branches/2.2.10/mindi/mindi @ 2406

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

Remove useless conf files created under /tmp and never used

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