- Implemented iSCSI discovery to enable first-time connections to function. Needs Testing!
199 lines
4.4 KiB
Bash
Executable File
199 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
_RELEASE_VER="0.98.5.3"
|
|
|
|
# Do not modify
|
|
_CUSTOM_CONF_FILE=$1
|
|
_MONITOR_PROC_CNT=
|
|
_ISCSI_CON=
|
|
_FLAG_FORCE=0
|
|
_FLAG_QUIET=0
|
|
|
|
# The use of iscsiadm requires admin privilages
|
|
read_iscsi_con (){ _ISCSI_CON=$(iscsiadm -m session 2>&1 /dev/null | grep -v "No active sessions"*); }
|
|
|
|
load_conf_file (){
|
|
_default_conf_file=$(echo /etc/smart-iscsi/$_CUSTOM_CONF_FILE.conf)
|
|
|
|
if [ -e $_default_conf_file ]
|
|
then
|
|
source $_default_conf_file
|
|
else
|
|
if [ -e $_CUSTOM_CONF_FILE ]
|
|
then
|
|
source $_CUSTOM_CONF_FILE
|
|
else
|
|
echo "ERROR: Config file not specified!"
|
|
exit 2;
|
|
fi
|
|
fi
|
|
|
|
# Set variables once valid config file has been loaded
|
|
_MONITOR_PROC_CNT=$(pgrep -f $MONITOR_PROC | wc -l)
|
|
}
|
|
|
|
show_help (){
|
|
echo "Smart iSCSI Mounter v$_RELEASE_VER - Help"
|
|
echo ""
|
|
echo " [EXECUTABLE] [CONFIG FILE] [OVERRIDE] [FUNCTION]"
|
|
echo "Example: smart-iscsi config-file -q -m"
|
|
echo "Example using fixed path: smart-iscsi ~/config-file.conf -q -m"
|
|
echo ""
|
|
echo "Config files:"
|
|
echo "Place config files inside '/etc/smart-iscsi' and call them without the '.conf' extension."
|
|
echo "Configs outside '/etc/smart-iscsi' must be called using their full path."
|
|
echo ""
|
|
echo "Sample config file (/etc/smart-iscsi/config-file.conf):"
|
|
echo "DISK_UUID=\"ABCDEFGHIJK\" # UUID of mounted disk."
|
|
echo "IQN=\"iqn.2000-01.com.synology:NAS.MyPool\" # IQN of iSCSI mount."
|
|
echo "PORTAL_IP=\"192.168.0.1\" # IP of IQN portal."
|
|
echo "MOUNT_DIR=\"/home/username/VMs\" # Mount location."
|
|
echo "MONITOR_PROC=\"vmware\" # Process name to block un-mount process, requires below count to be set."
|
|
echo "MONITOR_PROC_CNT=7 # Processes above this number will counter un-mount."
|
|
echo ""
|
|
echo "Overrides:"
|
|
echo "'-q (--quiet)'"
|
|
echo "'-f (--force)'"
|
|
echo ""
|
|
echo "Functions:"
|
|
echo "'-m (--mount)'"
|
|
echo "'-u (--umount)'"
|
|
echo "'-s (--status)'"
|
|
echo "'-r (--release)'"
|
|
echo "'-h (--help)'"
|
|
echo ""
|
|
}
|
|
|
|
report_status (){
|
|
if [ ${_FLAG_QUIET} == 0 ]
|
|
then
|
|
echo "[Showing status of mount-point]"
|
|
echo "INFO: Process '${MONITOR_PROC}' has ${_MONITOR_PROC_CNT} instances running."
|
|
|
|
if [ $(ls $MOUNT_DIR/. | wc -l) -ge 1 ]
|
|
then
|
|
echo ""
|
|
echo "Directory is mounted at:" $MOUNT_DIR
|
|
else
|
|
echo ""
|
|
echo "Directory is un-mounted from:" $MOUNT_DIR
|
|
fi
|
|
|
|
read_iscsi_con
|
|
echo ""
|
|
echo "There is/are currently '$(${_ISCSI_CON} 2>&1 | wc -l)' iSCSI connection(s) open:"
|
|
echo "${_ISCSI_CON}"
|
|
fi
|
|
}
|
|
|
|
check_proc_status (){
|
|
if [ ${_MONITOR_PROC_CNT} -gt $MONITOR_PROC_CNT ]
|
|
then
|
|
echo "WARNING: process '${MONITOR_PROC}' is still running, unable to unmount volume safely."
|
|
exit 2;
|
|
else
|
|
if [ ${_FLAG_QUIET} == 0 ]
|
|
then
|
|
echo "INFO: Process ${MONITOR_PROC} is not running."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
mount_func (){
|
|
if [ ${_FLAG_QUIET} == 0 ]
|
|
then
|
|
echo "[Attempting to mount iSCSI volume]"
|
|
fi
|
|
|
|
if [[ ${_ISCSI_CON} == *${IQN}* ]] && [[ $_FLAG_FORCE -eq 0 ]]
|
|
then
|
|
echo ""
|
|
echo "WARNING: You're already connected to the '${IQN}' iSCSI target."
|
|
echo "Use the -f (--force) flag to bypass this warning."
|
|
exit 2;
|
|
fi
|
|
|
|
iscsiadm --mode discovery -t sendtargets --portal $PORTAL_IP > /dev/null 2>&1
|
|
iscsiadm --mode node --targetname $IQN --portal $PORTAL_IP --login > /dev/null 2>&1
|
|
sleep 3
|
|
mount /dev/disk/by-uuid/$DISK_UUID $MOUNT_DIR -o noauto,noperm
|
|
}
|
|
|
|
umount_func (){
|
|
if [ ${_FLAG_QUIET} == 0 ]
|
|
then
|
|
echo "[Attempting to un-mount iSCSI volume]"
|
|
fi
|
|
|
|
if [[ $_FLAG_FORCE -eq 0 ]]; then
|
|
check_proc_status
|
|
fi
|
|
|
|
if [[ ${_ISCSI_CON} != *${IQN}* ]] && [[ $_FLAG_FORCE -eq 0 ]]
|
|
then
|
|
echo ""
|
|
echo "WARNING: You're not currently connected to the '${IQN}' iSCSI target."
|
|
echo "Use the -f (--force) flag to bypass this warning."
|
|
exit 2;
|
|
fi
|
|
|
|
umount -l $MOUNT_DIR
|
|
sleep 3
|
|
iscsiadm --mode node --targetname $IQN --portal $PORTAL_IP --logout > /dev/null 2>&1
|
|
}
|
|
|
|
check_admin (){
|
|
if [[ $EUID -ne 0 ]]
|
|
then
|
|
echo "This command requires root, please re-run with appropriate permissions."
|
|
exit 1;
|
|
fi
|
|
}
|
|
|
|
# Process input parameters
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
-q|--quiet)
|
|
_FLAG_QUIET=1
|
|
shift
|
|
;;
|
|
-f|--force)
|
|
_FLAG_FORCE=1
|
|
shift
|
|
;;
|
|
-m|--mount)
|
|
check_admin
|
|
load_conf_file
|
|
read_iscsi_con
|
|
mount_func
|
|
report_status
|
|
shift
|
|
;;
|
|
-u|--umount)
|
|
check_admin
|
|
load_conf_file
|
|
read_iscsi_con
|
|
umount_func
|
|
report_status
|
|
shift
|
|
;;
|
|
-s|--status)
|
|
check_admin
|
|
load_conf_file
|
|
read_iscsi_con
|
|
report_status
|
|
shift
|
|
;;
|
|
-r|--release)
|
|
echo "Smart iSCSI Mounter v$_RELEASE_VER"
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
show_help
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
exit 0;
|