source: branches/2.2.9/mindi/mindi @ 2838

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