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

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