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

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

### BOOTCD-RUN_LIB Placeholder ##############

# 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=" -e "^UUID=" | grep -v -e "\<noauto\>" -e "\<auto\>" -e "\<swap\>"  -e "\<devpts\>" -e "\<sysfs\>" -e "\<tmpfs\>" -e "\<proc\>"'

MNTBOOTCDDISC="mnt/bootcd.disc"

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

# The following parameters are defined in the order listed
PARAMETERS="ERRLOG
DISK0
LVMGRP
LVMVOL
TRYFIRST
SFDISK0
VFAT
EXT2FS
EXT3FS
EXT4FS
SWAP
MOUNT
BIND
UMOUNT
FSTAB
GRUB2
GRUB
GRUBBOOTDISK
GRUBBOOTDIR
GRUBDEVICEMAP
LILO
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

# function: uuidsed -- remove uuids by real devices
# get: stdin -- stream
uuidsed()
{
  local O N i j

  O="$(cat)"
  for i in $(echo "$RIUUID" | sed "s/^[^:]\+://"); do
    j="$(echo "$RIUUID" | sed -n "s/:$i$//p")"
    debug "i=<$i> j=<$j>"   
    N="$(echo "$O" | sed "s|$i|UUID!$j|g")"
    O="$N" 
  done   
  echo "$O"
}
#riuuid="/dev/sda1:35096edc-998f-4af8-b971-a5195937492f"
#echo "Precondition: RIUUID=\"$riuuid\""
#inp="UUID=35096edc-998f-4af8-b971-a5195937492f:/boot"
#echo "Input=<$inp> Expected:"
#echo "UUID=UUID!/dev/sda1:/boot Output:"
#echo "$inp" | DEBUG="" RIUUID="/dev/sda1:35096edc-998f-4af8-b971-a5195937492f" uuidsed
#inp="search --no-floppy --fs-uuid --set 35096edc-998f-4af8-b971-a5195937492f:/boot"
#echo "Input=<$inp> Expected:"
#echo "search --no-floppy --fs-uuid --set UUID!/dev/sda1:/boot Output:"
#echo "$inp" | DEBUG="" RIUUID="/dev/sda1:35096edc-998f-4af8-b971-a5195937492f" uuidsed
#exit 0

# rmvg()
rmvg()
{
  T="$(cat)"
  debug "rmvg INPUT=<$T>"
  for i in $CIVG; do
    debug "rmvg $i"
    # i=vg_rh6 would remove /dev/mapper/vg_rh6-lv_swap
    # i=vg00 wourd remove /dev/vg00/lv01
    T1="$(echo "$T" | grep -v -e "/dev/$i\>" -e "/dev/mapper/$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)"
  RIGRUB2="$(for i in $MNT/boot/grub/grub.cfg $MNT/boot/boot/grub/grub.cfg; do if [ -s $i ]; then cat $i; break; fi; done)"
  RILV="$([ "$(type lvdisplay 2>&1 | grep "not found")" ] || 
    (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)"
  # RIUUID="/dev/sda1:35096ed...5492f<RETURN>/dev/sda2:1PTfZ5...ZARL1"
  RIUUID="$(for i in $(echo "$RIFSTAB" | 
    sed -n "s/.*UUID=\([^[:space:]]\+\).*/\1/p" | sort -n); do
      echo "$(blkid -U $i):$i"
    done)"
  RIPARTITION="$(cat /proc/partitions | tail -n +3|
    awk '{printf("/dev/%s:%d\n",$4,$3/1024)}';
    sfdisk -s | grep -v "^total" | 
    awk '{printf("%s%d\n",$1,$2/1024)}') | sort -u)"
}

uuidcut()
{
   sed "s/UUID=UUID!//g"
}

