You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							271 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
	
	
							271 lines
						
					
					
						
							5.9 KiB
						
					
					
				#!/bin/bash
 | 
						|
# info: search objects
 | 
						|
# options: USER OBJECT [FORMAT]
 | 
						|
#
 | 
						|
# example: v-search-user-object admin example.com json
 | 
						|
#
 | 
						|
# This function that allows to find user objects.
 | 
						|
 | 
						|
#----------------------------------------------------------#
 | 
						|
#                Variables & Functions                     #
 | 
						|
#----------------------------------------------------------#
 | 
						|
 | 
						|
# Argument definition
 | 
						|
user=$1
 | 
						|
object=$2
 | 
						|
format=${3-shell}
 | 
						|
 | 
						|
# Includes
 | 
						|
# shellcheck source=/etc/hestiacp/hestia.conf
 | 
						|
source /etc/hestiacp/hestia.conf
 | 
						|
# shellcheck source=/usr/local/hestia/func/main.sh
 | 
						|
source $HESTIA/func/main.sh
 | 
						|
# load config file
 | 
						|
source_conf "$HESTIA/conf/hestia.conf"
 | 
						|
 | 
						|
# Perform verification if read-only mode is enabled
 | 
						|
check_hestia_demo_mode
 | 
						|
 | 
						|
# Json list function
 | 
						|
json_list_search() {
 | 
						|
	echo '{'
 | 
						|
	fileds_count=$(echo $fields | wc -w)
 | 
						|
	while read line; do
 | 
						|
		eval "$line"
 | 
						|
		if [ -n "$list_data" ]; then
 | 
						|
			echo -e '        },'
 | 
						|
		fi
 | 
						|
		i=1
 | 
						|
		IFS=' '
 | 
						|
		for field in $fields; do
 | 
						|
			eval value=\"$field\"
 | 
						|
			value=$(echo "$value" | sed -e 's/"/\\"/g' -e "s/%quote%/'/g")
 | 
						|
			if [ $i -eq 1 ]; then
 | 
						|
				((++i))
 | 
						|
				echo -e "\t\"$value\": {"
 | 
						|
			else
 | 
						|
				if [ $i -lt "$fileds_count" ]; then
 | 
						|
					((++i))
 | 
						|
					echo -e "\t\t\"${field//$/}\": \"${value//,/, }\","
 | 
						|
				else
 | 
						|
					echo -e "\t\t\"${field//$/}\": \"${value//,/, }\""
 | 
						|
					list_data=1
 | 
						|
				fi
 | 
						|
			fi
 | 
						|
		done
 | 
						|
	done < $conf
 | 
						|
	if [ -n "$list_data" ]; then
 | 
						|
		echo -e '        }'
 | 
						|
	fi
 | 
						|
	echo -e '}'
 | 
						|
}
 | 
						|
 | 
						|
# Shell list function
 | 
						|
shell_list_search() {
 | 
						|
	if [ -z "$nohead" ]; then
 | 
						|
		echo "${fields//$/}"
 | 
						|
		for a in $fields; do
 | 
						|
			echo -e "------ \c"
 | 
						|
		done
 | 
						|
		echo
 | 
						|
	fi
 | 
						|
	while read line; do
 | 
						|
		eval $line
 | 
						|
		eval echo "$fields" | sed "s/%quote%/'/g"
 | 
						|
	done < $conf
 | 
						|
}
 | 
						|
 | 
						|
#----------------------------------------------------------#
 | 
						|
#                    Verifications                         #
 | 
						|
#----------------------------------------------------------#
 | 
						|
 | 
						|
check_args '2' "$#" 'USER OBJECT [FORMAT]'
 | 
						|
is_format_valid 'user' 'object'
 | 
						|
is_object_valid 'user' 'USER' "$user"
 | 
						|
 | 
						|
#----------------------------------------------------------#
 | 
						|
#                       Action                             #
 | 
						|
#----------------------------------------------------------#
 | 
						|
 | 
						|
conf=$(mktemp)
 | 
						|
i=0
 | 
						|
OLD_IFS=$IFS
 | 
						|
IFS=$'\n'
 | 
						|
 | 
						|
# Search query
 | 
						|
