воскресенье, 18 ноября 2012 г.

Bash скрипт для useradd/userdel, mysql, apache

Так как сегодня в очередной раз пришлось на сервре добавлять нового пользователя, заводить ему MySQL базу и MySQL пользователя, добавлять виртуальный хост в апачь, и при этом нифига не забыть (например, правда на базу добавить), то всеже поборол себя и написал для этого дела скриптик на баше (давно собирался такой скрипт написать, но все влом, так как не хостингом то я занимаюсь... да и вообще не админом работаю).

какиой мне нужен был функционал:

1. указываем только имя пользователя (пароль генерирует сам скрипт)
2. скрипт должен создать такого пользователя в системе с домашней директорией (ругаться - если существует такой юзверь).
3. у него в домашней директории (доступной по FTP) создать поддиректории htdocs - для сайта и logs - для логов апача.
4. создать базу данных - такуюже как и имя пользователя. завести MySQL пользователя с таким же именем и таким же паролем как и на FTP
5. добавить в апач виртуальных хость ИМЯ_ПОЛЬЗОВАТЕЛЯ.mysite.com - для доступа к сайту извне
6. должен уметь удалять все что надобавлял - если захотим пользователя удалить

#!/bin/bash
######################### SETUP ############################################################

IP_ADDRESS="127.0.0.1"
HOST_NAME="localhost"
MYSQL_PASS="MYSQL_ROOT_PASSWORD_HERE"

############################################################################################

APACHE2_DIR="/etc/apache2"
APACHE2_SAVL_DIR="$APACHE2_DIR/sites-available"
APACHE2_SENBL_DIR="$APACHE2_DIR/sites-enabled"

UID_ROOT=0
 
if [ "$UID" -ne "$UID_ROOT" ]; then
  echo "$0 - Requires root privileges"
  exit 1
fi

function is_file(){
    local f="$1"
    [[ -f "$f" ]] && return 0 || return 1
}

function is_dir(){
    local d="$1"
    [[ -d "$d" ]] && return 0 || return 1
}

function is_exits(){
    local check="$1"
    if (is_file "$check") then
 return 0
    fi
    if (is_dir "$check") then
 return 0
    fi
    return 1 #false
}

function is_user(){
    local check_user="$1";
    grep "$check_user:" /etc/passwd >/dev/null
    if [ $? -ne 0 ]; then
 #echo "NOT HAVE USER"
 return 1
    else
 #echo "HAVE USER"
 return 0
    fi
}

#function create_user_website(){
#    cat <<eof >> outfile.txt
#Text file content
#EOF
#}

function generate_pass(){
    CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-_=+\\|/"
    LENGTH="8"
    while [ "${n:=1}" -le "$LENGTH" ] ; do
 PASSWORD="$PASSWORD${CHARS:$(($RANDOM%${#CHARS})):1}"
        let n+=1
    done
    echo $PASSWORD
}

function is_yes(){
#TODO - add check 3-rd parameter for set default ansver (if press enter)
    while true
    do
 echo -n "Yes or No[Y/n]:"
 read  x
 if [ -z "$x" ]
 then
     return 0; #defaul answer: Yes
 fi
 case "$x" in
 y |Y |yes |Д |д |да ) return 0;;
 n |N |no |Н |н |нет ) return 1;;
# * ) ; # asc again
 esac
    done
}

function is_installed(){
#    local I=`dpkg -s $1 | grep "Status"`
    local out=`dpkg --status $1 | grep Status:`
    #echo "$out"
    if [ -n "$out" ]
    then
 echo $1" installed"
 return 0
    else
 echo $1" not installed"
 return 1
    fi
}

function is_running(){
    local result="$(ps -A|grep $1|wc -l)"
    if [[ $result -eq 0 ]]; then
 return 1
    else
 return 0
    fi
}

function create_user(){
    local login="$1"
    local password="$2"
    `useradd -m -s /bin/bash $login`
    #set password
    echo -e "$password\n$password\n" | passwd $login >> /dev/null
}
function delete_user(){
    local login=$1
    `userdel -r $login`
    # remove virtual host
    rm $APACHE2_DIR/sites-enabled/$USER_NAME
    rm $APACHE2_DIR/sites-available/$USER_NAME
    # remove database
    mysql -uroot -p${MYSQL_PASS} --execute="drop database ${USER_NAME};"
    # remove user
    mysql -uroot -p${MYSQL_PASS} --execute="DROP USER '${USER_NAME}'@'localhost';"
}

#echo "paremeters count: $#"

