evoadmin-web/scripts/ftpadmin.sh

175 lines
4.1 KiB
Bash
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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