# Log event function log_event() { # Argument defenition level="$1" event="$2" # Checking logging system log_system=$(grep 'LOG_SYSTEM=' $V_CONF/vesta.conf | cut -f 2 -d \' ) if [ "$log_system" = 'on' ]; then # Checking logging level log=$(grep 'LOG_LEVEL=' $V_CONF/vesta.conf|\ cut -f 2 -d \'|grep -w "$level" ) if [ ! -z "$log" ]; then echo "$event" >> $V_LOG/$level.log fi fi } # Log user history log_history() { event="$1" undo="$2" # Checking logging system log_history=$(grep 'LOG_HISTORY=' $V_CONF/vesta.conf | cut -f 2 -d \' ) if [ "$log_history" = 'on' ]; then echo "$event [$undo]" >> $V_USERS/$user/history.log fi } # External function result checker check_func_result() { return_code="$1" if [[ "$return_code" -ne "$OK" ]]; then log_event 'debug' "$return_code $V_EVENT" exit $return_code fi } # Argument list checker check_args() { sys_args="$1" user_args="$2" usage="$3" if [ "$user_args" -lt "$sys_args" ]; then echo "Error: bad args" echo "Usage: $V_SCRIPT $usage" log_event 'debug' "$E_BAD_ARGS $V_EVENT" exit $E_BAD_ARGS fi } # Format validator format_validation() { # Defining url function format_url() { val="$1" # Checking url check_http=$( echo "$val" |grep "^https://" ) needed_chars=$(echo "$val" | cut -s -f 2 -d '.') if [ -z "$check_http" ] || [ -z "$needed_chars" ]; then echo "Error: shell not found" log_event 'debug' "$E_SHELL_INVALID $V_EVENT" exit $E_SHELL_INVALID fi } # Defining shell function format_sh() { val="$1" # Checking shell check_shell=$(/usr/bin/chsh --list-shells | grep -w "$val" ) if [ -z "$check_shell" ]; then echo "Error: shell not found" log_event 'debug' "$E_SHELL_INVALID $V_EVENT" exit $E_SHELL_INVALID fi } # Defining password function format_pwd() { val="$1" # Checking password lenght if [ "${#val}" -lt '6' ]; then echo "Error: password is shorter than 6 chars" log_event 'debug' "$E_PASSWORD_SHORT $V_EVENT" exit $E_PASSWORD_SHORT fi } # Defining integer function format_int() { val="$1" # Defining exlude mask special_chars=$(echo "$val" | \ grep -c "[!|@|#|$|^|&|*|(|)|-|+|=|{|}|:|_|,|.|<|>|?|/|\|\"|'|;|%]" ) if [[ 0 -ne "$special_chars" ]]; then echo "Error: $var out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi # Checking letters letters=$(echo "$val" | grep -c "[a-Z]") if [ 0 -ne "$letters" ]; then echo "Error: $var out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi # Checking -zero if [[ 0 -ne "$val" ]] && [[ 0 -gt "$val" ]]; then echo "Error: $var out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining ip function format_ip() { val="$1" oc1=$(echo $val | cut -s -f 1 -d . ) oc2=$(echo $val | cut -s -f 2 -d . ) oc3=$(echo $val | cut -s -f 3 -d . ) oc4=$(echo $val | cut -s -f 4 -d . ) # Checking octets if [ -z "$oc1" ] || [ -z "$oc2" ] || [ -z "$oc3" ] || [ -z "$oc4" ] then echo "Error: $var out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining ip_status function format_ips() { val="$1" check_status=$(echo "shared, exclusive" | grep -w "$val" ) # Checking status if [ -z "$check_status" ]; then echo "Error: $var out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining email function format_eml() { val="$1" check_at=$(echo "$val" | cut -s -f 1 -d @) check_dt=$(echo "$val" | cut -s -f 2 -d @|cut -s -f 2 -d .) # Checking format if [ -z "$check_at" ] ||\ [ -z "$check_dt" ] ||\ [ "${#check_dt}" -lt 2 ] &&\ [ "$val" != 'vesta@localhost' ]; then echo "Error: email format is wrong" log_event 'debug' "$E_EMAIL_INVALID $V_EVENT" exit $E_EMAIL_INVALID fi } # Defining interface function format_ifc() { val="$1" # Parsing ifconfig /sbin/ifconfig "$val" > /dev/null 2>&1 return_val="$?" if [ "$return_val" -ne 0 ]; then echo "Error: intreface not exist" log_event 'debug' "$E_INTERFACE_NOTEXIST" exit $E_INTERFACE_NOTEXIST fi } # Defining user function format_usr() { val="$1" # Defining exlude mask special_chars=$(echo "$val" | \ grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:| |,|<|>|?|/|\|\"|'|;|%]" ) # Checking result if [[ 0 -ne "$special_chars" ]]; then echo "Error: $var is out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining domain function format_dom() { val="$1" # Defining exlude mask special_chars=$(echo "$val" | \ grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|_|/|\|\"|'|;|%]" ) needed_chars=$(echo "$val" | cut -s -f 2 -d '.') # Checking result if [[ 0 -ne "$special_chars" ]] || [ -z "$needed_chars" ]; then echo "Error: $var is out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining format_db function format_db() { val="$1" # Defining exlude mask special_chars=$(echo "$val" | \ grep -c "[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|.|<|>|?|/|\|\"|'|;|%]" ) # Checking result if [[ 0 -ne "$special_chars" ]] || [ 17 -le ${#val} ]; then echo "Error: $var is out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining format_db function format_dbu() { val="$1" # Checking result if [ 17 -le ${#val} ]; then echo "Error: $var is out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining dns record function format_rcd() { val="$1" case $val in A) known='yes';; NS) known='yes';; CNAME) known='yes';; AAAA) known='yes';; MX) known='yes';; TXT) known='yes';; SRV) known='yes';; *) known='no';; esac if [[ "$known" != 'yes' ]]; then echo "Error: $var is out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Defining format_ext function format_ext() { val="$1" # Checking result if [ 200 -le ${#val} ]; then echo "Error: $var is out of range" log_event 'debug' "$E_OUTOFRANGE $V_EVENT" exit $E_OUTOFRANGE fi } # Lopp on all variables for var in $*; do # Parsing reference eval v=\$$var # Checking variable format case $var in dom_alias) format_dom "$v" ;; auth_pass) format_pwd "$v" ;; auth_user) format_usr "$v" ;; certificate) format_usr "$v" ;; domain) format_dom "$v" ;; database) format_db "$v" ;; db_user) format_dbu "$v" ;; ns1) format_dom "$v" ;; ns2) format_dom "$v" ;; email) format_eml "$v" ;; extentions) format_ext "$v" ;; host) format_usr "$v" ;; interface) format_ifc "$v" ;; ip) format_ip "$v" ;; ip_status) format_ips "$v" ;; ip_name) format_dom "$v" ;; id) format_int "$v" ;; mask) format_ip "$v" ;; max_usr) format_int "$v" ;; max_db) format_int "$v" ;; limit) format_int "$v" ;; offset) format_int "$v" ;; owner) format_usr "$v" ;; package) format_usr "$v" ;; password) format_pwd "$v" ;; port) format_int "$v" ;; rtype) format_rcd "$v" ;; shell) format_sh "$v" ;; soa) format_dom "$v" ;; suspend_url) format_url "$v" ;; template) format_usr "$v" ;; ttl) format_int "$v" ;; user) format_usr "$v" ;; esac done } # Sub system checker is_system_enabled() { stype="$1" web_function() { # Parsing config web_system=$(grep "WEB_SYSTEM=" $V_CONF/vesta.conf|cut -f 2 -d \' ) # Checking result if [ -z "$web_system" ] || [ "$web_system" = "off" ]; then echo "Error: web hosting support disabled" log_event 'debug' "$E_WEB_DISABLED $V_EVENT" exit $E_WEB_DISABLED fi } proxy_function() { # Parsing config proxy_system=$(grep "PROXY_SYSTEM=" $V_CONF/vesta.conf|cut -f 2 -d \' ) # Checking result if [ "$proxy_system" != 'nginx' ]; then # only nginx echo "Error: proxy hosting support disabled" # support for log_event 'debug' "$E_PROXY_DISABLED $V_EVENT" # now exit $E_PROXY_DISABLED fi } dns_function() { # Parsing config dns_system=$(grep "DNS_SYSTEM=" $V_CONF/vesta.conf|cut -f 2 -d \' ) # Checking result if [ -z "$dns_system" ] || [ "$cron_system" = "off" ]; then echo "Error: dns support disabled" log_event 'debug' "$E_DNS_DISABLED $V_EVENT" exit $E_DNS_DISABLED fi } cron_function() { # Parsing config cron_system=$(grep "CRON_SYSTEM=" $V_CONF/vesta.conf|cut -f 2 -d \' ) # Checking result if [ -z "$cron_system" ] || [ "$cron_system" = "off" ]; then echo "Error: crond support disabled" log_event 'debug' "$E_CRON_DISABLED $V_EVENT" exit $E_CRON_DISABLED fi } db_function() { # Parsing config db_system=$(grep "DB_SYSTEM=" $V_CONF/vesta.conf|cut -f 2 -d \' ) # Checking result if [ -z "$db_system" ] || [ "$db_system" = "off" ]; then echo "Error: db support disabled" log_event 'debug' "$E_DB_DISABLED $V_EVENT" exit $E_DB_DISABLED fi } case $stype in web) web_function ;; proxy) proxy_function ;; dns) dns_function ;; cron) cron_function ;; db) db_function ;; *) check_args '1' '0' 'system' esac } # System user check is_user_valid() { search_user="${1-$user}" check_user=$(cut -f 1 -d : /etc/passwd | grep -w "$search_user" ) if [ -z "$check_user" ]; then echo "Error: user not found" log_event 'debug' "$E_USER_NOTEXIST $V_EVENT" exit $E_USER_NOTEXIST fi if [ ! -d "$V_USERS/$search_user" ]; then echo "Error: unknown user" log_event 'debug' "$E_USER_UNKNOWN $V_EVENT" exit $E_USER_UNKNOWN fi } # Specific key check is_user_suspended() { check_suspend=$(grep "SUSPENDED='yes'" $V_USERS/$user/user.conf) if [ ! -z "$check_suspend" ]; then echo "Error: User is suspended" log_event 'debug' "$E_USER_SUSPENDED $V_EVENT" exit $E_USER_SUSPENDED fi } # User package check is_package_full() { stype="$1" web_domain() { # Checking zero domains domain_number=$(wc -l $V_USERS/$user/web_domains.conf|cut -f 1 -d ' ') # Comparing current val with conf val=$(grep '^WEB_DOMAINS=' $V_USERS/$user/user.conf|cut -f 2 -d \' ) if [ "$domain_number" -ge "$val" ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi } web_alias() { # Parsing aliases alias_nmb=$(grep "DOMAIN='$domain'" $V_USERS/$user/web_domains.conf|\ awk -F "ALIAS=" '{print $2}' | cut -f 2 -d \' |\ sed -e "s/,/\n/g" | wc -l ) # Parsing config val=$(grep 'WEB_ALIASES=' $V_USERS/$user/user.conf | cut -f 2 -d \' ) if [ "$alias_nmb" -ge "$val" ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi } web_ssl() { # Parsing config val=$(grep '^WEB_SSL=' $V_USERS/$user/user.conf | cut -f 2 -d \' ) if [ "$val" -eq '0' ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi # Checking domains domain_nmb=$(grep "SSL='yes'" $V_USERS/$user/web_domains.conf | wc -l) # Comparing current val with conf if [ "$domain_nmb" -ge "$val" ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi } dns_domain() { # Checking zero domains domain_number=$(wc -l $V_USERS/$user/dns.conf | cut -f 1 -d " ") # Comparing current val with conf val=$(grep '^DNS_DOMAINS=' $V_USERS/$user/user.conf | cut -f 2 -d \' ) if [ "$domain_number" -ge "$val" ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi } db_base() { # Checking zero domains db_number=$(wc -l $V_USERS/$user/db.conf | cut -f 1 -d " ") # Comparing current val with conf val=$(grep '^DATABASES=' $V_USERS/$user/user.conf | cut -f 2 -d \' ) if [ "$db_number" -ge "$val" ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi } # FIXME - should finish other functions # Switching case "$stype" in web_domain) web_domain "$user" ;; web_alias) web_alias "$user" "$domain" ;; web_ssl) web_ssl "$user" ;; dns) dns_domain "$user" ;; db_base) db_base "$user" ;; mail_domain) mail_domain "$user" ;; mail_box) mail_box "$user" "$domain";; mail_forwarder) mail_forwarder "$user" "$domain";; *) echo "Error: bad type" log_event 'debug' "$E_BAD_TYPE $V_EVENT" exit $E_BAD_TYPE ;; esac } is_package_avalable() { # Parsing user data usr_data=$(cat $V_USERS/$user/user.conf) for key in $usr_data; do eval ${key%%=*}=${key#*=} done # Clearing vars WEB_DOMAINS='0' WEB_SSL='0' DATABASES='0' MAIL_DOMAINS='0' MAIL_BOXES='0' MAIL_FORWARDERS='0' DNS_DOMAINS='0' DISK_QUOTA='0' BANDWIDTH='0' MAX_CHILDS='0' # Parsing package pkg_data=$(cat $V_PKG/$package.pkg) for key in $pkg_data; do eval ${key%%=*}=${key#*=} done # Comparing user data with package if [ "$WEB_DOMAINS" -lt "$U_WEB_DOMAINS" ] ||\ [ "$WEB_SSL" -lt "$U_WEB_SSL" ] ||\ [ "$DATABASES" -lt "$U_DATABASES" ] ||\ [ "$MAIL_DOMAINS" -lt "$U_MAIL_DOMAINS" ] ||\ [ "$DNS_DOMAINS" -lt "$U_DNS_DOMAINS" ] ||\ [ "$DISK_QUOTA" -lt "$U_DISK" ] ||\ [ "$BANDWIDTH" -lt "$U_BANDWIDTH" ] ||\ [ "$MAX_CHILDS" -lt "$U_CHILDS" ]; then echo "Error: Upgrade package" log_event 'debug' "$E_PKG_UPGRADE $v_log" exit $E_PKG_UPGRADE fi } is_template_valid() { stype="$1" web_template() { check_tpl=$(echo "$templates"|sed -e "s/,/\n/g"|grep "^$template$") tpl="$V_WEBTPL/apache_$template.tpl" descr="$V_WEBTPL/apache_$template.descr" ssl="$V_WEBTPL/apache_$template.stpl" if [ -z "$check_tpl" ] || [ ! -e $tpl ] || \ [ ! -e $descr ] || [ ! -e $ssl ]; then echo "Error: template not found" log_event 'debug' "$E_TPL_NOTEXIST" exit $E_TPL_NOTEXIST fi } proxy_template() { tpl="$V_WEBTPL/ngingx_vhost-$template.tpl" descr="$V_WEBTPL/ngingx_vhost-$template.descr" ssl="$V_WEBTPL/ngingx_vhost-$template.ssl.tpl" if [ ! -e $tpl ] || [ ! -e $descr ] || [ ! -e $ssl ]; then echo "Error: template not found" log_event 'debug' "$E_TPL_NOTEXIST" exit $E_TPL_NOTEXIST fi } dns_template() { tpl="$V_DNSTPL/$template.tpl" descr="$V_DNSTPL/$template.descr" if [ ! -e $tpl ] || [ ! -e $descr ]; then echo "Error: template not found" log_event 'debug' "$E_TPL_NOTEXIST" exit $E_TPL_NOTEXIST fi } # Switching config case $stype in web) web_template "$template" ;; proxy) proxy_template "$template" ;; dns) dns_template "$template" ;; esac } get_user_value() { key="$1" USER="$user" # Parsing domains string=$( cat $V_USERS/$user/user.conf ) # Parsing key=value for keys in $string; do eval ${keys%%=*}=${keys#*=} done # Self reference eval value="$key" # Print value echo "$value" } restart_schedule() { type="$1" period="$2" # Checking period if [ -z "$period" ]; then period=$(grep 'RESTART_PERIOD=' $V_CONF/vesta.conf | cut -f 2 -d \') fi if [ "$period" -le 0 ]; then $V_FUNC/restart_"$type" else echo "$type" >> $V_QUEUE/restart.pipe fi } is_user_free() { # Parsing domain values check_sysuser=$(cut -f 1 -d : /etc/passwd | grep -w "$user" ) # Checking result if [ ! -z "$check_sysuser" ] || [ -e "$V_USERS/$user" ]; then echo "Error: user $user exist" log_event 'debug' "$E_USER_EXIST $V_EVENT" exit $E_USER_EXIST fi } is_user_privileged() { search_user="${1-$user}" # Parsing domain values user_role=$(grep 'ROLE=' $V_USERS/$search_user/user.conf|cut -f 2 -d \' ) # Checking role if [ "$user_role" != 'reseller' ] && [ "$user_role" != 'admin' ]; then echo "Error: user role is $user_role" log_event 'debug' "$E_PERMS_REQUEIURED $V_EVENT" exit $E_PERMS_REQUEIURED fi # Checking role permissions if [ -n "$role" ]; then case "$user_role" in admin) rights='reseller, user' ;; reseller) rights='user' ;; *) rights='no_create' ;; esac # Comparing rights with role check_perms=$(echo "$rights"|grep -w "$role") if [ -z "$check_perms" ]; then echo "Error: user rights are '$rights'" log_event 'debug' "$E_PERMS_REQUEIURED $V_EVENT" exit $E_PERMS_REQUEIURED fi fi } is_package_valid() { if [ ! -e "$V_PKG/$package.pkg" ]; then echo "Error: package is not exist" log_event 'debug' "$E_PKG_NOTEXIST $v_log" exit $E_PKG_NOTEXIST fi } is_user_key_empty() { key="$1" # Parsing ip string=$(cat $V_USERS/$user/user.conf ) # Parsing key=value for keys in $string; do eval ${keys%%=*}=${keys#*=} done # Self reference eval value="$key" # Checkng key if [ ! -z "$value" ] && [ "$value" != 'no' ] && [ "$value" != '0' ]; then echo "Error: value is not empty = $value " log_event 'debug' "$E_VALUE_EXIST $V_EVENT" exit $E_VALUE_EXIST fi } update_user_value() { USER="$1" key="$2" value="$3" # Defining conf conf="$V_USERS/$USER/user.conf" # Parsing conf str=$(cat $conf) # Reading key=values for keys in $str; do eval ${keys%%=*}=${keys#*=} done # Define clean key c_key=$(echo "${key//$/}") eval old="${key}" # Escaping slashes old=$(echo "$old" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g') new=$(echo "$value" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g') # Updating conf sed -i "s/$c_key='${old//\*/\\*}'/$c_key='${new//\*/\\*}'/g" $conf } increase_user_value() { USER="$1" key="$2" # Defining conf conf="$V_USERS/$USER/user.conf" # Deleting $ key=$(echo "${key//$/}") # Parsing current value current_value=$(grep "$key=" $conf |cut -f 2 -d \') # Checking result if [ -z "$current_value" ]; then echo "Error: Parsing error" log_event 'debug' "$E_PARSE_ERROR $V_EVENT" exit $E_PARSE_ERROR fi # Plus one new_value=$(expr $current_value + 1 ) # Changing config sed -i "s/$key='$current_value'/$key='$new_value'/g" $conf } is_web_domain_cert_valid() { # Checking file existance path="$V_USERS/$user/cert" if [ ! -e "$path/$cert.crt" ] || [ ! -e "$path/$cert.key" ]; then echo "Error: certificate not exist" log_event 'debug' "$E_CERT_NOTEXIST $V_EVENT" exit $E_CERT_NOTEXIST fi } is_type_valid() { # Argument defenition sys="$1" stype="$2" # Switching config case $sys in stat) skey='STATS_SYSTEM=';; db) skey='DB_SYSTEM=' ;; *) skey='UNKNOWN' ;; esac # Parsing domain values check_type=$(grep "$skey" $V_CONF/vesta.conf|grep -w $stype) # Checking result if [ -z "$check_type" ]; then echo "Error: unknown type" log_event 'debug' "$E_BAD_TYPE $V_EVENT" exit $E_BAD_TYPE fi } change_user_package() { # Parsing user data usr_data=$(cat $V_USERS/$user/user.conf) for key in $usr_data; do eval ${key%%=*}=${key#*=} done # Parsing package pkg_data=$(cat $V_PKG/$package.pkg) for key in $pkg_data; do eval ${key%%=*}=${key#*=} done echo "PACKAGE='$package' WEB_DOMAINS='$WEB_DOMAINS' WEB_SSL='$WEB_SSL' WEB_ALIASES='$WEB_ALIASES' DATABASES='$DATABASES' MAIL_DOMAINS='$MAIL_DOMAINS' MAIL_BOXES='$MAIL_BOXES' MAIL_FORWARDERS='$MAIL_FORWARDERS' DNS_DOMAINS='$DNS_DOMAINS' DISK_QUOTA='$DISK_QUOTA' BANDWIDTH='$BANDWIDTH' NS1='$NS1' NS2='$NS2' SHELL='$SHELL' BACKUPS='$BACKUPS' TEMPLATES='$TEMPLATES' MAX_CHILDS='$MAX_CHILDS' SUSPENDED='$SUSPENDED' OWNER='$OWNER' ROLE='$ROLE' IP_OWNED='$IP_OWNED' U_CHILDS='$U_CHILDS' U_DISK='$U_DISK' U_BANDWIDTH='$U_BANDWIDTH' U_WEB_DOMAINS='$U_WEB_DOMAINS' U_WEB_SSL='$U_WEB_SSL' U_DNS_DOMAINS='$U_DNS_DOMAINS' U_DATABASES='$U_DATABASES' U_MAIL_DOMAINS='$U_MAIL_DOMAINS' DATE='$DATE'" > $V_USERS/$user/user.conf } get_shell_path() { check_shell=$(/usr/bin/chsh --list-shells | grep -w "$shell" ) echo "$check_shell" } is_user_value_exist() { key="$1" string=$(cat $V_USERS/$user/user.conf ) # Parsing key=value for keys in $string; do eval ${keys%%=*}=${keys#*=} done # Self reference eval value="$key" # Checking result if [ -z "$value" ] || [ "$value" = 'no' ]; then echo "Error: ${key//$/} is empty" log_event 'debug' "$E_VALUE_EMPTY $V_EVENT" exit $E_VALUE_EMPTY fi } decrease_user_value() { USER="$1" key="$2" conf="$V_USERS/$USER/user.conf" # Deleting $ key=$(echo "${key//$/}") # Parsing current value current_value=$(grep "$key=" $conf |cut -f 2 -d \') # Checking result if [ -z "$current_value" ]; then echo "Error: Parsing error" log_event 'debug' "$E_PARSE_ERROR $V_EVENT" exit $E_PARSE_ERROR fi # Checking zero val if [ "$current_value" -gt 0 ]; then # Minus one new_value=$(expr $current_value - 1 ) # Changing config sed -i "s/$key='$current_value'/$key='$new_value'/g" $conf fi } # Json listing function v_json_list() { # Definigng variables i='1' # iterator end=$(($limit + $offset)) # last string value='' # clean start value # Print top bracket echo '{' # Reading file line by line while read line ; do # Checking offset and limit if [ "$i" -ge "$offset" ] && [ "$i" -lt "$end" ] && [ "$offset" -gt 0 ] then # Parsing key=value for key in $line; do eval ${key%%=*}=${key#*=} done # Checking !first line to print bracket if [ "$i" -ne "$offset" ]; then echo -e "\t}," fi j=1 # local loop iterator last_word=$(echo "$fields" | wc -w) # Print data for field in $fields; do eval value=$field # Checking parrent key if [ "$j" -eq 1 ]; then echo -e "\t\"$value\": {" else if [ "$j" -eq "$last_word" ]; then echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"" else echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"," fi fi j=$(($j + 1)) done fi i=$(($i + 1)) done < $conf # If there was any output if [ -n "$value" ]; then echo -e "\t}" fi # Printing bottom json bracket echo -e "}" } # Shell listing function v_shell_list() { # Definigng variables i='1' # iterator end=$(($limit + $offset)) # last string # Print brief info echo "${fields//$/}" for a in $fields; do echo -e "------ \c" done echo # new line # Reading file line by line while read line ; do # Checking offset and limit if [ "$i" -ge "$offset" ] && [ "$i" -lt "$end" ] && [ "$offset" -gt 0 ] then # Parsing key=value for key in $line; do eval ${key%%=*}=${key#*=} done # Print result line eval echo "$fields" fi i=$(($i + 1)) done < $conf } usr_json_single_list() { # Definigng variables USER="$user" # user i=1 # iterator # Define words number last_word=$(echo "$fields" | wc -w) # Reading file line by line line=$(cat $V_USERS/$USER/user.conf) # Print top bracket echo '{' # Parsing key=value for key in $line; do eval ${key%%=*}=${key#*=} done # Starting output loop for field in $fields; do # Parsing key=value eval value=$field # Checking first field if [ "$i" -eq 1 ]; then echo -e "\t\"$value\": {" else if [ "$last_word" -eq "$i" ]; then echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"" else echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"," fi fi # Updating iterator i=$(( i + 1)) done # If there was any output if [ -n "$value" ]; then echo -e "\t}" fi # Printing bottom json bracket echo -e "}" } usr_shell_single_list() { # Definigng variables USER="$user" # user # Reading file line by line line=$(cat $V_USERS/$USER/user.conf) # Parsing key=value for key in $line; do eval ${key%%=*}=${key#*=} done # Print result line for field in $fields; do eval key="$field" echo "${field//$/}: $key " done } usr_json_list() { i='1' # iterator end=$(($limit + $offset)) # last string # Definining user list #user_list=$(find $V_USERS/ -maxdepth 1 -mindepth 1 -type d -printf %P\\n ) user_list=$(ls $V_USERS/) # Print top bracket echo '{' # Starting main loop for USER in $user_list; do # Checking offset and limit if [ "$i" -ge "$offset" ] && [ "$i" -lt "$end" ] && [ "$offset" -gt 0 ] then # Reading user data user_data=$(cat $V_USERS/$USER/user.conf) # Parsing key/value config for key in $user_data; do eval ${key%%=*}=${key#*=} done # Checking !first line to print bracket with coma if [ "$i" -ne "$offset" ]; then echo -e "\t}," fi # Defining local iterator and words count j='1' last_word=$(echo "$fields" | wc -w) # Print data for field in $fields; do eval value=$field # Checking parrent key if [ "$j" -eq 1 ]; then echo -e "\t\"$value\": {" else if [ "$j" -eq "$last_word" ]; then echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"" else echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"," fi fi j=$(($j + 1)) done fi i=$(($i + 1)) done # If there was any output if [ -n "$value" ]; then echo -e "\t}" fi # Printing bottom json bracket echo '}' } usr_shell_list() { i='1' # iterator end=$(($limit + $offset)) # last string # Definining user list #user_list=$(find $V_USERS/ -maxdepth 1 -mindepth 1 -type d -printf %P\\n ) user_list=$(ls $V_USERS/) # Print brief info echo "${fields//$/}" for a in $fields; do echo -e "--------- \c" done echo # new line # Starting main loop for USER in $user_list; do # Checking offset and limit if [ "$i" -ge "$offset" ] && [ "$i" -lt "$end" ] && [ "$offset" -gt 0 ] then # Reading user data user_data=$(cat $V_USERS/$USER/user.conf) # Parsing key/value config for key in $user_data; do eval ${key%%=*}=${key#*=} done # Print result line eval echo "$fields" fi i=$(($i + 1)) done } usrns_json_list() { ns=$(grep "NS[1|2]=" $V_USERS/$user/user.conf |cut -f 2 -d \') # Print top bracket echo '[' i=1 # Listing servers for nameserver in $ns;do if [ "$i" -eq 1 ]; then echo -e "\t\"$nameserver\"," else echo -e "\t\"$nameserver\"" fi i=$((i + 1)) done echo "]" } usrns_shell_list() { ns=$(grep "NS[1|2]=" $V_USERS/$user/user.conf |cut -f 2 -d \') # Print result echo "NAMESERVER" echo "----------" for nameserver in $ns;do echo "$nameserver" done } get_usr_disk() { size='0' # Using tricky way to parse configs dir_usage=$(grep 'U_DIR_DISK=' $V_USERS/$user/user.conf |\ cut -f 2 -d "'") size=$((size + dir_usage)) # Checking web if [ -f "$V_USERS/$user/web_domains.conf" ]; then # Using tricky way to parse configs disk_usage=$(grep 'U_DISK=' $V_USERS/$user/web_domains.conf |\ awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'") for disk in $disk_usage; do size=$((size + disk)) done fi # Checking db if [ -f "$V_USERS/$user/db.conf" ]; then # Using tricky way to parse configs disk_usage=$(grep 'U_DISK=' $V_USERS/$user/db.conf |\ awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'") for disk in $disk_usage; do size=$((size + disk)) done fi # Checking mail if [ -f "$V_USERS/$user/mail_domains.conf" ]; then # Using tricky way to parse configs disk_usage=$(grep 'U_DISK=' $V_USERS/$user/mail_domains.conf |\ awk -F "U_DISK='" '{print $2}'|cut -f 1 -d "'") for disk in $disk_usage; do size=$((size + disk)) done fi echo "$size" } get_usr_traff() { size='0' conf='web_domains.conf' # Checking web if [ -f "$V_USERS/$user/$conf" ]; then # Using tricky way to parse configs bandwidth_usage=$(grep 'U_BANDWIDTH=' $V_USERS/$user/$conf|\ awk -F "U_BANDWIDTH='" '{print $2}'|cut -f 1 -d "'") for bandwidth in $bandwidth_usage; do size=$((size + bandwidth)) done fi echo "$size" } pkg_json_list() { i='1' # iterator end=$(($limit + $offset)) # last string # Print top bracket echo '{' # Starting main loop for package in $(ls $V_DATA/packages); do PACKAGE=${package/.pkg/} # Checking offset and limit if [ "$i" -ge "$offset" ] && [ "$i" -lt "$end" ] && [ "$offset" -gt 0 ] then # Parsing key/value config pkg_descr=$(cat $V_DATA/packages/$package) for key in $pkg_descr; do eval ${key%%=*}=${key#*=} done # Checking !first line to print bracket with coma if [ "$i" -ne "$offset" ]; then echo -e "\t}," fi # Defining local iterator and words count j='1' last_word=$(echo "$fields" | wc -w) # Print data for field in $fields; do eval value=$field # Checking parrent key if [ "$j" -eq 1 ]; then echo -e "\t\"$value\": {" else if [ "$j" -eq "$last_word" ]; then echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"" else echo -e "\t\t\"${field//$/}\": \"${value//,/, }\"," fi fi j=$(($j + 1)) done fi i=$(($i + 1)) done # If there was any output if [ -n "$value" ]; then echo -e "\t}" fi # Printing bottom json bracket echo '}' } pkg_shell_list() { i='1' # iterator end=$(($limit + $offset)) # last string # Listing pkg files for package in $(ls $V_DATA/packages); do PACKAGE=${package/.pkg/} # Checking offset and limit if [ "$i" -ge "$offset" ] && [ "$i" -lt "$end" ] && [ "$offset" -gt 0 ] then # Parsing key=value pkg_descr=$(cat $V_DATA/packages/$package) for key in $pkg_descr; do eval ${key%%=*}=${key#*=} done echo "----------" # Starting output loop for field in $fields; do # Parsing key=value eval value=$field # Checking first field echo -e "${field//$/}: $value" done fi i=$(($i + 1)) done }