#!/bin/sh
set -u # exit on using unset var

#        name = bootcdmk2diskconf - create bootcd2disk.conf for backup
#       autor = Bernd Schumacher 
#   startdate = 08.05.2007

# exclude this filesystems from RIDF (readinfo from df)
RIDF_EXCLUDES="-e ^/dev/shm.*/dev/shm"

# only grep filesystems from fstab
MOUNTGREP='grep -e "^/dev/" -e "^LABEL=" | grep -v -e "\<noauto\>" -e "\<auto\>" -e "\<swap\>"  -e "\<devpts\>" -e "\<sysfs\>" -e "\<tmpfs\>" -e "\<proc\>"'


######################## nothing to configure behind this line ###############

# The following parameters are defined in the order listed
PARAMETERS="ERRLOG
DISK0
LVMGRP
LVMVOL
TRYFIRST
SFDISK0
VFAT
EXT2FS
EXT3
SWAP
MOUNT
UMOUNT
FSTAB
GRUB2
GRUB
GRUBBOOTDISK
GRUBBOOTDIR
GRUBDEVICEMAP
LILO
ELILO
SSHHOSTKEY
UDEV_FIXNET
IMAGEURL
PARTITIONLABEL"

USAGE="
Usage: bootcdmk2diskconf [-v] [-d]
   -v 	verbose 
   -d   debug
   -s   same; same size for last partition. If this option is not used 
        the last partition will be adjusted to actual disk size.
   -e   exact; exact disks will be used. Normally only the disk order will
        be used.
   -b   This option is needed to create a bootcd2disk.conf that can be 
        used to restore an offline backup.
   -f <fstabdev>
        Not the actual running system is used, but a system described by 
	the fstab that can be found on device <fstabdev>.
	<fstabpath>. example: -f /dev/sde7
"

debug()
{
  if [ "$DEBUG" ]; then
    echo "DEBUG $*" >&2
  fi
}

# label2dev <label>
label2dev()
{
  mount -vnf LABEL=$1 | # -> /ram1/dev/sda1 on /mnt/boot type ext3 (rw)
    awk '{print $1}' | # -> /ram1/dev/sda1
    sed "s|/ram[^/]*||" # /dev/sda1
}


# function: labelsed -- remove labels by real devices
# get: stdin -- stream
labelsed()
{
  local T T1 L j i
  T="$(cat)"
  debug "labelsed INPUT=<$T>"
  L="$(echo "$T" | sed -n "s/.*LABEL=\([^:[:space:]]\+\).*/\1/p" | sort -n)"
  for i in $L; do
    debug "labelsed search for label <$i>"
    j="$(echo "$RILABEL" | grep ":$i$" | awk -F: '{print $1}')"
    debug "labelsed found <$j>"
    T1="$(echo "$T" | sed -e "s|LABEL=$i:|$j:|" -e "s|LABEL=$i$|$j|")"
    T="$T1"
  done
  debug "labelsed OUTPUT=<$T>"
  echo "$T"
}
#echo "   Precondition: RILABEL-Line1=\"/dev/sda1:/\" RILABEL-Line2=\"/dev/sda2:SWAP-sda2\""
#echo "          Input: Line1=\"LABEL=/:/\" Line2=\"LABEL=SWAP-sda2\""
#echo "       Expected: Line1=\"/dev/sda1:/\" Line2=\"/dev/sda2\""
#echo "labelsed Output:"
#echo "LABEL=/:/
#LABEL=SWAP-sda2" | DEBUG="" RILABEL="/dev/sda1:/
#/dev/sda2:SWAP-sda2" labelsed 
#exit 0


# rmvg()
rmvg()
{
  T="$(cat)"
  debug "rmvg INPUT=<$T>"
  for i in $CIVG; do
    debug "rmvg $i"
    T1="$(echo "$T" | grep -v -e "/dev/$i\>")"
    T="$T1"
  done
  debug "rmvg OUTPUT=<$T>"
  echo "$T"
}

