#!/bin/bash
# Author:  yeho <lj2007331 AT gmail.com>
# BLOG:  https://linuxeye.com
#
# Notes: OneinStack for CentOS/RedHat 7+ Debian 9+ and Ubuntu 16+
#
# Project home page:
#       https://oneinstack.com
#       https://github.com/oneinstack/oneinstack

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
clear
printf "
#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 9+ and Ubuntu 16+      #
#                 FTP virtual user account management                 #
#       For more information please visit https://oneinstack.com      #
#######################################################################
"
# Check if user is root
[ $(id -u) != "0" ] && { echo "${CFAILURE}Error: You must be root to run this script${CEND}"; exit 1; }

oneinstack_dir=$(dirname "`readlink -f $0`")
pushd ${oneinstack_dir} > /dev/null
. ./options.conf
. ./include/color.sh

[ ! -d "${pureftpd_install_dir}" ] && { echo "${CFAILURE}FTP server does not exist! ${CEND}"; exit 1; }

FTP_conf=${pureftpd_install_dir}/etc/pure-ftpd.conf
FTP_tmp_passfile=${pureftpd_install_dir}/etc/pureftpd_psss.tmp
Puredbfile=${pureftpd_install_dir}/etc/pureftpd.pdb
Passwdfile=${pureftpd_install_dir}/etc/pureftpd.passwd
FTP_bin=${pureftpd_install_dir}/bin/pure-pw
[ -z "`grep ^PureDB ${FTP_conf}`" ] && { echo "${CFAILURE}pure-ftpd is not own password database${CEND}" ; exit 1; }

ARG_NUM=$#
Show_Help() {
  echo
  echo "Usage: $0  command ...[parameters]....
  --help, -h                          Show this help message
  --useradd,--add                     Add username
  --usermod                           Modify directory
  --passwd                            Modify password
  --userdel,--delete                  Delete User
  --listalluser,--list                List all User
  --showuser                          List User details
  --username,-u     [ftp username]    Ftp username
  --password,-p     [ftp password]    Ftp password
  --directory,-d,-D [ftp directory]   Ftp home directory
  "
}

TEMP=`getopt -o hu:p:d:D: --long help,useradd,add,usermod,passwd,userdel,delete,listalluser,list,showuser,username:,password:,directory: -- "$@" 2>/dev/null`
[ $? != 0 ] && echo "${CWARNING}ERROR: unknown argument! ${CEND}" && Show_Help && exit 1
eval set -- "${TEMP}"
while :; do
  [ -z "$1" ] && break;
  case "$1" in
    -h|--help)
      Show_Help; exit 0
      ;;
    --add|--useradd)
      useradd_flag=y; shift 1
      ;;
    --usermod)
      usermod_flag=y; shift 1
      ;;
    --passwd)
      passwd_flag=y; shift 1
      ;;
    --delete|--userdel)
      userdel_flag=y; shift 1
      ;;
    --list|--listalluser)
      listalluser_flag=y; shift 1
      ;;
    --showuser)
      showuser_flag=y; shift 1
      ;;
    -u|--username)
      username_flag=y; User=$2; shift 2
      ;;
    -p|--password)
      password_flag=y; Password=$2; shift 2
      ;;
    -d|-D|--directory)
      directory_flag=y; Directory=$2; shift 2
      ;;
    --)
      shift
      ;;
    *)
      echo "${CWARNING}ERROR: unknown argument! ${CEND}" && Show_Help && exit 1
      ;;
  esac
done

USER() {
  while :; do
    if [ "${username_flag}" != 'y' ]; then
      echo
      read -e -p "Please input a username: " User
    fi
    if [ -z "${User}" ]; then
      echo "${CWARNING}username can't be NULL! ${CEND}"
    else
      break
    fi
  done
}

