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

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