#!/bin/bash
# License: GPL 
# Author: Steven Shiau <steven _at_ nchc org tw>

# Load DRBL setting and functions
if [ ! -f "/opt/drbl/sbin/drbl-conf-functions" ]; then
  echo "Unable to find /opt/drbl/sbin/drbl-conf-functions! Program terminated!" 
  exit 1
fi
. /opt/drbl/sbin/drbl-conf-functions

# Load some necessary setting from drbl-ocs.conf
. /opt/drbl/conf/drbl-ocs.conf

# Load basic functions of ocs
. /opt/drbl/sbin/ocs-functions

# Load the config in ocs-live.conf. This is specially for Clonezilla live. It will overwrite some settings of /opt/drbl/conf/drbl-ocs.conf, such as $DIA...
[ -e "/etc/ocs/ocs-live.conf" ] && . /etc/ocs/ocs-live.conf

#
check_if_root

# functions
USAGE() {
    echo "Usage:"
    echo "Prepare the clonezilla image dir"
    echo "$0 [OPTION]"
    language_help_prompt_by_idx_no
    dialog_like_prog_help_prompt
    echo "Ex. $0 -l en"
}
prepare_mnt_point_ocsroot() {
  if ! mountpoint $ocsroot &>/dev/null; then
    echo "Umounting the existing $ocsroot..."
    umount $ocsroot
  fi
  echo "Preparing the mount point $ocsroot..."
  [ -L "$ocsroot" ] && rm -f $ocsroot
  [ ! -d "$ocsroot" ] && mkdir -p $ocsroot
  if [ ! -d "$ocsroot" ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "$ocsroot is NOT a directory! Failed to create directory $ocsroot! No mount point for $ocsroot!"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "$msg_program_stop!"
    exit 1
  fi
}
check_if_ocsroot_a_mountping() {
  # check if $ocsroot is a mounting point
  if ! mountpoint $ocsroot &>/dev/null; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "Clonezilla image home directory $ocsroot is not a mouting point! Failed to mount other device as $ocsroot!"
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    echo "$msg_program_stop!"
    exit 1
  fi
}
do_mount_local_dev() {
   local target_part part_fs # target_part is like hda1, sda1...
   prepare_mnt_point_ocsroot
   echo "Mounting local dev as $ocsroot..."
   ANS_TMP=`mktemp /tmp/ocs_ans.XXXXXX`
   trap "[ -f "$ANS_TMP" ] && rm -f $ANS_TMP" HUP INT QUIT TERM EXIT
   get_input_dev_name $ANS_TMP partition radiolist yes "$msg_device_to_mount_as_ocsroot_do_not_mount_target_dev"
   # we have to remove " (comes with checklist in dialog) so that for loop
   # will work (Specially for FC3/4...)
   target_part="$(cat $ANS_TMP | tr -d \")"
   [ -f "$ANS_TMP" ] && rm -f $ANS_TMP
   [ -z "$target_part" ] && exit 1
   check_input_partition $target_part
   # check if $target_part is ntfs or others
   part_fs="$(get_part_info /dev/$target_part filesystem)"
   echo "/dev/$target_part filesystem: $part_fs"
   case "$part_fs" in 
     ntfs) 
           echo ntfs-3g /dev/$target_part $ocsroot
           ntfs-3g /dev/$target_part $ocsroot
	   ;;
     *)    echo mount -t auto /dev/$target_part $ocsroot
           mount -t auto /dev/$target_part $ocsroot 
	   ;;
   esac
   check_if_ocsroot_a_mountping
} # end of check_if_ocsroot_a_mountping
do_mount_ssh_server(){
   local TMP srv_default ssh_srv ssh_account sshfs_dir
   prepare_mnt_point_ocsroot
   echo "Mounting remote directory in ssh server as $ocsroot..."
   # sshfs ACCOUNT@SSH_SERVER:/ABSOLUTE_PATH $ocsroot
   TMP=$(mktemp /tmp/sshfs_tmp.XXXXXX)
   trap "[ -f "$TMP" ] && rm -f $TMP" HUP INT QUIT TERM EXIT
   # (1) ssh server IP address or FQDN
   srv_default="$(LC_ALL=C route -n | grep "^0.0.0.0" | awk -F" " '{print $2}')"
   while [ -z "$ssh_srv" ]; do
     $DIA --backtitle "$msg_nchc_free_software_labs" --title  \
     "Mount sshfs" --inputbox "$msg_ip_address_or_FQDN_of_server:" \
     0 0 $srv_default $DIA_ESC \
     2> $TMP
     ssh_srv="$(cat $TMP)"
   done
   echo "SSH server is: $ssh_srv"
   # clean tmp file
   echo "" > $TMP
   # (2) account
   while [ -z "$ssh_account" ]; do
     $DIA --backtitle "$msg_nchc_free_software_labs" --title  \
     "Mount sshfs" --inputbox "$msg_account_in_server, $msg_ex root:" \
     0 0 root $DIA_ESC \
     2> $TMP
     ssh_account="$(cat $TMP)"
   done
   echo "SSH account in $ssh_srv is: $ssh_account"
   # clean tmp file
   echo "" > $TMP
   # (3) absolute path 
   while [ -z "$sshfs_dir" ]; do
     $DIA --backtitle "$msg_nchc_free_software_labs" --title  \
     "Mount sshfs" --inputbox "$msg_sshfs_dir_path, $msg_ex $ocsroot" \
     0 0 $ocsroot $DIA_ESC \
     2> $TMP
     sshfs_dir="$(cat $TMP)"
   done
   echo "sshfs dir in $sshfs_dir is: $sshfs_dir"
   $DIA --backtitle "$msg_nchc_free_software_labs" --title "Mount sshfs" \
   --msgbox "$msg_now_you_have_to_enter_passwd: $ssh_account@$ssh_srv:$sshfs_dir" 0 0 
   [ -f "$TMP" ] && rm -f $TMP
   echo "Mouting sshfs by:"
   echo "sshfs $ssh_account@$ssh_srv:$sshfs_dir $ocsroot"
   sshfs $ssh_account@$ssh_srv:$sshfs_dir $ocsroot
   check_if_ocsroot_a_mountping
} # end of do_mount_ssh_server
#
do_mount_samba_server(){
   local TMP srv_default smb_srv smb_account sshfs_dir
   prepare_mnt_point_ocsroot
   echo "Mounting remote directory in Samba server as $ocsroot..."
   # mount -t cifs -o username=your_user_name //192.168.200.254/work/smb /home/partimag
   TMP=$(mktemp /tmp/cifs_tmp.XXXXXX)
   trap "[ -f "$TMP" ] && rm -f $TMP" HUP INT QUIT TERM EXIT
   # (1) samba server IP address or FQDN
   srv_default="$(LC_ALL=C route -n | grep "^0.0.0.0" | awk -F" " '{print $2}')"
   while [ -z "$smb_srv" ]; do
     $DIA --backtitle "$msg_nchc_free_software_labs" --title  \
     "Mount Samba server" --inputbox "$msg_ip_address_or_FQDN_of_server:" \
     0 0 $srv_default $DIA_ESC \
     2> $TMP
     smb_srv="$(cat $TMP)"
   done
   echo "Samba server is: $smb_srv"
   # clean tmp file
   echo "" > $TMP
   # (2) account
   while [ -z "$smb_account" ]; do
     $DIA --backtitle "$msg_nchc_free_software_labs" --title  \
     "Mount Samba server" --inputbox "$msg_account_in_server, $msg_ex administrator:" \
     0 0 administrator $DIA_ESC \
     2> $TMP
     smb_account="$(cat $TMP)"
   done
   echo "Account in $smb_srv is: $smb_account"
   # clean tmp file
   echo "" > $TMP
   # (3) absolute path 
   while [ -z "$smbfs_dir" ]; do
     $DIA --backtitle "$msg_nchc_free_software_labs" --title  \
     "Mount Samba server" --inputbox "$msg_smbfs_dir_path, $msg_ex /work/smb:" \
     0 0 /work/smb $DIA_ESC \
     2> $TMP
     smbfs_dir="$(cat $TMP)"
   done
   echo "The dir in $smbfs_dir is: $smbfs_dir"
   $DIA --backtitle "$msg_nchc_free_software_labs" --title "Mount Samba server" \
   --msgbox "$msg_now_you_have_to_enter_passwd $smb_account@$smb_srv:$smbfs_dir" 0 0 
   [ -f "$TMP" ] && rm -f $TMP
   echo "Mouting samba server by:"
   echo "mount -t cifs -o username=$smb_account //$smb_srv/$smbfs_dir $ocsroot" 
   mount -t cifs -o username=$smb_account //$smb_srv/$smbfs_dir $ocsroot
   check_if_ocsroot_a_mountping
} # end of do_mount_samba_server
#
find_ocsroot_dev_description(){
  local ocsroot_parent
  # find $ocsroot source
  if mountpoint $ocsroot &>/dev/null; then
    # it's a mountpoint, should be writable, but who knows ? test it...
    if touch $ocsroot/rw_test &>/dev/null; then
      livemedia_des="$msg_writable_dev_ex_usb_stick"
    else
      livemedia_des="$msg_readonly_dev_ex_CD"
    fi
    [ -e "$ocsroot/rw_test" ] && rm -f $ocsroot/rw_test
  elif [ -L "$ocsroot" ]; then
    # it's a symbolic link file, find it's parent.
    # Ex. file drbl
    # drbl: symbolic link to `/opt/drbl/'
    # file drbl | sed -e "s/^.*: symbolic link to //g" -e "s/[\`']//g"
    ocsroot_parent="$(file $ocsroot | sed -e "s/^.*: symbolic link to //g" -e "s/[\`']//g")"
    if touch /$ocsroot_parent/rw_test &>/dev/null; then
      livemedia_des="$msg_writable_dev_ex_usb_stick"
    else
      livemedia_des="$msg_readonly_dev_ex_CD"
    fi
    [ -e "$ocsroot_parent/rw_test" ] && rm -f $ocsroot_parent/rw_test
  elif [ -d "$ocsroot" ]; then
    # regular directory, must be ram disk based on unionfs
    livemedia_des="$msg_writable_dev_ramdisk"
  else
    # what else ?
    livemedia_des="$msg_unknown"
  fi
} # end of find_ocsroot_dev_description

