#!/bin/bash

# shellcheck shell=sh
# shellcheck disable=SC2034 
# shellcheck disable=SC2059
# shellcheck disable=SC1091
# shellcheck disable=SC1090
# shellcheck disable=SC2116

set -e
#set -x

if [ "$(id -u)" -ne 0 ]; then
	echo "$0 needs root: please use sudo."
	exit 1
fi

# Source Auxilium (args parser)
. /usr/share/auxilium/auxilium.sh

auxilium_init "$(basename "$0")" -m 'Displays list of devices and their physical location'

auxilium_add redmine -s r -t opt -m 'Format for redmine'
auxilium_add field -s f -t str -l "id|mount_point|majmin|scsi|vendor|serial|model|firmware|size|description|fo_name|kname" -d "serial" -m 'Field to display under Device Name'
auxilium_add csv -t opt -m 'Return a CSV formatted list of devices (id,kname,mount-point,scsi,majmin,status,vendor,model,serial,firmware,size,description)'
auxilium_add locate -t positional -a -m 'List of device to locate (sdx or BoxXDiskX)'


if [ -f "/usr/share/ferreus-orbit/common.sh" ]; then
	. "/usr/share/ferreus-orbit/common.sh"
elif [ -f "share/common.sh" ] ; then
	. "share/common.sh"
elif [ -f "../share/common.sh" ] ; then
	. "../share/common.sh"
else
	echo "Cannot load common.sh: exiting"
	exit 1
fi

auxilium_parse "$@"

fo_lock

fo_get_name(){
	width="$2"
	locate="False"
	fo_name="$1"
	# shellcheck disable=SC2046
	# shellcheck disable=SC2005
	fullname=$(echo $(fo_get_disk_info "${fo_name}" mount_point)|awk '{print $1}')
	name=$(basename "${fullname}")
	# shellcheck disable=SC2154
	[ "${name}" = "$AUXILIUM_ARG_locate" ] && locate="True"
	mount | grep -q "${fullname}" || name="${UNMOUNTED}${name}"
	fo_center_align "$width" "$(fo_contain "$AUXILIUM_ARG_locate" "${name}")" "$name"
}

fo_get_field(){
	fo_name="$1"
	# shellcheck disable=SC2154
	field="$AUXILIUM_ARG_field"
	# name=$(fo_get_disk_info "${fo_name}" mount_point)
	# [ -z "$name" ] && name=$(fo_get_disk_info "${fo_name}" kname)
	shortname=$(basename "${fo_name}" 2>/dev/null)
	f=$(fo_get_disk_info "${fo_name}" "${field}")
	echo "$f"
}

fo_format_textile(){
	unset fo_format_text fo_format_locate
	# shellcheck disable=SC2086
	fo_format_text=$(echo $1)
	fo_format_locate=$2
	if [ -z "$fo_format_locate" ] || [ "$fo_format_locate" -eq 0 ]; then
		echo "$fo_format_text"
	else
	 echo "<{background:red;color:white;font-weight:bold}.${fo_format_text}"
	fi
}

fo_display_array_textile(){
	unset header footer
	if [ "$1" = "--header" ]; then
		header='True'
		shift 1
	fi
	fo_name="$1"
	k_name="$2"
	size="$3"
	[ "${size}" = "null" ] && size=0
	model="$4"
	sn="$5"
	fw="$6"
	descr="$7"
	if [ -n "${header}" ]; then
		printf -- "|_.%s|_.%s|_.%s|_.%s|_.%s|_.%s|\n" "$fo_name" "$size" "$model" "$sn" "$fw" "$descr"
	else
		unset to_locate
		if [ -z "$fo_name" ]; then
			eval "$(udevadm info -q property --export "${k_name}")"
			fo_name="/srv/node/$(fo_get_sorted_name)"
		fi
		short_fo=$(basename "${fo_name}" 2>/dev/null)
		if [ -n "${fo_name}" ] && [ "$(fo_contain "${AUXILIUM_ARG_locate}" "${short_fo}")" -eq 1 ]; then
			to_locate=1
		fi
		printf -- "|%s|%s|%s|%s|%s|%s|\n"\
						"$(fo_format_textile "$fo_name" "$to_locate")"\
						"$(fo_format_textile "$size" "$to_locate")"\
						"$(fo_format_textile "$model" "$to_locate")"\
						"$(fo_format_textile "$sn" "$to_locate")"\
						"$(fo_format_textile "$fw" "$to_locate")"\
						"$(fo_format_textile "$descr" "$to_locate")"
	fi
}

