## Description
Adds post_clone_script variable to the dotfiles module, enabling startup
coordination with other scripts that depend on dotfiles.
An example of how to use this, which assumes the PR has been merged:
```
module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/dotfiles/coder"
version = "1.3.0"
agent_id = coder_agent.main.id
default_dotfiles_uri = "https://github.com/someuser/somedotfiles"
post_clone_script = <<-EOF
coder exp sync start dotfiles && coder exp sync complete dotfiles
EOF
}
resource "coder_script" "personalize" {
count = data.coder_workspace.me.start_count
agent_id = coder_agent.main.id
display_name = "Personalize"
icon = "/icon/personalize.svg"
run_on_start = true
script = <<-EOF
trap 'coder exp sync complete personalize' EXIT
coder exp sync want personalize dotfiles
coder exp sync start personalize
SCRIPT="$HOME/.config/coderv2/dotfiles/personalize"
if [ -f "$SCRIPT" ] && [ -x "$SCRIPT" ]; then
$SCRIPT
fi
EOF
}
```
## Type of Change
- [ ] New module
- [ ] New template
- [ ] Bug fix
- [x] Feature/enhancement
- [ ] Documentation
- [ ] Other
## Module Information
**Path:** `registry/coder/modules/dotfiles`
**New version:** `v1.3.0`
**Breaking change:** [ ] Yes [x] No
## Testing & Validation
- [ ] Tests pass (`bun test`)
- [ ] Code formatted (`bun fmt`)
- [x] Changes tested locally
## Related Issues
#678
57 lines
1.7 KiB
Bash
57 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
DOTFILES_URI="${DOTFILES_URI}"
|
|
DOTFILES_USER="${DOTFILES_USER}"
|
|
|
|
# Validate DOTFILES_URI to prevent command injection (defense in depth)
|
|
if [ -n "$DOTFILES_URI" ]; then
|
|
# shellcheck disable=SC2250
|
|
if [[ "$DOTFILES_URI" =~ [^a-zA-Z0-9._/:@-] ]]; then
|
|
echo "ERROR: DOTFILES_URI contains invalid characters" >&2
|
|
exit 1
|
|
fi
|
|
if ! [[ "$DOTFILES_URI" =~ ^(https?://|ssh://|git@|git://) ]]; then
|
|
echo "ERROR: DOTFILES_URI must be a valid repository URL (https://, http://, ssh://, git@, or git://)" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# shellcheck disable=SC2157
|
|
if [ -n "$${DOTFILES_URI// }" ]; then
|
|
if [ -z "$DOTFILES_USER" ]; then
|
|
DOTFILES_USER="$USER"
|
|
fi
|
|
|
|
echo "✨ Applying dotfiles for user $DOTFILES_USER"
|
|
|
|
if [ "$DOTFILES_USER" = "$USER" ]; then
|
|
coder dotfiles "$DOTFILES_URI" -y 2>&1 | tee ~/.dotfiles.log
|
|
else
|
|
if command -v getent > /dev/null 2>&1; then
|
|
DOTFILES_USER_HOME=$(getent passwd "$DOTFILES_USER" | cut -d: -f6)
|
|
else
|
|
DOTFILES_USER_HOME=$(awk -F: -v user="$DOTFILES_USER" '$1 == user {print $6}' /etc/passwd)
|
|
fi
|
|
if [ -z "$DOTFILES_USER_HOME" ]; then
|
|
echo "ERROR: Could not determine home directory for user $DOTFILES_USER" >&2
|
|
exit 1
|
|
fi
|
|
|
|
CODER_BIN=$(command -v coder)
|
|
sudo -u "$DOTFILES_USER" "$CODER_BIN" dotfiles "$DOTFILES_URI" -y 2>&1 | tee "$DOTFILES_USER_HOME/.dotfiles.log"
|
|
fi
|
|
fi
|
|
|
|
POST_CLONE_SCRIPT="${POST_CLONE_SCRIPT}"
|
|
|
|
if [ -n "$POST_CLONE_SCRIPT" ]; then
|
|
echo "Running post-clone script..."
|
|
POST_CLONE_TMP=$(mktemp)
|
|
echo "$POST_CLONE_SCRIPT" | base64 -d > "$POST_CLONE_TMP"
|
|
chmod +x "$POST_CLONE_TMP"
|
|
$POST_CLONE_TMP
|
|
rm "$POST_CLONE_TMP"
|
|
fi
|