#!/bin/bash set -e # Check if required environment variables are set if [ -z "$SIA_GITEA_API_KEY" ]; then echo "Error: SIA_GITEA_API_KEY environment variable is not set" exit 1 fi if [ -z "$SIA_REPO_URL" ]; then echo "Error: SIA_REPO_URL environment variable is not set" exit 1 fi # Install dependencies apt-get update apt-get install -y jq openssh-client git # Extract host, user and port from SIA_REPO_URL if [[ "$SIA_REPO_URL" == ssh://* ]]; then # Handle ssh:// format URL_PATH=${SIA_REPO_URL#ssh://} # Get user if specified if [[ "$URL_PATH" == *"@"* ]]; then SSH_USER=${URL_PATH%%@*} URL_PATH=${URL_PATH#*@} else SSH_USER="git" fi # Extract domain and port if [[ "$URL_PATH" == *":"* ]]; then # Format with port: domain:port/path SSH_HOST=${URL_PATH%%:*} PORT_PATH=${URL_PATH#*:} SSH_PORT=${PORT_PATH%%/*} else # Format without port: domain/path SSH_HOST=${URL_PATH%%/*} SSH_PORT=22 fi else # Handle git@ format (git@github.com:user/repo.git) if [[ "$SIA_REPO_URL" == *"@"* ]]; then SSH_USER=${SIA_REPO_URL%%@*} URL_PATH=${SIA_REPO_URL#*@} if [[ "$URL_PATH" == *":"* ]]; then SSH_HOST=${URL_PATH%%:*} SSH_PORT=22 # Standard format doesn't specify port else SSH_HOST=${URL_PATH%%/*} SSH_PORT=22 fi else SSH_USER="git" SSH_HOST=${SIA_REPO_URL%%/*} SSH_PORT=22 fi fi echo "Using SSH configuration:" echo " Host: $SSH_HOST" echo " User: $SSH_USER" echo " Port: $SSH_PORT" # Create SSH directory if it doesn't exist mkdir -p ~/.ssh chmod 700 ~/.ssh # Generate SSH key if it doesn't exist if [ ! -f ~/.ssh/sia_repo ]; then echo "Generating new SSH key..." ssh-keygen -t ed25519 -f ~/.ssh/sia_repo -N "" fi # Ensure proper permissions on SSH keys chmod 600 ~/.ssh/sia_repo chmod 644 ~/.ssh/sia_repo.pub # Get the public key SSH_PUBLIC_KEY=$(cat ~/.ssh/sia_repo.pub) # Add host key to known_hosts to avoid verification prompt echo "Adding host key to known_hosts..." ssh-keyscan -t rsa -p $SSH_PORT $SSH_HOST >> ~/.ssh/known_hosts chmod 600 ~/.ssh/known_hosts # Clear any existing connections in SSH config if [ -f ~/.ssh/config ]; then rm -f ~/.ssh/config fi # Check if a key with title "sia" already exists and delete it echo "Checking for existing SSH key in Gitea..." RESPONSE=$(curl -s -X GET "https://$SSH_HOST/api/v1/user/keys" \ -H "accept: application/json" \ -H "Authorization: token $SIA_GITEA_API_KEY") # Debug: Print the response to help diagnose issues echo "API Response: $RESPONSE" # Check if response is valid JSON if echo "$RESPONSE" | jq empty 2>/dev/null; then echo "Response is valid JSON" # Check if response is an array if [ "$(echo "$RESPONSE" | jq 'if type=="array" then "array" else "not_array" end')" = '"array"' ]; then echo "Response is an array, proceeding with key check" KEY_ID=$(echo "$RESPONSE" | jq -r '.[] | select(.title=="sia") | .id') if [ ! -z "$KEY_ID" ] && [ "$KEY_ID" != "null" ]; then echo "Found existing key with ID $KEY_ID, deleting..." curl -X DELETE "https://$SSH_HOST/api/v1/user/keys/$KEY_ID" \ -H "accept: application/json" \ -H "Authorization: token $SIA_GITEA_API_KEY" else echo "No existing key with title 'sia' found" fi else echo "Response is not an array, skipping key check" fi else echo "Invalid JSON response from API, skipping key check" fi # Add the SSH key to Gitea using the API echo "Adding SSH key to Gitea using API..." ADD_RESPONSE=$(curl -s -X POST "https://$SSH_HOST/api/v1/user/keys" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: token $SIA_GITEA_API_KEY" \ -d "{\"title\":\"sia\", \"key\":\"$SSH_PUBLIC_KEY\"}") # Debug: Print the response echo "Add key response: $ADD_RESPONSE" # Check if the response indicates success if echo "$ADD_RESPONSE" | jq -e '.id' > /dev/null 2>&1; then echo "SSH key added successfully!" else echo "Failed to add SSH key. Please check your API token and try again." exit 1 fi # Create SSH config file to specify which key to use echo "Configuring SSH to use the correct key for repository host..." cat > ~/.ssh/config << EOL Host $SSH_HOST User $SSH_USER Port $SSH_PORT IdentityFile ~/.ssh/sia_repo PreferredAuthentications publickey StrictHostKeyChecking no EOL chmod 600 ~/.ssh/config # Stop any running SSH agents to start fresh pkill ssh-agent || true # Start SSH agent and add the key eval $(ssh-agent -s) ssh-add ~/.ssh/sia_repo # Set up the Git SSH command to force use of the config file export GIT_SSH_COMMAND="ssh -F ~/.ssh/config" # Test the SSH connection echo "Testing SSH connection... (this might fail if the server rejects the connection)" ssh -F ~/.ssh/config -T -p $SSH_PORT $SSH_USER@$SSH_HOST || true # Ensure git is configured with a name and email if ! git config --global user.email > /dev/null; then echo "Configuring default git user email..." git config --global user.email "niels.geens@gmail.com" fi if ! git config --global user.name > /dev/null; then echo "Configuring default git user name..." git config --global user.name "Niels Geens" fi # Set the GIT_SSH_COMMAND environment variable persistently echo 'export GIT_SSH_COMMAND="ssh -F ~/.ssh/config"' >> ~/.bashrc # Add a helper function to modify bootstrap.sh behavior without changing it echo 'alias git="GIT_SSH_COMMAND=\"ssh -F ~/.ssh/config\" git"' >> ~/.bashrc echo "SSH key setup completed. The environment has been configured for git operations."