Selaa lähdekoodia

improved rebuilds

Serghey Rodin 14 vuotta sitten
vanhempi
sitoutus
4b44937540

+ 3 - 8
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

+ 0 - 1
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

+ 1 - 1
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 ;;

+ 53 - 0
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

+ 169 - 0
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

+ 70 - 14
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

+ 1 - 1
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

+ 1 - 1
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

+ 72 - 1
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
+}