#!/bin/bash

##################################################
#                                                #
# SETTING FILE                                   #
# ~/.bashrc ~/.bash_profile                      #
# /etc/fstab-mountrc                             #
# ~/.fstab-mountrc                               #
#                                                #
# FSTAB_MOUNT_DIR = directory                    #
#         default = empty = "$HOME/.fstab-mount" #
#                                                #
# FSTAB_DO_NOT_OPEN_NAUTILUS = 1 or not 1        #
#                    default = empty = not 1     #
#  not 1 : open $FSTAB_MOUNT_DIR                 #
#      1 : do not open                           #
#                                                #
# FSTAB_MOUNT_DESKTOP_NO_ICON = 1 or not 1       #
#                     default = empty = not 1    #
#  not 1 : make icon in $HOME/Desktop            #
#      1 : do not make icon                      #
#                                                #
##################################################

# these shell scripts requires
# awk (gawk)
# bash
# grep
# mkdir (coreutils)
# sed
# /sbin/findfs (e2fsprogs)
# pgrep (procps)

# exit code
# 2 cannot mkdir -p
# 3 cannot cd

# user setting file
# ~/.fstab-mountrc

# japanese message
# $ xgettext -o hoge.po hoge.sh
# $ gtranslator hoge.po	 
# $ msgfmt -o hoge.mo hoge.po
if [ -z "$TEXTDOMAIN" ] ; then
    TEXTDOMAIN="fstab-user-mount-tool"
    TEXTDOMAINDIR="/usr/share/locale"
fi

# read /etc/fstab-mountrc
if [ -r "/etc/fstab-mountrc" ] ; then
    source /etc/fstab-mountrc
fi
# read ~/.fstab-mountrc
if [ -r "$HOME/.fstab-mountrc" ] ; then
    source $HOME/.fstab-mountrc
fi

if [ -n "$FSTAB_MOUNT_NO_ZENITY" ] || [ "$TERM" = "linux" ] ; then
    zenity_command=":"
else
    zenity_command="/usr/bin/zenity"
fi

# directory name
if [ -z "$FSTAB_MOUNT_DIR" ] ; then
    FSTAB_MOUNT_DIR="$HOME/.fstab-mount"
fi

# nautilus check
if [ "$TERM" = "linux" ] ; then
    NAUTILUS_IS_WORKING=0
else
    NAUTILUS_IS_WORKING="`/usr/bin/pgrep nautilus | /usr/bin/wc -l`"
fi

# directory check
DIRECTORY_EXISTS=0
if [ -d "$FSTAB_MOUNT_DIR" ] ; then
    DIRECTORY_EXISTS=1
fi

if ( ! /bin/mkdir -p "$FSTAB_MOUNT_DIR" ) ; then

    ERROR_MESSAGE_DIRECTORY_CREATE=$"error : cannot create temporal directory\n\$FSTAB_MOUNT_DIR : $FSTAB_MOUNT_DIR"
    /bin/echo -e "$ERROR_MESSAGE_DIRECTORY_CREATE" >&2
    exit 2

