175 lines
4 KiB
Bash
175 lines
4 KiB
Bash
|
#!/bin/bash
|
|||
|
|
|||
|
############################################################
|
|||
|
# #
|
|||
|
# EvoAdmin : gestion des comptes FTP virtuels de ProFTPd #
|
|||
|
# #
|
|||
|
# Copyright (c) 2009 Evolix - Tous droits reserves #
|
|||
|
# #
|
|||
|
# @author Sebastien Palma <spalma@evolix.fr> #
|
|||
|
# @version 1.0 #
|
|||
|
# #
|
|||
|
############################################################
|
|||
|
|
|||
|
# vim: expandtab softtabstop=4 tabstop=4 shiftwidth=4 showtabline=2
|
|||
|
|
|||
|
VPASSWD_PATH="/etc/proftpd/vpasswd"
|
|||
|
FTPLOG_PATH="/var/log/evolix-ftp.log"
|
|||
|
|
|||
|
usage() {
|
|||
|
|
|||
|
cat <<EOT >&2
|
|||
|
|
|||
|
Usage: $0 [ACTION UID [PARAMS]]
|
|||
|
|
|||
|
Manage ProFTPd virtual accounts.
|
|||
|
|
|||
|
-a ACTION
|
|||
|
l (list), a (add), m (modify), d (delete) ProFTPd virtual account(s)
|
|||
|
|
|||
|
-u UID
|
|||
|
UID of the real account the virtual FTP accounts will be related to
|
|||
|
|
|||
|
Available PARAMS are :
|
|||
|
|
|||
|
-n ACCOUNTNAME
|
|||
|
Name of the ProFTPd virtual account you want to add/edit/delete.
|
|||
|
Mandatory in all actions.
|
|||
|
|
|||
|
-f FOLDER
|
|||
|
Directory that the virtual account will have as home directory.
|
|||
|
Mandatory for add and modify action.
|
|||
|
|
|||
|
-p PASSWD
|
|||
|
Password for the virtual account.
|
|||
|
Mandatory for add and modify action.
|
|||
|
|
|||
|
EOT
|
|||
|
}
|
|||
|
|
|||
|
log_msg() {
|
|||
|
curdate=`date +"%Y/%m/%d %H:%M:%S"`
|
|||
|
echo "$curdate $1" >>$FTPLOG_PATH
|
|||
|
}
|
|||
|
|
|||
|
get_user_login_by_UID() {
|
|||
|
uid=$1
|
|||
|
grep $uid /etc/passwd | awk -F : "{if (\$3==$uid) print \$1}"
|
|||
|
}
|
|||
|
|
|||
|
list_accounts_by_UID() {
|
|||
|
uid=$1
|
|||
|
|
|||
|
account_list=''
|
|||
|
oldIFS=IFS
|
|||
|
IFS=$'\n'
|
|||
|
|
|||
|
for line in `cat $VPASSWD_PATH`
|
|||
|
do
|
|||
|
line_uid=`echo $line | cut -d":" -f3`
|
|||
|
|
|||
|
if [ ! "$uid" ] || [ "$line_uid" == "$uid" ]; then
|
|||
|
username=`get_user_login_by_UID $line_uid`
|
|||
|
account=`echo $line | cut -d":" -f1`
|
|||
|
path=`echo $line | cut -d":" -f6`
|
|||
|
if [ -r $path/.size ]; then
|
|||
|
size=`cat $path/.size`
|
|||
|
else
|
|||
|
size=0
|
|||
|
fi
|
|||
|
#modif=`cat $path/.lastmodified`
|
|||
|
# Passage en minuscule ?
|
|||
|
#account=`echo $account | tr '[A-Z]' '[a-z]'`
|
|||
|
#path=`echo $path | tr '[A-Z]' '[a-z]'`
|
|||
|
|
|||
|
account_list="${account_list}$username:$account:$path:$size:$modif\n"
|
|||
|
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
echo "$account_list"
|
|||
|
|
|||
|
IFS=$oldIFS
|
|||
|
}
|
|||
|
|
|||
|
add_account() {
|
|||
|
user_id=$1
|
|||
|
account_name=$2
|
|||
|
path=$3
|
|||
|
passwd=$4
|
|||
|
|
|||
|
cmd="{if (\$3==$user_id) print \$4}"
|
|||
|
user_gid=`awk -F : "$cmd" /etc/passwd`
|
|||
|
|
|||
|
# Si le répoertoire de travail du compte FTP n'existe pas, on le crée
|
|||
|
if [ ! -d "$path" ]; then
|
|||
|
mkdir -p $path
|
|||
|
chown $user_id:$user_gid $path
|
|||
|
# fix by tmartin : s/655/755/
|
|||
|
chmod 755 $path
|
|||
|
setfacl -R -d -m 'o:rX' $path
|
|||
|
fi
|
|||
|
|
|||
|
echo `echo $passwd | ftpasswd --passwd --file=$VPASSWD_PATH --name=$account_name --uid=$user_id --gid=$user_gid --home=$path --shell=/bin/false --stdin`
|
|||
|
log_msg "Creation du compte $account_name (uid=$user_id, gid=$user_gid, home=$path)"
|
|||
|
}
|
|||
|
|
|||
|
edit_password() {
|
|||
|
account_name=$1
|
|||
|
passwd=$2
|
|||
|
|
|||
|
echo `echo $passwd | ftpasswd --passwd --file=$VPASSWD_PATH --name=$account_name --uid=9999 --gid=9999 --home=/dev/null --shell=/dev/null --change-password --stdin`
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
delete_account() {
|
|||
|
|
|||
|
account_name=$1
|
|||
|
|
|||
|
echo `ftpasswd --passwd --file=$VPASSWD_PATH --name=$account_name --uid=9999 --gid=9999 --home=/dev/null --shell=/dev/null --delete-user`
|
|||
|
log_msg "Suppression du compte $account_name"
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
while getopts a:u:n:f:p: opt; do
|
|||
|
case "$opt" in
|
|||
|
a)
|
|||
|
in_action=$OPTARG
|
|||
|
;;
|
|||
|
u)
|
|||
|
in_userid=$OPTARG
|
|||
|
;;
|
|||
|
n)
|
|||
|
in_accountname=$OPTARG
|
|||
|
;;
|
|||
|
f)
|
|||
|
in_workpath=$OPTARG
|
|||
|
;;
|
|||
|
p)
|
|||
|
in_password=$OPTARG
|
|||
|
;;
|
|||
|
esac
|
|||
|
done
|
|||
|
|
|||
|
case "$in_action" in
|
|||
|
l)
|
|||
|
account_list=`list_accounts_by_UID $in_userid`
|
|||
|
echo -e -n $account_list
|
|||
|
exit 1
|
|||
|
;;
|
|||
|
a)
|
|||
|
echo -e -n `add_account $in_userid $in_accountname $in_workpath $in_password`
|
|||
|
exit 1
|
|||
|
;;
|
|||
|
m)
|
|||
|
echo -e -n `edit_password $in_accountname $in_password`
|
|||
|
exit 1;
|
|||
|
;;
|
|||
|
d)
|
|||
|
echo -e -n `delete_account $in_accountname`
|
|||
|
exit 1;
|
|||
|
;;
|
|||
|
esac
|
|||
|
|