# function: readinfo -- read informations of disks
readinfo()
{
  MNT=""
  [ $# -gt 0 ] && local MNT="$1"  

  RIFSTAB="$(cat $MNT/etc/fstab)"
  RIGRUB="$(for i in $MNT/boot/grub/menu.lst $MNT/boot/grub/grub.conf $MNT/boot/boot/grub/menu.lst \
    $MNT/boot/boot/grub/grub.conf; do if [ -s $i ]; then cat $i; break; fi; done)"
  RILV="$([ "$(type lvdisplay 2>/dev/null)" ] && 
    (lvdisplay --ignorelockingfailure --units m -C | tail -n +2 | 
    sed "s/^[[:space:]]*//" | awk '{printf("%s:%s:%d\n",$1,$2,$4)}'))"
  RIPV="$([ "$(pvdisplay --ignorelockingfailure 2>/dev/null)" ] && 
    (pvdisplay --ignorelockingfailure -C | tail -n +2 |
    awk '{printf("%s:%s\n",$1,$2)}'))"
  # read from df
  RIDF="$(df -lPm | grep -e "^/dev/" -e "^LABEL=" | grep -v $RIDF_EXCLUDES |
    awk '{printf("%s:%s\n",$1,$2)}')"
  RILABEL="$(for i in $(echo "$RIFSTAB" | 
    sed -n "s/.*LABEL=\([^[:space:]]\+\).*/\1/p" | sort -n); do
      echo "$(label2dev $i):$i"
    done)"
  RIPARTITION="$(cat /proc/partitions | tail -n +3|
    awk '{printf("/dev/%s:%d\n",$4,$3/1024)}')"
}

calcinfo()
{
  local i j

  CIVG="$(echo "$RILV" | awk -F: '{print $2}' | sort -u)" 

  CISWAP="$(echo "$RIFSTAB" | grep -e "^/dev/" -e "^LABEL=" | 
    grep "\<swap\>" |awk '{print $1}' | labelsed)"

  CIFS="$(echo "$RIFSTAB"| eval "$MOUNTGREP" | awk '{printf("%s:%s\n",$1,$2)}' | labelsed )"

  # add   space  for dash ;-) 
  CIPART="$( (echo "$CIFS" | awk -F: '{print $1}'; echo "$CISWAP"; 
    echo "$RIPV" | awk -F: '{print $1}') | rmvg | sort -u)"

  CIDISK="$(
    j=0
    for i in $(echo "$CIPART" | sed "s/p*[123456789][[:digit:]]*//"|uniq); do
      echo "$i:DISK$j"
      j=$(($j+1))
    done
  )"
}

showinfo()
{
  debug "RIFSTAB=\"$RIFSTAB\"" >&2
  debug "RIGRUB=\"$RIGRUB\"" >&2
  echo "RILV=\"$RILV\"" >&2
  echo "RIPV=\"$RIPV\"" >&2
  echo "RIDF=\"$RIDF\"" >&2
  echo "RILABEL=\"$RILABEL\"" >&2
  echo "RIPARTITION=\"$RIPARTITION\"" >&2

  echo "CIVG=\"$CIVG\"" >&2
  echo "CISWAP=\"$CISWAP\"" >&2
  echo "CIFS=\"$CIFS\"" >&2
  echo "CIPART=\"$CIPART\"" >&2
  echo "CIDISK=\"$CIDISK\"" >&2
}

parttrans()
{
  local i dev dsk

  T="$(cat)"
  for i in $CIDISK; do
    # i=/dev/sda:DISK1 -> dev=/dev/sda dsk=DISK1
    dev="$(echo "$i" | awk -F: '{print $1}')"
    dsk="$(echo "$i" | awk -F: '{print $2}')"

    T1="$(echo "$T" | sed "s|${dev}p*\>|$dsk|")"
    T="$(echo "$T1" | sed "s|${dev}p*\([[:digit:]]\+\)|${dsk}P\1|")"
  done
  echo "$T"
}

trans()
{
  echo "$1"  | sed "$PARTTRANS"
}

mapperlv2lv()
{
   T="$1"
   for i in $VG; do
     T1="$(echo "$T" | sed "s|/dev/mapper/$i-|/dev/$i/|")"
     T="$T1"
   done
   echo "$T"
}