search=$(grep "$object" \
 | 
						|
	$HESTIA/data/users/$user/web.conf \
 | 
						|
	$HESTIA/data/users/$user/dns.conf \
 | 
						|
	$HESTIA/data/users/$user/dns/*.conf \
 | 
						|
	$HESTIA/data/users/$user/mail.conf \
 | 
						|
	$HESTIA/data/users/$user/mail/*.conf \
 | 
						|
	$HESTIA/data/users/$user/db.conf \
 | 
						|
	$HESTIA/data/users/$user/cron.conf 2> /dev/null)
 | 
						|
 | 
						|
for row in $search; do
 | 
						|
	# Initialise variable
 | 
						|
	key=''
 | 
						|
	result=''
 | 
						|
	dom_alias=''
 | 
						|
	suspended=''
 | 
						|
	object_link=''
 | 
						|
	object_parent=''
 | 
						|
	object_time=''
 | 
						|
	object_date=''
 | 
						|
 | 
						|
	# Parsing result
 | 
						|
	type=$(echo $row | cut -f 1 -d : | cut -f 8 -d /)
 | 
						|
	data=$(echo $row | cut -f 2,3,4,5 -d :)
 | 
						|
	eval "$data"
 | 
						|
 | 
						|
	# Check WEB domain
 | 
						|
	if [ "$type" = 'web.conf' ]; then
 | 
						|
		if [ -n "$(echo $DOMAIN | grep $object)" ]; then
 | 
						|
			# Check domain alias
 | 
						|
			check_alias="$(echo $ALIAS | tr ',' '\n' | grep $object)"
 | 
						|
			if [ -n "$check_alias" ]; then
 | 
						|
				dom_alias=$(echo $check_alias | tr ' ' ',')
 | 
						|
			fi
 | 
						|
			key="DOMAIN"
 | 
						|
			result="$DOMAIN"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		else
 | 
						|
			check_alias="$(echo $ALIAS | tr ',' '\n' | grep $object)"
 | 
						|
			if [ -n "$check_alias" ]; then
 | 
						|
				key="DOMAIN"
 | 
						|
				result="$DOMAIN"
 | 
						|
				object_parent="$DOMAIN"
 | 
						|
				dom_alias=$(echo $check_alias | tr ' ' ',')
 | 
						|
				suspended=$SUSPENDED
 | 
						|
				object_time=$TIME
 | 
						|
				object_date=$DATE
 | 
						|
				((i++))
 | 
						|
			fi
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	# DNS
 | 
						|
	if [ "$type" = 'dns.conf' ]; then
 | 
						|
		if [ -n "$(echo $DOMAIN | grep $object)" ]; then
 | 
						|
			key="DOMAIN"
 | 
						|
			result="$DOMAIN"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	# DNS Records
 | 
						|
	if [ "$type" = 'dns' ]; then
 | 
						|
		if [ -n "$(echo $RECORD | grep $object)" ]; then
 | 
						|
			key="RECORD"
 | 
						|
			result="$RECORD.$DOMAIN"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_link=$ID
 | 
						|
			object_parent=$DOMAIN
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	# MAIL
 | 
						|
	if [ "$type" = 'mail.conf' ]; then
 | 
						|
		if [ -n "$(echo $DOMAIN | grep $object)" ]; then
 | 
						|
			key="DOMAIN"
 | 
						|
			result="$DOMAIN"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	# Mail Accounts
 | 
						|
	if [ "$type" = 'mail' ]; then
 | 
						|
		type='mail'
 | 
						|
		if [ -n "$(echo $ACCOUNT | grep $object)" ]; then
 | 
						|
			key="ACCOUNT"
 | 
						|
			dom="$(echo $row | cut -f 1 -d : | cut -f 9 -d / | sed 's/.conf//')"
 | 
						|
			result="$ACCOUNT@$dom"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_link=$ACCOUNT
 | 
						|
			object_parent=$dom
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	# DB
 | 
						|
	if [ "$type" = 'db.conf' ]; then
 | 
						|
		if [ -n "$(echo $DB | grep $object)" ]; then
 | 
						|
			key="DATABASE"
 | 
						|
			result="$DB"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	# Cron Jobs
 | 
						|
	if [ "$type" = 'cron.conf' ]; then
 | 
						|
		if [ -n "$(echo $CMD | grep $object)" ]; then
 | 
						|
			key="JOB"
 | 
						|
			result="$CMD"
 | 
						|
			suspended=$SUSPENDED
 | 
						|
			object_link=$JOB
 | 
						|
			object_parent=$JOB
 | 
						|
			object_time=$TIME
 | 
						|
			object_date=$DATE
 | 
						|
			((i++))
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
 | 
						|
	if [ -n "$result" ]; then
 | 
						|
		type=$(echo $type | cut -f1 -d \.)
 | 
						|
		str="ID='$i' USER='$user' TYPE='$type' KEY='$key'"
 | 
						|
		str="$str RESULT='$result' ALIAS='$dom_alias'"
 | 
						|
		str="$str LINK='$object_link' PARENT='$object_parent'"
 | 
						|
		str="$str SUSPENDED='$suspended' TIME='$object_time'"
 | 
						|
		str="$str DATE='$object_date'"
 | 
						|
		echo $str >> $conf
 | 
						|
	fi
 | 
						|
done
 | 
						|
 | 
						|
IFS=$OLD_IFS
 | 
						|
 | 
						|
# Defining fileds to select
 | 
						|
fields='$ID $USER $TYPE $KEY $RESULT $ALIAS $LINK $PARENT $SUSPENDED $TIME'
 | 
						|
fields="$fields \$DATE"
 | 
						|
 | 
						|
# Listing domains
 | 
						|
case $format in
 | 
						|
	json) json_list_search ;;
 | 
						|
	plain)
 | 
						|
		nohead=1
 | 
						|
		shell_list_search
 | 
						|
		;;
 | 
						|
	shell)
 | 
						|
		fields='$USER~$TYPE~$KEY~$RESULT~$ALIAS'
 | 
						|
		shell_list | column -t -s '~'
 | 
						|
		;;
 | 
						|
	*) check_args '2' '0' 'USER OBJECT [FORMAT]' ;;
 | 
						|
esac
 | 
						|
 | 
						|
rm $conf
 | 
						|
 | 
						|
#----------------------------------------------------------#
 | 
						|
#                       Hestia                             #
 | 
						|
#----------------------------------------------------------#
 | 
						|
 | 
						|
# Logging
 | 
						|
#log_event "$OK" "$ARGUMENTS"
 | 
						|
 | 
						|
exit
 |