Files
wild-cloud/bin/wild-apps-list
2025-06-30 09:16:21 -07:00

197 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
set -e
set -o pipefail
VERBOSE=false
OUTPUT_FORMAT="table"
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--verbose|-v)
VERBOSE=true
shift
;;
--json)
OUTPUT_FORMAT="json"
shift
;;
--yaml)
OUTPUT_FORMAT="yaml"
shift
;;
-h|--help)
echo "Usage: $0 [--verbose] [--json|--yaml]"
echo ""
echo "List all available Wild-Cloud apps with their metadata."
echo ""
echo "Options:"
echo " --verbose, -v Show additional metadata (icon, requires)"
echo " --json Output in JSON format"
echo " --yaml Output in YAML format"
echo " -h, --help Show this help message"
echo ""
echo "By default, shows a formatted table with name, version, and description."
exit 0
;;
-*)
echo "Unknown option $1"
echo "Usage: $0 [--verbose] [--json|--yaml]"
exit 1
;;
*)
echo "Unexpected argument: $1"
echo "Usage: $0 [--verbose] [--json|--yaml]"
exit 1
;;
esac
done
# Initialize Wild-Cloud environment
if [ -z "${WC_ROOT}" ]; then
print "WC_ROOT is not set."
exit 1
else
source "${WC_ROOT}/scripts/common.sh"
init_wild_env
fi
APPS_DIR="${WC_ROOT}/apps"
if [ ! -d "${APPS_DIR}" ]; then
echo "Error: Apps directory not found at ${APPS_DIR}"
exit 1
fi
# Function to extract app metadata
extract_app_metadata() {
local app_dir="$1"
local app_name="$(basename "${app_dir}")"
local manifest_file="${app_dir}/manifest.yaml"
if [ ! -f "${manifest_file}" ]; then
echo "Warning: No manifest.yaml found for app '${app_name}'" >&2
return 1
fi
local name=$(yq eval '.name // "unknown"' "${manifest_file}")
local version=$(yq eval '.version // "unknown"' "${manifest_file}")
local description=$(yq eval '.description // ""' "${manifest_file}")
local install=$(yq eval '.install // true' "${manifest_file}")
local icon=$(yq eval '.icon // ""' "${manifest_file}")
local requires=""
if yq eval '.requires' "${manifest_file}" | grep -q -v '^null$'; then
requires=$(yq eval '.requires[].name' "${manifest_file}" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
fi
# Check if app is installed locally
local installed_status="NO"
local installed_version=""
if [ -d "apps/${app_name}" ] && [ -f "apps/${app_name}/manifest.yaml" ]; then
installed_version=$(yq eval '.version // "unknown"' "apps/${app_name}/manifest.yaml" 2>/dev/null)
installed_status="${installed_version}"
fi
# Only include apps marked as installable
if [ "${install}" != "true" ]; then
return 1
fi
case "${OUTPUT_FORMAT}" in
"json")
local json_requires=""
if [ -n "${requires}" ]; then
json_requires="\"$(echo "${requires}" | sed 's/,/","/g')\""
fi
echo "{"
echo " \"name\": \"${name}\","
echo " \"version\": \"${version}\","
echo " \"description\": \"${description}\","
echo " \"icon\": \"${icon}\","
echo " \"requires\": [${json_requires}],"
echo " \"installed\": \"${installed_status}\","
echo " \"installed_version\": \"${installed_version}\""
echo "}"
;;
"yaml")
echo "- name: ${name}"
echo " version: ${version}"
echo " description: ${description}"
echo " installed: ${installed_status}"
if [ -n "${installed_version}" ]; then
echo " installed_version: ${installed_version}"
fi
if [ -n "${icon}" ]; then
echo " icon: ${icon}"
fi
if [ -n "${requires}" ]; then
echo " requires:"
echo "${requires}" | tr ',' '\n' | sed 's/^/ - /'
fi
;;
"table")
if [ "${VERBOSE}" = true ]; then
printf "%-15s %-10s %-12s %-40s %-15s %s\n" "${name}" "${version}" "${installed_status}" "${description:0:40}" "${requires}" "${icon:0:30}"
else
printf "%-15s %-10s %-12s %s\n" "${name}" "${version}" "${installed_status}" "${description}"
fi
;;
esac
}
# Output header for table format
if [ "${OUTPUT_FORMAT}" = "table" ]; then
if [ "${VERBOSE}" = true ]; then
echo "Available Wild-Cloud Apps (verbose):"
echo "==================================================================================="
printf "%-15s %-10s %-12s %-40s %-15s %s\n" "NAME" "VERSION" "INSTALLED" "DESCRIPTION" "REQUIRES" "ICON"
printf "%-15s %-10s %-12s %-40s %-15s %s\n" "----" "-------" "---------" "-----------" "--------" "----"
else
echo "Available Wild-Cloud Apps:"
echo "========================================================================================================="
printf "%-15s %-10s %-12s %s\n" "NAME" "VERSION" "INSTALLED" "DESCRIPTION"
printf "%-15s %-10s %-12s %s\n" "----" "-------" "---------" "-----------"
fi
elif [ "${OUTPUT_FORMAT}" = "json" ]; then
echo "{"
echo " \"apps\": ["
elif [ "${OUTPUT_FORMAT}" = "yaml" ]; then
echo "apps:"
fi
# Process all app directories
app_count=0
first_app=true
for app_dir in "${APPS_DIR}"/*/; do
if [ -d "${app_dir}" ]; then
if extract_app_metadata "${app_dir}" 2>/dev/null; then
if [ "${OUTPUT_FORMAT}" = "json" ] && [ "${first_app}" != true ]; then
echo ","
fi
first_app=false
app_count=$((app_count + 1))
fi
fi
done
# Output footer for JSON format
if [ "${OUTPUT_FORMAT}" = "json" ]; then
echo ""
echo " ],"
echo " \"total\": ${app_count}"
echo "}"
elif [ "${OUTPUT_FORMAT}" = "table" ]; then
echo ""
echo "Total installable apps: ${app_count}"
echo ""
echo "Usage:"
echo " wild-app-fetch <app> # Fetch app template to cache"
echo " wild-app-config <app> # Configure app with your settings"
echo " wild-app-deploy <app> # Deploy app to Kubernetes"
fi
if [ "${app_count}" -eq 0 ]; then
echo "No installable apps found in ${APPS_DIR}"
exit 1
fi