else
    if ( ! cd "$FSTAB_MOUNT_DIR" ) ; then
	ERROR_MESSAGE_DIRECTORY_USE=$"error : cannot use temporal directory\n\$FSTAB_MOUNT_DIR : $FSTAB_MOUNT_DIR"
	/bin/echo -e "$ERROR_MESSAGE_DIRECTORY_USE" >&2
	exit 3
    else

	MESSAGE_DIRECTORY_OK=$"fstab-user-mount uses Directory: $FSTAB_MOUNT_DIR"

	TEXT_ONLY_MESSAGE=$"* text-only-mode (\$TERM is linux or \$FSTAB_DO_NOT_OPEN_NAUTILUS is not empty) *\n"

	if [ -n "$1" ] ; then
	    if [ "$1" = "-v" ] ; then
		/bin/echo -e "$MESSAGE_DIRECTRORY_OK"

	    elif [ "$1" = "-a" ] ; then
		if [ -n "$2" ] ; then
		    device="$2"
		    FSTAB_DO_NOT_OPEN_NAUTILUS=1
		else
		    if [ -n "$FSTAB_MOUNT_NO_ZENITY" ] || [ "$TERM" = "linux" ] ; then
			ERROR_MESSAGE_NEED_ARGUMENT=$"$TEXT_ONLY_MESSAGE\n\
This option needs one or two arguments.\n\
fstab-user-mount -a device_name [link_name]\n\
\n\
example: fstab-user-mount -a /dev/cdrom\n\
create symbolic link: $FSTAB_MOUNT_DIR/_dev_cdrom\n\n\
example: fstab-user-mount -a /dev/cdrom cdrom\n\
create symbolic link: $FSTAB_MOUNT_DIR/cdrom"
			/bin/echo -e "$ERROR_MESSAGE_NEED_ARGUMENT" >&2
			exit
		    else
			cd /dev
			SELECT_DEVICE_MESSAGE=$"Select device for making symbolic link."
			device="`/usr/bin/zenity --file-selection --title=\"$SELECT_DEVICE_MESSAGE\"`"
		    fi
		fi
	    fi
	fi
	
	cd "$FSTAB_MOUNT_DIR"

	if [ "$DIRECTORY_EXISTS" -eq "0" ] ; then
	    for devices in `/usr/bin/awk -F "\#" '{print $1}' /etc/fstab | /usr/bin/awk '$4 ~ /user|owner|group/ {print $1, $2}' `
	    do test -L `/bin/echo $devices| /bin/sed s@/@_@g` || \
		if [ `/bin/echo "$devices" | /bin/grep -c "^LABEL="` -eq "1" ] ; then
		    device_name=`/sbin/findfs $devices`
		    /bin/ln -s "$device_name" "$devices"
		elif [ `/bin/echo "$devices" | /bin/grep -c "^UUID="` -eq "1" ] ; then
		    device_name=`/sbin/findfs $devices`
		    /bin/ln -s "$device_name" "$devices"
		else
		    /bin/ln -s "$devices" `/bin/echo $devices| /bin/sed s@/@_@g`
		fi
	    done
	fi
	
	function create_link {
	    if [ -e "$link_name" ] ; then
		/bin/echo -e $"error : $FSTAB_MOUNT_DIR/$link_name already exists." >&2
	    else
		/bin/ln -s "$device" "$link_name"
		/bin/echo -e $"create a symbolic link file $FSTAB_MOUNT_DIR/$link_name (link to $device)."
	    fi
	}
	
	if [ -e "$device" ] ; then
	    if [ -n "$3" ] ; then
		link_name="$3"
		create_link
	    else
		# $3 is empty
		if [ `/bin/echo "$device" | /bin/grep -c "^LABEL="` -eq "1" ] ; then
		    link_name="`/sbin/findfs $device`"
		    create_link
		elif [ `/bin/echo "$device" | /bin/grep -c "^UUID="` -eq "1" ] ; then
		    link_name="`/sbin/findfs $device`"
		    create_link
		else
		    link_name="`/bin/echo $device| /bin/sed s@/@_@g`"
		    create_link
		fi
	    fi
	fi
	
	# OPEN Nautilus
	
	if [ "$NAUTILUS_IS_WORKING" -gt "0" ] && [ -z "$FSTAB_DO_NOT_OPEN_NAUTILUS" ] ; then
	    if [ -z "$FSTAB_DO_NOT_OPEN_TRASH" ] ; then
		# open ~/.Trash
		if ( /bin/mkdir -p "$HOME/.Trash" ) ; then
		    WARNING_MESSAGE_TRASH=$"*DO NOT* use 'Empty Trash' in File menu on ~/.Trash.\nYou can use 'Trash' on Desktop."
		    $zenity_command --warning --text="$WARNING_MESSAGE_TRASH" >/dev/null &
		    /usr/bin/nautilus "$HOME/.Trash"
		fi
	    fi
	    exec /usr/bin/nautilus "$FSTAB_MOUNT_DIR"
	else
	    #  argument($2) is empty
	    if [ -z "$2" ] ; then
		# TERM is linux or FSTAB_DO_NOT_OPEN_NAUTILUS
		/bin/echo -e "$MESSAGE_DIRECTORY_OK"
		/bin/echo -e "$TEXT_ONLY_MESSAGE"
	    fi
	fi
    fi
fi

# EOF
