#!/bin/bash
#
# zfs           This shell script takes care of starting (mount) and
#               stopping (umount) zfs shares.
#
# chkconfig: 35 60 40
# description: ZFS is a filesystem developed by Sun, ZFS is a
#              combined file system and logical volume manager
#              designed by Sun Microsystems. Made available to Linux
#              using SPL (Solaris Porting Layer) by zfsonlinux.org.
# probe: true

ZFS="@sbindir@/zfs"
ZPOOL="@sbindir@/zpool"
ZPOOL_CACHE="@sysconfdir@/zfs/zpool.cache"

case $1 in
  start)  echo "$1ing ZFS filesystems"

    # Delay until all required block devices are present.
    udevadm settle

    if ! grep "zfs" /proc/modules > /dev/null; then
      echo "ZFS kernel module not loaded yet; loading...";
      if ! modprobe zfs; then
        echo "Failed to load ZFS kernel module...";
        exit 0;
      fi
    fi

    if ! [ `uname -m` == "x86_64" ]; then
      echo "Warning: You're not running 64bit. Currently native zfs in";
      echo "         linux is only supported and tested on 64bit.";
      # should we break here? People doing this should know what they
      # do, thus i'm not breaking here.
    fi

    # mount the filesystems
    while IFS= read -r -d $'\n' dev; do
      mdev=$(echo "$dev" | awk '{ print $1; }')
      echo -n "mounting $mdev..."
      if $ZFS mount $mdev; then
        echo -e "done";
      else
        echo -e "failed";
      fi
    done < <($ZFS list -H);

    # export the filesystems
    echo -n "exporting ZFS filesystems..."
    if $ZFS share -a; then
      echo -e "done";
    else
      echo -e "failed";
    fi


  ;;

  stop)  echo "$1ping ZFS filesystems"

    if grep "zfs" /proc/modules > /dev/null; then
      # module is loaded, so we can try to umount filesystems
      while IFS= read -r -d $'\n' dev; do
        mdev=$(echo "$dev" | awk '{ print $1 }');
        echo -n "umounting $mdev...";
        if $ZFS umount $mdev; then
          echo -e "done";
        else
          echo -e "failed";
        fi
        # the next line is, because i have to reverse the
        # output, otherwise it wouldn't work as it should
      done < <($ZFS list -H | tac);

      # and finally let's rmmod the module
      rmmod zfs


    else
      # module not loaded, no need to umount anything
      exit 0
    fi

  ;;

  restart) echo "$1ing ZFS filesystems"
    $0 stop
    $0 start
  ;;

  *)  echo "Usage: $0 {start|stop|restart}"
  ;;

esac