source: branches/3.0/mindi/mindi @ 3107

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