source: branches/3.0/mindi/mindi @ 3166

Last change on this file since 3166 was 3166, checked in by bruno, 6 years ago
  • Fix mindi for Mageia 3 with no /bin and /lib under / but relocated under /usr (should also fix #656 for Fedora)
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 124.2 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 3166 2013-07-25 20:01:05Z 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
36MINDI_CACHE=/var/cache/mindi
37
38# Temporary directory for mindi
39TMPDIR=/tmp
40
41EXTRA_SPACE=120000      # increase if you run out of ramdisk space
42BOOT_SIZE=65600         # size of the boot disk
43
44PROMPT_MAKE_CD_IMAGE="yes"
45    # Ask if you want to make a CD Image to be written?
46    # if this is set to 'no', then the image will be created automatically
47
48PROMPT_MAKE_USB_IMAGE="yes"
49    # Ask if you want to make a USB Image to be written?
50    # if this is set to 'no', then the image will be created automatically
51
52USE_OWN_KERNEL="yes"
53    # If set to "no", you will be prompted for whether or not
54    # you want to use your own kernel, or the supplied default.
55    # If "yes" mindi will automatically use your own kernel.
56
57KERNEL_IS_XEN="no"
58    # If set to "no", the kernel is not a Xen kernel
59    # If "yes", mindi will modify isolinux.cfg for the Xen kernel.
60xenkernelpath=""
61 
62MY_FSTAB=/etc/fstab
63TAPE_MODS="ht st osst ide-tape ide_tape"
64SCSI_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"
65
66# ide-probe-mod
67IDE_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"
68PCMCIA_MODS="pcmcia_core ds yenta_socket"
69USB_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"
70NET_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"
71CDROM_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"
72# Those modules will only go on the backup media, not the boot media.
73EXTRA_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 "
74# Replace with that line for HP OCMP e.g.
75#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
76DENY_MODS="kqemu vxfen"
77# Force some modules to be included
78FORCE_MODS=""
79
80# Find MBR in case of bootable USB device to build
81MBRFILE=/usr/lib/syslinux/mbr.bin
82[ ! -r "$MBRFILE" ] && MBRFILE=/usr/lib64/syslinux/mbr.bin
83[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/syslinux/mbr.bin
84[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib/syslinux/mbr.bin
85[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib64/syslinux/mbr.bin
86
87LOGFILE=/var/log/mindi.log
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    LogFile "Mindi $MINDI_VERSION is exiting" 
159    LogFile "End date : `date`" 
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        LogAll "FATAL ERROR"
184    else
185        LogAll "FATAL ERROR. $1"
186    fi
187    if [ _"$2" != _"" ]; then
188        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
189    fi
190    rm -f "$2"
191
192    LogAll "Please e-mail a copy of $LOGFILE to the mailing list."
193    LogAll "See http://www.mondorescue.org for more information."
194    LogAll "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"
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"
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            LogAll "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    # TODO: Why that
258    mkdir -p $bigdir/etc
259    tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogAll "WARNING: AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
260    if [ "`echo $mappath | grep -F ".gz"`" ] ; then
261        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'//g | cut -d' ' -f2`
262    else
263        included_list=`grep -Fi include $mappath | sed s/'"'//g | cut -d' ' -f2`
264    fi
265    for included_item in $included_list ; do
266        if [ ! -e "$included_item" ] ; then
267            sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
268            [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
269            for ii in $sss ; do
270                [ -e "$ii" ] && AddKeyboardMappingFile $ii
271            done
272        else
273            AddKeyboardMappingFile $included_item
274        fi
275    done
276}
277
278
279CopyDependenciesToDirectory() {
280    local outdir incoming counter d found tdir
281    outdir=$1
282    mkdir -p $outdir
283    incoming=`ReadLine`
284    counter=0
285    while [ "$incoming" != "" ] ; do
286        # Non absolute file names should not arrive till here => skipped
287        if [ `echo "$incoming" | cut -c1` != '/' ]; then
288            LogAll "WARNING: Unable to handle $incoming"
289            incoming=`ReadLine`
290            continue
291        fi
292        # no parent directory of incoming should be a link, copy is not possible in that case
293        d=`dirname "$incoming"`
294        found="false"
295        while [ $d != "/" -a $found = "false" ]; do
296            [ -h "$d" ] && found="true"
297            d=`dirname "$d"`
298        done
299        if [ -d "$incoming" -a ! -h "$incoming" ]; then
300            find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir 0
301        elif [ -e "$incoming" ] && [ $found = "false" ]; then
302            if [ ! -h "$incoming" ]; then
303                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
304            else
305                tdir=`dirname "$incoming"`
306                if [ ! -e "$outdir/$tdir" ]; then
307                    mkdir -p "$outdir/$tdir"
308                fi
309                cp --no-dereference --preserve=all $incoming "$outdir/$tdir"
310            fi
311            # Only uncompress modules if not using udevd
312            if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
313                gunzip -f $outdir/$incoming || LogAll "WARNING: Cannot gunzip $outdir/$incoming"
314            fi
315            [ -x "$outdir" ] && StripExecutable $outdir
316            counter=$(($counter+1))
317            LogProgress $counter $2
318        fi
319        incoming=`ReadLine`
320    done
321}
322
323
324CountItemsIn() {
325    local r
326    r=0
327    for q in $1 ; do
328        r=$(($r+1))
329    done
330    echo $r
331}
332
333
334DropOptimizedLibraries() {
335    local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
336    filelist=$1
337    outdir=$2
338
339    list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
340    if [ "$list_of_optimized_libraries" = "" ] ; then
341        return 0
342    fi
343    echo -en "Dropping i686-optimized libraries if appropriate"
344    for optimized_lib_name in $list_of_optimized_libraries ; do
345        echo -en "."
346        reason=""
347        vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
348        echo "$vanilla_lib_name" >> $filelist
349        LogFile "INFO: Adding $vanilla_lib_name to filelist"
350        mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
351        rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
352
353        # This may return multiple files
354        for resolved in `ReadAllLink $vanilla_lib_name`; do
355            LogFile "INFO: Adding as deps $resolved to filelist"
356            vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
357            if [ "$vanilla_resolved_name" != "$resolved" ]; then
358                mkdir -p $outdir$resolved> /dev/null 2> /dev/null
359                rmdir $outdir$resolved > /dev/null 2> /dev/null
360                ln -sf $vanilla_resolved_name $outdir$resolved
361                LogFile "INFO: Excluding deps $resolved" 
362                grep -Fvx "$resolved" "$filelist" > $filelist.tmp
363                LogFile "INFO: Replacing it with $vanilla_resolved_name" 
364                echo "$vanilla_resolved_name" >> $filelist.tmp
365                mv -f $filelist.tmp $filelist
366            fi
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    LogAll "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        LogAll "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        mkdir -p $bigdir/tmp
400        echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
401        KBDEPTH=0
402        mkdir -p $bigdir/etc/console
403        cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
404        echo ""
405        echo -e "$DONE"
406        return 0
407    elif [ -e "/etc/console-setup/boottime.kmap.gz" ] || [ -e "/etc/console-setup/cached.kmap.gz" ] ; then
408        LogFile "INFO: Ubuntu-style config detected."
409        mkdir -p $bigdir/tmp
410        if [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
411            kbdfile="/etc/console-setup/boottime.kmap.gz"
412        else
413            kbdfile="/etc/console-setup/cached.kmap.gz"
414        fi
415        echo $kbdfile > $bigdir/tmp/KEYMAP-LIVES-HERE
416        KBDEPTH=0
417        mkdir -p $bigdir/etc/console-setup
418        cp $kbdfile $bigdir/etc/console-setup 2>> $LOGFILE
419        echo ""
420        echo -e "$DONE"
421        return 0
422    elif [ -e "/etc/rc.conf" ] ; then
423        LogFile "INFO: ArchLinux config detected."
424        keyfile=/etc/rc.conf
425    elif [ -e "/etc/conf.d/keymaps" ] ; then
426        LogFile "INFO: Gentoo-style config detected."
427        keyfile=/etc/conf.d/keymaps
428    else
429        LogFile "Searching for rc.config ..."
430        keyfile=`find /etc -name rc.config | head -n1`
431        if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
432            LogAll "WARNING: Unknown config detected. Default keyboard map will be used."
433            return
434        else
435            LogFile "INFO: Found $keyfile"
436        fi
437    fi
438    if [ ! -e "$KEYDIR/keymaps" ] ; then
439        LogAll "WARNING: Keyboard mapping directory not found. Default keyboard map will be used."
440        return
441    fi
442    LogFile "INFO: keyfile=$keyfile"
443    # For SLES we need to remove the .map.gz extension Cf #614
444    locale=`grep -F KEYTABLE "$keyfile" | grep -v '^#' | tr -d '"' |cut -d'=' -f2 | sed 's/.map.gz$//'`
445    [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'`        # Slackware
446    [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | grep -v '^#' | tr -d '"' |cut -d'=' -f2`     # Gentoo & ArchLinux
447    LogFile "INFO: locale=$locale"
448    #
449    # Process the keymaps dir once for all
450    # AddKeyboardMappingFile will use it recursively
451    #
452    find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
453    mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
454    [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
455    # If we have multiple keymaps then log it !!
456    echo "$mp" | grep -q " " >> $LOGFILE
457    if [ $? -eq 0 ]; then
458        LogAll "WARNING: Multiple keymaps found: $mp"
459        LogFile "INFO: The following one will be used"
460    fi
461    for i in $mp ; do
462        mappath=$i
463        [ -e "$i" ] && [ ! -d "$i" ] && break
464    done
465    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
466        mappath=$(find / -wholename "*/kbd/keymaps/*/$locale | head -1")
467    fi
468    LogFile "INFO: mappath = $mappath"
469    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
470        LogAll "WARNING: Keyboard mapping file not found. Default keyboard map will be used."
471        return
472    fi
473    LogAll "INFO: Adding the following keyboard mapping tables: "
474    mkdir -p $bigdir/tmp
475    echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
476    KBDEPTH=0
477    AddKeyboardMappingFile $mappath
478    echo ""
479    echo -e "$DONE"
480    rm -f $MINDI_TMP/keymaps.find
481    return 0
482}
483
484
485FindMboot32Binary() {
486    MBOOTC32=/usr/lib/syslinux/mboot.c32
487    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib/syslinux/mboot.c32
488    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib64/syslinux/mboot.c32
489    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/syslinux/mboot.c32
490    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib/syslinux/mboot.c32
491    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib64/syslinux/mboot.c32
492    [ ! -e "$MBOOTC32" ] && MBOOTC32=`find / -name mboot.c32 | grep -x "/.*/mboot.c32"`
493    [ ! -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"
494    LogFile "INFO: Found mboot.c32 at $MBOOTC32"
495}
496
497FindIsolinuxBinary() {
498    ISOLINUX=/usr/lib/isolinux.bin
499    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
500    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
501    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
502    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
503    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
504    [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
505    [ ! -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"
506    LogFile "INFO: Found isolinux.bin at $ISOLINUX"
507}
508
509
510FindSpecificModuleInPath() {
511    local modpaths pwd line
512    pwd=`pwd`
513    if [ "$YOUR_KERNEL_SUCKS" ] ; then
514        cd "$MINDI_TMP"
515    else
516        cd /
517    fi
518    if [ ! -e "$1" ] ; then
519        LogAll "WARNING: cannot search specific path '$1'"
520        return 1
521    fi
522    # Find all files and links (required for some VMWare VMs)
523    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`
524    echo "$modpaths"
525    cd "$pwd"
526}
527
528
529GenerateGiantDependencyList() {
530    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
531
532    echo -en "Analyzing dependency requirements"
533    outfile=$1
534    tempfile=$MINDI_TMP/$$.txt
535    incoming=`ReadLine`
536
537    > $tempfile
538    progress=0
539    res=0
540    noof_lines=$2
541    while [ "$incoming" != "" ] ; do
542        if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
543            incoming=`ReadLine`
544            continue
545        fi
546        if [ "$incoming" = "LVMFILES:" ] ; then
547            break
548        fi
549        filelist=`GenerateListForFile "$incoming"`
550        r=$?
551        [ "$r" -ne "0" ] && LogAll "WARNING: $incoming not found"
552        res=$(($res+$r))
553#       LogFile "INFO: '$incoming' generates filelist '$filelist'"
554        for fname in $filelist ; do
555            [ "$fname" != "" ] && echo "$fname" >> $tempfile
556        done
557        progress=$(($progress+1))
558        LogProgress $progress $noof_lines
559        incoming=`ReadLine`
560    done
561    if  [ "$incoming" = "LVMFILES:" ] ; then
562        incoming=`ReadLine`
563        lvmversion=""
564        while [ "$incoming" != "" ] ; do
565            if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
566                incoming=`ReadLine`
567                continue
568            fi
569            filelist=`GenerateListForFile "$incoming"`
570            for tool in $filelist ; do
571                lvmresolved=`readlink -f $tool`
572                if [ "$tool" = "$lvmresolved" ]; then
573                    echo "$tool" >> $tempfile
574                elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
575                    if [ "$lvmversion" = "" ] ; then
576                        lvmversion=`$lvmresolved`
577                        echo "$lvmresolved" >> $tempfile
578                    fi
579                    toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
580                    if [ "$lvmversion" = "200" ]; then
581                        # pvdata and lvmcreate_initrd don't exist in LVM2
582                        case "$toolstripped" in
583                        "pvdata")
584                            continue
585                            ;;
586                        "lvmcreate_initrd")
587                            continue
588                            ;;
589                        esac
590                    fi
591                    toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
592                    if [ -e "$toolpath" ] ; then
593                        echo "$toolpath" >> $tempfile
594                        echo "$tool" >> $tempfile
595                    else
596                        toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
597                    fi
598                    if [ -e "$toolpath" ] ; then
599                        echo "$toolpath" >> $tempfile
600                        echo "$tool" >> $tempfile
601                    else
602                        echo "Where are your LVM-Tools? Couldn't find $tool"
603                    fi
604                else
605                    echo "$tool" >> $tempfile
606                fi
607            done
608            progress=$(($progress+1))
609            LogProgress $progress $noof_lines
610            incoming=`ReadLine`
611        done
612    fi
613    echo -en "$DONE\nMaking complete dependency list"
614
615    tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
616    mv -f $tempfile.new $tempfile
617    > $outfile.pre
618    progress=0
619    noof_lines=`cat $tempfile | wc -l`
620    LogFile "---------------------------------"
621    LogFile "List of dependencies:             "
622    LogFile "---------------------------------"
623    for fname in `cat $tempfile` ; do
624        echo "$fname" | tee -a $LOGFILE >> $outfile.pre
625        LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
626        progress=$(($progress+1))
627        LogProgress $progress $noof_lines
628    done
629    if [ _"$MONDO_SHARE" != _"" ]; then
630        mkdir -p $bigdir/tmp
631        mkdir -p $bigdir/sbin
632        mkdir -p $bigdir/bin
633        if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
634            LogAll "\nINFO: Incorporating post-nuke tarball"
635            old_pwd=`pwd`
636            cd "$bigdir"
637            tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogAll "ERROR: when untarring post-nuke tarball" $MINDI_TMP/$$.log
638            cd "$old_pwd"
639        fi
640        if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
641            LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
642        else
643            LogIt "ERROR: Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
644            LogIt "       I bet you've got a spare copy of Mondo or Mindi floating around on your system."
645            LogIt "       If Mindi was called by Mondo then send me a bug report."
646            LogIt "       It not, type 'ps ax' to see which Mondo-related process is still running then kill it. :-)"
647            LogIt "       Finally, run Mindi again."
648            Die "Odd."
649        fi
650        cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nINFO: Mondo v1.2x defaults to LILO as the bootloader, BTW."
651        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
652            LogAll "\nINFO: Incorporating Network-related settings"
653            for r in NETFS-* ISO-PREFIX ; do
654                cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
655                LogFile "INFO: Copying $r to ramdisk"
656            done
657        fi
658    fi
659    tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
660    rm -f $tempfile $outfile.pre
661    [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
662    return $res
663}
664
665
666GenerateListForFile() {
667    local files_found loc fname incoming i res
668    incoming="$1"
669    files_found=""
670    res=0
671
672    for fname in $incoming ; do
673        files_found="$files_found `LocateFile $fname`"
674    done
675
676    echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
677}
678
679
680# Returns all disk devices which are part of a raid array
681GetAllRaidMembers() {
682    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
683}
684
685
686GetFileSizeList() {
687    local i
688    for i in `find $1 -type d -o -print` ; do
689        du -sk $i
690    done
691}
692
693
694# Check kernel filesystem capabilites for accessing initrd image
695# Could be ext2 FS (old mode) or initramfs (new mode)
696#
697# Interface definition:
698# param #1: absolute path to kernel image
699GetInitrdFilesystemToUse() {
700
701    # interface test: make sure we have one parameter
702    if [ $# -ne 1 ]; then
703        Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
704    fi
705
706    # interface parameters
707    local lvKernelImage=$1
708
709    # local constants (filesystem magic strings)
710    local lcMagicCramfs="<3>cramfs: wrong magic"
711    local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
712    local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
713    local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as initramfs"
714
715    # local variables
716    local lvOffset
717    local lvScanRes
718    local lvUseFilesystem
719
720    # say where we are.
721    LogFile "INFO: GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage"
722
723    # verify that file exists
724    [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
725
726    # Kernel may be gzip compressed - Case of RHEL5 - SLES11SP1
727    file $lvKernelImage 2>&1 | grep -q gzip
728    if [ $? -eq 0 ]; then
729        LogFile "INFO: Found a gzip compressed kernel $lvKernelImage"
730        lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs" 2> /dev/null`
731    else
732        LogFile "INFO: Found a non gzip compressed kernel $lvKernelImage"
733        # kernel is x86 boot sector in RHEL3/4 with embedded gzip content
734        # get offet of gzip magic "1f8b0800" in file (for these older kernels)
735        lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}' 2> /dev/null`
736        if [ $lvOffset -eq 0 ]; then
737            LogFile "INFO: gzip magic not found in file $lvKernelImage. Supposing initramfs."
738            lvScanRes=$lcMagicInitfs
739        else
740            lvOffset=`expr $lvOffset / 2`
741            LogFile "INFO: GetInitrdFilesystemToUse(): gzip magic found at lvOffset $lvOffset."
742            # scan again  kernel image
743            lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | gunzip -c 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs" 2> /dev/null`
744        fi
745    fi
746
747    # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
748    if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
749        lvUseFilesystem="ext2fs"
750    elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
751        lvUseFilesystem="ext3fs"
752    elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
753        lvUseFilesystem="initramfs"
754    elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
755        lvUseFilesystem="cramfs"
756    else
757        # In that case, we are most probably after 2.6.30 and use the supported initramfs
758        LogFile "No automatic detection found previously. Supposing initramfs."
759        LogFile "Report on the MondoRescue mailing-list withyour log files"
760        lvUseFilesystem="initramfs"
761    fi
762
763    # say what we are using
764    LogFile "INFO: GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem."
765
766    # return file system to use
767    echo "$lvUseFilesystem"
768
769}
770
771# Searches members of raid device
772# $1: raid device (/dev/md...)
773GetRaidDevMembers() {
774    if [ ! -f /etc/raidtab ]; then 
775        return
776    fi
777    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
778}
779
780
781HackPathsToFailsafe() {
782    local incoming newpath stub i pwd
783    incoming=`ReadLine`
784    pwd=`pwd`
785    cd "$MINDI_TMP"
786    while [ "$incoming" != "" ] ; do
787        stub=`basename $incoming`
788        newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
789        for i in $newpath ; do
790            echo "$i"
791        done
792        read incoming
793    done
794    cd "$pwd"
795}
796
797
798ListAllPartitions() {
799    local res currline partition all_partitions ap_orig remaining i j
800
801    grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
802    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
803    if [ -e "/vmfs/volumes" ]; then
804        # For VMWare ESX 3 get the device names of these volumes
805        vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
806    fi
807    return
808}
809
810
811ListImagesForUser() {
812    local path fname
813    path=$MINDI_CACHE
814    echo -en "In the directory '$path' you will find the images:-\n"
815    for fname in `ls $path | grep -F mindi-` ; do
816        printf "%19s " $fname
817    done
818    echo " "
819}
820
821
822ListKernelModulePaths() {
823    local module_list module fname r kern
824    module_list="$MODULES"
825    # Remove unwanted modules from list
826    for i in $DENY_MODS; do
827        module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
828        EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
829    done
830###
831### Sq-Modification ... Use kernelname for module search path if specified
832###
833    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
834    then
835        kern=${kernelname}
836    else
837        kern="$KERVERRUN"
838    fi
839    export KERVER=$kern
840###
841### Sq-Mod End
842###
843    # Get rid of duplicates, so that if a live kernel module also appears
844    # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
845    for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
846        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
847        if [ -z "$r" ]; then
848            if [ "`echo "$MODULES" | grep -w $module`" ]; then
849                r="[live module file not found]"
850            else
851                r="[extra module file not found]"
852            fi
853        else
854            [ -f "$r" ] && echo "$r"
855        fi
856        LogFile "INFO: module $module --> $r"
857    done
858    find /lib/modules/$kern/modules.* -type f 2> /dev/null
859}
860
861#
862# Critical function which computes all dependencies (dyn. lib.)
863# for a list of binaries
864#
865LocateDeps() {
866    local incoming fname deps
867    incoming="$*"
868    for fname in $incoming ; do
869        if [ ! -e "$fname" ] ; then
870            LogFile "WARNING: $fname does not exist; cannot be LDD'd."
871            if echo $fname | grep lvm &> /dev/null ; then
872                LogFile "          This warning only affects you if you are using LVM."
873                if echo "$MODULES" | grep lvm &> /dev/null ; then
874                    LogFile "          I think you are, so please take heed!"
875                else
876                    LogFile "          I don't think you are, so don't worry about it."
877                fi
878            fi
879        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
880            newf=`readlink -f $fname`
881            LogFile "INFO: $fname is softlink to $newf which deps will be analyzed"
882            ldd $newf 2> /dev/null | ProcessLDD
883        else
884            ldd $fname 2> /dev/null | ProcessLDD
885        fi
886    done
887}
888
889
890# Give all symlinks recursively of a full path name
891ReadAllLink() {
892    file="$1"
893
894    while [ `echo $file | grep -Ec '\.\./'` -ne 0 ]; do
895        # We need to normalise the path with .. in it
896        file=`echo $file | perl -pi -e 's|([^/]*)/([^/]+)/\.\./([^/]+)|$1/$3|g'`
897    done
898    echo "$file"
899    if [ ! -h $file ]; then
900        return 0
901    fi
902
903    link=`readlink $file`
904    d=`dirname $file`
905    # Is link a relative or full path name
906    fchar=`echo $link | cut -c1`
907    # If mother dir is a link print it
908    if [ -h "$d" ]; then
909        echo "$d"
910        d2=`readlink $d`
911        c2=`echo $d2 |  | cut -c1`
912        if [ "$c2" != "/" ]; then
913            if [ "$c2" != "." ]; then
914                d="/$d2"
915            else
916                d="$d/$d2"
917            fi
918        fi
919    fi
920    if [ "$fchar" != "/" ]; then
921        # Relative or local link
922        ReadAllLink "$d/$link" 
923    else
924        # Absolute path
925        ReadAllLink $link 
926    fi
927}
928
929
930LocateFile() {
931    local i path fname_to_find location output resolved tmp stub cache_id loclist
932    fname_to_find="$1"
933    # It's an absolute path
934    if echo "$fname_to_find" | grep -x "/.*" ; then
935        output="$fname_to_find"
936        if [ -h "$output" ] ; then
937            output="`ReadAllLink $output` $output"
938        fi
939        echo "$output"
940        return 0
941    fi
942    # It's not an absolute path
943    output=""
944    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
945    #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
946        [ -h "$path" ] && continue
947        [ ! -e "$path/$fname_to_find" ] && continue
948        output="$path/$fname_to_find $output"
949        if [ -h "$path/$fname_to_find" ] ; then
950            output="`ReadAllLink $path/$fname_to_find` $output"
951        fi
952    done
953    if [ "$output" = "" ] ; then
954        return 1
955    fi
956    echo "$output"
957    return 0
958}
959
960LogProgress() {
961    local i progress modres noof_lines
962 
963    progress=$1
964    noof_lines=$2
965
966    echo -en "\r\t\t\t\t\t\t\t\t"
967    i=$(($progress*100))
968    if [ $noof_lines -ne 0 ]; then
969        i=$(($i/$noof_lines))
970    else
971        i=0
972    fi
973    echo -en "$i"
974    echo -en "%"
975    modres=$(($progress%4))
976    [ "$modres" -eq "0" ] && echo -en "\t/"
977    [ "$modres" -eq "1" ] && echo -en "\t-"
978    [ "$modres" -eq "2" ] && echo -en "\t\\"
979    [ "$modres" -eq "3" ] && echo -en "\t|"
980}
981
982# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
983MakeMondoConfigFile() {
984    local outfile use_lzo use_comp use_star
985    outfile=$1
986    > $outfile
987    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
988    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
989    [ "$USBDEVICE" ]            && echo "usb-dev $USBDEVICE" >> $outfile
990    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
991    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
992    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
993    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
994    use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
995    use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
996    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
997    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
998    echo "use-lzo $use_lzo" >> $outfile
999    echo "use-gzip $use_gzip" >> $outfile
1000    echo "use-star $use_star" >> $outfile
1001    echo "use-lzma $use_lzma" >> $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-DEV           netfs-dev           $outfile
1006    AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO         netfs-proto           $outfile
1007    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
1008    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
1009    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
1010    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-HWADDR netfs-client-hwaddr $outfile
1011    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW  netfs-client-defgw  $outfile
1012    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT  netfs-server-mount  $outfile
1013    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-USER  netfs-server-user  $outfile
1014    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH   netfs-server-path   $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 "------------------------------------"
1051    LogFile "Your raw fstab file looks like this:"
1052    LogFile "------------------------------------"
1053    cat $MY_FSTAB >> $LOGFILE
1054    LogAll "-----------------------------------"
1055    LogAll "Your mountlist will look like this:"
1056    LogAll "-----------------------------------"
1057
1058# mountlist(OUT)
1059    mountlist=$1
1060
1061# NB: partition = device
1062# NB: mountpt = where the device is mounted
1063
1064    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1065
1066    [ "$mountlist" != "" ] && rm -Rf $mountlist
1067    > $mountlist
1068    all_partitions=""
1069   
1070    if [ $LVM != "false" ]; then
1071        LogAll "INFO: Analyzing LVM..."
1072        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
1073        if [ $? -ne 0 ]; then
1074            LVM="false"
1075        fi
1076        # Excluded LVs and GVs are not reported here
1077        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
1078    fi
1079    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1080    for i in $IMAGE_DEVS ; do
1081        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1082    done
1083    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1084    printf "%-15s %-15s %-15s %-13s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE MB" LABEL/UUID | tee -a $LOGFILE
1085    printf "%-15s %-15s %-15s %-13s %-15s\n" ------ ---------- ------  -------  ---------- | tee -a $LOGFILE
1086    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"
1087    for c_p in $all_partitions ; do
1088        # Skip fd/cd devices, network FS, cifs
1089        [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
1090        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1091        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
1092            current_partition=`readlink -f $c_p`
1093            if [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ]; then
1094                current_partition="$c_p"
1095            elif [ "`echo $current_partition | grep -E '^/dev/dm-'`" ]; then
1096                # For SLES 11 type of distro, do not use dm devices as they are unable to be handled by lvm commands
1097                current_partition=`$MINDI_LIB/analyze-my-lvm --givevglvofdm $current_partition`
1098            fi
1099            [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1100        else
1101            current_partition="$c_p"
1102        fi
1103        [ "$c_p" = "none" ] && continue
1104        redhat_label=""
1105        label=""
1106        uuid=""
1107        absolute_partition=`readlink -f $c_p`
1108        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1109
1110        # set default in case we dont't find it
1111        str_to_find_fmt_with=$current_partition
1112
1113        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1114        # current_partition contains only first column of /etc/fstab
1115        if [ "`echo "$current_partition" | grep -i "LABEL="`" != "" ]; then
1116            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1117            actual_dev=""
1118
1119            # 1st try, findfs - the RHEL way of finding labels and their partitions
1120            if [ -x "/sbin/findfs" ]; then
1121                actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
1122            fi
1123   
1124            # 2nd try : blkid, the good way for all LABEL except swap
1125            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1126                actual_dev=`/sbin/blkid | grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1127                # For LVM FS it will give a /dev/dm-# which should then be converted
1128                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1129                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1130                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1131                    for dev in `ls /dev/mapper/*`; do
1132                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1133                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1134                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1135                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1136                            break
1137                        fi
1138                    done
1139                fi
1140            fi
1141   
1142            # 3rd try, which works on a standard partition (ext2/3), but not on swap
1143            # For LVM gives a /dev/mapper entry
1144            if [ "x$actual_dev" = "x" ]; then
1145                actual_dev=`/bin/mount -l | grep "\[$redhat_label\]" | cut -d' ' -f1`
1146            fi
1147   
1148            # 4th try, with vol_id
1149            # SWAP only
1150            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1151                list_swaps=`cat /proc/swaps | grep "/dev/" | $AWK '{ print $1 }' `
1152                for dev_swap in $list_swaps ; do
1153                    dev_exists=`/sbin/vol_id $dev_swap | grep "$redhat_label"`
1154                    if [ "x$dev_exists" != "x" ]; then
1155                        actual_dev=$dev_swap
1156                        break;
1157                    fi
1158                done
1159            fi
1160
1161            # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1162            # LABEL=SW-cciss/c0d0p3 (RDP)
1163            # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1164            # SWAP only
1165            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1166                    skip=""
1167                    uname=$KERVERRUN
1168                    [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1169                    # 2.6.12 needs 16 (FC3)
1170                    [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1171                    # 2.6.19 and upper needs 1052
1172                    [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1173                    [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1174                    [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
1175                    if [ $skip = "" ]; then
1176                        Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1177                    fi
1178                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1179                    do
1180                        # Location of the swap label for kernel 2.6
1181                        try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1182                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1183                            actual_dev=$try_dev
1184                        fi
1185                    done
1186            fi
1187
1188            # Check if one of all those tries has known success
1189            if [ "x$actual_dev" != "x" ]; then
1190                current_partition=$actual_dev
1191            else
1192                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"
1193            fi
1194        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1195        # current_partition contains only first column of /etc/fstab
1196        elif [ "`echo "$current_partition" | grep -i "UUID="`" != "" ]; then
1197            uuid=`echo "$current_partition" | cut -d'=' -f2`
1198            actual_dev=""
1199
1200            # 1st try, findfs - the RHEL way of finding labels and their partitions
1201            if [ -x "/sbin/findfs" ]; then
1202                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1203            fi
1204   
1205            # 2nd try : blkid, the good way for all UUID except swap
1206            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1207                actual_dev=`/sbin/blkid | grep "$uuid" | grep UUID= | cut -d':' -f1`
1208                # For LVM FS it will give a /dev/dm-# which should then be converted
1209                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1210                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1211                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1212                    for dev in `ls /dev/mapper/*`; do
1213                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1214                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1215                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1216                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1217                            break
1218                        fi
1219                    done
1220                fi
1221            fi
1222   
1223            # 3th try, with vol_id
1224            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1225                list_dev=`mount | grep -E '^/' | $AWK '{ print $1 }' `
1226                for dev in $list_dev ; do
1227                    dev_exists=`/sbin/vol_id $dev | grep "$uuid"`
1228                    if [ "x$dev_exists" != "x" ]; then
1229                        actual_dev=$dev
1230                        break;
1231                    fi
1232                done
1233            fi
1234
1235            # 4th try, with dumpuuid (VMWare only ?) for swap
1236            if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1237                list_dev=`cat /proc/swaps | grep -E '^/' | $AWK '{ print $1 }' `
1238                for dev in $list_dev ; do
1239                    dev_exists=`/sbin/dumpuuid $dev | grep "$uuid"`
1240                    if [ "x$dev_exists" != "x" ]; then
1241                        actual_dev=$dev
1242                        break;
1243                    fi
1244                done
1245            fi
1246
1247            # Check if one of all those tries has known success
1248            if [ "x$actual_dev" != "x" ]; then
1249                current_partition=$actual_dev
1250            else
1251                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."
1252            fi
1253        else
1254            # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1255            # they use symlinks in fstab unrelated to what is shown in mount !
1256            if [ _"$partition_mountpt" = _"" ]; then
1257                # set default in case we dont't find it
1258                for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | grep -Ev "^#" | $AWK '{print $1}'`; do
1259                        if [ _"`readlink -f $tmpp`" = _"`readlink -f $current_partition`" ]; then
1260                            str_to_find_fmt_with=$tmpp
1261                            partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$tmpp" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1262                            break;
1263                        fi
1264                done
1265            fi
1266        fi
1267
1268        # Detects noauto partitions not mounted and exclude them
1269        partition_option=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$str_to_find_fmt_with" | grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1270        if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" =  "" ] ; then
1271                LogFile "INFO: Excluding $current_partition from mountlist (due to noauto option in fstab)"
1272            continue
1273        fi
1274        # Detects bind partitions and exclude them
1275        if [ "`echo "$partition_option" | grep -iw bind`" != "" ]; then
1276                LogFile "INFO: Excluding $current_partition from mountlist (due to bind option in fstab)"
1277            continue
1278        fi
1279
1280        # Look for devices which have to be excluded
1281        skip=0
1282        if [ "$MINDI_EXCLUDE_DEVS" ] ; then
1283            l=""
1284            list_of_devices="`ReadAllLink $current_partition`"
1285            for d in $list_of_devices; do
1286                l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
1287            done
1288
1289            # Remove PVs from LVs excluded
1290            l="$l `GetPVsForLV $current_partition`"
1291
1292            # We want a single unique list
1293            list_of_devices="`echo $l | sort -u`"
1294
1295            for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
1296                if  [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
1297                    LogFile "INFO: Excluding $current_partition from mountlist (due to excluded device $d)"
1298                    skip=1
1299                    continue
1300                fi
1301            done
1302        fi
1303        if [ $skip -eq 1 ]; then
1304            continue
1305        fi
1306
1307        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1308        # Detects iso9660 ISO images and exclude them
1309        if [ "`echo "$partition_format" | grep -iw iso9660`" != "" ]; then
1310                LogFile "INFO: Excluding $current_partition from mountlist (due to iso9660 format in fstab)"
1311            continue
1312        fi
1313        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1314        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1315        # the former is then a link to the latter, so we test whether
1316        # $current_partition is actually such a link or not and set
1317        # $current_lvolume accordingly. On Debian you may find more than one answer
1318        # so we remove the one corresponding to /dev/.static
1319        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1320        # principle is the same and we need to find the link to it as well.
1321        # Note that $current_lvolume may well be an
1322        # ordinary device. It is just to make sure that we feed the right value
1323        # into any of the LVM tools if possible.
1324
1325        current_lvolume="$current_partition"
1326        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1327            # .static dir are a Debian specificity
1328            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1329            echo $current_lvolume | grep -q ' '
1330            if [ $? -eq 0 ]; then
1331                LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1332            fi
1333            # if it's not found, it may well be a real device such as a multipath one
1334            # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1335            if [ _"$current_lvolume" = _"" ]; then
1336                current_lvolume="$current_partition"
1337            fi
1338        fi
1339        #
1340        # End of LVM device style variation code (other than $current_lvolume).
1341
1342        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1343            # Size computed via LVM not directly
1344            partition_size="lvm"
1345        else
1346            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1347            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1348            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1349                # Skip swap files
1350                [ "`echo "$current_partition" | grep -E "^/dev"`" = "" ] && continue
1351                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition " | $AWK '{print $3}'`
1352                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1353                [ "$partition_format" != "swap" ] && partition_format="swap"
1354                if [ "$partition_size" = "" ] ; then
1355                    totalsize=0
1356                    items=0
1357                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1358                        totalsize=$(($totalsize+$i))
1359                        items=$(($items+1))
1360                    done
1361                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1362                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1363                    LogFile "INFO: I'm guessing $c_p is $(($partition_size/1024))MB"
1364                fi
1365            else
1366                partition_size=`SizeOfPartition $current_partition`
1367            fi
1368        fi
1369        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1370        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1371        if [ "$partition_mountpt" = "" ] ; then
1372            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1373                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1374                    partition_mountpt="raid"
1375                    partition_format="raid"
1376                else
1377                    partition_mountpt="lvm"
1378                    partition_format="lvm"
1379                fi
1380            fi
1381        fi
1382        psz=$partition_size
1383        LogFile "INFO: Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1384        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1385        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1386            partition_mountpt="image"
1387            old_partition_fmt=$partition_format
1388            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1389            partition_size=$(($partition_size+1)); # just in case
1390            if [ "$partition_format" = "Linux" ] ; then
1391                LogFile "WARNING: Are you imaging a mounted swap partition? Silly..."
1392                LogFile "WARNING: Reverting format from $old_partition_fmt to $partition_format"
1393                partition_format=$old_partition_fmt
1394            fi
1395        fi
1396
1397        if [ ! "$partition_mountpt" ] ; then
1398            LogFile "------- $FDISK -l $qq log ------------"
1399            for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1400                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1401                [ "$partition_format" ] && break
1402            done
1403            LogFile "------- $FDISK log end ------------"
1404            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1405                partition_format="compaq"
1406            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1407                LogAll "WARNING: Unable to find mountpoint of $current_partition - ignoring"
1408                continue
1409            fi
1410        fi
1411        if [ "$redhat_label" ]; then
1412            label="$redhat_label"
1413        elif [ "$uuid" ]; then
1414            label="$uuid"
1415        fi
1416        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1417        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1418        unofficial_outstring=`printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1419        if [ "$current_partition" = "" ] ; then
1420            LogFile "WARNING: Unknown partition (outstring = $unofficial_outstring)"
1421        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1422            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1423                partition_mountpt=raid
1424                partition_format=raid
1425                printf "%-15s %-15s %-15s %7s %15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1426                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1427            else
1428                LogFile "WARNING: Unknown mountpoint (outstring = $unofficial_outstring)"
1429            fi
1430        elif [ "$partition_format" = "" ] ; then
1431            LogFile "WARNING: Unknown format (outstring = $unofficial_outstring)"
1432        elif [ "$partition_size" = "" ] ; then
1433            LogFile "WARNING: Unknown partition size (outstring = $unofficial_outstring)"
1434        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1435            continue
1436        else
1437            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1438                LogFile "WARNING: vfat should be used instead of dos/msdos as a partition format"
1439                partition_format="vfat"
1440            fi
1441            printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1442            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1443        fi
1444    done
1445    LogAll "-----------------------------------" 
1446}
1447
1448CheckMountlist() {
1449    local file=$1
1450    # Coherency verification
1451    ML01=`cat $file | wc -l`
1452    ML02=`grep -vE ' lvm | raid | swap ' $file | wc -l`
1453    ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1454    ML2=`grep -vE ' lvm | raid | swap ' $file | $AWK '{print $2}' | sort -u | wc -l`
1455    if [ "$ML01" -ne "$ML1" ]; then
1456        LogFile "--------------------------------------------"
1457        LogAll "WARNING: Duplicate device entry in mountlist"
1458        LogFile "--------------------------------------------"
1459    fi
1460    if [ "$ML02" -ne "$ML2" ]; then
1461        LogFile "--------------------------------------------"
1462        LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1463        LogFile "------------------------------------------------"
1464    fi
1465}
1466
1467OfferToMakeBootableISO() {
1468    local i old_pwd
1469    if [ -z "$ISO_CMD" ]; then
1470        LogAll "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
1471        return
1472    fi
1473    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1474        echo -en "Shall I make a bootable CD image? (y/[n]) "
1475        read i
1476        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1477    fi
1478    rm -Rf $MINDI_TMP/iso
1479    mkdir -p $MINDI_TMP/iso/{images,archives}
1480    LogFile "INFO: mindi_lib = $MINDI_LIB"
1481    cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogAll "WARNING: OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1482    for i in memdisk memtest.bin memtest.img ; do
1483        j=$MINDI_LIB/$i
1484        k=$MINDI_TMP/iso
1485        if [ -e "$j" ] ; then
1486            LogAll "INFO: Copying $j to $k"
1487            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1488            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1489            if [ _"$MONDO_SHARE" != _"" ]; then 
1490                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1491            fi
1492        fi
1493    done
1494    MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
1495    if [ $KERNEL_IS_XEN = "yes" ]; then
1496        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?"
1497        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?"
1498    fi
1499    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?"
1500    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?"
1501
1502    if [ _"$MONDO_SHARE" != _"" ]; then 
1503        if [ $KERNEL_IS_XEN = "yes" ]; then
1504            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?"
1505            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?"
1506        fi
1507        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?"
1508        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?"
1509    fi
1510    MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1511    if [ "$ARCH" != "ia64" ] ; then
1512        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?"
1513    fi
1514    old_pwd=`pwd`
1515    cd "$MINDI_TMP/iso"
1516    if [ "$ARCH" != "ia64" ] ; then
1517        if [ _"$MONDO_SHARE" != _"" ]; then 
1518            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?"
1519            if [ $KERNEL_IS_XEN = "yes" ]; then
1520                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?"
1521            fi
1522            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1523        fi
1524        $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
1525    else
1526        $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
1527    fi
1528    if [ "$?" -ne "0" ] ; then
1529        LogFile "----------- $ISO_CMD's errors --------------"
1530        LogAll "$ISO_CMD returned the following errors:"
1531        cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
1532        LogAll "ERROR: Failed to create ISO image."
1533    else
1534        LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1535    fi
1536    rm -f $MINDI_TMP/mkisofs.log
1537    cd "$old_pwd"
1538}
1539
1540
1541OfferToMakeBootableUSB() {
1542    local i
1543    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1544        echo -n "Shall I make a bootable USB device ? (y/[n]) "
1545        read i
1546        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1547        if [ "$USBDEVICE" = "" ]; then
1548            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1549            read dev
1550            USBDEVICE=$dev
1551        fi
1552        echo "WARNING: This will erase all content on $USBDEVICE"
1553        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1554        read i
1555        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1556    fi
1557    rm -Rf $MINDI_TMP/usb
1558    mkdir -p $MINDI_TMP/usb
1559    USBPART="${USBDEVICE}1"
1560
1561    echo -en "Transforming $USBDEVICE in a Bootable device " 
1562    echo -en "."
1563    LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1564    LogFile "INFO: Checking $USBDEVICE"
1565    $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1566    if [ $? -ne 0 ]; then
1567        LogAll "ERROR: Unable to access $USBDEVICE"
1568        LogAll "       Make sure your USB device is plugged in"
1569        MindiExit -1
1570    fi
1571    echo -en "."
1572    # Some distro do auto mount at that point (Ubuntu)
1573    LogFile "INFO: Unmounting $USBPART just in case"
1574    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1575    # If your key has no MBR it may cause an issue
1576    # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1577    if [ -r $MBRFILE ]; then
1578        LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
1579        dd if=$MBRFILE of=$USBDEVICE
1580    else
1581        LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1582        LogAll "         on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
1583    fi
1584    LogFile "INFO: Preparing $USBDEVICE"
1585    cat > $MINDI_TMP/fdisk.txt << EOF
1586d
1587d
1588d
1589d
1590n
1591p
15921
1593
1594
1595t
1596b
1597a
15981
1599w
1600EOF
1601    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
1602    if [ $? -ne 0 ]; then
1603        LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
1604        LogAll "       Make sure your USB device is plugged in"
1605        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1606        MindiExit -1
1607    fi
1608    LogFile "fdisk build file"
1609    LogFile "----------------"
1610    cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1611    LogFile "----------------"
1612    rm -f $MINDI_TMP/fdisk.txt
1613    LogFile "INFO: The USB device $USBDEVICE now looks like this:"
1614    $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1615    echo -en "."
1616    # Calling kpartx in case devices were not created
1617    if [ -x "/sbin/kpartx" ]; then
1618        /sbin/kpartx -a $USBDEVICE
1619    fi
1620    # Some distro do auto mount at that point (Ubuntu)
1621    LogFile "INFO: Unmounting $USBPART just in case again"
1622    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1623    echo -en "."
1624    # Some distro have a dmsetup conf at that point so removing it Cf: http://trac.mondorescue.org/ticket/651
1625    if [ "`which dmsetup`" != "" ]; then
1626        block_id="`echo $USBPART | sed 's|/dev/||g'`"
1627        if [[ "`dmsetup ls | awk '{print $1}' | grep $block_id`" != "" ]]; then
1628            LogFile "INFO: Removing $block_id from device mapper."
1629            sleep 1
1630            dmsetup remove $block_id
1631        fi
1632    fi
1633    echo -en "."
1634    LogFile "INFO: Creating a vfat filesystem on $USBPART"
1635    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1636    if [ $? -ne 0 ]; then
1637        LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
1638        LogAll "       Make sure your USB device is plugged in and partitioned ($USBPART must exist on it)"
1639        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1640        MindiExit -1
1641    fi
1642    echo -en "."
1643    LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
1644    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1645    if [ $? -ne 0 ]; then
1646        LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
1647        LogAll "       Make sure your USB device is plugged in, partitioned and formated ($USBPART must exist on it)"
1648        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1649        MindiExit -1
1650    fi
1651    echo -en "."
1652    mkdir -p $MINDI_TMP/usb/images
1653    cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogAll "ERROR: OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1654    echo -en "."
1655    LogFile "INFO: mindi_lib = $MINDI_LIB"
1656    for i in memdisk memtest.bin memtest.img ; do
1657        j=$MINDI_LIB/$i
1658        k=$MINDI_TMP/usb
1659        if [ -e "$j" ] ; then
1660            LogIt "INFO: Copying $j to $k"
1661            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1662            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1663        fi
1664    done
1665    echo -en "."
1666    MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
1667    echo -en "."
1668    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?"
1669    echo -en "."
1670    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1671    echo -en "."
1672    MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1673    echo -en "."
1674    LogAll "----------- syslinux's conf --------------"
1675    cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1676    LogAll "------------------------------------------"
1677    umount $MINDI_TMP/usb
1678    if [ "$ARCH" != "ia64" ] ; then
1679        syslinux -v 2>&1 | grep -q 4.02
1680        if [ $? -eq 0 ]; then
1681            # This buggy version of syslinux requires a call to --stupid and not -s
1682            syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1683            res=$?
1684        else
1685            syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1686            res=$?
1687        fi
1688        if [ $res -ne 0 ] ; then
1689            LogAll "----------- syslinux's errors --------------"
1690            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1691            LogAll "------------------------------------------"
1692            LogIt "ERROR: Failed to create USB image."
1693        else
1694            echo -e "$DONE"
1695            LogFile "INFO: Created bootable USB image on $USBDEVICE"
1696        fi
1697        rm -f $MINDI_TMP/syslinux.log
1698    else
1699        LogAll "ERROR: No USB boot support for ia64"
1700        MindiExit -1
1701    fi
1702}
1703
1704
1705MakeMessageFile() {
1706   
1707    if [ -x "/bin/lsb_release" ]; then
1708        DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1709    elif [ -r /etc/arch-release ]; then  # this code must be written before /etc/issue test to avoid errors                             
1710        DESC="Arch Linux"                                                                                                           
1711        if [ -r /var/log/pacman.log ]; then                                                                                         
1712            # there are no releases but we can get the last system upgrade                                                     
1713            # Output example:   Arch Linux [2011-03-03 01:39]                                                                   
1714            DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"                           
1715        fi
1716    elif [ -r /etc/issue.net ]; then
1717        DESC=`head -1 /etc/issue.net`
1718    elif [ -r /etc/issue ]; then
1719        DESC=`head -1 /etc/issue`
1720    elif [ -x "/usr/bin/pbdistrocheck" ]; then
1721        # For pb >= 0.9.8
1722        DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
1723    else
1724        DESC="Unknown desc"
1725    fi
1726    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/"
1727    if [ _"$MONDO_SHARE" != _"" ]; then
1728        if [ "$CDRECOVERY" != "yes" ] ; then
1729            if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1730                echo -en "Press <enter> to continue.\n"
1731            elif [ ! "$MINDI_TMP" ] ; then
1732                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1733                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1734                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1735                fi
1736            else
1737                echo -en "$BOOT_MEDIA_MESSAGE"
1738            fi
1739        else
1740            echo -en "\
1741To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1742CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1743        fi
1744    fi
1745    echo -en "\n\n\n"
1746}
1747
1748
1749MakeBootConfFile() {
1750    local options i ooo
1751    options=""
1752    # Type of boot file (elilo or syslinux/isolinux)
1753    type=$1
1754    if [ "$type" = "elilo" ]; then
1755        sep="="
1756    else
1757        sep=" "
1758    fi
1759
1760    # Generic header for conf file
1761    if [ "$type" != "elilo" ] ; then
1762        echo -en "prompt 1\ndisplay message.txt\n"
1763    else
1764        echo -en "prompt\n"
1765    fi
1766
1767    # Compute which default option to boot from
1768    if [ "$CDRECOVERY" = "yes" ] ; then
1769        echo -en "default${sep}RESTORE\n"
1770    # In case it's mondoarchive
1771    elif [ _"$MONDO_SHARE" != _"" ]; then
1772        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1773            echo -en "default${sep}iso\n"
1774        else
1775            echo -en "default${sep}${MINDI_DEFAULT_BOOT_OPTION}\n"
1776        fi
1777    else
1778        echo -en "default${sep}expert\n"
1779    fi
1780
1781    # Handle timeout
1782    if [ "$CDRECOVERY" != "yes" ] ; then
1783        echo -en "timeout${sep}${MINDI_BOOT_TIMEOUT}\n"
1784    else
1785        echo -en "timeout${sep}10000\n"
1786    fi
1787    echo -en "\n"
1788
1789    # prepare which labels will be generated
1790    if [ "$CDRECOVERY" = "yes" ] ; then
1791        options="RESTORE expert"
1792    else
1793        if [ _"$MONDO_SHARE" != _"" ]; then
1794            options="interactive expert compare iso nuke isonuke"
1795        else
1796            options="expert"
1797        fi
1798    fi
1799
1800    # Generate rest of conf file
1801    for i in $options ; do
1802        ooo=$i
1803        [ "$ooo" = "RESTORE" ] && ooo="RESTORE nuke"
1804        if [ "$type" = "elilo" ]; then
1805            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"
1806        else
1807            ps="/"
1808            if [ "$type" = "syslinux" ]; then
1809                ps=""
1810            fi
1811            if [ $KERNEL_IS_XEN = "no" ]; then
1812                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"
1813            else
1814                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"
1815            fi
1816        fi
1817        echo -en "$outstr"
1818    done
1819    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1820        if [ "$type" = "elilo" ]; then
1821            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1822            echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1823        else
1824            ps="/"
1825            if [ "$type" = "syslinux" ]; then
1826                ps=""
1827            fi
1828            echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1829            echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1830        fi
1831    fi
1832}
1833
1834
1835PrepareBootDiskImage_LILO() {
1836    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1837    imagesdir=$MINDI_CACHE
1838    kernelpath=$1
1839
1840    retval=0
1841
1842    old_pwd=`pwd`
1843    [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
1844    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1845    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?"
1846    echo -en "..."
1847    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1848    mountpoint=$MINDI_TMP/mountpoint.$$
1849    mkdir -p $mountpoint
1850    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1851    LogFile "Creating vfat filesystem on $imagefile" 
1852    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1853    mount -t vfat -o loop $imagefile $mountpoint || LogAll "ERROR: Cannot mount (PBDI)"
1854
1855    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1856    mkdir -p $mountpoint/etc
1857    liloconf=$mountpoint/elilo.conf
1858
1859    MakeBootConfFile elilo > $liloconf
1860
1861    # Copy it so that CD-ROM menu entry is satisfied
1862    mountefi=0
1863    df -T | grep /boot/efi | grep -q vfat
1864    if [ $? -ne 0 ]; then
1865        mount /boot/efi
1866        if [ $? -ne 0 ]; then
1867            echo "You have to mount your EFI partition when using mindi"
1868            MindiExit -1
1869        fi
1870        mountefi=1
1871    fi
1872    el=`find /boot/efi -name elilo.efi`
1873    cp $el $mountpoint
1874    cp $liloconf $mountpoint
1875    if [ $mountefi -eq 1 ]; then
1876        umount /boot/efi 2>&1 > /dev/null
1877    fi
1878
1879    LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
1880    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1881    if [ "$?" -ne "0" ] ; then
1882        LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1883        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1884        LogIt "       Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1885        rm -f $MINDI_TMP/mtpt.$$
1886        LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1887        retval=$(($retval+1))
1888    fi
1889    MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1890
1891    mkdir -p $mountpoint/tmp
1892    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1893        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1894    fi
1895
1896    # copy the kernel across
1897    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1898    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1899    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1900    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1901    if [ "$?" -ne "0" ] ; then
1902        LogFile "INFO: Files at mountpoint ($mountpoint) :"
1903        du -sk $mountpoint/* >> $LOGFILE
1904        LogFile "--- end of list of files ---"
1905        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1906        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1907        cd "$old_pwd"
1908        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1909        rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1910    #   losetup /dev/loop0 -d
1911        [ "$imagefile" != "" ] && rm -f $imagefile
1912        LogIt "ERROR: Sorry, your kernel is too big for your image"
1913        Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1914        return 0
1915    fi
1916    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1917    LogFile "INFO: Free space left on image = $free_space KB"
1918    LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1919    # make it bootable
1920    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1921    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1922    if [ "$KERN_DISK_MADE" ] ; then
1923        LogFile "INFO: Not running LILO. It's not that kind of disk."
1924    fi
1925
1926    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1927    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1928    echo -en "..."
1929    rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1930    if [ "$retval" -eq "0" ] ; then
1931        echo -en "...$DONE\n"
1932        if [ "$KERN_DISK_MADE" ] ; then
1933            LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
1934        fi
1935    else
1936        echo -en "...failed\n"
1937        LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
1938        [ "$imagefile" != "" ] && rm -f $imagefile
1939    fi
1940    [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
1941    return $retval
1942}
1943
1944
1945PrepareBootDiskImage_ISOLINUX() {
1946    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage retval
1947    imagesdir=$MINDI_CACHE
1948    kernelpath=$1
1949    do_boot_root_thingy=""
1950    retval=0
1951
1952    old_pwd=`pwd`
1953    [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
1954    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1955    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?"
1956    echo -en "..."
1957    imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1958    mountpoint=$MINDI_TMP/mountpoint.$$
1959    mkdir -p $mountpoint
1960    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1961    LogFile "INFO: Creating vfat filesystem on $imagefile"
1962    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1963    # syslinux should be run on a  local file (doen't work through NFS Cf: #297)
1964    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1965
1966    # Only move it now to its final destination and use it now
1967    mv $imagefile $imagesdir
1968    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1969
1970    mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1971
1972    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1973    MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1974    MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1975    LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1976    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1977    if [ "$?" -ne "0" ] ; then
1978        LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1979        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1980        LogAll "       Please unload some of your modules and try again."
1981        rm -f $MINDI_TMP/mtpt.$$
1982        LogAll "       Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1983        LogAll "       Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1984        retval=$(($retval+1))
1985    fi
1986
1987    mkdir -p $mountpoint/tmp
1988    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1989        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1990    fi
1991
1992    # copy the kernel across
1993    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1994    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1995    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1996         
1997    retval=0
1998    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1999    retval=$?
2000    if [ $KERNEL_IS_XEN = "yes" ]; then
2001        cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
2002        let retval+=$?
2003    fi
2004 
2005    if [ "$retval" -ne "0" ] ; then
2006        LogFile "INFO: Files at mountpoint ($mountpoint) :"
2007        du -sk $mountpoint/* >> $LOGFILE
2008        LogFile "--- end of list of files ---"
2009        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
2010        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
2011        cd "$old_pwd"
2012        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2013        rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
2014
2015        LogIt "ERROR: Sorry, your kernel is too big for your image"
2016        Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
2017    fi
2018    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2019    LogFile "INFO: Free space left on image = $free_space KB"
2020    LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
2021
2022    # make it bootable
2023    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
2024    mkdir -p $mountpoint/etc
2025    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2026    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2027    echo -en "..."
2028    rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
2029
2030    if [ "$retval" -eq "0" ] ; then
2031        echo -en "...$DONE\n"
2032        if [ "$KERN_DISK_MADE" ] ; then
2033            [ "$imagefile" != "" ] && rm -f $imagefile
2034            LogAll "INFO: $BOOT_SIZE KB boot disks were created OK\n"
2035        fi
2036    else
2037        echo -en "...failed\n"
2038        LogAll "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
2039        [ "$imagefile" != "" ] && rm -f $imagefile
2040    fi
2041    [ "$retval" -ne "0" ] && LogAll "ERROR: PrepareBootDiskImage() is returning nonzero"
2042    return $retval
2043}
2044
2045
2046ParseModprobeForIncludes() {
2047local MODPROBE_CONF mpincfile includes include
2048
2049MODPROBE_CONF=/etc/modprobe.conf
2050mpincfile=$1
2051touch $mpincfile
2052if [ -a $MODPROBE_CONF ]; then
2053    includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
2054    if [ -n "$includes" ]; then
2055        for include in $includes
2056        do
2057            if [ -a "$include" ]; then
2058                echo $include >> $mpincfile
2059            fi
2060        done
2061    fi
2062fi
2063}
2064
2065
2066PrepareDataDiskImages() {
2067    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
2068
2069    imagesdir=$MINDI_CACHE
2070    rm -f $imagesdir/mindi.iso
2071    needlist=$MINDI_TMP/what-we-need.txt
2072    bigdir=$MINDI_TMP/bigdir
2073    mkdir -p $bigdir/usr/bin
2074    mkdir -p $bigdir/usr/sbin
2075    includefile=$MINDI_TMP/$$.includefile.txt
2076
2077    lfiles=`ls $DEPLIST_DIR/* | grep -v /minimal`
2078    if [ -e "$DEPLIST_FILE" ]; then
2079        lfiles="$DEPLIST_FILE $lfiles"
2080    fi
2081    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
2082    ParseModprobeForIncludes $includefile
2083    lines=$(($lines+`cat $includefile | wc -l`))
2084    cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
2085    res=$?
2086    rm -f $includefile
2087    if [ "$YOUR_KERNEL_SUCKS" ]; then
2088        pwd=`pwd`
2089        cd "$MINDI_TMP"
2090        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2091            tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
2092        done
2093        for i in $EXTRA_MODS ; do
2094            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2095            [ ! "$j" ] && LogFile "WARNING: cannot find failsafe module $i.o.gz"
2096            for k in $j ; do
2097                tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2098                LogFile "INFO: Added failsafe module $k to ramdisk"
2099            done
2100        done
2101        cd "$pwd"
2102    else
2103        ListKernelModulePaths >> $needlist
2104    fi
2105    if [ "$res" -ne "0" ] ; then
2106        Die "You have $res files present in dependency list\nbut absent from filesystem."
2107    fi
2108    FindAndAddUserKeyboardMappingFile
2109    mkdir -p $bigdir/tmp
2110    if [ _"$MONDO_SHARE" != _"" ]; then
2111        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2112        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2113    fi
2114    [ -d "/mnt/.boot.d" ] && echo "GENTOO" > $bigdir/tmp/DUMBASS-GENTOO
2115    DropOptimizedLibraries $needlist $bigdir
2116    echo -en "Assembling dependency files"
2117
2118    CopyDependenciesToDirectory < $needlist $bigdir `wc -l $needlist`
2119
2120    # also copy io.sys and msdos.sys, if we can find them
2121    for i in `mount | cut -d' ' -f3` ; do
2122        for j in io.sys msdos.sys ; do
2123            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2124        done
2125    done
2126
2127    # master boot record, too
2128    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2129    if [ "$i" ] ; then
2130        LogAll "INFO: Backing up $i's MBR"
2131        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2132        sleep 1
2133        sync
2134        j=$i
2135        [ -h "$j" ] && j=`readlink -f $j`
2136        LogAll "INFO: Creating /dev/boot_device ($j)"
2137        mkdir -p $bigdir/dev
2138        cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
2139    fi
2140
2141    old_pwd=`pwd`
2142    cd "$bigdir"
2143
2144    # Get terminfo content
2145    ti="usr/share/terminfo/l"
2146    if [ -d /$ti ]; then
2147        mkdir -p $ti
2148        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "ERROR: issue copying terminfo"
2149    fi
2150    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
2151        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2152        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2153    fi
2154    if [ -d "/lib/dev-state" ]; then 
2155        tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2156    fi
2157    cd "$old_pwd"
2158    echo -e "$DONE"
2159    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2160    MakeMountlist $MINDI_TMP/mountlist.txt
2161    CheckMountlist $MINDI_TMP/mountlist.txt
2162    mkdir -p $bigdir/tmp
2163    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
2164    if [ _"$MONDO_SHARE" != _"" ]; then
2165        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2166    fi
2167    if [ $LVM != "false" ]; then
2168        $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2169        if [ "$?" -ne "0" ]; then
2170            LVM="false"
2171            rm -f $bigdir/tmp/i-want-my-lvm
2172        else
2173            LogFile "Your i-want-my-lvm file content is:"
2174            LogFile "-----------------------------------"
2175            cat  $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2176            LogFile "-----------------------------------"
2177        fi
2178    fi
2179    LogFile "Your mountlist.txt file content is:"
2180    LogFile "-----------------------------------"
2181    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2182    LogFile "-----------------------------------"
2183
2184    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2185    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2186    if [ _"$MONDO_SHARE" != _"" ]; then
2187        for q in filelist.full.gz biggielist.txt ; do
2188            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2189            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2190        done
2191    fi
2192
2193    echo -en "Tarring and zipping the data content..."
2194    size_of_all_tools=`du -sk $bigdir | cut -f1`
2195    (cd "$bigdir" ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogAll "ERROR: Problem creating all.tar.gz" $MINDI_TMP/$$.log)
2196    LogFile "Size of the data content"
2197    LogFile "------------------------"
2198    du -sk $imagesdir/*gz >> $LOGFILE
2199    LogFile "------------------------"
2200    echo -e "$DONE"
2201
2202    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2203    rm -rf $bigdir
2204    rm -f $needlist
2205}
2206
2207
2208ProcessLDD() {
2209    local incoming f d nd bd bnd
2210    read incoming
2211    while [ "$incoming" != "" ]; do
2212        # We take the full path name of the dyn. lib. we want
2213        incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2214        for f in $incoming ; do
2215            # echo modified file name if one of the parent dir is a link
2216            # by replacing the original dirname by the destination of the link
2217            d="`dirname $f`"
2218            found="false"
2219            while [ "$d" != "/" ]; do
2220                if [ -h "$d" ]; then
2221                    nd=`readlink -f $d`
2222                    bd=`basename $d`
2223                    bnd=`basename $nd`
2224                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2225                    echo $d
2226                fi
2227                d="`dirname $d`"
2228            done
2229
2230            echo "$f"
2231            echo "`ReadAllLink $f`"
2232        done
2233        read incoming
2234    done
2235}
2236
2237
2238Prompt() {
2239    echo -en "$1"
2240    read line
2241}
2242
2243
2244ReadLine() {
2245    local i incoming
2246    read incoming
2247    i=0
2248    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2249        i=$(($i+1))
2250        read incoming
2251    done
2252    echo "$incoming"
2253}
2254
2255
2256SizeOfPartition() {
2257    local devpath drive res stub
2258    device=$1
2259    if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2260        Die "Cannot find $device's size - is your /etc/fstab sane?"
2261    fi
2262    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2263        res=`SizeOfRaidPartition $device`
2264        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2265        echo "$res"
2266        return 0
2267    fi
2268    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2269    res=`$FDISK -s $device 2>> $LOGFILE`
2270    # end patch
2271    # take only the first in case of multiple mount (cifs, nfs, ...)
2272    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2273    [ "$res" = "" ] && res="-1"
2274    echo $res
2275    return 0
2276}
2277
2278
2279SizeOfRaidPartition() {
2280    local real_dev smallest_size silly tmp
2281
2282    silly=999999999
2283    smallest_size=$silly
2284
2285    for real_dev in `GetRaidDevMembers $1` ; do
2286        tmp=`SizeOfPartition $real_dev`
2287        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2288    done
2289
2290    if [ "$smallest_size" = "$silly" ] ; then
2291        echo "-1"
2292        return 1
2293    else
2294        echo "$smallest_size"
2295        return 0
2296    fi
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/|^/mnt|^/lib|^/lib64|^/bin|^/sbin|^/usr|^/tmp'` ; 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        LogAll "INFO: No kernel matches exactly. Are there any duff kernels?"
2387        possible_kernels="$duff_kernels"
2388        if [ ! "$possible_kernels" ] ; then
2389            LogAll "INFO: Sorry, no duff kernels either"
2390        else
2391            LogAll "INFO: I bet you're running Debian or Gentoo, aren't you?"
2392            LogAll "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        LogAll "Could not find your kernel."
2404        if [ -e "/boot/vmlinuz" ] ; then
2405            LogAll "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                LogAll "INFO: OK, I used my initiative and found that "
2418                LogAll "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    # 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    # recent bash says that -d is true for a link to a dir !
2577    for f in `sort -u $MINDI_TMP/minimal.lis`; do
2578        if [ -e $f -a ! -d $f ] || [ -h $f ]; then
2579            finallist="$finallist $f"
2580        fi
2581    done
2582    tar cf - $finallist 2>> $MINDI_TMP/$$.log | tar xUf - || LogIt "WARNING: Problem in minimal analysis" $MINDI_TMP/$$.log
2583
2584    # To improve support for distribution scripts, we now prefer to use bash as the std shell. Also fixes #600
2585    ln -sf /bin/bash bin/sh
2586    LogIt "INFO: Using bash as default shell"
2587    rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2588
2589    # Avoids an issue on some distro (RHEL5)
2590    rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2591
2592    mkdir -p $mountpoint/tmp
2593    # Management of udev (which includes modprobe in rules)
2594    ps auxww | grep -v grep | grep -qw udevd
2595    if [ $? -eq 0 ]; then
2596        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2597        LogIt "INFO: udev device manager found"
2598        tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2599        # This avoids NIC remapping if on another machine at restore time on Debian at least
2600        rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2601        # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2602        rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2603        # Do not do it if it's a link (Ubuntu 64 bits #503)
2604        if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [  ! -h "/lib64/udev" ]; then
2605            tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
2606        fi
2607        if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [  ! -h "/lib32/udev" ]; then
2608            tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
2609        fi
2610        if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [  ! -h "/lib/udev" ]; then
2611            tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2612        fi
2613        if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
2614            lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
2615            lis=""
2616            # Get only the files which exist in that list
2617            # and potentially their symlink structure
2618            for i in $lis2; do
2619                if [ -h $i ]; then
2620                    j=$i
2621                    while [ -h $j ]; do
2622                        lis="$lis $j"
2623                        j=`readlink $j`
2624                    done
2625                    lis="$lis $j"
2626                elif [ -f $i ]; then
2627                    lis="$lis $i"
2628                fi
2629            done
2630            # And their deps
2631            LocateDeps $lis > $MINDI_TMP/udev.lis
2632            for i in $lis; do
2633                if [ "`echo $i | cut -c1`" = "/" ]; then
2634                    j=`echo $i | cut -c2-`
2635                    [ "$j" != "" ] && rm -f $j
2636                fi
2637            done
2638            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
2639            rm -f $MINDI_TMP/udev.lis
2640        else
2641            LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
2642            LogAll "         mindi will use static devices which may cause problems"
2643            rm -f $mountpoint/tmp/USE-UDEV
2644        fi
2645    fi
2646
2647    # Management of potential HW info (ProLiant only at the moment)
2648    rm -rf $MINDI_CACHE/bkphw
2649    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2650    if [ -d $MINDI_CACHE/bkphw ]; then
2651        LogIt "INFO: Hardware Information found and saved ..."
2652        cp -rp $MINDI_CACHE/bkphw .
2653        if [ -f $MINDI_CACHE/tools.files ]; then
2654            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2655            LocateDeps $lis > $MINDI_TMP/tools.lis
2656            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
2657        fi
2658        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2659            mv -f $MINDI_CACHE/mindi-rsthw .
2660            chmod 755 ./mindi-rsthw
2661        fi
2662        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2663    fi
2664
2665    # Management of perl scripts delivered needed at restore time
2666    mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2667    tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
2668
2669    for w in cdrom groovy-stuff ; do
2670        mkdir -p mnt/$w
2671    done
2672
2673    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
2674
2675    cd "$old_pwd"
2676    echo -en "..."
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    for d in "/lib" "/usr/lib"; do
2735        if [ -d "$d/firmware" ]; then
2736            cp -a "$d/firmware" "$mountpoint/$d"
2737        fi
2738    done
2739
2740    # Copy multipath dynamic libraries in case multipath is used (RHEL 6.4 and later)
2741    for d in "/lib" "/usr/lib" "/lib64" "/usr/lib64"; do
2742        if [ -d "$d/multipath" ]; then
2743            cp -a "$d/multipath" "$mountpoint/$d"
2744        fi
2745    done
2746
2747    # Copy an additional ProLiant tool for OBDR support
2748    if [ -f $MINDI_TMP/OBDR ]; then
2749        found=0
2750        if [ -x /usr/bin/hpsa_obdr_mode ]; then
2751            mkdir -p $mountpoint/usr/bin
2752            cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
2753            LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved Smart Array OBDR support"
2754            found=1
2755        fi
2756        if [ -x /usr/bin/sg_wr_mode ]; then
2757            mkdir -p $mountpoint/usr/bin
2758            lis="/usr/bin/sg_map /usr/bin/sg_inq /usr/bin/sg_reset /usr/bin/rev"
2759            LocateDeps $lis > $MINDI_TMP/obdr.lis
2760            (cd $mountpoint ; tar cf - $lis -C /  `sort -u $MINDI_TMP/obdr.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in obdr.lis analysis" $MINDI_TMP/$$.log)
2761            LogIt "INFO: Copying /usr/bin/sg_reset to ramdisk for improved SCSI OBDR support"
2762            found=1
2763        fi
2764        if [ $found -eq 0 ]; then
2765            LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode nor the /usr/bin/sg_wr_mode tool"
2766            LogAll "         This may lead to a tape not going back to sequential mode after OBDR boot"
2767        fi
2768    fi
2769
2770    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2771        LogFile "INFO: Deleting devfsd daemon from ramdisk"
2772        [ ! -e "/sbin/devfsd" ] && LogFile "      ...because /sbin/devfsd not found"
2773        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "      ...because kernel is failsafe"
2774        rm -f $mountpoint/sbin/devfsd
2775    fi
2776    cd "$old_pwd"
2777    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2778    if [ _"$MONDO_SHARE" != _"" ]; then
2779        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2780        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2781        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2782        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2783        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2784        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2785        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2786        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2787        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2788    fi
2789    mkdir -p $mountpoint/proc
2790    LogFile "---------------------------"
2791    LogFile "Content of initial ramdisk:"
2792    LogFile "---------------------------"
2793    (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
2794    LogFile "---------------------------"
2795
2796    # Determine what filesystem to use for initrd image
2797    LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2798    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2799    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2800    if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ] || [ "$gvFileSystem" = "ext4fs" ]; then
2801        # say what will be used
2802        LogFile "INFO: Creating an $gvFileSystem initrd image..."
2803        # kernel expects linuxrc in ext2 filesystem
2804        ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
2805        # unmount loop filesystem and create image file using the standard approach
2806        umount $mountpoint || Die "Cannot unmount $tempfile"
2807        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2808        if [ "$gvFileSystem" = "ext4fs" ] && [ -x "/sbin/tune4fs" ]; then
2809            bs=`/sbin/tune4fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2810        else
2811            bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2812        fi
2813        MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2814        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2815        rm -f ${rdz_fname}.tmp
2816        # log that we are done
2817        LogFile "      ...done."
2818    elif [ "$gvFileSystem" = "initramfs" ]; then
2819        # say what will be used
2820        LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2821        # make sure that cpio is there
2822        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2823        # go into filesystem
2824        cd "$mountpoint"
2825        # kernel expects init in cpio filesystem
2826        ln -sf sbin/init init
2827        # create cpio image file and unmount loop filesystem
2828        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2829        cd "$old_pwd"
2830        umount $mountpoint || Die "Cannot unmount $tempfile"
2831        # log that we are done
2832        LogFile "      ...done."
2833    else
2834        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2835    fi
2836
2837    if [ "$res" -eq "0" ] ; then
2838        echo -en "..."
2839    else
2840        echo -en "\rMade an rdz WITH ERRORS.           \n"
2841    fi
2842    return 0
2843}
2844
2845
2846##############################################################################
2847#----------------------------------- Main -----------------------------------#
2848##############################################################################
2849
2850# Now we can create what we need
2851mkdir -p $MINDI_TMP
2852
2853# Purge from potential old run
2854if [ _"$MINDI_CACHE" = _"" ]; then
2855    Die "MINDI_CACHE undefined"
2856fi
2857
2858# --nolog needs to be first, and is used in analyze-my-lvm
2859if [ "$1" = "--nolog" ] ; then
2860    shift
2861    LOGFILE=/dev/stderr
2862else
2863    > $LOGFILE
2864fi
2865if [ "$1" = "--printvar" ] ; then
2866    shift
2867    if [ _"$1" != _"" ] ; then
2868        set | grep -Ew "^$1" | cut -d= -f2
2869    fi
2870    exit 0
2871fi
2872
2873LogFile "mindi v$MINDI_VERSION"
2874LogFile "$ARCH architecture detected"
2875LogFile "mindi called with the following arguments:"
2876echo "$@">> $LOGFILE
2877LogFile "Start date : `date`"
2878LogFile "-----------------------------"
2879
2880[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && LogAll "/sbin/mkfs.vfat is missing!"
2881
2882# Log some capital variables
2883[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2884[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2885LogFile "MONDO_SHARE = $MONDO_SHARE"
2886LogFile "MINDI_LIB = $MINDI_LIB"
2887LogFile "MINDI_SBIN = $MINDI_SBIN"
2888LogFile "MINDI_CONF = $MINDI_CONF"
2889if [ -f $MINDI_CONFIG ]; then
2890    LogFile "-----------------------------"
2891    LogFile " Mindi configuration file    "
2892    LogFile "-----------------------------"
2893    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2894    LogFile "-----------------------------"
2895fi
2896LogFile "In Mindi"
2897LogFile "--------"
2898LogFile "EXTRA_SPACE = $EXTRA_SPACE"
2899LogFile "BOOT_SIZE = $BOOT_SIZE"
2900LogFile "--------"
2901
2902trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2903
2904# Sanity checks
2905which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2906which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2907which 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."
2908which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2909if which awk &> /dev/null ; then
2910    if ! which gawk &> /dev/null ; then
2911        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"
2912    fi
2913fi
2914which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2915[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2916
2917[ "`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"
2918
2919# Update the PATH variable if incomplete
2920if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2921    PATH=$PATH:/sbin:/usr/sbin
2922    export PATH
2923    LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2924    LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2925    LogFile "INFO:  Or you might like to call 'su -' instead of 'su', for example."
2926fi
2927
2928# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2929if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2930    source $MINDI_LIB/FindDistroFailsafe
2931    # Log kernel image
2932    LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2933else
2934    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2935fi
2936
2937if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2938    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2939fi
2940
2941### TODO
2942### Fix as it's not mandatory on ia64
2943if [ "$ARCH" = "ia64" ] ; then
2944    if which elilo &> /dev/null ; then
2945        LILO_EXE=elilo
2946    else
2947        LILO_EXE=`which false 2> /dev/null`
2948    fi
2949else
2950    FindIsolinuxBinary
2951fi
2952trap "Aborted" SIGTERM
2953DONE="\r\t\t\t\t\t\t\t\tDone.         "
2954kernelpath=""
2955MONDO_ROOT=/var/cache/mondo
2956mkdir -p $MONDO_ROOT
2957
2958if [ -d "/proc/lvm" ]; then
2959    # LVM v1
2960    LVMCMD=""
2961    LVM="v1"
2962elif [ -d "/dev/mapper" ]; then
2963    # LVM v2
2964    LVMCMD="lvm"
2965    LVM="v2"
2966else
2967    LVM="false"
2968fi
2969
2970if [ -e "/proc/cmdline" ]; then
2971    CMDLINE="/proc/cmdline"
2972elif [ -e "/tmp/cmdline" ]; then
2973    CMDLINE="/tmp/cmdline"
2974else
2975    CMDLINE="/dev/null"
2976fi
2977
2978LogFile "INFO: LVM set to $LVM"
2979LogFile "----------"
2980LogFile "mount result:"
2981LogFile "-------------"
2982mount >> $LOGFILE
2983if [ -e /etc/raidtab ]; then
2984    LogFile "-------------"
2985    LogFile "/etc/raidtab content:"
2986    LogFile "-------------"
2987    cat /etc/raidtab >> $LOGFILE
2988else
2989    LogFile "No file /etc/raidtab"
2990fi
2991if [ -e /etc/mdadm.conf ]; then
2992    LogFile "-------------"
2993    LogFile "/etc/mdadm.conf content:"
2994    LogFile "-------------"
2995    cat /etc/mdadm.conf >> $LOGFILE
2996else
2997    LogFile "-------------"
2998    LogFile "No file /etc/mdadm.conf"
2999fi
3000LogFile "-------------"
3001LogFile "cat $CMDLINE"
3002LogFile "-------------"
3003cat $CMDLINE >> $LOGFILE
3004LogFile "-------------"
3005LogFile "cat /proc/swaps:"
3006LogFile "-------------"
3007cat /proc/swaps >> $LOGFILE
3008LogFile "-------------"
3009if [ -e /proc/mdstat ]; then
3010    LogFile "cat /proc/mdstat:"
3011    LogFile "-------------"
3012    cat /proc/mdstat >> $LOGFILE
3013else
3014    LogFile "No pseudo file /proc/mdstat"
3015fi
3016LogFile "-------------"
3017LogFile "cat /proc/partitions:"
3018LogFile "-------------"
3019cat /proc/partitions >> $LOGFILE
3020LogFile "-------------"
3021LogFile "cat /proc/filesystems:"
3022LogFile "-------------"
3023cat /proc/filesystems >> $LOGFILE
3024LogFile "-------------"
3025LogFile "lsmod result:"
3026LogFile "-------------"
3027lsmod >> $LOGFILE
3028MODULES="`cat /proc/modules | $AWK '{print $1}'`"
3029if [ -x /usr/sbin/esxcfg-module ]; then
3030    LogFile "-------------"
3031    LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
3032    LogFile "-------------"
3033    LogFile "VMWare modules"
3034    LogFile "-------------"
3035    /usr/sbin/esxcfg-module -l >> $LOGFILE
3036    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
3037fi
3038LogFile "Liste of extra modules is:" 
3039LogFile "-------------" 
3040LogFile "$EXTRA_MODS" 
3041LogFile "-------------" 
3042LogFile "FORCE_MODS:"
3043LogFile "-------------"
3044LogFile "$FORCE_MODS"
3045LogFile "-------------"
3046LogFile "DENY_MODS:"
3047LogFile "-------------"
3048LogFile "$DENY_MODS"
3049LogFile "-------------"
3050LogFile "df result:"
3051LogFile "----------"
3052df -aT >> $LOGFILE
3053LogFile "-------------"
3054LogFile "df -i result:"
3055LogFile "----------"
3056df -i >> $LOGFILE
3057LogFile "-------------"
3058if [ -r /boot/grub/menu.lst ]; then
3059    LogFile "-------------"
3060    LogFile "INFO: /boot/grub/menu.lst content"
3061    LogFile "-------------"
3062    cat /boot/grub/menu.lst >> $LOGFILE
3063    LogFile "-------------"
3064fi
3065if [ -r /boot/grub/grub.conf ]; then
3066    LogFile "-------------"
3067    LogFile "INFO: /boot/grub/grub.conf content"
3068    LogFile "-------------"
3069    cat /boot/grub/grub.conf >> $LOGFILE
3070    LogFile "-------------"
3071fi
3072if [ -r /boot/grub/grub.cfg ]; then
3073    LogFile "-------------"
3074    LogFile "INFO: /boot/grub/grub.cfg content"
3075    LogFile "-------------"
3076    cat /boot/grub/grub.cfg >> $LOGFILE
3077    LogFile "-------------"
3078fi
3079if [ -r /boot/grub/device.map ]; then
3080    LogFile "-------------"
3081    LogFile "INFO: /boot/grub/device.map content"
3082    LogFile "-------------"
3083    cat /boot/grub/device.map >> $LOGFILE
3084    LogFile "-------------"
3085fi
3086if [ -r /etc/lilo.conf ]; then
3087    LogFile "-------------"
3088    LogFile "INFO: /etc/lilo.conf content"
3089    LogFile "-------------"
3090    cat /etc/lilo.conf >> $LOGFILE
3091fi
3092LogFile "Full fdisk info"
3093LogFile "---------------"
3094$FDISK -l >> $LOGFILE
3095LogFile "----------------"
3096LogFile "List of extra modules is:"
3097LogFile "$EXTRA_MODS"
3098LogFile "-------------"
3099
3100# Compute libata version
3101laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
3102# If libata v2 is used then remove ide-generic as it will perturbate boot
3103if [ "`echo $MODULES | grep libata`" ]; then
3104    if [ "$laver" = "2" ]; then
3105        DENY_MODS="$DENY_MODS ide-generic"
3106        LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
3107        LogFile "-------------"
3108    fi
3109fi
3110
3111# Check for McAfee which disturbs the access to some files (tgz in articular)
3112if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
3113    LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
3114    LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
3115    LogFile "WARNING: You have two options:"
3116    LogFile "WARNING:  - Exclude all directories with special files (check McAfee System Events Log)"
3117    LogFile "WARNING:  - Disable the scanner during the backup"
3118fi
3119
3120# Check for ISO_CMD command
3121if [ ! -x $ISO_CMD ]; then
3122    LogFile "NOTE: No CD image (ISO file) utility found"
3123fi
3124
3125FLOPPY_WAS_MOUNTED=""
3126for mtpt in /media/floppy /mnt/floppy /floppy ; do
3127    if mount | grep -w $mtpt &> /dev/null ; then
3128        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3129        umount $mtpt
3130    fi
3131done
3132
3133#
3134# If we have a USB device we need to store info
3135# and remove it from the parameters line
3136#
3137if [ "$#" -ne "0" ] ; then
3138    if [ "$1" = "--usb" ] ; then
3139        shift
3140        USBDEVICE=$1
3141        if [ _"$USBDEVICE" = _"" ]; then
3142            Die "No USB device specified"
3143        fi
3144        shift
3145    fi
3146fi
3147
3148if [ "$#" -ne "0" ] ; then
3149    if [ "$1" = "--findkernel" ] ; then
3150        resk=`TryToFindKernelPath`
3151        # Avoids logfile content for mondo
3152        export MONDO_SHARE=""
3153        if [ "$resk" = "" ] ; then
3154            if [ $KERNEL_IS_XEN = "yes" ]; then
3155                echo "$xenkernelpath"
3156                LogFile "INFO: xenkernelpath = $xenkernelpath"
3157                MindiExit 0
3158            else
3159                MindiExit -1
3160            fi
3161        else
3162            echo "$resk"
3163            LogFile "INFO: kernelpath = $resk"
3164            MindiExit 0
3165        fi
3166    elif [ "$1" = "--locatedeps" ] ; then
3167        [ ! "$2" ] && Die "Please specify the binary to look at"
3168        LocateDeps $*
3169        # Avoids logfile content for mondo
3170        export MONDO_SHARE=""
3171        MindiExit $?
3172    elif [ "$1" = "--readalllink" ] ; then
3173        [ ! "$2" ] && Die "Please specify the binary to look at"
3174        # Avoids logfile content for mondo
3175        export MONDO_SHARE=""
3176        ReadAllLink $2
3177        MindiExit $?
3178    elif [ "$1" = "--makemessage" ] ; then
3179        MakeMessageFile | cut -c1-80
3180        MindiExit 0
3181    elif [ "$1" = "--makemountlist" ] ; then
3182        [ ! "$2" ] && Die "Please specify the output file"
3183        MakeMountlist $2
3184        CheckMountlist $2
3185        # Avoids logfile content for mondo
3186        export MONDO_SHARE=""
3187        MindiExit $?
3188    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3189        echo "Mindi v$MINDI_VERSION"
3190        # Avoids logfile content for mondo
3191        export MONDO_SHARE=""
3192        MindiExit 0
3193    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3194        MONDO_TMP=$2
3195        # Change MINDI_TMP for the one provided by mondo
3196        # So that it can get back the built files
3197        if [ _"$MONDO_TMP" = _"" ]; then
3198            Die "MONDO_TMP is empty, aborting"
3199        fi
3200        if [ _"$MONDO_TMP" = _"/" ]; then
3201            Die "MONDO_TMP is /, aborting"
3202        fi
3203        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
3204        rmdir $MINDI_TMP
3205        export MINDI_TMP=$MONDO_TMP
3206        mkdir -p $MINDI_TMP
3207
3208        # This is the scratch dir in mondo - subdir images
3209        MINDI_CACHE=$3
3210
3211        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3212        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3213       
3214###
3215### Sq-Modification...
3216### Attempt to locate kernel specific module path
3217### if module path is found then use it other wise use uname -r to set it...
3218###
3219        if [ $KERNEL_IS_XEN = "yes" ]; then
3220            LogAll "INFO: xenkernelpath = $xenkernelpath"
3221        fi
3222        kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
3223        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3224        then
3225           LogAll "WARNING: Module path for ${kernelpath} not found..."
3226           LogAll "         using running kernel\'s modules."
3227           kernelname=$KERVERRUN
3228        else
3229           LogAll "Using modules for kernel: ${kernelname}"
3230        fi
3231        LogAll "INFO: kernelname = $kernelname"
3232        LogAll "INFO: kernelpath = $kernelpath"
3233###
3234### end of Sq-Modification
3235###
3236        TAPEDEV=$5
3237        TAPESIZE=$6
3238        FILES_IN_FILELIST=$7
3239        USE_LZO=$8
3240        CDRECOVERY=$9
3241        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3242            IMAGE_DEVS=""
3243        else
3244            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3245        fi
3246        if [ "${11}" ] ; then
3247            LILO_OPTIONS=""
3248    #       LogAll "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
3249        fi
3250        LAST_FILELIST_NUMBER=${12}
3251        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3252        export MINDI_EXCLUDE_DEVS="${14}"
3253        USE_COMP="${15}"
3254        USE_LILO="${16}"
3255        USE_STAR="${17}"
3256        INTERNAL_TAPE_BLOCK_SIZE="${18}"
3257        DIFFERENTIAL="${19}"
3258        USE_GZIP="${20}"
3259        NOT_BOOT="${21}"
3260        [ "$USE_COMP" = "" ] && USE_COMP=yes
3261        [ "$USE_GZIP" = "" ] && USE_GZIP=no
3262        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3263        [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
3264        # MONDO_ROOT is the real scratchdir
3265        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
3266        if [ _"$MONDO_ROOT" != _"" ]; then
3267            mkdir -p $MONDO_ROOT
3268        else
3269            Die "MONDO_ROOT is undefined"
3270        fi
3271    else
3272        LogScreen "Syntax: mindi (--custom ....)"
3273        MindiExit -1
3274    fi
3275fi
3276
3277if [ _"$MINDI_CACHE" != _"" ]; then
3278    rm -rf $MINDI_CACHE/* 2> /dev/null
3279    mkdir -p $MINDI_CACHE
3280fi
3281
3282[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3283
3284if [ _"$MONDO_SHARE" = _"" ]; then
3285    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3286    LogIt "Latest Mindi is available from http://www.mondorescue.org"
3287    LogIt "BusyBox sources are available from http://www.busybox.net"
3288    LogIt "------------------------------------------------------------------------------"
3289else
3290    LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
3291fi
3292if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3293    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3294else
3295    LogIt "ERROR: Unable to find mindi-busybox, please install it"
3296    MindiExit -1
3297fi
3298
3299for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3300    modinfo $i 2> /dev/null 1> /dev/null
3301    if [ $? -eq 0 ]; then
3302        modprobe $i 2>&1 > /dev/null
3303    fi
3304done
3305
3306KERN_DISK_MADE=""
3307
3308LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3309LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3310LogFile "NOT_BOOT = '$NOT_BOOT'"
3311if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3312    LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3313    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3314    MakeMountlist $MINDI_TMP/mountlist.txt
3315    CheckMountlist $MINDI_TMP/mountlist.txt
3316    mkdir -p $MINDI_TMP/small-all/tmp
3317    cd "$MINDI_TMP/small-all"
3318    cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
3319    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
3320    sleep 2
3321    LogIt "Done. Exiting."
3322    MindiExit 0
3323fi
3324
3325if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3326    LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
3327fi
3328
3329if [ "$kernelpath" = "" ] ; then
3330    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3331    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3332    read ch
3333    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3334        USE_OWN_KERNEL="yes"
3335    else
3336        USE_OWN_KERNEL="no"
3337    fi
3338    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3339        YOUR_KERNEL_SUCKS=""
3340        kernelpath=`TryToFindKernelPath`
3341        if [ "$kernelpath" = "" ] ; then
3342            echo -n "Please enter kernel path : "
3343            read kernelpath
3344        fi
3345    else
3346        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3347    fi
3348fi
3349if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3350    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3351    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3352        source $MINDI_LIB/FindDistroFailsafe
3353        # Log kernel image
3354        LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3355        kernelpath="$FAILSAFE_KBIN"
3356        LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3357        LogIt "      The failsafe kernel is $kernelpath."
3358        LogIt "      However, you are still running your kernel. If Mindi fails to create your"
3359        LogIt "      disks then it may still be a result of a problem with your kernel."
3360        pwd=`pwd`
3361        cd "$MINDI_TMP"
3362        mkdir -p lib/modules
3363        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
3364        cd "$pwd"
3365    else
3366        kernelpath=$MINDI_LIB/vmlinuz
3367        LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3368        LogIt "      However, you are still running your kernel. If Mindi fails to create your"
3369        LogIt "      disks then it may still be a result of a problem with your kernel."
3370        pwd=`pwd`
3371        cd "$MINDI_TMP"
3372        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3373        cd "$pwd"
3374    fi
3375    YOUR_KERNEL_SUCKS="Your kernel sucks"
3376fi
3377echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
3378[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
3379
3380[ "$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."
3381
3382PrepareDataDiskImages
3383
3384ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3385rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3386export ramdisk_size=$rds
3387
3388LogFile "INFO: Ramdisk will be $ramdisk_size KB"
3389if [ "$ARCH" = "ia64" ] ; then
3390    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
3391else
3392    PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size KB disk image."
3393fi
3394
3395[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3396...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3397
3398if [ _"$MONDO_SHARE" = _"" ]; then
3399    ListImagesForUser
3400    OfferToMakeBootableISO
3401    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3402        OfferToMakeBootableUSB
3403    fi
3404    LogAll "Finished."
3405elif [ "$TAPEDEV" ] ; then
3406    if [ "$ARCH" != "ia64" ] ; then
3407        # We need to keep the img file as boot file for ia64 platform
3408        rm -f $MINDI_CACHE/{*img,*iso}
3409    else
3410        rm -f $MINDI_CACHE/*iso
3411    fi
3412    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3413        OfferToMakeBootableUSB
3414    fi
3415    OfferToMakeBootableISO
3416    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3417        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3418    else
3419        Die "Cannot find all.tar.gz, to be written to tape"
3420    fi
3421elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3422    OfferToMakeBootableUSB
3423else
3424    OfferToMakeBootableISO
3425fi
3426# cleanup
3427LogAll "INFO: $FRIENDLY_OUTSTRING"
3428for mtpt in $FLOPPY_WAS_MOUNTED ; do
3429    mount $mtpt
3430done
3431MindiExit 0
Note: See TracBrowser for help on using the repository browser.