source: branches/3.0/mindi/mindi @ 2963

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