#!/bin/ksh
# 
# simple script to mount and share CDROM images
#
# History: 
#   21.10.2005 /bs initial release
#

#
# save the parameter
#
  ACTION="$1"
  [ $# -ne 0 ] && shift
    
  ACTION_PARAMETER="$*"

  THISSCRIPT=` basename $0` 


#
# format of the config file entries (see defaults below)
#
  CONF_FILE="/etc/mount_cdrom_images.conf"

  TEMP_FILE="/tmp/mount_cdrom_images.$$.temp"

#
# sub routines
#


LogMsg() {
  LogMsg_THISMSG="$*"
  echo "${LogMsg_THISMSG}"
}

LogError() {
  LogError_THISMSG="${THISSCRIPT} - ERROR: $*!"
  echo "${LogError_THISMSG}" >&2
}

Create_LOFI_Device() {
  CUR_IMAGE_FILE="$1"
  CUR_LOFI_DEVICE=""

  set  -- ` lofiadm "${CUR_IMAGE_FILE}" `   
  if [ "$1"x = ""x ] ; then
    LogMsg "Creating a lofi device for \"${CUR_IMAGE_FILE}\" ..."
    set -- ` lofiadm -a "${CUR_IMAGE_FILE}"`
    if [ $? -ne 0 ] ; then
      LogError "Can not create a lofi device for \"${CUR_IMAGE_FILE}\""
      return 1
    else
      CUR_LOFI_DEVICE="$1"
    fi  
  else
    CUR_LOFI_DEVICE="$1"
  fi

  return 0
}

Delete_LOFI_Device() {
  CUR_IMAGE_FILE="$1"

  set  -- ` lofiadm "${CUR_IMAGE_FILE}" `   
  if [ "$1"x != ""x ] ; then
    CUR_LOFI_DEVICE="$1"
    LogMsg "Removing the lofi device \"${CUR_LOFI_DEVICE}\" for \"${CUR_IMAGE_FILE}\" ..."
    lofiadm -d "${CUR_IMAGE_FILE}"
    if [ $? -ne 0 ] ; then
      LogError "Can not remove the lofi device for \"${CUR_IMAGE_FILE}\ (\"${CUR_LOFI_DEVICE}\")"
      return 1
    fi  
  fi

  return 0
}

Mount_CDROM_Image() {
  CUR_MOUNT_DEVICE="$1"
  CUR_MOUNT_POINT="$2"

  mount | grep "^${CUR_MOUNT_POINT} " 1>/dev/null 2>/dev/null
  if [ $? -ne 0 ] ; then
    LogMsg "Mounting \"${CUR_MOUNT_POINT}\" to \"${CUR_MOUNT_DEVICE}\" ..."
    mount ${MOUNT_OPTIONS} "${CUR_MOUNT_DEVICE}" "${CUR_MOUNT_POINT}" 1>/dev/null 
    if [ $? -ne 0 ] ; then
      LogError "Can not mount \"${CUR_MOUNT_POINT}\" to \"${CUR_MOUNT_DEVICE}\""
      return 1
    fi
  fi

  return 0
}

Umount_CDROM_Image() {
  CUR_MOUNT_POINT="$1"

  mount | grep "^${CUR_MOUNT_POINT} " 1>/dev/null 2>/dev/null
  if [ $? -eq 0 ] ; then
    LogMsg "Umounting \"${CUR_MOUNT_POINT}\" ..."
    umount "${CUR_MOUNT_POINT}" 1>/dev/null 
    if [ $? -ne 0 ] ; then
      LogError "Can not umount \"${CUR_MOUNT_POINT}\""
      return 1
    fi
  fi

  return 0
}

Share_Directory() {
  if [ "${SHARE_OPTIONS}"x != "NO_SHARE"x ] ; then

    CUR_MOUNT_POINT="$1"

    share | grep " ${CUR_MOUNT_POINT} " 1>/dev/null 2>/dev/null
    if [ $? -ne 0 ] ; then
      LogMsg "Sharing \"${CUR_MOUNT_POINT}\" ..."
      share ${SHARE_OPTIONS} "${CUR_MOUNT_POINT}" 1>/dev/null 
      if [ $? -ne 0 ] ; then
        LogError "Can not share \"${CUR_MOUNT_POINT}\""
        return 1
      fi
    else
      LogMsg "\"${CUR_MOUNT_POINT}\" is already shared."
    fi
  else
      LogMsg " \"${CUR_MOUNT_POINT}\" will NOT be shared"      
  fi
  
  return 0
}


Unshare_Directory() {
  CUR_MOUNT_POINT="$1"

  share | grep " ${CUR_MOUNT_POINT} " 1>/dev/null 2>/dev/null
  if [ $? -eq 0 ] ; then
    LogMsg "Unsharing \"${CUR_MOUNT_POINT}\" ..."
    unshare "${CUR_MOUNT_POINT}" 1>/dev/null 
    if [ $? -ne 0 ] ; then
      LogError "Can not unshare \"${CUR_MOUNT_POINT}\""
      return 1
    fi
  fi

  return 0
}

#
# main code
#

  if [ "${ACTION}"x != "start"x -a "${ACTION}"x != "stop"x ] ; then
    echo "Usage: ${THISSCRIPT} [start|stop]"
    exit 255
  fi

#
# check if the config file exists
#
  if [ ! -f "${CONF_FILE}" ] ; then
    LogMsg "Config file \"${CONF_FILE}\" not found; using defaults."
    IMAGE_FILES="${DEF_IMAGE_FILES}"
  else
    LogMsg "Reading the config file \"${CONF_FILE}\" ..."
#    IMAGE_FILES=`cat "${CONF_FILE}"`
     . "${CONF_FILE}"
  fi


#
# remove comments and empty lines form the list of images and mountpotints 
#
  echo "${IMAGE_FILES}" | grep -v "^#" | grep -v "^$" | tr -s " "  >${TEMP_FILE}

#
# now do for each entry
#
  cat ${TEMP_FILE} | while read CURLINE ; do
    oIFS="${IFS}"
    IFS=";"
    set -- ${CURLINE}
    [ "$1"x = ""x ] && continue
        
    IFS="${oIFS}"
    IMAGE_FILE=`echo $1` 
    MOUNT_POINT=` echo $2` 
    MOUNT_OPTIONS=`echo $3` 
    SHARE_OPTIONS=`echo $4` 

    if [ "${IMAGE_FILE}"x = ""x -o "${MOUNT_POINT}"x = ""x ] ; then
      LogError "The line \"${CURLINE}\" of the config is invalid - ignored"
      continue
    fi
    
    if [ ! -f ${IMAGE_FILE} ] ; then
      LogError "The image file \"${IMAGE_FILE}\" does NOT exist"
      continue
    fi

    if [ ! -d "${MOUNT_POINT}" ] ; then
      LogError "The mount point \"${MOUNT_POINT}\" does NOT exist"
      continue
    fi

    [ "${MOUNT_OPTIONS}"x = "-"x -o "${MOUNT_OPTIONS}"x = ""x ] && MOUNT_OPTIONS="${DEF_MOUNT_OPTIONS}"
    [ "${SHARE_OPTIONS}"x = "-"x -o "${SHARE_OPTIONS}"x = ""x ] && SHARE_OPTIONS="${DEF_SHARE_OPTIONS}"

    case ${ACTION} in

    start )
      LogMsg "Starting the share for \"${IMAGE_FILE}\" (Mountpoint is \"${MOUNT_POINT}\") ..."
      Create_LOFI_Device "${IMAGE_FILE}" && \
      Mount_CDROM_Image  "${CUR_LOFI_DEVICE}" "${MOUNT_POINT}" && \
      Share_Directory    "${MOUNT_POINT}" 
      ;;

    stop  )
      LogMsg "Stopping the share for \"${IMAGE_FILE}\" (Mountpoint is \"${MOUNT_POINT}\") ..."
      Unshare_Directory  "${MOUNT_POINT}" && \
      Umount_CDROM_Image "${MOUNT_POINT}" && \
      Delete_LOFI_Device "${IMAGE_FILE}"
      ;;

    esac
  done
  [ -f "${TEMP_FILE}" ] && rm "${TEMP_FILE}" 1>/dev/null 2>/dev/null

exit 0

