root/branches/2.2.10/mindi/mindi

Revision 2587, 94.6 kB (checked in by bruno, 6 months ago)

r3714@localhost: bruno | 2010-03-03 10:42:28 +0100
svk merge -r3649:3678 //prj/local-mondorescue/branches/2.2.9


r3666@localhost (orig r2578): bruno | 2010-02-12 13:35:29 +0100

  • Free the sz_devfile fifo for ntfs later as it was used in between, causing a problem to backup NT

FS dev. Fix #392.


r3667@localhost (orig r2579): bruno | 2010-02-12 15:27:07 +0100
analyze-my-lvm now provides an option to call GiveMapperOfdm? that can be used in mindi. Solve #395

r3668@localhost (orig r2580): bruno | 2010-02-12 17:12:18 +0100

  • When using excludevs= also exclude from mountlist the devices mentioned. Fix #393.

    r3669@localhost (orig r2581): bruno | 2010-02-12 17:15:53 +0100
  • the post install ascript passed with post= should just exists and not be executable. It's now mad

e executable by init. Maybe a fix for #394


r3670@localhost (orig r2582): vicgat | 2010-02-15 19:35:39 +0100

r3671@localhost (orig r2583): bruno | 2010-02-15 20:05:45 +0100

  • Fix reporting when a module is not found (pollutes logs)

    r3672@localhost (orig r2584): bruno | 2010-02-15 20:09:23 +0100
  • Adds a missing module for iSCSI support

    r3673@localhost (orig r2585): bruno | 2010-02-15 20:45:50 +0100
  • Fix problems of wrongly detected Duplicate mountpoints in case of lvm

    r3674@localhost (orig r2586): bruno | 2010-02-16 13:15:38 +0100
  • Avoids error messages from stat in analyze-my-lvm

    r3663@athonet (orig r2577): bruno | 2010-02-09 02:08:39 +0100
  • First try to improve OVM support with ocfs2 and Xen modules added

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