From c9e418aaf5993b878d6c00e99fdff12391b94bf4 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Sat, 27 Apr 2024 18:42:08 +0000 Subject: [PATCH] improve status code handling and add readme --- .icons/github.svg | 1 + github-upload-public-key/README.md | 70 ++++++++++++++++++++++++++++++ github-upload-public-key/main.tf | 3 +- github-upload-public-key/run.sh | 55 +++++++++++++++++------ 4 files changed, 114 insertions(+), 15 deletions(-) create mode 100644 .icons/github.svg create mode 100644 github-upload-public-key/README.md diff --git a/.icons/github.svg b/.icons/github.svg new file mode 100644 index 0000000..d5e6491 --- /dev/null +++ b/.icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/github-upload-public-key/README.md b/github-upload-public-key/README.md new file mode 100644 index 0000000..9e4a7b1 --- /dev/null +++ b/github-upload-public-key/README.md @@ -0,0 +1,70 @@ +--- +display_name: Github Upload Public Key +description: Automates uploading Coder public key to Github so users don't have to. +icon: ../.icons/github.svg +maintainer_github: f0ssel +verified: false +tags: [helper] +--- + +# github-upload-public-key + + + +```tf +module "github-upload-public-key" { + source = "registry.coder.com/modules/github-upload-public-key/coder" + version = "1.0.13" + agent_id = coder_agent.example.id +} +``` + + + +## Examples + +### Example 1 + +Install the Dracula theme from [OpenVSX](https://open-vsx.org/): + +```tf +module "MODULE_NAME" { + source = "registry.coder.com/modules/MODULE_NAME/coder" + version = "1.0.2" + agent_id = coder_agent.example.id + extensions = [ + "dracula-theme.theme-dracula" + ] +} +``` + +Enter the `.` into the extensions array and code-server will automatically install on start. + +### Example 2 + +Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson) file: + +```tf +module "MODULE_NAME" { + source = "registry.coder.com/modules/MODULE_NAME/coder" + version = "1.0.2" + agent_id = coder_agent.example.id + extensions = [ "dracula-theme.theme-dracula" ] + settings = { + "workbench.colorTheme" = "Dracula" + } +} +``` + +### Example 3 + +Run code-server in the background, don't fetch it from GitHub: + +```tf +module "MODULE_NAME" { + source = "registry.coder.com/modules/MODULE_NAME/coder" + version = "1.0.2" + agent_id = coder_agent.example.id + offline = true +} +``` diff --git a/github-upload-public-key/main.tf b/github-upload-public-key/main.tf index f06b055..7728f45 100644 --- a/github-upload-public-key/main.tf +++ b/github-upload-public-key/main.tf @@ -18,10 +18,9 @@ resource "coder_script" "github_upload_public_key" { agent_id = var.agent_id script = templatefile("${path.module}/run.sh", { CODER_OWNER_SESSION_TOKEN : data.coder_workspace.me.owner_session_token, - CODER_ACCESS_URL : data.coder_workspace.me.access_url + CODER_ACCESS_URL : data.coder_workspace.me.access_url, }) display_name = "Github Upload Public Key" icon = "/icon/github.svg" run_on_start = true - start_blocks_login = true } \ No newline at end of file diff --git a/github-upload-public-key/run.sh b/github-upload-public-key/run.sh index 8ea4a74..e973824 100755 --- a/github-upload-public-key/run.sh +++ b/github-upload-public-key/run.sh @@ -17,19 +17,28 @@ fi if [ -z "$GITHUB_TOKEN" ]; then echo "No GITHUB_TOKEN in the workspace environment!" + echo "The user must be authenticated with Github before this script can be run." exit 1 fi -PUBLIC_KEY_NAME="$CODER_ACCESS_URL Workspaces" - echo "Fetching Coder public SSH key..." -PUBLIC_KEY=$(curl "$CODER_ACCESS_URL/api/v2/users/me/gitsshkey" \ +PUBLIC_KEY_RESPONSE=$(curl -L -s \ + -w "%{http_code}" \ -H 'accept: application/json' \ -H "cookie: coder_session_token=$CODER_OWNER_SESSION_TOKEN" \ - --fail \ - -s \ - | jq -r '.public_key' + "$CODER_ACCESS_URL/api/v2/users/me/gitsshkey" ) +PUBLIC_KEY_RESPONSE_STATUS=$(tail -n1 <<< "$PUBLIC_KEY_RESPONSE") +PUBLIC_KEY_BODY=$(sed \$d <<< "$PUBLIC_KEY_RESPONSE") + +if [ "$PUBLIC_KEY_RESPONSE_STATUS" -ne 200 ]; then + echo "Failed to fetch Coder public SSH key with status code $PUBLIC_KEY_RESPONSE_STATUS!" + echo "$PUBLIC_KEY_BODY" + exit 1 +fi + +PUBLIC_KEY=$(jq -r '.public_key' <<< "$PUBLIC_KEY_BODY") +echo "Coder public SSH key found!" if [ -z "$PUBLIC_KEY" ]; then echo "No Coder public SSH key found!" @@ -37,28 +46,48 @@ if [ -z "$PUBLIC_KEY" ]; then fi echo "Fetching GitHub public SSH keys..." -GITHUB_MATCH=$(curl \ +GITHUB_KEYS_RESPONSE=$(curl -L -s \ + -w "%{http_code}" \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GITHUB_TOKEN" \ -H "X-GitHub-Api-Version: 2022-11-28" \ - --fail \ - -s \ - https://api.github.com/user/keys \ - | jq -r --arg PUBLIC_KEY "$PUBLIC_KEY" '.[] | select(.key == $PUBLIC_KEY) | .key' + https://api.github.com/user/keys ) +GITHUB_KEYS_RESPONSE_STATUS=$(tail -n1 <<< "$GITHUB_KEYS_RESPONSE") +GITHUB_KEYS_RESPONSE_BODY=$(sed \$d <<< "$GITHUB_KEYS_RESPONSE") + +if [ "$GITHUB_KEYS_RESPONSE_STATUS" -ne 200 ]; then + echo "Failed to fetch Coder public SSH key with status code $GITHUB_KEYS_RESPONSE_STATUS!" + echo "$GITHUB_KEYS_RESPONSE_BODY" + exit 1 +fi + +GITHUB_MATCH=$(jq -r --arg PUBLIC_KEY "$PUBLIC_KEY" '.[] | select(.key == $PUBLIC_KEY) | .key' <<< "$GITHUB_KEYS_RESPONSE_BODY") if [ "$PUBLIC_KEY" = "$GITHUB_MATCH" ]; then echo "Coder public SSH key is already uploaded to GitHub!" exit 0 fi + echo "Coder public SSH key not found in GitHub keys!" echo "Uploading Coder public SSH key to GitHub..." -curl -L \ +CODER_PUBLIC_KEY_NAME="$CODER_ACCESS_URL Workspaces" +UPLOAD_RESPONSE=$(curl -L -s \ -X POST \ + -w "%{http_code}" \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GITHUB_TOKEN" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/user/keys \ - -d "{\"title\":\"$PUBLIC_KEY_NAME\",\"key\":\"$PUBLIC_KEY\"}" + -d "{\"title\":\"$CODER_PUBLIC_KEY_NAME\",\"key\":\"nah\"}" +) +UPLOAD_RESPONSE_STATUS=$(tail -n1 <<< "$UPLOAD_RESPONSE") +UPLOAD_RESPONSE_BODY=$(sed \$d <<< "$UPLOAD_RESPONSE") + +if [ "$UPLOAD_RESPONSE_STATUS" -ne 201 ]; then + echo "Failed to upload Coder public SSH key with status code $UPLOAD_RESPONSE_STATUS!" + echo "$UPLOAD_RESPONSE_BODY" + exit 1 +fi echo "Coder public SSH key uploaded to GitHub!" \ No newline at end of file