source: branches/2.2.7/mindi/mindi @ 1998

Last change on this file since 1998 was 1998, checked in by bruno, 11 years ago
  • Improves again the security of the rm used
  • Property svn:keywords set to Rev Id
File size: 98.7 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 1998 2008-07-10 15:48:47Z 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 qlogicfas qlogicfc qlogicisp raw1394 scsi_debug scsi_mod scsi_transport_sas scsi_transport_spi sd_mod seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule"
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-cs ide-core ide_core edd paride ata_generic ata_piix libata via82cxxx generic nvidia ahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks amd74xx"
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"
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-snapshot dm-zero dm-mirror 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"
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    KBDElabel=memtest\nPTH=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 "Incorporating 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="<3>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 -vx " *#.*" $MY_FSTAB | grep -vx " *none.*" | $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
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                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1035                    do
1036                        # Location of the swap label for kernel 2.6
1037                        try_dev_label=`dd bs=1 count=16 skip=1052 if=$try_dev 2> /dev/null`
1038                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1039                            actual_dev=$try_dev
1040                        fi
1041                    done
1042            fi
1043
1044            # Check if one of all those tries has known success
1045            if [ "x$actual_dev" != "x" ]; then
1046                current_partition=$actual_dev
1047            else
1048                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"
1049            fi
1050        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1051        # current_partition contains only first column of /etc/fstab
1052        elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1053            uuid=`echo "$current_partition" | cut -d'=' -f2`
1054            actual_dev=""
1055
1056            # 1st try, findfs - the RHEL way of finding labels and their partitions
1057            if [ -x "/sbin/findfs" ]; then
1058                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1059            fi
1060   
1061            # 2nd try : blkid, the good way for all UUID except swap
1062            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1063                actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1064                # For LVM FS it will give a /dev/dm-# which should then be converted
1065                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1066                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1067                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1068                    for dev in `ls /dev/mapper/*`; do
1069                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1070                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1071                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1072                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1073                            break
1074                        fi
1075                    done
1076                fi
1077            fi
1078   
1079            # 3th try, with vol_id
1080            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1081                list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1082                for dev in $list_dev ; do
1083                    dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1084                    if [ "x$dev_exists" != "x" ]; then
1085                        actual_dev=$dev
1086                        break;
1087                    fi
1088                done
1089            fi
1090
1091            # 4th try, with dumpuuid (VMWare only ?) for swap
1092            if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1093                list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1094                for dev in $list_dev ; do
1095                    dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1096                    if [ "x$dev_exists" != "x" ]; then
1097                        actual_dev=$dev
1098                        break;
1099                    fi
1100                done
1101            fi
1102
1103            # Check if one of all those tries has known success
1104            if [ "x$actual_dev" != "x" ]; then
1105                current_partition=$actual_dev
1106            else
1107                Die "Your system uses a UUID 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"
1108            fi
1109        else
1110            # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1111            # they use symlinks in fstab unrelated to what is shown in mount !
1112            if [ _"$partition_mountpt" = _"" ]; then
1113                # set default in case we dont't find it
1114                for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1115                        if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1116                            str_to_find_fmt_with=$tmpp
1117                            partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1118                            break;
1119                        fi
1120                done
1121            fi
1122        fi
1123
1124        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1125        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1126        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1127        # the former is then a link to the latter, so we test whether
1128        # $current_partition is actually such a link or not and set
1129        # $current_lvolume accordingly. On Debian you may find more than one answer
1130        # so we remove the one corresponding to /dev/.static
1131        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1132        # principle is the same and we need to find the link to it as well.
1133        # Note that $current_lvolume may well be an
1134        # ordinary device. It is just to make sure that we feed the right value
1135        # into any of the LVM tools if possible.
1136
1137        current_lvolume="$current_partition"
1138        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1139            # .static dir are a Debian specificity
1140            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1141            echo $current_lvolume | grep -q ' '
1142            if [ $? -eq 0 ]; then
1143                echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE 
1144            fi
1145        fi
1146        #
1147        # End of LVM device style variation code (other than $current_lvolume).
1148
1149        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1150            # Size computed via LVM not directly
1151            partition_size="lvm"
1152        else
1153            partition_size=`SizeOfPartition $current_partition`
1154            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1155            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1156            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1157                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1158                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1159                [ "$partition_format" != "swap" ] && partition_format="swap"
1160                if [ "$partition_size" = "" ] ; then
1161                    totalsize=0
1162                    items=0
1163                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1164                        totalsize=$(($totalsize+$i))
1165                        items=$(($items+1))
1166                    done
1167                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1168                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1169                    echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1170                fi
1171            fi
1172        fi
1173        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1174        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1175        if [ "$partition_mountpt" = "" ] ; then
1176            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1177                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1178                    partition_mountpt="raid"
1179                    partition_format="raid"
1180                else
1181                    partition_mountpt="lvm"
1182                    partition_format="lvm"
1183                fi
1184            fi
1185        fi
1186        psz=$partition_size
1187        echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1188        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1189        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1190            partition_mountpt="image"
1191            old_partition_fmt=$partition_format
1192            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1193            partition_size=$(($partition_size+1)); # just in case
1194            if [ "$partition_format" = "Linux" ] ; then
1195                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1196                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1197                partition_format=$old_partition_fmt
1198            fi
1199        fi
1200        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1201            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1202            continue
1203        fi
1204        if [ ! "$partition_mountpt" ] ; then
1205            echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1206            for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1207                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1208                [ "$partition_format" ] && break
1209            done
1210            echo "------- $FDISK log end ------------" >> $LOGFILE
1211            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1212                partition_format="compaq"
1213            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1214                LogIt "Unable to find mountpoint of $current_partition - ignoring"
1215                continue
1216            fi
1217        fi
1218        if [ "$redhat_label" ]; then
1219            label="$redhat_label"
1220        elif [ "$uuid" ]; then
1221            label="$uuid"
1222        fi
1223        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1224        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1225        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1226        if [ "$current_partition" = "" ] ; then
1227            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1228        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1229            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1230                partition_mountpt=raid
1231                partition_format=raid
1232                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1233                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1234            else
1235                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1236            fi
1237        elif [ "$partition_format" = "" ] ; then
1238            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1239        elif [ "$partition_size" = "" ] ; then
1240            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1241        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1242            continue
1243        else
1244            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1245                echo "Stupid bastard..." >> $LOGFILE
1246                partition_format="vfat"
1247            fi
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\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1250        fi
1251    done
1252}
1253
1254
1255MakeSureNumberIsInteger() {
1256    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1257    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1258    echo "result = '$res'"
1259        Die "$1 should be an integer"
1260    fi
1261}
1262
1263
1264OfferToMakeBootableISO() {
1265    local i old_pwd
1266    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1267        echo -en "Shall I make a bootable CD image? (y/[n]) "
1268        read i
1269        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1270    fi
1271    if [ _"$MINDI_TMP" = _"" ]; then
1272        Die "MINDI_TMP undefined"
1273    fi
1274    rm -Rf $MINDI_TMP/iso
1275    mkdir -p $MINDI_TMP/iso/{images,archives}
1276    cp -f $MINDI_CACHE/*.gz $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1277    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1278    for i in memdisk memtest.bin memtest.img ; do
1279        j=$MINDI_LIB/$i
1280        k=$MINDI_TMP/iso
1281        if [ -e "$j" ] ; then
1282            LogIt "Copying $j to $k"
1283            cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1284            cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1285            if [ _"$MONDO_SHARE" != _"" ]; then 
1286                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1287            fi
1288        fi
1289    done
1290    MakeMessageFile > $MINDI_TMP/iso/message.txt
1291    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?"
1292    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?"
1293    if [ _"$MONDO_SHARE" != _"" ]; then 
1294        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?"
1295        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?"
1296    fi
1297    MakeBootConfFile syslinux > $MINDI_TMP/iso/isolinux.cfg
1298    if [ "$ARCH" != "ia64" ] ; then
1299        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?"
1300    fi
1301    old_pwd=`pwd`
1302    cd $MINDI_TMP/iso
1303    if [ "$ARCH" != "ia64" ] ; then
1304        if [ _"$MONDO_SHARE" != _"" ]; then 
1305            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?"
1306            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1307        fi
1308        $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
1309    else
1310        $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
1311        rm -f images/mindi-bootroot.$BOOT_SIZE.img
1312    fi
1313    if [ "$?" -ne "0" ] ; then
1314        echo "----------- $ISO_CMD's errors --------------" >> $LOGFILE
1315        cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1316        echo "$ISO_CMD returned the following errors:-"
1317        cat $MINDI_TMP/mkisofs.log
1318        LogIt "Failed to create ISO image."
1319    else
1320        echo "Created bootable ISO image at $MINDI_CACHE/mindi.iso" | tee -a $LOGFILE
1321    fi
1322    rm -f $MINDI_TMP/mkisofs.log
1323    cd $old_pwd
1324}
1325
1326
1327OfferToMakeBootableUSB() {
1328    local i old_pwd
1329    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1330        echo -n "Shall I make a bootable USB image ? (y/[n]) "
1331        read i
1332        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1333        if [ "$USBDEVICE" = "" ]; then
1334            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1335            read dev
1336            USBDEVICE=$dev
1337        fi
1338        echo "WARNING: This will erase all content on $USBDEVICE"
1339        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1340    fi
1341    if [ _"$MINDI_TMP" = _"" ]; then
1342        Die "MINDI_TMP undefined"
1343    fi
1344    rm -Rf $MINDI_TMP/usb
1345    mkdir -p $MINDI_TMP/usb
1346    USBPART="${USBDEVICE}1"
1347
1348    echo -en "Transforming $USBDEVICE in a Bootable device " 
1349    echo -en "."
1350    echo "Transforming $USBDEVICE in a Bootable device"  >> $LOGFILE
1351    echo "Checking $USBDEVICE" >> $LOGFILE
1352    $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1353    if [ $? -ne 0 ]; then
1354        echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1355        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1356        exit -1
1357    fi
1358    echo -en "."
1359    echo "Unmounting $USBDEVICE just in case" >> $LOGFILE
1360    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1361    echo "Erasing $USBDEVICE" >> $LOGFILE
1362    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1363d
1364d
1365d
1366d
1367n
1368p
13691
1370
1371
1372t
1373b
1374a
13751
1376w
1377EOF
1378    if [ $? -ne 0 ]; then
1379        echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1380        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1381        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1382        MindiExit -1
1383    fi
1384    echo -en "."
1385    echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
1386    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1387    if [ $? -ne 0 ]; then
1388        echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1389        echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1390        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1391        MindiExit -1
1392    fi
1393    echo -en "."
1394    echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1395    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1396    if [ $? -ne 0 ]; then
1397        echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1398        echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1399        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1400        MindiExit -1
1401    fi
1402    echo -en "."
1403    mkdir -p $MINDI_TMP/usb/images
1404    cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1405    echo -en "."
1406    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1407    for i in memdisk memtest.bin memtest.img ; do
1408        j=$MINDI_LIB/$i
1409        k=$MINDI_TMP/usb
1410        if [ -e "$j" ] ; then
1411            LogIt "Copying $j to $k"
1412            cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1413            cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1414        fi
1415    done
1416    echo -en "."
1417    MakeMessageFile > $MINDI_TMP/usb/message.txt
1418    echo -en "."
1419    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?"
1420    echo -en "."
1421    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1422    echo -en "."
1423    MakeBootConfFile syslinux > syslinux.cfg
1424    echo -en "."
1425    umount $MINDI_TMP/usb
1426    if [ "$ARCH" != "ia64" ] ; then
1427        syslinux $USBPART 2>> $MINDI_TMP/syslinux.log
1428        if [ "$?" -ne "0" ] ; then
1429            echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1430            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1431            LogIt "Failed to create USB image."
1432        else
1433            echo -e "$DONE"
1434            echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1435        fi
1436        rm -f $MINDI_TMP/syslinux.log
1437    else
1438        echo "No USB boot support for ia64" | tee -a $LOGFILE
1439        MindiExit -1
1440    fi
1441    echo -en "."
1442}
1443
1444
1445MakeMessageFile() {
1446    iss="/dev/null"
1447    [ -e /etc/issue ] && iss="/etc/issue"
1448    [ -e /etc/issue.net ] && iss="/etc/issue.net"
1449    if [ "`grep -Fi "debian" $iss 2> /dev/null`" ] ; then
1450        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`"/
1451    else
1452        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`"/
1453    fi
1454    if [ _"$MONDO_SHARE" != _"" ]; then
1455        if [ "$CDRECOVERY" != "yes" ] ; then
1456            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1457                echo -en "Press <enter> to continue.\n"
1458            elif [ ! "$MINDI_TMP" ] ; then
1459                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1460                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1461                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1462                fi
1463            else
1464                echo -en "$BOOT_MEDIA_MESSAGE"
1465            fi
1466        else
1467            echo -en "\
1468To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1469CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1470        fi
1471    fi
1472    echo -en "\n\n\n"
1473}
1474
1475
1476MakeBootConfFile() {
1477    local options i ooo
1478    options=""
1479    # Type of boot file (elilo or syslinux/isolinux)
1480    type=$1
1481    if [ "$type" = "elilo" ]; then
1482        sep="="
1483    else
1484        sep=" "
1485    fi
1486
1487    # Generic header for conf file
1488    if [ "$type" != "elilo" ] ; then
1489        echo -en "prompt 1\ndisplay message.txt\n"
1490    else
1491        echo -en "prompt\n"
1492    fi
1493
1494    # Compute which default option to boot from
1495    if [ "$CDRECOVERY" = "yes" ] ; then
1496        echo -en "default${sep}RESTORE\n"
1497    # In case it's mondoarchive
1498    elif [ _"$MONDO_SHARE" != _"" ]; then
1499        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1500            echo -en "default${sep}iso\n"
1501        else
1502            echo -en "default${sep}interactive\n"
1503        fi
1504    else
1505        echo -en "default${sep}expert\n"
1506    fi
1507
1508    # Handle timeout
1509    if [ "$CDRECOVERY" != "yes" ] ; then
1510        echo -en "timeout${sep}300\n"
1511    else
1512        echo -en "timeout${sep}10000\n"
1513    fi
1514    echo -en "\n"
1515
1516    # prepare which labels will be generted
1517    if [ "$CDRECOVERY" = "yes" ] ; then
1518        options="RESTORE expert"
1519    else
1520        if [ _"$MONDO_SHARE" != _"" ]; then
1521            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1522                options="iso"
1523            else
1524                options="interactive expert compare iso nuke isonuke"
1525            fi
1526        else
1527            options="expert"
1528        fi
1529    fi
1530
1531    # Generate rest of conf file
1532    for i in $options ; do
1533        ooo=$i
1534        [ "$ooo" = "RESTORE" ] && ooo="nuke"
1535        if [ "$type" = "elilo" ]; then
1536            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"
1537        else
1538            outstr="label $i\n\tkernel /vmlinuz\n\tappend initrd=/initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo}_mode $ADDITIONAL_BOOT_PARAMS\n"
1539        fi
1540        echo -en "$outstr"
1541    done
1542
1543    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1544        if [ "$type" = "elilo" ]; then
1545            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1546            echo -en "image=/memdisk\n\tlabel=memtest\nappend=\"initrd=memtest.img\"\n"
1547        else
1548            echo -en "label memtest\n\tkernel /memtest.bin\n"
1549            echo -en "label=memtest\n\tkernel /memdisk\nappend initrd=memtest.img\n"
1550        fi
1551    fi
1552}
1553
1554
1555PrepareBootDiskImage_LILO() {
1556    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1557    imagesdir=$MINDI_CACHE
1558    kernelpath=$1
1559
1560    retval=0
1561    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1562    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1563    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?"
1564    echo -en "..."
1565    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1566    mountpoint=$MINDI_TMP/mountpoint.$$
1567    mkdir -p $mountpoint
1568    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1569    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1570    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1571    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1572    mkdir -p $mountpoint/etc
1573    liloconf=$mountpoint/elilo.conf
1574
1575    MakeBootConfFile elilo > $liloconf
1576
1577    # Copy it so that CD-ROM menu entry is satisfied
1578    mountefi=0
1579    df -T | grep /boot/efi | grep -q vfat
1580    if [ $? -ne 0 ]; then
1581        mount /boot/efi
1582        if [ $? -ne 0 ]; then
1583            echo "You have to mount your EFI partition when using mindi"
1584            MindiExit -1
1585        fi
1586        mountefi=1
1587    fi
1588    el=`find /boot/efi -name elilo.efi`
1589    cp $el $mountpoint
1590    cp $liloconf $mountpoint
1591    if [ $mountefi -eq 1 ]; then
1592        umount /boot/efi 2>&1 > /dev/null
1593    fi
1594
1595    echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1596    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1597    if [ "$?" -ne "0" ] ; then
1598        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1599        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1600        LogIt "Please unload some of your modules and try again."
1601        rm -f $MINDI_TMP/mtpt.$$
1602        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1603        retval=$(($retval+1))
1604    fi
1605    MakeMessageFile > $mountpoint/message.txt
1606
1607    mkdir -p $mountpoint/tmp
1608    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1609        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1610    fi
1611
1612    # copy the kernel across
1613    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1614    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1615    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1616    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
1617    if [ "$?" -ne "0" ] ; then
1618        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1619        du -sk $mountpoint/* >> $LOGFILE
1620        echo "--- end of list of files ---" >> $LOGFILE
1621        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1622Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1623        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1624        cd $old_pwd
1625        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1626        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1627    #   losetup /dev/loop0 -d
1628        [ "$imagefile" != "" ] && rm -f $imagefile
1629        return 0
1630    fi
1631    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1632    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1633    echo "Free space left on image = $free_space KB" >> $LOGFILE
1634    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1635    # make it bootable
1636    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1637    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1638    if [ "$KERN_DISK_MADE" ] ; then
1639        echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1640    fi
1641
1642    cp -f $liloconf $MINDI_TMP/lilo.conf 2>> $LOGFILE
1643    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1644    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1645    echo -en "..."
1646    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1647    if [ "$retval" -eq "0" ] ; then
1648        echo -en "...$DONE\n"
1649        if [ "$KERN_DISK_MADE" ] ; then
1650            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1651        fi
1652    else
1653        echo -en "...failed\n"
1654        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1655        [ "$imagefile" != "" ] && rm -f $imagefile
1656    fi
1657    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1658    return $retval
1659}
1660
1661
1662PrepareBootDiskImage_SYSLINUX() {
1663    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1664    imagesdir=$MINDI_CACHE
1665    kernelpath=$1
1666    do_boot_root_thingy=""
1667    local retval old_pwd
1668    retval=0
1669
1670    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1671    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1672    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?"
1673    echo -en "..."
1674    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1675    mountpoint=$MINDI_TMP/mountpoint.$$
1676    mkdir -p $mountpoint
1677    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1678    echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1679    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1680    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1681
1682    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1683
1684    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1685    MakeMessageFile > $mountpoint/message.txt
1686    MakeBootConfFile syslinux > $mountpoint/syslinux.cfg
1687    echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1688    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1689    if [ "$?" -ne "0" ] ; then
1690        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1691        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1692        LogIt "Please unload some of your modules and try again."
1693        rm -f $MINDI_TMP/mtpt.$$
1694        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1695        retval=$(($retval+1))
1696    fi
1697
1698    mkdir -p $mountpoint/tmp
1699    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1700        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1701    fi
1702
1703    # copy the kernel across
1704    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1705    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1706    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1707    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1708    if [ "$?" -ne "0" ] ; then
1709        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1710        du -sk $mountpoint/* >> $LOGFILE
1711        echo "--- end of list of files ---" >> $LOGFILE
1712        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1713Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1714        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1715        cd $old_pwd
1716        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1717        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1718
1719        [ "$imagefile" != "" ] && rm -f $imagefile
1720        return 0
1721    fi
1722    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1723    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1724    echo "Free space left on image = $free_space KB" >> $LOGFILE
1725    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1726
1727    # make it bootable
1728    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1729    mkdir -p $mountpoint/etc
1730    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1731    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1732    echo -en "..."
1733    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1734
1735    if [ "$retval" -eq "0" ] ; then
1736        echo -en "...$DONE\n"
1737        if [ "$KERN_DISK_MADE" ] ; then
1738            [ "$imagefile" != "" ] && rm -f $imagefile
1739            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1740        fi
1741    else
1742        echo -en "...failed\n"
1743        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1744        [ "$imagefile" != "" ] && rm -f $imagefile
1745    fi
1746    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1747    return $retval
1748}
1749
1750
1751PrepareDataDiskImages() {
1752    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles
1753
1754    imagesdir=$MINDI_CACHE
1755    rm -f $imagesdir/mindi.iso
1756    needlist=$MINDI_TMP/what-we-need.txt
1757    bigdir=$MINDI_TMP/bigdir
1758    mkdir -p $bigdir/usr/bin
1759    mkdir -p $bigdir/usr/sbin
1760
1761    lfiles="$DEPLIST_FILE"
1762    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1763    cat $lfiles | GenerateGiantDependencyList $needlist $lines
1764    res=$?
1765    if [ "$YOUR_KERNEL_SUCKS" ]; then
1766        pwd=`pwd`
1767        cd $MINDI_TMP
1768        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1769            tar cf - ./$i 2>> $LOGFILE | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir"
1770        done
1771        for i in $EXTRA_MODS ; do
1772            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1773            [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
1774            for k in $j ; do
1775                tar cf - $k 2>> $LOGFILE | (cd $bigdir ; tar xf -)
1776                echo "Added failsafe module $k to ramdisk" >> $LOGFILE
1777            done
1778        done
1779        cd $pwd
1780    else
1781        ListKernelModulePaths >> $needlist
1782    fi
1783    if [ "$res" -ne "0" ] ; then
1784        Die "You have $res files present in dependency list\nbut absent from filesystem."
1785    fi
1786    FindAndAddUserKeyboardMappingFile
1787    mkdir -p $bigdir/tmp
1788    if [ _"$MONDO_SHARE" != _"" ]; then
1789        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1790        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1791    fi
1792    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1793    DropOptimizedLibraries $needlist $bigdir
1794    echo -en "Assembling dependency files"
1795    CopyDependenciesToDirectory < $needlist $bigdir
1796
1797    # also copy io.sys and msdos.sys, if we can find them
1798    for i in `mount | cut -d' ' -f3` ; do
1799        for j in io.sys msdos.sys ; do
1800            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1801        done
1802    done
1803
1804    # master boot record, too
1805    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1806    if [ "$i" ] ; then
1807        LogIt "Backing up $i's MBR"
1808        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1809        sleep 1
1810        sync
1811        j=$i
1812        [ -h "$j" ] && j=`readlink -f $j`
1813        LogIt "Creating /dev/boot_device ($j)"
1814        mkdir -p $bigdir/dev
1815        cp -pRdf $j $bigdir/dev/boot_device 2> /dev/null || Die "Unable to create /dev/boot_device on ramdisk"
1816    fi
1817
1818    old_pwd=`pwd`
1819    cd $bigdir
1820
1821    # Get terminfo content
1822    ti="usr/share/terminfo/l"
1823    if [ -d /$ti ]; then
1824        mkdir -p $ti
1825        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
1826    fi
1827    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1828        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1829        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1830    fi
1831    [ -d "/lib/dev-state" ] && tar cf - /lib/dev-state 2>> $LOGFILE | tar xf -
1832    cd $old_pwd
1833    echo -e "$DONE"
1834    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1835    MakeMountlist $MINDI_TMP/mountlist.txt
1836    mkdir -p $bigdir/tmp
1837    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2> /dev/null || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1838    if [ _"$MONDO_SHARE" != _"" ]; then
1839        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1840    fi
1841    [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm || LVM="false"
1842    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
1843    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2> /dev/null
1844    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2> /dev/null
1845    if [ _"$MONDO_SHARE" != _"" ]; then
1846        for q in filelist.full.gz biggielist.txt ; do
1847            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1848            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1849        done
1850    fi
1851
1852    echo -en "Tarring and zipping the data content..."
1853    size_of_all_tools=`du -sk $bigdir | cut -f1`
1854    (cd $bigdir ; tar -b 4096 -cf - . 2> /dev/null | gzip -9 > $imagesdir/all.tar.gz)
1855    du -sk $imagesdir/*gz >> $LOGFILE
1856    echo -e "$DONE"
1857
1858    FRIENDLY_OUTSTRING="Boot and data disk images were created."
1859    rm -rf $bigdir
1860    rm -f $needlist
1861}
1862
1863
1864ProcessLDD() {
1865    local incoming f d nd bd bnd
1866    read incoming
1867    while [ "$incoming" != "" ]; do
1868        # We take the full path name of the dyn. lib. we want
1869        incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1870        for f in $incoming ; do
1871            # echo modified file name if one of the parent dir is a link
1872            # by replacing the original dirname by the destination of the link
1873            d="`dirname $f`"
1874            found="false"
1875            while [ "$d" != "/" ]; do
1876                if [ -h "$d" ]; then
1877                    nd=`readlink -f $d`
1878                    bd=`basename $d`
1879                    bnd=`basename $nd`
1880                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
1881                    echo $d
1882                fi
1883                d="`dirname $d`"
1884            done
1885
1886            echo "$f"
1887            echo "`ReadAllLink $f`"
1888        done
1889        read incoming
1890    done
1891}
1892
1893
1894Prompt() {
1895    echo -en "$1"
1896    read line
1897}
1898
1899
1900ReadLine() {
1901    local i incoming
1902    read incoming
1903    i=0
1904    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
1905        i=$(($i+1))
1906        read incoming
1907    done
1908    echo "$incoming"
1909}
1910
1911
1912SizeOfPartition() {
1913    local devpath drive res stub
1914    device=$1
1915    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
1916        res=`SizeOfRaidPartition $device`
1917        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
1918        echo "$res"
1919        return 0
1920    fi
1921    # patch from Bill <bill@iwizard.biz> - 2003/08/25
1922    res=`$FDISK -s $device 2>> $LOGFILE`
1923    # end patch
1924    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
1925    [ "$res" = "" ] && res="-1"
1926    echo $res
1927    return 0
1928}
1929
1930
1931SizeOfRaidPartition() {
1932    local real_dev smallest_size silly tmp
1933
1934    silly=999999999
1935    smallest_size=$silly
1936
1937    for real_dev in `GetRaidDevMembers $1` ; do
1938        tmp=`SizeOfPartition $real_dev`
1939        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
1940    done
1941
1942    if [ "$smallest_size" = "$silly" ] ; then
1943        echo "-1"
1944        return 1
1945    else
1946        echo "$smallest_size"
1947        return 0
1948    fi
1949}
1950
1951
1952StripComments()
1953{
1954    local tempfile
1955
1956    tempfile=$MINDI_TMP/$$.strip.txt
1957    cp -f $1 $tempfile 2>> $LOGFILE
1958    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
1959    rm -f $tempfile
1960    echo "Stripped comments from $2" >> $LOGFILE
1961}
1962
1963
1964
1965StripExecutable()
1966{
1967    local tmpfile
1968
1969    tmpfile=$MINDI_TMP/stripped.$$.dat
1970    [ -d "$1" ] || [ -h "$1" ] && return
1971    cp -f $1 $tmpfile 2>> $LOGFILE
1972    strip $tmpfile 2> /dev/null
1973    if [ "$?" -eq "0" ] ; then
1974        cp -f $tmpfile $1 2>> $LOGFILE
1975        echo "Stripped binary $2" >> $LOGFILE
1976    fi
1977    rm -f $tmpfile
1978}
1979
1980
1981TryToFindKernelPath() {
1982    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
1983
1984    we_want_version=`uname -r`
1985    possible_kernels=""
1986    duff_kernels=""
1987   
1988    if [ "$ARCH" = "ia64" ] ; then
1989       root="/boot/efi/efi"
1990    else
1991       root="/"
1992    fi
1993    for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
1994        [ ! -e "$fname" ] && continue
1995        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
1996        file $fname | grep -q gzip
1997        if [ "$?" -eq "0" ] ; then
1998            # Used by ia64
1999            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2000        else
2001            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2002        fi
2003        [ "$fkern_ver" = "" ] && continue
2004        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2005        [ -f "$fname" ] || continue
2006        [ -h "$fname" ] && continue
2007        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2008        file $fname | grep -q gzip
2009        if [ "$?" -eq "0" ] ; then
2010            # Used by ia64
2011            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2012                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2013                duff_kernels="$fname $duff_kernels"
2014            else
2015                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2016                possible_kernels="$fname $possible_kernels"
2017            fi
2018        else
2019            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2020                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2021                duff_kernels="$fname $duff_kernels"
2022            else
2023                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2024                possible_kernels="$fname $possible_kernels"
2025            fi
2026        fi
2027    done
2028    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2029        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2030    fi
2031    if [ ! "$possible_kernels" ] ; then
2032        LogIt "No kernel matches exactly. Are there any duff kernels?"
2033        possible_kernels="$duff_kernels"
2034        if [ ! "$possible_kernels" ] ; then
2035            LogIt "Sorry, no duff kernels either"
2036        else
2037            LogIt "I bet you're running Debian or Gentoo, aren't you?"
2038            LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2039        fi
2040    fi
2041    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2042    noof_kernels=`CountItemsIn "$possible_kernels"`
2043    if [ "$noof_kernels" -eq "0" ] ; then
2044        LogIt "Could not find your kernel."
2045        if [ -e "/boot/vmlinuz" ] ; then
2046            LogIt "Using /boot/vmlinuz as a last resort."
2047            output=/boot/vmlinuz
2048        else
2049            output=""
2050        fi
2051    elif [ "$noof_kernels" -eq "1" ] ; then
2052        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2053        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2054        output="$kernelpath"
2055    else
2056        for i in $possible_kernels ; do
2057            if echo $i | grep "`uname -r`" ; then
2058                LogIt "OK, I used my initiative and found that "
2059                LogIt "$i is probably your kernel. "
2060                output="$i"
2061                return
2062            fi
2063        done
2064        if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2065            output=/boot/vmlinuz
2066            echo "Schlomo, this one's for you." >> $LOGFILE
2067        else
2068            LogIt "Two or more possible kernels found. You may specify any one of them and the "
2069            LogIt "boot disks will still work, probably. If one does not work, try another."
2070            LogIt "$possible_kernels"
2071            echo ""
2072        fi
2073    fi
2074    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2075}
2076
2077
2078TurnTgzIntoRdz() {
2079    local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2080
2081    tgz_dir_fname=$1
2082    rdz_fname=$2
2083    kernelsize=$3
2084    maxsize=$(($BOOT_SIZE-$kernelsize))
2085    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2086    tempfile=$MINDI_TMP/temp.rd
2087    mountpoint=$MINDI_TMP/mnt1
2088    res=0
2089    echo -en "..."
2090    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2091    echo -en "..."
2092    echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2093    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2094    echo -en "..."
2095    mkdir -p $mountpoint
2096    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."
2097    echo -en "..."
2098    old_pwd=`pwd`
2099    cd $mountpoint
2100    cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2101    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2102
2103    cd dev || Die "Can't cd to dev"
2104    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2105    rm -f dev-entries.tgz
2106    cd ..
2107
2108    for w in insmod.static insmod.static.old ; do
2109        s=`which $w 2> /dev/null`
2110        if [ -e "$s" ] ; then
2111            tar cf - $s 2> /dev/null | tar xf -
2112        fi
2113    done
2114
2115    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2116
2117    # Handle the case where busybox and mount are dynamically linked
2118    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2119    if [ $? -eq 0 ]; then
2120        # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2121        rm -f bin/mount $MINDI_TMP/busy.lis
2122        mountlis=`grep mount $DEPLIST_FILE`
2123        for f in $MINDI_LIB/rootfs/bin/busybox $mountlis ; do
2124            if [ -f $f ]; then
2125                LocateDeps $f >> $MINDI_TMP/busy.lis
2126            fi
2127        done
2128        tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2> /dev/null | tar xf -
2129        rm -f $MINDI_TMP/busy.lis
2130    fi
2131
2132    mkdir -p $mountpoint/tmp
2133    # Management of udev (which includes modprobe in rules)
2134    ps auxww | grep -v grep | grep -qw udevd
2135    if [ $? -eq 0 ]; then
2136        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2137        LogIt "udev device manager found"
2138        tar cf - /etc/udev 2> /dev/null | tar xf -
2139        # This avoids NIC remapping if on another machine at restore time on Debian at least
2140        rm -f ./etc/udev/rules.d/z25_persistent-net.rules
2141        tar cf - /lib*/udev 2> /dev/null | tar xf -
2142        if [ -x /sbin/udevd ]; then
2143            lis2=`grep -Ev '^#' $MINDI_CONF/udev.files` 
2144            lis=""
2145            # Get only the files which exist in that list
2146            # and potentially their symlink structure
2147            for i in $lis2; do
2148                if [ -h $i ]; then
2149                    j=$i
2150                    while [ -h $j ]; do
2151                        lis="$lis $j"
2152                        j=`readlink $j`
2153                    done
2154                    lis="$lis $j"
2155                elif [ -f $i ]; then
2156                    lis="$lis $i"
2157                fi
2158            done
2159            # And their deps
2160            LocateDeps $lis > $MINDI_TMP/udev.lis
2161            for i in $lis; do
2162                if [ "`echo $i | cut -c1`" = "/" ]; then
2163                    j=`echo $i | cut -c2-`
2164                    [ "$j" != "" ] && rm -f $j
2165                fi
2166            done
2167            tar cf - $lis `sort -u $MINDI_TMP/udev.lis` 2> /dev/null | tar xf -
2168            rm -f $MINDI_TMP/udev.lis
2169        else
2170            echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2171            echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2172            rm -f $mountpoint/tmp/USE-UDEV
2173        fi
2174    fi
2175
2176    # Management of potential HW info (Proliant only at the moment)
2177    rm -rf $MINDI_CACHE/bkphw
2178    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2179    if [ -d $MINDI_CACHE/bkphw ]; then
2180        LogIt "Hardware Information found and saved ..."
2181        cp -rp $MINDI_CACHE/bkphw .
2182        if [ -f $MINDI_CACHE/tools.files ]; then
2183            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2184            LocateDeps $lis > $MINDI_TMP/tools.lis
2185            tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2> /dev/null | tar xf -
2186        fi
2187        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2188            mv -f $MINDI_CACHE/mindi-rsthw .
2189            chmod 755 ./mindi-rsthw
2190        fi
2191        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2192    fi
2193
2194    for w in cdrom groovy-stuff ; do
2195        mkdir -p mnt/$w
2196    done
2197
2198    tar cf - /dev/fd0*[1,2][4,7,8]* 2> /dev/null | tar xf -
2199
2200    cd $old_pwd
2201    echo -en "..."
2202    old_pwd=`pwd`
2203    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2204        cd $MINDI_TMP
2205        needed_modules_path=lib/modules/$FAILSAFE_KVER
2206    else
2207        cd /
2208        if [ "${kernelname}" != "" ]
2209        then
2210            needed_modules_path=lib/modules/${kernelname}
2211        else
2212            needed_modules_path=lib/modules/`uname -r`
2213        fi
2214    fi
2215
2216    needed_modules=""
2217    list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2218
2219    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
2220        # For PXE boot
2221        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2222    fi
2223    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2224        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2225    fi
2226    for i in $DENY_MODS; do
2227        echo "Removing $i from the list of modules to load" >> $LOGFILE
2228        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2229    done
2230
2231    [ -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."
2232    for i in $list_of_groovy_mods ; do
2233        needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2234    done
2235
2236    for i in $needed_modules ; do
2237        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2238        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2239        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2240        tar cf - $i 2>/dev/null | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy $i to $mountpoint"
2241        # Uncompress modules if not using udev and native modprobe
2242        if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2243            if [ "`echo "$i" | grep -F ".gz"`" ]; then
2244                echo "Uncompressing $i" >> $LOGFILE
2245                gunzip -f $mountpoint/$i
2246            fi
2247        fi
2248    done
2249
2250    # Also copy modules.dep in case of udev so that normal modprobe works
2251    tar cf - /$needed_modules_path/modules.dep 2>/dev/null | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy modules.dep to $mountpoint"
2252
2253    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2254        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2255        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2256        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2257        rm -f $mountpoint/sbin/devfsd
2258    fi
2259    cd $old_pwd
2260    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2261    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2262    rm -f $mountpoint/zero
2263    if [ _"$MONDO_SHARE" != _"" ]; then
2264        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2265        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP &> /dev/null
2266        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>/dev/null || Die "Cannot copy mountlist to ramdisk"
2267        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2268        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2269        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2270        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2271        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2272        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2273    fi
2274    mkdir -p $mountpoint/proc
2275    echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2276    # Determine what filesystem to use for initrd image
2277    echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2278    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2279    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2280    case "$gvFileSystem" in
2281    "ext2fs")
2282        # say what will be used
2283        echo "Creating an ext2 initrd image..." >> $LOGFILE
2284        # kernel expects linuxrc in ext2 filesystem
2285        ( cd $mountpoint && ln -sf sbin/init linuxrc )
2286        # unmount loop filesystem and create image file using the standard approach
2287        umount $mountpoint || Die "Cannot unmount $tempfile"
2288        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2289        bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2290        ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2291        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2292        rm -f ${rdz_fname}.tmp
2293        # log that we are done
2294        echo "...done." >> $LOGFILE
2295    ;;
2296    "initramfs")
2297        # say what will be used
2298        echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2299        # make sure that cpio is there
2300        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2301        # go into filesystem
2302        cd $mountpoint
2303        # kernel expects init in cpio filesystem
2304        ln -sf sbin/init init
2305        # create cpio image file and unmount loop filesystem
2306        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2307        cd $old_pwd
2308        umount $mountpoint || Die "Cannot unmount $tempfile"
2309        # log that we are done
2310        echo "...done." >> $LOGFILE
2311    ;;
2312    *)
2313        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2314    ;;
2315    esac
2316    if [ "$res" -eq "0" ] ; then
2317        echo -en "..."
2318    else
2319        echo -en "\rMade an rdz WITH ERRORS.           \n"
2320    fi
2321    return 0
2322}
2323
2324
2325##############################################################################
2326#----------------------------------- Main -----------------------------------#
2327##############################################################################
2328
2329# Now we can create what we need
2330mkdir -p $MINDI_TMP
2331
2332# Purge from potential old run
2333if [ _"$MINDI_CACHE" = _"" ]; then
2334    Die "MINDI_CACHE undefined"
2335fi
2336rm -rf $MINDI_CACHE/* 2> /dev/null
2337mkdir -p $MINDI_CACHE
2338
2339if [ "$1" = "--printvar" ] ; then
2340    shift
2341    if [ _"$1" != _"" ] ; then
2342        set | grep -Ew "^$1" | cut -d= -f2
2343    fi
2344    MindiExit 0
2345fi
2346
2347> $LOGFILE
2348echo "mindi v$MINDI_VERSION" >> $LOGFILE
2349echo "$ARCH architecture detected" >> $LOGFILE
2350echo "mindi called with the following arguments:" >> $LOGFILE
2351echo "$@" >> $LOGFILE
2352echo "Start date : `date`" >> $LOGFILE
2353echo "-----------------------------" >> $LOGFILE
2354
2355[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2356
2357# Log some capital variables
2358[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2359echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
2360echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2361echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2362[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2363echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
2364if [ -f $MINDI_CONFIG ]; then
2365    echo "-----------------------------" >> $LOGFILE
2366    echo " Mindi configuration file    " >> $LOGFILE
2367    echo "-----------------------------" >> $LOGFILE
2368    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2369    echo "-----------------------------" >> $LOGFILE
2370fi
2371
2372
2373trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2374
2375# Sanity checks
2376which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2377which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2378which 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."
2379which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2380if which awk &> /dev/null ; then
2381    if ! which gawk &> /dev/null ; then
2382        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"
2383    fi
2384fi
2385which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2386[ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
2387
2388[ "`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"
2389
2390# Update the PATH variable if incomplete
2391if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2392    PATH=$PATH:/sbin:/usr/sbin
2393    export PATH
2394    echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2395    echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2396    echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2397fi
2398
2399# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2400if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2401    source $MINDI_LIB/FindDistroFailsafe
2402    # Log kernel image
2403    LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2404else
2405    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2406fi
2407
2408if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2409    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2410fi
2411
2412### BERLIOS
2413### Fix as it's not mandatory on ia64
2414if [ "$ARCH" = "ia64" ] ; then
2415    if which elilo &> /dev/null ; then
2416        LILO_EXE=elilo
2417    else
2418        LILO_EXE=`which false`
2419    fi
2420else
2421    FindIsolinuxBinary
2422fi
2423trap "Aborted" SIGTERM
2424DONE="\r\t\t\t\t\t\t\t\tDone.         "
2425kernelpath=""
2426MONDO_ROOT=/var/cache/mondo
2427mkdir -p $MONDO_ROOT
2428
2429if [ -d "/proc/lvm" ]; then
2430    # LVM v1
2431    LVMCMD=""
2432    LVM="v1"
2433elif [ -d "/dev/mapper" ]; then
2434    # LVM v2
2435    LVMCMD="lvm"
2436    LVM="v2"
2437else
2438    LVM="false"
2439fi
2440echo "LVM set to $LVM" >> $LOGFILE
2441echo "----------" >> $LOGFILE
2442echo "mount result:" >> $LOGFILE
2443echo "-------------" >> $LOGFILE
2444mount >> $LOGFILE
2445echo "-------------" >> $LOGFILE
2446if [ -e /etc/raidtab ]; then
2447    echo "-------------" >> $LOGFILE
2448    echo "/etc/raidtab content:" >> $LOGFILE
2449    echo "-------------" >> $LOGFILE
2450    cat /etc/raidtab >> $LOGFILE
2451fi
2452echo "-------------" >> $LOGFILE
2453echo "cat /proc/cmdline:" >> $LOGFILE
2454echo "-------------" >> $LOGFILE
2455cat /proc/cmdline >> $LOGFILE
2456echo "-------------" >> $LOGFILE
2457echo "lsmod result:" >> $LOGFILE
2458echo "-------------" >> $LOGFILE
2459lsmod >> $LOGFILE
2460MODULES="`cat /proc/modules | awk '{print $1}'`"
2461if [ -x /usr/sbin/esxcfg-module ]; then
2462    echo "-------------" >> $LOGFILE
2463    echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2464    echo "-------------" >> $LOGFILE
2465    echo "VMWare modules" >> $LOGFILE
2466    echo "-------------" >> $LOGFILE
2467    /usr/sbin/esxcfg-module -l >> $LOGFILE
2468    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | awk '{print $1}'`"
2469fi
2470echo "FORCE_MODS:" >> $LOGFILE
2471echo "-------------" >> $LOGFILE
2472echo $FORCE_MODS >> $LOGFILE
2473echo "-------------" >> $LOGFILE
2474echo "DENY_MODS:" >> $LOGFILE
2475echo "-------------" >> $LOGFILE
2476echo $DENY_MODS >> $LOGFILE
2477echo "-------------" >> $LOGFILE
2478echo "df result:" >> $LOGFILE
2479echo "----------" >> $LOGFILE
2480df -T >> $LOGFILE
2481echo "-------------" >> $LOGFILE
2482echo "Liste of extra modules is:" >> $LOGFILE
2483echo "$EXTRA_MODS" >> $LOGFILE
2484echo "-------------" >> $LOGFILE
2485
2486# Compute libata version
2487laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
2488# If libata v2 is used then remove ide-generic as it will perturbate boot
2489if [ "`echo $MODULES | grep libata`" ]; then
2490    if [ "$laver" = "2" ]; then
2491        DENY_MODS="$DENY_MODS ide-generic"
2492        echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
2493        echo "-------------" >> $LOGFILE
2494    fi
2495fi
2496
2497FLOPPY_WAS_MOUNTED=""
2498for mtpt in /media/floppy /mnt/floppy /floppy ; do
2499    if mount | grep -w $mtpt &> /dev/null ; then
2500        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2501        umount $mtpt
2502    fi
2503done
2504
2505#
2506# If we have a USB device we need to store info
2507# and remove it from the parameters line
2508#
2509if [ "$#" -ne "0" ] ; then
2510    if [ "$1" = "--usb" ] ; then
2511        shift
2512        USBDEVICE=$1
2513        if [ _"$USBDEVICE" = _"" ]; then
2514            Die "No USB device specified"
2515        fi
2516        shift
2517    fi
2518fi
2519
2520if [ "$#" -ne "0" ] ; then
2521    if [ "$1" = "--findkernel" ] ; then
2522        res=`TryToFindKernelPath`
2523        # Avoids logfile content for mondo
2524        export MONDO_SHARE=""
2525        if [ "$res" = "" ] ; then
2526            MindiExit -1
2527        else
2528            echo "$res"
2529            MindiExit 0
2530        fi
2531    elif [ "$1" = "--locatedeps" ] ; then
2532        [ ! "$2" ] && Die "Please specify the binary to look at"
2533        LocateDeps $2
2534        # Avoids logfile content for mondo
2535        export MONDO_SHARE=""
2536        MindiExit $?
2537    elif [ "$1" = "--readalllink" ] ; then
2538        [ ! "$2" ] && Die "Please specify the binary to look at"
2539        ReadAllLink $2
2540        # Avoids logfile content for mondo
2541        export MONDO_SHARE=""
2542        MindiExit $?
2543    elif [ "$1" = "--makemountlist" ] ; then
2544        [ ! "$2" ] && Die "Please specify the output file"
2545        MakeMountlist $2
2546        # Avoids logfile content for mondo
2547        export MONDO_SHARE=""
2548        MindiExit $?
2549    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2550        echo "Mindi v$MINDI_VERSION"
2551        # Avoids logfile content for mondo
2552        export MONDO_SHARE=""
2553        MindiExit 0
2554    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2555        MONDO_TMP=$2
2556        # Change MINDI_TMP for the one provided by mondo
2557        # So that it can get back the built files
2558        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2> /dev/null
2559        rmdir $MINDI_TMP
2560        export MINDI_TMP=$MONDO_TMP
2561        mkdir -p $MINDI_TMP
2562        # This is the scratch dir in mondo - subdir images
2563        MINDI_CACHE=$3
2564        if [ _"$MINDI_CACHE" != _"" ]; then
2565            mkdir -p $MINDI_CACHE
2566        fi
2567        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2568###
2569### Sq-Modification...
2570### Attempt to locate kernel specific module path
2571### if module path is found then use it other wise use uname -r to set it...
2572###
2573        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2574        LogIt "kernelname = $kernelname"
2575        LogIt "kernelpath = $kernelpath"
2576        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2577        then
2578           LogIt "Module path for ${kernelpath} not found..."
2579           LogIt "using running kernel\'s modules."
2580           kernelname=`uname -r`
2581        else
2582           LogIt "Using modules for kernel: ${kernelname}"
2583        fi
2584###
2585### end of Sq-Modification
2586###
2587        TAPEDEV=$5
2588        TAPESIZE=$6
2589        FILES_IN_FILELIST=$7
2590        USE_LZO=$8
2591        CDRECOVERY=$9
2592        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2593            IMAGE_DEVS=""
2594        else
2595            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2596        fi
2597        if [ "${11}" ] ; then
2598            LILO_OPTIONS=""
2599    #       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2600        fi
2601        LAST_FILELIST_NUMBER=${12}
2602        ESTIMATED_TOTAL_NOOF_SLICES=${13}
2603        EXCLUDE_DEVS="${14}"
2604        USE_COMP="${15}"
2605        USE_LILO="${16}"
2606        USE_STAR="${17}"
2607        INTERNAL_TAPE_BLOCK_SIZE="${18}"
2608        DIFFERENTIAL="${19}"
2609        USE_GZIP="${20}"
2610        NOT_BOOT="${21}"
2611        [ "$USE_COMP" = "" ] && USE_COMP=yes
2612        [ "$USE_GZIP" = "" ] && USE_GZIP=no
2613        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2614        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
2615        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2616        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2617        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2618        then
2619           LogIt "Module path for ${kernelpath} not found..."
2620           LogIt "using running kernel\'s modules."
2621           kernelname=`uname -r`
2622        else
2623           LogIt "Using modules for kernel: ${kernelname}"
2624        fi
2625        [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
2626        # MONDO_ROOT is the real scratchdir
2627        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2628        if [ _"$MONDO_ROOT" != _"" ]; then
2629            mkdir -p $MONDO_ROOT
2630        else
2631            Die "MONDO_ROOT is undefined"
2632        fi
2633    else
2634        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2635        MindiExit -1
2636    fi
2637fi
2638[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2639
2640if [ _"$MONDO_SHARE" = _"" ]; then
2641    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2642    LogIt "Latest Mindi is available from http://www.mondorescue.org"
2643    LogIt "BusyBox sources are available from http://www.busybox.net"
2644    LogIt "------------------------------------------------------------------------------"
2645else
2646    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
2647fi
2648if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2649    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2650else
2651    LogIt "Unable to find mindi-busybox, please install it"
2652    MindiExit -1
2653fi
2654
2655# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2656insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2657for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2658    insmod $i >> $LOGFILE 2>> $LOGFILE
2659done
2660
2661KERN_DISK_MADE=""
2662
2663echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2664echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2665echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2666if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2667    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2668    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2669    MakeMountlist $MINDI_TMP/mountlist.txt
2670    mkdir -p $MINDI_TMP/small-all/tmp
2671    cd $MINDI_TMP/small-all
2672    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"
2673    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
2674    sleep 2
2675    LogIt "Done. Exiting."
2676    MindiExit 0
2677fi
2678
2679if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2680    LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
2681fi
2682
2683if [ "$kernelpath" = "" ] ; then
2684    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2685    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2686    read ch
2687    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2688        USE_OWN_KERNEL="yes"
2689    else
2690        USE_OWN_KERNEL="no"
2691    fi
2692    if [ "$USE_OWN_KERNEL" = "yes" ]; then
2693        YOUR_KERNEL_SUCKS=""
2694        kernelpath=`TryToFindKernelPath`
2695        if [ "$kernelpath" = "" ] ; then
2696            echo -n "Please enter kernel path : "
2697            read kernelpath
2698        fi
2699    else
2700        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2701    fi
2702fi
2703if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2704    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2705    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2706        source $MINDI_LIB/FindDistroFailsafe
2707        # Log kernel image
2708        LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2709        kernelpath="$FAILSAFE_KBIN"
2710        LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2711        LogIt "The failsafe kernel is $kernelpath.\n"
2712        LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2713        LogIt "disks then it may still be a result of a problem with your kernel.\n"
2714        pwd=`pwd`
2715        cd $MINDI_TMP
2716        mkdir -p lib/modules
2717        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2718        cd $pwd
2719    else
2720        kernelpath=$MINDI_LIB/vmlinuz
2721        LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2722        LogIt "However, you are still running your kernel. If Mindi fails to create your"
2723        LogIt "disks then it may still be a result of a problem with your kernel."
2724        pwd=`pwd`
2725        cd $MINDI_TMP
2726        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2727        cd $pwd
2728    fi
2729    YOUR_KERNEL_SUCKS="Your kernel sucks"
2730fi
2731echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
2732[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
2733
2734[ "$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."
2735
2736PrepareDataDiskImages
2737
2738ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2739rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2740export ramdisk_size=$rds
2741
2742echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2743if [ "$ARCH" = "ia64" ] ; then
2744    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2745else
2746    PrepareBootDiskImage_SYSLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2747fi
2748
2749[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2750...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2751
2752if [ _"$MONDO_SHARE" = _"" ]; then
2753    ListImagesForUser
2754    OfferToMakeBootableISO
2755    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2756        OfferToMakeBootableUSB
2757    fi
2758    LogIt "Finished."
2759elif [ "$TAPEDEV" ] ; then
2760    rm -f $MINDI_CACHE/{*img,*iso}
2761    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2762        OfferToMakeBootableUSB
2763    fi
2764    OfferToMakeBootableISO
2765    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2766        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2767    else
2768        Die "Cannot find all.tar.gz, to be written to tape"
2769    fi
2770elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2771    OfferToMakeBootableUSB
2772else
2773    OfferToMakeBootableISO
2774fi
2775# cleanup
2776LogIt "$FRIENDLY_OUTSTRING"
2777for mtpt in $FLOPPY_WAS_MOUNTED ; do
2778    mount $mtpt
2779done
2780MindiExit 0
Note: See TracBrowser for help on using the repository browser.