source: branches/2.2.10/mindi/mindi @ 2873

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