#!/usr/bin/env bash # ============================================================================= # DiDi Lot 2 — Dovezi API pentru matricea de acceptanță (doc 08) # ============================================================================= # Ruleaza pe rand fiecare proba API din matrice. Dupa fiecare test se opreste # ca sa faci captura de ecran (SNIP). Fiecare bloc afiseaza: numarul din # matrice, DATA+ORA, comanda exacta si raspunsul. # # Utilizare: # bash dovezi-api.sh # interactiv (pauza dupa fiecare test) # bash dovezi-api.sh --auto # fara pauze (verificare rapida) # ============================================================================= set -uo pipefail HOST="${HOST:-localhost}" # ruleaza pe server; override: HOST= bash dovezi-api.sh AGENT="http://$HOST:24803" KC="http://$HOST:28080" AUTO=0; [ "${1:-}" = "--auto" ] && AUTO=1 B="\033[1m"; G="\033[32m"; C="\033[36m"; Y="\033[33m"; N="\033[0m" pauza() { [ "$AUTO" = "1" ] && { echo; return; } echo; echo -e "${Y}>>> Fa SNIP la blocul de mai sus, apoi apasa ENTER pentru testul urmator...${N}"; read -r; clear } antet() { # nr_matrice titlu echo -e "${B}==============================================================================${N}" echo -e "${B} PROBA $1 — $2${N}" echo -e " Data/ora testarii: ${G}$(date '+%Y-%m-%d %H:%M:%S %Z')${N} Server: $HOST Operator: $(whoami)" echo -e "${B}==============================================================================${N}" } cmd() { echo -e "${C}\$ $*${N}"; } jq_sau_cat() { python3 -m json.tool 2>/dev/null || cat; } clear # --- utilizator de test (cu credite) --- UID_TEST=$(docker exec didi-postgres psql -U bos_interface -d DIDI -tA -c \ "SELECT uc.keycloak_id FROM bos_sysadmin.user_credential uc JOIN bos_sysadmin.internet_user iu ON iu.internet_user_id=uc.internet_user_id WHERE iu.credits_remained > 100 LIMIT 1;" 2>/dev/null) echo "Utilizator de test: $UID_TEST" # ============================================================================= antet "M7.1" "Autentificare OIDC — obtinere token JWT (SSO)" cmd "curl -X POST $KC/auth/realms/didi-admins/protocol/openid-connect/token -d grant_type=password -d client_id=admin-dashboard -d username=admin -d password=*****" TOKEN=$(curl -sk -X POST "$KC/auth/realms/didi-admins/protocol/openid-connect/token" \ -d grant_type=password -d client_id=admin-dashboard -d username=admin -d password=Admin12345 \ | python3 -c "import sys,json;print(json.load(sys.stdin).get('access_token',''))") if [ -n "$TOKEN" ]; then echo -e "${G}TOKEN OBTINUT (JWT RS256).${N} Claims relevante din token:" echo "$TOKEN" | cut -d. -f2 | python3 -c " import sys,json,base64 p=sys.stdin.read().strip(); p+='='*(-len(p)%4) d=json.loads(base64.urlsafe_b64decode(p)) print(json.dumps({k:d[k] for k in ('iss','preferred_username','realm_access','exp') if k in d}, indent=2, ensure_ascii=False))" else echo "EROARE: nu s-a obtinut token" fi pauza # ============================================================================= antet "M1.4" "Executie SINCRONA — POST /api/v3/pipeline/analyze (text)" cmd "curl -X POST $AGENT/api/v3/pipeline/analyze {media_type:text, text:'...', user_id}" curl -sk --max-time 120 -X POST "$AGENT/api/v3/pipeline/analyze" -H 'Content-Type: application/json' \ -d "{\"media_type\":\"text\",\"text\":\"Guvernul a anuntat astazi noi masuri economice care vor intra in vigoare luna viitoare, potrivit comunicatului oficial.\",\"user_id\":\"$UID_TEST\"}" \ | python3 -c " import sys,json d=json.load(sys.stdin); s=d.get('data',d) print(json.dumps({'success':d.get('success'),'session_id':s.get('session_id'),'status':s.get('status'),'risk_score':s.get('risk_score'),'risk_category':s.get('risk_category'),'components_run':s.get('components_run')}, indent=2, ensure_ascii=False))" echo -e "${G}=> HTTP 200 cu verdict complet in raspuns = executie sincrona OK${N}" pauza # ============================================================================= antet "M1.5" "Executie ASINCRONA — POST /api/v3/pipeline/analyze-async (202 + poll)" cmd "curl -X POST $AGENT/api/v3/pipeline/analyze-async {media_type:text, ...}" RESP=$(curl -sk --max-time 30 -X POST "$AGENT/api/v3/pipeline/analyze-async" -H 'Content-Type: application/json' \ -d "{\"media_type\":\"text\",\"text\":\"OMS a confirmat oficial ca vaccinurile contin microcipuri 5G pentru controlul populatiei prin unde radio.\",\"user_id\":\"$UID_TEST\"}") echo "$RESP" | jq_sau_cat SID=$(echo "$RESP" | python3 -c "import sys,json;print(json.load(sys.stdin)['data']['session_id'])" 2>/dev/null) echo -e "${G}=> Raspuns imediat cu session_id + poll_url + result_url = dispatch async OK${N}" pauza # ============================================================================= antet "M1.9" "Status executie — GET /pipeline//queue-status (polling)" cmd "curl $AGENT/api/v3/pipeline/$SID/queue-status (repetat pana la completed)" for i in $(seq 1 40); do ST=$(curl -sk "$AGENT/api/v3/pipeline/$SID/queue-status" | python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('data',{}).get('status') or d.get('status',''))" 2>/dev/null) echo " poll #$i @ $(date '+%H:%M:%S'): status=$ST" [ "$ST" = "completed" ] || [ "$ST" = "failed" ] && break sleep 3 done echo -e "${G}=> Progres urmarit in timp real pana la 'completed'${N}" pauza # ============================================================================= antet "M2.5" "Rezultat final structurat — GET /pipeline//result" cmd "curl $AGENT/api/v3/pipeline/$SID/result" curl -sk "$AGENT/api/v3/pipeline/$SID/result" | python3 -c " import sys,json d=json.load(sys.stdin); s=d.get('data',d) print(json.dumps({'session_id':s.get('session_id'),'status':s.get('status'),'input_type':s.get('input_type'),'risk_score':s.get('risk_score'),'risk_category':s.get('risk_category'),'risk_level':s.get('risk_level'),'confidence':s.get('confidence'),'components_run':s.get('components_run'),'llm_usage_total':(s.get('llm_usage') or {}).get('total')}, indent=2, ensure_ascii=False))" echo -e "${G}=> Text de dezinformare detectat cu scor mare = pipeline complet functional${N}" pauza # ============================================================================= antet "M1.6" "Simulare DRY-RUN — POST /pipeline/dry-run (plan fara executie)" cmd "curl -X POST $AGENT/api/v3/pipeline/dry-run {media_type:text, ...}" curl -sk --max-time 30 -X POST "$AGENT/api/v3/pipeline/dry-run" -H 'Content-Type: application/json' \ -d "{\"media_type\":\"text\",\"text\":\"test de simulare dry run pentru acceptanta\",\"user_id\":\"$UID_TEST\"}" \ | python3 -m json.tool 2>/dev/null | head -60 echo -e "${G}=> Planul de executie (noduri, cozi, modele) FARA a consuma resurse${N}" pauza # ============================================================================= antet "M2.6" "Health profund — GET /api/v3/health/all (infra + 9 servicii AI Lot 1)" cmd "curl $AGENT/api/v3/health/all" curl -sk --max-time 30 "$AGENT/api/v3/health/all" | jq_sau_cat echo -e "${G}=> Toate dependentele (PostgreSQL/Redis/RabbitMQ/framework + 9 servicii AI) healthy${N}" pauza # ============================================================================= antet "M2.4 + M5.2" "Persistenta in PostgreSQL — istoricul analizelor (schema bos_analysis)" cmd "SELECT input_type,status,risk_category,risk_score,created_at FROM bos_analysis.analysis_session ORDER BY created_at DESC LIMIT 5" docker exec didi-postgres psql -U bos_interface -d DIDI -c \ "SELECT input_type, status, risk_category, risk_score, to_char(created_at,'YYYY-MM-DD HH24:MI') AS data_analiza FROM bos_analysis.analysis_session ORDER BY created_at DESC LIMIT 5;" echo -e "${G}=> Analizele (inclusiv cele de mai sus) persistate in baza de date${N}" pauza # ============================================================================= antet "M5.3" "Organizarea pe scheme a bazei de date" cmd "\\dn (lista schemelor)" docker exec didi-postgres psql -U bos_interface -d DIDI -c "\dn" docker exec didi-postgres psql -U bos_interface -d DIDI -c \ "SELECT 'tehnici' AS obiect, count(*) FROM bos_parammgmt.technique UNION ALL SELECT 'modele LLM', count(*) FROM bos_parammgmt.llm_model UNION ALL SELECT 'sesiuni analiza', count(*) FROM bos_analysis.analysis_session;" echo -e "${G}=> 4 scheme (parametri/analiza/utilizatori/date personale) + date reale${N}" pauza # ============================================================================= antet "M4.2" "Gateway Kong — protectie: cerere FARA token => 401" cmd "curl -X POST http://127.0.0.1:18000/agent-v3/api/v3/pipeline/analyze-async (FARA Authorization)" CODE=$(curl -sk --max-time 10 -H 'Host: localhost' -o /dev/null -w '%{http_code}' \ -X POST "http://127.0.0.1:18000/agent-v3/api/v3/pipeline/analyze-async" \ -H 'Content-Type: application/json' -d '{"media_type":"text","text":"acces neautorizat"}') echo " Raspuns HTTP: $CODE" echo -e "${G}=> 401 Unauthorized = gateway-ul respinge cererile fara JWT (securitate la punct unic)${N}" pauza # ============================================================================= antet "M3.1" "Broker de mesaje — cozile RabbitMQ (componente x prioritati + DLQ)" cmd "curl -u admin:*** http://$HOST:15672/api/queues (nume + consumeri)" curl -s -u admin:rabbitmq123 "http://$HOST:15672/api/queues" | python3 -c " import sys,json qs=json.load(sys.stdin) print(f'Total cozi: {len(qs)}') for q in sorted(qs, key=lambda x:x['name'])[:30]: print(f\" {q['name']:45s} consumeri={q.get('consumers',0):2d} mesaje={q.get('messages',0)}\")" echo -e "${G}=> Cozile per componenta si prioritate, cu consumeri (workeri) atasati${N}" pauza # ============================================================================= antet "M9.1" "Containerizare — toate serviciile in containere, healthy" cmd "docker ps (sumar pe categorii)" TOTAL=$(docker ps -q | wc -l) HEALTHY=$(docker ps --format '{{.Status}}' | grep -c healthy) UNHEALTHY=$(docker ps --format '{{.Status}}' | grep -c unhealthy || true) echo " Containere pornite: $TOTAL | cu healthcheck healthy: $HEALTHY | unhealthy: $UNHEALTHY" echo docker ps --format ' {{.Names}}\t{{.Status}}' | sort | head -30 echo " ... (lista completa: docker ps)" echo -e "${G}=> Platforma integral containerizata, servicii sanatoase${N}" pauza echo -e "${B}==============================================================================${N}" echo -e "${B} TOATE PROBELE API AU FOST RULATE — $(date '+%Y-%m-%d %H:%M:%S')${N}" echo -e "${B}==============================================================================${N}"