#!/bin/sh

Die() { # message [errorcode]
  echo "$1" >&2
  exit "${2:-1}"
}

RW="/.rw"
STATIC="/opt /root /usr/local"
PRIVATE="/home"
ISOPARAMS="-input-charset UTF-8 -R -o-"
DST="user@ns"
VARSKIP="/var/log /var/cache/apt /tmp /var/lib/apt"
MANAGEFLAGS=""
SKIP=""
HOMESKIP=".cache Cache .apt"
PKGSTORE="/var/db/livecd-packages"
PROFILE="`sed -n 's/.* profile=\([^ ]*\).*/\1/p' < /proc/cmdline`"

test -r "$HOME/.overlays-create" && . "$HOME/.overlays-create" || :

STACK=""
CLASS="$1"
CMD="${2:-create}"

case "$CLASS" in
  diskcache)	# temporary loopmount varskip on hdd
		HDD="`(fdisk -l || sfdisk -l) 2>/dev/null | sed -n '/Linux$/s/[ 	].*//p' | tail -1`"
		MNT="${MNT:-/mnt}"
		MNTDIR="${MNTDIR:-overlays}"
		test -n "$HDD" || Die "No Linux partition found"
		umount "$MNT" 2>/dev/null || :
		mount "$HDD" "$MNT" || Die "Mount $HDD to $MNT failed"
		MTARGET="$MNT/$MNTDIR"
		rm -rf "$MTARGET" 
		mkdir -p "$MTARGET" || Die "Cannot make $MTARGET directory"
		find $VARSKIP | cpio -pdm "$MTARGET" || Die "Copying of $VARSKIP failed"
		for D in $VARSKIP; do
			mount -o bind "$MTARGET$D" "$D" || Die "Bind mount of $D failed"
		done
		exit
		;;
  initial)	# create initial full overlay (without $HOME)
    		ROOT="$RW/"
    		SKIP="$HOMESKIP $VARSKIP"
		CMD="start"
		rpm -qa > "$PKGSTORE.initial"
		;;
  packages)	# ask server for packages that was installed and deleted
    		ssh -qt "$DST" "PROFILE='$PROFILE' $FROMBIN/overlays-manage $MANAGEFLAGS diff" | sed '
			/^1 /s/^1/remove -y/
			/^2 /s/^2/install -y/
			$a\
			  commit -y
			'
		exit 0
		;;
  static)	# create static system paths overlay
    		ROOT="$STATIC";;
  home)		# create $HOME overlay
    		ROOT="$PRIVATE"
		SKIP="$HOMESKIP"
		;;
  etc)		# create cumulative /etc overlay
    		ROOT="$RW/etc"
		STACK=1
		;;
  system)	# create cumulative system-only overlay (includes /etc)
    		ROOT="$RW/"
		STACK=1
		SKIP="$PRIVATE $STATIC $VARSKIP"
		rpm -qa > "$PKGSTORE"
		;;
  *)		echo "Usage: $0 <command> [start]" >&2
    		grep "^[^(]*).*#" "$0" >&2
		exit 1
		;;
esac

GRAFT="-graft-points"
for D in $ROOT; do GRAFT="$GRAFT ${D#$RW}=$D"; done
SKIPLIST=""
for F in $SKIP; do 
  case "$F" in
    /*) for D in $ROOT; do SKIPLIST="$SKIPLIST -m ${D%/}$F"; done;;
    *) SKIPLIST="$SKIPLIST -m $F";;
  esac
done

echo "	Creating '$CLASS': $ROOOT" >&2

genisoimage -q $SKIPLIST $ISOPARAMS $GRAFT | ssh "$DST" "PROFILE='$PROFILE' $FROMBIN/overlays-manage $MANAGEFLAGS $CMD $CLASS $STACK"
