GeoNetAgent, LDAPWeb, server-audit, server-connection
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

141 lines
5.0 KiB

#!/bin/bash
# Tes API project-search (Ollama + indeks NAS) dari reverse proxy 10.100.1.24
#
# Usage (di server .24):
#
# OAuth2 Client Credentials (disarankan):
# export PROJECT_SEARCH_OAUTH_CLIENT_ID='a2072649-3215-4701-af9f-d89d13875105'
# export PROJECT_SEARCH_OAUTH_CLIENT_SECRET='...'
# ./scripts/test-project-search.sh
#
# LDAP JWT:
# export PROJECT_SEARCH_API_USER='admin'
# export PROJECT_SEARCH_API_PASS='password-ldap'
# ./scripts/test-project-search.sh "carikan projek Pertamina"
#
# API token statis:
# export PROJECT_SEARCH_API_TOKEN='dbl_...'
# ./scripts/test-project-search.sh
#
# Dari laptop (upload + jalankan):
# scp -o MACs=hmac-sha1 scripts/test-project-search.sh root@10.100.1.24:/tmp/
# ssh -m hmac-sha1 root@10.100.1.24 -p 22 "chmod +x /tmp/test-project-search.sh && \
# PROJECT_SEARCH_OAUTH_CLIENT_ID=... PROJECT_SEARCH_OAUTH_CLIENT_SECRET=... /tmp/test-project-search.sh"
set -euo pipefail
API_BASE="${PROJECT_SEARCH_API_BASE:-http://127.0.0.1:8091}"
QUERY="${1:-carikan projek Pertamina}"
LIMIT="${PROJECT_SEARCH_LIMIT:-10}"
SOURCES_JSON="${PROJECT_SEARCH_SOURCES:-[\"project\"]}"
OAUTH_CLIENT_ID="${PROJECT_SEARCH_OAUTH_CLIENT_ID:-a2072649-3215-4701-af9f-d89d13875105}"
OAUTH_SCOPE="${PROJECT_SEARCH_OAUTH_SCOPE:-project-search:read}"
if ! command -v curl >/dev/null 2>&1; then
echo "curl tidak ditemukan." >&2
exit 1
fi
json_pretty() {
if command -v python3 >/dev/null 2>&1; then
python3 -m json.tool
elif command -v jq >/dev/null 2>&1; then
jq .
else
cat
fi
}
json_get() {
local expr="$1"
python3 -c "import sys,json; d=json.load(sys.stdin); print($expr)"
}
echo "==> API base: ${API_BASE}"
echo "==> Query : ${QUERY}"
echo
if [[ -n "${PROJECT_SEARCH_API_TOKEN:-}" ]]; then
TOKEN="$PROJECT_SEARCH_API_TOKEN"
echo "==> Auth: API token (prefix ${TOKEN:0:8}...)"
elif [[ -n "${PROJECT_SEARCH_OAUTH_CLIENT_SECRET:-}" ]]; then
if ! command -v python3 >/dev/null 2>&1; then
echo "python3 diperlukan untuk parse OAuth token JSON." >&2
exit 1
fi
echo "==> Auth: OAuth2 Client Credentials"
echo " client_id: ${OAUTH_CLIENT_ID}"
echo " scope : ${OAUTH_SCOPE}"
TOKEN_JSON=$(curl -sf -X POST "${API_BASE}/oauth/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d "grant_type=client_credentials" \
-d "client_id=${OAUTH_CLIENT_ID}" \
-d "client_secret=${PROJECT_SEARCH_OAUTH_CLIENT_SECRET}" \
-d "scope=${OAUTH_SCOPE}") \
|| { echo "OAuth token request gagal (cek client_id/secret/scope)." >&2; exit 1; }
TOKEN=$(printf '%s' "$TOKEN_JSON" | json_get "d['access_token']")
if [[ -z "$TOKEN" ]]; then
echo "access_token kosong. Respons:" >&2
printf '%s\n' "$TOKEN_JSON" | json_pretty >&2
exit 1
fi
echo " Token OK (${#TOKEN} chars)"
elif [[ -n "${PROJECT_SEARCH_API_USER:-}" && -n "${PROJECT_SEARCH_API_PASS:-}" ]]; then
if ! command -v python3 >/dev/null 2>&1; then
echo "python3 diperlukan untuk parse login JSON." >&2
exit 1
fi
echo "==> Auth: LDAP JWT — ${PROJECT_SEARCH_API_USER}"
LOGIN_JSON=$(curl -sf -X POST "${API_BASE}/api/v1/auth/login" \
-H 'Content-Type: application/json' \
-d "{\"username\":\"${PROJECT_SEARCH_API_USER}\",\"password\":\"${PROJECT_SEARCH_API_PASS}\"}") \
|| { echo "Login API gagal (cek kredensial / LDAP)." >&2; exit 1; }
TOKEN=$(printf '%s' "$LOGIN_JSON" | json_get "d['data']['access_token']")
if [[ -z "$TOKEN" ]]; then
echo "Token kosong. Respons login:" >&2
printf '%s\n' "$LOGIN_JSON" | json_pretty >&2
exit 1
fi
echo " Token OK (${#TOKEN} chars)"
else
echo "Set salah satu metode auth:" >&2
echo " PROJECT_SEARCH_OAUTH_CLIENT_SECRET (+ optional PROJECT_SEARCH_OAUTH_CLIENT_ID)" >&2
echo " PROJECT_SEARCH_API_USER + PROJECT_SEARCH_API_PASS" >&2
echo " PROJECT_SEARCH_API_TOKEN" >&2
exit 1
fi
AUTH_HEADER="Authorization: Bearer ${TOKEN}"
echo
echo "==> GET /api/v1/project-search/sources"
curl -sf "${API_BASE}/api/v1/project-search/sources" -H "$AUTH_HEADER" | json_pretty
echo
echo "==> GET /api/v1/project-search/index/status"
curl -sf "${API_BASE}/api/v1/project-search/index/status" -H "$AUTH_HEADER" | json_pretty
echo
echo "==> POST /api/v1/project-search/ask"
ASK_BODY=$(cat <<EOF
{"query":"${QUERY}","sources":${SOURCES_JSON},"limit":${LIMIT}}
EOF
)
ASK_RESP=$(curl -sf -X POST "${API_BASE}/api/v1/project-search/ask" \
-H "$AUTH_HEADER" \
-H 'Content-Type: application/json' \
-d "$ASK_BODY") || { echo "Request ask gagal." >&2; exit 1; }
printf '%s\n' "$ASK_RESP" | json_pretty
echo
if command -v python3 >/dev/null 2>&1; then
COUNT=$(printf '%s' "$ASK_RESP" | json_get "len(d.get('data',{}).get('results',[]))")
ANSWER=$(printf '%s' "$ASK_RESP" | json_get "d.get('data',{}).get('answer','')[:300]")
echo "==> Ringkasan: ${COUNT} hasil"
echo "==> Jawaban (300 char pertama):"
echo "$ANSWER"
fi
echo
echo "OK — project-search API merespons."