#!/bin/sh set -e PISTON_URL="${PISTON_URL:-http://piston:2000}" MAX_RETRIES=10 COUNT=0 echo "Waiting for DB and running alembic migrations..." until alembic upgrade head; do COUNT=$((COUNT+1)) if [ "$COUNT" -ge "$MAX_RETRIES" ]; then echo "Alembic migrations failed after $COUNT attempts." >&2 exit 1 fi echo "Alembic failed, retrying in 3s... ($COUNT/$MAX_RETRIES)" sleep 3 done echo "Migrations applied." # Install Piston languages in background install_piston_languages() { echo "Installing Piston languages in background..." # Wait for Piston to be ready until curl -s "$PISTON_URL/api/v2/runtimes" > /dev/null 2>&1; do echo "Waiting for Piston..." sleep 2 done # Check which languages are already installed INSTALLED=$(curl -s "$PISTON_URL/api/v2/runtimes" | python3 -c "import sys,json; print(' '.join(f\"{r['language']}={r['version']}\" for r in json.load(sys.stdin)))" 2>/dev/null || echo "") install_lang() { lang=$1 version=$2 if echo "$INSTALLED" | grep -q "$lang=$version"; then echo "✓ $lang $version already installed" else echo "Installing $lang $version..." curl -s -X POST "$PISTON_URL/api/v2/packages" \ -H "Content-Type: application/json" \ -d "{\"language\":\"$lang\",\"version\":\"$version\"}" > /dev/null && \ echo "✓ $lang $version installed" || \ echo "✗ Failed to install $lang $version" fi } echo "=== Core Languages ===" install_lang "python" "3.12.0" install_lang "gcc" "10.2.0" install_lang "java" "15.0.2" install_lang "node" "20.11.1" echo "=== Systems Programming ===" install_lang "go" "1.16.2" install_lang "rust" "1.68.2" echo "=== JVM Languages ===" install_lang "kotlin" "1.8.20" install_lang "scala" "3.2.2" echo "=== .NET ===" install_lang "dotnet" "5.0.201" echo "=== Scripting ===" install_lang "ruby" "3.0.1" install_lang "perl" "5.36.0" install_lang "php" "8.2.3" install_lang "lua" "5.4.4" echo "=== Functional ===" install_lang "haskell" "9.0.1" install_lang "ocaml" "4.12.0" install_lang "elixir" "1.11.3" install_lang "clojure" "1.10.3" install_lang "racket" "8.3.0" echo "=== Other ===" install_lang "pascal" "3.2.2" install_lang "fortran" "10.2.0" install_lang "swift" "5.3.3" install_lang "typescript" "5.0.3" install_lang "nim" "1.6.2" install_lang "zig" "0.10.1" install_lang "d" "10.2.0" install_lang "prolog" "8.2.4" echo "=== Low-level ===" install_lang "nasm" "2.15.5" install_lang "bash" "5.1.0" echo "=== Piston languages installation complete ===" } # Run language installation in background install_piston_languages & exec "$@"