if [ $# -lt 1 ]; then # >=
    echo "USAGE: sudo add_new_user.sh <user_name> [delete]"
    echo "       - add system user <user_name>, create user folder, create virtual host .${HOST_NAME}, create mysql"
    echo "    user and database named <user_name>"
    echo "       - delete - for remove user from system (system user and user folder, apache virtual host and mysql user and database)"
    exit;
fi;

USER_NAME=$1

if [ $# -eq 2 ]; then
    if [ "$2" == "delete" ]; then
 echo "delete user \"$1\""
 delete_user $USER_NAME
    else
 echo "unknown parameter $2"
    fi
    exit;
fi;

echo -n "Check user name $USER_NAME: "
if( is_user "$USER_NAME" )then
    echo "ERROR: Already exits"
    exit;
else
    echo "OK"
fi

echo -n "Check Apache2: "
if(is_dir "$APACHE2") then 
    echo "not found directory $APACHE2_DIR"
    echo "Apache not installed?"
    exit;
else
    echo "OK"
fi

#check installing mysql
#is_installed apache2
#is_installed php5
#is_installed mysql-server
#is_running mysqld
echo -n "Check MySQL status: "
if(is_running mysqld)then
    echo "OK [Running]";
else
    echo "Error: need start mysql daemon!"
    exit
fi

USER_PASSWORD="$(generate_pass)"

echo "-----------------------------------"
echo "User name    : $USER_NAME"
echo "User password: $USER_PASSWORD"
echo "-----------------------------------"
echo -n "Continue? "
if(! is_yes) then 
    exit;
fi

echo "--- create user ---"
create_user "$USER_NAME" "$USER_PASSWORD"
echo "--- create web site ---"
`mkdir /home/$USER_NAME/htdocs`
`mkdir /home/$USER_NAME/logs`  #in future save log for current user
`chown $USER_NAME:$USER_NAME /home/$USER_NAME/htdocs`

virual_host_data="
<virtualhost *:80>
 ServerName ${USER_NAME}.${HOST_NAME}
        ServerAlias www.${USER_NAME}.${HOST_NAME}
        ServerAdmin webmaster@${USER_NAME}.${HOST_NAME}
        DocumentRoot /home/${USER_NAME}/htdocs
        <directory /home/${USER_NAME}/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /home/${USER_NAME}/cgi-bin/
        <directory "/home/${USER_NAME}/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /home/${USER_NAME}/logs/${USER_NAME}.${HOST_NAME}.error.log
        LogLevel warn
        CustomLog /home/${USER_NAME}/logs/${USER_NAME}.${HOST_NAME}.access.log combined
</VirtualHost>
"
touch ${APACHE2_DIR}/sites-available/${USER_NAME}
echo "$virual_host_data" >> ${APACHE2_DIR}/sites-available/${USER_NAME}
#add link
`ln -s ${APACHE2_DIR}/sites-available/${USER_NAME} ${APACHE2_DIR}/sites-enabled/${USER_NAME}`
#create default html
touch /home/${USER_NAME}/htdocs/index.html
echo "
${USER_NAME}

It's Working!

" >> /home/${USER_NAME}/htdocs/index.html #add in hosts #echo "${IP_ADDRESS} ${USER_NAME}.${HOST_NAME}" >> /etc/hosts echo "--- create database and mysql user ---" mysql -uroot -p${MYSQL_PASS} --execute="create database ${USER_NAME};" mysql -uroot -p${MYSQL_PASS} --execute="GRANT ALL PRIVILEGES ON ${USER_NAME}.* TO '${USER_NAME}'@'localhost' IDENTIFIED by '${USER_PASSWORD}' WITH GRANT OPTION;" echo "--- show hosting information ---" #display information echo "*****************************************" echo "* Web Site: ${USER_NAME}.${HOST_NAME}" echo "* user: ${USER_NAME}" echo "* password: ${USER_PASSWORD}" echo "*" echo "* Server: ${IP_ADDRESS}" echo "* ftp user: ${USER_NAME}" echo "* ftp password: ${USER_PASSWORD}" echo "*" echo "* mysql server: ${IP_ADDRESS}" echo "* mysql db_name: ${USER_NAME}" echo "* mysql user: ${USER_NAME}" echo "* mysql password: ${USER_PASSWORD}" echo "*****************************************"

2 комментария:

  1. Спасибо!! Очень полезный скрипт

    ОтветитьУдалить
  2. Очень полезная статься
    Но мне пришлось скрипт немного переделывать под себя
    1) Сайты должны храниться в /home/user_name/site.ru
    2) В связи с первым пунктом пришлось добавить название в параметры название сайта
    3) отдельный скрипт удаления сайта

    ОтветитьУдалить