source: branches/2.2.9/mindi/mindi @ 2847

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