#!/bin/sh
htdocs_chroot_path="/home/www/htdocs"
log_path="/var/log/user_manager.log"
lock_list="jrmu,fizi,baytuch,vasya,gry,brk,mailman"
user_exists="NO"
group_exists="NO"
target_user_id=""
target_group_id=""
error_trig="NO"
check_exists() {
user_exists=NO
group_exists=NO
if [ ! -z "$(grep "^$1:.*$" /etc/passwd)" ]; then
user_exists="YES"
fi
if [ ! -z "$(grep "^$1:.*$" /etc/group)" ]; then
group_exists="YES"
fi
}
create_user() {
groupadd -ov -g $3 $1
useradd -v -m -d /home/$1 -g $3 -s /bin/ksh -u $2 $1
passwd $1
}
delete_user() {
userdel -rv $1
groupdel -v $1
}
logger() {
if [ ! -f $log_path ]; then
touch $log_path
fi
mess=[$(date '+%Y-%m-%d %H:%M:%S')]" "$1
echo $mess >> $log_path
echo $mess
}
get_target_ids() {
if [ $user_exists == "YES" ]; then
target_user_id=$(grep "^$1" /etc/passwd | sed -r -e 's|^.*:([0-9]+):[0-9]+:.*$|\1|g')
target_group_id=$(grep "^$1" /etc/passwd | sed -r -e 's|^.*:[0-9]+:([0-9]+):.*$|\1|g')
else
users_ids=$(cat /etc/passwd | sed -r -e 's|^.*:([0-9]+:[0-9]+):.*$|\1|g')
tmp_last_user_id=0
for line in $users_ids; do
tmp_user_id=${line%:*}
tmp_group_id=${line#*:}
if [ ${#tmp_user_id} -eq 4 ] && [ ${#tmp_group_id} -eq 4 ]; then
if [ $tmp_user_id -eq $tmp_group_id ]; then
if [ $tmp_user_id -gt $tmp_last_user_id ]; then
tmp_last_user_id=$tmp_user_id
fi
fi
fi
done
target_user_id=$tmp_last_user_id
target_group_id=$tmp_last_user_id
fi
target_user_id=$(echo $target_user_id | sed 's/[^0-9]//g')
target_group_id=$(echo $target_group_id | sed 's/[^0-9]//g')
if [ $user_exists == "NO" ] && [ ! -z $target_user_id ] && [ ! -z $target_group_id ]; then
target_user_id=$((target_user_id + 1))
target_group_id=$((target_group_id + 1))
fi
}
user_tree_config() {
if [ -d /home/$1 ]; then
chmod 700 /home/$1
chmod 700 /home/$1/.ssh
chmod 600 /home/$1/{.Xdefaults,.cshrc,.cvsrc,.login,.mailrc,.profile}
logger "TREE CONFIG: was configured home dir"
if [ -d $htdocs_chroot_path ]; then
mkdir $htdocs_chroot_path/$1
chown $1:$1 $htdocs_chroot_path/$1
ln -s $htdocs_chroot_path/$1 /home/$1/htdocs
chown $1:$1 /home/$1/htdocs
logger "TREE CONFIG: was configured htdocs dir"
else
logger "TREE CONFIG: htdocs chroot not found!"
fi
else
logger "TREE CONFIG: home folder not found!"
fi
}
user_tree_delete() {
if [ -d /home/$1 ]; then
if [ -d /home/$1/htdocs ]; then
rm -rf /home/$1/htdocs
fi
if [ -d $htdocs_chroot_path/$1 ]; then
rm -rf $htdocs_chroot_path/$1
fi
if [ ! -d /home/$1/htdocs ] && [ ! -d $htdocs_chroot_path/$1 ]; then
logger "TREE DELETE: was deteled htdocs dir"
else
error_trig="YES"
logger "TREE DELETE: failed to delete folder tree!"
fi
else
error_trig="YES"
logger "TREE DELETE: home folder not found!"
fi
}
do_create_user() {
logger "WORKER: create a new user..."
if [ -z $1 ]; then
logger "WORKER: you must provide username!"
else
check_exists $1
if [ $user_exists == "YES" ]; then
logger "WORKER: user $1 already exists"
else
get_target_ids $1
if [ ${#target_user_id} -eq 4 ] && [ ${#target_group_id} -eq 4 ]; then
logger "WORKER: process of creating a new user has started"
logger "WORKER: -> login - $1"
logger "WORKER: -> user_id - $target_user_id"
logger "WORKER: -> group_id - $target_group_id"
create_user $1 $target_user_id $target_group_id
check_exists $1
if [ $user_exists == "YES" ]; then
logger "WORKER: user created successfully"
logger "WORKER: user folder tree configuration..."
user_tree_config $1
else
logger "WORKER: user creation failure!"
fi
else
logger "WORKER: error generating identifiers!"
fi
fi
fi
}
do_delete_user() {
logger "WORKER: removing a user account..."
if [ -z $1 ]; then
logger "WORKER: you must provide username!"
else
check_exists $1
if [ $user_exists == "NO" ]; then
logger "WORKER: user $1 not found!"
else
get_target_ids $1
if [ ${#target_user_id} -ne 4 ]; then
logger "WORKER: you cannot delete the service user!"
else
deny_del="NO"
for tmp_user_name in $(echo $lock_list | tr "," "\n"); do
if [ $1 == $tmp_user_name ]; then
deny_del="YES"
break
fi
done
if [ $deny_del == "NO" ]; then
logger "WORKER: deleting a user's folder tree..."
user_tree_delete $1
if [ $error_trig == "NO" ]; then
logger "WORKER: deleting a user account..."
delete_user $1
check_exists $1
if [ $user_exists == "NO" ]; then
logger "WORKER: user account of $1 deleted"
else
logger "WORKER: failed to delete account!"
fi
fi
else
logger "WORKER: the deletion of this user is blocked!"
fi
fi
fi
fi
}
if [ $(whoami) == "root" ]; then
case "$1" in
create)
do_create_user $2
;;
delete)
do_delete_user $2
;;
*)
logger "SELECTOR: unknown command"
;;
esac
exit 0
else
echo "must be run as root!"
exit 1
fi