template()
{
cat << END_OF_BOOTCD2DISK.CONF | tail -n +2 | head -n -1
### BOOTCD2DISK.CONF Placeholder ##############
ERRLOG=/var/log/bootcd2disk.log

# function do_first
# If you want to do some things first before doing anythin else (e.g. load
# additional modules), you can add this to this function.
#    function do_first() {
#    return
#    }

# To define the disk that will be newly partitioned before copying the cd to it
#   DISK0="/dev/hda"
# If you don't want do partition any disk
#   DISK0=""
# If you want bootcd2disk to find a disk (bootcd tries to use the first disk)
DISK0="auto"

# It is possible to define more disks. The disk number must be increased by 1.
#DISK1="auto"
#DISK2="auto"

# Syntax:
#   LVMGRP="<group> <diskdev> [<diskdev> ...][<vgcreate-cmd>][\n ...]"
#
# Example1:
#   LVMGRP="vg00 DISK0P1
#           vg01 DISK0P2
#           vg02 DISK0P3 DISK0P4"
#   
# Example2 which is the same as Example1 because it used the default schema
#   LVMGRP="vg00 DISK0P1 vgcreate vg00 DISK0P1
#           vg01 DISK0P2 vgcreate vg01 DISK0P2
#           vg02 DISK0P3 vgcreate vg02 DISK0P3 DISK0P4"
#
# hint: Each volume group definition needs a new line! 
#
# Default: 
#   LVMGRP=""
LVMGRP=""

# Syntax:
#   LVMVOL="<volname> <size> <group> [<lvcreate-cmd>][\n ...]"
#
#   size in vgcreate syntax, e.g.: 100 means 100 MByte 
#
# Example1:
#   LVMVOL="lv00 2000 vg00"
#
# Example2 which is the same as Example1 because it used the default schema
#   LVMVOL="lv00 2000 vg00 lvcreate -n lv00 -L 2000 vg00"
#
# Example3 uses striping for the second volume 
#   LVMVOL="lv00 2000 vg00
#           lv01 100 vg00 lvcreate -n lv01 -i 3 -I 8 -L 100 vg00"
#
# hint: Each logical volume definition needs a new line! 
#
# Default: 
#   LVMVOL=""
LVMVOL=""

# If DISK0="auto" is defined, the first disk found will be used. To change
# this order TRYFIRST can be defined for example to use SCSI Disks first:
#   TRYFIRST="/dev/sda /dev/hda"
# Most people will not need this option and will define:
#   TRYFIRST=""
TRYFIRST=""

# If you don't want to repartition anything use:
#   SFDISK0=""
# If you want to specify yourself: see man sfdisk
#   SFDISK0="
#   ,50
#   ,100,S
#   ;
#   "
# If you want to do it automatically. There will be 3 partitions
# /boot, swap and /. /boot is created first to be sure the bios can load
# the kernel also on very large disks.
SFDISK0="auto"

# For each defined DISK<x> there must be one SFDISK<x> Line
# SFDISK1="auto"
# SFDISK2="auto"

# VFAT is normally only needed on ia64 for EFI files.
# Do not run mkdosfs: 
#   VFAT=""
# Create partitions defined in VFATFS with mkdosfs
#   VFAT="/dev/sdb4"
VFAT=""

# Do not run mke2fs:
#   EXT2FS=""
# Create partitions defined in EXT2FS with mke2fs:
#   EXT2FS="/dev/hda1 
#           /dev/hda3"
#
# hint: Each device or logical volume definition needs a new line! 
# Create partitions needed automatically:
EXT2FS="auto"

# Use EXT3 extenstion for partitions defined by EXT2FS:
#   EXT3="yes"
# Do not Use EXT3 extenstio for partitions defined by EXT2FS:
#   EXT3="no"
# Use EXT3 automatically if it is supported by the system:
EXT3="auto"

# If you don't want to run mkswap use:
#   SWAP=""
# If you want to specify partitions for mkswap:
#   SWAP="/dev/hda2"
# hint: Each swap device definition needs a new line! 
# If you want to automatically use mke2fs:
SWAP="auto"

# If you don't want to mount anything, before copying the cd to /mnt
#   MOUNT=""
#   UMOUNT=""
# If you want to mount everything yourself:
#   MOUNT="mount /dev/hda3 /mnt; mkdir /mnt/boot; mount /dev/hda1 /mnt/boot"
#   UMOUNT="umount /mnt/boot; umount /mnt"
# If you want to automatically mount:
MOUNT="auto"
UMOUNT="auto"

# If you don't want to change the /etc/fstab copied form cd:
#   FSTAB=""
# If You want to define it yourself:
#   FSTAB="
#   /dev/sda1 /boot ext2 defaults 0 1
#   /dev/sda2 none  swap sw 0 0
#   /dev/sda3 /     ext2 defaults,errors=remount-ro 0 1
#   proc      /proc proc defaults 0 0
#   "
# If You want to do it automatically:
FSTAB="auto"

# If you don't want to use GRUB2:
#   GRUB2=""
# If GRUB2 and GRUB and LILO is defined and installed, GRUB2 will be used
# If GRUB2 is auto grub-mkconfig will be used to create it automatically.
# If you want to define it yourself:
#   GRUB2="
#   set lang=en
#   insmod gettext
#   set timeout=5
#   set menu_color_normal=cyan/blue
#   set menu_color_highlight=white/blue
#   
#   menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os {
#        insmod ext2
#        set root='(hd0,0)'
#        linux   /$(basename $KERNEL) root=DISK0P3 ro
#        initrd  /$(basename $INITRD)
#   }
# "
GRUB2="auto"

# If you don't want to use GRUB:
#   GRUB=""
# If GRUB2 is not installed or defined and GRUB is defined and grub is 
# installed it will be used and
# LILO will be ignored.
# If you want to define it yourself:
#   GRUB="
#   default 0
#   timeout 5
#   color   cyan/blue white/blue
#   title   Debian GNU/Linux
#   root    (hd0,0)
#   kernel  /vmlinuz-2.4.27-2-386 root=/dev/hda3 ro
#   initrd  /initrd.img-2.4.27-2-386
#   savedefault
#   boot
#   "
# If You want to do it automatically:
GRUB="auto"

# Only if you BIOS sees another disk as the first disk you may
# have to change the next line.
GRUBBOOTDISK="hd0"

# If /boot is not the first partition on disk
# we need to know which one it is to install 
# grub properly. Attention: grub starts counting with 0!
GRUBBOOTDIR="0"

# GRUBDEVICEMAP=auto|no|<value>
# GRUBDEVICEMAP="auto" means, bootcd2disk deletes the original
# device.map, so that it will be auto-created by grub again.
# This should work also when installing on different hardware with
# different disks..
# GRUBDEVICEMAP="no" means bootcd2disk does not change device.map.
# This should work if a bootcd is installed on the original hardware
# Everything else will be used as new value for device.map.
GRUBDEVICEMAP="auto"

# If GRUB is defined and installed LILO will be ignored. 
# If you don't want to change the /etc/lilo.conf copied from cd:
#   LILO=""
# If you want to define it yourself:
#   LILO="
#   boot=DISK0
#   delay=20
#   vga=0
#   image=/vmlinuz
#   root=DISK0P3
#   initrd=/initrd.img
#   label=Linux
#   read-only
#   "
# If You want to do it automatically:
LILO="auto"

# ELILO is only needed on ia64 systems.
# If you don't want to run elilo:
#   ELILO=""
# If you want to define /etc/elilo.conf and run elilo.
#   ELILO="
#   install=/usr/lib/elilo/elilo.efi
#   boot=/dev/sdb4
#   prompt
#   timeout=50
#   default=Linux
#   append=\\\"console=ttyS0.9600n8\\\"
#   image=/vmlinuz
#   label=Linux
#   root=/dev/sdb5
#   read-only
#   "
ELILO=""

# SSHOSTKEY=yes|no
# If you are using ssh it is helpful to have a unique ssh hostkey for
# each PC installed with bootcd2disk. This will be generated with 
#   SSHHOSTKEY="yes"
SSHHOSTKEY=yes

# UDEV_FIXNET=yes|no
# If you are using udev filesystem and install the image on other machines
# you need to set this to "yes" because the network interfaces are hardwired
# in /etc/udev/rules.d/z25_persistent-net.rules (etch) or in 
# /etc/udev/rules.d/70-persistent-net.rules (lenny) and we must remove them.
#   UDEV_FIXNET="yes"
UDEV_FIXNET="yes"

# IMAGEURL="" | IMAGEURL="<url>"
# If bootcd2disk is slow on your system (because of a slow CD/DVD drive or
# the HP ILO virtual CD interface), you can use a image server to get the 
# image from.
# bootcd2disk use the SWAP partition of your upcoming system as temporary
# space and copy the image from the configured image server (IMAGEURL or
# cmdline -url) to this partition and use it as image. 
# The "url" is used with "wget" so all url from wget are possible.
# e.g: http://192.168.100.10/cdimage.iso
# hint: Please use a ip because of failed DNS and you need also the
#       configured ip interface.
# hint: the option may be overwritten from command line (-url)
#  IMAGEURL=""
IMAGEURL=""

# PARTITIONLABEL=""
# If you want the filesystem or swap partitions to have labels you can define
# them here. Example:
#   PARTITIONLABEL="/dev/sda1:/
#   /dev/sda2:SWAP-sda2"
PARTITIONLABEL=""

# function after_copy
# If you want to do some things after copying the files (e.g. remount of
# directories ...), you can add this to this function.
#    function after_copy() {
#    return
#    }

#
# Examples:
#

# IF you only want to copy the cd to an already existing Partition /dev/hda2
# You can now specify:
#   DISK0=""; SFDISK0=""; SWAP=""; FSTAB=""; LILO=""
#   EXTFS2="/dev/hda2"
#   MOUNT="mount /dev/hda2 /mnt"
### BOOTCD2DISK.CONF Placeholder ##############
END_OF_BOOTCD2DISK.CONF
}