fo_display_array(){
	unset header footer
	if [ "$1" = "--header" ]; then
		header='True'
		shift 1
	elif [ "$1" = "--footer" ]; then
		footer='True'
		shift 1
	fi
	fo_name="$1"
	k_name="$2"
	size="$3"
	[ "${size}" = "null" ] && size=0
	model="$4"
	sn="$5"
	fw="$6"
	descr="$7"
	color_begin=''
	color_end=''
	arrow=''
	to_locate=0
	lentotal=$((LEN_MODEL + LEN_SN + LEN_MOUNT + 47))
	lenm=$LEN_MOUNT
	if [ -n "${header}" ]; then
		fo_repeat_char '_' $lentotal;echo
		printf -- "|%-${lenm}s|%-15s|%-${LEN_MODEL}s|%-${LEN_SN}s|%-10s|%-15s|\n" "$fo_name" "$size" "$model" "$sn" "$fw" "$descr"
		printf -- "|$(fo_repeat_char '-' ${lenm})|---------------|$(fo_repeat_char '-' "${LEN_MODEL}")|$(fo_repeat_char '-' "${LEN_SN}")|----------|---------------|\n"
	elif [ -n "${footer}" ]; then
		fo_repeat_char '¯' $lentotal;echo ' '
	else
		if [ -z "$fo_name" ]; then
			eval "$(udevadm info -q property --export "${k_name}")"
			fo_name="/srv/node/$(fo_get_sorted_name)"
		fi
		short_fo=$(basename "${fo_name}" 2>/dev/null)
		short_k=$(basename "${k_name}" 2>/dev/null)
		if [ -n "${fo_name}" ] && [ "$(fo_contain "${AUXILIUM_ARG_locate}" "${short_fo}")" -eq 1 ]; then
			to_locate=1
		fi
		if [ "$to_locate" -eq 1 ];then
			color_begin="${RED}"
			color_end="${NORM}"
		fi
		printf -- "|${color_begin}%-${lenm}s|%-15s|%-${LEN_MODEL}s|%-${LEN_SN}s|%-10s|%-15s${color_end}|\n" "${short_fo}" "${size}" "$model" "$sn" "$fw" "$descr"
	fi
}

fo_write_disks_infos(){
	did="$1"
	kname="$2"
	mount_point="$3"
	scsi="$4"
	majmi="$5"
	vendor="$6"
	model="$7"
	serial="$8"
	version="$9"
	shift 9
	size="$1"
	descr="$2"
	eval "$(udevadm info -q property --export "${kname}")"
	fo_name=$(fo_get_sorted_name -f)
	if [ -z "$mount_point" ] || [ "$mount_point" = "/" ]; then
		eval "$(udevadm info -q property --export "${kname}")"
		mount_point="/srv/node/$(fo_get_sorted_name)"
	fi
	printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
				"${id}" \
				"$kname" \
				"$mount_point" \
				"$fo_name" \
				"$scsi" \
				"$majmin" \
				"$vendor" \
				"$model" \
				"$serial" \
				"$version" \
				"$size" \
				"$descr" >> "$FO_CACHE_DISKS_INFOS"
}

