107 lines
4.4 KiB
Bash
Executable File
107 lines
4.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# Smoke iterativo end-to-end de las 12 capabilities nuevas (+ 2 base = 14 total).
|
|
# Asume device_agent corriendo en 10.42.0.10:7474 con manifest enriched.
|
|
|
|
set -uo pipefail
|
|
|
|
URL=http://10.42.0.10:7474/capability
|
|
AUDIT_DB=/tmp/device_audit.db
|
|
PASS=0
|
|
FAIL=0
|
|
FAIL_NAMES=()
|
|
|
|
audit_count_before=$(sqlite3 "$AUDIT_DB" "SELECT COUNT(*) FROM audit_log;" 2>/dev/null || echo 0)
|
|
echo "[smoke] audit_log rows BEFORE: $audit_count_before"
|
|
echo
|
|
|
|
call() {
|
|
local name="$1"
|
|
local payload="$2"
|
|
local rid="smoke-$(date +%s%N)-$RANDOM"
|
|
local body
|
|
body=$(echo "$payload" | sed "s/__RID__/$rid/")
|
|
local resp
|
|
resp=$(curl -sS -X POST "$URL" -H "Content-Type: application/json" -d "$body")
|
|
local ok
|
|
ok=$(echo "$resp" | python3 -c 'import sys,json;d=json.load(sys.stdin);print(d.get("ok",False))' 2>/dev/null || echo "False")
|
|
if [[ "$ok" == "True" ]]; then
|
|
echo "[OK] $name"
|
|
PASS=$((PASS+1))
|
|
else
|
|
echo "[FAIL] $name -> $resp"
|
|
FAIL=$((FAIL+1))
|
|
FAIL_NAMES+=("$name")
|
|
fi
|
|
}
|
|
|
|
# 1. shell.exec (baseline)
|
|
call "shell.exec" '{"request_id":"__RID__","capability":"shell.exec","args":["echo","smoke-test"]}'
|
|
|
|
# 2. shell.eval (baseline)
|
|
call "shell.eval" '{"request_id":"__RID__","capability":"shell.eval","args":{"cmd":"echo hello-eval"}}'
|
|
|
|
# 3. fs.read
|
|
echo "smoke-payload" > /tmp/smoke_test_file.txt
|
|
call "fs.read" '{"request_id":"__RID__","capability":"fs.read","args":{"path":"/tmp/smoke_test_file.txt"}}'
|
|
|
|
# 4. fs.write
|
|
B64=$(echo -n "smoke-write" | base64)
|
|
call "fs.write" "{\"request_id\":\"__RID__\",\"capability\":\"fs.write\",\"args\":{\"path\":\"/tmp/smoke_written.txt\",\"content_b64\":\"$B64\"}}"
|
|
|
|
# 5. fs.list
|
|
call "fs.list" '{"request_id":"__RID__","capability":"fs.list","args":{"dir":"/tmp"}}'
|
|
|
|
# 6. fs.stat
|
|
call "fs.stat" '{"request_id":"__RID__","capability":"fs.stat","args":{"path":"/tmp/smoke_test_file.txt"}}'
|
|
|
|
# 7. git.clone (local repo for offline-safe test)
|
|
rm -rf /tmp/smoke_git_src /tmp/smoke_git_dst
|
|
mkdir -p /tmp/smoke_git_src && cd /tmp/smoke_git_src && git init -q -b master && git config user.email t@x && git config user.name t && echo seed > f.txt && git add . && git commit -q -m init
|
|
call "git.clone" '{"request_id":"__RID__","capability":"git.clone","args":{"url":"/tmp/smoke_git_src","dest":"/tmp/smoke_git_dst"}}'
|
|
|
|
# 8. git.commit (on cloned repo, add new file)
|
|
cd /tmp/smoke_git_dst && git config user.email t@x && git config user.name t && echo new > new.txt
|
|
call "git.commit" '{"request_id":"__RID__","capability":"git.commit","args":{"repo":"/tmp/smoke_git_dst","message":"smoke commit","files":["new.txt"]}}'
|
|
|
|
# 9. git.push: setup bare repo as remote so push succeeds end-to-end
|
|
rm -rf /tmp/smoke_git_remote.git
|
|
mkdir -p /tmp/smoke_git_remote.git && (cd /tmp/smoke_git_remote.git && git init -q --bare)
|
|
(cd /tmp/smoke_git_dst && git remote remove origin 2>/dev/null; git remote add origin /tmp/smoke_git_remote.git)
|
|
call "git.push" '{"request_id":"__RID__","capability":"git.push","args":{"repo":"/tmp/smoke_git_dst","remote":"origin","branch":"master"}}'
|
|
|
|
# 10. pkg.search (use real apt-cache since on ubuntu)
|
|
call "pkg.search" '{"request_id":"__RID__","capability":"pkg.search","args":{"query":"vim"}}'
|
|
|
|
# 11. proc.list
|
|
call "proc.list" '{"request_id":"__RID__","capability":"proc.list","args":{}}'
|
|
|
|
# 12. docker.container.list
|
|
call "docker.container.list" '{"request_id":"__RID__","capability":"docker.container.list","args":{"all":true}}'
|
|
|
|
# 13. docker.container.exec (needs a running container)
|
|
CID=$(docker ps --format '{{.Names}}' 2>/dev/null | head -n1)
|
|
if [[ -n "$CID" ]]; then
|
|
call "docker.container.exec" "{\"request_id\":\"__RID__\",\"capability\":\"docker.container.exec\",\"args\":{\"container\":\"$CID\",\"argv\":[\"ls\",\"/\"]}}"
|
|
else
|
|
echo "[skip docker.container.exec: no running containers]"
|
|
fi
|
|
|
|
# 14. docker.container.logs
|
|
if [[ -n "$CID" ]]; then
|
|
call "docker.container.logs" "{\"request_id\":\"__RID__\",\"capability\":\"docker.container.logs\",\"args\":{\"container\":\"$CID\",\"tail\":10}}"
|
|
else
|
|
echo "[skip docker.container.logs: no running containers]"
|
|
fi
|
|
|
|
echo
|
|
echo "===== SMOKE SUMMARY ====="
|
|
echo "PASS: $PASS"
|
|
echo "FAIL: $FAIL"
|
|
if [[ $FAIL -gt 0 ]]; then
|
|
echo "Failed: ${FAIL_NAMES[*]}"
|
|
fi
|
|
|
|
audit_count_after=$(sqlite3 "$AUDIT_DB" "SELECT COUNT(*) FROM audit_log;" 2>/dev/null || echo 0)
|
|
echo "[smoke] audit_log rows AFTER: $audit_count_after"
|
|
echo "[smoke] delta: $((audit_count_after - audit_count_before))"
|