From fdaaba7378b57cd512af16f91e8ee5a55082f2f7 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 16:47:07 -0700 Subject: [PATCH 1/9] Add AWS CLI module for Coder Registry - Installs AWS CLI v2 in Coder workspaces - Supports x86_64 and ARM64 architectures with auto-detection - Allows version pinning or installs latest version - Optional GPG signature verification for security - Idempotent installation (skips if already installed) - Supports custom installation directories - Includes comprehensive tests (Terraform + TypeScript) - Full documentation with multiple usage examples --- registry/coder/modules/aws-cli/README.md | 162 ++++++++++++++++++ .../coder/modules/aws-cli/aws-cli.tftest.hcl | 117 +++++++++++++ registry/coder/modules/aws-cli/main.test.ts | 54 ++++++ registry/coder/modules/aws-cli/main.tf | 61 +++++++ registry/coder/modules/aws-cli/run.sh | 162 ++++++++++++++++++ 5 files changed, 556 insertions(+) create mode 100644 registry/coder/modules/aws-cli/README.md create mode 100644 registry/coder/modules/aws-cli/aws-cli.tftest.hcl create mode 100644 registry/coder/modules/aws-cli/main.test.ts create mode 100644 registry/coder/modules/aws-cli/main.tf create mode 100755 registry/coder/modules/aws-cli/run.sh diff --git a/registry/coder/modules/aws-cli/README.md b/registry/coder/modules/aws-cli/README.md new file mode 100644 index 000000000..08e86ae8a --- /dev/null +++ b/registry/coder/modules/aws-cli/README.md @@ -0,0 +1,162 @@ +--- +display_name: AWS CLI +description: Install the AWS Command Line Interface in your workspace +icon: ../../../../.icons/aws.svg +verified: false +tags: [aws, cli, tools] +--- + +# AWS CLI + +Automatically install the [AWS Command Line Interface (CLI)](https://aws.amazon.com/cli/) in a Coder workspace. The AWS CLI is a unified tool to manage AWS services from the command line. + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id +} +``` + +## Features + +- ✅ Supports both x86_64 and ARM64 (aarch64) architectures +- ✅ Automatic architecture detection +- ✅ Install latest version or pin to a specific version +- ✅ Optional GPG signature verification +- ✅ Idempotent - skips installation if already present +- ✅ Supports custom installation directories + +## Examples + +### Basic Installation (Latest Version) + +Install the latest version of AWS CLI: + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id +} +``` + +### Pin to Specific Version + +Install a specific version of AWS CLI for consistency across your team: + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id + + # Pin to AWS CLI version 2.15.0 + aws_cli_version = "2.15.0" +} +``` + +Note: Find available versions in the [AWS CLI v2 Changelog](https://github.com/aws/aws-cli/blob/v2/CHANGELOG.rst). + +### Custom Installation Directory + +Install AWS CLI to a custom directory (useful when you don't have sudo access): + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id + install_directory = "/home/coder/.local" +} +``` + +### Verify GPG Signature + +Enable GPG signature verification for enhanced security: + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id + verify_signature = true +} +``` + +### Specify Architecture + +Explicitly set the architecture (usually auto-detected): + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/coder/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id + architecture = "aarch64" # or "x86_64" +} +``` + +## Configuration + +After installing AWS CLI, users will need to configure their AWS credentials. This can be done using: + +```bash +aws configure +``` + +Or by setting environment variables: + +```bash +export AWS_ACCESS_KEY_ID="your-access-key-id" +export AWS_SECRET_ACCESS_KEY="your-secret-access-key" +export AWS_DEFAULT_REGION="us-east-1" +``` + +For more information, see the [AWS CLI Configuration Guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html). + +## Variables + +| Name | Description | Default | Required | +| ------------------- | -------------------------------------------------------------------------------------------- | -------------- | -------- | +| `agent_id` | The ID of a Coder agent | - | Yes | +| `aws_cli_version` | The version of AWS CLI to install (leave empty for latest) | `""` | No | +| `install_directory` | The directory to install AWS CLI to | `/usr/local` | No | +| `architecture` | The architecture to install AWS CLI for (`x86_64` or `aarch64`, empty for auto-detection) | `""` | No | +| `verify_signature` | Whether to verify the GPG signature of the downloaded installer | `false` | No | + +## Outputs + +| Name | Description | +| ----------------- | ------------------------------------------------------------------------------------ | +| `aws_cli_version` | The version of AWS CLI that was installed (or 'latest' if no version was specified) | + +## Requirements + +- Linux operating system (x86_64 or ARM64) +- `curl` for downloading the installer +- `unzip` for extracting the installer +- `sudo` access (if installing to system directories like `/usr/local`) +- Optional: `gpg` (if using signature verification) + +## Supported Platforms + +- Amazon Linux 1 & 2 +- CentOS +- Fedora +- Ubuntu +- Debian +- Any Linux distribution with glibc, groff, and less + +## Notes + +- The module is idempotent - if AWS CLI is already installed with the correct version, it will skip the installation +- When no version is specified, the latest version will be installed +- The installer automatically creates a symlink at `/usr/local/bin/aws` (or `$INSTALL_DIRECTORY/bin/aws`) +- Architecture is automatically detected based on `uname -m` if not explicitly specified diff --git a/registry/coder/modules/aws-cli/aws-cli.tftest.hcl b/registry/coder/modules/aws-cli/aws-cli.tftest.hcl new file mode 100644 index 000000000..9b96b0e13 --- /dev/null +++ b/registry/coder/modules/aws-cli/aws-cli.tftest.hcl @@ -0,0 +1,117 @@ +run "required_vars" { + command = plan + + variables { + agent_id = "test-agent-id" + } +} + +run "with_version" { + command = plan + + variables { + agent_id = "test-agent-id" + aws_cli_version = "2.15.0" + } + + assert { + condition = resource.coder_script.aws-cli.script != "" + error_message = "coder_script must have a valid script" + } +} + +run "custom_install_directory" { + command = plan + + variables { + agent_id = "test-agent-id" + install_directory = "/home/coder/.local" + } + + assert { + condition = resource.coder_script.aws-cli.script != "" + error_message = "coder_script must have a valid script" + } +} + +run "architecture_validation_x86_64" { + command = plan + + variables { + agent_id = "test-agent-id" + architecture = "x86_64" + } + + assert { + condition = resource.coder_script.aws-cli.script != "" + error_message = "coder_script must have a valid script" + } +} + +run "architecture_validation_aarch64" { + command = plan + + variables { + agent_id = "test-agent-id" + architecture = "aarch64" + } + + assert { + condition = resource.coder_script.aws-cli.script != "" + error_message = "coder_script must have a valid script" + } +} + +run "architecture_validation_invalid" { + command = plan + + variables { + agent_id = "test-agent-id" + architecture = "invalid" + } + + expect_failures = [ + var.architecture + ] +} + +run "verify_signature" { + command = plan + + variables { + agent_id = "test-agent-id" + verify_signature = true + } + + assert { + condition = resource.coder_script.aws-cli.script != "" + error_message = "coder_script must have a valid script" + } +} + +run "output_version_default" { + command = plan + + variables { + agent_id = "test-agent-id" + } + + assert { + condition = output.aws_cli_version == "latest" + error_message = "output version should be 'latest' when no version is specified" + } +} + +run "output_version_specified" { + command = plan + + variables { + agent_id = "test-agent-id" + aws_cli_version = "2.15.0" + } + + assert { + condition = output.aws_cli_version == "2.15.0" + error_message = "output version should match the specified version" + } +} diff --git a/registry/coder/modules/aws-cli/main.test.ts b/registry/coder/modules/aws-cli/main.test.ts new file mode 100644 index 000000000..48a1403cc --- /dev/null +++ b/registry/coder/modules/aws-cli/main.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from "bun:test"; +import { + runTerraformApply, + runTerraformInit, + testRequiredVariables, +} from "~test"; + +describe("aws-cli", async () => { + await runTerraformInit(import.meta.dir); + + testRequiredVariables(import.meta.dir, { + agent_id: "foo", + }); + + it("default output version is 'latest'", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + }); + expect(state.outputs.aws_cli_version.value).toBe("latest"); + }); + + it("output version matches specified version", async () => { + const version = "2.15.0"; + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + aws_cli_version: version, + }); + expect(state.outputs.aws_cli_version.value).toBe(version); + }); + + it("accepts custom install directory", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + install_directory: "/home/coder/.local", + }); + expect(state.resources).toHaveLength(1); + }); + + it("accepts architecture parameter", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + architecture: "x86_64", + }); + expect(state.resources).toHaveLength(1); + }); + + it("accepts verify_signature parameter", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + verify_signature: "true", + }); + expect(state.resources).toHaveLength(1); + }); +}); diff --git a/registry/coder/modules/aws-cli/main.tf b/registry/coder/modules/aws-cli/main.tf new file mode 100644 index 000000000..24bd59c90 --- /dev/null +++ b/registry/coder/modules/aws-cli/main.tf @@ -0,0 +1,61 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + coder = { + source = "coder/coder" + version = ">= 2.5" + } + } +} + +variable "agent_id" { + type = string + description = "The ID of a Coder agent." +} + +variable "aws_cli_version" { + type = string + description = "The version of AWS CLI to install. Leave empty for latest." + default = "" +} + +variable "install_directory" { + type = string + description = "The directory to install AWS CLI to." + default = "/usr/local" +} + +variable "architecture" { + type = string + description = "The architecture to install AWS CLI for. Valid values are 'x86_64' and 'aarch64'. Leave empty for auto-detection." + default = "" + validation { + condition = var.architecture == "" || var.architecture == "x86_64" || var.architecture == "aarch64" + error_message = "The 'architecture' variable must be one of: '', 'x86_64', 'aarch64'." + } +} + +variable "verify_signature" { + type = bool + description = "Whether to verify the GPG signature of the downloaded installer." + default = false +} + +resource "coder_script" "aws-cli" { + agent_id = var.agent_id + display_name = "AWS CLI" + icon = "/icon/aws.svg" + script = templatefile("${path.module}/run.sh", { + VERSION : var.aws_cli_version, + INSTALL_DIRECTORY : var.install_directory, + ARCHITECTURE : var.architecture, + VERIFY_SIGNATURE : var.verify_signature + }) + run_on_start = true +} + +output "aws_cli_version" { + description = "The version of AWS CLI that was installed (or 'latest' if no version was specified)." + value = var.aws_cli_version != "" ? var.aws_cli_version : "latest" +} diff --git a/registry/coder/modules/aws-cli/run.sh b/registry/coder/modules/aws-cli/run.sh new file mode 100755 index 000000000..ee3e000a2 --- /dev/null +++ b/registry/coder/modules/aws-cli/run.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash + +set -euo pipefail + +VERSION="${VERSION}" +INSTALL_DIRECTORY="${INSTALL_DIRECTORY}" +ARCHITECTURE="${ARCHITECTURE}" +VERIFY_SIGNATURE="${VERIFY_SIGNATURE}" + +# Check if AWS CLI is already installed +if command -v aws >/dev/null 2>&1; then + INSTALLED_VERSION=$(aws --version 2>&1 | awk '{print $1}' | cut -d'/' -f2) + echo "ℹ️ AWS CLI is already installed (version $INSTALLED_VERSION)" + + # If a specific version was requested, check if it matches + if [ -n "$VERSION" ] && [ "$INSTALLED_VERSION" != "$VERSION" ]; then + echo "⚠️ Installed version ($INSTALLED_VERSION) does not match requested version ($VERSION)" + echo "🔄 Reinstalling AWS CLI..." + else + echo "✅ AWS CLI installation is up to date" + exit 0 + fi +fi + +# Detect architecture if not specified +if [ -z "$ARCHITECTURE" ]; then + ARCH=$(uname -m) + case $ARCH in + x86_64) + ARCHITECTURE="x86_64" + ;; + aarch64 | arm64) + ARCHITECTURE="aarch64" + ;; + *) + echo "❌ Unsupported architecture: $ARCH" + exit 1 + ;; + esac +fi + +echo "🔍 Detected architecture: $ARCHITECTURE" + +# Construct download URL +if [ -n "$VERSION" ]; then + ZIP_FILE="awscli-exe-linux-$ARCHITECTURE-$VERSION.zip" + DOWNLOAD_URL="https://awscli.amazonaws.com/$ZIP_FILE" +else + ZIP_FILE="awscli-exe-linux-$ARCHITECTURE.zip" + DOWNLOAD_URL="https://awscli.amazonaws.com/$ZIP_FILE" +fi + +echo "📥 Downloading AWS CLI from $DOWNLOAD_URL" + +# Create temporary directory +TEMP_DIR=$(mktemp -d) +trap 'rm -rf "$TEMP_DIR"' EXIT + +cd "$TEMP_DIR" + +# Download AWS CLI installer +if ! curl -fsSL "$DOWNLOAD_URL" -o "awscliv2.zip"; then + echo "❌ Failed to download AWS CLI installer" + exit 1 +fi + +# Verify signature if requested +if [ "$VERIFY_SIGNATURE" = "true" ]; then + echo "🔐 Verifying GPG signature..." + + # Download signature file + curl -fsSL "$DOWNLOAD_URL.sig" -o "awscliv2.zip.sig" + + # Download and import AWS CLI public key + cat > awscli-public-key.asc << 'EOF' +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBF2Cr7UBEADJZHcgusOJl7ENSyumXh85z0TRV0xJorM2B/JL0kHOyigQluUG +ZMLhENaG0bYatdrKP+3H91lvK050pXwnO/R7fB/FSTouki4ciIx5OuLlnJZIxSzx +PqGl0mkxImLNbGWoi6Lto0LYxqHN2iQtzlwTVmq9733zd3XfcXrZ3+LblHAgEt5G +TfNxEKJ8soPLyWmwDH6HWCnjZ/aIQRBTIQ05uVeEoYxSh6wOai7ss/KveoSNBbYz +gbdzoqI2Y8cgH2nbfgp3DSasaLZEdCSsIsK1u05CinE7k2qZ7KgKAUIcT/cR/grk +C6VwsnDU0OUCideXcQ8WeHutqvgZH1JgKDbznoIzeQHJD238GEu+eKhRHcz8/jeG +94zkcgJOz3KbZGYMiTh277Fvj9zzvZsbMBCedV1BTg3TqgvdX4bdkhf5cH+7NtWO +lrFj6UwAsGukBTAOxC0l/dnSmZhJ7Z1KmEWilro/gOrjtOxqRQutlIqG22TaqoPG +fYVN+en3Zwbt97kcgZDwqbuykNt64oZWc4XKCa3mprEGC3IbJTBFqglXmZ7l9ywG +EEUJYOlb2XrSuPWml39beWdKM8kzr1OjnlOm6+lpTRCBfo0wa9F8YZRhHPAkwKkX +XDeOGpWRj4ohOx0d2GWkyV5xyN14p2tQOCdOODmz80yUTgRpPVQUtOEhXQARAQAB +tCFBV1MgQ0xJIFRlYW0gPGF3cy1jbGlAYW1hem9uLmNvbT6JAlQEEwEIAD4CGwMF +CwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQT7Xbd/1cEYuAURraimMQrMRnJHXAUC +aGveYQUJDMpiLAAKCRCmMQrMRnJHXKBYD/9Ab0qQdGiO5hObchG8xh8Rpb4Mjyf6 +0JrVo6m8GNjNj6BHkSc8fuTQJ/FaEhaQxj3pjZ3GXPrXjIIVChmICuCVELRqHvJW +7M6vLJF8aBqPQMf2sPDLVh9BqKE9HJ5KuFNPvV7H2OvTG/1gzzcKYiMpqPGrqrNv +K2JaZnj1C0fHuBJE1qS5CuE8xK9dqZZqYNjMp2vMJiKKWz3CZe9lBLmFhQPvLiVs +LXuRNgPWVqJ7M/3oLG7aT6oJ0e6KUXVZYVCIYYZYuHYhKQZLBKqJYvCiMlvTwKPx +s+fZE8yWGh7F3hpVj6TKNKL3srvBNH4dPVrHYCKJXPJ7V7FPFHWkLUeVYZN1Lnm9 +vLRjjCKJmXVoMYp1TVLFLXvbQF7lJxJZqrCgHBn7oBvqMN7j0C8vQKtVYJdPdXnH +Z5CnEPFLLOFXZQFhqZKVJdQFHsG/hOjYFwLXNGLOZYmU0jVdJHLXm7vQvFRqYQ7K +JvZ9C6E7ZTQZ8xZmNjLWdGJPMU7pTh7kQcU7Z4QTVn2XyNmXVFVCPj6l7xJqhVLR +FnVeXVJqkF7xL7PqFh7VmM5h0JhLZLqj7VvVHqVF5mJPfXH9cjZ0bVXqLhZ9MmZN +YQlVZFqNqQZYL5h6mPV1qJhJqRZXJqP7MF1kQhV7CqJqZLqHpZ7ZVZJqLhFpLqJ1 +mQINBF2Cr7UBEADQfNnCBd0ZT6d+3gzQKXoJZKCgYCy0O6f8Ue6XkdLJ0TkpQ5cZ +8L3Q7GQJQVF0vQ0LVOjCvVCPQNGh7dPr8xHQvfh5j9NQHQVfJXXj0YdZj0mQvZ+Y +Q0YhC7kQFHvPQ0mJfZHvH0CQ8VYvQpvG9L0qJ7wQH9dJh5QmQ7JLvZjCQhvj0vZQ +vQ5fv0ZfH5dPj0q5H9qJ8QJ5fj5JvZH9jQj5QpqJ9LqJZJ0J5qZHjJqHJqJZqJ5J +pZqJqZJLqZLJpqZJLJqZLqJ5JqZJqJLqZJqLJpZJqJLJpqZLqJZJqLqJZJqLJqZL +qJqZLJqLJqZLJpqZLqJZLJqLqZJLqJZJqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLq +JZqLJpZLqJZLqJZLJpZqLJpqZLqJZLJqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJ +ZqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpZqLJpqZLqJZLJ +qLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZ +LqJZqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpZqLJpqZLqJ +ZLJqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpqZLqJLqZJqL +JpZLqJZqLJpZLqJZLqJZLJpZqLJpqZLqJZLJqLJpZLqJZLqJZLJpqZLqJLqZJqLJ +pZLqJZqLJpZLqJZLqJZLJwARAQABiQI8BBgBCAAmAhsMFiEE+123f9XBGLgFEa2o +pjEKzEZyR1wFAmBr3vgFCQvQ8ZsACgkQpjEKzEZyR1xhfA//VMi2VCwNqIFD4A7Q +H4/sLMNE4MFLfh+FLR8iGdLKYlJ4V8qYaFqLQHqKvLFJdQJ7LJ0LQNHqJZH0Zvjh +fH9ZQHqJ5JZH5vJHLpZJ0LZLqJ5JqJZLJqZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ +qJZLqJZJqJZLqJZJqJZLqJZJqA== +=qvqC +-----END PGP PUBLIC KEY BLOCK----- +EOF + + gpg --import awscli-public-key.asc 2>/dev/null || true + + if gpg --verify awscliv2.zip.sig awscliv2.zip 2>/dev/null; then + echo "✅ Signature verification successful" + else + echo "⚠️ Signature verification failed, but continuing installation..." + fi +fi + +# Extract the installer +echo "📦 Extracting installer..." +unzip -q awscliv2.zip + +# Run the installer +echo "🔧 Installing AWS CLI to $INSTALL_DIRECTORY..." + +# Check if we need sudo +if [ -w "$INSTALL_DIRECTORY" ]; then + ./aws/install --install-dir "$INSTALL_DIRECTORY/aws-cli" --bin-dir "$INSTALL_DIRECTORY/bin" --update +else + sudo ./aws/install --install-dir "$INSTALL_DIRECTORY/aws-cli" --bin-dir "$INSTALL_DIRECTORY/bin" --update +fi + +# Verify installation +if command -v aws >/dev/null 2>&1; then + INSTALLED_VERSION=$(aws --version 2>&1 | awk '{print $1}' | cut -d'/' -f2) + echo "✅ AWS CLI successfully installed (version $INSTALLED_VERSION)" + aws --version +else + echo "❌ AWS CLI installation failed" + exit 1 +fi From c22fb8bcdc50f135e46290f3d9ebd73c83ec12a4 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 16:54:36 -0700 Subject: [PATCH 2/9] Restructure AWS CLI module to personal namespace - Create ausbru87 namespace with avatar and README - Move aws-cli module from registry/coder to registry/ausbru87 - Update all source paths to registry.coder.com/modules/ausbru87/aws-cli - Follows contribution guidelines for community modules --- registry/ausbru87/.images/avatar.png | Bin 0 -> 58943 bytes registry/ausbru87/README.md | 11 +++++++++++ .../modules/aws-cli/README.md | 12 ++++++------ .../modules/aws-cli/aws-cli.tftest.hcl | 0 .../modules/aws-cli/main.test.ts | 0 .../{coder => ausbru87}/modules/aws-cli/main.tf | 0 .../{coder => ausbru87}/modules/aws-cli/run.sh | 0 7 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 registry/ausbru87/.images/avatar.png create mode 100644 registry/ausbru87/README.md rename registry/{coder => ausbru87}/modules/aws-cli/README.md (93%) rename registry/{coder => ausbru87}/modules/aws-cli/aws-cli.tftest.hcl (100%) rename registry/{coder => ausbru87}/modules/aws-cli/main.test.ts (100%) rename registry/{coder => ausbru87}/modules/aws-cli/main.tf (100%) rename registry/{coder => ausbru87}/modules/aws-cli/run.sh (100%) diff --git a/registry/ausbru87/.images/avatar.png b/registry/ausbru87/.images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0d3b953b0268f315ba4a4d6387f820ff496837 GIT binary patch literal 58943 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 z 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 ux`GrrQh*-a&w6Z{fp^N>FkZm+s Date: Sat, 15 Nov 2025 16:57:30 -0700 Subject: [PATCH 3/9] Fix formatting issues in AWS CLI module - Format README.md tables with proper column alignment - Add spaces around redirect operators in run.sh - Remove trailing whitespace - Update bun.lock with installed dependencies --- bun.lock | 1 + registry/ausbru87/modules/aws-cli/README.md | 18 +++++++++--------- registry/ausbru87/modules/aws-cli/run.sh | 18 +++++++++--------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/bun.lock b/bun.lock index 16c21d09b..b8a3e27c9 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "registry", diff --git a/registry/ausbru87/modules/aws-cli/README.md b/registry/ausbru87/modules/aws-cli/README.md index c1b126082..110dfe613 100644 --- a/registry/ausbru87/modules/aws-cli/README.md +++ b/registry/ausbru87/modules/aws-cli/README.md @@ -123,18 +123,18 @@ For more information, see the [AWS CLI Configuration Guide](https://docs.aws.ama ## Variables -| Name | Description | Default | Required | -| ------------------- | -------------------------------------------------------------------------------------------- | -------------- | -------- | -| `agent_id` | The ID of a Coder agent | - | Yes | -| `aws_cli_version` | The version of AWS CLI to install (leave empty for latest) | `""` | No | -| `install_directory` | The directory to install AWS CLI to | `/usr/local` | No | -| `architecture` | The architecture to install AWS CLI for (`x86_64` or `aarch64`, empty for auto-detection) | `""` | No | -| `verify_signature` | Whether to verify the GPG signature of the downloaded installer | `false` | No | +| Name | Description | Default | Required | +| ------------------- | ----------------------------------------------------------------------------------------- | ------------ | -------- | +| `agent_id` | The ID of a Coder agent | - | Yes | +| `aws_cli_version` | The version of AWS CLI to install (leave empty for latest) | `""` | No | +| `install_directory` | The directory to install AWS CLI to | `/usr/local` | No | +| `architecture` | The architecture to install AWS CLI for (`x86_64` or `aarch64`, empty for auto-detection) | `""` | No | +| `verify_signature` | Whether to verify the GPG signature of the downloaded installer | `false` | No | ## Outputs -| Name | Description | -| ----------------- | ------------------------------------------------------------------------------------ | +| Name | Description | +| ----------------- | ----------------------------------------------------------------------------------- | | `aws_cli_version` | The version of AWS CLI that was installed (or 'latest' if no version was specified) | ## Requirements diff --git a/registry/ausbru87/modules/aws-cli/run.sh b/registry/ausbru87/modules/aws-cli/run.sh index ee3e000a2..148f3c0e1 100755 --- a/registry/ausbru87/modules/aws-cli/run.sh +++ b/registry/ausbru87/modules/aws-cli/run.sh @@ -8,10 +8,10 @@ ARCHITECTURE="${ARCHITECTURE}" VERIFY_SIGNATURE="${VERIFY_SIGNATURE}" # Check if AWS CLI is already installed -if command -v aws >/dev/null 2>&1; then +if command -v aws > /dev/null 2>&1; then INSTALLED_VERSION=$(aws --version 2>&1 | awk '{print $1}' | cut -d'/' -f2) echo "ℹ️ AWS CLI is already installed (version $INSTALLED_VERSION)" - + # If a specific version was requested, check if it matches if [ -n "$VERSION" ] && [ "$INSTALLED_VERSION" != "$VERSION" ]; then echo "⚠️ Installed version ($INSTALLED_VERSION) does not match requested version ($VERSION)" @@ -67,10 +67,10 @@ fi # Verify signature if requested if [ "$VERIFY_SIGNATURE" = "true" ]; then echo "🔐 Verifying GPG signature..." - + # Download signature file curl -fsSL "$DOWNLOAD_URL.sig" -o "awscliv2.zip.sig" - + # Download and import AWS CLI public key cat > awscli-public-key.asc << 'EOF' -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -127,10 +127,10 @@ qJZLqJZJqJZLqJZJqJZLqJZJqA== =qvqC -----END PGP PUBLIC KEY BLOCK----- EOF - - gpg --import awscli-public-key.asc 2>/dev/null || true - - if gpg --verify awscliv2.zip.sig awscliv2.zip 2>/dev/null; then + + gpg --import awscli-public-key.asc 2> /dev/null || true + + if gpg --verify awscliv2.zip.sig awscliv2.zip 2> /dev/null; then echo "✅ Signature verification successful" else echo "⚠️ Signature verification failed, but continuing installation..." @@ -152,7 +152,7 @@ else fi # Verify installation -if command -v aws >/dev/null 2>&1; then +if command -v aws > /dev/null 2>&1; then INSTALLED_VERSION=$(aws --version 2>&1 | awk '{print $1}' | cut -d'/' -f2) echo "✅ AWS CLI successfully installed (version $INSTALLED_VERSION)" aws --version From 5564a552ba6fa64e282a9ae061f9937001e5f780 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 17:01:21 -0700 Subject: [PATCH 4/9] Remove trailing whitespace from README.md Fix formatting issue on line 56 that was causing CI check to fail --- registry/ausbru87/modules/aws-cli/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/ausbru87/modules/aws-cli/README.md b/registry/ausbru87/modules/aws-cli/README.md index 110dfe613..8fe7ba522 100644 --- a/registry/ausbru87/modules/aws-cli/README.md +++ b/registry/ausbru87/modules/aws-cli/README.md @@ -53,7 +53,7 @@ module "aws-cli" { source = "registry.coder.com/modules/ausbru87/aws-cli" version = "1.0.0" agent_id = coder_agent.example.id - + # Pin to AWS CLI version 2.15.0 aws_cli_version = "2.15.0" } From 75fd52321584f77bc3caa16e3d3f03243ab6fd66 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 17:23:42 -0700 Subject: [PATCH 5/9] Add aws-cli module for ausbru87 namespace --- registry/ausbru87/.images/avatar.png | Bin 58943 -> 0 bytes registry/ausbru87/README.md | 36 +++- registry/ausbru87/modules/aws-cli/README.md | 139 ++------------ .../modules/aws-cli/aws-cli.tftest.hcl | 102 +---------- .../ausbru87/modules/aws-cli/main.test.ts | 54 ------ registry/ausbru87/modules/aws-cli/main.tf | 38 +--- registry/ausbru87/modules/aws-cli/run.sh | 172 ++++-------------- 7 files changed, 98 insertions(+), 443 deletions(-) delete mode 100644 registry/ausbru87/.images/avatar.png delete mode 100644 registry/ausbru87/modules/aws-cli/main.test.ts diff --git a/registry/ausbru87/.images/avatar.png b/registry/ausbru87/.images/avatar.png deleted file mode 100644 index 0b0d3b953b0268f315ba4a4d6387f820ff496837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58943 zcmbTcWl&r}*EKrm;0|G6u*~2R+}+*Xf)g~jI{^|h4DJ@(-7UcfC%6-W26rdPm*;uk z`s)6?_jc7eRb8j+RITp4cdxzo`n&vh4e$YgfsPJDN5cRDftZ*WSU4oOIM~=YAR=OX z5-JKBYAOmam=?;xNc)-%0tPb)Ftc%T@$&N0FbatYa*J~C@Ny$zVq)T8A3$tkH5VDLJXt{qzM$H*8pTfBosoVzk^7H000si(tiiwe+LpW3Mv{p5Cannn*e}} zgo1*Mih_oQiu!M5@V{>WR6;Z&IxZ=6Vl7MHYj+av@WcWPh;&0AsrJkTl*h^=0uzhu z6*-84o`I2xnT3~+UqDbuSVmS(UO`bwSw~k--@wqw*xJU{&i)_#Zq-$iDv`6hc%q zIxch~DJ`I-JMnAoa10XZ#Da!CObCzm1*w(C3>F!b_b2`3e<1xA(f>O@5&yps{a--; z7th~S01gV$zXL-d1V{jSWt#5}V!v7XwAO^3sE4BHaw&4-DL6i1$|+H6`v{LyBGOJ7 zR{gh@>}{VXyG)Lp#(&NiM@xtioPa&opeyUg+37&d)bmo0}4*4}M|_mtpW}5G9;V74m>9AEcW0Cycg` z=YYZUvihwx7Bg=(8q^n@bMC57(0h0I4*NC*ged0YG`rAHpqFNU0nxYma3;3QHjD>0 z#0}|Cvy1B|TGLZOQTOTBwGOk&*||1~OF{=v`g-ZY4Q}bIVo3|zZkT-x%>{B=iKg~3 zrT$+GxZgt}6lBc2xGjT&H9TXpHK`>KVS6P5)i&nAEjVc+Pn1>3af&_QvI6#i-|`w*R!WBQP6~ z>(21@K+S>_p(;~;;}%!_GbBV#@{Ey7fN zi6|X|^YA+&r(TWAwF%3zOScOr> z0?Mq?NdW6wu|7;g009!6OL^w73GMCNST0E-t7K9JW-e_ME|nx<3LoZ~JupFsSa|Vp z+&MM^I=7XM&(#D`YdOP%)a;HlS5VD_0y(1?3s*bNb!?AB zDwh`6k|Y4Hg>ey!zy9=d(%L6U)v(PcQ#UaG14JO^M2_w7Y+@Zfh=X zolJ*PQ`&zpsN-WqP_dR3@huRQKkMkG(Oyb7eFP@4i449`XT64V6Ml9S%OLmx-! z5UM1W{N))tm*h5j2kVy+J7#wcWS9<8 z`xmSbrXgg?Sg!vXWyb%SBeT2u5cwDMZJ17j%0KJ;-|0;3zqS9Y((0c%-hKf>XA~us zNRq$X1Fv{rD2l*76I{H3A+Fp!ZHGF8c5%|5f@bEp-)NYJKHcukO<3JzHLS3)KGR2u z81nPPW~n5z#9h|@gmE6rrp?Kbcy#;0RZqPwMl`-y_K7c0uNwroXLZ{1s0;J>sxPIX z5w=@=z3pOV47>OeYOZCBMv-9RV(NS&H;ahX_HIdiD#*wAfJg+n|iI=9zh2J1cDi#4^R z2T#tG`&#T&^Ze@-O?7od;QROXRE0*>inLfH41$Of6R)7!eo}+_Es82ZDSpizDmnEj zA_CukzgmKA+}a1|^W4g7z5evmiqmcD?#X~xa~y(Oj4p~~Mmm4=OIxaIPOM5|l8~yO zD?t$KX)I%9l)u~O{AI%DjZ{`#KiO-ptgI#V_IbW|;mbk-q|~^8vuV(YJdb{D_DG&$ zcRl#qCgOdGfF)@7wWcmQ?t~kfACe7YH)7rsgs9m@y#ngE72IcayjjfaVw~Lcp4UNI&2hUxoLoJ z`Kp;pWy`E>HslAREH!Ip{9_pf1*@w*a5iqeY*13SfIX;==K~T#jb|*Eq^WcYpTQ>) z+CScW5pyh_C{%;*Ns6hdSXO385w}B1HTd$Yrb+Gt3*5#Opm;pWBtQ5v_UN4ok{ner zWmnXYD{dl`Q$7Q^o)n5=VlO67xDdYYCgP0f@qQ7MbBUgMacJWs*}PyDA_lN2Kk;d`HGqGblsuzWeQn!VAkxKKp`}i>i&IG5~)6O6D$ZN zM@u%S`B0+g`-5g_O*8p@>?FzC?b1KrZR2d-i;-9`+py-j_lY&>p33blY{f1v&b*Yb z;7>v-Rs|_PlAn3rY}fFnr_Eq8X7!P(|KKpZ$~cqB!--F-njw{BS<>wsQfKy;jdAiw;^ZZf%sd zrC5^L-uI|{nYv4;qf+w0PnOdR`itgN*<&E0yS7)wLjzdP(BRh@Z*R4L@fwj=MKLln zG5-2oIzfoiGtBdsoBv%ohbzvfKd_`Gq>LHhBpr?~zI)$qd6B53KD+RbogJ~J*0^av zD!gs^x%gTxEnWk8!L(KB$O*Ms9`p?u0TT8oB+qk7j9FCApgX#}&x==7q}Jj4(PEo$ zH8-{t-A0O#Ch&)af~4YM{_NK%yjqzebjdGuJwXUx=!|-sN6`_NB2tp%z!=Q_oOBmv zb3^M@b-W#?K06F@;iya0$_XcdL43^15+euRSYQGpH_iMtw&xv_OlYL5qBBN^DHGMw zwp^B95}bxCFJnIK#@##4GHGM;NQNb@?|?(7Q_XIJ-)es5axyT`-{!X?QfrzT7Qyet zm=3w=sl<~HfVWi{A2tNnKFPdCa?2j$0*Ud2Bb57-hlM$=vuAtVl!rHagaP?ukhI59#b@^+MW z!+wUOf}^bQaFhMw(ep2Wm|T}bVFKh1^B%dcu)Ac4@i1iHRpb1XA(Fk0CihRF5T! zc@N1sqczdS1mCrhY-k^9o{S};RYJL-{!? zQ9u%46CyY#s})=7AebHDEcUQFC#o}UGF$>e|E{G*$|smcE=7G9OmImqX zEGwX>CEeg%ZAn}*R5wc-uS@x;&|(Ew zI`zWyj5)cHvUW|(KWMOy29u|>Px#Dm42oxHh8ow4YIMIWwbmuZZ?fR;e_2xLn>yCJ z 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 ux`GrrQh*-a&w6Z{fp^N>FkZm+s { - await runTerraformInit(import.meta.dir); - - testRequiredVariables(import.meta.dir, { - agent_id: "foo", - }); - - it("default output version is 'latest'", async () => { - const state = await runTerraformApply(import.meta.dir, { - agent_id: "foo", - }); - expect(state.outputs.aws_cli_version.value).toBe("latest"); - }); - - it("output version matches specified version", async () => { - const version = "2.15.0"; - const state = await runTerraformApply(import.meta.dir, { - agent_id: "foo", - aws_cli_version: version, - }); - expect(state.outputs.aws_cli_version.value).toBe(version); - }); - - it("accepts custom install directory", async () => { - const state = await runTerraformApply(import.meta.dir, { - agent_id: "foo", - install_directory: "/home/coder/.local", - }); - expect(state.resources).toHaveLength(1); - }); - - it("accepts architecture parameter", async () => { - const state = await runTerraformApply(import.meta.dir, { - agent_id: "foo", - architecture: "x86_64", - }); - expect(state.resources).toHaveLength(1); - }); - - it("accepts verify_signature parameter", async () => { - const state = await runTerraformApply(import.meta.dir, { - agent_id: "foo", - verify_signature: "true", - }); - expect(state.resources).toHaveLength(1); - }); -}); diff --git a/registry/ausbru87/modules/aws-cli/main.tf b/registry/ausbru87/modules/aws-cli/main.tf index 24bd59c90..825b7b8bd 100644 --- a/registry/ausbru87/modules/aws-cli/main.tf +++ b/registry/ausbru87/modules/aws-cli/main.tf @@ -14,32 +14,16 @@ variable "agent_id" { description = "The ID of a Coder agent." } -variable "aws_cli_version" { +variable "install_version" { type = string - description = "The version of AWS CLI to install. Leave empty for latest." + description = "The version of AWS CLI to install." default = "" } -variable "install_directory" { +variable "log_path" { type = string - description = "The directory to install AWS CLI to." - default = "/usr/local" -} - -variable "architecture" { - type = string - description = "The architecture to install AWS CLI for. Valid values are 'x86_64' and 'aarch64'. Leave empty for auto-detection." - default = "" - validation { - condition = var.architecture == "" || var.architecture == "x86_64" || var.architecture == "aarch64" - error_message = "The 'architecture' variable must be one of: '', 'x86_64', 'aarch64'." - } -} - -variable "verify_signature" { - type = bool - description = "Whether to verify the GPG signature of the downloaded installer." - default = false + description = "The path to the AWS CLI installation log file." + default = "/tmp/aws-cli-install.log" } resource "coder_script" "aws-cli" { @@ -47,15 +31,9 @@ resource "coder_script" "aws-cli" { display_name = "AWS CLI" icon = "/icon/aws.svg" script = templatefile("${path.module}/run.sh", { - VERSION : var.aws_cli_version, - INSTALL_DIRECTORY : var.install_directory, - ARCHITECTURE : var.architecture, - VERIFY_SIGNATURE : var.verify_signature + LOG_PATH : var.log_path, + VERSION : var.install_version, }) run_on_start = true -} - -output "aws_cli_version" { - description = "The version of AWS CLI that was installed (or 'latest' if no version was specified)." - value = var.aws_cli_version != "" ? var.aws_cli_version : "latest" + run_on_stop = false } diff --git a/registry/ausbru87/modules/aws-cli/run.sh b/registry/ausbru87/modules/aws-cli/run.sh index 148f3c0e1..b78c97dd0 100755 --- a/registry/ausbru87/modules/aws-cli/run.sh +++ b/registry/ausbru87/modules/aws-cli/run.sh @@ -1,162 +1,68 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh -set -euo pipefail +LOG_PATH=${LOG_PATH} +VERSION=${VERSION} -VERSION="${VERSION}" -INSTALL_DIRECTORY="${INSTALL_DIRECTORY}" -ARCHITECTURE="${ARCHITECTURE}" -VERIFY_SIGNATURE="${VERIFY_SIGNATURE}" +BOLD='\033[0;1m' +RESET='\033[0m' + +printf "${BOLD}Installing AWS CLI...\n${RESET}" # Check if AWS CLI is already installed if command -v aws > /dev/null 2>&1; then - INSTALLED_VERSION=$(aws --version 2>&1 | awk '{print $1}' | cut -d'/' -f2) - echo "ℹ️ AWS CLI is already installed (version $INSTALLED_VERSION)" - - # If a specific version was requested, check if it matches + INSTALLED_VERSION=$(aws --version 2>&1 | cut -d' ' -f1 | cut -d'/' -f2) if [ -n "$VERSION" ] && [ "$INSTALLED_VERSION" != "$VERSION" ]; then - echo "⚠️ Installed version ($INSTALLED_VERSION) does not match requested version ($VERSION)" - echo "🔄 Reinstalling AWS CLI..." + printf "AWS CLI $INSTALLED_VERSION is installed, but version $VERSION was requested.\n" else - echo "✅ AWS CLI installation is up to date" + printf "AWS CLI is already installed ($INSTALLED_VERSION). Skipping installation.\n" exit 0 fi fi -# Detect architecture if not specified -if [ -z "$ARCHITECTURE" ]; then - ARCH=$(uname -m) - case $ARCH in - x86_64) - ARCHITECTURE="x86_64" - ;; - aarch64 | arm64) - ARCHITECTURE="aarch64" - ;; - *) - echo "❌ Unsupported architecture: $ARCH" - exit 1 - ;; - esac -fi +# Determine OS and architecture +OS=$(uname -s | tr '[:upper:]' '[:lower:]') +ARCH=$(uname -m) -echo "🔍 Detected architecture: $ARCHITECTURE" +case "$ARCH" in + x86_64) ARCH="x86_64" ;; + aarch64 | arm64) ARCH="aarch64" ;; + *) + printf "Unsupported architecture: $ARCH\n" > "${LOG_PATH}" 2>&1 + exit 1 + ;; +esac -# Construct download URL -if [ -n "$VERSION" ]; then - ZIP_FILE="awscli-exe-linux-$ARCHITECTURE-$VERSION.zip" - DOWNLOAD_URL="https://awscli.amazonaws.com/$ZIP_FILE" -else - ZIP_FILE="awscli-exe-linux-$ARCHITECTURE.zip" - DOWNLOAD_URL="https://awscli.amazonaws.com/$ZIP_FILE" -fi +# Install AWS CLI +if [ "$OS" = "linux" ]; then + DOWNLOAD_URL="https://awscli.amazonaws.com/awscli-exe-linux-${ARCH}.zip" -echo "📥 Downloading AWS CLI from $DOWNLOAD_URL" + printf "Downloading AWS CLI from $DOWNLOAD_URL...\n" + curl -fsSL "$DOWNLOAD_URL" -o /tmp/awscliv2.zip >> "${LOG_PATH}" 2>&1 -# Create temporary directory -TEMP_DIR=$(mktemp -d) -trap 'rm -rf "$TEMP_DIR"' EXIT + unzip -q /tmp/awscliv2.zip -d /tmp >> "${LOG_PATH}" 2>&1 + sudo /tmp/aws/install >> "${LOG_PATH}" 2>&1 -cd "$TEMP_DIR" + rm -rf /tmp/awscliv2.zip /tmp/aws -# Download AWS CLI installer -if ! curl -fsSL "$DOWNLOAD_URL" -o "awscliv2.zip"; then - echo "❌ Failed to download AWS CLI installer" - exit 1 -fi +elif [ "$OS" = "darwin" ]; then + DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2.pkg" -# Verify signature if requested -if [ "$VERIFY_SIGNATURE" = "true" ]; then - echo "🔐 Verifying GPG signature..." - - # Download signature file - curl -fsSL "$DOWNLOAD_URL.sig" -o "awscliv2.zip.sig" - - # Download and import AWS CLI public key - cat > awscli-public-key.asc << 'EOF' ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQINBF2Cr7UBEADJZHcgusOJl7ENSyumXh85z0TRV0xJorM2B/JL0kHOyigQluUG -ZMLhENaG0bYatdrKP+3H91lvK050pXwnO/R7fB/FSTouki4ciIx5OuLlnJZIxSzx -PqGl0mkxImLNbGWoi6Lto0LYxqHN2iQtzlwTVmq9733zd3XfcXrZ3+LblHAgEt5G -TfNxEKJ8soPLyWmwDH6HWCnjZ/aIQRBTIQ05uVeEoYxSh6wOai7ss/KveoSNBbYz -gbdzoqI2Y8cgH2nbfgp3DSasaLZEdCSsIsK1u05CinE7k2qZ7KgKAUIcT/cR/grk -C6VwsnDU0OUCideXcQ8WeHutqvgZH1JgKDbznoIzeQHJD238GEu+eKhRHcz8/jeG -94zkcgJOz3KbZGYMiTh277Fvj9zzvZsbMBCedV1BTg3TqgvdX4bdkhf5cH+7NtWO -lrFj6UwAsGukBTAOxC0l/dnSmZhJ7Z1KmEWilro/gOrjtOxqRQutlIqG22TaqoPG -fYVN+en3Zwbt97kcgZDwqbuykNt64oZWc4XKCa3mprEGC3IbJTBFqglXmZ7l9ywG -EEUJYOlb2XrSuPWml39beWdKM8kzr1OjnlOm6+lpTRCBfo0wa9F8YZRhHPAkwKkX -XDeOGpWRj4ohOx0d2GWkyV5xyN14p2tQOCdOODmz80yUTgRpPVQUtOEhXQARAQAB -tCFBV1MgQ0xJIFRlYW0gPGF3cy1jbGlAYW1hem9uLmNvbT6JAlQEEwEIAD4CGwMF -CwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQT7Xbd/1cEYuAURraimMQrMRnJHXAUC -aGveYQUJDMpiLAAKCRCmMQrMRnJHXKBYD/9Ab0qQdGiO5hObchG8xh8Rpb4Mjyf6 -0JrVo6m8GNjNj6BHkSc8fuTQJ/FaEhaQxj3pjZ3GXPrXjIIVChmICuCVELRqHvJW -7M6vLJF8aBqPQMf2sPDLVh9BqKE9HJ5KuFNPvV7H2OvTG/1gzzcKYiMpqPGrqrNv -K2JaZnj1C0fHuBJE1qS5CuE8xK9dqZZqYNjMp2vMJiKKWz3CZe9lBLmFhQPvLiVs -LXuRNgPWVqJ7M/3oLG7aT6oJ0e6KUXVZYVCIYYZYuHYhKQZLBKqJYvCiMlvTwKPx -s+fZE8yWGh7F3hpVj6TKNKL3srvBNH4dPVrHYCKJXPJ7V7FPFHWkLUeVYZN1Lnm9 -vLRjjCKJmXVoMYp1TVLFLXvbQF7lJxJZqrCgHBn7oBvqMN7j0C8vQKtVYJdPdXnH -Z5CnEPFLLOFXZQFhqZKVJdQFHsG/hOjYFwLXNGLOZYmU0jVdJHLXm7vQvFRqYQ7K -JvZ9C6E7ZTQZ8xZmNjLWdGJPMU7pTh7kQcU7Z4QTVn2XyNmXVFVCPj6l7xJqhVLR -FnVeXVJqkF7xL7PqFh7VmM5h0JhLZLqj7VvVHqVF5mJPfXH9cjZ0bVXqLhZ9MmZN -YQlVZFqNqQZYL5h6mPV1qJhJqRZXJqP7MF1kQhV7CqJqZLqHpZ7ZVZJqLhFpLqJ1 -mQINBF2Cr7UBEADQfNnCBd0ZT6d+3gzQKXoJZKCgYCy0O6f8Ue6XkdLJ0TkpQ5cZ -8L3Q7GQJQVF0vQ0LVOjCvVCPQNGh7dPr8xHQvfh5j9NQHQVfJXXj0YdZj0mQvZ+Y -Q0YhC7kQFHvPQ0mJfZHvH0CQ8VYvQpvG9L0qJ7wQH9dJh5QmQ7JLvZjCQhvj0vZQ -vQ5fv0ZfH5dPj0q5H9qJ8QJ5fj5JvZH9jQj5QpqJ9LqJZJ0J5qZHjJqHJqJZqJ5J -pZqJqZJLqZLJpqZJLJqZLqJ5JqZJqJLqZJqLJpZJqJLJpqZLqJZJqLqJZJqLJqZL -qJqZLJqLJqZLJpqZLqJZLJqLqZJLqJZJqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLq -JZqLJpZLqJZLqJZLJpZqLJpqZLqJZLJqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJ -ZqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpZqLJpqZLqJZLJ -qLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZ -LqJZqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpZqLJpqZLqJ -ZLJqLJpZLqJZLqJZLJpqZLqJLqZJqLJpZLqJZqLJpZLqJZLqJZLJpqZLqJLqZJqL -JpZLqJZqLJpZLqJZLqJZLJpZqLJpqZLqJZLJqLJpZLqJZLqJZLJpqZLqJLqZJqLJ -pZLqJZqLJpZLqJZLqJZLJwARAQABiQI8BBgBCAAmAhsMFiEE+123f9XBGLgFEa2o -pjEKzEZyR1wFAmBr3vgFCQvQ8ZsACgkQpjEKzEZyR1xhfA//VMi2VCwNqIFD4A7Q -H4/sLMNE4MFLfh+FLR8iGdLKYlJ4V8qYaFqLQHqKvLFJdQJ7LJ0LQNHqJZH0Zvjh -fH9ZQHqJ5JZH5vJHLpZJ0LZLqJ5JqJZLJqZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJqJZLqJZJ -qJZLqJZJqJZLqJZJqJZLqJZJqA== -=qvqC ------END PGP PUBLIC KEY BLOCK----- -EOF - - gpg --import awscli-public-key.asc 2> /dev/null || true - - if gpg --verify awscliv2.zip.sig awscliv2.zip 2> /dev/null; then - echo "✅ Signature verification successful" - else - echo "⚠️ Signature verification failed, but continuing installation..." - fi -fi + printf "Downloading AWS CLI from $DOWNLOAD_URL...\n" + curl -fsSL "$DOWNLOAD_URL" -o /tmp/AWSCLIV2.pkg >> "${LOG_PATH}" 2>&1 -# Extract the installer -echo "📦 Extracting installer..." -unzip -q awscliv2.zip + sudo installer -pkg /tmp/AWSCLIV2.pkg -target / >> "${LOG_PATH}" 2>&1 -# Run the installer -echo "🔧 Installing AWS CLI to $INSTALL_DIRECTORY..." + rm -f /tmp/AWSCLIV2.pkg -# Check if we need sudo -if [ -w "$INSTALL_DIRECTORY" ]; then - ./aws/install --install-dir "$INSTALL_DIRECTORY/aws-cli" --bin-dir "$INSTALL_DIRECTORY/bin" --update else - sudo ./aws/install --install-dir "$INSTALL_DIRECTORY/aws-cli" --bin-dir "$INSTALL_DIRECTORY/bin" --update + printf "Unsupported OS: $OS\n" > "${LOG_PATH}" 2>&1 + exit 1 fi -# Verify installation if command -v aws > /dev/null 2>&1; then - INSTALLED_VERSION=$(aws --version 2>&1 | awk '{print $1}' | cut -d'/' -f2) - echo "✅ AWS CLI successfully installed (version $INSTALLED_VERSION)" + printf "🥳 AWS CLI installed successfully!\n" aws --version else - echo "❌ AWS CLI installation failed" + printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\n" exit 1 fi From 3393a04272850fbb198b53008722f2d1e7eba376 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 17:50:21 -0700 Subject: [PATCH 6/9] Add AWS CLI autocomplete support for bash, zsh, and fish shells --- registry/ausbru87/modules/aws-cli/README.md | 9 ++++- registry/ausbru87/modules/aws-cli/run.sh | 39 +++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/registry/ausbru87/modules/aws-cli/README.md b/registry/ausbru87/modules/aws-cli/README.md index 0c0b0d16f..0ded3d20e 100644 --- a/registry/ausbru87/modules/aws-cli/README.md +++ b/registry/ausbru87/modules/aws-cli/README.md @@ -8,7 +8,7 @@ tags: [helper, aws, cli] # AWS CLI -Automatically install the [AWS CLI v2](https://aws.amazon.com/cli/) in your Coder workspace. +Automatically install the [AWS CLI v2](https://aws.amazon.com/cli/) in your Coder workspace with command autocomplete support for bash, zsh, and fish shells. ```tf module "aws-cli" { @@ -19,6 +19,13 @@ module "aws-cli" { } ``` +## Features + +- Installs AWS CLI v2 for Linux and macOS +- Supports x86_64 and ARM64 architectures +- Optional version pinning +- **Auto-configures command autocomplete** for bash, zsh, and fish shells + ## Examples ### Basic Installation diff --git a/registry/ausbru87/modules/aws-cli/run.sh b/registry/ausbru87/modules/aws-cli/run.sh index b78c97dd0..b2b25ccdf 100755 --- a/registry/ausbru87/modules/aws-cli/run.sh +++ b/registry/ausbru87/modules/aws-cli/run.sh @@ -66,3 +66,42 @@ else printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\n" exit 1 fi + +# Configure autocomplete for common shells +if command -v aws_completer > /dev/null 2>&1; then + AWS_COMPLETER_PATH=$(which aws_completer) + + # Bash autocomplete + if [ -f ~/.bashrc ]; then + if ! grep -q "aws_completer.*aws" ~/.bashrc; then + echo "complete -C '$AWS_COMPLETER_PATH' aws" >> ~/.bashrc + printf "✓ Configured AWS CLI autocomplete for bash\n" + fi + fi + + # Zsh autocomplete + if [ -f ~/.zshrc ] || [ -d ~/.oh-my-zsh ]; then + if ! grep -q "aws_completer.*aws" ~/.zshrc 2> /dev/null; then + cat >> ~/.zshrc << EOF + +# AWS CLI autocomplete +autoload bashcompinit && bashcompinit +autoload -Uz compinit && compinit +complete -C '$AWS_COMPLETER_PATH' aws +EOF + printf "✓ Configured AWS CLI autocomplete for zsh\n" + fi + fi + + # Fish autocomplete + if [ -d ~/.config/fish ] || command -v fish > /dev/null 2>&1; then + mkdir -p ~/.config/fish/completions + FISH_COMPLETION=~/.config/fish/completions/aws.fish + if [ ! -f "$FISH_COMPLETION" ]; then + cat > "$FISH_COMPLETION" << 'EOF' +complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); aws_completer | sed '"'"'s/ $//'"'"'; end)' +EOF + printf "✓ Configured AWS CLI autocomplete for fish\n" + fi + fi +fi From 2039c3908b15cbe3c0d3c0b14a3f3ed8e67445b8 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 18:12:47 -0700 Subject: [PATCH 7/9] Update namespace profile with personal info and GitHub avatar --- registry/ausbru87/.images/avatar.png | Bin 0 -> 58943 bytes registry/ausbru87/README.md | 11 +++++------ 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 registry/ausbru87/.images/avatar.png diff --git a/registry/ausbru87/.images/avatar.png b/registry/ausbru87/.images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0d3b953b0268f315ba4a4d6387f820ff496837 GIT binary patch literal 58943 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 z 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 ux`GrrQh*-a&w6Z{fp^N>FkZm+s Date: Sat, 15 Nov 2025 18:19:51 -0700 Subject: [PATCH 8/9] Add download_url parameter for airgapped environment support --- registry/ausbru87/modules/aws-cli/README.md | 14 +++++++ .../modules/aws-cli/aws-cli.tftest.hcl | 9 +++++ registry/ausbru87/modules/aws-cli/main.tf | 7 ++++ registry/ausbru87/modules/aws-cli/run.sh | 39 +++++++++++-------- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/registry/ausbru87/modules/aws-cli/README.md b/registry/ausbru87/modules/aws-cli/README.md index 0ded3d20e..6d0cbf5a7 100644 --- a/registry/ausbru87/modules/aws-cli/README.md +++ b/registry/ausbru87/modules/aws-cli/README.md @@ -62,3 +62,17 @@ module "aws-cli" { log_path = "/var/log/aws-cli.log" } ``` + +### Airgapped Environment + +Use a custom download URL for environments without internet access to AWS: + +```tf +module "aws-cli" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/ausbru87/aws-cli/coder" + version = "1.0.0" + agent_id = coder_agent.example.id + download_url = "https://internal-mirror.company.com/awscli-exe-linux-x86_64.zip" +} +``` diff --git a/registry/ausbru87/modules/aws-cli/aws-cli.tftest.hcl b/registry/ausbru87/modules/aws-cli/aws-cli.tftest.hcl index 210fec2b7..bd2c66a94 100644 --- a/registry/ausbru87/modules/aws-cli/aws-cli.tftest.hcl +++ b/registry/ausbru87/modules/aws-cli/aws-cli.tftest.hcl @@ -23,3 +23,12 @@ run "with_custom_log_path" { log_path = "/var/log/aws-cli.log" } } + +run "with_custom_download_url" { + command = plan + + variables { + agent_id = "test-agent-id" + download_url = "https://internal-mirror.company.com/awscli-exe-linux-x86_64.zip" + } +} diff --git a/registry/ausbru87/modules/aws-cli/main.tf b/registry/ausbru87/modules/aws-cli/main.tf index 825b7b8bd..b3bea3ebf 100644 --- a/registry/ausbru87/modules/aws-cli/main.tf +++ b/registry/ausbru87/modules/aws-cli/main.tf @@ -20,6 +20,12 @@ variable "install_version" { default = "" } +variable "download_url" { + type = string + description = "Custom download URL for AWS CLI. Useful for airgapped environments. If not set, uses the official AWS download URL." + default = "" +} + variable "log_path" { type = string description = "The path to the AWS CLI installation log file." @@ -33,6 +39,7 @@ resource "coder_script" "aws-cli" { script = templatefile("${path.module}/run.sh", { LOG_PATH : var.log_path, VERSION : var.install_version, + DOWNLOAD_URL : var.download_url, }) run_on_start = true run_on_stop = false diff --git a/registry/ausbru87/modules/aws-cli/run.sh b/registry/ausbru87/modules/aws-cli/run.sh index b2b25ccdf..864871e14 100755 --- a/registry/ausbru87/modules/aws-cli/run.sh +++ b/registry/ausbru87/modules/aws-cli/run.sh @@ -2,19 +2,20 @@ LOG_PATH=${LOG_PATH} VERSION=${VERSION} +DOWNLOAD_URL=${DOWNLOAD_URL} -BOLD='\033[0;1m' -RESET='\033[0m' +BOLD='\\033[0;1m' +RESET='\\033[0m' -printf "${BOLD}Installing AWS CLI...\n${RESET}" +printf "${BOLD}Installing AWS CLI...\\n${RESET}" # Check if AWS CLI is already installed if command -v aws > /dev/null 2>&1; then INSTALLED_VERSION=$(aws --version 2>&1 | cut -d' ' -f1 | cut -d'/' -f2) if [ -n "$VERSION" ] && [ "$INSTALLED_VERSION" != "$VERSION" ]; then - printf "AWS CLI $INSTALLED_VERSION is installed, but version $VERSION was requested.\n" + printf "AWS CLI $INSTALLED_VERSION is installed, but version $VERSION was requested.\\n" else - printf "AWS CLI is already installed ($INSTALLED_VERSION). Skipping installation.\n" + printf "AWS CLI is already installed ($INSTALLED_VERSION). Skipping installation.\\n" exit 0 fi fi @@ -27,16 +28,19 @@ case "$ARCH" in x86_64) ARCH="x86_64" ;; aarch64 | arm64) ARCH="aarch64" ;; *) - printf "Unsupported architecture: $ARCH\n" > "${LOG_PATH}" 2>&1 + printf "Unsupported architecture: $ARCH\\n" > "${LOG_PATH}" 2>&1 exit 1 ;; esac # Install AWS CLI if [ "$OS" = "linux" ]; then - DOWNLOAD_URL="https://awscli.amazonaws.com/awscli-exe-linux-${ARCH}.zip" + # Use custom download URL if provided, otherwise use default AWS URL + if [ -z "$DOWNLOAD_URL" ]; then + DOWNLOAD_URL="https://awscli.amazonaws.com/awscli-exe-linux-${ARCH}.zip" + fi - printf "Downloading AWS CLI from $DOWNLOAD_URL...\n" + printf "Downloading AWS CLI from $DOWNLOAD_URL...\\n" curl -fsSL "$DOWNLOAD_URL" -o /tmp/awscliv2.zip >> "${LOG_PATH}" 2>&1 unzip -q /tmp/awscliv2.zip -d /tmp >> "${LOG_PATH}" 2>&1 @@ -45,9 +49,12 @@ if [ "$OS" = "linux" ]; then rm -rf /tmp/awscliv2.zip /tmp/aws elif [ "$OS" = "darwin" ]; then - DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2.pkg" + # Use custom download URL if provided, otherwise use default AWS URL + if [ -z "$DOWNLOAD_URL" ]; then + DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2.pkg" + fi - printf "Downloading AWS CLI from $DOWNLOAD_URL...\n" + printf "Downloading AWS CLI from $DOWNLOAD_URL...\\n" curl -fsSL "$DOWNLOAD_URL" -o /tmp/AWSCLIV2.pkg >> "${LOG_PATH}" 2>&1 sudo installer -pkg /tmp/AWSCLIV2.pkg -target / >> "${LOG_PATH}" 2>&1 @@ -55,15 +62,15 @@ elif [ "$OS" = "darwin" ]; then rm -f /tmp/AWSCLIV2.pkg else - printf "Unsupported OS: $OS\n" > "${LOG_PATH}" 2>&1 + printf "Unsupported OS: $OS\\n" > "${LOG_PATH}" 2>&1 exit 1 fi if command -v aws > /dev/null 2>&1; then - printf "🥳 AWS CLI installed successfully!\n" + printf "🥳 AWS CLI installed successfully!\\n" aws --version else - printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\n" + printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\\n" exit 1 fi @@ -75,7 +82,7 @@ if command -v aws_completer > /dev/null 2>&1; then if [ -f ~/.bashrc ]; then if ! grep -q "aws_completer.*aws" ~/.bashrc; then echo "complete -C '$AWS_COMPLETER_PATH' aws" >> ~/.bashrc - printf "✓ Configured AWS CLI autocomplete for bash\n" + printf "✓ Configured AWS CLI autocomplete for bash\\n" fi fi @@ -89,7 +96,7 @@ autoload bashcompinit && bashcompinit autoload -Uz compinit && compinit complete -C '$AWS_COMPLETER_PATH' aws EOF - printf "✓ Configured AWS CLI autocomplete for zsh\n" + printf "✓ Configured AWS CLI autocomplete for zsh\\n" fi fi @@ -101,7 +108,7 @@ EOF cat > "$FISH_COMPLETION" << 'EOF' complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); aws_completer | sed '"'"'s/ $//'"'"'; end)' EOF - printf "✓ Configured AWS CLI autocomplete for fish\n" + printf "✓ Configured AWS CLI autocomplete for fish\\n" fi fi fi From be4dc937b5ab836134fcf74f40fd729360a1fe02 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Sat, 15 Nov 2025 18:32:49 -0700 Subject: [PATCH 9/9] Address PR review comments - Add set -e for strict error handling - Exit on version mismatch with clear error message - Use >> for log appending (was overwriting with >) - Add error checking after curl, unzip, and install commands - Add macOS architecture-specific download URLs - Move autocomplete config after successful installation verification --- registry/ausbru87/modules/aws-cli/run.sh | 91 ++++++++++++++---------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/registry/ausbru87/modules/aws-cli/run.sh b/registry/ausbru87/modules/aws-cli/run.sh index 864871e14..a943e4817 100755 --- a/registry/ausbru87/modules/aws-cli/run.sh +++ b/registry/ausbru87/modules/aws-cli/run.sh @@ -1,5 +1,7 @@ #!/usr/bin/env sh +set -e + LOG_PATH=${LOG_PATH} VERSION=${VERSION} DOWNLOAD_URL=${DOWNLOAD_URL} @@ -13,7 +15,9 @@ printf "${BOLD}Installing AWS CLI...\\n${RESET}" if command -v aws > /dev/null 2>&1; then INSTALLED_VERSION=$(aws --version 2>&1 | cut -d' ' -f1 | cut -d'/' -f2) if [ -n "$VERSION" ] && [ "$INSTALLED_VERSION" != "$VERSION" ]; then - printf "AWS CLI $INSTALLED_VERSION is installed, but version $VERSION was requested.\\n" + printf "❌ AWS CLI $INSTALLED_VERSION is installed, but version $VERSION was requested.\\n" + printf "Note: AWS CLI installer does not support version-specific installation.\\n" + exit 1 else printf "AWS CLI is already installed ($INSTALLED_VERSION). Skipping installation.\\n" exit 0 @@ -28,7 +32,7 @@ case "$ARCH" in x86_64) ARCH="x86_64" ;; aarch64 | arm64) ARCH="aarch64" ;; *) - printf "Unsupported architecture: $ARCH\\n" > "${LOG_PATH}" 2>&1 + printf "Unsupported architecture: $ARCH\\n" >> "${LOG_PATH}" 2>&1 exit 1 ;; esac @@ -41,74 +45,85 @@ if [ "$OS" = "linux" ]; then fi printf "Downloading AWS CLI from $DOWNLOAD_URL...\\n" - curl -fsSL "$DOWNLOAD_URL" -o /tmp/awscliv2.zip >> "${LOG_PATH}" 2>&1 + curl -fsSL "$DOWNLOAD_URL" -o /tmp/awscliv2.zip >> "${LOG_PATH}" 2>&1 || exit 1 - unzip -q /tmp/awscliv2.zip -d /tmp >> "${LOG_PATH}" 2>&1 - sudo /tmp/aws/install >> "${LOG_PATH}" 2>&1 + unzip -q /tmp/awscliv2.zip -d /tmp >> "${LOG_PATH}" 2>&1 || exit 1 + sudo /tmp/aws/install >> "${LOG_PATH}" 2>&1 || exit 1 rm -rf /tmp/awscliv2.zip /tmp/aws elif [ "$OS" = "darwin" ]; then - # Use custom download URL if provided, otherwise use default AWS URL + # Use custom download URL if provided, otherwise use architecture-specific AWS URL if [ -z "$DOWNLOAD_URL" ]; then - DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2.pkg" + case "$ARCH" in + x86_64) + DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2-x86_64.pkg" + ;; + aarch64) + DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2-arm64.pkg" + ;; + *) + DOWNLOAD_URL="https://awscli.amazonaws.com/AWSCLIV2.pkg" + ;; + esac fi printf "Downloading AWS CLI from $DOWNLOAD_URL...\\n" - curl -fsSL "$DOWNLOAD_URL" -o /tmp/AWSCLIV2.pkg >> "${LOG_PATH}" 2>&1 + curl -fsSL "$DOWNLOAD_URL" -o /tmp/AWSCLIV2.pkg >> "${LOG_PATH}" 2>&1 || exit 1 - sudo installer -pkg /tmp/AWSCLIV2.pkg -target / >> "${LOG_PATH}" 2>&1 + sudo installer -pkg /tmp/AWSCLIV2.pkg -target / >> "${LOG_PATH}" 2>&1 || exit 1 rm -f /tmp/AWSCLIV2.pkg else - printf "Unsupported OS: $OS\\n" > "${LOG_PATH}" 2>&1 + printf "Unsupported OS: $OS\\n" >> "${LOG_PATH}" 2>&1 exit 1 fi +# Verify installation was successful if command -v aws > /dev/null 2>&1; then printf "🥳 AWS CLI installed successfully!\\n" aws --version -else - printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\\n" - exit 1 -fi -# Configure autocomplete for common shells -if command -v aws_completer > /dev/null 2>&1; then - AWS_COMPLETER_PATH=$(which aws_completer) + # Configure autocomplete for common shells + if command -v aws_completer > /dev/null 2>&1; then + AWS_COMPLETER_PATH=$(which aws_completer) - # Bash autocomplete - if [ -f ~/.bashrc ]; then - if ! grep -q "aws_completer.*aws" ~/.bashrc; then - echo "complete -C '$AWS_COMPLETER_PATH' aws" >> ~/.bashrc - printf "✓ Configured AWS CLI autocomplete for bash\\n" + # Bash autocomplete + if [ -f ~/.bashrc ]; then + if ! grep -q "aws_completer.*aws" ~/.bashrc; then + echo "complete -C '$AWS_COMPLETER_PATH' aws" >> ~/.bashrc + printf "✓ Configured AWS CLI autocomplete for bash\\n" + fi fi - fi - # Zsh autocomplete - if [ -f ~/.zshrc ] || [ -d ~/.oh-my-zsh ]; then - if ! grep -q "aws_completer.*aws" ~/.zshrc 2> /dev/null; then - cat >> ~/.zshrc << EOF + # Zsh autocomplete + if [ -f ~/.zshrc ] || [ -d ~/.oh-my-zsh ]; then + if ! grep -q "aws_completer.*aws" ~/.zshrc 2> /dev/null; then + cat >> ~/.zshrc << ZSHEOF # AWS CLI autocomplete autoload bashcompinit && bashcompinit autoload -Uz compinit && compinit complete -C '$AWS_COMPLETER_PATH' aws -EOF - printf "✓ Configured AWS CLI autocomplete for zsh\\n" +ZSHEOF + printf "✓ Configured AWS CLI autocomplete for zsh\\n" + fi fi - fi - # Fish autocomplete - if [ -d ~/.config/fish ] || command -v fish > /dev/null 2>&1; then - mkdir -p ~/.config/fish/completions - FISH_COMPLETION=~/.config/fish/completions/aws.fish - if [ ! -f "$FISH_COMPLETION" ]; then - cat > "$FISH_COMPLETION" << 'EOF' + # Fish autocomplete + if [ -d ~/.config/fish ] || command -v fish > /dev/null 2>&1; then + mkdir -p ~/.config/fish/completions + FISH_COMPLETION=~/.config/fish/completions/aws.fish + if [ ! -f "$FISH_COMPLETION" ]; then + cat > "$FISH_COMPLETION" << 'FISHEOF' complete --command aws --no-files --arguments '(begin; set --local --export COMP_SHELL fish; set --local --export COMP_LINE (commandline); aws_completer | sed '"'"'s/ $//'"'"'; end)' -EOF - printf "✓ Configured AWS CLI autocomplete for fish\\n" +FISHEOF + printf "✓ Configured AWS CLI autocomplete for fish\\n" + fi fi fi +else + printf "❌ AWS CLI installation failed. Check logs at ${LOG_PATH}\\n" + exit 1 fi