source: branches/3.0/mindi/mindi @ 3103

Last change on this file since 3103 was 3103, checked in by bruno, 7 years ago
  • Fix #681 by reintroducing code from mindi 2.0.6 in order to support detection of initrd tyep support deep in kernel with some black magic.
  • Fix ReadAllLink? by suppoting multi-level of ../.. in link names
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 122.4 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 3103 2013-05-02 21:49:27Z 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 initramfs"
751
752    # local variables
753    local lvOffset
754    local lvScanRes
755    local lvUseFilesystem
756
757    # say where we are.
758    LogFile "INFO: GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage"
759
760    # verify that file exists
761    [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
762
763    # Kernel may be gzip compressed - Case of RHEL5 - SLES11SP1
764    file $lvKernelImage 2>&1 | grep -q gzip
765    if [ $? -eq 0 ]; then
766        LogFile "INFO: Found a gzip compressed kernel $lvKernelImage"
767        lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs" 2> /dev/null`
768    else
769        LogFile "INFO: Found a non gzip compressed kernel $lvKernelImage"
770        # kernel is x86 boot sector in RHEL3/4 with embedded gzip content
771        # get offet of gzip magic "1f8b0800" in file (for these older kernels)
772        lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}' 2> /dev/null`
773        if [ $lvOffset -eq 0 ]; then
774            LogFile "INFO: gzip magic not found in file $lvKernelImage. Supposing initramfs."
775            lvScanRes=$lcMagicInitfs
776        else
777            lvOffset=`expr $lvOffset / 2`
778            LogFile "INFO: GetInitrdFilesystemToUse(): gzip magic found at lvOffset $lvOffset."
779            # scan again  kernel image
780            lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | gunzip -c 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs" 2> /dev/null`
781        fi
782    fi
783
784    # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
785    if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
786        lvUseFilesystem="ext2fs"
787    elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
788        lvUseFilesystem="ext3fs"
789    elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
790        lvUseFilesystem="initramfs"
791    elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
792        lvUseFilesystem="cramfs"
793    else
794        # In that case, we are most probably after 2.6.30 and use the supported initramfs
795        LogFile "No automatic detection found previously. Supposing initramfs."
796        LogFile "Report on the MondoRescue mailing-list withyour log files"
797        lvUseFilesystem="initramfs"
798    fi
799
800    # say what we are using
801    LogFile "INFO: GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem."
802
803    # return file system to use
804    echo "$lvUseFilesystem"
805
806}
807
808# Searches parent raid device of given disk device
809# $1: disk device (i.e. /dev/hda1)
810GetParentRaidDev() {
811    if [ ! -f /etc/raidtab ]; then 
812        return
813    fi
814    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
815}
816
817
818# Searches members of raid device
819# $1: raid device (/dev/md...)
820GetRaidDevMembers() {
821    if [ ! -f /etc/raidtab ]; then 
822        return
823    fi
824    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
825}
826
827
828HackPathsToFailsafe() {
829    local incoming newpath stub i pwd
830    incoming=`ReadLine`
831    pwd=`pwd`
832    cd "$MINDI_TMP"
833    while [ "$incoming" != "" ] ; do
834        stub=`basename $incoming`
835        newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
836        for i in $newpath ; do
837            echo "$i"
838        done
839        read incoming
840    done
841    cd "$pwd"
842}
843
844
845ListAllPartitions() {
846    local res currline partition all_partitions ap_orig remaining i j
847
848    grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
849    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
850    if [ -e "/vmfs/volumes" ]; then
851        # For VMWare ESX 3 get the device names of these volumes
852        vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
853    fi
854    return
855}
856
857
858ListImagesForUser() {
859    local path fname
860    path=$MINDI_CACHE
861    echo -en "In the directory '$path' you will find the images:-\n"
862    for fname in `ls $path | grep -F mindi-` ; do
863        printf "%19s " $fname
864    done
865    echo " "
866}
867
868
869ListKernelModulePaths() {
870    local module_list module fname r kern
871    module_list="$MODULES"
872    # Remove unwanted modules from list
873    for i in $DENY_MODS; do
874        module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
875        EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
876    done
877###
878### Sq-Modification ... Use kernelname for module search path if specified
879###
880    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
881    then
882        kern=${kernelname}
883    else
884        kern="$KERVERRUN"
885    fi
886    export KERVER=$kern
887###
888### Sq-Mod End
889###
890    # Get rid of duplicates, so that if a live kernel module also appears
891    # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
892    for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
893        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
894        if [ -z "$r" ]; then
895            if [ "`echo "$MODULES" | grep -w $module`" ]; then
896                r="[live module file not found]"
897            else
898                r="[extra module file not found]"
899            fi
900        else
901            [ -f "$r" ] && echo "$r"
902        fi
903        LogFile "INFO: module $module --> $r"
904    done
905    find /lib/modules/$kern/modules.* -type f 2> /dev/null
906}
907
908#
909# Critical function which computes all dependencies (dyn. lib.)
910# for a list of binaries
911#
912LocateDeps() {
913    local incoming fname deps
914    incoming="$*"
915    for fname in $incoming ; do
916        if [ ! -e "$fname" ] ; then
917            LogFile "WARNING: $fname does not exist; cannot be LDD'd."
918            if echo $fname | grep lvm &> /dev/null ; then
919                LogFile "          This warning only affects you if you are using LVM."
920                if echo "$MODULES" | grep lvm &> /dev/null ; then
921                    LogFile "          I think you are, so please take heed!"
922                else
923                    LogFile "          I don't think you are, so don't worry about it."
924                fi
925            fi
926        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
927            LogFile "INFO: $fname is softlink"
928        else
929            ldd $fname 2> /dev/null | ProcessLDD
930        fi
931    done
932}
933
934
935# Give all symlinks recursively of a full path name
936ReadAllLink() {
937    file="$1"
938
939    while [ `echo $file | grep -Ec '\.\./'` -ne 0 ]; do
940        # We need to normalise the path with .. in it
941        file=`echo $file | perl -pi -e 's|([^/]*)/([^/]+)/\.\./([^/]+)|$1/$3|g'`
942    done
943    echo "$file"
944    if [ ! -h $file ]; then
945        return 0
946    fi
947
948    link=`readlink $file`
949    d=`dirname $file`
950    fchar=`echo $link | cut -c1`
951    # If mother dir is a link print it
952    if [ -h "$d" ]; then
953        echo "$d"
954        d=`readlink $d`
955    fi
956    if [ "$fchar" != "/" ]; then
957        # Relative or local link
958        ReadAllLink "$d/$link" 
959    else
960        # Absolute path
961        ReadAllLink $link 
962    fi
963}
964
965
966LocateFile() {
967    local i path fname_to_find location output resolved tmp stub cache_id loclist
968    fname_to_find="$1"
969    # It's an absolute path
970    if echo "$fname_to_find" | grep -x "/.*" ; then
971        output="$fname_to_find"
972        if [ -h "$output" ] ; then
973            output="`ReadAllLink $output` $output"
974        fi
975        echo "$output"
976        return 0
977    fi
978    # It's not an absolute path
979    output=""
980    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
981    #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
982        [ -h "$path" ] && continue
983        [ ! -e "$path/$fname_to_find" ] && continue
984        output="$path/$fname_to_find $output"
985        if [ -h "$path/$fname_to_find" ] ; then
986            output="`ReadAllLink $path/$fname_to_find` $output"
987        fi
988    done
989    if [ "$output" = "" ] ; then
990        return 1
991    fi
992    echo "$output"
993    return 0
994}
995
996
997# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
998MakeMondoConfigFile() {
999    local outfile use_lzo use_comp use_star
1000    outfile=$1
1001    > $outfile
1002    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
1003    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
1004    [ "$USBDEVICE" ]            && echo "usb-dev $USBDEVICE" >> $outfile
1005    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
1006    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
1007    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
1008    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
1009    use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
1010    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
1011    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
1012    echo "use-lzo $use_lzo" >> $outfile
1013    echo "use-gzip $use_gzip" >> $outfile
1014    echo "use-star $use_star" >> $outfile
1015    echo "use-comp $use_comp" >> $outfile
1016    echo "datestamp `date`" >> $outfile
1017    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
1018    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
1019    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
1020    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
1021    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-HWADDR netfs-client-hwaddr $outfile
1022    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW  netfs-client-defgw  $outfile
1023    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT  netfs-server-mount  $outfile
1024    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-USER  netfs-server-user  $outfile
1025    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH   netfs-server-path   $outfile
1026    AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV           netfs-dev           $outfile
1027    AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO         netfs-proto           $outfile
1028    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
1029    AddFileToCfgIfExists $MINDI_TMP/ISO-DEV           iso-dev           $outfile
1030    AddFileToCfgIfExists $MINDI_TMP/ISO-MNT           iso-mnt           $outfile
1031    AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX        iso-prefix        $outfile
1032    AddFileToCfgIfExists $MINDI_TMP/ISODIR            isodir            $outfile
1033    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1034    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
1035    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.VER    bootloader.ver   $outfile
1036    AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1037    AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1038    AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1039    AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL      differential      $outfile
1040    AddFileToCfgIfExists $MINDI_TMP/ACL      acl      $outfile
1041    AddFileToCfgIfExists $MINDI_TMP/XATTR      xattr      $outfile
1042    AddFileToCfgIfExists $MINDI_TMP/OBDR      obdr      $outfile
1043}
1044
1045# Get PV's for an LV
1046GetPVsForLV() {
1047  if [ -n "$1" ]; then
1048    vg=`$LVMCMD lvdisplay $1 2>/dev/null |awk '/VG Name/{print $NF;exit}'`
1049    if [ -z "$vg" ]; then
1050      return
1051    fi
1052    $LVMCMD vgdisplay -v $vg 2>/dev/null | awk '/PV Name/{print $NF}'
1053  fi
1054}
1055
1056
1057MakeMountlist() {
1058    local mountlist all_partitions current_partition \
1059partition_size partition_format outstring partition_number \
1060partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1061absolute_partition old_partition_fmt current_lvolume uname skip
1062
1063    LogFile "Your raw fstab file looks like this:"
1064    LogFile "------------------------------------"
1065    cat $MY_FSTAB >> $LOGFILE
1066    LogAll "Your mountlist will look like this:"
1067    LogFile "-----------------------------------"
1068
1069# mountlist(OUT)
1070    mountlist=$1
1071
1072# NB: partition = device
1073# NB: mountpt = where the device is mounted
1074
1075    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1076
1077    [ "$mountlist" != "" ] && rm -Rf $mountlist
1078    > $mountlist
1079    all_partitions=""
1080   
1081    if [ $LVM != "false" ]; then
1082        echo -en "Analyzing LVM...\n"
1083        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
1084        if [ $? -ne 0 ]; then
1085            LVM="false"
1086        fi
1087        # Excluded LVs and GVs are not reported here
1088        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
1089    fi
1090    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1091    for i in $IMAGE_DEVS ; do
1092        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1093    done
1094    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1095    printf "        %-15s %-15s %-15s %-13s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
1096    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"
1097    for c_p in $all_partitions ; do
1098        # Skip fd/cd devices, network FS, cifs
1099        [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
1100        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1101        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
1102            current_partition=`readlink -f $c_p`
1103            if [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ]; then
1104                current_partition="$c_p"
1105            elif [ "`echo $current_partition | grep -E '^/dev/dm-'`" ]; then
1106                # For SLES 11 type of distro, do not use dm devices as they are unable to be handled by lvm commands
1107                current_partition=`$MINDI_LIB/analyze-my-lvm --givevglvofdm $current_partition`
1108            fi
1109            [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1110        else
1111            current_partition="$c_p"
1112        fi
1113        [ "$c_p" = "none" ] && continue
1114        redhat_label=""
1115        label=""
1116        uuid=""
1117        absolute_partition=`readlink -f $c_p`
1118        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1119
1120        # set default in case we dont't find it
1121        str_to_find_fmt_with=$current_partition
1122
1123        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1124        # current_partition contains only first column of /etc/fstab
1125        if [ "`echo "$current_partition" | grep -i "LABEL="`" != "" ]; then
1126            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1127            actual_dev=""
1128
1129            # 1st try, findfs - the RHEL way of finding labels and their partitions
1130            if [ -x "/sbin/findfs" ]; then
1131                actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
1132            fi
1133   
1134            # 2nd try : blkid, the good way for all LABEL except swap
1135            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1136                actual_dev=`/sbin/blkid | grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1137                # For LVM FS it will give a /dev/dm-# which should then be converted
1138                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1139                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1140                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1141                    for dev in `ls /dev/mapper/*`; do
1142                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1143                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1144                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1145                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1146                            break
1147                        fi
1148                    done
1149                fi
1150            fi
1151   
1152            # 3rd try, which works on a standard partition (ext2/3), but not on swap
1153            # For LVM gives a /dev/mapper entry
1154            if [ "x$actual_dev" = "x" ]; then
1155                actual_dev=`/bin/mount -l | grep "\[$redhat_label\]" | cut -d' ' -f1`
1156            fi
1157   
1158            # 4th try, with vol_id
1159            # SWAP only
1160            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1161                list_swaps=`cat /proc/swaps | grep "/dev/" | $AWK '{ print $1 }' `
1162                for dev_swap in $list_swaps ; do
1163                    dev_exists=`/sbin/vol_id $dev_swap | grep "$redhat_label"`
1164                    if [ "x$dev_exists" != "x" ]; then
1165                        actual_dev=$dev_swap
1166                        break;
1167                    fi
1168                done
1169            fi
1170
1171            # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1172            # LABEL=SW-cciss/c0d0p3 (RDP)
1173            # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1174            # SWAP only
1175            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1176                    skip=""
1177                    uname=$KERVERRUN
1178                    [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1179                    # 2.6.12 needs 16 (FC3)
1180                    [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1181                    # 2.6.19 and upper needs 1052
1182                    [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1183                    [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1184                    [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
1185                    if [ $skip = "" ]; then
1186                        Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1187                    fi
1188                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1189                    do
1190                        # Location of the swap label for kernel 2.6
1191                        try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1192                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1193                            actual_dev=$try_dev
1194                        fi
1195                    done
1196            fi
1197
1198            # Check if one of all those tries has known success
1199            if [ "x$actual_dev" != "x" ]; then
1200                current_partition=$actual_dev
1201            else
1202                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"
1203            fi
1204        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1205        # current_partition contains only first column of /etc/fstab
1206        elif [ "`echo "$current_partition" | grep -i "UUID="`" != "" ]; then
1207            uuid=`echo "$current_partition" | cut -d'=' -f2`
1208            actual_dev=""
1209
1210            # 1st try, findfs - the RHEL way of finding labels and their partitions
1211            if [ -x "/sbin/findfs" ]; then
1212                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1213            fi
1214   
1215            # 2nd try : blkid, the good way for all UUID except swap
1216            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1217                actual_dev=`/sbin/blkid | grep "$uuid" | grep UUID= | cut -d':' -f1`
1218                # For LVM FS it will give a /dev/dm-# which should then be converted
1219                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1220                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1221                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1222                    for dev in `ls /dev/mapper/*`; do
1223                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1224                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1225                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1226                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1227                            break
1228                        fi
1229                    done
1230                fi
1231            fi
1232   
1233            # 3th try, with vol_id
1234            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1235                list_dev=`mount | grep -E '^/' | $AWK '{ print $1 }' `
1236                for dev in $list_dev ; do
1237                    dev_exists=`/sbin/vol_id $dev | grep "$uuid"`
1238                    if [ "x$dev_exists" != "x" ]; then
1239                        actual_dev=$dev
1240                        break;
1241                    fi
1242                done
1243            fi
1244
1245            # 4th try, with dumpuuid (VMWare only ?) for swap
1246            if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1247                list_dev=`cat /proc/swaps | grep -E '^/' | $AWK '{ print $1 }' `
1248                for dev in $list_dev ; do
1249                    dev_exists=`/sbin/dumpuuid $dev | grep "$uuid"`
1250                    if [ "x$dev_exists" != "x" ]; then
1251                        actual_dev=$dev
1252                        break;
1253                    fi
1254                done
1255            fi
1256
1257            # Check if one of all those tries has known success
1258            if [ "x$actual_dev" != "x" ]; then
1259                current_partition=$actual_dev
1260            else
1261                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."
1262            fi
1263        else
1264            # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1265            # they use symlinks in fstab unrelated to what is shown in mount !
1266            if [ _"$partition_mountpt" = _"" ]; then
1267                # set default in case we dont't find it
1268                for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | grep -Ev "^#" | $AWK '{print $1}'`; do
1269                        if [ _"`readlink -f $tmpp`" = _"`readlink -f $current_partition`" ]; then
1270                            str_to_find_fmt_with=$tmpp
1271                            partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$tmpp" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1272                            break;
1273                        fi
1274                done
1275            fi
1276        fi
1277
1278        # Detects noauto partitions not mounted and exclude them
1279        partition_option=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$str_to_find_fmt_with" | grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1280        if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" =  "" ] ; then
1281                LogFile "INFO: Excluding $current_partition from mountlist (due to noauto option in fstab)"
1282            continue
1283        fi
1284        # Detects bind partitions and exclude them
1285        if [ "`echo "$partition_option" | grep -iw bind`" != "" ]; then
1286                LogFile "INFO: Excluding $current_partition from mountlist (due to bind option in fstab)"
1287            continue
1288        fi
1289
1290        # Look for devices which have to be excluded
1291        skip=0
1292        if [ "$MINDI_EXCLUDE_DEVS" ] ; then
1293            l=""
1294            list_of_devices="`ReadAllLink $current_partition`"
1295            for d in $list_of_devices; do
1296                l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
1297            done
1298
1299            # Remove PVs from LVs excluded
1300            l="$l `GetPVsForLV $current_partition`"
1301
1302            # We want a single unique list
1303            list_of_devices="`echo $l | sort -u`"
1304
1305            for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
1306                if  [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
1307                    LogFile "INFO: Excluding $current_partition from mountlist (due to excluded device $d)"
1308                    skip=1
1309                    continue
1310                fi
1311            done
1312        fi
1313        if [ $skip -eq 1 ]; then
1314            continue
1315        fi
1316
1317        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1318        # Detects iso9660 ISO images and exclude them
1319        if [ "`echo "$partition_format" | grep -iw iso9660`" != "" ]; then
1320                LogFile "INFO: Excluding $current_partition from mountlist (due to iso9660 format in fstab)"
1321            continue
1322        fi
1323        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1324        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1325        # the former is then a link to the latter, so we test whether
1326        # $current_partition is actually such a link or not and set
1327        # $current_lvolume accordingly. On Debian you may find more than one answer
1328        # so we remove the one corresponding to /dev/.static
1329        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1330        # principle is the same and we need to find the link to it as well.
1331        # Note that $current_lvolume may well be an
1332        # ordinary device. It is just to make sure that we feed the right value
1333        # into any of the LVM tools if possible.
1334
1335        current_lvolume="$current_partition"
1336        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1337            # .static dir are a Debian specificity
1338            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1339            echo $current_lvolume | grep -q ' '
1340            if [ $? -eq 0 ]; then
1341                LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1342            fi
1343            # if it's not found, it may well be a real device such as a multipath one
1344            # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1345            if [ _"$current_lvolume" = _"" ]; then
1346                current_lvolume="$current_partition"
1347            fi
1348        fi
1349        #
1350        # End of LVM device style variation code (other than $current_lvolume).
1351
1352        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1353            # Size computed via LVM not directly
1354            partition_size="lvm"
1355        else
1356            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1357            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1358            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1359                # Skip swap files
1360                [ "`echo "$current_partition" | grep -E "^/dev"`" = "" ] && continue
1361                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition " | $AWK '{print $3}'`
1362                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1363                [ "$partition_format" != "swap" ] && partition_format="swap"
1364                if [ "$partition_size" = "" ] ; then
1365                    totalsize=0
1366                    items=0
1367                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1368                        totalsize=$(($totalsize+$i))
1369                        items=$(($items+1))
1370                    done
1371                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1372                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1373                    LogFile "INFO: I'm guessing $c_p is $(($partition_size/1024))MB"
1374                fi
1375            else
1376                partition_size=`SizeOfPartition $current_partition`
1377            fi
1378        fi
1379        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1380        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1381        if [ "$partition_mountpt" = "" ] ; then
1382            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1383                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1384                    partition_mountpt="raid"
1385                    partition_format="raid"
1386                else
1387                    partition_mountpt="lvm"
1388                    partition_format="lvm"
1389                fi
1390            fi
1391        fi
1392        psz=$partition_size
1393        LogFile "INFO: Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1394        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1395        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1396            partition_mountpt="image"
1397            old_partition_fmt=$partition_format
1398            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1399            partition_size=$(($partition_size+1)); # just in case
1400            if [ "$partition_format" = "Linux" ] ; then
1401                LogFile "WARNING: Are you imaging a mounted swap partition? Silly..."
1402                LogFile "WARNING: Reverting format from $old_partition_fmt to $partition_format"
1403                partition_format=$old_partition_fmt
1404            fi
1405        fi
1406
1407        if [ ! "$partition_mountpt" ] ; then
1408            LogFile "------- $FDISK -l $qq log ------------"
1409            for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1410                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1411                [ "$partition_format" ] && break
1412            done
1413            LogFile "------- $FDISK log end ------------"
1414            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1415                partition_format="compaq"
1416            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1417                LogIt "WARNING: Unable to find mountpoint of $current_partition - ignoring"
1418                continue
1419            fi
1420        fi
1421        if [ "$redhat_label" ]; then
1422            label="$redhat_label"
1423        elif [ "$uuid" ]; then
1424            label="$uuid"
1425        fi
1426        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1427        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1428        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1429        if [ "$current_partition" = "" ] ; then
1430            LogFile "WARNING: Unknown partition (outstring = $unofficial_outstring)"
1431        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1432            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1433                partition_mountpt=raid
1434                partition_format=raid
1435                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1436                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1437            else
1438                LogFile "WARNING: Unknown mountpoint (outstring = $unofficial_outstring)"
1439            fi
1440        elif [ "$partition_format" = "" ] ; then
1441            LogFile "WARNING: Unknown format (outstring = $unofficial_outstring)"
1442        elif [ "$partition_size" = "" ] ; then
1443            LogFile "WARNING: Unknown partition size (outstring = $unofficial_outstring)"
1444        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1445            continue
1446        else
1447            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1448                LogFile "WARNING: vfat should be used instead of dos/msdos as a partition format"
1449                partition_format="vfat"
1450            fi
1451            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1452            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1453        fi
1454    done
1455}
1456
1457CheckMountlist() {
1458    local file=$1
1459    # Coherency verification
1460    ML01=`cat $file | wc -l`
1461    ML02=`grep -vE ' lvm | raid | swap ' $file | wc -l`
1462    ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1463    ML2=`grep -vE ' lvm | raid | swap ' $file | $AWK '{print $2}' | sort -u | wc -l`
1464    if [ "$ML01" -ne "$ML1" ]; then
1465        LogFile "--------------------------------------------"
1466        LogAll "WARNING: Duplicate device entry in mountlist"
1467        LogFile "--------------------------------------------"
1468    fi
1469    if [ "$ML02" -ne "$ML2" ]; then
1470        LogFile "--------------------------------------------"
1471        LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1472        LogFile "------------------------------------------------"
1473    fi
1474}
1475
1476MakeSureNumberIsInteger() {
1477    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1478    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1479    echo "result = '$res'"
1480        Die "$1 should be an integer"
1481    fi
1482}
1483
1484
1485OfferToMakeBootableISO() {
1486    local i old_pwd
1487    if [ -z "$ISO_CMD" ]; then
1488        LogIt "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
1489        return
1490    fi
1491    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1492        echo -en "Shall I make a bootable CD image? (y/[n]) "
1493        read i
1494        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1495    fi
1496    rm -Rf $MINDI_TMP/iso
1497    mkdir -p $MINDI_TMP/iso/{images,archives}
1498    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"
1499    LogFile "INFO: mindi_lib = $MINDI_LIB"
1500    for i in memdisk memtest.bin memtest.img ; do
1501        j=$MINDI_LIB/$i
1502        k=$MINDI_TMP/iso
1503        if [ -e "$j" ] ; then
1504            LogIt "INFO: Copying $j to $k"
1505            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1506            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1507            if [ _"$MONDO_SHARE" != _"" ]; then 
1508                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1509            fi
1510        fi
1511    done
1512    MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
1513    if [ $KERNEL_IS_XEN = "yes" ]; then
1514        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?"
1515        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?"
1516    fi
1517    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?"
1518    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?"
1519
1520    if [ _"$MONDO_SHARE" != _"" ]; then 
1521        if [ $KERNEL_IS_XEN = "yes" ]; then
1522            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?"
1523            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?"
1524        fi
1525        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?"
1526        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?"
1527    fi
1528    MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1529    if [ "$ARCH" != "ia64" ] ; then
1530        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?"
1531    fi
1532    old_pwd=`pwd`
1533    cd "$MINDI_TMP/iso"
1534    if [ "$ARCH" != "ia64" ] ; then
1535        if [ _"$MONDO_SHARE" != _"" ]; then 
1536            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?"
1537            if [ $KERNEL_IS_XEN = "yes" ]; then
1538                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?"
1539            fi
1540            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1541        fi
1542        $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
1543    else
1544        $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
1545    fi
1546    if [ "$?" -ne "0" ] ; then
1547        LogFile "----------- $ISO_CMD's errors --------------"
1548        LogAll "$ISO_CMD returned the following errors:"
1549        cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
1550        LogIt "ERROR: Failed to create ISO image."
1551    else
1552        LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1553    fi
1554    rm -f $MINDI_TMP/mkisofs.log
1555    cd "$old_pwd"
1556}
1557
1558
1559OfferToMakeBootableUSB() {
1560    local i
1561    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1562        echo -n "Shall I make a bootable USB device ? (y/[n]) "
1563        read i
1564        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1565        if [ "$USBDEVICE" = "" ]; then
1566            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1567            read dev
1568            USBDEVICE=$dev
1569        fi
1570        echo "WARNING: This will erase all content on $USBDEVICE"
1571        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1572        read i
1573        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1574    fi
1575    rm -Rf $MINDI_TMP/usb
1576    mkdir -p $MINDI_TMP/usb
1577    USBPART="${USBDEVICE}1"
1578
1579    echo -en "Transforming $USBDEVICE in a Bootable device " 
1580    echo -en "."
1581    LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1582    LogFile "INFO: Checking $USBDEVICE"
1583    $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1584    if [ $? -ne 0 ]; then
1585        LogAll "ERROR: Unable to access $USBDEVICE"
1586        LogAll "       Make sure your USB device is plugged in"
1587        MindiExit -1
1588    fi
1589    echo -en "."
1590    LogFile "INFO: Unmounting $USBPART just in case"
1591    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1592    # If your key has no MBR it may cause an issue
1593    # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1594    if [ -r $MBRFILE ]; then
1595        LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
1596        dd if=$MBRFILE of=$USBDEVICE
1597    else
1598        LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1599        LogAll "         on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
1600    fi
1601    LogFile "INFO: Preparing $USBDEVICE"
1602    cat > $MINDI_TMP/fdisk.txt << EOF
1603d
1604d
1605d
1606d
1607n
1608p
16091
1610
1611
1612t
1613b
1614a
16151
1616w
1617EOF
1618    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
1619    if [ $? -ne 0 ]; then
1620        LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
1621        LogAll "       Make sure your USB device is plugged in"
1622        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1623        MindiExit -1
1624    fi
1625    LogFile "fdisk build file"
1626    LogFile "----------------"
1627    cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1628    LogFile "----------------"
1629    rm -f $MINDI_TMP/fdisk.txt
1630    LogFile "INFO: The USB device $USBDEVICE now looks like this:"
1631    $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1632    echo -en "."
1633    # Calling kpartx in case devices were not created
1634    if [ -x "/sbin/kpartx" ]; then
1635        /sbin/kpartx -a $USBDEVICE
1636    fi
1637    # Some distro do auto mount at that point (Ubuntu)
1638    LogFile "INFO: Unmounting $USBPART just in case again"
1639    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1640    echo -en "."
1641    # Some distro have a dmsetup conf at that point so removing it Cf: http://trac.mondorescue.org/ticket/651
1642    if [ "`which dmsetup`" != "" ]; then
1643        block_id="`echo $USBPART | sed 's|/dev/||g'`"
1644        if [[ "`dmsetup ls | awk '{print $1}' | grep $block_id`" != "" ]]; then
1645            LogFile "INFO: Removing $block_id from device mapper."
1646            sleep 1
1647            dmsetup remove $block_id
1648        fi
1649    fi
1650    echo -en "."
1651    LogFile "INFO: Creating a vfat filesystem on $USBPART"
1652    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1653    if [ $? -ne 0 ]; then
1654        LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
1655        LogAll "       Make sure your USB device is plugged in and partitioned ($USBPART must exist on it)"
1656        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1657        MindiExit -1
1658    fi
1659    echo -en "."
1660    LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
1661    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1662    if [ $? -ne 0 ]; then
1663        LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
1664        LogAll "       Make sure your USB device is plugged in, partitioned and formated ($USBPART must exist on it)"
1665        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1666        MindiExit -1
1667    fi
1668    echo -en "."
1669    mkdir -p $MINDI_TMP/usb/images
1670    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"
1671    echo -en "."
1672    LogFile "INFO: mindi_lib = $MINDI_LIB"
1673    for i in memdisk memtest.bin memtest.img ; do
1674        j=$MINDI_LIB/$i
1675        k=$MINDI_TMP/usb
1676        if [ -e "$j" ] ; then
1677            LogIt "INFO: Copying $j to $k"
1678            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1679            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1680        fi
1681    done
1682    echo -en "."
1683    MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
1684    echo -en "."
1685    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?"
1686    echo -en "."
1687    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1688    echo -en "."
1689    MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1690    echo -en "."
1691    LogAll "----------- syslinux's conf --------------"
1692    cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1693    LogAll "------------------------------------------"
1694    umount $MINDI_TMP/usb
1695    if [ "$ARCH" != "ia64" ] ; then
1696        syslinux -v 2>&1 | grep -q 4.02
1697        if [ $? -eq 0 ]; then
1698            # This buggy version of syslinux requires a call to --stupid and not -s
1699            syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1700            res=$?
1701        else
1702            syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1703            res=$?
1704        fi
1705        if [ $res -ne 0 ] ; then
1706            LogAll "----------- syslinux's errors --------------"
1707            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1708            LogAll "------------------------------------------"
1709            LogIt "ERROR: Failed to create USB image."
1710        else
1711            echo -e "$DONE"
1712            LogFile "INFO: Created bootable USB image on $USBDEVICE"
1713        fi
1714        rm -f $MINDI_TMP/syslinux.log
1715    else
1716        LogAll "ERROR: No USB boot support for ia64"
1717        MindiExit -1
1718    fi
1719}
1720
1721
1722MakeMessageFile() {
1723   
1724    if [ -x "/bin/lsb_release" ]; then
1725        DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1726    elif [ -r /etc/arch-release ]; then  # this code must be written before /etc/issue test to avoid errors                             
1727        DESC="Arch Linux"                                                                                                           
1728        if [ -r /var/log/pacman.log ]; then                                                                                         
1729            # there are no releases but we can get the last system upgrade                                                     
1730            # Output example:   Arch Linux [2011-03-03 01:39]                                                                   
1731            DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"                           
1732        fi
1733    elif [ -r /etc/issue.net ]; then
1734        DESC=`head -1 /etc/issue.net`
1735    elif [ -r /etc/issue ]; then
1736        DESC=`head -1 /etc/issue`
1737    elif [ -x "/usr/bin/pbdistrocheck" ]; then
1738        # For pb >= 0.9.8
1739        DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
1740    else
1741        DESC="Unknown desc"
1742    fi
1743    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/"
1744    if [ _"$MONDO_SHARE" != _"" ]; then
1745        if [ "$CDRECOVERY" != "yes" ] ; then
1746            if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1747                echo -en "Press <enter> to continue.\n"
1748            elif [ ! "$MINDI_TMP" ] ; then
1749                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1750                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1751                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1752                fi
1753            else
1754                echo -en "$BOOT_MEDIA_MESSAGE"
1755            fi
1756        else
1757            echo -en "\
1758To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1759CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1760        fi
1761    fi
1762    echo -en "\n\n\n"
1763}
1764
1765
1766MakeBootConfFile() {
1767    local options i ooo
1768    options=""
1769    # Type of boot file (elilo or syslinux/isolinux)
1770    type=$1
1771    if [ "$type" = "elilo" ]; then
1772        sep="="
1773    else
1774        sep=" "
1775    fi
1776
1777    # Generic header for conf file
1778    if [ "$type" != "elilo" ] ; then
1779        echo -en "prompt 1\ndisplay message.txt\n"
1780    else
1781        echo -en "prompt\n"
1782    fi
1783
1784    # Compute which default option to boot from
1785    if [ "$CDRECOVERY" = "yes" ] ; then
1786        echo -en "default${sep}RESTORE\n"
1787    # In case it's mondoarchive
1788    elif [ _"$MONDO_SHARE" != _"" ]; then
1789        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1790            echo -en "default${sep}iso\n"
1791        else
1792            echo -en "default${sep}${MINDI_DEFAULT_BOOT_OPTION}\n"
1793        fi
1794    else
1795        echo -en "default${sep}expert\n"
1796    fi
1797
1798    # Handle timeout
1799    if [ "$CDRECOVERY" != "yes" ] ; then
1800        echo -en "timeout${sep}${MINDI_BOOT_TIMEOUT}\n"
1801    else
1802        echo -en "timeout${sep}10000\n"
1803    fi
1804    echo -en "\n"
1805
1806    # prepare which labels will be generated
1807    if [ "$CDRECOVERY" = "yes" ] ; then
1808        options="RESTORE expert"
1809    else
1810        if [ _"$MONDO_SHARE" != _"" ]; then
1811            options="interactive expert compare iso nuke isonuke"
1812        else
1813            options="expert"
1814        fi
1815    fi
1816
1817    # Generate rest of conf file
1818    for i in $options ; do
1819        ooo=$i
1820        [ "$ooo" = "RESTORE" ] && ooo="RESTORE nuke"
1821        if [ "$type" = "elilo" ]; then
1822            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"
1823        else
1824            ps="/"
1825            if [ "$type" = "syslinux" ]; then
1826                ps=""
1827            fi
1828            if [ $KERNEL_IS_XEN = "no" ]; then
1829                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"
1830            else
1831                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"
1832            fi
1833        fi
1834        echo -en "$outstr"
1835    done
1836    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1837        if [ "$type" = "elilo" ]; then
1838            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1839            echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1840        else
1841            ps="/"
1842            if [ "$type" = "syslinux" ]; then
1843                ps=""
1844            fi
1845            echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1846            echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1847        fi
1848    fi
1849}
1850
1851
1852PrepareBootDiskImage_LILO() {
1853    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1854    imagesdir=$MINDI_CACHE
1855    kernelpath=$1
1856
1857    retval=0
1858    [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
1859    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1860    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?"
1861    echo -en "..."
1862    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1863    mountpoint=$MINDI_TMP/mountpoint.$$
1864    mkdir -p $mountpoint
1865    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1866    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1867    mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1868    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1869    mkdir -p $mountpoint/etc
1870    liloconf=$mountpoint/elilo.conf
1871
1872    MakeBootConfFile elilo > $liloconf
1873
1874    # Copy it so that CD-ROM menu entry is satisfied
1875    mountefi=0
1876    df -T | grep /boot/efi | grep -q vfat
1877    if [ $? -ne 0 ]; then
1878        mount /boot/efi
1879        if [ $? -ne 0 ]; then
1880            echo "You have to mount your EFI partition when using mindi"
1881            MindiExit -1
1882        fi
1883        mountefi=1
1884    fi
1885    el=`find /boot/efi -name elilo.efi`
1886    cp $el $mountpoint
1887    cp $liloconf $mountpoint
1888    if [ $mountefi -eq 1 ]; then
1889        umount /boot/efi 2>&1 > /dev/null
1890    fi
1891
1892    LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
1893    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1894    if [ "$?" -ne "0" ] ; then
1895        LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1896        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1897        LogIt "       Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1898        rm -f $MINDI_TMP/mtpt.$$
1899        LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1900        retval=$(($retval+1))
1901    fi
1902    MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1903
1904    mkdir -p $mountpoint/tmp
1905    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1906        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1907    fi
1908
1909    # copy the kernel across
1910    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1911    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1912    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1913    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1914    if [ "$?" -ne "0" ] ; then
1915        LogFile "INFO: Files at mountpoint ($mountpoint) :"
1916        du -sk $mountpoint/* >> $LOGFILE
1917        LogFile "--- end of list of files ---"
1918        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1919        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1920        cd "$old_pwd"
1921        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1922        rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1923    #   losetup /dev/loop0 -d
1924        [ "$imagefile" != "" ] && rm -f $imagefile
1925        LogIt "ERROR: Sorry, your kernel is too big for your image"
1926        Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1927        return 0
1928    fi
1929    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1930    LogFile "INFO: Free space left on image = $free_space KB"
1931    LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1932    # make it bootable
1933    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1934    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1935    if [ "$KERN_DISK_MADE" ] ; then
1936        LogFile "INFO: Not running LILO. It's not that kind of disk."
1937    fi
1938
1939    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1940    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1941    echo -en "..."
1942    rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1943    if [ "$retval" -eq "0" ] ; then
1944        echo -en "...$DONE\n"
1945        if [ "$KERN_DISK_MADE" ] ; then
1946            LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
1947        fi
1948    else
1949        echo -en "...failed\n"
1950        LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
1951        [ "$imagefile" != "" ] && rm -f $imagefile
1952    fi
1953    [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
1954    return $retval
1955}
1956
1957
1958PrepareBootDiskImage_ISOLINUX() {
1959    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1960    imagesdir=$MINDI_CACHE
1961    kernelpath=$1
1962    do_boot_root_thingy=""
1963    local retval old_pwd
1964    retval=0
1965
1966    [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
1967    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1968    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?"
1969    echo -en "..."
1970    imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1971    mountpoint=$MINDI_TMP/mountpoint.$$
1972    mkdir -p $mountpoint
1973    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1974    LogFile "INFO: Creating vfat filesystem on $imagefile"
1975    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1976    # syslinux should be run on a  local file (doen't work through NFS Cf: #297)
1977    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1978
1979    # Only move it now to its final destination and use it now
1980    mv $imagefile $imagesdir
1981    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1982
1983    mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1984
1985    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1986    MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1987    MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1988    LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1989    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1990    if [ "$?" -ne "0" ] ; then
1991        LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1992        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1993        LogAll "       Please unload some of your modules and try again."
1994        rm -f $MINDI_TMP/mtpt.$$
1995        LogAll "       Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1996        LogAll "       Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1997        retval=$(($retval+1))
1998    fi
1999
2000    mkdir -p $mountpoint/tmp
2001    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
2002        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
2003    fi
2004
2005    # copy the kernel across
2006    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
2007    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2008    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2009         
2010    retval=0
2011    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2012    retval=$?
2013    if [ $KERNEL_IS_XEN = "yes" ]; then
2014        cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
2015        let retval+=$?
2016    fi
2017 
2018    if [ "$retval" -ne "0" ] ; then
2019        LogFile "INFO: Files at mountpoint ($mountpoint) :"
2020        du -sk $mountpoint/* >> $LOGFILE
2021        LogFile "--- end of list of files ---"
2022        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
2023        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
2024        cd "$old_pwd"
2025        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2026        rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
2027
2028        LogIt "ERROR: Sorry, your kernel is too big for your image"
2029        Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
2030    fi
2031    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2032    LogFile "INFO: Free space left on image = $free_space KB"
2033    LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
2034
2035    # make it bootable
2036    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
2037    mkdir -p $mountpoint/etc
2038    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2039    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2040    echo -en "..."
2041    rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
2042
2043    if [ "$retval" -eq "0" ] ; then
2044        echo -en "...$DONE\n"
2045        if [ "$KERN_DISK_MADE" ] ; then
2046            [ "$imagefile" != "" ] && rm -f $imagefile
2047            LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
2048        fi
2049    else
2050        echo -en "...failed\n"
2051        LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
2052        [ "$imagefile" != "" ] && rm -f $imagefile
2053    fi
2054    [ "$retval" -ne "0" ] && LogIt "ERROR: PrepareBootDiskImage() is returning nonzero"
2055    return $retval
2056}
2057
2058
2059ParseModprobeForIncludes() {
2060local MODPROBE_CONF mpincfile includes include
2061
2062MODPROBE_CONF=/etc/modprobe.conf
2063mpincfile=$1
2064touch $mpincfile
2065if [ -a $MODPROBE_CONF ]; then
2066    includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
2067    if [ -n "$includes" ]; then
2068        for include in $includes
2069        do
2070            if [ -a "$include" ]; then
2071                echo $include >> $mpincfile
2072            fi
2073        done
2074    fi
2075fi
2076}
2077
2078
2079PrepareDataDiskImages() {
2080    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
2081
2082    imagesdir=$MINDI_CACHE
2083    rm -f $imagesdir/mindi.iso
2084    needlist=$MINDI_TMP/what-we-need.txt
2085    bigdir=$MINDI_TMP/bigdir
2086    mkdir -p $bigdir/usr/bin
2087    mkdir -p $bigdir/usr/sbin
2088    includefile=$MINDI_TMP/$$.includefile.txt
2089
2090    if [ -e "$DEPLIST_FILE" ]; then
2091        lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
2092    else
2093        lfiles="$DEPLIST_DIR/*"
2094    fi
2095    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
2096    ParseModprobeForIncludes $includefile
2097    lines=$(($lines+`cat $includefile | wc -l`))
2098    cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
2099    res=$?
2100    rm -f $includefile
2101    if [ "$YOUR_KERNEL_SUCKS" ]; then
2102        pwd=`pwd`
2103        cd "$MINDI_TMP"
2104        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2105            tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
2106        done
2107        for i in $EXTRA_MODS ; do
2108            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2109            [ ! "$j" ] && LogFile "WARNING: cannot find failsafe module $i.o.gz"
2110            for k in $j ; do
2111                tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2112                LogFile "INFO: Added failsafe module $k to ramdisk"
2113            done
2114        done
2115        cd "$pwd"
2116    else
2117        ListKernelModulePaths >> $needlist
2118    fi
2119    if [ "$res" -ne "0" ] ; then
2120        Die "You have $res files present in dependency list\nbut absent from filesystem."
2121    fi
2122    FindAndAddUserKeyboardMappingFile
2123    mkdir -p $bigdir/tmp
2124    if [ _"$MONDO_SHARE" != _"" ]; then
2125        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2126        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2127    fi
2128    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2129    DropOptimizedLibraries $needlist $bigdir
2130    echo -en "Assembling dependency files"
2131    CopyDependenciesToDirectory < $needlist $bigdir
2132
2133    # also copy io.sys and msdos.sys, if we can find them
2134    for i in `mount | cut -d' ' -f3` ; do
2135        for j in io.sys msdos.sys ; do
2136            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2137        done
2138    done
2139
2140    # master boot record, too
2141    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2142    if [ "$i" ] ; then
2143        LogIt "INFO: Backing up $i's MBR"
2144        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2145        sleep 1
2146        sync
2147        j=$i
2148        [ -h "$j" ] && j=`readlink -f $j`
2149        LogIt "INFO: Creating /dev/boot_device ($j)"
2150        mkdir -p $bigdir/dev
2151        cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
2152    fi
2153
2154    old_pwd=`pwd`
2155    cd "$bigdir"
2156
2157    # Get terminfo content
2158    ti="usr/share/terminfo/l"
2159    if [ -d /$ti ]; then
2160        mkdir -p $ti
2161        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "ERROR: issue copying terminfo"
2162    fi
2163    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
2164        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2165        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2166    fi
2167    if [ -d "/lib/dev-state" ]; then 
2168        tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2169    fi
2170    cd "$old_pwd"
2171    echo -e "$DONE"
2172    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2173    MakeMountlist $MINDI_TMP/mountlist.txt
2174    CheckMountlist $MINDI_TMP/mountlist.txt
2175    mkdir -p $bigdir/tmp
2176    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
2177    if [ _"$MONDO_SHARE" != _"" ]; then
2178        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2179    fi
2180    if [ $LVM != "false" ]; then
2181        $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2182        if [ "$?" -ne "0" ]; then
2183            LVM="false"
2184            rm -f $bigdir/tmp/i-want-my-lvm
2185        else
2186            LogFile "Your i-want-my-lvm file content is:"
2187            LogFile "-----------------------------------"
2188            cat  $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2189            LogFile "-----------------------------------"
2190        fi
2191    fi
2192    LogFile "Your mountlist.txt file content is:"
2193    LogFile "-----------------------------------"
2194    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2195    LogFile "-----------------------------------"
2196
2197    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2198    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2199    if [ _"$MONDO_SHARE" != _"" ]; then
2200        for q in filelist.full.gz biggielist.txt ; do
2201            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2202            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2203        done
2204    fi
2205
2206    echo -en "Tarring and zipping the data content..."
2207    size_of_all_tools=`du -sk $bigdir | cut -f1`
2208    (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)
2209    du -sk $imagesdir/*gz >> $LOGFILE
2210    echo -e "$DONE"
2211
2212    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2213    rm -rf $bigdir
2214    rm -f $needlist
2215}
2216
2217
2218ProcessLDD() {
2219    local incoming f d nd bd bnd
2220    read incoming
2221    while [ "$incoming" != "" ]; do
2222        # We take the full path name of the dyn. lib. we want
2223        incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2224        for f in $incoming ; do
2225            # echo modified file name if one of the parent dir is a link
2226            # by replacing the original dirname by the destination of the link
2227            d="`dirname $f`"
2228            found="false"
2229            while [ "$d" != "/" ]; do
2230                if [ -h "$d" ]; then
2231                    nd=`readlink -f $d`
2232                    bd=`basename $d`
2233                    bnd=`basename $nd`
2234                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2235                    echo $d
2236                fi
2237                d="`dirname $d`"
2238            done
2239
2240            echo "$f"
2241            echo "`ReadAllLink $f`"
2242        done
2243        read incoming
2244    done
2245}
2246
2247
2248Prompt() {
2249    echo -en "$1"
2250    read line
2251}
2252
2253
2254ReadLine() {
2255    local i incoming
2256    read incoming
2257    i=0
2258    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2259        i=$(($i+1))
2260        read incoming
2261    done
2262    echo "$incoming"
2263}
2264
2265
2266SizeOfPartition() {
2267    local devpath drive res stub
2268    device=$1
2269    if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2270        Die "Cannot find $device's size - is your /etc/fstab sane?"
2271    fi
2272    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2273        res=`SizeOfRaidPartition $device`
2274        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2275        echo "$res"
2276        return 0
2277    fi
2278    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2279    res=`$FDISK -s $device 2>> $LOGFILE`
2280    # end patch
2281    # take only the first in case of multiple mount (cifs, nfs, ...)
2282    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2283    [ "$res" = "" ] && res="-1"
2284    echo $res
2285    return 0
2286}
2287
2288
2289SizeOfRaidPartition() {
2290    local real_dev smallest_size silly tmp
2291
2292    silly=999999999
2293    smallest_size=$silly
2294
2295    for real_dev in `GetRaidDevMembers $1` ; do
2296        tmp=`SizeOfPartition $real_dev`
2297        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2298    done
2299
2300    if [ "$smallest_size" = "$silly" ] ; then
2301        echo "-1"
2302        return 1
2303    else
2304        echo "$smallest_size"
2305        return 0
2306    fi
2307}
2308
2309
2310StripComments()
2311{
2312    local tempfile
2313
2314    tempfile=$MINDI_TMP/$$.strip.txt
2315    cp -f $1 $tempfile 2>> $LOGFILE
2316    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2317    rm -f $tempfile
2318    LogFile "INFO: Stripped comments from $2"
2319}
2320
2321
2322
2323StripExecutable()
2324{
2325    local tmpfile
2326
2327    tmpfile=$MINDI_TMP/stripped.$$.dat
2328    [ -d "$1" ] || [ -h "$1" ] && return
2329    cp -f $1 $tmpfile 2>> $LOGFILE
2330    strip $tmpfile 2> /dev/null
2331    if [ "$?" -eq "0" ] ; then
2332        cp -f $tmpfile $1 2>> $LOGFILE
2333        LogFile "INFO: Stripped binary $2"
2334    fi
2335    rm -f $tmpfile
2336}
2337
2338KernelVer() {
2339        local fkern_ver fname
2340
2341        fname=$1
2342        file $fname | grep -q gzip
2343        if [ "$?" -eq "0" ] ; then
2344            # Used by ia64
2345            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2346        else
2347            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2348        fi
2349        echo "$fkern_ver"
2350}
2351
2352
2353# WARNING: This function should just echo the final result !!!
2354#
2355TryToFindKernelPath() {
2356    local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
2357
2358    we_want_version=$KERVERRUN
2359    possible_kernels=""
2360    duff_kernels=""
2361    output=""
2362   
2363    if [ "$ARCH" = "ia64" ] ; then
2364       root="/boot/efi/efi"
2365    else
2366       root="/"
2367    fi
2368    # See if we're booted from a Xen kernel
2369    # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2370    if [ -f /proc/xen/capabilities ]; then
2371        # It's a Xen kernel
2372        KERNEL_IS_XEN="yes"
2373        LogFile "INFO: It's a Xen kernel..."
2374    fi
2375
2376    for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/'` ; do
2377        [ ! -e "$fname" ] && continue
2378        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2379        fkern_ver=`KernelVer $fname`
2380        [ "$fkern_ver" = "" ] && continue
2381        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2382        [ -f "$fname" ] || continue
2383        [ -h "$fname" ] && continue
2384        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2385        file $fname | grep -q gzip
2386        if [ "$?" -eq "0" ] ; then
2387            # Used by ia64
2388            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2389                LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2390                duff_kernels="$fname $duff_kernels"
2391            else
2392                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2393                possible_kernels="$fname $possible_kernels"
2394            fi
2395        else
2396            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2397                LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2398                duff_kernels="$fname $duff_kernels"
2399            else
2400                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2401                possible_kernels="$fname $possible_kernels"
2402            fi
2403        fi
2404    done
2405    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2406        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2407    fi
2408    if [ ! "$possible_kernels" ] ; then
2409        LogFile "INFO: No kernel matches exactly. Are there any duff kernels?"
2410        possible_kernels="$duff_kernels"
2411        if [ ! "$possible_kernels" ] ; then
2412            LogFile "INFO: Sorry, no duff kernels either"
2413        else
2414            LogFile "INFO: I bet you're running Debian or Gentoo, aren't you?"
2415            LogFile "INFO: Your kernel doesn't have a sane builddate. Oh well..."
2416        fi
2417    fi
2418    if [ $KERNEL_IS_XEN = "yes" ]; then
2419        possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2420        noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2421        FindMboot32Binary
2422    fi
2423    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2424    noof_kernels=`CountItemsIn "$possible_kernels"`
2425    if [ "$noof_kernels" -eq "0" ] ; then
2426        LogFile "Could not find your kernel."
2427        if [ -e "/boot/vmlinuz" ] ; then
2428            LogFile "INFO: Using /boot/vmlinuz as a last resort."
2429            output=/boot/vmlinuz
2430        else
2431            output=""
2432        fi
2433    elif [ "$noof_kernels" -eq "1" ] ; then
2434        kp=`echo "$possible_kernels" | sed s/' '//`
2435        LogFile "INFO: Your kernel is $kp (v$KERVERRUN)"
2436        output="$kp"
2437    else
2438        for i in $possible_kernels ; do
2439            if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2440                LogFile "INFO: OK, I used my initiative and found that "
2441                LogFile "INFO: $i is probably your kernel. "
2442                output="$i"
2443                break
2444            fi
2445        done
2446        if [ ! -n "$output" ]; then
2447            if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
2448                output=/boot/vmlinuz
2449                LogFile "INFO: Schlomo, this one's for you."
2450            else
2451                LogFile "INFO: Two or more possible kernels found. You may specify any one of them and the "
2452                LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2453                LogFile "INFO: $possible_kernels"
2454                output=""
2455            fi
2456        fi
2457    fi
2458    if [ $KERNEL_IS_XEN = "yes" ]; then
2459        if [ "$noof_xenkernels" -eq "0" ]; then
2460            xenkernelpath=""
2461        elif [ "$noof_xenkernels" -eq "1" ]; then
2462            xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
2463            LogFile "INFO: Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
2464        else
2465            for i in $possible_xenkernels ; do
2466                if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2467                    LogFile "INFO: OK, I used my initiative and found that "
2468                    LogFile "INFO: $i is probably your Xen kernel. "
2469                    xenkernelpath="$i"
2470                    break
2471                fi
2472            done
2473            if [ ! -n "$xenkernelpath" ]; then
2474                new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2475                if [ ! -n "$new_possible_xenkernels" ]; then
2476                    xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
2477                    LogFile "INFO: Using $xenkernelpath"
2478                else
2479                    LogFile "INFO: Two or more possible Xen kernels found. You may specify any one of them and the "
2480                    LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2481                    LogFile "INFO: $possible_xenkernels"
2482                    output=""
2483                    xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
2484                    LogFile "INFO: Using $xenkernelpath"
2485                fi
2486            fi
2487        fi
2488        if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2489            Die "Cannot find Xen kernel $xenkernelpath, aborting"
2490        fi
2491    fi
2492    LogAll "TryToFindKernelPath found $output"
2493    echo "$output"
2494}
2495
2496
2497TurnTgzIntoRdz() {
2498    local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2499
2500    tgz_dir_fname=$1
2501    rdz_fname=$2
2502    kernelsize=$3
2503    maxsize=$(($BOOT_SIZE-$kernelsize))
2504    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2505    tempfile=$MINDI_TMP/temp.rd
2506    mountpoint=$MINDI_TMP/mnt1
2507    res=0
2508    echo -en "..."
2509    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2510    echo -en "..."
2511    LogFile "INFO: Creating ext2 filesystem on $tempfile"
2512    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2513    echo -en "..."
2514    mkdir -p $mountpoint
2515    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."
2516    echo -en "..."
2517    old_pwd=`pwd`
2518    cd "$mountpoint"
2519
2520    # AL04Oct08: Check whether /lib64 or /lib is a link and if so explicitly create one in rootfs
2521    if [ -h "/lib64" ]; then
2522        mkdir -p lib || LogIt "ERROR: Unable to create lib in $mountpoint."
2523        ln -s lib lib64 || LogIt "ERROR: /lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2524    fi
2525    if [ -h "/lib" ]; then
2526        mkdir -p usr/lib || LogIt "ERROR: Unable to create usr/lib in $mountpoint."
2527        mv lib/* usr/lib
2528        rmdir lib
2529    fi
2530    # Check whether /sbin and /bin are a link and if so explicitly create one in rootfs (Fedora 17 crazyness)
2531    if [ -h "/sbin" ]; then
2532        mkdir -p usr/sbin || LogIt "ERROR: Unable to create usr/sbin in $mountpoint."
2533        mv sbin/* usr/sbin
2534        rmdir sbin
2535    fi
2536    if [ -h "/bin" ]; then
2537        mkdir -p usr/bin || LogIt "ERROR: Unable to create usr/bin in $mountpoint."
2538        mv bin/* usr/bin
2539        rmdir bin
2540    fi
2541
2542    # Check files before copying to discover configuration issues or McAfee preventing mindi reading these files
2543    for f in $tgz_dir_fname/*; do 
2544        if [ ! -r $f ]; then
2545            Die "ERROR: Unable to copy $f to the target dir. Check your installation or McAfee presence"
2546        else
2547            cp -Rdf $f . 2>&1 >> $LOGFILE
2548        fi
2549    done
2550    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2551
2552    cd dev || Die "Can't cd to dev"
2553    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2554    rm -f dev-entries.tgz
2555    cd ..
2556
2557    for w in insmod.static insmod.static.old ; do
2558        s=`which $w 2> /dev/null`
2559        if [ -e "$s" ] ; then
2560            tar cf - -C / $s 2> /dev/null | tar xf -
2561        fi
2562    done
2563
2564    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2565   
2566    # Copy of files mandatory for ssh to automate mount if sshfs is used
2567    mkdir $mountpoint/.ssh
2568    cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
2569    echo > $mountpoint/tmp/myssh << EOF
2570ssh -o StrictHostKeyChecking=no $*
2571EOF
2572    chmod 755 $mountpoint/tmp/myssh
2573
2574    # Copy of files mandatory for ld.so
2575    cp -rp /etc/ld.so.c* $mountpoint/etc
2576
2577    # Handle the case where busybox and mount are dynamically linked
2578    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2579    if [ $? -eq 0 ]; then
2580        # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2581        rm -f bin/mount
2582    fi
2583
2584    # Copy of files from the minimal env needed as per the deplist.d/minimal.conf file (which includes all busybox deps)
2585    rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2586    for f in `grep -v " *#.*" $DEPLIST_DIR/minimal.conf | sort -u`; do
2587        if [ -r $f ]; then
2588            echo $f >> $MINDI_TMP/minimal.lis
2589            LocateDeps $f >> $MINDI_TMP/minimal2.lis
2590        fi
2591    done
2592    for f in `cat $MINDI_TMP/minimal.lis` `sort -u $MINDI_TMP/minimal2.lis`; do
2593        ReadAllLink $f >> $MINDI_TMP/minimal.lis
2594    done
2595    # Initial / are trucated by tar
2596    finallist=""
2597    # Remove directories from the list, as tar will create them anyway
2598    # and it may hurt if /lib is in it as on Debian/Ubuntu
2599    for f in `sort -u $MINDI_TMP/minimal.lis`; do
2600        if [ ! -d $f ]; then
2601            finallist="$finallist $f"
2602        fi
2603    done
2604    tar cf - $finallist 2>> $MINDI_TMP/$$.log | tar xUf - || LogIt "WARNING: Problem in minimal analysis" $MINDI_TMP/$$.log
2605
2606    # To improve support for distribution scripts, we now prefer to use bash as the std shell. Also fixes #600
2607    ln -sf /bin/bash bin/sh
2608    LogIt "INFO: Using bash as default shell"
2609    rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2610
2611    # Avoids an issue on some distro (RHEL5)
2612    rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2613
2614    mkdir -p $mountpoint/tmp
2615    # Management of udev (which includes modprobe in rules)
2616    ps auxww | grep -v grep | grep -qw udevd
2617    if [ $? -eq 0 ]; then
2618        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2619        LogIt "INFO: udev device manager found"
2620        tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2621        # This avoids NIC remapping if on another machine at restore time on Debian at least
2622        rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2623        # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2624        rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2625        # Do not do it if it's a link (Ubuntu 64 bits #503)
2626        if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [  ! -h "/lib64/udev" ]; then
2627            tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
2628        fi
2629        if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [  ! -h "/lib32/udev" ]; then
2630            tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
2631        fi
2632        if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [  ! -h "/lib/udev" ]; then
2633            tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2634        fi
2635        if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
2636            lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
2637            lis=""
2638            # Get only the files which exist in that list
2639            # and potentially their symlink structure
2640            for i in $lis2; do
2641                if [ -h $i ]; then
2642                    j=$i
2643                    while [ -h $j ]; do
2644                        lis="$lis $j"
2645                        j=`readlink $j`
2646                    done
2647                    lis="$lis $j"
2648                elif [ -f $i ]; then
2649                    lis="$lis $i"
2650                fi
2651            done
2652            # And their deps
2653            LocateDeps $lis > $MINDI_TMP/udev.lis
2654            for i in $lis; do
2655                if [ "`echo $i | cut -c1`" = "/" ]; then
2656                    j=`echo $i | cut -c2-`
2657                    [ "$j" != "" ] && rm -f $j
2658                fi
2659            done
2660            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
2661            rm -f $MINDI_TMP/udev.lis
2662        else
2663            LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
2664            LogAll "         mindi will use static devices which may cause problems"
2665            rm -f $mountpoint/tmp/USE-UDEV
2666        fi
2667    fi
2668
2669    # Management of potential HW info (ProLiant only at the moment)
2670    rm -rf $MINDI_CACHE/bkphw
2671    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2672    if [ -d $MINDI_CACHE/bkphw ]; then
2673        LogIt "INFO: Hardware Information found and saved ..."
2674        cp -rp $MINDI_CACHE/bkphw .
2675        if [ -f $MINDI_CACHE/tools.files ]; then
2676            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2677            LocateDeps $lis > $MINDI_TMP/tools.lis
2678            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
2679        fi
2680        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2681            mv -f $MINDI_CACHE/mindi-rsthw .
2682            chmod 755 ./mindi-rsthw
2683        fi
2684        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2685    fi
2686
2687    # Management of perl scripts delivered needed at restore time
2688    mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2689    tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
2690
2691    for w in cdrom groovy-stuff ; do
2692        mkdir -p mnt/$w
2693    done
2694
2695    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
2696
2697    cd "$old_pwd"
2698    echo -en "..."
2699    old_pwd=`pwd`
2700    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2701        cd "$MINDI_TMP"
2702        needed_modules_path=lib/modules/$FAILSAFE_KVER
2703    else
2704        cd /
2705        if [ "${kernelname}" != "" ]
2706        then
2707            needed_modules_path=lib/modules/${kernelname}
2708        else
2709            needed_modules_path=lib/modules/$KERVERRUN
2710        fi
2711    fi
2712
2713    needed_modules=""
2714    list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2715
2716    if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2717        # For PXE boot
2718        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2719    fi
2720    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2721        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2722    fi
2723    for i in $DENY_MODS; do
2724        LogFile "INFO: Removing $i from the list of modules to load"
2725        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2726    done
2727
2728    [ -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."
2729    for i in $list_of_groovy_mods ; do
2730        needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2731    done
2732
2733    for i in `echo $needed_modules  | tr ' ' '\n' | sort -u`; do
2734        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2735        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2736        LogFile "INFO: Adding $i ($s KB) to the rootfs"
2737        tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2738        # Uncompress modules if not using udev and native modprobe
2739        if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2740            if [ "`echo "$i" | grep -F ".gz"`" ]; then
2741                LogFile "INFO: Uncompressing $i"
2742                gunzip -f $mountpoint/$i
2743            fi
2744        fi
2745        if [ -L $mountpoint/$i ] && [ `echo "$i" | grep "\.ko$"` ]; then
2746            echo "Replacing module symlink ($i) with actual file"
2747            rm -f $mountpoint/$i
2748            cp -Lf $i $mountpoint/$i
2749            ls -l $mountpoint/$i
2750        fi
2751    done
2752
2753    # Also copy modules.* in case of udev so that normal modprobe works
2754    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
2755
2756    # Copy FW in case some drivers needs it
2757    if [ -d "/lib/firmware" ]; then
2758        cp -rp /lib/firmware $mountpoint/lib
2759    fi
2760
2761    # Copy an additional ProLiant tool for OBDR support
2762    if [ -f $MINDI_TMP/OBDR ]; then
2763        if [ -x /usr/bin/hpsa_obdr_mode ]; then
2764            mkdir -p $mountpoint/usr/bin
2765            cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
2766            LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved OBDR support"
2767        else
2768            LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode tool"
2769            LogAll "         This may lead to a tape not going back to sequential mode after OBDR boot"
2770        fi
2771    fi
2772
2773    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2774        LogFile "INFO: Deleting devfsd daemon from ramdisk"
2775        [ ! -e "/sbin/devfsd" ] && LogFile "      ...because /sbin/devfsd not found"
2776        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "      ...because kernel is failsafe"
2777        rm -f $mountpoint/sbin/devfsd
2778    fi
2779    cd "$old_pwd"
2780    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2781    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2782    rm -f $mountpoint/zero
2783    if [ _"$MONDO_SHARE" != _"" ]; then
2784        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2785        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2786        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2787        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2788        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2789        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2790        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2791        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2792        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2793    fi
2794    mkdir -p $mountpoint/proc
2795    LogFile "---------------------------"
2796    LogFile "Content of initial ramdisk:"
2797    LogFile "---------------------------"
2798    (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
2799    LogFile "---------------------------"
2800
2801    # Determine what filesystem to use for initrd image
2802    LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2803    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2804    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2805    if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ] || [ "$gvFileSystem" = "ext4fs" ]; then
2806        # say what will be used
2807        LogFile "INFO: Creating an $gvFileSystem initrd image..."
2808        # kernel expects linuxrc in ext2 filesystem
2809        ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
2810        # unmount loop filesystem and create image file using the standard approach
2811        umount $mountpoint || Die "Cannot unmount $tempfile"
2812        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2813        if [ "$gvFileSystem" = "ext4fs" ] && [ -x "/sbin/tune4fs" ]; then
2814            bs=`/sbin/tune4fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2815        else
2816            bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2817        fi
2818        MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2819        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2820        rm -f ${rdz_fname}.tmp
2821        # log that we are done
2822        LogFile "      ...done."
2823    elif [ "$gvFileSystem" = "initramfs" ]; then
2824        # say what will be used
2825        LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2826        # make sure that cpio is there
2827        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2828        # go into filesystem
2829        cd "$mountpoint"
2830        # kernel expects init in cpio filesystem
2831        ln -sf sbin/init init
2832        # create cpio image file and unmount loop filesystem
2833        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2834        cd "$old_pwd"
2835        umount $mountpoint || Die "Cannot unmount $tempfile"
2836        # log that we are done
2837        LogFile "      ...done."
2838    else
2839        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2840    fi
2841
2842    if [ "$res" -eq "0" ] ; then
2843        echo -en "..."
2844    else
2845        echo -en "\rMade an rdz WITH ERRORS.           \n"
2846    fi
2847    return 0
2848}
2849
2850
2851##############################################################################
2852#----------------------------------- Main -----------------------------------#
2853##############################################################################
2854
2855# Now we can create what we need
2856mkdir -p $MINDI_TMP
2857
2858# Purge from potential old run
2859if [ _"$MINDI_CACHE" = _"" ]; then
2860    Die "MINDI_CACHE undefined"
2861fi
2862
2863# --nolog needs to be first, and is used in analyze-my-lvm
2864if [ "$1" = "--nolog" ] ; then
2865    shift
2866    LOGFILE=/dev/stderr
2867else
2868    > $LOGFILE
2869fi
2870if [ "$1" = "--printvar" ] ; then
2871    shift
2872    if [ _"$1" != _"" ] ; then
2873        set | grep -Ew "^$1" | cut -d= -f2
2874    fi
2875    exit 0
2876fi
2877
2878LogFile "mindi v$MINDI_VERSION"
2879LogFile "$ARCH architecture detected"
2880LogFile "mindi called with the following arguments:"
2881echo "$@">> $LOGFILE
2882LogFile "Start date : `date`"
2883LogFile "-----------------------------"
2884
2885[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2886
2887# Log some capital variables
2888[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2889LogFile "MONDO_SHARE = $MONDO_SHARE"
2890LogFile "MINDI_LIB = $MINDI_LIB"
2891LogFile "MINDI_SBIN = $MINDI_SBIN"
2892[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2893LogFile "MINDI_CONF = $MINDI_CONF"
2894if [ -f $MINDI_CONFIG ]; then
2895    LogFile "-----------------------------"
2896    LogFile " Mindi configuration file    "
2897    LogFile "-----------------------------"
2898    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2899    LogFile "-----------------------------"
2900fi
2901LogFile "In Mindi"
2902LogFile "--------"
2903LogFile "EXTRA_SPACE = $EXTRA_SPACE"
2904LogFile "BOOT_SIZE = $BOOT_SIZE"
2905LogFile "--------"
2906
2907trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2908
2909# Sanity checks
2910which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2911which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2912which 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."
2913which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2914if which awk &> /dev/null ; then
2915    if ! which gawk &> /dev/null ; then
2916        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"
2917    fi
2918fi
2919which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2920[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2921
2922[ "`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"
2923
2924# Update the PATH variable if incomplete
2925if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2926    PATH=$PATH:/sbin:/usr/sbin
2927    export PATH
2928    LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2929    LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2930    LogFile "INFO:  Or you might like to call 'su -' instead of 'su', for example."
2931fi
2932
2933# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2934if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2935    source $MINDI_LIB/FindDistroFailsafe
2936    # Log kernel image
2937    LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2938else
2939    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2940fi
2941
2942if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2943    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2944fi
2945
2946### BERLIOS
2947### Fix as it's not mandatory on ia64
2948if [ "$ARCH" = "ia64" ] ; then
2949    if which elilo &> /dev/null ; then
2950        LILO_EXE=elilo
2951    else
2952        LILO_EXE=`which false 2> /dev/null`
2953    fi
2954else
2955    FindIsolinuxBinary
2956fi
2957trap "Aborted" SIGTERM
2958DONE="\r\t\t\t\t\t\t\t\tDone.         "
2959kernelpath=""
2960MONDO_ROOT=/var/cache/mondo
2961mkdir -p $MONDO_ROOT
2962
2963if [ -d "/proc/lvm" ]; then
2964    # LVM v1
2965    LVMCMD=""
2966    LVM="v1"
2967elif [ -d "/dev/mapper" ]; then
2968    # LVM v2
2969    LVMCMD="lvm"
2970    LVM="v2"
2971else
2972    LVM="false"
2973fi
2974LogFile "INFO: LVM set to $LVM"
2975LogFile "----------"
2976LogFile "mount result:"
2977LogFile "-------------"
2978mount >> $LOGFILE
2979if [ -e /etc/raidtab ]; then
2980    LogFile "-------------"
2981    LogFile "/etc/raidtab content:"
2982    LogFile "-------------"
2983    cat /etc/raidtab >> $LOGFILE
2984else
2985    LogFile "No file /etc/raidtab"
2986fi
2987if [ -e /etc/mdadm.conf ]; then
2988    LogFile "-------------"
2989    LogFile "/etc/mdadm.conf content:"
2990    LogFile "-------------"
2991    cat /etc/mdadm.conf >> $LOGFILE
2992else
2993    LogFile "No file /etc/mdadm.conf"
2994fi
2995LogFile "-------------"
2996LogFile "cat /proc/cmdline:"
2997LogFile "-------------"
2998cat /proc/cmdline >> $LOGFILE
2999LogFile "-------------"
3000LogFile "cat /proc/swaps:"
3001LogFile "-------------"
3002cat /proc/swaps >> $LOGFILE
3003LogFile "-------------"
3004if [ -e /proc/mdstat ]; then
3005    LogFile "cat /proc/mdstat:"
3006    LogFile "-------------"
3007    cat /proc/mdstat >> $LOGFILE
3008else
3009    LogFile "No pseudo file /proc/mdstat"
3010fi
3011LogFile "-------------"
3012LogFile "cat /proc/partitions:"
3013LogFile "-------------"
3014cat /proc/partitions >> $LOGFILE
3015LogFile "-------------"
3016LogFile "cat /proc/filesystems:"
3017LogFile "-------------"
3018cat /proc/filesystems >> $LOGFILE
3019LogFile "-------------"
3020LogFile "lsmod result:"
3021LogFile "-------------"
3022lsmod >> $LOGFILE
3023MODULES="`cat /proc/modules | $AWK '{print $1}'`"
3024if [ -x /usr/sbin/esxcfg-module ]; then
3025    LogFile "-------------"
3026    LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
3027    LogFile "-------------"
3028    LogFile "VMWare modules"
3029    LogFile "-------------"
3030    /usr/sbin/esxcfg-module -l >> $LOGFILE
3031    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
3032fi
3033LogFile "FORCE_MODS:"
3034LogFile "-------------"
3035LogFile "$FORCE_MODS"
3036LogFile "-------------"
3037LogFile "DENY_MODS:"
3038LogFile "-------------"
3039LogFile "$DENY_MODS"
3040LogFile "-------------"
3041LogFile "df result:"
3042LogFile "----------"
3043df -T >> $LOGFILE
3044LogFile "-------------"
3045LogFile "List of extra modules is:"
3046LogFile "$EXTRA_MODS"
3047LogFile "-------------"
3048
3049# Compute libata version
3050laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
3051# If libata v2 is used then remove ide-generic as it will perturbate boot
3052if [ "`echo $MODULES | grep libata`" ]; then
3053    if [ "$laver" = "2" ]; then
3054        DENY_MODS="$DENY_MODS ide-generic"
3055        LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
3056        LogFile "-------------"
3057    fi
3058fi
3059
3060# Check for McAfee which disturbs the access to some files (tgz in articular)
3061if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
3062    LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
3063    LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
3064    LogFile "WARNING: You have two options:"
3065    LogFile "WARNING:  - Exclude all directories with special files (check McAfee System Events Log)"
3066    LogFile "WARNING:  - Disable the scanner during the backup"
3067fi
3068
3069# Check for ISO_CMD command
3070if [ ! -x $ISO_CMD ]; then
3071    LogFile "NOTE: No CD image (ISO file) utility found"
3072fi
3073
3074FLOPPY_WAS_MOUNTED=""
3075for mtpt in /media/floppy /mnt/floppy /floppy ; do
3076    if mount | grep -w $mtpt &> /dev/null ; then
3077        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3078        umount $mtpt
3079    fi
3080done
3081
3082#
3083# If we have a USB device we need to store info
3084# and remove it from the parameters line
3085#
3086if [ "$#" -ne "0" ] ; then
3087    if [ "$1" = "--usb" ] ; then
3088        shift
3089        USBDEVICE=$1
3090        if [ _"$USBDEVICE" = _"" ]; then
3091            Die "No USB device specified"
3092        fi
3093        shift
3094    fi
3095fi
3096
3097if [ "$#" -ne "0" ] ; then
3098    if [ "$1" = "--findkernel" ] ; then
3099        resk=`TryToFindKernelPath`
3100        # Avoids logfile content for mondo
3101        export MONDO_SHARE=""
3102        if [ "$resk" = "" ] ; then
3103            if [ $KERNEL_IS_XEN = "yes" ]; then
3104                echo "$xenkernelpath"
3105                LogFile "INFO: xenkernelpath = $xenkernelpath"
3106                MindiExit 0
3107            else
3108                MindiExit -1
3109            fi
3110        else
3111            echo "$resk"
3112            LogFile "INFO: kernelpath = $resk"
3113            MindiExit 0
3114        fi
3115    elif [ "$1" = "--locatedeps" ] ; then
3116        [ ! "$2" ] && Die "Please specify the binary to look at"
3117        LocateDeps $*
3118        # Avoids logfile content for mondo
3119        export MONDO_SHARE=""
3120        MindiExit $?
3121    elif [ "$1" = "--readalllink" ] ; then
3122        [ ! "$2" ] && Die "Please specify the binary to look at"
3123        # Avoids logfile content for mondo
3124        export MONDO_SHARE=""
3125        ReadAllLink $2
3126        MindiExit $?
3127    elif [ "$1" = "--makemessage" ] ; then
3128        MakeMessageFile | cut -c1-80
3129        MindiExit 0
3130    elif [ "$1" = "--makemountlist" ] ; then
3131        [ ! "$2" ] && Die "Please specify the output file"
3132        MakeMountlist $2
3133        CheckMountlist $2
3134        # Avoids logfile content for mondo
3135        export MONDO_SHARE=""
3136        MindiExit $?
3137    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3138        echo "Mindi v$MINDI_VERSION"
3139        # Avoids logfile content for mondo
3140        export MONDO_SHARE=""
3141        MindiExit 0
3142    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3143        MONDO_TMP=$2
3144        # Change MINDI_TMP for the one provided by mondo
3145        # So that it can get back the built files
3146        if [ _"$MONDO_TMP" = _"" ]; then
3147            Die "MONDO_TMP is empty, aborting"
3148        fi
3149        if [ _"$MONDO_TMP" = _"/" ]; then
3150            Die "MONDO_TMP is /, aborting"
3151        fi
3152        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
3153        rmdir $MINDI_TMP
3154        export MINDI_TMP=$MONDO_TMP
3155        mkdir -p $MINDI_TMP
3156
3157        # This is the scratch dir in mondo - subdir images
3158        MINDI_CACHE=$3
3159
3160        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3161        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3162       
3163###
3164### Sq-Modification...
3165### Attempt to locate kernel specific module path
3166### if module path is found then use it other wise use uname -r to set it...
3167###
3168        if [ $KERNEL_IS_XEN = "yes" ]; then
3169            LogIt "INFO: xenkernelpath = $xenkernelpath"
3170        fi
3171        kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
3172        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3173        then
3174           LogIt "WARNING: Module path for ${kernelpath} not found..."
3175           LogIt "         using running kernel\'s modules."
3176           kernelname=$KERVERRUN
3177        fi
3178        LogIt "INFO: kernelname = $kernelname"
3179        LogIt "INFO: kernelpath = $kernelpath"
3180###
3181### end of Sq-Modification
3182###
3183        TAPEDEV=$5
3184        TAPESIZE=$6
3185        FILES_IN_FILELIST=$7
3186        USE_LZO=$8
3187        CDRECOVERY=$9
3188        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3189            IMAGE_DEVS=""
3190        else
3191            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3192        fi
3193        if [ "${11}" ] ; then
3194            LILO_OPTIONS=""
3195    #       LogIt "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
3196        fi
3197        LAST_FILELIST_NUMBER=${12}
3198        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3199        export MINDI_EXCLUDE_DEVS="${14}"
3200        USE_COMP="${15}"
3201        USE_LILO="${16}"
3202        USE_STAR="${17}"
3203        INTERNAL_TAPE_BLOCK_SIZE="${18}"
3204        DIFFERENTIAL="${19}"
3205        USE_GZIP="${20}"
3206        NOT_BOOT="${21}"
3207        [ "$USE_COMP" = "" ] && USE_COMP=yes
3208        [ "$USE_GZIP" = "" ] && USE_GZIP=no
3209        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3210        [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
3211        # MONDO_ROOT is the real scratchdir
3212        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
3213        if [ _"$MONDO_ROOT" != _"" ]; then
3214            mkdir -p $MONDO_ROOT
3215        else
3216            Die "MONDO_ROOT is undefined"
3217        fi
3218    else
3219        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3220        MindiExit -1
3221    fi
3222fi
3223
3224if [ _"$MINDI_CACHE" != _"" ]; then
3225    rm -rf $MINDI_CACHE/* 2> /dev/null
3226    mkdir -p $MINDI_CACHE
3227fi
3228
3229[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3230
3231if [ _"$MONDO_SHARE" = _"" ]; then
3232    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3233    LogIt "Latest Mindi is available from http://www.mondorescue.org"
3234    LogIt "BusyBox sources are available from http://www.busybox.net"
3235    LogIt "------------------------------------------------------------------------------"
3236else
3237    LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
3238fi
3239if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3240    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3241else
3242    LogIt "ERROR: Unable to find mindi-busybox, please install it"
3243    MindiExit -1
3244fi
3245
3246for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3247    modinfo $i 2> /dev/null 1> /dev/null
3248    if [ $? -eq 0 ]; then
3249        modprobe $i 2>&1 > /dev/null
3250    fi
3251done
3252
3253KERN_DISK_MADE=""
3254
3255LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3256LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3257LogFile "NOT_BOOT = '$NOT_BOOT'"
3258if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3259    LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3260    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3261    MakeMountlist $MINDI_TMP/mountlist.txt
3262    CheckMountlist $MINDI_TMP/mountlist.txt
3263    mkdir -p $MINDI_TMP/small-all/tmp
3264    cd "$MINDI_TMP/small-all"
3265    cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
3266    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
3267    sleep 2
3268    LogIt "Done. Exiting."
3269    MindiExit 0
3270fi
3271
3272if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3273    LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
3274fi
3275
3276if [ "$kernelpath" = "" ] ; then
3277    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3278    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3279    read ch
3280    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3281        USE_OWN_KERNEL="yes"
3282    else
3283        USE_OWN_KERNEL="no"
3284    fi
3285    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3286        YOUR_KERNEL_SUCKS=""
3287        kernelpath=`TryToFindKernelPath`
3288        if [ "$kernelpath" = "" ] ; then
3289            echo -n "Please enter kernel path : "
3290            read kernelpath
3291        fi
3292    else
3293        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3294    fi
3295fi
3296if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3297    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3298    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3299        source $MINDI_LIB/FindDistroFailsafe
3300        # Log kernel image
3301        LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3302        kernelpath="$FAILSAFE_KBIN"
3303        LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3304        LogIt "      The failsafe kernel is $kernelpath."
3305        LogIt "      However, you are still running your kernel. If Mindi fails to create your"
3306        LogIt "      disks then it may still be a result of a problem with your kernel."
3307        pwd=`pwd`
3308        cd "$MINDI_TMP"
3309        mkdir -p lib/modules
3310        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
3311        cd "$pwd"
3312    else
3313        kernelpath=$MINDI_LIB/vmlinuz
3314        LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3315        LogIt "      However, you are still running your kernel. If Mindi fails to create your"
3316        LogIt "      disks then it may still be a result of a problem with your kernel."
3317        pwd=`pwd`
3318        cd "$MINDI_TMP"
3319        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3320        cd "$pwd"
3321    fi
3322    YOUR_KERNEL_SUCKS="Your kernel sucks"
3323fi
3324echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
3325[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
3326
3327[ "$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."
3328
3329PrepareDataDiskImages
3330
3331ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3332rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3333export ramdisk_size=$rds
3334
3335LogFile "INFO: Ramdisk will be $ramdisk_size KB"
3336if [ "$ARCH" = "ia64" ] ; then
3337    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
3338else
3339    PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size KB disk image."
3340fi
3341
3342[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3343...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3344
3345if [ _"$MONDO_SHARE" = _"" ]; then
3346    ListImagesForUser
3347    OfferToMakeBootableISO
3348    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3349        OfferToMakeBootableUSB
3350    fi
3351elif [ "$TAPEDEV" ] ; then
3352    if [ "$ARCH" != "ia64" ] ; then
3353        # We need to keep the img file as boot file for ia64 platform
3354        rm -f $MINDI_CACHE/{*img,*iso}
3355    else
3356        rm -f $MINDI_CACHE/*iso
3357    fi
3358    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3359        OfferToMakeBootableUSB
3360    fi
3361    OfferToMakeBootableISO
3362    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3363        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3364    else
3365        Die "Cannot find all.tar.gz, to be written to tape"
3366    fi
3367elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3368    OfferToMakeBootableUSB
3369else
3370    OfferToMakeBootableISO
3371fi
3372# cleanup
3373LogIt "INFO: $FRIENDLY_OUTSTRING"
3374for mtpt in $FLOPPY_WAS_MOUNTED ; do
3375    mount $mtpt
3376done
3377MindiExit 0
Note: See TracBrowser for help on using the repository browser.