calcinfo()
{
  local i j

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

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

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

  # CIPART calculation
  #
  # Exp1: CIFS="/dev/hda2:/:ext4<RETURN>/dev/hda5:/home:ext2" CISWAP="/dev/hda3" RIPV="" 
  #       => CIPART=</dev/hda2<RETURN>/dev/hda3<RETURN>/dev/hda5>
  # Exp2: CIFS="/dev/VolGroup00/LogVol00:/:ext4<RETURN>/dev/sda1:/boot:ext4"
  #       CISWAP="/dev/VolGroup00/LogVol01" RIPV="/dev/sda2:VolGroup00"
  #       => CIPART="/dev/sda1<RETURN>/dev/sda2"
  # Exp3: CIFS="/dev/sda1:/:ext4" CISWAP="/dev/sda2" RIPV="" 
  #       => CIPART="/dev/sda1<RETURN>/dev/sda2"
  # Exp4: CIFS="/dev/VolGroup01/LogVol00:/:ext4<RETURN>/dev/sda1:/boot:ext4"
  #       CISWAP="/dev/VolGroup01/LogVol01" 
  #       RIPV="/dev/sda2:VolGroup01<RETURN>/dev/sdb1:VolGroup01<RETURN>/dev/sdc1:VolGroup01"
  #       => CIPART="/dev/sda1<RETURN>/dev/sda2<RETURN>/dev/sdb1<RETURN>/dev/sdc1"
  #
  # Exp5: CIFS="/dev/mapper/vg_rh6-lv_root:/:ext4<RETURN>/dev/sda1:/boot:ext4" 
  #       CISWAP="/dev/mapper/vg_rh6-lv_swap" 
  #       RIPV="/dev/sda2:vg_rh6<RETURN>/dev/sda2" 
  #       => CIPART="/dev/sda1<RETURN>/dev/sda2"
  #
  # add   space  for dash ;-) 


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

  # CIDISK calculation
  #
  # Exp1: CIPART=</dev/hda2<RETURN>/dev/hda3<RETURN>/dev/hda5>
  #       CIDISK=</dev/hda:DISK0>
  # Exp2: CIPART=</dev/sda1<RETURN>/dev/sda2>
  #       CIDISK=</dev/sda:DISK0>
  # Exp3: CIPART=</dev/sda1<RETURN>/dev/sda2<RETURN>/dev/sdb1<RETURN>/dev/sdc1> 
  #       CIDISK=</dev/sda:DISK0<RETURN>/dev/sdb:DISK1<RETURN>/dev/sdc:DISK2>
  # Exp4: CIPART=</dev/mapper/3600508b1001c9e14b850ec3afd0d1fccp1<RETURN>
  #               /dev/mapper/3600508b1001c9e14b850ec3afd0d1fccp2<RETURN>
  #               /dev/mapper/nnm-pkg>
  #       CIDISK=</dev/mapper/3600508b1001c9e14b850ec3afd0d1fcc:DISK0<RETURN>
  #               /dev/mapper/nnm-pkg:DISK1>

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

}

showinfo()
{
  dbg "RIFSTAB=\"$RIFSTAB\""
  dbg "RIGRUB=\"$RIGRUB\""
  dbg "RIGRUB2=\"$RIGRUB2\""
  dbg "RILV=\"$RILV\""
  dbg "RIPV=\"$RIPV\""
  dbg "RIDF=\"$RIDF\""
  dbg "RILABEL=\"$RILABEL\""
  dbg "RIUUID=\"$RIUUID\""
  dbg "RIPARTITION=\"$RIPARTITION\""

  dbg "CIVG=\"$CIVG\""
  dbg "CISWAP=\"$CISWAP\""
  dbg "CIFS=\"$CIFS\""
  dbg "CIPART=\"$CIPART\""
  dbg "CIDISK=\"$CIDISK\""
}

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
  [ "$T" ] && 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 ##############
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

# sfdisk4grub2
# change sfdisk created by print2diskconf and
# insert space for MBR before first partition 
sfdisk4grub2()
{
  local line position megabytes sectors a b r

  a="$(cat)"
  # only change primitive configs
  # do not change if unit is already specified
  # do only change if every line start with "," or ";"
  r="
"
  b="unit: sectors$r$r$(
    position=2048
    echo "$a" | while read line; do
      if [ "$line" = "" ]; then
        :
      elif [ $(echo "$line" | grep "^,[[:digit:]]\+$") ]; then
        megabytes="$(echo "$line" | sed "s/^,\([[:digit:]]\+\)$/\1/")"
        sectors="$(($megabytes * 2048))"
        echo "$position,$sectors"
        position="$(($position + $sectors))"
      elif [ "$line" = ",,E" ]; then
        echo "$position,,E"
        position="$(($position + 1))"
      elif [ "$line" = ";" -o "$line" = "0,0" ]; then
        echo "$line"
      else
        echo "sfdisk4grub2: no change because of line=<$line>"
        return
      fi
    done
  )"

  if [ "$(echo "$b" | grep "no change")" ]; then
    dbg "$(echo "$b" | grep "no change")"
    echo "$a"
  else
    echo "$b"
  fi
}
#. ./bootcd-run.lib
#dbgon
#a="$(echo -e ",18026\n,14998\n,1027\n,,E\n;")"
#b="$(echo -e "unit: sectors\n\n2048,36917248\n36919296,30715904\n67635200,2103296\n69738496,,E\n;")"
#c="$(echo "$a" | sfdisk4grub2)"
#[ "$b" = "$c" ] && echo "ok" || echo "Error: output=<$c> expected=<$b>"
#a="$(echo -e "unchangeable")"
#b="$(echo -e "unchangeable")"
#c="$(echo "$a" | sfdisk4grub2)"
#[ "$b" = "$c" ] && echo "ok" || echo "Error: output=<$c> expected=<$b>"
#a="$(echo -e ",101\n;")"
#b="$(echo -e "unit: sectors\n\n2048,206848\n;")"
#c="$(echo "$a" | sfdisk4grub2)"
#[ "$b" = "$c" ] && echo "ok" || echo "Error: output=<$c> expected=<$b>"
#a="$(echo -e ",19711\n,,E\n0,0\n0,0\n;")"
#b="$(echo -e "unit: sectors\n\n2048,40368128\n40370176,,E\n0,0\n0,0\n;")"
#c="$(echo "$a" | sfdisk4grub2)"
#[ "$b" = "$c" ] && echo "ok" || echo "Error: output=<$c> expected=<$b>"
#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 $(echo "$RIPV" | awk -F: '{print $2}' | sort -u); do
    echo "$i$(echo "$RIPV" | grep ":$i$" | awk -F: '{printf(" %s",$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
      # Extended Partition
      if [ "$pn" -eq 0 -a "$n" -lt 5 ]; then
        echo ",,E"
        n=$(($n+1))
        m=$(($n+1))
        # if there are unsed first four partitions fill them
        while [ $n -lt 5 ]; do
          echo "0,0"
          n=$(($n+1))
          m=$(($n+1))
        done
        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 |
    if [ "$RIGRUB2" ]; then
      sfdisk4grub2
    else
      cat 
    fi
    echo "\""
  done

  printbefore VFAT
  cat <<END