fo_write_disks_jbod(){
	type="$1"
	controller=$2
	eidslt="$3"
	did="$4"
	model="$5"
	dg="$6"
	state="$7"
	size="$8"
	fo_eid=$(echo "$eidslt" | cut -d: -f1)
	fo_slt=$(echo "$eidslt" | cut -d: -f2)
	if [ -z "$fo_eid" ]; then
		fo_raid_path="/c${controller}/s${fo_slt}"
	else
		fo_raid_path="/c${controller}/e${fo_eid}/s${fo_slt}"
	fi
	fo_jbod=$(jq -r ".\"JBOD LIST\"|select(.!=null)[]|select(.\"EID:Slt\"==\"${eidslt}\")" "${FO_CACHE_FILE_STORCLI}")
	vendor=$(printf "%s\n" "${fo_jbod}"|jq -r '.Vendor')
	id=$(printf "%s\n" "${fo_jbod}"|jq -r '.ID')
	did=$(printf "%s\n" "${fo_jbod}"|jq -r '.DID')
	fo_drive_detailed="$(mktemp)"
	jq -r ".|to_entries[]|select(.key==\"Drive ${fo_raid_path} - Detailed Information\").value.\"Drive ${fo_raid_path} Device attributes\"|.SN+\",\"+.\"Firmware Revision\"" "${FO_CACHE_FILE_STORCLI}" > "$fo_drive_detailed"
	IFS=, read -r sn fw < "$fo_drive_detailed"
	rm "$fo_drive_detailed"
	kname="/dev/$(fo_get_kname "$id")"
	eval "$(udevadm info -q property --export "${kname}")"
	fo_name=$(fo_get_sorted_name -f)
	mount_point=$(mount |grep "${kname}" | cut -d' ' -f3)
	majmin="${MAJOR}:${MINOR}"
	scsi=$(echo "$ID_PATH" | cut -d- -f4)
	descr="${type}: ${state}"
	if [ -z "$mount_point" ] || [ "$mount_point" = "/" ]; then
		eval "$(udevadm info -q property --export "${kname}")"
		mount_point="/srv/node/$(fo_get_sorted_name)"
	fi
	printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
		"$did" \
		"$kname" \
		"$mount_point" \
		"$fo_name" \
		"$scsi" \
		"$majmin" \
		"$vendor" \
		"$model" \
		"$sn" \
		"$fw" \
		"$size" \
		"$descr" >> "$FO_CACHE_DISKS_INFOS"
	unset did kname fo_name mount_point scsi majmin vendor sn fw size descr
}

