Files
wevads-platform/scripts/api_sentinel-vault.php
2026-02-26 04:53:11 +01:00

152 lines
6.1 KiB
PHP
Executable File

<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
$db = new PDO('pgsql:host=localhost;dbname=adx_system','admin','admin123');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->exec("SET search_path TO admin,public");
$action = $_GET['action'] ?? 'full_audit';
switch($action) {
case 'full_audit':
case 'status':
$start = microtime(true);
// 1. Screen audit
$html_dir = '/opt/wevads-arsenal/public/';
$screens = glob($html_dir . '*.html');
$screen_count = count($screens);
$screen_issues = [];
foreach($screens as $f) {
$bn = basename($f);
$sz = filesize($f);
$c = file_get_contents($f);
$body = preg_replace('/<script[^>]*>.*?<\/script>/s', '', $c);
if(strpos($body, '<?php') !== false) {
$screen_issues[] = ['file'=>$bn, 'type'=>'RAW_PHP', 'severity'=>'critical'];
}
if($sz < 200) {
$screen_issues[] = ['file'=>$bn, 'type'=>'EMPTY', 'severity'=>'critical', 'size'=>$sz];
}
}
// 2. API audit
$apis = glob($html_dir . 'api/*.php');
$api_count = count($apis);
$api_errors = [];
$apis_tested = 0;
// Test critical APIs
$critical_apis = ['health-check','offer-engine','brain-combo','account-creator','mta','hamid-ia','send-factory',
'mirror','blacklist','cost','cloudflare','dark','financial','graph','n8n-orchestrator','newsletter',
'ptr','scout','failover','winning','healing','warmup','semi-auto-send','guardian-scan',
'arsenal','arsenal-health','brain-send','hamid-api','tracking-status'];
foreach($critical_apis as $api) {
$url = "http://127.0.0.1:5890/api/{$api}.php?action=status";
$ctx = stream_context_create(['http'=>['timeout'=>3]]);
$resp = @file_get_contents($url, false, $ctx);
$apis_tested++;
if($resp === false) {
$api_errors[] = ['api'=>$api.'.php', 'error'=>'NO_RESPONSE'];
} else {
$json = json_decode($resp, true);
if(!$json || !isset($json['status'])) {
$first50 = substr($resp, 0, 50);
if(strpos($first50, 'Fatal error') !== false || strpos($first50, 'Parse error') !== false) {
$api_errors[] = ['api'=>$api.'.php', 'error'=>'PHP_ERROR'];
}
}
}
}
// 3. Database check
$db_tables = $db->query("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='admin'")->fetchColumn();
$db_size = $db->query("SELECT pg_size_pretty(pg_database_size('adx_system'))")->fetchColumn();
// Key table counts
$key_tables = [
'o365_accounts' => $db->query("SELECT COUNT(*) FROM o365_accounts")->fetchColumn(),
'brain_winners' => $db->query("SELECT COUNT(*) FROM brain_winners")->fetchColumn(),
'send_contacts' => $db->query("SELECT COUNT(*) FROM send_contacts")->fetchColumn(),
'ia_provider_accounts' => $db->query("SELECT COUNT(*) FROM ia_provider_accounts")->fetchColumn(),
'personas' => $db->query("SELECT COUNT(*) FROM personas")->fetchColumn(),
'domains' => $db->query("SELECT COUNT(*) FROM domains")->fetchColumn(),
];
// 4. Vault check
$gold_files = count(glob('/opt/wevads/vault/*.gold'));
$checksum_ok = file_exists('/opt/wevads/vault/checksums.md5');
// 5. Server health
$uptime = trim(shell_exec('uptime -p'));
$load = trim(shell_exec("cat /proc/loadavg | cut -d' ' -f1-3"));
$disk = trim(shell_exec("df -h / | tail -1 | awk '{print $5}'"));
$mem = trim(shell_exec("free -h | grep Mem | awk '{print $3\"/\"$2}'"));
$elapsed = round((microtime(true) - $start) * 1000);
$health = (count($screen_issues) == 0 && count($api_errors) == 0) ? 'OPTIMAL' :
(count($api_errors) < 3 ? 'GOOD' : 'DEGRADED');
echo json_encode([
'status' => 'success',
'sentinel' => 'ACTIVE',
'health' => $health,
'audit_time_ms' => $elapsed,
'screens' => [
'total' => $screen_count,
'issues' => $screen_issues,
'issues_count' => count($screen_issues)
],
'apis' => [
'total' => $api_count,
'tested' => $apis_tested,
'errors' => $api_errors,
'errors_count' => count($api_errors)
],
'database' => [
'tables' => (int)$db_tables,
'size' => $db_size,
'key_counts' => $key_tables
],
'vault' => [
'gold_files' => $gold_files,
'checksums' => $checksum_ok
],
'server' => [
'uptime' => $uptime,
'load' => $load,
'disk_usage' => $disk,
'memory' => $mem
]
], JSON_PRETTY_PRINT);
break;
case 'verify_gold':
$output = shell_exec('cd /opt/wevads/vault && md5sum -c checksums.md5 2>&1 | grep -c "OK"');
$total = count(glob('/opt/wevads/vault/*.gold'));
echo json_encode(['status'=>'success','verified'=>(int)trim($output),'total'=>$total,'integrity'=>((int)trim($output)==$total)?'INTACT':'TAMPERED']);
break;
case 'sync':
shell_exec('cp /opt/wevads-arsenal/public/*.html /opt/wevads/public/ 2>/dev/null');
shell_exec('cp /opt/wevads-arsenal/public/api/*.php /opt/wevads/public/api/ 2>/dev/null');
echo json_encode(['status'=>'success','synced'=>true,'html'=>count(glob('/opt/wevads/public/*.html')),'apis'=>count(glob('/opt/wevads/public/api/*.php'))]);
break;
case 'backup_gold':
shell_exec('cd /opt/wevads/vault && for f in /opt/wevads-arsenal/public/api/*.php; do cp "$f" "api_$(basename $f).gold" 2>/dev/null; done');
shell_exec('cd /opt/wevads/vault && for f in /opt/wevads-arsenal/public/*.html; do cp "$f" "$(basename $f).gold" 2>/dev/null; done');
shell_exec('cd /opt/wevads/vault && md5sum *.gold > checksums.md5 2>/dev/null');
echo json_encode(['status'=>'success','gold_files'=>count(glob('/opt/wevads/vault/*.gold'))]);
break;
default:
echo json_encode(['status'=>'success','service'=>'Sentinel Vault Control','actions'=>['full_audit','status','verify_gold','sync','backup_gold']]);
}