PASSWORD() {
  while :; do
    if [ "${password_flag}" != 'y' ]; then
      echo
      read -e -p "Please input the password: " Password
    fi
    [ -n "`echo ${Password} | grep '[+|&]'`" ] && { echo "${CWARNING}input error,not contain a plus sign (+) and &${CEND}"; continue; }
    if (( ${#Password} >= 5 )); then
      echo -e "${Password}\n${Password}" > ${FTP_tmp_passfile}
      break
    else
      echo "${CWARNING}Ftp password least 5 characters! ${CEND}"
    fi
  done
}

DIRECTORY() {
  while :; do
    if [ "${directory_flag}" != 'y' ]; then
      echo
      read -e -p "Please input the directory(Default directory: ${wwwroot_dir}): " Directory
    fi
    Directory=${Directory:-${wwwroot_dir}}
    if [ ! -d "${Directory}" ]; then
      echo "${CWARNING}The directory does not exist${CEND}"
    else
      break
    fi
  done
}

UserAdd() {
  USER
  [ -e "${Passwdfile}" ] && [ -n "`grep ^${User}: ${Passwdfile}`" ] && { echo "${CQUESTION}[${User}] is already existed! ${CEND}"; exit 1; }
  PASSWORD;DIRECTORY
  ${FTP_bin} useradd ${User} -f ${Passwdfile} -u ${run_user} -g ${run_group} -d ${Directory} -m < ${FTP_tmp_passfile}
  ${FTP_bin} mkdb ${Puredbfile} -f ${Passwdfile} > /dev/null 2>&1
  echo "#####################################"
  echo
  echo "[${User}] create successful! "
  echo
  echo "You user name is : ${CMSG}${User}${CEND}"
  echo "You Password is : ${CMSG}${Password}${CEND}"
  echo "You directory is : ${CMSG}${Directory}${CEND}"
  echo
}

UserMod() {
  USER
  [ -e "${Passwdfile}" ] && [ -z "`grep ^${User}: ${Passwdfile}`" ] && { echo "${CQUESTION}[${User}] was not existed! ${CEND}"; exit 1; }
  DIRECTORY
  ${FTP_bin} usermod ${User} -f ${Passwdfile} -d ${Directory} -m
  ${FTP_bin} mkdb ${Puredbfile} -f ${Passwdfile} > /dev/null 2>&1
  echo "#####################################"
  echo
  echo "[${User}] modify a successful! "
  echo
  echo "You user name is : ${CMSG}${User}${CEND}"
  echo "You new directory is : ${CMSG}${Directory}${CEND}"
  echo
}

UserPasswd() {
  USER
  [ -e "${Passwdfile}" ] && [ -z "`grep ^${User}: ${Passwdfile}`" ] && { echo "${CQUESTION}[${User}] was not existed! ${CEND}"; exit 1; }
  PASSWORD
  ${FTP_bin} passwd ${User} -f ${Passwdfile} -m < ${FTP_tmp_passfile}
  ${FTP_bin} mkdb ${Puredbfile} -f ${Passwdfile} > /dev/null 2>&1
  echo "#####################################"
  echo
  echo "[${User}] Password changed successfully! "
  echo
  echo "You user name is : ${CMSG}${User}${CEND}"
  echo "You new password is : ${CMSG}${Password}${CEND}"
  echo
}

UserDel() {
  if [ ! -e "${Passwdfile}" ]; then
    echo "${CQUESTION}User was not existed! ${CEND}"
  else
    ${FTP_bin} list
  fi

  USER
  [ -e "${Passwdfile}" ] && [ -z "`grep ^${User}: ${Passwdfile}`" ] && { echo "${CQUESTION}[${User}] was not existed! ${CEND}"; exit 1; }
  ${FTP_bin} userdel ${User} -f ${Passwdfile} -m
  ${FTP_bin} mkdb ${Puredbfile} -f ${Passwdfile} > /dev/null 2>&1
  echo
  echo "[${User}] have been deleted! "
}

ListAllUser() {
  if [ ! -e "${Passwdfile}" ]; then
    echo "${CQUESTION}User was not existed! ${CEND}"
  else
    ${FTP_bin} list
  fi
}

ShowUser() {
  USER
  [ -e "${Passwdfile}" ] && [ -z "`grep ^${User}: ${Passwdfile}`" ] && { echo "${CQUESTION}[${User}] was not existed! ${CEND}"; exit 1; }
  ${FTP_bin} show ${User}
}

Menu() {
  while :; do
    printf "
What Are You Doing?
\t${CMSG}1${CEND}. UserAdd
\t${CMSG}2${CEND}. UserMod
\t${CMSG}3${CEND}. UserPasswd
\t${CMSG}4${CEND}. UserDel
\t${CMSG}5${CEND}. ListAllUser
\t${CMSG}6${CEND}. ShowUser
\t${CMSG}q${CEND}. Exit
"
    read -e -p "Please input the correct option: " Number
    if [[ ! ${Number} =~ ^[1-6,q]$ ]]; then
      echo "${CFAILURE}input error! Please only input 1~6 and q${CEND}"
    else
      case "${Number}" in
      1)
        UserAdd
        ;;
      2)
        UserMod
        ;;
      3)
        UserPasswd
        ;;
      4)
        UserDel
        ;;
      5)
        ListAllUser
        ;;
      6)
        ShowUser
        ;;
      q)
        exit
        ;;
      esac
    fi
  done
}

if [ ${ARG_NUM} == 0 ]; then
  Menu
else
  [ "${useradd_flag}" == 'y' ] && UserAdd
  [ "${usermod_flag}" == 'y' ] && UserMod
  [ "${passwd_flag}" == 'y' ] && UserPasswd
  [ "${userdel_flag}" == 'y' ] && UserDel
  [ "${listalluser_flag}" == 'y' ] && ListAllUser
  [ "${showuser_flag}" == 'y' ] && ShowUser
fi