checktemplate()
{
  USED="$(template | grep "^[^#[:blank:]]" | sed "s/\(.*\)=.*/\1/")"
  if [ "$USED" != "$PARAMETERS" ]; then
    echo "INTERNAL ERROR: <$PARAMETERS> != <$USED>" >&2
    exit 1
  fi
  exit 0
}

printbefore()
{
  ( template 
    cat <<END
LASTLINES="This is just to make printbefore work for the last lines"
END
  ) |
  awk '
    /^'$1'=/ {print B}
    /^[^#]/ && ! /^ *$/ {B=""}
    /^#/ || /^ *$/ { B=sprintf("%s\n%s",B,$0) }
  ' | 
  tail -n +2
}

#x=$(printbefore LVMGRP)
#x=$(printbefore LASTLINES)
#echo "x=<$x>"
#exit 0

print2diskconf()
{
  cat <<END
# bootcd2disk.conf - automatically created by bootcdmk2diskconf
END

  printbefore ERRLOG
  cat <<END
ERRLOG=/var/log/bootcd2disk.log
END

  printbefore DISK0

  for i in $CIDISK; do 
    # i=/dev/sda:DISK1 -> dev=/dev/sda dsk=DISK1
    dev="$(echo "$i" | awk -F: '{print $1}')"
    dsk="$(echo "$i" | awk -F: '{print $2}')"
    echo "ORIG_$dsk=\"$dev\""
  done

  for i in $CIDISK; do 
    # i=/dev/sda:DISK1 -> dev=/dev/sda dsk=DISK1
    dev="$(echo "$i" | awk -F: '{print $1}')"
    dsk="$(echo "$i" | awk -F: '{print $2}')"
    if [ "$EXACTDISKS" ]; then
      echo "$dsk=\"$dev\""
    else
      echo "$dsk=\"auto\""
    fi
  done

  printbefore LVMGRP
  echo "LVMGRP=\""
  for i in $RIPV; do
    echo "$(echo "$i" | awk -F: '{print $2}' 
      ) $(echo "$i" | awk -F: '{print $1}' | parttrans)"
  done
  echo "\""

  printbefore LVMVOL
  echo "LVMVOL=\""

  for i in $RILV; do
    echo "$(echo "$i" | awk -F: '{printf("%s %s %s\n", $1,$3,$2)}')"
  done
  echo "\""

  printbefore TRYFIRST
  cat <<END
TRYFIRST=""
END

  printbefore SFDISK0
  for i in $CIDISK; do                                 
    # i=/dev/cciss/c0d0:DISK0 -> x=/dev/cciss/c0d0 y=0
    x="$(echo "$i" | awk -F: '{print $1}')"                
    y="$(echo "$i" | awk -F: '{print $2}' | sed "s/DISK//")"  
    echo "SFDISK$y=\""
    # n is number of partition, pn is the size of partition n
    # m and pm are the same info for the following partition
    n=0
    while :; do
      # RIPARTITION="/dev/cciss/c0d0p1:101\n/dev/cciss/c0d0p2:34624" 
      # -> n=1, m=2, pn=101, pm=34624  -> n=2, m=3, pn=34624 pm=
      n=$(($n+1))
      m=$(($n+1))
      pn="$(echo "$RIPARTITION" | grep "^${x}p*${n}:" | awk -F: '{print $2}')"
      if [ ! "$pn" ]; then
        if [ "$n" = "1" ]; then
          pn=0 # if a disk is used as a whole we set size of partition1 to 0
          echo ",0"
          break
        else
          echo "bootcdmk2diskconf: FATAL Unknown Error" >&2
          exit 1
        fi
      fi
      if [ "$pn" -eq 0 -a "$n" -lt 5 ]; then
        echo ",,E"
        n=5 
	m=6
        pn="$(echo "$RIPARTITION" | grep "^${x}p*${n}:" | awk -F: '{print $2}')"
      fi
      pm="$(echo "$RIPARTITION" | grep "^${x}p*${m}:" | awk -F: '{print $2}')"
      if [ "$pm" ]; then
        echo ",$pn"
      else
        if [ "$SAMESIZE" ]; then
          echo ",$pn"
	else
          echo ";"
        fi
        break
      fi
    done
    echo "\""
  done

  printbefore VFAT
  cat <<END
VFAT=""
END

  printbefore EXT2FS
  echo "EXT2FS=\""
  echo "$CIFS" | awk -F: '{print $1}' | parttrans
  echo "\""

  printbefore EXT3
  cat <<END
EXT3="auto"
END

  printbefore SWAP
  echo "SWAP=\"$(echo "$CISWAP" | parttrans)\""

  # CIFS="<devpath>:<mountpoint>\n..."
  # Sort it with length of <mountpoint> for right mount order
  SORTCIFS=$(for i in $CIFS; do
    echo "$(echo "$i" | awk -F: '{print $2}'|wc -c):$i" | sort -n
  done)
  
  printbefore MOUNT

  echo "[ ! \"\$(set |grep \"^BOOTCDMP=\")\" ] && BOOTCDMP=\"/mnt\""

  echo "MOUNT=\""
  # SORTCIFS="<mountpointlen>:<devpath>:<mountpoint>\n..."
  for i in $SORTCIFS; do
    x="$(echo "$i" | awk -F: '{print $2}')"
    y="$(echo "$i" | awk -F: '{print $3}')"
    echo "mkdir -p \$BOOTCDMP$y; mount $x \$BOOTCDMP$y" | parttrans
  done
  echo "\""

  printbefore UMOUNT
  UMOUNT=""
  echo "UMOUNT=\""
  for i in $(echo "$SORTCIFS" | sort -nr); do
    x="$(echo "$i" | awk -F: '{print $3}')"
    echo "umount \$BOOTCDMP$x"
    UMOUNT="$UMOUNT umount \$BOOTCDMP$x;"
  done
  echo "\""
  
  if [ ! "$BACKUP" ]; then
    printbefore FSTAB
    echo "FSTAB=\""
    echo "$RIFSTAB" | parttrans
    echo "\""

    printbefore GRUB
    echo "GRUB=\""
    echo "$RIGRUB" | parttrans
    echo "\""
  else
    printbefore FSTAB
    echo "FSTAB=\"unchanged\""
    cat <<END
# FSTAB="unchanged". It is is used, as defined in backup. 
# But if you want to recreate it, for example because
# you restore on another hardware and hda changed to 
# sda try the following lines instead (see also GRUB):
END
    (
    echo "FSTAB=\""
    echo "$RIFSTAB" | parttrans
    echo "\""
    ) | sed "s/^/#/"
  
    printbefore GRUB
    echo "GRUB=\"unchanged\""
    cat <<END
# GRUB="unchanged". It is used, as definded in backup.
# But if you want to recreate it, try the following
# lines instead (see also FSTAB):
END
    (
    echo "GRUB=\""
    echo "$RIGRUB" | parttrans
    echo "\""
    ) | sed "s/^/#/"
  fi

  printbefore GRUBBOOTDISK
  cat <<END
GRUBBOOTDISK="hd0"
END

  printbefore GRUBBOOTDIR
  cat <<END
GRUBBOOTDIR="0"
END

  printbefore GRUBDEVICEMAP
  cat <<END
GRUBDEVICEMAP="auto"
END

  printbefore LILO
  cat <<END
LILO=""
END

  printbefore ELILO
  cat <<END
ELILO=""
END

  printbefore SSHHOSTKEY
  cat <<END
SSHHOSTKEY="unchanged"
# SSHHOSTKEY="unchanged". It is used, as definded in backup.
# But if you want to recreate it, use the following
# line instead:
#SSHHOSTKEY="yes"
END

  printbefore UDEV_FIXNET
  cat <<END
UDEV_FIXNET="no"
END

  printbefore IMAGEURL
  cat <<END
IMAGEURL=""
END

  if [ "$BACKUP" ]; then
    # default directory structure for backup called <name>:
    #   /<name>/cpio00
    #   /etc/bootcd/<name>/bootcd2disk.conf (this file)

    # echo "RESTORECMD=\"(cd /mnt; tar xzf /\\\$(basename \\\$CONFDIR)/backup.tgz)\""
    # echo "RESTORECMD=\"(cd /mnt; cat \\\$CONFDIR/backup* |gzip -d -c | cpio --null --quiet -idmn)\""
    echo "RESTORECMD=\"(cd \$BOOTCDMP; 
[ -f \\\$ISOLOOPBACK/backup/data/cpio00 ] && (cat \\\$ISOLOOPBACK/backup/data/cpio* |gzip -d -c | cpio --null --quiet -idmn);
[ -f \\\$ISOLOOPBACK/backup/data/star00 ] && (cat \\\$ISOLOOPBACK/backup/data/star* |gzip -d -c | star -U -xattr -x -f - );:
)\"" 
  fi

  printbefore PARTITIONLABEL
  echo "PARTITIONLABEL=\""
  echo "$RILABEL" | parttrans
  echo "\""

  printbefore LASTLINES
}


