source: branches/2.2.10/mindi/mindi @ 2604

Last change on this file since 2604 was 2604, checked in by bruno, 9 years ago

r3760@localhost: bruno | 2010-03-18 00:52:51 +0100

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