#!/bin/sh
# This spell reads the enchanted attributes from the specified file.
# If a field name is provided as the second argument, it reads the attribute with that name.
# If the file or attribute does not exist, it raises an error.
# Check that the correct number of arguments was provided
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "Error: This spell requires one or two arguments: a file path and an optional attribute name."
exit 1
fi
# Set the file path and attribute name variables
file=$1
attribute=$2
# Check that the file exists
if [ ! -f "$file" ] && [ ! -d "$file" ]; then
echo "Error: The file does not exist."
exit 1
fi
# Define a function to read the attribute value using the available commands
read_attribute_value() {
# Try to read the attribute using the 'attr' command
real_path=$(readlink -f "$file")
attribute_value=$(attr -g "$attribute" "$real_path" 2> /dev/null | cut -d ":" -f 2 | xargs)
# If the 'attr' command is not available, try using the 'xattr' command
if [ -z "$attribute_value" ]; then
attribute_value=$(xattr -p "$attribute" "$real_path" 2> /dev/null | cut -d ":" -f 2 | xargs)
fi
# If the 'xattr' command is not available, try using the 'getfattr' command
if [ -z "$attribute_value" ]; then
attribute_value=$(getfattr -h -n "$attribute" --only-values "$file" 2> /dev/null)
fi
# Return the attribute value
echo "$attribute_value"
}
# If an attribute name was not provided, print all attributes in YAML format
if [ -z "$attribute" ]; then
attributes_found=0
# Define a function to process each attribute
process_attribute() {
# Read the attribute value using the read_attribute_value function
value=$(read_attribute_value "$attribute" "$file")
# Check if the attribute value was set
if [ -n "$value" ]; then
# Print the attribute and value in YAML format
printf "%s: %s\n" "$1" "$value"
attributes_found=$((attributes_found + 1))
fi
}
# Call the process_attribute function for each attribute
for attribute in $(getfattr -h -m ".*" -e hex "$file" | cut -d ":" -f 1 | cut -d "." -f 2 | tr -d ' '); do
process_attribute "$attribute"
done
# Check if no extended attributes were found
if [ "$attributes_found" -eq 0 ]; then
echo "No enchanted attributes found."
fi
# If an attribute name was provided, print the attribute value
else
# Read the attribute value using the read_attribute_value function
value=$(read_attribute_value "$attribute" "$file")
# Check if the attribute value was set
if [ -z "$value" ]; then
echo "Error: The attribute does not exist."
exit 1
fi
# Print the attribute value
echo "$value"
fi