source: MondoRescue/branches/3.0/mindi/mindi @ 3081

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