#!/usr/bin/env bash betternas_default_clone_name() { local repo_path="${1-}" local repo_name repo_name="$(basename "$repo_path")" case "$repo_name" in betterNAS) printf '%s' "betternas-main" ;; *) printf '%s' "$repo_name" ;; esac } betternas_default_compose_project_seed() { local repo_path="${1-}" local clone_name="${2-}" if [[ -n "$clone_name" ]]; then printf '%s' "$clone_name" return 0 fi betternas_default_clone_name "$repo_path" } betternas_normalize_compose_project_name() { local raw_value="${1-}" local value value="${raw_value,,}" value="$( printf '%s' "$value" | sed -E \ -e 's/[^a-z0-9_-]+/-/g' \ -e 's/^[^a-z0-9]+//' \ -e 's/[-_]+$//' \ -e 's/-+/-/g' )" if [[ -z "$value" ]]; then printf 'Unable to derive a valid Docker Compose project name from %q.\n' "$raw_value" >&2 return 1 fi printf '%s' "$value" } betternas_resolve_compose_project_name() { local repo_path="${1-}" local override="${2-}" local clone_name="${3-}" local seed if [[ -n "$override" ]]; then seed="$override" else seed="$(betternas_default_compose_project_seed "$repo_path" "$clone_name")" fi betternas_normalize_compose_project_name "$seed" } betternas_default_ports() { local repo_path="${1-}" local clone_name="${2-}" local hash local slot local base if [[ -z "$clone_name" ]]; then clone_name="$(betternas_default_clone_name "$repo_path")" fi case "$clone_name" in betternas-main) printf '%s %s %s\n' "8080" "3090" "3001" return 0 ;; betterNAS-runtime) printf '%s %s %s\n' "41080" "41090" "41001" return 0 ;; betterNAS-control) printf '%s %s %s\n' "42080" "42090" "42001" return 0 ;; betterNAS-node) printf '%s %s %s\n' "43080" "43090" "43001" return 0 ;; esac hash="$(printf '%s' "$repo_path" | cksum | awk '{print $1}')" slot=$((hash % 1000)) base=$((45000 + slot * 20)) printf '%s %s %s\n' "$base" "$((base + 10))" "$((base + 1))" } betternas_write_env_assignment() { local key="${1-}" local value="${2-}" printf '%s=%q\n' "$key" "$value" } betternas_write_agent_env_file() { local env_path="${1-}" local repo_path="${2-}" local clone_name local compose_project_name local nextcloud_port local node_agent_port local control_plane_port clone_name="$(betternas_default_clone_name "$repo_path")" compose_project_name="$(betternas_resolve_compose_project_name "$repo_path" "" "$clone_name")" read -r nextcloud_port node_agent_port control_plane_port <<<"$(betternas_default_ports "$repo_path" "$clone_name")" { echo "# Generated by pnpm agent:bootstrap" betternas_write_env_assignment "BETTERNAS_CLONE_NAME" "$clone_name" betternas_write_env_assignment "COMPOSE_PROJECT_NAME" "$compose_project_name" betternas_write_env_assignment "BETTERNAS_CONTROL_PLANE_PORT" "$control_plane_port" betternas_write_env_assignment "BETTERNAS_NODE_AGENT_PORT" "$node_agent_port" betternas_write_env_assignment "BETTERNAS_NEXTCLOUD_PORT" "$nextcloud_port" betternas_write_env_assignment "BETTERNAS_EXPORT_PATH" ".state/${clone_name}/export" betternas_write_env_assignment "BETTERNAS_VERSION" "local-dev" betternas_write_env_assignment "BETTERNAS_CONTROL_PLANE_CLIENT_TOKEN" "${clone_name}-local-client-token" betternas_write_env_assignment "BETTERNAS_CONTROL_PLANE_NODE_BOOTSTRAP_TOKEN" "${clone_name}-local-node-bootstrap-token" betternas_write_env_assignment "BETTERNAS_DAV_AUTH_SECRET" "${clone_name}-local-dav-auth-secret" betternas_write_env_assignment "BETTERNAS_DAV_CREDENTIAL_TTL" "1h" betternas_write_env_assignment "BETTERNAS_NODE_MACHINE_ID" "${clone_name}-node" betternas_write_env_assignment "BETTERNAS_NODE_DISPLAY_NAME" "${clone_name} node" betternas_write_env_assignment "BETTERNAS_NODE_DIRECT_ADDRESS" "http://localhost:${node_agent_port}" betternas_write_env_assignment "BETTERNAS_EXAMPLE_MOUNT_URL" "http://localhost:${node_agent_port}/dav/" betternas_write_env_assignment "NEXTCLOUD_BASE_URL" "http://localhost:${nextcloud_port}" betternas_write_env_assignment "NEXTCLOUD_ADMIN_USER" "admin" betternas_write_env_assignment "NEXTCLOUD_ADMIN_PASSWORD" "admin" } >"$env_path" }