source: branches/3.0/mindi/mindi @ 3149

Last change on this file since 3149 was 3149, checked in by bruno, 6 years ago
  • Minimize diffs between mindi 3.0 and mindi 3.1
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 123.8 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 3149 2013-06-19 06:59:05Z 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
36MINDI_CACHE=/var/cache/mindi
37
38# Temporary directory for mindi
39TMPDIR=/tmp
40
41EXTRA_SPACE=120000      # increase if you run out of ramdisk space
42BOOT_SIZE=65600         # size of the boot disk
43
44PROMPT_MAKE_CD_IMAGE="yes"
45    # Ask if you want to make a CD Image to be written?
46    # if this is set to 'no', then the image will be created automatically
47
48PROMPT_MAKE_USB_IMAGE="yes"
49    # Ask if you want to make a USB Image to be written?
50    # if this is set to 'no', then the image will be created automatically
51
52USE_OWN_KERNEL="yes"
53    # If set to "no", you will be prompted for whether or not
54    # you want to use your own kernel, or the supplied default.
55    # If "yes" mindi will automatically use your own kernel.
56
57KERNEL_IS_XEN="no"
58    # If set to "no", the kernel is not a Xen kernel
59    # If "yes", mindi will modify isolinux.cfg for the Xen kernel.
60xenkernelpath=""
61 
62MY_FSTAB=/etc/fstab
63TAPE_MODS="ht st osst ide-tape ide_tape"
64SCSI_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"
65
66# ide-probe-mod
67IDE_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"
68PCMCIA_MODS="pcmcia_core ds yenta_socket"
69USB_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"
70NET_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"
71CDROM_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"
72# Those modules will only go on the backup media, not the boot media.
73EXTRA_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 "
74# Replace with that line for HP OCMP e.g.
75#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
76DENY_MODS="kqemu vxfen"
77# Force some modules to be included
78FORCE_MODS=""
79
80# Find MBR in case of bootable USB device to build
81MBRFILE=/usr/lib/syslinux/mbr.bin
82[ ! -r "$MBRFILE" ] && MBRFILE=/usr/lib64/syslinux/mbr.bin
83[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/syslinux/mbr.bin
84[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib/syslinux/mbr.bin
85[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib64/syslinux/mbr.bin
86
87LOGFILE=/var/log/mindi.log
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    LogFile "Mindi $MINDI_VERSION is exiting" 
159    LogFile "End date : `date`" 
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        LogAll "FATAL ERROR"
184    else
185        LogAll "FATAL ERROR. $1"
186    fi
187    if [ _"$2" != _"" ]; then
188        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
189    fi
190    rm -f "$2"
191
192    LogAll "Please e-mail a copy of $LOGFILE to the mailing list."
193    LogAll "See http://www.mondorescue.org for more information."
194    LogAll "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"
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"
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            LogAll "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    # TODO: Why that
258    mkdir -p $bigdir/etc
259    tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogAll "WARNING: AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
260    if [ "`echo $mappath | grep -F ".gz"`" ] ; then
261        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'//g | cut -d' ' -f2`
262    else
263        included_list=`grep -Fi include $mappath | sed s/'"'//g | cut -d' ' -f2`
264    fi
265    for included_item in $included_list ; do
266        if [ ! -e "$included_item" ] ; then
267            sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
268            [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
269            for ii in $sss ; do
270                [ -e "$ii" ] && AddKeyboardMappingFile $ii
271            done
272        else
273            AddKeyboardMappingFile $included_item
274        fi
275    done
276}
277
278
279CopyDependenciesToDirectory() {
280    local outdir incoming counter d found tdir
281    outdir=$1
282    mkdir -p $outdir
283    incoming=`ReadLine`
284    counter=0
285    while [ "$incoming" != "" ] ; do
286        # Non absolute file names should not arrive till here => skipped
287        if [ `echo "$incoming" | cut -c1` != '/' ]; then
288            LogAll "WARNING: Unable to handle $incoming"
289            incoming=`ReadLine`
290            continue
291        fi
292        # no parent directory of incoming should be a link, copy is not possible in that case
293        d=`dirname "$incoming"`
294        found="false"
295        while [ $d != "/" -a $found = "false" ]; do
296            [ -h "$d" ] && found="true"
297            d=`dirname "$d"`
298        done
299        if [ -d "$incoming" ]; then
300            find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir 0
301        elif [ -e "$incoming" ] && [ $found = "false" ]; then
302            if [ ! -h "$incoming" ]; then
303                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
304            else
305                tdir=`dirname "$incoming"`
306                if [ ! -e "$outdir/$tdir" ]; then
307                    mkdir -p "$outdir/$tdir"
308                fi
309                cp --no-dereference --preserve=all $incoming "$outdir/$tdir"
310            fi
311            # Only uncompress modules if not using udevd
312            if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
313                gunzip -f $outdir/$incoming || LogAll "WARNING: Cannot gunzip $outdir/$incoming"
314            fi
315            [ -x "$outdir" ] && StripExecutable $outdir
316            counter=$(($counter+1))
317            LogProgress $counter $2
318        fi
319        incoming=`ReadLine`
320    done
321}
322
323
324CountItemsIn() {
325    local r
326    r=0
327    for q in $1 ; do
328        r=$(($r+1))
329    done
330    echo $r
331}
332
333
334DropOptimizedLibraries() {
335    local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
336    filelist=$1
337    outdir=$2
338
339    list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
340    if [ "$list_of_optimized_libraries" = "" ] ; then
341        return 0
342    fi
343    echo -en "Dropping i686-optimized libraries if appropriate"
344    for optimized_lib_name in $list_of_optimized_libraries ; do
345        echo -en "."
346        reason=""
347        vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
348        echo "$vanilla_lib_name" >> $filelist
349        LogFile "INFO: Adding $vanilla_lib_name to filelist"
350        mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
351        rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
352
353        # This may return multiple files
354        for resolved in `ReadAllLink $vanilla_lib_name`; do
355            LogFile "INFO: Adding as deps $resolved to filelist"
356            vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
357            if [ "$vanilla_resolved_name" != "$resolved" ]; then
358                mkdir -p $outdir$resolved> /dev/null 2> /dev/null
359                rmdir $outdir$resolved > /dev/null 2> /dev/null
360                ln -sf $vanilla_resolved_name $outdir$resolved
361                LogFile "INFO: Excluding deps $resolved" 
362                grep -Fvx "$resolved" "$filelist" > $filelist.tmp
363                LogFile "INFO: Replacing it with $vanilla_resolved_name" 
364                echo "$vanilla_resolved_name" >> $filelist.tmp
365                mv -f $filelist.tmp $filelist
366            fi
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    LogAll "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        LogAll "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        mkdir -p $bigdir/tmp
400        echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
401        KBDEPTH=0
402        mkdir -p $bigdir/etc/console
403        cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
404        echo ""
405        echo -e "$DONE"
406        return 0
407    elif [ -e "/etc/console-setup/boottime.kmap.gz" ] || [ -e "/etc/console-setup/cached.kmap.gz" ] ; then
408        LogFile "INFO: Ubuntu-style config detected."
409        mkdir -p $bigdir/tmp
410        if [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
411            kbdfile="/etc/console-setup/boottime.kmap.gz"
412        else
413            kbdfile="/etc/console-setup/cached.kmap.gz"
414        fi
415        echo $kbdfile > $bigdir/tmp/KEYMAP-LIVES-HERE
416        KBDEPTH=0
417        mkdir -p $bigdir/etc/console-setup
418        cp $kbdfile $bigdir/etc/console-setup 2>> $LOGFILE
419        echo ""
420        echo -e "$DONE"
421        return 0
422    elif [ -e "/etc/rc.conf" ] ; then
423        LogFile "INFO: ArchLinux config detected."
424        keyfile=/etc/rc.conf
425    elif [ -e "/etc/conf.d/keymaps" ] ; then
426        LogFile "INFO: Gentoo-style config detected."
427        keyfile=/etc/conf.d/keymaps
428    else
429        LogFile "Searching for rc.config ..."
430        keyfile=`find /etc -name rc.config | head -n1`
431        if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
432            LogAll "WARNING: Unknown config detected. Default keyboard map will be used."
433            return
434        else
435            LogFile "INFO: Found $keyfile"
436        fi
437    fi
438    if [ ! -e "$KEYDIR/keymaps" ] ; then
439        LogAll "WARNING: Keyboard mapping directory not found. Default keyboard map will be used."
440        return
441    fi
442    LogFile "INFO: keyfile=$keyfile"
443    # For SLES we need to remove the .map.gz extension Cf #614
444    locale=`grep -F KEYTABLE "$keyfile" | grep -v '^#' | tr -d '"' |cut -d'=' -f2 | sed 's/.map.gz$//'`
445    [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'`        # Slackware
446    [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | grep -v '^#' | tr -d '"' |cut -d'=' -f2`     # Gentoo & ArchLinux
447    LogFile "INFO: locale=$locale"
448    #
449    # Process the keymaps dir once for all
450    # AddKeyboardMappingFile will use it recursively
451    #
452    find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
453    mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
454    [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
455    # If we have multiple keymaps then log it !!
456    echo "$mp" | grep -q " " >> $LOGFILE
457    if [ $? -eq 0 ]; then
458        LogAll "WARNING: Multiple keymaps found: $mp"
459        LogFile "INFO: The following one will be used"
460    fi
461    for i in $mp ; do
462        mappath=$i
463        [ -e "$i" ] && [ ! -d "$i" ] && break
464    done
465    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
466        mappath=$(find / -wholename "*/kbd/keymaps/*/$locale | head -1")
467    fi
468    LogFile "INFO: mappath = $mappath"
469    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
470        LogAll "WARNING: Keyboard mapping file not found. Default keyboard map will be used."
471        return
472    fi
473    LogAll "INFO: Adding the following keyboard mapping tables: "
474    mkdir -p $bigdir/tmp
475    echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
476    KBDEPTH=0
477    AddKeyboardMappingFile $mappath
478    echo ""
479    echo -e "$DONE"
480    rm -f $MINDI_TMP/keymaps.find
481    return 0
482}
483
484
485FindMboot32Binary() {
486    MBOOTC32=/usr/lib/syslinux/mboot.c32
487    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib/syslinux/mboot.c32
488    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib64/syslinux/mboot.c32
489    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/syslinux/mboot.c32
490    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib/syslinux/mboot.c32
491    [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib64/syslinux/mboot.c32
492    [ ! -e "$MBOOTC32" ] && MBOOTC32=`find / -name mboot.c32 | grep -x "/.*/mboot.c32"`
493    [ ! -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"
494    LogFile "INFO: Found mboot.c32 at $MBOOTC32"
495}
496
497FindIsolinuxBinary() {
498    ISOLINUX=/usr/lib/isolinux.bin
499    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
500    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
501    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
502    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
503    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
504    [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
505    [ ! -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"
506    LogFile "INFO: Found isolinux.bin at $ISOLINUX"
507}
508
509
510FindSpecificModuleInPath() {
511    local modpaths pwd line
512    pwd=`pwd`
513    if [ "$YOUR_KERNEL_SUCKS" ] ; then
514        cd "$MINDI_TMP"
515    else
516        cd /
517    fi
518    if [ ! -e "$1" ] ; then
519        LogAll "WARNING: cannot search specific path '$1'"
520        return 1
521    fi
522    # Find all files and links (required for some VMWare VMs)
523    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`
524    echo "$modpaths"
525    cd "$pwd"
526}
527
528
529GenerateGiantDependencyList() {
530    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
531
532    echo -en "Analyzing dependency requirements"
533    outfile=$1
534    tempfile=$MINDI_TMP/$$.txt
535    incoming=`ReadLine`
536
537    > $tempfile
538    progress=0
539    res=0
540    noof_lines=$2
541    while [ "$incoming" != "" ] ; do
542        if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
543            incoming=`ReadLine`
544            continue
545        fi
546        if [ "$incoming" = "LVMFILES:" ] ; then
547            break
548        fi
549        filelist=`GenerateListForFile "$incoming"`
550        r=$?
551        [ "$r" -ne "0" ] && LogAll "WARNING: $incoming not found"
552        res=$(($res+$r))
553#       LogFile "INFO: '$incoming' generates filelist '$filelist'"
554        for fname in $filelist ; do
555            [ "$fname" != "" ] && echo "$fname" >> $tempfile
556        done
557        progress=$(($progress+1))
558        LogProgress $progress $noof_lines
559        incoming=`ReadLine`
560    done
561    if  [ "$incoming" = "LVMFILES:" ] ; then
562        incoming=`ReadLine`
563        lvmversion=""
564        while [ "$incoming" != "" ] ; do
565            if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
566                incoming=`ReadLine`
567                continue
568            fi
569            filelist=`GenerateListForFile "$incoming"`
570            for tool in $filelist ; do
571                lvmresolved=`readlink -f $tool`
572                if [ "$tool" = "$lvmresolved" ]; then
573                    echo "$tool" >> $tempfile
574                elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
575                    if [ "$lvmversion" = "" ] ; then
576                        lvmversion=`$lvmresolved`
577                        echo "$lvmresolved" >> $tempfile
578                    fi
579                    toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
580                    if [ "$lvmversion" = "200" ]; then
581                        # pvdata and lvmcreate_initrd don't exist in LVM2
582                        case "$toolstripped" in
583                        "pvdata")
584                            continue
585                            ;;
586                        "lvmcreate_initrd")
587                            continue
588                            ;;
589                        esac
590                    fi
591                    toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
592                    if [ -e "$toolpath" ] ; then
593                        echo "$toolpath" >> $tempfile
594                        echo "$tool" >> $tempfile
595                    else
596                        toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
597                    fi
598                    if [ -e "$toolpath" ] ; then
599                        echo "$toolpath" >> $tempfile
600                        echo "$tool" >> $tempfile
601                    else
602                        echo "Where are your LVM-Tools? Couldn't find $tool"
603                    fi
604                else
605                    echo "$tool" >> $tempfile
606                fi
607            done
608            progress=$(($progress+1))
609            LogProgress $progress $noof_lines
610            incoming=`ReadLine`
611        done
612    fi
613    echo -en "$DONE\nMaking complete dependency list"
614
615    tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
616    mv -f $tempfile.new $tempfile
617    > $outfile.pre
618    progress=0
619    noof_lines=`cat $tempfile | wc -l`
620    LogFile "---------------------------------"
621    LogFile "List of dependencies:             "
622    LogFile "---------------------------------"
623    for fname in `cat $tempfile` ; do
624        echo "$fname" | tee -a $LOGFILE >> $outfile.pre
625        LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
626        progress=$(($progress+1))
627        LogProgress $progress $noof_lines
628    done
629    if [ _"$MONDO_SHARE" != _"" ]; then
630        mkdir -p $bigdir/tmp
631        mkdir -p $bigdir/sbin
632        mkdir -p $bigdir/bin
633        if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
634            LogAll "\nINFO: Incorporating post-nuke tarball"
635            old_pwd=`pwd`
636            cd "$bigdir"
637            tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogAll "ERROR: when untarring post-nuke tarball" $MINDI_TMP/$$.log
638            cd "$old_pwd"
639        fi
640        if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
641            LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
642        else
643            LogIt "ERROR: Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
644            LogIt "       I bet you've got a spare copy of Mondo or Mindi floating around on your system."
645            LogIt "       If Mindi was called by Mondo then send me a bug report."
646            LogIt "       It not, type 'ps ax' to see which Mondo-related process is still running then kill it. :-)"
647            LogIt "       Finally, run Mindi again."
648            Die "Odd."
649        fi
650        cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nINFO: Mondo v1.2x defaults to LILO as the bootloader, BTW."
651        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
652            LogAll "\nINFO: Incorporating Network-related settings"
653            for r in NETFS-* ISO-PREFIX ; do
654                cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
655                LogFile "INFO: Copying $r to ramdisk"
656            done
657        fi
658    fi
659    tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
660    rm -f $tempfile $outfile.pre
661    [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
662    return $res
663}
664
665
666GenerateListForFile() {
667    local files_found loc fname incoming i res
668    incoming="$1"
669    files_found=""
670    res=0
671
672    for fname in $incoming ; do
673        files_found="$files_found `LocateFile $fname`"
674    done
675
676    echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
677}
678
679
680# Returns all disk devices which are part of a raid array
681GetAllRaidMembers() {
682    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
683}
684
685
686GetFileSizeList() {
687    local i
688    for i in `find $1 -type d -o -print` ; do
689        du -sk $i
690    done
691}
692
693
694# Check kernel filesystem capabilites for accessing initrd image
695# Could be ext2 FS (old mode) or initramfs (new mode)
696#
697# Interface definition:
698# param #1: absolute path to kernel image
699GetInitrdFilesystemToUse() {
700
701    # interface test: make sure we have one parameter
702    if [ $# -ne 1 ]; then
703        Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
704    fi
705
706    # interface parameters
707    local lvKernelImage=$1
708
709    # local constants (filesystem magic strings)
710    local lcMagicCramfs="<3>cramfs: wrong magic"
711    local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
712    local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
713    local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as initramfs"
714
715    # local variables
716    local lvOffset
717    local lvScanRes
718    local lvUseFilesystem
719
720    # say where we are.
721    LogFile "INFO: GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage"
722
723    # verify that file exists
724    [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
725
726    # Kernel may be gzip compressed - Case of RHEL5 - SLES11SP1
727    file $lvKernelImage 2>&1 | grep -q gzip
728    if [ $? -eq 0 ]; then
729        LogFile "INFO: Found a gzip compressed kernel $lvKernelImage"
730        lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs" 2> /dev/null`
731    else
732        LogFile "INFO: Found a non gzip compressed kernel $lvKernelImage"
733        # kernel is x86 boot sector in RHEL3/4 with embedded gzip content
734        # get offet of gzip magic "1f8b0800" in file (for these older kernels)
735        lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}' 2> /dev/null`
736        if [ $lvOffset -eq 0 ]; then
737            LogFile "INFO: gzip magic not found in file $lvKernelImage. Supposing initramfs."
738            lvScanRes=$lcMagicInitfs
739        else
740            lvOffset=`expr $lvOffset / 2`
741            LogFile "INFO: GetInitrdFilesystemToUse(): gzip magic found at lvOffset $lvOffset."
742            # scan again  kernel image
743            lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | gunzip -c 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs" 2> /dev/null`
744        fi
745    fi
746
747    # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
748    if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
749        lvUseFilesystem="ext2fs"
750    elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
751        lvUseFilesystem="ext3fs"
752    elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
753        lvUseFilesystem="initramfs"
754    elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
755        lvUseFilesystem="cramfs"
756    else
757        # In that case, we are most probably after 2.6.30 and use the supported initramfs
758        LogFile "No automatic detection found previously. Supposing initramfs."
759        LogFile "Report on the MondoRescue mailing-list withyour log files"
760        lvUseFilesystem="initramfs"
761    fi
762
763    # say what we are using
764    LogFile "INFO: GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem."
765
766    # return file system to use
767    echo "$lvUseFilesystem"
768
769}
770
771# Searches members of raid device
772# $1: raid device (/dev/md...)
773GetRaidDevMembers() {
774    if [ ! -f /etc/raidtab ]; then 
775        return
776    fi
777    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
778}
779
780
781HackPathsToFailsafe() {
782    local incoming newpath stub i pwd
783    incoming=`ReadLine`
784    pwd=`pwd`
785    cd "$MINDI_TMP"
786    while [ "$incoming" != "" ] ; do
787        stub=`basename $incoming`
788        newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
789        for i in $newpath ; do
790            echo "$i"
791        done
792        read incoming
793    done
794    cd "$pwd"
795}
796
797
798ListAllPartitions() {
799    local res currline partition all_partitions ap_orig remaining i j
800
801    grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
802    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
803    if [ -e "/vmfs/volumes" ]; then
804        # For VMWare ESX 3 get the device names of these volumes
805        vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
806    fi
807    return
808}
809
810
811ListImagesForUser() {
812    local path fname
813    path=$MINDI_CACHE
814    echo -en "In the directory '$path' you will find the images:-\n"
815    for fname in `ls $path | grep -F mindi-` ; do
816        printf "%19s " $fname
817    done
818    echo " "
819}
820
821
822ListKernelModulePaths() {
823    local module_list module fname r kern
824    module_list="$MODULES"
825    # Remove unwanted modules from list
826    for i in $DENY_MODS; do
827        module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
828        EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
829    done
830###
831### Sq-Modification ... Use kernelname for module search path if specified
832###
833    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
834    then
835        kern=${kernelname}
836    else
837        kern="$KERVERRUN"
838    fi
839    export KERVER=$kern
840###
841### Sq-Mod End
842###
843    noof_lines=0
844    # Get rid of duplicates, so that if a live kernel module also appears
845    # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
846    for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
847        noof_lines=$(($noof_lines+1))
848    done
849    progress=0
850    for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
851        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
852        if [ -z "$r" ]; then
853            if [ "`echo "$MODULES" | grep -w $module`" ]; then
854                r="[live module file not found]"
855            else
856                r="[extra module file not found]"
857            fi
858        else
859            [ -f "$r" ] && echo "$r"
860        fi
861        LogFile "INFO: module $module --> $r"
862        progress=$(($progress+1))
863        LogProgress $progress $noof_lines
864    done
865    find /lib/modules/$kern/modules.* -type f 2> /dev/null
866}
867
868#
869# Critical function which computes all dependencies (dyn. lib.)
870# for a list of binaries
871#
872LocateDeps() {
873    local incoming fname deps
874    incoming="$*"
875    for fname in $incoming ; do
876        if [ ! -e "$fname" ] ; then
877            LogFile "WARNING: $fname does not exist; cannot be LDD'd."
878            if echo $fname | grep lvm &> /dev/null ; then
879                LogFile "          This warning only affects you if you are using LVM."
880                if echo "$MODULES" | grep lvm &> /dev/null ; then
881                    LogFile "          I think you are, so please take heed!"
882                else
883                    LogFile "          I don't think you are, so don't worry about it."
884                fi
885            fi
886        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
887            LogFile "INFO: $fname is softlink"
888        else
889            ldd $fname 2> /dev/null | ProcessLDD
890        fi
891    done
892}
893
894
895# Give all symlinks recursively of a full path name
896ReadAllLink() {
897    file="$1"
898
899    while [ `echo $file | grep -Ec '\.\./'` -ne 0 ]; do
900        # We need to normalise the path with .. in it
901        file=`echo $file | perl -pi -e 's|([^/]*)/([^/]+)/\.\./([^/]+)|$1/$3|g'`
902    done
903    echo "$file"
904    if [ ! -h $file ]; then
905        return 0
906    fi
907
908    link=`readlink $file`
909    d=`dirname $file`
910    fchar=`echo $link | cut -c1`
911    # If mother dir is a link print it
912    if [ -h "$d" ]; then
913        echo "$d"
914        d=`readlink $d`
915    fi
916    if [ "$fchar" != "/" ]; then
917        # Relative or local link
918        ReadAllLink "$d/$link" 
919    else
920        # Absolute path
921        ReadAllLink $link 
922    fi
923}
924
925
926LocateFile() {
927    local i path fname_to_find location output resolved tmp stub cache_id loclist
928    fname_to_find="$1"
929    # It's an absolute path
930    if echo "$fname_to_find" | grep -x "/.*" ; then
931        output="$fname_to_find"
932        if [ -h "$output" ] ; then
933            output="`ReadAllLink $output` $output"
934        fi
935        echo "$output"
936        return 0
937    fi
938    # It's not an absolute path
939    output=""
940    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
941    #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
942        [ -h "$path" ] && continue
943        [ ! -e "$path/$fname_to_find" ] && continue
944        output="$path/$fname_to_find $output"
945        if [ -h "$path/$fname_to_find" ] ; then
946            output="`ReadAllLink $path/$fname_to_find` $output"
947        fi
948    done
949    if [ "$output" = "" ] ; then
950        return 1
951    fi
952    echo "$output"
953    return 0
954}
955
956LogProgress() {
957    local i progress modres noof_lines
958 
959    progress=$1
960    noof_lines=$2
961
962    echo -en "\r\t\t\t\t\t\t\t\t"
963    i=$(($progress*100))
964    if [ $noof_lines -ne 0 ]; then
965        i=$(($i/$noof_lines))
966    else
967        i=0
968    fi
969    echo -en "$i"
970    echo -en "%"
971    modres=$(($progress%4))
972    [ "$modres" -eq "0" ] && echo -en "\t/"
973    [ "$modres" -eq "1" ] && echo -en "\t-"
974    [ "$modres" -eq "2" ] && echo -en "\t\\"
975    [ "$modres" -eq "3" ] && echo -en "\t|"
976}
977
978# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
979MakeMondoConfigFile() {
980    local outfile use_lzo use_comp use_star
981    outfile=$1
982    > $outfile
983    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
984    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
985    [ "$USBDEVICE" ]            && echo "usb-dev $USBDEVICE" >> $outfile
986    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
987    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
988    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
989    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
990    use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
991    use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
992    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
993    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
994    echo "use-lzo $use_lzo" >> $outfile
995    echo "use-gzip $use_gzip" >> $outfile
996    echo "use-star $use_star" >> $outfile
997    echo "use-lzma $use_lzma" >> $outfile
998    echo "use-comp $use_comp" >> $outfile
999    echo "datestamp `date`" >> $outfile
1000    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
1001    AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV           netfs-dev           $outfile
1002    AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO         netfs-proto           $outfile
1003    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
1004    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
1005    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
1006    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-HWADDR netfs-client-hwaddr $outfile
1007    AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW  netfs-client-defgw  $outfile
1008    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT  netfs-server-mount  $outfile
1009    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-USER  netfs-server-user  $outfile
1010    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH   netfs-server-path   $outfile
1011    AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
1012    AddFileToCfgIfExists $MINDI_TMP/ISO-DEV           iso-dev           $outfile
1013    AddFileToCfgIfExists $MINDI_TMP/ISO-MNT           iso-mnt           $outfile
1014    AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX        iso-prefix        $outfile
1015    AddFileToCfgIfExists $MINDI_TMP/ISODIR            isodir            $outfile
1016    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1017    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
1018    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.VER    bootloader.ver   $outfile
1019    AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1020    AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1021    AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1022    AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL      differential      $outfile
1023    AddFileToCfgIfExists $MINDI_TMP/ACL      acl      $outfile
1024    AddFileToCfgIfExists $MINDI_TMP/XATTR      xattr      $outfile
1025    AddFileToCfgIfExists $MINDI_TMP/OBDR      obdr      $outfile
1026}
1027
1028# Get PV's for an LV
1029GetPVsForLV() {
1030  if [ -n "$1" ]; then
1031    vg=`$LVMCMD lvdisplay $1 2>/dev/null |awk '/VG Name/{print $NF;exit}'`
1032    if [ -z "$vg" ]; then
1033      return
1034    fi
1035    $LVMCMD vgdisplay -v $vg 2>/dev/null | awk '/PV Name/{print $NF}'
1036  fi
1037}
1038
1039
1040MakeMountlist() {
1041    local mountlist all_partitions current_partition \
1042partition_size partition_format outstring partition_number \
1043partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1044absolute_partition old_partition_fmt current_lvolume uname skip
1045
1046    LogFile "------------------------------------"
1047    LogFile "Your raw fstab file looks like this:"
1048    LogFile "------------------------------------"
1049    cat $MY_FSTAB >> $LOGFILE
1050    LogAll "-----------------------------------"
1051    LogAll "Your mountlist will look like this:"
1052    LogAll "-----------------------------------"
1053
1054# mountlist(OUT)
1055    mountlist=$1
1056
1057# NB: partition = device
1058# NB: mountpt = where the device is mounted
1059
1060    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1061
1062    [ "$mountlist" != "" ] && rm -Rf $mountlist
1063    > $mountlist
1064    all_partitions=""
1065   
1066    if [ $LVM != "false" ]; then
1067        LogAll "INFO: Analyzing LVM..."
1068        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
1069        if [ $? -ne 0 ]; then
1070            LVM="false"
1071        fi
1072        # Excluded LVs and GVs are not reported here
1073        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
1074    fi
1075    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1076    for i in $IMAGE_DEVS ; do
1077        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1078    done
1079    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1080    printf "%-15s %-15s %-15s %-13s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE MB" LABEL/UUID | tee -a $LOGFILE
1081    printf "%-15s %-15s %-15s %-13s %-15s\n" ------ ---------- ------  -------  ---------- | 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                LogAll "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 "%-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 "%-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 "%-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    LogAll "-----------------------------------" 
1442}
1443
1444CheckMountlist() {
1445    local file=$1
1446    # Coherency verification
1447    ML01=`cat $file | wc -l`
1448    ML02=`grep -vE ' lvm | raid | swap ' $file | wc -l`
1449    ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1450    ML2=`grep -vE ' lvm | raid | swap ' $file | $AWK '{print $2}' | sort -u | wc -l`
1451    if [ "$ML01" -ne "$ML1" ]; then
1452        LogFile "--------------------------------------------"
1453        LogAll "WARNING: Duplicate device entry in mountlist"
1454        LogFile "--------------------------------------------"
1455    fi
1456    if [ "$ML02" -ne "$ML2" ]; then
1457        LogFile "--------------------------------------------"
1458        LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1459        LogFile "------------------------------------------------"
1460    fi
1461}
1462
1463OfferToMakeBootableISO() {
1464    local i old_pwd
1465    if [ -z "$ISO_CMD" ]; then
1466        LogAll "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
1467        return
1468    fi
1469    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1470        echo -en "Shall I make a bootable CD image? (y/[n]) "
1471        read i
1472        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1473    fi
1474    rm -Rf $MINDI_TMP/iso
1475    mkdir -p $MINDI_TMP/iso/{images,archives}
1476    LogFile "INFO: mindi_lib = $MINDI_LIB"
1477    cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogAll "WARNING: OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1478    for i in memdisk memtest.bin memtest.img ; do
1479        j=$MINDI_LIB/$i
1480        k=$MINDI_TMP/iso
1481        if [ -e "$j" ] ; then
1482            LogAll "INFO: Copying $j to $k"
1483            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1484            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1485            if [ _"$MONDO_SHARE" != _"" ]; then 
1486                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1487            fi
1488        fi
1489    done
1490    MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
1491    if [ $KERNEL_IS_XEN = "yes" ]; then
1492        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?"
1493        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?"
1494    fi
1495    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?"
1496    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?"
1497
1498    if [ _"$MONDO_SHARE" != _"" ]; then 
1499        if [ $KERNEL_IS_XEN = "yes" ]; then
1500            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?"
1501            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?"
1502        fi
1503        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?"
1504        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?"
1505    fi
1506    MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1507    if [ "$ARCH" != "ia64" ] ; then
1508        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?"
1509    fi
1510    old_pwd=`pwd`
1511    cd "$MINDI_TMP/iso"
1512    if [ "$ARCH" != "ia64" ] ; then
1513        if [ _"$MONDO_SHARE" != _"" ]; then 
1514            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?"
1515            if [ $KERNEL_IS_XEN = "yes" ]; then
1516                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?"
1517            fi
1518            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1519        fi
1520        $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
1521    else
1522        $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
1523    fi
1524    if [ "$?" -ne "0" ] ; then
1525        LogFile "----------- $ISO_CMD's errors --------------"
1526        LogAll "$ISO_CMD returned the following errors:"
1527        cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
1528        LogAll "ERROR: Failed to create ISO image."
1529    else
1530        LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1531    fi
1532    rm -f $MINDI_TMP/mkisofs.log
1533    cd "$old_pwd"
1534}
1535
1536
1537OfferToMakeBootableUSB() {
1538    local i
1539    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1540        echo -n "Shall I make a bootable USB device ? (y/[n]) "
1541        read i
1542        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1543        if [ "$USBDEVICE" = "" ]; then
1544            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1545            read dev
1546            USBDEVICE=$dev
1547        fi
1548        echo "WARNING: This will erase all content on $USBDEVICE"
1549        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1550        read i
1551        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1552    fi
1553    rm -Rf $MINDI_TMP/usb
1554    mkdir -p $MINDI_TMP/usb
1555    USBPART="${USBDEVICE}1"
1556
1557    echo -en "Transforming $USBDEVICE in a Bootable device " 
1558    echo -en "."
1559    LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1560    LogFile "INFO: Checking $USBDEVICE"
1561    $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1562    if [ $? -ne 0 ]; then
1563        LogAll "ERROR: Unable to access $USBDEVICE"
1564        LogAll "       Make sure your USB device is plugged in"
1565        MindiExit -1
1566    fi
1567    echo -en "."
1568    # Some distro do auto mount at that point (Ubuntu)
1569    LogFile "INFO: Unmounting $USBPART just in case"
1570    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1571    # If your key has no MBR it may cause an issue
1572    # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1573    if [ -r $MBRFILE ]; then
1574        LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
1575        dd if=$MBRFILE of=$USBDEVICE
1576    else
1577        LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1578        LogAll "         on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
1579    fi
1580    LogFile "INFO: Preparing $USBDEVICE"
1581    cat > $MINDI_TMP/fdisk.txt << EOF
1582d
1583d
1584d
1585d
1586n
1587p
15881
1589
1590
1591t
1592b
1593a
15941
1595w
1596EOF
1597    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
1598    if [ $? -ne 0 ]; then
1599        LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
1600        LogAll "       Make sure your USB device is plugged in"
1601        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1602        MindiExit -1
1603    fi
1604    LogFile "fdisk build file"
1605    LogFile "----------------"
1606    cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1607    LogFile "----------------"
1608    rm -f $MINDI_TMP/fdisk.txt
1609    LogFile "INFO: The USB device $USBDEVICE now looks like this:"
1610    $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1611    echo -en "."
1612    # Calling kpartx in case devices were not created
1613    if [ -x "/sbin/kpartx" ]; then
1614        /sbin/kpartx -a $USBDEVICE
1615    fi
1616    # Some distro do auto mount at that point (Ubuntu)
1617    LogFile "INFO: Unmounting $USBPART just in case again"
1618    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1619    echo -en "."
1620    # Some distro have a dmsetup conf at that point so removing it Cf: http://trac.mondorescue.org/ticket/651
1621    if [ "`which dmsetup`" != "" ]; then
1622        block_id="`echo $USBPART | sed 's|/dev/||g'`"
1623        if [[ "`dmsetup ls | awk '{print $1}' | grep $block_id`" != "" ]]; then
1624            LogFile "INFO: Removing $block_id from device mapper."
1625            sleep 1
1626            dmsetup remove $block_id
1627        fi
1628    fi
1629    echo -en "."
1630    LogFile "INFO: Creating a vfat filesystem on $USBPART"
1631    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1632    if [ $? -ne 0 ]; then
1633        LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
1634        LogAll "       Make sure your USB device is plugged in and partitioned ($USBPART must exist on it)"
1635        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1636        MindiExit -1
1637    fi
1638    echo -en "."
1639    LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
1640    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1641    if [ $? -ne 0 ]; then
1642        LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
1643        LogAll "       Make sure your USB device is plugged in, partitioned and formated ($USBPART must exist on it)"
1644        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1645        MindiExit -1
1646    fi
1647    echo -en "."
1648    mkdir -p $MINDI_TMP/usb/images
1649    cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogAll "ERROR: OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1650    echo -en "."
1651    LogFile "INFO: mindi_lib = $MINDI_LIB"
1652    for i in memdisk memtest.bin memtest.img ; do
1653        j=$MINDI_LIB/$i
1654        k=$MINDI_TMP/usb
1655        if [ -e "$j" ] ; then
1656            LogIt "INFO: Copying $j to $k"
1657            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1658            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1659        fi
1660    done
1661    echo -en "."
1662    MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
1663    echo -en "."
1664    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?"
1665    echo -en "."
1666    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1667    echo -en "."
1668    MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1669    echo -en "."
1670    LogAll "----------- syslinux's conf --------------"
1671    cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1672    LogAll "------------------------------------------"
1673    umount $MINDI_TMP/usb
1674    if [ "$ARCH" != "ia64" ] ; then
1675        syslinux -v 2>&1 | grep -q 4.02
1676        if [ $? -eq 0 ]; then
1677            # This buggy version of syslinux requires a call to --stupid and not -s
1678            syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1679            res=$?
1680        else
1681            syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1682            res=$?
1683        fi
1684        if [ $res -ne 0 ] ; then
1685            LogAll "----------- syslinux's errors --------------"
1686            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1687            LogAll "------------------------------------------"
1688            LogIt "ERROR: Failed to create USB image."
1689        else
1690            echo -e "$DONE"
1691            LogFile "INFO: Created bootable USB image on $USBDEVICE"
1692        fi
1693        rm -f $MINDI_TMP/syslinux.log
1694    else
1695        LogAll "ERROR: No USB boot support for ia64"
1696        MindiExit -1
1697    fi
1698}
1699
1700
1701MakeMessageFile() {
1702   
1703    if [ -x "/bin/lsb_release" ]; then
1704        DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1705    elif [ -r /etc/arch-release ]; then  # this code must be written before /etc/issue test to avoid errors                             
1706        DESC="Arch Linux"                                                                                                           
1707        if [ -r /var/log/pacman.log ]; then                                                                                         
1708            # there are no releases but we can get the last system upgrade                                                     
1709            # Output example:   Arch Linux [2011-03-03 01:39]                                                                   
1710            DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"                           
1711        fi
1712    elif [ -r /etc/issue.net ]; then
1713        DESC=`head -1 /etc/issue.net`
1714    elif [ -r /etc/issue ]; then
1715        DESC=`head -1 /etc/issue`
1716    elif [ -x "/usr/bin/pbdistrocheck" ]; then
1717        # For pb >= 0.9.8
1718        DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
1719    else
1720        DESC="Unknown desc"
1721    fi
1722    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/"
1723    if [ _"$MONDO_SHARE" != _"" ]; then
1724        if [ "$CDRECOVERY" != "yes" ] ; then
1725            if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1726                echo -en "Press <enter> to continue.\n"
1727            elif [ ! "$MINDI_TMP" ] ; then
1728                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1729                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1730                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1731                fi
1732            else
1733                echo -en "$BOOT_MEDIA_MESSAGE"
1734            fi
1735        else
1736            echo -en "\
1737To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1738CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1739        fi
1740    fi
1741    echo -en "\n\n\n"
1742}
1743
1744
1745MakeBootConfFile() {
1746    local options i ooo
1747    options=""
1748    # Type of boot file (elilo or syslinux/isolinux)
1749    type=$1
1750    if [ "$type" = "elilo" ]; then
1751        sep="="
1752    else
1753        sep=" "
1754    fi
1755
1756    # Generic header for conf file
1757    if [ "$type" != "elilo" ] ; then
1758        echo -en "prompt 1\ndisplay message.txt\n"
1759    else
1760        echo -en "prompt\n"
1761    fi
1762
1763    # Compute which default option to boot from
1764    if [ "$CDRECOVERY" = "yes" ] ; then
1765        echo -en "default${sep}RESTORE\n"
1766    # In case it's mondoarchive
1767    elif [ _"$MONDO_SHARE" != _"" ]; then
1768        if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1769            echo -en "default${sep}iso\n"
1770        else
1771            echo -en "default${sep}${MINDI_DEFAULT_BOOT_OPTION}\n"
1772        fi
1773    else
1774        echo -en "default${sep}expert\n"
1775    fi
1776
1777    # Handle timeout
1778    if [ "$CDRECOVERY" != "yes" ] ; then
1779        echo -en "timeout${sep}${MINDI_BOOT_TIMEOUT}\n"
1780    else
1781        echo -en "timeout${sep}10000\n"
1782    fi
1783    echo -en "\n"
1784
1785    # prepare which labels will be generated
1786    if [ "$CDRECOVERY" = "yes" ] ; then
1787        options="RESTORE expert"
1788    else
1789        if [ _"$MONDO_SHARE" != _"" ]; then
1790            options="interactive expert compare iso nuke isonuke"
1791        else
1792            options="expert"
1793        fi
1794    fi
1795
1796    # Generate rest of conf file
1797    for i in $options ; do
1798        ooo=$i
1799        [ "$ooo" = "RESTORE" ] && ooo="RESTORE nuke"
1800        if [ "$type" = "elilo" ]; then
1801            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"
1802        else
1803            ps="/"
1804            if [ "$type" = "syslinux" ]; then
1805                ps=""
1806            fi
1807            if [ $KERNEL_IS_XEN = "no" ]; then
1808                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"
1809            else
1810                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"
1811            fi
1812        fi
1813        echo -en "$outstr"
1814    done
1815    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1816        if [ "$type" = "elilo" ]; then
1817            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1818            echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1819        else
1820            ps="/"
1821            if [ "$type" = "syslinux" ]; then
1822                ps=""
1823            fi
1824            echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1825            echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1826        fi
1827    fi
1828}
1829
1830
1831PrepareBootDiskImage_LILO() {
1832    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1833    imagesdir=$MINDI_CACHE
1834    kernelpath=$1
1835
1836    retval=0
1837
1838    [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
1839    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1840    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?"
1841    echo -en "..."
1842    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1843    mountpoint=$MINDI_TMP/mountpoint.$$
1844    mkdir -p $mountpoint
1845    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1846    LogFile "Creating vfat filesystem on $imagefile" 
1847    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1848    mount -t vfat -o loop $imagefile $mountpoint || LogAll "ERROR: Cannot mount (PBDI)"
1849
1850    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1851    mkdir -p $mountpoint/etc
1852    liloconf=$mountpoint/elilo.conf
1853
1854    MakeBootConfFile elilo > $liloconf
1855
1856    # Copy it so that CD-ROM menu entry is satisfied
1857    mountefi=0
1858    df -T | grep /boot/efi | grep -q vfat
1859    if [ $? -ne 0 ]; then
1860        mount /boot/efi
1861        if [ $? -ne 0 ]; then
1862            echo "You have to mount your EFI partition when using mindi"
1863            MindiExit -1
1864        fi
1865        mountefi=1
1866    fi
1867    el=`find /boot/efi -name elilo.efi`
1868    cp $el $mountpoint
1869    cp $liloconf $mountpoint
1870    if [ $mountefi -eq 1 ]; then
1871        umount /boot/efi 2>&1 > /dev/null
1872    fi
1873
1874    LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
1875    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1876    if [ "$?" -ne "0" ] ; then
1877        LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1878        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1879        LogIt "       Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1880        rm -f $MINDI_TMP/mtpt.$$
1881        LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1882        retval=$(($retval+1))
1883    fi
1884    MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1885
1886    mkdir -p $mountpoint/tmp
1887    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1888        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1889    fi
1890
1891    # copy the kernel across
1892    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1893    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1894    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1895    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1896    if [ "$?" -ne "0" ] ; then
1897        LogFile "INFO: Files at mountpoint ($mountpoint) :"
1898        du -sk $mountpoint/* >> $LOGFILE
1899        LogFile "--- end of list of files ---"
1900        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1901        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1902        cd "$old_pwd"
1903        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1904        rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1905    #   losetup /dev/loop0 -d
1906        [ "$imagefile" != "" ] && rm -f $imagefile
1907        LogIt "ERROR: Sorry, your kernel is too big for your image"
1908        Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1909        return 0
1910    fi
1911    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1912    LogFile "INFO: Free space left on image = $free_space KB"
1913    LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1914    # make it bootable
1915    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1916    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1917    if [ "$KERN_DISK_MADE" ] ; then
1918        LogFile "INFO: Not running LILO. It's not that kind of disk."
1919    fi
1920
1921    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1922    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1923    echo -en "..."
1924    rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1925    if [ "$retval" -eq "0" ] ; then
1926        echo -en "...$DONE\n"
1927        if [ "$KERN_DISK_MADE" ] ; then
1928            LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
1929        fi
1930    else
1931        echo -en "...failed\n"
1932        LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
1933        [ "$imagefile" != "" ] && rm -f $imagefile
1934    fi
1935    [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
1936    return $retval
1937}
1938
1939
1940PrepareBootDiskImage_ISOLINUX() {
1941    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1942    imagesdir=$MINDI_CACHE
1943    kernelpath=$1
1944    do_boot_root_thingy=""
1945    local retval old_pwd
1946    retval=0
1947
1948    [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
1949    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1950    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?"
1951    echo -en "..."
1952    imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1953    mountpoint=$MINDI_TMP/mountpoint.$$
1954    mkdir -p $mountpoint
1955    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1956    LogFile "INFO: Creating vfat filesystem on $imagefile"
1957    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1958    # syslinux should be run on a  local file (doen't work through NFS Cf: #297)
1959    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1960
1961    # Only move it now to its final destination and use it now
1962    mv $imagefile $imagesdir
1963    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1964
1965    mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1966
1967    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1968    MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1969    MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1970    LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1971    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1972    if [ "$?" -ne "0" ] ; then
1973        LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1974        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1975        LogAll "       Please unload some of your modules and try again."
1976        rm -f $MINDI_TMP/mtpt.$$
1977        LogAll "       Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1978        LogAll "       Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1979        retval=$(($retval+1))
1980    fi
1981
1982    mkdir -p $mountpoint/tmp
1983    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1984        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1985    fi
1986
1987    # copy the kernel across
1988    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1989    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1990    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1991         
1992    retval=0
1993    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1994    retval=$?
1995    if [ $KERNEL_IS_XEN = "yes" ]; then
1996        cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
1997        let retval+=$?
1998    fi
1999 
2000    if [ "$retval" -ne "0" ] ; then
2001        LogFile "INFO: Files at mountpoint ($mountpoint) :"
2002        du -sk $mountpoint/* >> $LOGFILE
2003        LogFile "--- end of list of files ---"
2004        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
2005        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
2006        cd "$old_pwd"
2007        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2008        rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
2009
2010        LogIt "ERROR: Sorry, your kernel is too big for your image"
2011        Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
2012    fi
2013    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2014    LogFile "INFO: Free space left on image = $free_space KB"
2015    LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
2016
2017    # make it bootable
2018    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
2019    mkdir -p $mountpoint/etc
2020    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2021    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2022    echo -en "..."
2023    rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
2024
2025    if [ "$retval" -eq "0" ] ; then
2026        echo -en "...$DONE\n"
2027        if [ "$KERN_DISK_MADE" ] ; then
2028            [ "$imagefile" != "" ] && rm -f $imagefile
2029            LogAll "INFO: $BOOT_SIZE KB boot disks were created OK\n"
2030        fi
2031    else
2032        echo -en "...failed\n"
2033        LogAll "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
2034        [ "$imagefile" != "" ] && rm -f $imagefile
2035    fi
2036    [ "$retval" -ne "0" ] && LogAll "ERROR: PrepareBootDiskImage() is returning nonzero"
2037    return $retval
2038}
2039
2040
2041ParseModprobeForIncludes() {
2042local MODPROBE_CONF mpincfile includes include
2043
2044MODPROBE_CONF=/etc/modprobe.conf
2045mpincfile=$1
2046touch $mpincfile
2047if [ -a $MODPROBE_CONF ]; then
2048    includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
2049    if [ -n "$includes" ]; then
2050        for include in $includes
2051        do
2052            if [ -a "$include" ]; then
2053                echo $include >> $mpincfile
2054            fi
2055        done
2056    fi
2057fi
2058}
2059
2060
2061PrepareDataDiskImages() {
2062    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
2063
2064    imagesdir=$MINDI_CACHE
2065    rm -f $imagesdir/mindi.iso
2066    needlist=$MINDI_TMP/what-we-need.txt
2067    bigdir=$MINDI_TMP/bigdir
2068    mkdir -p $bigdir/usr/bin
2069    mkdir -p $bigdir/usr/sbin
2070    includefile=$MINDI_TMP/$$.includefile.txt
2071
2072    lfiles=`ls $DEPLIST_DIR/* | grep -v /minimal`
2073    if [ -e "$DEPLIST_FILE" ]; then
2074        lfiles="$DEPLIST_FILE $lfiles"
2075    fi
2076    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
2077    ParseModprobeForIncludes $includefile
2078    lines=$(($lines+`cat $includefile | wc -l`))
2079    cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
2080    res=$?
2081    rm -f $includefile
2082    if [ "$YOUR_KERNEL_SUCKS" ]; then
2083        pwd=`pwd`
2084        cd "$MINDI_TMP"
2085        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2086            tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
2087        done
2088        for i in $EXTRA_MODS ; do
2089            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2090            [ ! "$j" ] && LogFile "WARNING: cannot find failsafe module $i.o.gz"
2091            for k in $j ; do
2092                tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2093                LogFile "INFO: Added failsafe module $k to ramdisk"
2094            done
2095        done
2096        cd "$pwd"
2097    else
2098        ListKernelModulePaths >> $needlist
2099    fi
2100    if [ "$res" -ne "0" ] ; then
2101        Die "You have $res files present in dependency list\nbut absent from filesystem."
2102    fi
2103    FindAndAddUserKeyboardMappingFile
2104    mkdir -p $bigdir/tmp
2105    if [ _"$MONDO_SHARE" != _"" ]; then
2106        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2107        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2108    fi
2109    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2110    DropOptimizedLibraries $needlist $bigdir
2111    echo -en "Assembling dependency files"
2112
2113    CopyDependenciesToDirectory < $needlist $bigdir `wc -l $needlist`
2114
2115    # also copy io.sys and msdos.sys, if we can find them
2116    for i in `mount | cut -d' ' -f3` ; do
2117        for j in io.sys msdos.sys ; do
2118            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2119        done
2120    done
2121
2122    # master boot record, too
2123    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2124    if [ "$i" ] ; then
2125        LogAll "INFO: Backing up $i's MBR"
2126        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2127        sleep 1
2128        sync
2129        j=$i
2130        [ -h "$j" ] && j=`readlink -f $j`
2131        LogAll "INFO: Creating /dev/boot_device ($j)"
2132        mkdir -p $bigdir/dev
2133        cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
2134    fi
2135
2136    old_pwd=`pwd`
2137    cd "$bigdir"
2138
2139    # Get terminfo content
2140    ti="usr/share/terminfo/l"
2141    if [ -d /$ti ]; then
2142        mkdir -p $ti
2143        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "ERROR: issue copying terminfo"
2144    fi
2145    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
2146        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2147        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2148    fi
2149    if [ -d "/lib/dev-state" ]; then 
2150        tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2151    fi
2152    cd "$old_pwd"
2153    echo -e "$DONE"
2154    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2155    MakeMountlist $MINDI_TMP/mountlist.txt
2156    CheckMountlist $MINDI_TMP/mountlist.txt
2157    mkdir -p $bigdir/tmp
2158    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
2159    if [ _"$MONDO_SHARE" != _"" ]; then
2160        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2161    fi
2162    if [ $LVM != "false" ]; then
2163        $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2164        if [ "$?" -ne "0" ]; then
2165            LVM="false"
2166            rm -f $bigdir/tmp/i-want-my-lvm
2167        else
2168            LogFile "Your i-want-my-lvm file content is:"
2169            LogFile "-----------------------------------"
2170            cat  $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2171            LogFile "-----------------------------------"
2172        fi
2173    fi
2174    LogFile "Your mountlist.txt file content is:"
2175    LogFile "-----------------------------------"
2176    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2177    LogFile "-----------------------------------"
2178
2179    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2180    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2181    if [ _"$MONDO_SHARE" != _"" ]; then
2182        for q in filelist.full.gz biggielist.txt ; do
2183            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2184            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2185        done
2186    fi
2187
2188    echo -en "Tarring and zipping the data content..."
2189    size_of_all_tools=`du -sk $bigdir | cut -f1`
2190    (cd "$bigdir" ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogAll "ERROR: Problem creating all.tar.gz" $MINDI_TMP/$$.log)
2191    LogFile "Size of the data content"
2192    LogFile "------------------------"
2193    du -sk $imagesdir/*gz >> $LOGFILE
2194    LogFile "------------------------"
2195    echo -e "$DONE"
2196
2197    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2198    rm -rf $bigdir
2199    rm -f $needlist
2200}
2201
2202
2203ProcessLDD() {
2204    local incoming f d nd bd bnd
2205    read incoming
2206    while [ "$incoming" != "" ]; do
2207        # We take the full path name of the dyn. lib. we want
2208        incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2209        for f in $incoming ; do
2210            # echo modified file name if one of the parent dir is a link
2211            # by replacing the original dirname by the destination of the link
2212            d="`dirname $f`"
2213            found="false"
2214            while [ "$d" != "/" ]; do
2215                if [ -h "$d" ]; then
2216                    nd=`readlink -f $d`
2217                    bd=`basename $d`
2218                    bnd=`basename $nd`
2219                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2220                    echo $d
2221                fi
2222                d="`dirname $d`"
2223            done
2224
2225            echo "$f"
2226            echo "`ReadAllLink $f`"
2227        done
2228        read incoming
2229    done
2230}
2231
2232
2233Prompt() {
2234    echo -en "$1"
2235    read line
2236}
2237
2238
2239ReadLine() {
2240    local i incoming
2241    read incoming
2242    i=0
2243    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2244        i=$(($i+1))
2245        read incoming
2246    done
2247    echo "$incoming"
2248}
2249
2250
2251SizeOfPartition() {
2252    local devpath drive res stub
2253    device=$1
2254    if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2255        Die "Cannot find $device's size - is your /etc/fstab sane?"
2256    fi
2257    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2258        res=`SizeOfRaidPartition $device`
2259        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2260        echo "$res"
2261        return 0
2262    fi
2263    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2264    res=`$FDISK -s $device 2>> $LOGFILE`
2265    # end patch
2266    # take only the first in case of multiple mount (cifs, nfs, ...)
2267    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2268    [ "$res" = "" ] && res="-1"
2269    echo $res
2270    return 0
2271}
2272
2273
2274SizeOfRaidPartition() {
2275    local real_dev smallest_size silly tmp
2276
2277    silly=999999999
2278    smallest_size=$silly
2279
2280    for real_dev in `GetRaidDevMembers $1` ; do
2281        tmp=`SizeOfPartition $real_dev`
2282        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2283    done
2284
2285    if [ "$smallest_size" = "$silly" ] ; then
2286        echo "-1"
2287        return 1
2288    else
2289        echo "$smallest_size"
2290        return 0
2291    fi
2292}
2293
2294
2295StripExecutable()
2296{
2297    local tmpfile
2298
2299    tmpfile=$MINDI_TMP/stripped.$$.dat
2300    [ -d "$1" ] || [ -h "$1" ] && return
2301    cp -f $1 $tmpfile 2>> $LOGFILE
2302    strip $tmpfile 2> /dev/null
2303    if [ "$?" -eq "0" ] ; then
2304        cp -f $tmpfile $1 2>> $LOGFILE
2305        LogFile "INFO: Stripped binary $2"
2306    fi
2307    rm -f $tmpfile
2308}
2309
2310KernelVer() {
2311        local fkern_ver fname
2312
2313        fname=$1
2314        file $fname | grep -q gzip
2315        if [ "$?" -eq "0" ] ; then
2316            # Used by ia64
2317            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2318        else
2319            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2320        fi
2321        echo "$fkern_ver"
2322}
2323
2324
2325# WARNING: This function should just echo the final result !!!
2326#
2327TryToFindKernelPath() {
2328    local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
2329
2330    we_want_version=$KERVERRUN
2331    possible_kernels=""
2332    duff_kernels=""
2333    output=""
2334   
2335    if [ "$ARCH" = "ia64" ] ; then
2336       root="/boot/efi/efi"
2337    else
2338       root="/"
2339    fi
2340    # See if we're booted from a Xen kernel
2341    # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2342    if [ -f /proc/xen/capabilities ]; then
2343        # It's a Xen kernel
2344        KERNEL_IS_XEN="yes"
2345        LogFile "INFO: It's a Xen kernel..."
2346    fi
2347
2348    for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/|^/mnt|^/lib|^/lib64|^/bin|^/sbin|^/usr|^/tmp'` ; do
2349        [ ! -e "$fname" ] && continue
2350        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2351        fkern_ver=`KernelVer $fname`
2352        [ "$fkern_ver" = "" ] && continue
2353        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2354        [ -f "$fname" ] || continue
2355        [ -h "$fname" ] && continue
2356        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2357        file $fname | grep -q gzip
2358        if [ "$?" -eq "0" ] ; then
2359            # Used by ia64
2360            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2361                LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2362                duff_kernels="$fname $duff_kernels"
2363            else
2364                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2365                possible_kernels="$fname $possible_kernels"
2366            fi
2367        else
2368            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2369                LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2370                duff_kernels="$fname $duff_kernels"
2371            else
2372                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2373                possible_kernels="$fname $possible_kernels"
2374            fi
2375        fi
2376    done
2377    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2378        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2379    fi
2380    if [ ! "$possible_kernels" ] ; then
2381        LogAll "INFO: No kernel matches exactly. Are there any duff kernels?"
2382        possible_kernels="$duff_kernels"
2383        if [ ! "$possible_kernels" ] ; then
2384            LogAll "INFO: Sorry, no duff kernels either"
2385        else
2386            LogAll "INFO: I bet you're running Debian or Gentoo, aren't you?"
2387            LogAll "INFO: Your kernel doesn't have a sane builddate. Oh well..."
2388        fi
2389    fi
2390    if [ $KERNEL_IS_XEN = "yes" ]; then
2391        possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2392        noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2393        FindMboot32Binary
2394    fi
2395    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2396    noof_kernels=`CountItemsIn "$possible_kernels"`
2397    if [ "$noof_kernels" -eq "0" ] ; then
2398        LogAll "Could not find your kernel."
2399        if [ -e "/boot/vmlinuz" ] ; then
2400            LogAll "INFO: Using /boot/vmlinuz as a last resort."
2401            output=/boot/vmlinuz
2402        else
2403            output=""
2404        fi
2405    elif [ "$noof_kernels" -eq "1" ] ; then
2406        kp=`echo "$possible_kernels" | sed s/' '//`
2407        LogFile "INFO: Your kernel is $kp (v$KERVERRUN)"
2408        output="$kp"
2409    else
2410        for i in $possible_kernels ; do
2411            if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2412                LogAll "INFO: OK, I used my initiative and found that "
2413                LogAll "INFO: $i is probably your kernel. "
2414                output="$i"
2415                break
2416            fi
2417        done
2418        if [ ! -n "$output" ]; then
2419            if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
2420                output=/boot/vmlinuz
2421                LogFile "INFO: Schlomo, this one's for you."
2422            else
2423                LogFile "INFO: Two or more possible kernels found. You may specify any one of them and the "
2424                LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2425                LogFile "INFO: $possible_kernels"
2426                output=""
2427            fi
2428        fi
2429    fi
2430    if [ $KERNEL_IS_XEN = "yes" ]; then
2431        if [ "$noof_xenkernels" -eq "0" ]; then
2432            xenkernelpath=""
2433        elif [ "$noof_xenkernels" -eq "1" ]; then
2434            xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
2435            LogFile "INFO: Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
2436        else
2437            for i in $possible_xenkernels ; do
2438                if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2439                    LogFile "INFO: OK, I used my initiative and found that "
2440                    LogFile "INFO: $i is probably your Xen kernel. "
2441                    xenkernelpath="$i"
2442                    break
2443                fi
2444            done
2445            if [ ! -n "$xenkernelpath" ]; then
2446                new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2447                if [ ! -n "$new_possible_xenkernels" ]; then
2448                    xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
2449                    LogFile "INFO: Using $xenkernelpath"
2450                else
2451                    LogFile "INFO: Two or more possible Xen kernels found. You may specify any one of them and the "
2452                    LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2453                    LogFile "INFO: $possible_xenkernels"
2454                    output=""
2455                    xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
2456                    LogFile "INFO: Using $xenkernelpath"
2457                fi
2458            fi
2459        fi
2460        if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2461            Die "Cannot find Xen kernel $xenkernelpath, aborting"
2462        fi
2463    fi
2464    LogAll "TryToFindKernelPath found $output"
2465    echo "$output"
2466}
2467
2468
2469TurnTgzIntoRdz() {
2470    local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2471
2472    tgz_dir_fname=$1
2473    rdz_fname=$2
2474    kernelsize=$3
2475    maxsize=$(($BOOT_SIZE-$kernelsize))
2476    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2477    tempfile=$MINDI_TMP/temp.rd
2478    mountpoint=$MINDI_TMP/mnt1
2479    res=0
2480    echo -en "..."
2481    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2482    echo -en "..."
2483    LogFile "INFO: Creating ext2 filesystem on $tempfile"
2484    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2485    echo -en "..."
2486    mkdir -p $mountpoint
2487    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."
2488    echo -en "..."
2489    old_pwd=`pwd`
2490    cd "$mountpoint"
2491
2492    # AL04Oct08: Check whether /lib64 or /lib is a link and if so explicitly create one in rootfs
2493    if [ -h "/lib64" ]; then
2494        mkdir -p lib || LogIt "ERROR: Unable to create lib in $mountpoint."
2495        ln -s lib lib64 || LogIt "ERROR: /lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2496    fi
2497    if [ -h "/lib" ]; then
2498        mkdir -p usr/lib || LogIt "ERROR: Unable to create usr/lib in $mountpoint."
2499        mv lib/* usr/lib
2500        rmdir lib
2501    fi
2502    # Check whether /sbin and /bin are a link and if so explicitly create one in rootfs (Fedora 17 crazyness)
2503    if [ -h "/sbin" ]; then
2504        mkdir -p usr/sbin || LogIt "ERROR: Unable to create usr/sbin in $mountpoint."
2505        mv sbin/* usr/sbin
2506        rmdir sbin
2507    fi
2508    if [ -h "/bin" ]; then
2509        mkdir -p usr/bin || LogIt "ERROR: Unable to create usr/bin in $mountpoint."
2510        mv bin/* usr/bin
2511        rmdir bin
2512    fi
2513
2514    # Check files before copying to discover configuration issues or McAfee preventing mindi reading these files
2515    for f in $tgz_dir_fname/*; do 
2516        if [ ! -r $f ]; then
2517            Die "ERROR: Unable to copy $f to the target dir. Check your installation or McAfee presence"
2518        else
2519            cp -Rdf $f . 2>&1 >> $LOGFILE
2520        fi
2521    done
2522    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2523
2524    cd dev || Die "Can't cd to dev"
2525    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2526    rm -f dev-entries.tgz
2527    cd ..
2528
2529    for w in insmod.static insmod.static.old ; do
2530        s=`which $w 2> /dev/null`
2531        if [ -e "$s" ] ; then
2532            tar cf - -C / $s 2> /dev/null | tar xf -
2533        fi
2534    done
2535
2536    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2537   
2538    # Copy of files mandatory for ssh to automate mount if sshfs is used
2539    mkdir $mountpoint/.ssh
2540    cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
2541    echo > $mountpoint/tmp/myssh << EOF
2542ssh -o StrictHostKeyChecking=no $*
2543EOF
2544    chmod 755 $mountpoint/tmp/myssh
2545
2546    # Copy of files mandatory for ld.so
2547    cp -rp /etc/ld.so.c* $mountpoint/etc
2548
2549    # Handle the case where busybox and mount are dynamically linked
2550    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2551    if [ $? -eq 0 ]; then
2552        # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2553        rm -f bin/mount
2554    fi
2555
2556    # Copy of files from the minimal env needed as per the deplist.d/minimal.conf file (which includes all busybox deps)
2557    rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2558    for f in `grep -v " *#.*" $DEPLIST_DIR/minimal.conf | sort -u`; do
2559        if [ -r $f ]; then
2560            echo $f >> $MINDI_TMP/minimal.lis
2561            LocateDeps $f >> $MINDI_TMP/minimal2.lis
2562        fi
2563    done
2564    for f in `cat $MINDI_TMP/minimal.lis` `sort -u $MINDI_TMP/minimal2.lis`; do
2565        ReadAllLink $f >> $MINDI_TMP/minimal.lis
2566    done
2567    # Initial / are trucated by tar
2568    finallist=""
2569    # Remove directories from the list, as tar will create them anyway
2570    # and it may hurt if /lib is in it as on Debian/Ubuntu
2571    for f in `sort -u $MINDI_TMP/minimal.lis`; do
2572        if [ ! -d $f ]; then
2573            finallist="$finallist $f"
2574        fi
2575    done
2576    tar cf - $finallist 2>> $MINDI_TMP/$$.log | tar xUf - || LogIt "WARNING: Problem in minimal analysis" $MINDI_TMP/$$.log
2577
2578    # To improve support for distribution scripts, we now prefer to use bash as the std shell. Also fixes #600
2579    ln -sf /bin/bash bin/sh
2580    LogIt "INFO: Using bash as default shell"
2581    rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2582
2583    # Avoids an issue on some distro (RHEL5)
2584    rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2585
2586    mkdir -p $mountpoint/tmp
2587    # Management of udev (which includes modprobe in rules)
2588    ps auxww | grep -v grep | grep -qw udevd
2589    if [ $? -eq 0 ]; then
2590        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2591        LogIt "INFO: udev device manager found"
2592        tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2593        # This avoids NIC remapping if on another machine at restore time on Debian at least
2594        rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2595        # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2596        rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2597        # Do not do it if it's a link (Ubuntu 64 bits #503)
2598        if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [  ! -h "/lib64/udev" ]; then
2599            tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
2600        fi
2601        if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [  ! -h "/lib32/udev" ]; then
2602            tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
2603        fi
2604        if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [  ! -h "/lib/udev" ]; then
2605            tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2606        fi
2607        if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
2608            lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
2609            lis=""
2610            # Get only the files which exist in that list
2611            # and potentially their symlink structure
2612            for i in $lis2; do
2613                if [ -h $i ]; then
2614                    j=$i
2615                    while [ -h $j ]; do
2616                        lis="$lis $j"
2617                        j=`readlink $j`
2618                    done
2619                    lis="$lis $j"
2620                elif [ -f $i ]; then
2621                    lis="$lis $i"
2622                fi
2623            done
2624            # And their deps
2625            LocateDeps $lis > $MINDI_TMP/udev.lis
2626            for i in $lis; do
2627                if [ "`echo $i | cut -c1`" = "/" ]; then
2628                    j=`echo $i | cut -c2-`
2629                    [ "$j" != "" ] && rm -f $j
2630                fi
2631            done
2632            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
2633            rm -f $MINDI_TMP/udev.lis
2634        else
2635            LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
2636            LogAll "         mindi will use static devices which may cause problems"
2637            rm -f $mountpoint/tmp/USE-UDEV
2638        fi
2639    fi
2640
2641    # Management of potential HW info (ProLiant only at the moment)
2642    rm -rf $MINDI_CACHE/bkphw
2643    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2644    if [ -d $MINDI_CACHE/bkphw ]; then
2645        LogIt "INFO: Hardware Information found and saved ..."
2646        cp -rp $MINDI_CACHE/bkphw .
2647        if [ -f $MINDI_CACHE/tools.files ]; then
2648            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2649            LocateDeps $lis > $MINDI_TMP/tools.lis
2650            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
2651        fi
2652        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2653            mv -f $MINDI_CACHE/mindi-rsthw .
2654            chmod 755 ./mindi-rsthw
2655        fi
2656        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2657    fi
2658
2659    # Management of perl scripts delivered needed at restore time
2660    mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2661    tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
2662
2663    for w in cdrom groovy-stuff ; do
2664        mkdir -p mnt/$w
2665    done
2666
2667    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
2668
2669    cd "$old_pwd"
2670    echo -en "..."
2671    old_pwd=`pwd`
2672    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2673        cd "$MINDI_TMP"
2674        needed_modules_path=lib/modules/$FAILSAFE_KVER
2675    else
2676        cd /
2677        if [ "${kernelname}" != "" ]
2678        then
2679            needed_modules_path=lib/modules/${kernelname}
2680        else
2681            needed_modules_path=lib/modules/$KERVERRUN
2682        fi
2683    fi
2684
2685    needed_modules=""
2686    list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2687
2688    if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2689        # For PXE boot
2690        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2691    fi
2692    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2693        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2694    fi
2695    for i in $DENY_MODS; do
2696        LogFile "INFO: Removing $i from the list of modules to load"
2697        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2698    done
2699
2700    [ -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."
2701    for i in $list_of_groovy_mods ; do
2702        needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2703    done
2704
2705    for i in `echo $needed_modules  | tr ' ' '\n' | sort -u`; do
2706        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2707        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2708        LogFile "INFO: Adding $i ($s KB) to the rootfs"
2709        tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2710        # Uncompress modules if not using udev and native modprobe
2711        if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2712            if [ "`echo "$i" | grep -F ".gz"`" ]; then
2713                LogFile "INFO: Uncompressing $i"
2714                gunzip -f $mountpoint/$i
2715            fi
2716        fi
2717        if [ -L $mountpoint/$i ] && [ `echo "$i" | grep "\.ko$"` ]; then
2718            echo "Replacing module symlink ($i) with actual file"
2719            rm -f $mountpoint/$i
2720            cp -Lf $i $mountpoint/$i
2721            ls -l $mountpoint/$i
2722        fi
2723    done
2724
2725    # Also copy modules.* in case of udev so that normal modprobe works
2726    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
2727
2728    # Copy FW in case some drivers needs it
2729    if [ -d "/lib/firmware" ]; then
2730        cp -rp /lib/firmware $mountpoint/lib
2731    fi
2732
2733    # Copy an additional ProLiant tool for OBDR support
2734    if [ -f $MINDI_TMP/OBDR ]; then
2735        found=0
2736        if [ -x /usr/bin/hpsa_obdr_mode ]; then
2737            mkdir -p $mountpoint/usr/bin
2738            cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
2739            LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved Smart Array OBDR support"
2740            found=1
2741        fi
2742        if [ -x /usr/bin/sg_wr_mode ]; then
2743            mkdir -p $mountpoint/usr/bin
2744            lis="/usr/bin/sg_map /usr/bin/sg_inq /usr/bin/sg_reset /usr/bin/rev"
2745            LocateDeps $lis > $MINDI_TMP/obdr.lis
2746            (cd $mountpoint ; tar cf - $lis -C /  `sort -u $MINDI_TMP/obdr.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in obdr.lis analysis" $MINDI_TMP/$$.log)
2747            LogIt "INFO: Copying /usr/bin/sg_reset to ramdisk for improved SCSI OBDR support"
2748            found=1
2749        fi
2750        if [ $found -eq 0 ]; then
2751            LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode nor the /usr/bin/sg_wr_mode tool"
2752            LogAll "         This may lead to a tape not going back to sequential mode after OBDR boot"
2753        fi
2754    fi
2755
2756    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2757        LogFile "INFO: Deleting devfsd daemon from ramdisk"
2758        [ ! -e "/sbin/devfsd" ] && LogFile "      ...because /sbin/devfsd not found"
2759        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "      ...because kernel is failsafe"
2760        rm -f $mountpoint/sbin/devfsd
2761    fi
2762    cd "$old_pwd"
2763    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2764    if [ _"$MONDO_SHARE" != _"" ]; then
2765        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2766        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2767        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2768        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2769        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2770        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2771        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2772        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2773        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2774    fi
2775    mkdir -p $mountpoint/proc
2776    LogFile "---------------------------"
2777    LogFile "Content of initial ramdisk:"
2778    LogFile "---------------------------"
2779    (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
2780    LogFile "---------------------------"
2781
2782    # Determine what filesystem to use for initrd image
2783    LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2784    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2785    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2786    if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ] || [ "$gvFileSystem" = "ext4fs" ]; then
2787        # say what will be used
2788        LogFile "INFO: Creating an $gvFileSystem initrd image..."
2789        # kernel expects linuxrc in ext2 filesystem
2790        ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
2791        # unmount loop filesystem and create image file using the standard approach
2792        umount $mountpoint || Die "Cannot unmount $tempfile"
2793        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2794        if [ "$gvFileSystem" = "ext4fs" ] && [ -x "/sbin/tune4fs" ]; then
2795            bs=`/sbin/tune4fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2796        else
2797            bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2798        fi
2799        MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2800        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2801        rm -f ${rdz_fname}.tmp
2802        # log that we are done
2803        LogFile "      ...done."
2804    elif [ "$gvFileSystem" = "initramfs" ]; then
2805        # say what will be used
2806        LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2807        # make sure that cpio is there
2808        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2809        # go into filesystem
2810        cd "$mountpoint"
2811        # kernel expects init in cpio filesystem
2812        ln -sf sbin/init init
2813        # create cpio image file and unmount loop filesystem
2814        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2815        cd "$old_pwd"
2816        umount $mountpoint || Die "Cannot unmount $tempfile"
2817        # log that we are done
2818        LogFile "      ...done."
2819    else
2820        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2821    fi
2822
2823    if [ "$res" -eq "0" ] ; then
2824        echo -en "..."
2825    else
2826        echo -en "\rMade an rdz WITH ERRORS.           \n"
2827    fi
2828    return 0
2829}
2830
2831
2832##############################################################################
2833#----------------------------------- Main -----------------------------------#
2834##############################################################################
2835
2836# Now we can create what we need
2837mkdir -p $MINDI_TMP
2838
2839# Purge from potential old run
2840if [ _"$MINDI_CACHE" = _"" ]; then
2841    Die "MINDI_CACHE undefined"
2842fi
2843
2844# --nolog needs to be first, and is used in analyze-my-lvm
2845if [ "$1" = "--nolog" ] ; then
2846    shift
2847    LOGFILE=/dev/stderr
2848else
2849    > $LOGFILE
2850fi
2851if [ "$1" = "--printvar" ] ; then
2852    shift
2853    if [ _"$1" != _"" ] ; then
2854        set | grep -Ew "^$1" | cut -d= -f2
2855    fi
2856    exit 0
2857fi
2858
2859LogFile "mindi v$MINDI_VERSION"
2860LogFile "$ARCH architecture detected"
2861LogFile "mindi called with the following arguments:"
2862echo "$@">> $LOGFILE
2863LogFile "Start date : `date`"
2864LogFile "-----------------------------"
2865
2866[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && LogAll "/sbin/mkfs.vfat is missing!"
2867
2868# Log some capital variables
2869[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2870[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2871LogFile "MONDO_SHARE = $MONDO_SHARE"
2872LogFile "MINDI_LIB = $MINDI_LIB"
2873LogFile "MINDI_SBIN = $MINDI_SBIN"
2874LogFile "MINDI_CONF = $MINDI_CONF"
2875if [ -f $MINDI_CONFIG ]; then
2876    LogFile "-----------------------------"
2877    LogFile " Mindi configuration file    "
2878    LogFile "-----------------------------"
2879    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2880    LogFile "-----------------------------"
2881fi
2882LogFile "In Mindi"
2883LogFile "--------"
2884LogFile "EXTRA_SPACE = $EXTRA_SPACE"
2885LogFile "BOOT_SIZE = $BOOT_SIZE"
2886LogFile "--------"
2887
2888trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2889
2890# Sanity checks
2891which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2892which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2893which 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."
2894which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2895if which awk &> /dev/null ; then
2896    if ! which gawk &> /dev/null ; then
2897        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"
2898    fi
2899fi
2900which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2901[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2902
2903[ "`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"
2904
2905# Update the PATH variable if incomplete
2906if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2907    PATH=$PATH:/sbin:/usr/sbin
2908    export PATH
2909    LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2910    LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2911    LogFile "INFO:  Or you might like to call 'su -' instead of 'su', for example."
2912fi
2913
2914# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2915if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2916    source $MINDI_LIB/FindDistroFailsafe
2917    # Log kernel image
2918    LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2919else
2920    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2921fi
2922
2923if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2924    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2925fi
2926
2927### TODO
2928### Fix as it's not mandatory on ia64
2929if [ "$ARCH" = "ia64" ] ; then
2930    if which elilo &> /dev/null ; then
2931        LILO_EXE=elilo
2932    else
2933        LILO_EXE=`which false 2> /dev/null`
2934    fi
2935else
2936    FindIsolinuxBinary
2937fi
2938trap "Aborted" SIGTERM
2939DONE="\r\t\t\t\t\t\t\t\tDone.         "
2940kernelpath=""
2941MONDO_ROOT=/var/cache/mondo
2942mkdir -p $MONDO_ROOT
2943
2944if [ -d "/proc/lvm" ]; then
2945    # LVM v1
2946    LVMCMD=""
2947    LVM="v1"
2948elif [ -d "/dev/mapper" ]; then
2949    # LVM v2
2950    LVMCMD="lvm"
2951    LVM="v2"
2952else
2953    LVM="false"
2954fi
2955
2956if [ -e "/proc/cmdline" ]; then
2957    CMDLINE="/proc/cmdline"
2958elif [ -e "/tmp/cmdline" ]; then
2959    CMDLINE="/tmp/cmdline"
2960else
2961    CMDLINE="/dev/null"
2962fi
2963
2964LogFile "INFO: LVM set to $LVM"
2965LogFile "----------"
2966LogFile "mount result:"
2967LogFile "-------------"
2968mount >> $LOGFILE
2969if [ -e /etc/raidtab ]; then
2970    LogFile "-------------"
2971    LogFile "/etc/raidtab content:"
2972    LogFile "-------------"
2973    cat /etc/raidtab >> $LOGFILE
2974else
2975    LogFile "No file /etc/raidtab"
2976fi
2977if [ -e /etc/mdadm.conf ]; then
2978    LogFile "-------------"
2979    LogFile "/etc/mdadm.conf content:"
2980    LogFile "-------------"
2981    cat /etc/mdadm.conf >> $LOGFILE
2982else
2983    LogFile "-------------"
2984    LogFile "No file /etc/mdadm.conf"
2985fi
2986LogFile "-------------"
2987LogFile "cat $CMDLINE"
2988LogFile "-------------"
2989cat $CMDLINE >> $LOGFILE
2990LogFile "-------------"
2991LogFile "cat /proc/swaps:"
2992LogFile "-------------"
2993cat /proc/swaps >> $LOGFILE
2994LogFile "-------------"
2995if [ -e /proc/mdstat ]; then
2996    LogFile "cat /proc/mdstat:"
2997    LogFile "-------------"
2998    cat /proc/mdstat >> $LOGFILE
2999else
3000    LogFile "No pseudo file /proc/mdstat"
3001fi
3002LogFile "-------------"
3003LogFile "cat /proc/partitions:"
3004LogFile "-------------"
3005cat /proc/partitions >> $LOGFILE
3006LogFile "-------------"
3007LogFile "cat /proc/filesystems:"
3008LogFile "-------------"
3009cat /proc/filesystems >> $LOGFILE
3010LogFile "-------------"
3011LogFile "lsmod result:"
3012LogFile "-------------"
3013lsmod >> $LOGFILE
3014MODULES="`cat /proc/modules | $AWK '{print $1}'`"
3015if [ -x /usr/sbin/esxcfg-module ]; then
3016    LogFile "-------------"
3017    LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
3018    LogFile "-------------"
3019    LogFile "VMWare modules"
3020    LogFile "-------------"
3021    /usr/sbin/esxcfg-module -l >> $LOGFILE
3022    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
3023fi
3024LogFile "Liste of extra modules is:" 
3025LogFile "-------------" 
3026LogFile "$EXTRA_MODS" 
3027LogFile "-------------" 
3028LogFile "FORCE_MODS:"
3029LogFile "-------------"
3030LogFile "$FORCE_MODS"
3031LogFile "-------------"
3032LogFile "DENY_MODS:"
3033LogFile "-------------"
3034LogFile "$DENY_MODS"
3035LogFile "-------------"
3036LogFile "df result:"
3037LogFile "----------"
3038df -aT >> $LOGFILE
3039LogFile "-------------"
3040LogFile "df -i result:"
3041LogFile "----------"
3042df -i >> $LOGFILE
3043LogFile "-------------"
3044if [ -r /boot/grub/menu.lst ]; then
3045    LogFile "-------------"
3046    LogFile "INFO: /boot/grub/menu.lst content"
3047    LogFile "-------------"
3048    cat /boot/grub/menu.lst >> $LOGFILE
3049    LogFile "-------------"
3050fi
3051if [ -r /boot/grub/grub.conf ]; then
3052    LogFile "-------------"
3053    LogFile "INFO: /boot/grub/grub.conf content"
3054    LogFile "-------------"
3055    cat /boot/grub/grub.conf >> $LOGFILE
3056    LogFile "-------------"
3057fi
3058if [ -r /boot/grub/grub.cfg ]; then
3059    LogFile "-------------"
3060    LogFile "INFO: /boot/grub/grub.cfg content"
3061    LogFile "-------------"
3062    cat /boot/grub/grub.cfg >> $LOGFILE
3063    LogFile "-------------"
3064fi
3065if [ -r /boot/grub/device.map ]; then
3066    LogFile "-------------"
3067    LogFile "INFO: /boot/grub/device.map content"
3068    LogFile "-------------"
3069    cat /boot/grub/device.map >> $LOGFILE
3070    LogFile "-------------"
3071fi
3072if [ -r /etc/lilo.conf ]; then
3073    LogFile "-------------"
3074    LogFile "INFO: /etc/lilo.conf content"
3075    LogFile "-------------"
3076    cat /etc/lilo.conf >> $LOGFILE
3077fi
3078LogFile "Full fdisk info"
3079LogFile "---------------"
3080$FDISK -l >> $LOGFILE
3081LogFile "----------------"
3082LogFile "List of extra modules is:"
3083LogFile "$EXTRA_MODS"
3084LogFile "-------------"
3085
3086# Compute libata version
3087laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
3088# If libata v2 is used then remove ide-generic as it will perturbate boot
3089if [ "`echo $MODULES | grep libata`" ]; then
3090    if [ "$laver" = "2" ]; then
3091        DENY_MODS="$DENY_MODS ide-generic"
3092        LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
3093        LogFile "-------------"
3094    fi
3095fi
3096
3097# Check for McAfee which disturbs the access to some files (tgz in articular)
3098if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
3099    LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
3100    LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
3101    LogFile "WARNING: You have two options:"
3102    LogFile "WARNING:  - Exclude all directories with special files (check McAfee System Events Log)"
3103    LogFile "WARNING:  - Disable the scanner during the backup"
3104fi
3105
3106# Check for ISO_CMD command
3107if [ ! -x $ISO_CMD ]; then
3108    LogFile "NOTE: No CD image (ISO file) utility found"
3109fi
3110
3111FLOPPY_WAS_MOUNTED=""
3112for mtpt in /media/floppy /mnt/floppy /floppy ; do
3113    if mount | grep -w $mtpt &> /dev/null ; then
3114        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3115        umount $mtpt
3116    fi
3117done
3118
3119#
3120# If we have a USB device we need to store info
3121# and remove it from the parameters line
3122#
3123if [ "$#" -ne "0" ] ; then
3124    if [ "$1" = "--usb" ] ; then
3125        shift
3126        USBDEVICE=$1
3127        if [ _"$USBDEVICE" = _"" ]; then
3128            Die "No USB device specified"
3129        fi
3130        shift
3131    fi
3132fi
3133
3134if [ "$#" -ne "0" ] ; then
3135    if [ "$1" = "--findkernel" ] ; then
3136        resk=`TryToFindKernelPath`
3137        # Avoids logfile content for mondo
3138        export MONDO_SHARE=""
3139        if [ "$resk" = "" ] ; then
3140            if [ $KERNEL_IS_XEN = "yes" ]; then
3141                echo "$xenkernelpath"
3142                LogFile "INFO: xenkernelpath = $xenkernelpath"
3143                MindiExit 0
3144            else
3145                MindiExit -1
3146            fi
3147        else
3148            echo "$resk"
3149            LogFile "INFO: kernelpath = $resk"
3150            MindiExit 0
3151        fi
3152    elif [ "$1" = "--locatedeps" ] ; then
3153        [ ! "$2" ] && Die "Please specify the binary to look at"
3154        LocateDeps $*
3155        # Avoids logfile content for mondo
3156        export MONDO_SHARE=""
3157        MindiExit $?
3158    elif [ "$1" = "--readalllink" ] ; then
3159        [ ! "$2" ] && Die "Please specify the binary to look at"
3160        # Avoids logfile content for mondo
3161        export MONDO_SHARE=""
3162        ReadAllLink $2
3163        MindiExit $?
3164    elif [ "$1" = "--makemessage" ] ; then
3165        MakeMessageFile | cut -c1-80
3166        MindiExit 0
3167    elif [ "$1" = "--makemountlist" ] ; then
3168        [ ! "$2" ] && Die "Please specify the output file"
3169        MakeMountlist $2
3170        CheckMountlist $2
3171        # Avoids logfile content for mondo
3172        export MONDO_SHARE=""
3173        MindiExit $?
3174    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3175        echo "Mindi v$MINDI_VERSION"
3176        # Avoids logfile content for mondo
3177        export MONDO_SHARE=""
3178        MindiExit 0
3179    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3180        MONDO_TMP=$2
3181        # Change MINDI_TMP for the one provided by mondo
3182        # So that it can get back the built files
3183        if [ _"$MONDO_TMP" = _"" ]; then
3184            Die "MONDO_TMP is empty, aborting"
3185        fi
3186        if [ _"$MONDO_TMP" = _"/" ]; then
3187            Die "MONDO_TMP is /, aborting"
3188        fi
3189        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
3190        rmdir $MINDI_TMP
3191        export MINDI_TMP=$MONDO_TMP
3192        mkdir -p $MINDI_TMP
3193
3194        # This is the scratch dir in mondo - subdir images
3195        MINDI_CACHE=$3
3196
3197        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3198        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3199       
3200###
3201### Sq-Modification...
3202### Attempt to locate kernel specific module path
3203### if module path is found then use it other wise use uname -r to set it...
3204###
3205        if [ $KERNEL_IS_XEN = "yes" ]; then
3206            LogAll "INFO: xenkernelpath = $xenkernelpath"
3207        fi
3208        kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
3209        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3210        then
3211           LogAll "WARNING: Module path for ${kernelpath} not found..."
3212           LogAll "         using running kernel\'s modules."
3213           kernelname=$KERVERRUN
3214        else
3215           LogAll "Using modules for kernel: ${kernelname}"
3216        fi
3217        LogAll "INFO: kernelname = $kernelname"
3218        LogAll "INFO: kernelpath = $kernelpath"
3219###
3220### end of Sq-Modification
3221###
3222        TAPEDEV=$5
3223        TAPESIZE=$6
3224        FILES_IN_FILELIST=$7
3225        USE_LZO=$8
3226        CDRECOVERY=$9
3227        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3228            IMAGE_DEVS=""
3229        else
3230            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3231        fi
3232        if [ "${11}" ] ; then
3233            LILO_OPTIONS=""
3234    #       LogAll "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
3235        fi
3236        LAST_FILELIST_NUMBER=${12}
3237        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3238        export MINDI_EXCLUDE_DEVS="${14}"
3239        USE_COMP="${15}"
3240        USE_LILO="${16}"
3241        USE_STAR="${17}"
3242        INTERNAL_TAPE_BLOCK_SIZE="${18}"
3243        DIFFERENTIAL="${19}"
3244        USE_GZIP="${20}"
3245        NOT_BOOT="${21}"
3246        [ "$USE_COMP" = "" ] && USE_COMP=yes
3247        [ "$USE_GZIP" = "" ] && USE_GZIP=no
3248        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3249        [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
3250        # MONDO_ROOT is the real scratchdir
3251        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
3252        if [ _"$MONDO_ROOT" != _"" ]; then
3253            mkdir -p $MONDO_ROOT
3254        else
3255            Die "MONDO_ROOT is undefined"
3256        fi
3257    else
3258        LogScreen "Syntax: mindi (--custom ....)"
3259        MindiExit -1
3260    fi
3261fi
3262
3263if [ _"$MINDI_CACHE" != _"" ]; then
3264    rm -rf $MINDI_CACHE/* 2> /dev/null
3265    mkdir -p $MINDI_CACHE
3266fi
3267
3268[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3269
3270if [ _"$MONDO_SHARE" = _"" ]; then
3271    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3272    LogIt "Latest Mindi is available from http://www.mondorescue.org"
3273    LogIt "BusyBox sources are available from http://www.busybox.net"
3274    LogIt "------------------------------------------------------------------------------"
3275else
3276    LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
3277fi
3278if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3279    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3280else
3281    LogIt "ERROR: Unable to find mindi-busybox, please install it"
3282    MindiExit -1
3283fi
3284
3285for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3286    modinfo $i 2> /dev/null 1> /dev/null
3287    if [ $? -eq 0 ]; then
3288        modprobe $i 2>&1 > /dev/null
3289    fi
3290done
3291
3292KERN_DISK_MADE=""
3293
3294LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3295LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3296LogFile "NOT_BOOT = '$NOT_BOOT'"
3297if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3298    LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3299    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3300    MakeMountlist $MINDI_TMP/mountlist.txt
3301    CheckMountlist $MINDI_TMP/mountlist.txt
3302    mkdir -p $MINDI_TMP/small-all/tmp
3303    cd "$MINDI_TMP/small-all"
3304    cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
3305    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
3306    sleep 2
3307    LogIt "Done. Exiting."
3308    MindiExit 0
3309fi
3310
3311if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3312    LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
3313fi
3314
3315if [ "$kernelpath" = "" ] ; then
3316    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3317    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3318    read ch
3319    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3320        USE_OWN_KERNEL="yes"
3321    else
3322        USE_OWN_KERNEL="no"
3323    fi
3324    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3325        YOUR_KERNEL_SUCKS=""
3326        kernelpath=`TryToFindKernelPath`
3327        if [ "$kernelpath" = "" ] ; then
3328            echo -n "Please enter kernel path : "
3329            read kernelpath
3330        fi
3331    else
3332        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3333    fi
3334fi
3335if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3336    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3337    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3338        source $MINDI_LIB/FindDistroFailsafe
3339        # Log kernel image
3340        LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3341        kernelpath="$FAILSAFE_KBIN"
3342        LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3343        LogIt "      The failsafe kernel is $kernelpath."
3344        LogIt "      However, you are still running your kernel. If Mindi fails to create your"
3345        LogIt "      disks then it may still be a result of a problem with your kernel."
3346        pwd=`pwd`
3347        cd "$MINDI_TMP"
3348        mkdir -p lib/modules
3349        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
3350        cd "$pwd"
3351    else
3352        kernelpath=$MINDI_LIB/vmlinuz
3353        LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3354        LogIt "      However, you are still running your kernel. If Mindi fails to create your"
3355        LogIt "      disks then it may still be a result of a problem with your kernel."
3356        pwd=`pwd`
3357        cd "$MINDI_TMP"
3358        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3359        cd "$pwd"
3360    fi
3361    YOUR_KERNEL_SUCKS="Your kernel sucks"
3362fi
3363echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
3364[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
3365
3366[ "$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."
3367
3368PrepareDataDiskImages
3369
3370ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3371rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3372export ramdisk_size=$rds
3373
3374LogFile "INFO: Ramdisk will be $ramdisk_size KB"
3375if [ "$ARCH" = "ia64" ] ; then
3376    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
3377else
3378    PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size KB disk image."
3379fi
3380
3381[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3382...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3383
3384if [ _"$MONDO_SHARE" = _"" ]; then
3385    ListImagesForUser
3386    OfferToMakeBootableISO
3387    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3388        OfferToMakeBootableUSB
3389    fi
3390    LogAll "Finished."
3391elif [ "$TAPEDEV" ] ; then
3392    if [ "$ARCH" != "ia64" ] ; then
3393        # We need to keep the img file as boot file for ia64 platform
3394        rm -f $MINDI_CACHE/{*img,*iso}
3395    else
3396        rm -f $MINDI_CACHE/*iso
3397    fi
3398    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3399        OfferToMakeBootableUSB
3400    fi
3401    OfferToMakeBootableISO
3402    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3403        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3404    else
3405        Die "Cannot find all.tar.gz, to be written to tape"
3406    fi
3407elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3408    OfferToMakeBootableUSB
3409else
3410    OfferToMakeBootableISO
3411fi
3412# cleanup
3413LogAll "INFO: $FRIENDLY_OUTSTRING"
3414for mtpt in $FLOPPY_WAS_MOUNTED ; do
3415    mount $mtpt
3416done
3417MindiExit 0
Note: See TracBrowser for help on using the repository browser.