source: branches/2.2.9/mindi/mindi @ 2854

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