source: branches/3.0/mindi/mindi @ 3154

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