fo_write_disks_raid0(){
	type="$1"
	controller="$2"
	eidslt="$3"
	did="$4"
	model="$5"
	dg="$6"
	state="$7"
	size="$8"
	fo_eid=$(echo "$eidslt" | cut -d: -f1)
	fo_slt=$(echo "$eidslt" | cut -d: -f2)
	if [ "$fo_eid" = " " ]; then
		fo_raid_path="/c${controller}/s${fo_slt}"
	else
		fo_raid_path="/c${controller}/e${fo_eid}/s${fo_slt}"
	fi
	# [ "$type" = '-' ] && [ "$dg" != "-" ] && type=$(jq -r ".[\"TOPOLOGY\"]|select(.!=null)[]|select(.DG==$dg)|select(.Arr==\"-\").Type" "${FO_CACHE_FILE_STORCLI}")
	if [ -z "$type" ] ; then 
		fo_drive_detailed="$(mktemp)"
		jq -r ".|to_entries[]|select(.key==\"Drive ${fo_raid_path} - Detailed Information\").value.\"Drive ${fo_raid_path} Device attributes\"|.\"Manufacturer Id\"+\",\"+.SN+\",\"+.\"Firmware Revision\"" "${FO_CACHE_FILE_STORCLI}" > "$fo_drive_detailed"
		IFS=, read -r vendor sn fw < "$fo_drive_detailed"
		rm "$fo_drive_detailed"
		kname="/dev/$(fo_get_kname "$did" "$fo_raid_path")"
		eval "$(udevadm info -q property --export "${kname}")"
		fo_name=$(fo_get_sorted_name -f)
		mount_point=$(mount |grep "${kname}" | cut -d' ' -f3)
		majmin="${MAJOR}:${MINOR}"
		scsi=$(echo "$ID_PATH" | cut -d- -f4)
		descr="JBOD: ${state}"
	elif [ "$type" = '-' ]; then
		if [ "$dg" != "-" ]; then
			type=$(jq -r ".[\"TOPOLOGY\"]|select(.!=null)[]|select(.DG==$dg)|select(.Arr==\"-\").Type" "${FO_CACHE_FILE_STORCLI}")
			fo_drive_detailed="$(mktemp)"
			jq -r ".[]|to_entries[]|select(.key==\"Drive ${fo_raid_path} Device attributes\").value|.\"Manufacturer Id\"+\"^\"+.SN+\"^\"+.\"Firmware Revision\"" "${FO_CACHE_FILE_STORCLI}" 2>/dev/null  > "$fo_drive_detailed"
			IFS=^ read -r vendor sn fw < "$fo_drive_detailed"
			rm "$fo_drive_detailed"
			kname="/dev/$(fo_get_kname "$dg" "$fo_raid_path")"
			eval "$(udevadm info -q property --export "${kname}")"
			fo_name=$(fo_get_sorted_name -f)
			mount_point=$(mount |grep "${kname}" | cut -d' ' -f3)
			majmin="${MAJOR}:${MINOR}"
			scsi=$(echo "$ID_PATH" | cut -d- -f4)
			descr="${type}: ${state}"
		fi
	fi
	if [ -z "$mount_point" ] || [ "$mount_point" = "/" ]; then
		eval "$(udevadm info -q property --export "${kname}")"
		mount_point="/srv/node/$(fo_get_sorted_name)"
	fi
	# shellcheck disable=SC2086
	vendor=$(echo $vendor)
	# shellcheck disable=SC2086
	model=$(echo $model)
	# shellcheck disable=SC2086
	sn=$(echo $sn)
	[ -z "$model" ] && model=$ID_MODEL
	[ -z "$fw" ] && fw=$ID_REVISION
	printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
		"$did" \
		"$kname" \
		"$mount_point" \
		"$fo_name" \
		"$scsi" \
		"$majmin" \
		"$vendor" \
		"$model" \
		"$sn" \
		"$fw" \
		"$size" \
		"$descr" >> "$FO_CACHE_DISKS_INFOS"
	unset did kname fo_name mount_point scsi majmin vendor sn fw size descr
}

