#!/bin/bash
# info: search objects
# options: OBJECT [FORMAT]
#
# example: v-search-object example.com json
#
# This function that allows to find system objects.

#----------------------------------------------------------#
#                Variables & Functions                     #
#----------------------------------------------------------#

# Argument definition
object=$1
format=${2-shell}

# Includes
# shellcheck source=/etc/tuliocp/tulio.conf
source /etc/tuliocp/tulio.conf
# shellcheck source=/usr/local/tulio/func/main.sh
source $TULIO/func/main.sh
# shellcheck source=/usr/local/tulio/conf/tulio.conf
source $TULIO/conf/tulio.conf
# load config file
source_conf "$TULIO/conf/tulio.conf"

# Perform verification if read-only mode is enabled
check_tulio_demo_mode

# Json list function
json_list_search() {
	local fields_clean line
	local id_var id_value
	local var value
	local first_object first_field

	fields_clean=$(printf '%s\n' "$fields" | tr '~' ' ' | sed 's/\$//g')

	set -- $fields_clean
	id_var="$1"
	shift

	first_object=1

	echo '{'

	while IFS= read -r line; do
		parse_object_kv_list_non_eval "$line"

		id_value="${!id_var}"
		id_value=$(printf '%s' "$id_value" | sed \
			-e 's/\\/\\\\/g' \
			-e 's/"/\\"/g' \
			-e "s/%quote%/'/g")

		if [ "$first_object" -eq 0 ]; then
			echo ','
		fi
		first_object=0

		printf '\t"%s": {\n' "$id_value"

		first_field=1
		for var in "$@"; do
			value="${!var}"
			value=$(printf '%s' "$value" | sed \
				-e 's/\\/\\\\/g' \
				-e 's/"/\\"/g' \
				-e "s/%quote%/'/g")

			if [ "$first_field" -eq 0 ]; then
				echo ','
			fi
			first_field=0

			printf '\t\t"%s": "%s"' "$var" "${value//,/, }"
		done

		echo
		printf '\t}'
	done < "$conf"

	echo
	echo '}'
}

# Shell list function
shell_list_search() {
	local field var row fields_for_loop
	sep=${sep:-' '}

	fields_for_loop=$(echo "$fields" | tr '~' ' ' | sed 's/\$//g')

	if [ -z "$nohead" ]; then
		echo "$fields_for_loop" | tr ' ' "$sep"
		for field in $fields_for_loop; do
			printf -- "------%s" "$sep"
		done
		echo
	fi

	while read -r line; do
		parse_object_kv_list_non_eval "$line"

		row=''
		for field in $fields_for_loop; do
			if [ -z "$row" ]; then
				row="${!field}"
			else
				row="${row}${sep}${!field}"
			fi
		done

		echo "$row" | sed "s/%quote%/'/g"
	done < "$conf"
}

#----------------------------------------------------------#
#                    Verifications                         #
#----------------------------------------------------------#

check_args '1' "$#" 'OBJECT [FORMAT]'
is_format_valid 'object'

#----------------------------------------------------------#
#                       Action                             #
#----------------------------------------------------------#

conf=$(mktemp)
trap 'rm -f $conf' EXIT
i=0
OLD_IFS=$IFS
IFS=$'\n'

# User loop
for user in $("$BIN/v-list-users" list); do
	# Search query
	search=$(grep "$object" \
		$TULIO/data/users/$user/web.conf \
		$TULIO/data/users/$user/dns.conf \
		$TULIO/data/users/$user/dns/*.conf \
		$TULIO/data/users/$user/mail.conf \
		$TULIO/data/users/$user/mail/*.conf \
		$TULIO/data/users/$user/db.conf \
		$TULIO/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 :)
		parse_object_kv_list_non_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
done
IFS=$OLD_IFS

# Defining fileds to select
fields='ID USER TYPE KEY RESULT ALIAS LINK PARENT SUSPENDED TIME DATE'

# Listing domains
case $format in
	json) json_list_search ;;
	plain)
		nohead=1
		shell_list_search | tr -s ' '
		;;
	shell)
		fields='$USER~$TYPE~$KEY~$RESULT~$ALIAS'
		sep='~'
		shell_list_search | column -t -s '~'
		;;
	*) check_args '1' '0' 'OBJECT [FORMAT]' ;;
esac

rm -f "$conf"

#----------------------------------------------------------#
#                       Tulio                             #
#----------------------------------------------------------#

exit
