diff --git a/bin/v_add_user b/bin/v_add_user index b434a35a..2d374460 100755 --- a/bin/v_add_user +++ b/bin/v_add_user @@ -54,12 +54,7 @@ package_data=$(cat $VESTA/data/packages/$package.pkg) # Checking shell shell_conf=$(echo "$package_data" | grep 'SHELL' | cut -f 2 -d \') -case $shell_conf in - nologin) shell='/sbin/nologin' ;; - bash) shell='/bin/bash' ;; - sh) shell='/bin/bash' ;; - *) shell='/sbin/nologin' ;; -esac +shell=$(/usr/bin/chsh --list-shells | grep -w "$shell_conf" |head -n1) # Adding user /usr/sbin/adduser "$user" -s "$shell" -c "$email" -m -d "$HOMEDIR/$user" @@ -143,13 +138,13 @@ if [ ! -z "$MAIL_SYSTEM" ] && [ "$MAIL_SYSTEM" != 'no' ]; then chmod 770 $USER_DATA/mail touch $USER_DATA/mail.conf chmod 660 $USER_DATA/mail.conf - echo "v_upd_mail_domains_disk $user" >> $VESTA/data/queue/disk.pipe + echo "v_update_mail_domains_disk $user" >> $VESTA/data/queue/disk.pipe fi if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then touch $USER_DATA/db.conf chmod 660 $USER_DATA/db.conf - echo "v_update_db_bases_disk $user" >> $VESTA/data/queue/disk.pipe + echo "v_update_databases_disk $user" >> $VESTA/data/queue/disk.pipe fi if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then diff --git a/bin/v_add_web_domain_stats_user b/bin/v_add_web_domain_stats_user index 3ccab0d0..1355c42c 100755 --- a/bin/v_add_web_domain_stats_user +++ b/bin/v_add_web_domain_stats_user @@ -43,7 +43,6 @@ is_object_value_exist 'web' 'DOMAIN' "$domain" '$STATS' stats_dir="$HOMEDIR/$user/web/$domain/stats" # Adding htaccess file -rm -f $stats_dir/.htaccess echo "AuthUserFile $stats_dir/.htpasswd AuthName \"Web Statistics\" AuthType Basic diff --git a/bin/v_list_sys_ips b/bin/v_list_sys_ips index 57c14061..1172f673 100755 --- a/bin/v_list_sys_ips +++ b/bin/v_list_sys_ips @@ -77,7 +77,7 @@ conf=$VESTA/data/ips/* fields="\$IP \$OWNER \$STATUS \$NAME \$U_SYS_USERS \$U_WEB_DOMAINS" fields="$fields \$INTERFACE \$NETMASK \$DATE" -# Listing domains +# Listing ip addresses case $format in json) json_list_ips ;; plain) nohead=1; shell_list_ips ;; diff --git a/bin/v_rebuild_databases b/bin/v_rebuild_databases new file mode 100755 index 00000000..22dbe197 --- /dev/null +++ b/bin/v_rebuild_databases @@ -0,0 +1,53 @@ +#!/bin/bash +# info: rebuild databases +# options: user +# +# The function for rebuilding of all databases of a single user. + + +#----------------------------------------------------------# +# Variable&Function # +#----------------------------------------------------------# + +# Argument defenition +user=$1 + +# Includes +source $VESTA/conf/vesta.conf +source $VESTA/func/shared.sh +source $VESTA/func/db.sh + + +#----------------------------------------------------------# +# Verifications # +#----------------------------------------------------------# + +check_args '1' "$#" 'user' +validate_format 'user' +is_system_enabled "$DB_SYSTEM" +is_object_valid 'user' 'USER' "$user" + + +#----------------------------------------------------------# +# Action # +#----------------------------------------------------------# + +# Starting rebuild loop +for database in $(search_objects 'db' 'SUSPENDED' "no" 'DB'); do + get_database_values + # Switching on db type + case $TYPE in + mysql) rebuild_mysql_database ;; + pgsql) rebuild_pgsql_database ;; + esac +done + + +#----------------------------------------------------------# +# Vesta # +#----------------------------------------------------------# + +# Logging +log_event "$OK" "$EVENT" + +exit diff --git a/bin/v_rebuild_user b/bin/v_rebuild_user new file mode 100755 index 00000000..bfdc5f91 --- /dev/null +++ b/bin/v_rebuild_user @@ -0,0 +1,169 @@ +#!/bin/bash +# info: rebuild system user +# options: user [full] +# +# The function rebuilds system user account. + + +#----------------------------------------------------------# +# Variable&Function # +#----------------------------------------------------------# + +# Argument defenition +user=$1 +full=${2-no} + +# Includes +source $VESTA/conf/vesta.conf +source $VESTA/func/shared.sh + + +#----------------------------------------------------------# +# Verifications # +#----------------------------------------------------------# + +check_args '1' "$#" 'user [full]' +validate_format 'user' 'full' +is_object_valid 'user' 'USER' "$user" +is_object_unsuspended 'user' 'USER' "$user" + + +#----------------------------------------------------------# +# Action # +#----------------------------------------------------------# + +# Get user variables +source $USER_DATA/user.conf + +# Rebuild user +shell=$(/usr/bin/chsh --list-shells | grep -w "$SHELL" |head -n1) +/usr/sbin/adduser "$user" -s "$shell" -c "$CONTACT" -m -d "$HOMEDIR/$user" \ + &>/dev/null + +# Change password +#/usr/sbin/usermod -p $MD5 $user +shadow=/tmp/shadow +shdw=$(grep ^$user: $shadow) +shdw3=$(echo "$shdw" | cut -f3 -d :) +shdw4=$(echo "$shdw" | cut -f4 -d :) +shdw5=$(echo "$shdw" | cut -f5 -d :) +shdw6=$(echo "$shdw" | cut -f6 -d :) +shdw7=$(echo "$shdw" | cut -f7 -d :) +shdw8=$(echo "$shdw" | cut -f8 -d :) +shdw9=$(echo "$shdw" | cut -f9 -d :) +chmod u+w $shadow +sed -i "/^$user:*/d" $shadow +echo "$user:$MD5:$shdw3:$shdw4:$shdw5:$shdw6:$shdw7:$shdw8:$shdw9" >> $shadow +chmod u-w $shadow + +# Change shell +/usr/bin/chsh -s "$shell" "$user" &>/dev/null + +# Building directory tree +mkdir -p $HOMEDIR/$user +chmod -R a+x $HOMEDIR/$user +mkdir -p $HOMEDIR/$user/conf +chown $user:$user $HOMEDIR/$user/conf + +if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then + mkdir -p $HOMEDIR/$user/conf/web + mkdir -p $HOMEDIR/$user/web + mkdir -p $HOMEDIR/$user/tmp + chmod 751 $HOMEDIR/$user/conf/web + chmod 751 $HOMEDIR/$user/web + chmod 777 $HOMEDIR/$user/tmp + chown $user:$user $HOMEDIR/$user/web + if [ "$full" = 'yes' ]; then + $BIN/v_rebuild_web_domains $user + fi +fi + +if [ ! -z "$MAIL_SYSTEM" ] && [ "$MAIL_SYSTEM" != 'no' ]; then + mkdir -p $HOMEDIR/$user/conf/mail + mkdir -p $HOMEDIR/$user/mail + chmod 751 $HOMEDIR/$user/mail + chmod 751 $HOMEDIR/$user/conf/mail + if [ "$full" = 'yes' ]; then + $BIN/v_rebuild_mail_domains $user + fi +fi + +if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ]; then + mkdir -p $HOMEDIR/$user/conf/dns + chmod 751 $HOMEDIR/$user/conf/dns + if [ "$full" = 'yes' ]; then + $BIN/v_rebuild_dns_domains $user + fi +fi + +if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then + if [ "$full" = 'yes' ]; then + $BIN/v_rebuild_databases $user + fi +fi + +if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then + if [ "$full" = 'yes' ]; then + $BIN/v_rebuild_cron_jobs $user + fi +fi + + +#----------------------------------------------------------# +# Vesta # +#----------------------------------------------------------# + +# Creating configuration files and pipes +chmod 770 $USER_DATA +touch $USER_DATA/backup.conf +chmod 660 $USER_DATA/backup.conf +touch $USER_DATA/history.log +chmod 660 $USER_DATA/history.log +touch $USER_DATA/stats.log +chmod 660 $USER_DATA/stats.log + +sed -i "/ $user$/d" $VESTA/data/queue/disk.pipe +echo "v_update_user_disk $user" >> $VESTA/data/queue/disk.pipe + +if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then + mkdir -p $USER_DATA/ssl + chmod 770 $USER_DATA/ssl + touch $USER_DATA/web.conf + chmod 660 $USER_DATA/web.conf + if [ "$(grep -w $user $VESTA/data/queue/traffic.pipe)" ]; then + echo "$BIN/v_update_web_domains_traff $user" \ + >> $VESTA/data/queue/traffic.pipe + fi + echo "v_update_web_domains_disk $user" >> $VESTA/data/queue/disk.pipe +fi + +if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ]; then + mkdir -p $USER_DATA/dns + chmod 770 $USER_DATA/dns + touch $USER_DATA/dns.conf + chmod 660 $USER_DATA/dns.conf +fi + +if [ ! -z "$MAIL_SYSTEM" ] && [ "$MAIL_SYSTEM" != 'no' ]; then + mkdir -p $USER_DATA/mail + chmod 770 $USER_DATA/mail + touch $USER_DATA/mail.conf + chmod 660 $USER_DATA/mail.conf + echo "v_update_mail_domains_disk $user" >> $VESTA/data/queue/disk.pipe +fi + +if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then + touch $USER_DATA/db.conf + chmod 660 $USER_DATA/db.conf + echo "v_update_datbases_disk $user" >> $VESTA/data/queue/disk.pipe +fi + +if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then + touch $USER_DATA/cron.conf + chmod 660 $USER_DATA/cron.conf +fi + +# Logging +log_event "$OK" "$EVENT" + +exit diff --git a/bin/v_rebuild_web_domains b/bin/v_rebuild_web_domains index 2e5b46a0..2c012a59 100755 --- a/bin/v_rebuild_web_domains +++ b/bin/v_rebuild_web_domains @@ -50,9 +50,49 @@ nohead=1 # Starting loop for domain in $(shell_list) ; do - domain_idn=$(idn -t --quiet -a "$domain") + + # Rebuilding directories + mkdir -p $HOMEDIR/$user/web/$domain \ + $HOMEDIR/$user/web/$domain/public_html \ + $HOMEDIR/$user/web/$domain/public_shtml \ + $HOMEDIR/$user/web/$domain/document_errors \ + $HOMEDIR/$user/web/$domain/cgi-bin \ + $HOMEDIR/$user/web/$domain/private \ + $HOMEDIR/$user/web/$domain/stats \ + $HOMEDIR/$user/web/$domain/logs + if [ ! -e "$HOMEDIR/$user/web/$domain/logs/$domain.log" ]; then + ln -s /var/log/httpd/domains/$domain.error.log \ + $HOMEDIR/$user/web/$domain/logs/$domain.log + fi + if [ ! -e "$HOMEDIR/$user/web/$domain/logs/$domain.error.log" ]; then + ln -s /var/log/httpd/domains/$domain.error.log \ + $HOMEDIR/$user/web/$domain/logs/$domain.error.log + fi + if [ -e "$WEBTPL/skel/document_errors/" ]; then + cp -r $WEBTPL/skel/document_errors/ $HOMEDIR/$user/web/$domain/ + fi + chmod 551 $HOMEDIR/$user/web/$domain + chmod 751 $HOMEDIR/$user/web/$domain/private + chmod 751 $HOMEDIR/$user/web/$domain/cgi-bin + chmod 751 $HOMEDIR/$user/web/$domain/public_html + chmod 751 $HOMEDIR/$user/web/$domain/public_shtml + chmod 751 $HOMEDIR/$user/web/$domain/document_errors + chmod -f -R 775 $HOMEDIR/$user/web/$domain/document_errors/* + chmod 551 $HOMEDIR/$user/web/$domain/stats + chmod 551 $HOMEDIR/$user/web/$domain/logs + chmod 640 /var/log/httpd/domains/$domain.* + + chown $user:$user $HOMEDIR/$user/web/$domain + chown $user:$user $HOMEDIR/$user/web/$domain/private + chown $user:$user $HOMEDIR/$user/web/$domain/cgi-bin + chown $user:$user $HOMEDIR/$user/web/$domain/public_html + chown $user:$user $HOMEDIR/$user/web/$domain/public_shtml + chown -R $user:$user $HOMEDIR/$user/web/$domain/document_errors + chown root:$user /var/log/httpd/domains/$domain.* + chown root:apache $conf # Parsing domain values + domain_idn=$(idn -t --quiet -a "$domain") get_domain_values 'web' # Preparing domain values for the template substitution @@ -78,25 +118,41 @@ for domain in $(shell_list) ; do # Checking stats if [ ! -z "$STATS" ]; then - cat $WEBTPL/$STATS.tpl |\ - sed -e "s/%ip%/$ip/g" \ - -e "s/%web_port%/$WEB_PORT/g" \ - -e "s/%web_ssl_port%/$WEB_SSL_PORT/g" \ - -e "s/%proxy_port%/$PROXY_PORT/g" \ - -e "s/%proxy_ssl_port%/$PROXY_SSL_PORT/g" \ - -e "s/%domain_idn%/$domain_idn/g" \ - -e "s/%domain%/$domain/g" \ - -e "s/%user%/$user/g" \ - -e "s/%home%/${HOMEDIR////\/}/g" \ - -e "s/%alias%/${aliases//,/ }/g" \ - -e "s/%alias_idn%/${aliases_idn//,/ }/g" \ - > $HOMEDIR/$user/conf/web/$STATS.$domain.conf + cat $WEBTPL/$STATS.tpl |\ + sed -e "s/%ip%/$ip/g" \ + -e "s/%web_port%/$WEB_PORT/g" \ + -e "s/%web_ssl_port%/$WEB_SSL_PORT/g" \ + -e "s/%proxy_port%/$PROXY_PORT/g" \ + -e "s/%proxy_ssl_port%/$PROXY_SSL_PORT/g" \ + -e "s/%domain_idn%/$domain_idn/g" \ + -e "s/%domain%/$domain/g" \ + -e "s/%user%/$user/g" \ + -e "s/%home%/${HOMEDIR////\/}/g" \ + -e "s/%alias%/${aliases//,/ }/g" \ + -e "s/%alias_idn%/${aliases_idn//,/ }/g" \ + > $HOMEDIR/$user/conf/web/$STATS.$domain.conf stats_string="$BIN/v_update_web_domain_stat $user $domain" check_stats_pipe=$(grep "$stats_string" $V_QUEUE/stats.pipe) if [ -z "$check_stats_pipe" ]; then echo "$stats_string" >> $V_QUEUE/stats.pipe fi + + if [ ! -z "$STATS_USER" ]; then + # Definining statistic dir + stats_dir="$HOMEDIR/$user/web/$domain/stats" + + # Adding htaccess file + echo "AuthUserFile $stats_dir/.htpasswd" > $stats_dir/.htaccess + echo "AuthName \"Web Statistics\"" >> $stats_dir/.htaccess + echo "AuthType Basic" >> $stats_dir/.htaccess + echo "Require valid-user" >> $stats_dir/.htaccess + + # Generating htaccess user and password + rm -f $stats_dir/.htpasswd + htpasswd -bc $stats_dir/.htpasswd "$STATS_USER" "$STATS_CRYPT" \ + &>/dev/null + fi fi # Checking ssl diff --git a/bin/v_suspend_database b/bin/v_suspend_database index 44da825c..62bb95e8 100755 --- a/bin/v_suspend_database +++ b/bin/v_suspend_database @@ -40,7 +40,7 @@ is_object_unsuspended 'db' 'DB' "$database" get_database_values # Switching on db type -case $type in +case $TYPE in mysql) suspend_mysql_database ;; pgsql) suspend_pgsql_database ;; esac diff --git a/bin/v_unsuspend_database b/bin/v_unsuspend_database index afecaf1f..15e28bf0 100755 --- a/bin/v_unsuspend_database +++ b/bin/v_unsuspend_database @@ -39,7 +39,7 @@ is_object_suspended 'db' 'DB' "$database" get_database_values # Switching on db type -case $type in +case $TYPE in mysql) unsuspend_mysql_database ;; pgsql) unsuspend_pgsql_database ;; esac diff --git a/func/db.sh b/func/db.sh index 0560308c..575a3cba 100644 --- a/func/db.sh +++ b/func/db.sh @@ -515,7 +515,7 @@ get_mysql_disk_usage() { usage=$(printf "%0.f\n" $usage) } -# Get MySQL disk usage +# Get PostgreSQL disk usage get_pgsql_disk_usage() { host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf) eval $host_str @@ -546,3 +546,74 @@ get_pgsql_disk_usage() { usage=1 fi } + +# Rebuild MySQL database +rebuild_mysql_database() { + host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf) + eval $host_str + if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then + echo "Error: mysql config parsing failed" + log_event "$E_PARSING" "$EVENT" + exit $E_PARSING + fi + + query='SELECT VERSION()' + mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null + if [ '0' -ne "$?" ]; then + echo "Error: Connection failed" + log_event "$E_DB $EVENT" + exit $E_DB + fi + + query="CREATE DATABASE $database CHARACTER SET $CHARSET" + mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null + + query="GRANT ALL ON $database.* TO '$DBUSER'@'*'" + mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null + + query="GRANT ALL ON $database.* TO '$DBUSER'@'localhost'" + mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null + + query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER';" + mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null +} + +# Rebuild PostgreSQL database +rebuild_pgsql_database() { + host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf) + eval $host_str + export PGPASSWORD="$PASSWORD" + if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then + echo "Error: postgresql config parsing failed" + log_event "$E_PARSING" "$EVENT" + exit $E_PARSING + fi + + query='SELECT VERSION()' + psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null + if [ '0' -ne "$?" ]; then + echo "Error: Connection failed" + log_event "$E_DB" "$EVENT" + exit $E_DB + fi + + query="CREATE ROLE $DBUSER" + psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null + + query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'" + psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null + + query="CREATE DATABASE $database OWNER $DBUSER" + if [ "$TPL" = 'template0' ]; then + query="$query ENCODING '$CHARSET' TEMPLATE $TPL" + else + query="$query TEMPLATE $TPL" + fi + psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null + + query="GRANT ALL PRIVILEGES ON DATABASE $database TO $DBUSER" + psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null + + query="GRANT CONNECT ON DATABASE template1 to $dbuser" + psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null +}