#
while [ $# -gt 0 ]; do
  case "$1" in
    -l|--language)
            shift; n_shift=$((n_shift+1))
            if [ -z "$(echo $1 |grep ^-.)" ]; then
              # skip the -xx option, in case 
	      specified_lang="$1"
              shift; n_shift=$((n_shift+1))
            fi
            [ -z "$specified_lang" ] && USAGE && exit 1
	    ;;
    -d0|--dialog)  
	    DIA="dialog" 
	    shift;;
    -d1|--Xdialog)  
	    DIA="Xdialog" 
	    shift;;
    -d2|--whiptail)  
	    DIA="whiptail" 
	    shift;;
    -d3|--gdialog)  
	    DIA="gdialog" 
	    shift;;
    -d4|--kdialog)  
	    DIA="kdialog" 
	    shift;;
    -*)     echo "${0}: ${1}: invalid option" >&2
            USAGE >& 2
            exit 2 ;;
    *)      break ;;
  esac
done
#
ask_and_load_lang_set $specified_lang

# check DIA
check_DIA_set_ESC $DIA

##############
#### main ####
##############

#
find_ocsroot_dev_description
#
TMP=$(mktemp /tmp/ocsrootmenu.XXXXXX)
trap "[ -f "$TMP" ] && rm -f $TMP" HUP INT QUIT TERM EXIT
$DIA --backtitle "$msg_nchc_free_software_labs" --title  \
"$msg_mount_ocsroot_img_hint_short_des" --radiolist "$msg_mount_ocsroo_img_hint_long_des\n$msg_choose_mode:" \
0 0 0 $DIA_ESC \
"from_local_dev"    "$msg_mount_local_dev" off \
"from_ssh_server"   "$msg_mount_sshfs" off \
"from_samba_server" "$msg_mount_smbfs" off \
"enter_shell"       "$msg_enter_cml, $msg_do_it_manually" on \
"skip"              "$msg_skip_this_use_existing_ocsroot ($livemedia_des)" off \
2> $TMP
ocsroot_src="$(cat $TMP)"
echo "ocsroot device is $ocsroot_src"
[ -f "$TMP" ] && rm -f $TMP

case "$ocsroot_src" in
  from_local_dev)
      do_mount_local_dev;;
  from_ssh_server)
      do_mount_ssh_server;;
  from_samba_server)
      do_mount_samba_server;;
  enter_shell) 
      echo $msg_enter_another_shell_hint
      echo -n "$msg_press_enter_to_continue..."
      read
      /bin/bash
      ;;
  skip)
      echo "$msg_existing_setting_is:"
      df -h
      exit 0
      ;;
esac

echo "done!"
exit 0
