#!/bin/bash
##########################################
#
################文件夹更名
#
##########################################
folderid=$1
foldername=$2
db=/etc/base/nasdb

[ -z "$folderid" -o -z "$foldername" ] && exit 1

folder=$(tersql -sql "select mntpath,ecryptfs from share where folder_id=$folderid" -only)
mntpath=$(echo $folder|jq -r .mntpath)
ecryptfs=$(echo $folder|jq -r .ecryptfs)

device=$(dirname "$mntpath")
old_foldername=$(basename "$mntpath")

is_running() {
	local exec=$1
	local result=$(pidof $exec 2>/dev/null)
	[ ! -z "$result" ] && {
		echo 0
	} || echo 1
}

service_action() {
	local act=$1
	ter_service samba $1 >/dev/null
	ter_service nfs-server $1 >/dev/null
	ter_service ftp $1 >/dev/null
}

umount_path() {
	local path=$1
	[ -z "$path" ] && return 1
	local num=0
	while [ $num -lt 3 ]; do
		umount -fl "$path"
		df-json | grep "$path" >/dev/null
		[ $? -ne 0 ] && break
		let num=num+1
	done
	# 判断是否umount成功...
	df-json | grep "$path" >/dev/null
	if [ $? -eq 0 ]; then
		return 1
	fi
	local name=$(basename "$path")
	rm -f "/mnt/${name}"
	rm -fr "$path"
	return 0
}

updatedb() {
	local new_name="$1"
	local new_path="${device}/${new_name}"
	tersql -sql "update share set foldername='$new_name',mntpath='$new_path' where folder_id=$folderid"
}

if [ $ecryptfs -eq 1 ]; then
	oldpath="${device}/@${old_foldername}@"
	newpath="${device}/@${foldername}@"
	[ -e "$newpath" ] && exit 1
	df-json | grep "$mntpath" >/dev/null
	if [ $? -eq 0 ]; then
		service_action stop
		umount_path "$mntpath"
		if [ $? -eq 0 ]; then
			mv -f "$oldpath" "$newpath"
			updatedb "${foldername}"
			service_action start
		fi
	else
		mv -f "$oldpath" "$newpath"
		updatedb "${foldername}"
	fi
else
	newpath="${device}/${foldername}"
	[ -e "$newpath" ] && exit 1
	mv -f "$mntpath" "$newpath"
	updatedb "${foldername}"
	[ $(is_running "smbd") -eq 0 ] && ter_service samba restart >/dev/null
	[ $(is_running "rpcbind") -eq 0 ] && ter_service nfs-server restart >/dev/null
	[ $(is_running "smbftpd") -eq 0 ] && ter_service ftp restart >/dev/null
fi

exit 0
