source: branches/2.2.8/mindi/mindi @ 2084

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