source: branches/2.2.10/mindi/mindi @ 2850

Last change on this file since 2850 was 2850, checked in by Bruno Cornec, 9 years ago

svn merge -r 2773:2849 2.2.9 in 2.2.10

  • Adds 3 binaries called potentially by udev o support USB key mount at restore time (Victor Gattegno)
  • Really support both mkisofs and genisoimage everywhere
  • Try to handle netfs_user better in all cases (NFS and SSHFS)
    • Improve logging in init script
    • Format improvement
    • Removes a warning when trying to launch udevadm and it doesn't exist (RHEL 5 e.g.)
    • Fix syntax description in mondoarchive man page for -E & -I with |
  • Adds download entries for new distro supported (Mageia, Fedora 15, Ubuntu 11.04)

-Fix mindi-get-perl-modules when perl dirs in @INC are symlinks (case on Ubuntu 11.04)

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