source: branches/3.1/mindi/mindi @ 3147

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