source: branches/3.0/mindi/mindi @ 3163

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