#!/bin/bash set -e # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' GRAY='\033[0;90m' CYAN='\033[0;36m' NC='\033[0m' # No Color BOLD='\033[1m' echo "" echo -e "${GREEN}${BOLD}" cat << 'RAPTOR' === ========= ================ ================= ================= === ================= ========= ================= ============== =================== ================= =================== ================= ================== ================== ================= ================ == ================= ================ == ==== ================== ================= ==== ======= ================== ================= ======= ========= ================================= =========== ============ =========================== =========== ============== ===================== ============== ============== ================= =============== ============== =========== =============== ============== ==== =============== ============== =============== ============= =============== ============ ============ ========= ========= ====== ====== === === Welcome to Greptile's Internal Onboarding RAPTOR echo -e "${NC}" echo "" # Parse onboard flags from $1 or GREPTILE_ONBOARD_FLAGS env var (e.g. 'demo') ONBOARD_FLAGS="" if [ -n "$1" ]; then ONBOARD_FLAGS="$1" elif [ -n "$GREPTILE_ONBOARD_FLAGS" ]; then ONBOARD_FLAGS="$GREPTILE_ONBOARD_FLAGS" fi # Validate (lowercase token, hyphens allowed). Drop anything else. if [ -n "$ONBOARD_FLAGS" ] && { [ ${#ONBOARD_FLAGS} -gt 41 ] || [[ ! "$ONBOARD_FLAGS" =~ ^[a-z]([a-z0-9]*(-[a-z0-9]+)*)?$ ]]; }; then echo -e "${YELLOW}Ignoring invalid onboard flag: $ONBOARD_FLAGS${NC}" ONBOARD_FLAGS="" fi # Request a device code echo -e "${GRAY}Initializing...${NC}" if [ -n "$ONBOARD_FLAGS" ]; then RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d "{\"flags\":\"$ONBOARD_FLAGS\"}" "https://onboard.greptile.com/api/device-code") else RESPONSE=$(curl -s -X POST "https://onboard.greptile.com/api/device-code") fi CODE=$(echo "$RESPONSE" | grep -o '"code":"[^"]*"' | cut -d'"' -f4) VERIFY_URL=$(echo "$RESPONSE" | grep -o '"verifyUrl":"[^"]*"' | cut -d'"' -f4) if [ -z "$CODE" ]; then echo -e "${RED}Failed to initialize. Please try again.${NC}" exit 1 fi echo "" echo -e "Open this URL in your browser to authenticate:" echo -e "${CYAN}$VERIFY_URL${NC}" echo "" # Try to generate QR code if qrencode is available if command -v qrencode &> /dev/null; then qrencode -t ANSIUTF8 "$VERIFY_URL" echo "" fi echo -e "${GRAY}Waiting for authentication...${NC}" echo "(Press Ctrl+C to cancel)" echo "" # Poll for authentication MAX_ATTEMPTS=180 # 15 minutes at 5-second intervals ATTEMPT=0 while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do POLL_RESPONSE=$(curl -s "https://onboard.greptile.com/api/poll?code=$CODE") # Check if we got the installer script (starts with #!/bin/bash) if echo "$POLL_RESPONSE" | head -1 | grep -q "^#!/bin/bash"; then echo -e "${GREEN}Authentication successful!${NC}" echo "" echo -e "${GRAY}Starting installation...${NC}" echo "" # Execute the installer script echo "$POLL_RESPONSE" | bash exit 0 fi # Check for status STATUS=$(echo "$POLL_RESPONSE" | grep -o '"status":"[^"]*"' | cut -d'"' -f4) if [ "$STATUS" = "expired" ]; then echo -e "${RED}Session expired. Please run the command again.${NC}" exit 1 fi sleep 5 ATTEMPT=$((ATTEMPT + 1)) # Show a spinner case $((ATTEMPT % 4)) in 0) echo -ne "\r${GRAY}Waiting... |${NC} " ;; 1) echo -ne "\r${GRAY}Waiting... /${NC} " ;; 2) echo -ne "\r${GRAY}Waiting... -${NC} " ;; 3) echo -ne "\r${GRAY}Waiting... \\${NC} " ;; esac done echo "" echo -e "${RED}Timeout waiting for authentication. Please try again.${NC}" exit 1