evoadmin-web/scripts/ftpadmin.sh
Patrick Marchand e97ddd8be0 Simplification of list_account_by_UID in ftpadmin
Setting / unsetting IFS variables can be removed by setting it only
in the loop context.

The for cat can be replaced by a simpler while read loop.

Proper variable quoting was added.

Changed the way modif was optionally passed, this removes the
extraneous ':' at the end.

echo(1) the lines as we go instead of building an array, this removes
the possibility of sub-shell screwups.
2018-11-09 17:33:44 -05:00

163 lines
4 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
while IFS=$'\n' read -r line;
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)"
size="$(du -s "$path" | cut -f 1)"
#modif="$(cat $path/.lastmodified)"
# Passage en minuscule ?
#account="$(echo $account | tr '[A-Z]' '[a-z]')"
#path="$(echo $path | tr '[A-Z]' '[a-z]')"
echo "$username:$account:$path:$size${modif:+:$modif}"
fi
done < "$VPASSWD_PATH"
}
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