SAMESIZE=""
VERBOSE=""
DEBUG=""
EXACTDISKS=""
BACKUP=""
FSTABDEV=""
TESTDATA=""
while [ "$*" ]; do
  if [ "$1" = "-v" ]; then
    VERBOSE="1"
    shift
  elif [ "$1" = "-d" ]; then
    DEBUG="1"
    shift
  elif [ "$1" = "-s" ]; then
    SAMESIZE="$1"
    shift
  elif [ "$1" = "-e" ]; then
    EXACTDISKS="$1"
    shift
  elif [ "$1" = "-b" ]; then
    BACKUP="$1"
    shift 1
  elif [ "$1" = "-f" ]; then
    FSTABDEV="$2"
    shift 2
  elif [ "$1" = "-t" ]; then
    TESTDATA="$1"
    shift
  elif [ "$1" = "-checktemplate" ]; then
    # Internal Option to check if bootcd2disk.conf fits to this script
    checktemplate
    shift
  else
    echo "$USAGE" >&2
    exit 1
  fi
done

if [ "$TESTDATA" ]; then
  for i in RILV RIPV RIDF RILABEL RIPARTITION; do
    if [ ! "`set | grep ^$i=`" ]; then
      echo "TESTDATA $i not defined" >&2
      exit 1 
    fi
  done

