#!/bin/sh

# Copyright © 2014, Trond Endrestøl <Trond.Endrestol@ximalas.info>
# All rights reserved.

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:

# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.

# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#set -x

ROOTPOOL="zroot"
BOOTPOOL="bootpool"

ROOTPOOL_IMMED_FS="ROOT" # ${ROOTPOOL}/${ROOTPOOL_IMMED_FS}
BOOTPOOL_IMMED_FS="BOOT" # ${BOOTPOOL}/${BOOTPOOL_IMMED_FS}

PATH=/bin:/sbin:/usr/bin:/usr/sbin

if [ "$#" -lt 2 ]; then
  echo "Bruksmåte: ${0} <dato> <revisjon>" >/dev/stderr;
  echo "For eksempel: ${0} 20140314 263157" >/dev/stderr;
  exit 64; # EX_USAGE, see sysexits(3)
fi

DATO="${1}"
REVISJON="${2}"

DATOLEN=`echo ${DATO} | awk '{print length($1)}'`
REVISJONLEN=`echo ${REVISJON} | awk '{print length($1)}'`

if [ "${DATOLEN}" -lt 8 ]; then
  echo "${0}: lengden til \"${DATO}\" ser suspekt ut, bare ${DATOLEN} tegn lang." >/dev/stderr;
  echo "${0}: er du sikker på at \"${DATO}\" er en gyldig dato?" >/dev/stderr;
  exit 65; # EX_DATAERR
fi

if [ "${REVISJONLEN}" -lt 6 ]; then
  echo "${0}: lengden til \"${REVISJON}\" ser suspekt ut, bare ${REVISJONLEN} tegn lang." >/dev/stderr;
  echo "${0}: er du sikker på at \"${REVISJON}\" er et gyldig revisjonsnummer?" >/dev/stderr;
  exit 65; # EX_DATAERR
fi

if ! echo ${DATO} | egrep -q '^[[:digit:]]+$'; then
  echo "${0}: verdien \"${DATO}\" ser suspekt ut, inneholder ikke bare siffer." >/dev/stderr;
  echo "${0}: er du sikker på at \"${DATO}\" er en gyldig dato?" >/dev/stderr;
  exit 65; # EX_DATAERR
fi

if ! echo ${REVISJON} | egrep -q '^[[:digit:]]+$'; then
  echo "${0}: verdien \"${REVISJON}\" ser suspekt ut, inneholder ikke bare siffer." >/dev/stderr;
  echo "${0}: er du sikker på at \"${REVISJON}\" er et gyldig revisjonsnummer?" >/dev/stderr;
  exit 65; # EX_DATAERR
fi

ROOTFS="${ROOTPOOL}/${ROOTPOOL_IMMED_FS}/${DATO}-r${REVISJON}"
BOOTFS="${BOOTPOOL}/${BOOTPOOL_IMMED_FS}/${DATO}-r${REVISJON}"

if ! zpool list -H ${ROOTPOOL} >/dev/null 2>/dev/null; then
  echo "${0}: jeg finner ikke poolen \"${ROOTPOOL}\"." >/dev/stderr;
  exit 69; # EX_UNAVAILABLE
fi

if ! zfs list -H -o name ${ROOTPOOL}/${ROOTPOOL_IMMED_FS} >/dev/null 2>/dev/null; then
  echo "${0}: jeg finner ikke filsystemet \"${ROOTPOOL}/${ROOTPOOL_IMMED_FS}\"." >/dev/stderr;
  exit 69; # EX_UNAVAILABLE
fi

if zfs list -H -o name ${ROOTFS} >/dev/null 2>/dev/null; then
  echo "${0}: filsystemet \"${ROOTFS}\" finnes fra før av." >/dev/stderr;
  exit 73; # EX_CANTCREAT
fi

if ! zpool list -H ${BOOTPOOL} >/dev/null 2>/dev/null; then
  echo "${0}: jeg finner ikke poolen \"${BOOTPOOL}\"." >/dev/stderr;
  exit 69; # EX_UNAVAILABLE
fi

if ! zfs list -H -o name ${BOOTPOOL}/${BOOTPOOL_IMMED_FS} >/dev/null 2>/dev/null; then
  echo "${0}: jeg finner ikke filsystemet \"${BOOTPOOL}/${BOOTPOOL_IMMED_FS}\"." >/dev/stderr;
  exit 69; # EX_UNAVAILABLE
fi

if zfs list -H -o name ${BOOTFS} >/dev/null 2>/dev/null; then
  echo "${0}: filsystemet \"${BOOTFS}\" finnes fra før av." >/dev/stderr;
  exit 73; # EX_CANTCREAT
fi

zfs create -o mountpoint=/${DATO} ${ROOTFS}

if ! zfs list -H -o name ${ROOTFS} >/dev/null 2>/dev/null; then
  echo "${0}: klarte ikke å opprette filsystemet \"${ROOTFS}\"." >/dev/stderr;
  exit 73; # EX_CANTCREAT
fi

if [ "`zfs get -H -o value mounted ${ROOTFS}`" != yes ]; then
  echo "${0}: \"${ROOTFS}\" ble ikke montert som \"/${DATO}\"." >/dev/stderr;
  exit 75; # EX_TEMPFAIL
fi

zfs create -o mountpoint=/${DATO}/bootpool ${BOOTFS}

if ! zfs list -H -o name ${BOOTFS} >/dev/null 2>/dev/null; then
  echo "${0}: klarte ikke å opprette filsystemet \"${BOOTFS}\"." >/dev/stderr;
  exit 73; # EX_CANTCREAT
fi

if [ "`zfs get -H -o value mounted ${BOOTFS}`" != yes ]; then
  echo "${0}: \"${BOOTFS}\" ble ikke montert som \"/${DATO}/bootpool\"." >/dev/stderr;
  exit 75; # EX_TEMPFAIL
fi

mkdir /${DATO}/bootpool/boot

if [ ! -d /${DATO}/bootpool/boot ]; then
  echo "${0}: klarte ikke å opprette katalogen \"/${DATO}/bootpool/boot\"." >/dev/stderr;
  exit 73; # EX_CANTCREAT
fi

ln -s bootpool/boot /${DATO}/boot

if [ ! -L /${DATO}/boot ]; then
  echo "${0}: klarte ikke å opprette symlinken \"/${DATO}/boot\"." >/dev/stderr;
  exit 73; # EX_CANTCREAT
fi

echo "Alt er klart for: make DESTDIR=/${DATO} installworld installkernel"
echo ""

echo "Husk å migrere diverse filer fra /boot og /etc til /${DATO}/boot og /${DATO}/etc."
echo ""

echo "Ikke glem etterpå:"
echo ""
echo "  zpool set bootfs=${BOOTFS} ${BOOTPOOL}"
#echo "  zpool set bootfs=${ROOTFS} ${ROOTPOOL}"
echo "  zfs inherit mountpoint ${ROOTFS}"
echo "  zfs inherit mountpoint `zfs list -H -o name /bootpool`"
echo "  zfs set mountpoint=/bootpool ${BOOTFS}"

# EOF