VFAT=""
END

  printbefore EXT2FS
  # Catch everything not ext3 and not ext4
  echo "EXT2FS=\""
  echo "$CIFS" | grep -v -e ":ext3" -e ":ext4" | awk -F: '{print $1}' | parttrans
  echo "\""

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

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

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

  # CIFS="<devpath>:<mountpoint>:<fstyp>\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=\"/$MNTBOOTCDDISC\""

  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 BIND

  echo "BIND=\""
  for i in $SORTCIFS; do
    y="$(echo "$i" | awk -F: '{print $3}')"
    echo "mkdir -p \$BOOTCDMP$y; mount --bind $y \$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 "\""
  
  # Always (even on backup) use "uuidsed", because a disk may be
  # changed at restore time which would make old UUIDs unusable

  printbefore FSTAB
  echo "FSTAB=\""
  echo "$RIFSTAB" | uuidsed | parttrans
  echo "\""
  if [ "$BACKUP" ]; then
    (
    echo " Now the original FSTAB is listed for reference:"
    echo "FSTAB=\""
    echo "$RIFSTAB"
    echo "\""
    ) | sed "s/^/#/"
  fi

  printbefore GRUB2
  echo "GRUB2=\""
  echo "$RIGRUB2" | uuidsed | parttrans
  echo "\""
  if [ "$BACKUP" ]; then
    (
    echo " Now the original GRUB2 is listed for reference:"
    echo "GRUB2=\""
    echo "$RIGRUB2"
    echo "\""
    ) | sed "s/^/#/"
  fi

  printbefore GRUB
  echo "GRUB=\""
  echo "$RIGRUB" | uuidsed | parttrans
  echo "\""
  if [ "$BACKUP" ]; then
    (
    echo " Now the original GRUB is listed for reference:"
    echo "GRUB=\""
    echo "$RIGRUB"
    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 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/bootcd.disc; tar xzf /\\\$(basename \\\$CONFDIR)/backup.tgz)\""
    # echo "RESTORECMD=\"(cd /mnt/bootcd.disc; 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=""
DEBUG=""
EXACTDISKS=""
BACKUP=""
FSTABDEV=""
TESTDATA=""
while [ "$*" ]; do
  if [ "$1" = "-v" ]; then
    dbgon
    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 RIUUID RIPARTITION; do
    if [ ! "`set | grep ^$i=`" ]; then
      echo "TESTDATA $i not defined" >&2
      exit 1 
    fi
  done

elif [ "$FSTABDEV" ]; then

  mkdir -p /$MNTBOOTCDDISC
  if [ "$(/bin/ls /$MNTBOOTCDDISC)" ]; then
    echo "/$MNTBOOTCDDISC is not emply; please empty it, (rm or umount)" >&2
    exit 1
  fi
  mount $FSTABDEV /$MNTBOOTCDDISC
  if [ $? -ne 0 ]; then
    echo "Problem mounting $FSTABDEV /$MNTBOOTCDDISC" >&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 /$MNTBOOTCDDISC/$FSTABPATH | eval "$MOUNTGREP" | awk '{$2="/'$MNTBOOTCDDISC'/"$2; print}')"
    dbg "Additional mounts: <$ADDMNT>"
    echo "$ADDMNT" >> /etc/fstab
  fi
  mount -a
  readinfo /$MNTBOOTCDDISC

else
  readinfo
fi

calcinfo
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

  dbg "Doing umount: <$UMOUNT>"
  eval "$UMOUNT"

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

  rmdir -f /$MNTBOOTCDDISC

fi
