126 lines
5.1 KiB
Bash
Executable File
126 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# L99 AUTONOMOUS v2 — ADAPTIVE (merge, never overwrite)
|
|
TS=$(date -Iseconds)
|
|
REPORT=/var/www/html/api/l99-autonomous-report.json
|
|
STATE=/var/www/html/api/l99-state.json
|
|
LOG=/var/log/l99-autonomous.log
|
|
PREV=/var/www/html/api/l99-autonomous-prev.json
|
|
|
|
echo "$TS === L99 AUTONOMOUS v2 ADAPTIVE ===" >> $LOG
|
|
|
|
# BACKUP previous report for diff
|
|
[ -f "$REPORT" ] && cp "$REPORT" "$PREV"
|
|
|
|
# DISCOVER
|
|
HTML=$(find /var/www/html -maxdepth 1 -name '*.html'|wc -l)
|
|
API=$(ls /var/www/html/api/*.php 2>/dev/null|wc -l)
|
|
SS=$(find /opt/weval-l99 -name '*.png' 2>/dev/null|wc -l)
|
|
VID=$(find /opt/weval-l99 -name '*.webm' -o -name '*.mp4' 2>/dev/null|wc -l)
|
|
|
|
# DETECT NEW vs PREVIOUS
|
|
NEW_PAGES=""
|
|
if [ -f "$PREV" ]; then
|
|
PREV_PAGES=$(python3 -c "import json;[print(p['path']) for p in json.load(open('$PREV')).get('tested',[])]" 2>/dev/null)
|
|
fi
|
|
|
|
# TEST pages
|
|
PASS=0;FAIL=0;TOTAL=0;TESTED="["
|
|
for page in $(find /var/www/html -maxdepth 1 -name '*.html' -exec basename {} \;|sort|head -100); do
|
|
CODE=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 3 "https://127.0.0.1/$page" -H 'Host: weval-consulting.com' 2>/dev/null)
|
|
TOTAL=$((TOTAL+1))
|
|
STATUS="F"
|
|
if [ "$CODE" = "200" ] || [ "$CODE" = "302" ]; then
|
|
PASS=$((PASS+1));STATUS="P"
|
|
else
|
|
FAIL=$((FAIL+1))
|
|
fi
|
|
[ $TOTAL -gt 1 ] && TESTED="$TESTED,"
|
|
TESTED="$TESTED{\"path\":\"/$page\",\"code\":$CODE,\"status\":\"$STATUS\"}"
|
|
# Detect new
|
|
if [ -f "$PREV" ]; then
|
|
echo "$PREV_PAGES" | grep -q "/$page" || NEW_PAGES="$NEW_PAGES /$page"
|
|
fi
|
|
done
|
|
TESTED="$TESTED]"
|
|
|
|
# APIs
|
|
APASS=0;ATOTAL=0
|
|
for api in nonreg-api.php?cat=all ecosystem-health.php wevia-deep-test.php wevia-master-autoheal.php architecture-index.json l99-state.json; do
|
|
CODE=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 5 "https://127.0.0.1/api/$api" -H 'Host: weval-consulting.com' 2>/dev/null)
|
|
ATOTAL=$((ATOTAL+1))
|
|
[ "$CODE" = "200" ] && APASS=$((APASS+1))
|
|
done
|
|
|
|
# NR + SIGMA
|
|
NR_PASS=$(python3 -c "import json;print(json.load(open('/var/www/html/api/nonreg-latest.json'))['pass'])" 2>/dev/null || echo 0)
|
|
NR_TOTAL=$(python3 -c "import json;print(json.load(open('/var/www/html/api/nonreg-latest.json'))['total'])" 2>/dev/null || echo 1)
|
|
SCORE=$(python3 -c "print(round($PASS/max(1,$TOTAL)*100,1))" 2>/dev/null)
|
|
DPMO=$(python3 -c "print(round((1-$NR_PASS/max(1,$NR_TOTAL))*1000000))" 2>/dev/null || echo 999999)
|
|
SIGMA=3;[ "$DPMO" -lt 6210 ] && SIGMA=4;[ "$DPMO" -lt 233 ] && SIGMA=5;[ "$DPMO" -lt 4 ] && SIGMA=6
|
|
|
|
# WRITE REPORT (full replace — this is the autonomous report, not state)
|
|
cat > $REPORT << ENDJSON
|
|
{"ts":"$TS","pass":$PASS,"fail":$FAIL,"total":$TOTAL,"score":$SCORE,"sigma":{"dpmo":$DPMO,"level":"$SIGMA","nr":"$NR_PASS/$NR_TOTAL"},"apis":"$APASS/$ATOTAL","html":$HTML,"apis_total":$API,"ss":$SS,"vid":$VID,"new_pages":"$(echo $NEW_PAGES|xargs)","tested":$TESTED}
|
|
ENDJSON
|
|
|
|
# ADAPTIVE STATE UPDATE — MERGE not overwrite
|
|
python3 << 'PYEND'
|
|
import json,time
|
|
fp="/var/www/html/api/l99-state.json"
|
|
d=json.load(open(fp))
|
|
# Only update autonomous-owned fields, preserve everything else
|
|
d["screenshots"]=SCREENSHOTS
|
|
d["videos"]=VIDEOS
|
|
d["pages_html"]=HTML_COUNT
|
|
d["apis_php"]=API_COUNT
|
|
d["last_update"]="TIMESTAMP"
|
|
d["timestamp"]="TIMESTAMP"
|
|
d["tests_pass"]=NR_P
|
|
d["tests_total"]=NR_T
|
|
d["sigma"]={"dpmo":DPMO_VAL,"level":"SIGMA_VAL","nr":"NR_P/NR_T"}
|
|
# MERGE autonomous block, don't overwrite custom fields
|
|
auto=d.get("autonomous",{})
|
|
auto["last_run"]="TIMESTAMP"
|
|
auto["pages"]=PAGES_PASS
|
|
auto["total"]=PAGES_TOTAL
|
|
auto["score"]=SCORE_VAL
|
|
auto["apis"]="APIS_STR"
|
|
auto["new_pages"]="NEW_STR"
|
|
d["autonomous"]=auto
|
|
# PRESERVE: consolidated, sigma history, layers, custom keys from other tools
|
|
json.dump(d,open(fp,"w"),indent=2)
|
|
PYEND
|
|
|
|
# Replace placeholders
|
|
python3 -c "
|
|
fp='/var/www/html/api/l99-state.json'
|
|
# Actually just do the merge properly
|
|
import json
|
|
d=json.load(open(fp))
|
|
d['screenshots']=$SS;d['videos']=$VID;d['pages_html']=$HTML;d['apis_php']=$API
|
|
d['last_update']='$TS';d['timestamp']='$TS'
|
|
d['tests_pass']=$NR_PASS;d['tests_total']=$NR_TOTAL
|
|
d['sigma']={'dpmo':$DPMO,'level':'$SIGMA','nr':'$NR_PASS/$NR_TOTAL'}
|
|
auto=d.get('autonomous',{})
|
|
auto['last_run']='$TS';auto['pages']=$PASS;auto['total']=$TOTAL;auto['score']=$SCORE
|
|
auto['apis']='$APASS/$ATOTAL';auto['new_pages']='$(echo $NEW_PAGES|xargs)'
|
|
d['autonomous']=auto
|
|
json.dump(d,open(fp,'w'),indent=2)
|
|
" 2>/dev/null
|
|
|
|
|
|
# SEMANTIC BRAND CHECK
|
|
SEM_PASS=0;SEM_TOTAL=3
|
|
for Q in "Qui est WEVAL" "WEVAL Consulting" "Est-ce que WEVAL existe"; do
|
|
RESP=$(curl -sk --max-time 10 -X POST https://127.0.0.1/api/weval-ia-fast.php -H "Host: weval-consulting.com" -H "Content-Type: application/json" -d "{"message":"$Q"}" 2>/dev/null)
|
|
if echo "$RESP" | grep -qi "cabinet\|casablanca\|consulting\|digitale"; then
|
|
SEM_PASS=$((SEM_PASS+1))
|
|
else
|
|
echo "$TS SEMANTIC FAIL: $Q -> $(echo $RESP|head -c 60)" >> $LOG
|
|
fi
|
|
done
|
|
echo "$TS SEMANTIC: ${SEM_PASS}/$SEM_TOTAL" >> $LOG
|
|
|
|
echo "$TS DONE: ${SCORE}% Sigma${SIGMA} ${PASS}P/${TOTAL} APIs:${APASS}/$ATOTAL New:$(echo $NEW_PAGES|wc -w)" >> $LOG
|
|
echo '{"pass":'$PASS',"total":'$TOTAL',"score":'$SCORE',"sigma":"'$SIGMA'","dpmo":'$DPMO',"apis":"'$APASS'/'$ATOTAL'","ss":'$SS',"vid":'$VID',"new":"'$(echo $NEW_PAGES|xargs)'"}'
|