152 lines
6.1 KiB
PHP
Executable File
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']]);
|
|
}
|