elif [ "$FSTABDEV" ]; then

  if [ "$(/bin/ls /mnt)" ]; then
    echo "/mnt is not emply; please empty it, (rm or umount)" >&2
    exit 1
  fi
  mount $FSTABDEV /mnt 
  if [ $? -ne 0 ]; then
    echo "Problem mounting $FSTABDEV /mnt" >&2
    exit 1
  fi

  if [ ! "$(grep "# bootcdmk2diskconf entries" /etc/fstab)" ]; then
    echo "# bootcdmk2diskconf entries" >>/etc/fstab

    if [ -f /etc/fstab ]; then
      FSTABPATH="/etc/fstab"
    elif [ -f /fstab ]; then
      FSTABPATH="/fstab"
    else
      echo "Can not find fstab" >&2
      exit 1
    fi
    ADDMNT="$(cat /mnt/$FSTABPATH | eval "$MOUNTGREP" | awk '{$2="/mnt/"$2; print}')"
    [ "$VERBOSE" ] && echo "Additional mounts: <$ADDMNT>" >&2
    echo "$ADDMNT" >> /etc/fstab
  fi
  mount -a
  readinfo /mnt


else
  readinfo
fi

calcinfo
[ "$VERBOSE" ] && showinfo
print2diskconf


if [ "$FSTABDEV" ]; then

  cp /etc/fstab /etc/fstab.tmp
  cat /etc/fstab.tmp | awk 'BEGIN {p=1} /# bootcdmk2diskconf entries/ {p=0} {if(p) print}' >/etc/fstab
  rm /etc/fstab.tmp

  [ "$VERBOSE" ] && echo "Doing umount: <$UMOUNT>" >&2
  eval "$UMOUNT"

  if [ "$(/bin/ls /mnt)" ]; then
    echo "ERROR: /mnt is not emply; calculated umount <$UMOUNT> did not work !!!"
    exit 1
  fi

fi