fo_load_disks_infos(){
	# File format : did,kname,mountpoint,fo_name,scsi,majmin,
	# vendor,model,serial,version,size,description
	#id,kname,mountpoint,scsi,majmin,status,vendor,model,serial,version,size,description
	fo_use_cache_file "${FO_CACHE_DISKS_INFOS}" && return 0
	if fo_check_raid; then
		fo_dl="$(mktemp)"
		jq -r '.|select(.!=null)|."PD LIST"[]+{"Controller":.Controller}' "${FO_CACHE_FILE_STORCLI}" > "$fo_dl" 2>/dev/null
		jq -r '.|select(.!=null)|."Drive LIST"[]+{"Controller":.Controller}' "${FO_CACHE_FILE_STORCLI}" >> "$fo_dl" 2>/dev/null
		fo_jb="$(mktemp)"
		jq -r '.|.Type+","+(.Controller|tostring)+","+."EID:Slt"+","+(.DID|tostring)+","+.Model+","+(.DG|tostring)+","+.State+","+.Size' "$fo_dl" > "$fo_jb"
		while IFS=, read -r type controller eidslt did model dg state size;do
			if [ "$type" = "JBOD" ]; then
			 fo_write_disks_jbod "$type" "$controller" "$eidslt" "$did" "$model" "$dg" "$state" "$size"
			else
			 fo_write_disks_raid0 "$type" "$controller" "$eidslt" "$did" "$model" "$dg" "$state" "$size"
			fi
		done < "$fo_jb"
		rm  "$fo_jb" "$fo_dl" || true
		for i in /dev/sd[a-z]; do
			if ! grep -q "$i" "$FO_CACHE_DISKS_INFOS" && [ -z "$FO_LSHW_VALID" ]; then
				fo_hw=$(mktemp)
				lshw -c disk -json \
				| jq -r ".[]|select(.logicalname==\"${i}\")" \
				| jq -r 'select(.id!="medium")|
				         .id+","+.description+","+.vendor+","+.product+","+.businfo+","+.version+","+.serial+","+(.size|tostring)' > "$fo_hw"
				 IFS=, read -r id descr vendor model businfo fw sn size < "$fo_hw"
				 id=$(echo "$id" | cut -d: -f2)
				 scsi=$(echo "$businfo" | cut -d@ -f2)
				 size="$(numfmt --to iec "$size")B ($(numfmt --to iec-i "$size")B)"
				 majmin=$(lsblk "${i}" -n -J | jq -r '.[][]."maj:min"')
				 fo_write_disks_infos "${id}" "${i}" "" "$scsi" "$majmin" "$vendor" "$model" "$sn" "$fw" "$size" "$descr"
				unset id scsi majmin vendor model serial version size descr
			fi
		done
	else
		fo_use_cache_file "${FO_CACHE_FILE_LSHW}" || lshw -c disk 2>/dev/null > "${FO_CACHE_FILE_LSHW}" || true
		while IFS=: read -r k v; do
			# shellcheck disable=SC2086
			k=$(echo ${k})
			[ -z "$skip" ] || continue
			case "$k" in
			'*-cdrom')
					[ -n "$id" ] && fo_write_disks_infos "${id}" "$kname" "$mount_point" "$scsi" "$majmin" "$vendor" "$model" "$serial" "$version" "$size" "$descr"
					unset id kname mount_point scsi majmin vendor model serial version size descr
					skip=1
			;;
			'*-disk')
				if [ -z "$v" ]; then
					[ -n "$id" ] && fo_write_disks_infos "${id}" "$kname" "$mount_point" "$scsi" "$majmin" "$vendor" "$model" "$serial" "$version" "$size" "$descr"
					unset id kname mount_point scsi majmin vendor model serial version size descr
					skip=1
				else
					[ -n "$id" ] && fo_write_disks_infos "${id}" "$kname" "$mount_point" "$scsi" "$majmin" "$vendor" "$model" "$serial" "$version" "$size" "$descr"
					unset skip kname id mount_point scsi majmin vendor model serial version size descr
					id="${v}"
				fi
				;;
			'description')
				# shellcheck disable=SC2086
				descr=$(echo ${v})
			;;
			'logical name')
				case "$v" in
				" /dev/"*)
					# shellcheck disable=SC2086
					kname=$(echo ${v})
					;;
				" /srv/node/"*)
					# shellcheck disable=SC2086
					mount_point=$(echo ${v})
					;;
				esac
			;;
			'vendor')
				# shellcheck disable=SC2086
				vendor=$(echo ${v})
			;;
			'product')
				# shellcheck disable=SC2086
				model=$(echo ${v})
			;;
			'bus info')
				scsi=$(echo "${v}" | cut -d@ -f2)
			;;
			'version')
				# shellcheck disable=SC2086
				version=$(echo ${v})
			;;
			'serial')
				# shellcheck disable=SC2086
				serial=$(echo ${v})
			;;
			'size')
				# shellcheck disable=SC2086
				size=$(echo ${v})
			;;
			esac
		done < "${FO_CACHE_FILE_LSHW}"
		[ -z "$skip" ] && fo_write_disks_infos "$id" "$kname" "$mount_point" "$scsi" "$majmin" "$vendor" "$model" "$serial" "$version" "$size" "$descr"
	fi
}

