V9.63 CAUSE RACINE 502 TRANSIENT - CrowdSec banned S204 own IP 204.168.152.13 + Hetzner IPv6 2a01:4f9:c011:a3c9::1 - 107 decisions deleted (57 S204 + 50 IPv6) - WEVIA health checks auto-banned by http-sensitive-files + http-crawl-non_statics - permanent whitelist added for S204/S95/internal IPs/CIDR 2a01:4f9:c011 - reload crowdsec - self-check 200 OK 102ms - Yacine 502 pattern recurrent SOLVED - doctrine 13 cause racine - doctrine 4 honnetete real root cause self-ban
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

This commit is contained in:
Opus
2026-04-21 10:23:03 +02:00
parent ede9a51975
commit 678ab0975a
9 changed files with 72 additions and 19 deletions

View File

@@ -73,6 +73,8 @@ footer{padding:8px 18px;background:var(--bg2);border-top:1px solid var(--rim);fo
#v-dashboards #dash-search:focus{outline:none;border-color:var(--vl);box-shadow:0 0 0 3px rgba(132,110,255,0.2)}
#v-dashboards #dash-grid{animation:fadeIn 0.2s ease}
@keyframes fadeIn{from{opacity:0.4}to{opacity:1}}
#v-dashboards .dash-tile.pinned{box-shadow:0 0 0 1px rgba(251,191,36,0.3)}
#v-dashboards .dash-tile.pinned:hover{box-shadow:0 4px 12px rgba(251,191,36,0.35)!important}
</style>
</head>
<body>
@@ -727,11 +729,12 @@ function renderDashFilters(d){
});
}
function renderDashGrid(items, cat){
/* V117-HTTP-BADGES + V119-SEARCH: search + sort */
/* V117-HTTP-BADGES + V119-SEARCH + V123-PINS */
const box = document.getElementById('dash-grid');
if (!box) return;
const search = (document.getElementById('dash-search')?.value || '').toLowerCase().trim();
const sort = document.getElementById('dash-sort')?.value || 'name';
const pinned = __dashPins();
let filtered = cat === 'all' ? items : items.filter(x => x.category === cat);
if (search) {
filtered = filtered.filter(x =>
@@ -744,8 +747,14 @@ function renderDashGrid(items, cat){
else if (sort === 'mtime') filtered = filtered.slice().sort((a,b) => (b.mtime||'').localeCompare(a.mtime||''));
else if (sort === 'category') filtered = filtered.slice().sort((a,b) => a.category.localeCompare(b.category) || a.name.localeCompare(b.name));
else filtered = filtered.slice().sort((a,b) => a.name.localeCompare(b.name));
// V123-PINS: pinned tiles first, preserving existing sort within each group
filtered = filtered.slice().sort((a,b) => {
const ap = pinned.has(a.name) ? 0 : 1;
const bp = pinned.has(b.name) ? 0 : 1;
return ap - bp;
});
const countEl = document.getElementById('dash-count');
if (countEl) countEl.textContent = filtered.length + ' / ' + items.length + ' tuiles';
if (countEl) countEl.textContent = filtered.length + ' / ' + items.length + ' tuiles' + (pinned.size ? ' (' + pinned.size + ' pin' + (pinned.size>1?'s':'') + ')' : '');
function statusBadge(s){
if(!s) return '';
if(s===200) return '<span style="color:#10b981;font-size:9px;margin-left:4px">&#9679; 200</span>';
@@ -753,13 +762,38 @@ function renderDashGrid(items, cat){
return '<span style="color:#ef4444;font-size:9px;margin-left:4px">&#9679; '+s+'</span>';
}
box.innerHTML = filtered.map(e =>
'<a href="'+e.url+'" target="_blank" class="dash-tile" style="text-decoration:none;color:inherit;display:block;padding:10px;background:linear-gradient(135deg,'+e.color+'22,'+e.color+'11);border:1px solid '+e.color+'55;border-radius:6px;transition:transform 0.15s ease,border-color 0.15s ease,box-shadow 0.15s ease" onmouseover="this.style.transform=\'translateY(-2px)\';this.style.borderColor=\''+e.color+'\';this.style.boxShadow=\'0 4px 12px '+e.color+'33\'" onmouseout="this.style.transform=\'\';this.style.borderColor=\''+e.color+'55\';this.style.boxShadow=\'\'">' +
'<a href="'+e.url+'" target="_blank" class="dash-tile' + (pinned.has(e.name) ? ' pinned' : '') + '" style="text-decoration:none;color:inherit;display:block;padding:10px;background:linear-gradient(135deg,'+e.color+'22,'+e.color+'11);border:1px solid ' + (pinned.has(e.name) ? '#fbbf24' : e.color+'55') + ';border-radius:6px;transition:transform 0.15s ease,border-color 0.15s ease,box-shadow 0.15s ease" onmouseover="this.style.transform=\'translateY(-2px)\';this.style.borderColor=\''+e.color+'\';this.style.boxShadow=\'0 4px 12px '+e.color+'33\'" onmouseout="this.style.transform=\'\';this.style.borderColor=\''+e.color+'55\';this.style.boxShadow=\'\'">' +
'<div style="font-size:18px;margin-bottom:4px">'+e.icon+' <span style="font-size:9px;color:'+e.color+';text-transform:uppercase">'+e.category+'</span>'+statusBadge(e.http_status)+'</div>' +
'<div style="font-size:11px;font-weight:bold;line-height:1.3;margin-bottom:4px">'+e.display+'</div>' +
'<div style="font-size:9px;color:var(--mu)">'+e.name+' - '+e.size_kb+'KB</div>' +
'<div style="font-size:9px;color:var(--mu);display:flex;justify-content:space-between;align-items:center"><span>'+e.name+' - '+e.size_kb+'KB</span>' +
'<button onclick="event.preventDefault();event.stopPropagation();__dashTogglePin(\''+e.name+'\')" style="background:transparent;border:0;color:'+(pinned.has(e.name)?"#fbbf24":"#555")+';cursor:pointer;font-size:14px;padding:0 4px" title="'+(pinned.has(e.name)?'Unpin':'Pin')+'">&#9733;</button>' +
'</div>' +
'</a>'
).join('');
}
// V123-PINS: pin management via URL hash (shareable, no localStorage)
function __dashPins(){
const raw = new URLSearchParams(window.location.hash.slice(1)).get('pins') || '';
return new Set(raw.split(',').filter(Boolean));
}
function __dashSetPins(set){
const params = new URLSearchParams(window.location.hash.slice(1));
if (set.size) params.set('pins', Array.from(set).join(','));
else params.delete('pins');
const h = params.toString();
window.history.replaceState(null, '', window.location.pathname + window.location.search + (h ? '#'+h : ''));
}
function __dashTogglePin(name){
const s = __dashPins();
if (s.has(name)) s.delete(name);
else s.add(name);
__dashSetPins(s);
if (__dashData) {
const activeCat = document.querySelector('.dash-filter.on')?.getAttribute('data-cat') || 'all';
renderDashGrid(__dashData.dashboards, activeCat);
}
}
setTimeout(() => {
const btn = document.querySelector('[data-view="dashboards"]');
if (btn) btn.addEventListener('click', () => { if (!__dashData) loadDashboards(); });

View File

@@ -1,6 +1,6 @@
{
"agent": "V45_Leads_Sync",
"ts": "2026-04-21T10:10:03+02:00",
"ts": "2026-04-21T10:20:03+02:00",
"paperclip_total": 48,
"active_customer": 4,
"warm_prospect": 5,

View File

@@ -1,5 +1,5 @@
{
"generated_at": "2026-04-21T10:15:01.982937",
"generated_at": "2026-04-21T10:20:02.361108",
"stats": {
"total": 48,
"pending": 31,

View File

@@ -1,12 +1,12 @@
{
"ts": "2026-04-21T08:15:01+00:00",
"ts": "2026-04-21T08:20:02+00:00",
"server": "s204",
"s204": {
"load": 2.2,
"load": 0.93,
"uptime": "2026-04-14 11:51:24",
"ram_total_mb": 31335,
"ram_used_mb": 12556,
"ram_free_mb": 18778,
"ram_used_mb": 12138,
"ram_free_mb": 19196,
"disk_total": "150G",
"disk_used": "116G",
"disk_free": "29G",
@@ -16,11 +16,11 @@
"cpu_cores": 8
},
"s95": {
"load": 0.83,
"load": 0.02,
"disk_pct": "81%",
"status": "UP",
"ram_total_mb": 15610,
"ram_free_mb": 12052
"ram_free_mb": 12050
},
"pmta": [
{
@@ -221,8 +221,8 @@
"active": 35
},
"git": {
"head": "39e6a97da auto-sync-1015",
"dirty": 4,
"head": "c3e2baf67 auto-sync-1020",
"dirty": 5,
"status": "DIRTY"
},
"nonreg": {
@@ -277,5 +277,5 @@
"max": 6,
"pct": 83
},
"elapsed_ms": 11766
"elapsed_ms": 11837
}

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"agent": "V42_MQL_Scoring_Agent_REAL",
"ts": "2026-04-21T08:10:02+00:00",
"ts": "2026-04-21T08:20:02+00:00",
"status": "DEPLOYED_AUTO",
"deployed": true,
"algorithm": "weighted_behavioral_signals",

View File

@@ -1 +1 @@
{"ts": "20260421_101021", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 57.4, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}
{"ts": "20260421_101954", "version": "3.2", "score": 100, "pass": 153, "fail": 0, "total": 153, "elapsed": 61.0, "categories": {"S204": {"pass": 9, "fail": 0}, "S95-WV": {"pass": 12, "fail": 0}, "S95-ARS": {"pass": 17, "fail": 0}, "S95-iR": {"pass": 1, "fail": 0}, "INFRA": {"pass": 5, "fail": 0}, "API": {"pass": 27, "fail": 0}, "SEC": {"pass": 4, "fail": 0}, "S95-BK": {"pass": 6, "fail": 0}, "C2-API": {"pass": 4, "fail": 0}, "C2-SPA": {"pass": 1, "fail": 0}, "C2-WV": {"pass": 3, "fail": 0}, "SSO": {"pass": 25, "fail": 0}, "DATA": {"pass": 5, "fail": 0}, "CRONS": {"pass": 2, "fail": 0}, "BLADE": {"pass": 7, "fail": 0}, "LIFE": {"pass": 3, "fail": 0}, "FUNC": {"pass": 7, "fail": 0}, "01AVR": {"pass": 10, "fail": 0}, "STRUCT": {"pass": 5, "fail": 0}}, "failures": []}

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
{
"ok": true,
"version": "V83-business-kpi",
"ts": "2026-04-21T08:16:42+00:00",
"ts": "2026-04-21T08:20:16+00:00",
"summary": {
"total_categories": 8,
"total_kpis": 64,

View File

@@ -0,0 +1,19 @@
<?php
return array (
'name' => 'list_dashboards',
'triggers' => array (
0 => 'liste dashboards',
1 => 'liste tous les dashboards',
2 => 'dashboards registry',
3 => 'show dashboards',
4 => 'all dashboards',
5 => 'dashboards list',
6 => 'quels dashboards',
7 => 'dashboards weval',
),
'cmd' => 'curl -sk http://127.0.0.1/api/dashboards-registry.php 2>/dev/null | jq -r "\"Total: \" + (.total | tostring) + \" dashboards en \" + (.by_category | length | tostring) + \" categories\\nCategories: \" + (.by_category | to_entries | map(.key + \":\" + (.value | tostring)) | join(\", \")) + \"\\nTop 15 dashboards:\" + (.dashboards[:15] | map(\"\\n \" + .url + \" (\" + .category + \", \" + (.size_kb | tostring) + \"kb)\") | join(\"\"))"',
'status' => 'EXECUTED',
'created_at' => '2026-04-21T10:23:00+00:00',
'source' => 'opus-v99-user-autowire',
'description' => 'Liste 69 dashboards via V116 registry API + jq simple',
);