fo_get_disk_info(){
	field="$2"
	search=",${1},"
	grep "${search}" "${FO_CACHE_DISKS_INFOS}" > /tmp/fo_grp
	while IFS=, read -r id kname mount_point fo_name scsi majmin vendor model serial fw size descr; do
		case "$field" in
		id)
			echo "${id}"
		;;
		majmin)
			echo "${majmin}"
		;;
		scsi)
			echo "${scsi}"
		;;
		vendor)
			echo "${vendor}"
		;;
		serial)
			echo "${serial}"
		;;
		model)
			echo "${model}"
		;;
		firmware)
			echo "${fw}"
		;;
		description)
			echo "${descr}"
		;;
		mount_point)
			echo "${mount_point}"
		;;
		fo_name)
			echo "${fo_name}"
		;;
		kname)
			echo "${kname}"
		;;
		size)
			echo "${size}"
		;;
		esac
	done < /tmp/fo_grp
	rm /tmp/fo_grp
}


main(){
	if [ -z "$AUXILIUM_ARG_sh_completion" ]; then
		fo_init
	fi
	fo_load_disks_infos || true
	if [ -n "$AUXILIUM_ARG_locate" ]; then
		for i in $AUXILIUM_ARG_locate; do
			grep -q "/srv/node/${i}" "$FO_CACHE_DISKS_INFOS"|| fo_write_by_fo_name "/srv/node/${i}"
		done
	fi
	if [ -z "$AUXILIUM_ARG_csv" ]; then
		if [ -z "$AUXILIUM_ARG_redmine" ]; then
			LEN_SN=15
			LEN_MODEL=18
			LEN_MOUNT=7
			while IFS="," read -r id kname mount_point fo_name scsi majmin vendor model serial fw size descr
			do
				[ "${#serial}" -gt "$LEN_SN" ] && LEN_SN=${#serial}
				[ "${#model}" -gt "$LEN_MODEL" ] && LEN_MODEL=${#model}
				mp=$(basename "$mount_point")
				[ "${#mp}" -gt "$LEN_MOUNT" ] && LEN_MOUNT=${#mp}
			done < "$FO_CACHE_DISKS_INFOS"
			fo_display_array --header "Mount Point" "" Size Model Serial Firmware Description

			sort -t ',' -k 3 -o "$FO_CACHE_DISKS_INFOS" "$FO_CACHE_DISKS_INFOS"
			while IFS="," read -r id kname mount_point fo_name scsi majmin vendor model serial fw size descr
			do
				fo_display_array "$mount_point" "$kname" "$size" "$model" "$serial" "$fw" "$descr"
			done < "$FO_CACHE_DISKS_INFOS"
			fo_display_array --footer;echo
			sort -t ',' -k 1 -o "$FO_CACHE_DISKS_INFOS" "$FO_CACHE_DISKS_INFOS"
			LEN_FIELD=18
			[ "$AUXILIUM_ARG_field" = "serial" ] && LEN_FIELD=$LEN_SN
			[ "$AUXILIUM_ARG_field" = "model" ] && LEN_FIELD=$LEN_MODEL
			underscore=$(fo_repeat_char '_' "${LEN_FIELD}")
			minus=$(fo_repeat_char '-' "${LEN_FIELD}")
			higher=$(fo_repeat_char '¯' "${LEN_FIELD}")
			FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{UNDERSCORE}%${underscore}%g")
			FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{MINUS}%${minus}%g")
			FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{HIGHER}%${higher}%g")
			while IFS="," read -r id kname mount_point fo_name scsi majmin vendor model serial fw size descr
			do
				n=$(fo_get_name "$fo_name" "${LEN_FIELD}")
				f=$(fo_get_field "$fo_name")
				unset pfx
				for fi in $f; do
					shortname=$(basename "$mount_point")
					fie=$(fo_center_align "${LEN_FIELD}" "$(fo_contain "$AUXILIUM_ARG_locate" "$shortname")" "$fi")
					FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{${fo_name}}%${n}%" 2>/dev/null)
					FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{SN${pfx}_${fo_name}}%${fie}%" 2>/dev/null)
					pfx="2"
				done
			done < "$FO_CACHE_DISKS_INFOS"
			# final replace {new_line} by \n and @ by \
			# shellcheck disable=SC1003
			FO_DISPOSITION=$(printf "${FO_DISPOSITION}"|sed "s%{new_line}%\n%g"| tr '@' '\\')
			printf "${FO_DISPOSITION}\n"
		else
			fo_textile_file=$(mktemp)
			fo_display_array_textile  --header "Mount Point" "" "Size" "Model" "Serial" "Firmware" "Description" > "$fo_textile_file"
			sort -t ',' -k 3 -o "$FO_CACHE_DISKS_INFOS" "$FO_CACHE_DISKS_INFOS"
			while IFS="," read -r id kname mount_point fo_name scsi majmin vendor model serial fw size descr
			do
				fo_display_array_textile "$mount_point" "$kname" "$size" "$model" "$serial" "$fw" "$descr" >> "$fo_textile_file"
			done < "$FO_CACHE_DISKS_INFOS"
			sort -t ',' -k 1 -o "$FO_CACHE_DISKS_INFOS" "$FO_CACHE_DISKS_INFOS"
			while IFS="," read -r id kname mount_point fo_name scsi majmin vendor model serial fw size descr
			do
				f=$(fo_get_field "$fo_name")
				unset fo_pfx fo_txt fo_to_locate fo_unmounted
				for fi in $f; do
					shortname=$(basename "$mount_point")
					mountpoint -q "${mount_point}" || fo_unmounted=true
					fo_to_locate="$(fo_contain "$AUXILIUM_ARG_locate" "$shortname")"
					# shellcheck disable=SC2086
					fie=$(echo $fi)
					fo_txt="*${shortname}*\n${fie}"
					mountpoint -q "${mount_point}" || fo_txt="-${fo_txt}-"
					if [ "$fo_to_locate" -eq 1 ]; then
						fo_noborder_txt="={border:0;border-top:1px solid black;font-weight;bold;background:red;color:white}.${fo_txt}"
						fo_txt="={font-weight;bold;background:red;color:white}.${fo_txt}"
					else
						fo_noborder_txt="={border:0;border-top:1px solid black}.${fo_txt}"
						fo_txt="=.${fo_txt}"
					fi
					FO_TEXTILE=$(printf "${FO_TEXTILE}"|sed "s%{${fo_name}${fo_pfx}}%${fo_txt}%")
					FO_TEXTILE_NOBORDER=$(printf "${FO_TEXTILE_NOBORDER}"|sed "s%{${fo_name}${fo_pfx}}%${fo_noborder_txt}%")
					fo_pfx="_2"
				done
			done < "$FO_CACHE_DISKS_INFOS"
			# shellcheck disable=SC1003
			[ -n "$FO_TEXTILE_NOBORDER" ] && printf "${FO_TEXTILE_NOBORDER}\n"|sed "s%{new_line}%\n%g"| tr '~' '&'|tr '!' '\\'|tr '@' '%' >> "$fo_textile_file"
			printf "${FO_TEXTILE}\n"|sed "s%{new_line}%\n%g"| tr '~' '&'|tr '!' '\\'|tr '@' '%' >> "$fo_textile_file"
			cat "$fo_textile_file"
			rm "$fo_textile_file"
		fi
	else
		cat "$FO_CACHE_DISKS_INFOS"
	fi
}

main