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

126 lines
4.5 KiB
PHP
Executable File

<?php
/**
* SEED HEALTH CHECK - Test & Maintain Seeds
* Part of Seed Factory Pipeline
*/
require_once __DIR__ . '/seed_imap_hosts.php';
ini_set('max_execution_time', 0);
ini_set('memory_limit', '512M');
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$mode = $argv[1] ?? 'check';
$limit = (int)($argv[2] ?? 100);
echo "🌱 SEED HEALTH CHECK\n";
echo "Mode: $mode | Limit: $limit\n";
echo str_repeat("=", 60) . "\n\n";
if ($mode === 'check') {
// Test random seeds
$seeds = $pdo->query("
SELECT id, email, password, isp, imap_host, imap_port
FROM admin.brain_seeds
WHERE password IS NOT NULL AND password != ''
ORDER BY RANDOM()
LIMIT $limit
")->fetchAll(PDO::FETCH_ASSOC);
$valid = 0; $invalid = 0; $skipped = 0;
foreach ($seeds as $seed) {
$config = getImapConfig($seed['email']);
if (!$config['host']) {
echo "⏭️ {$seed['email']} - {$config['isp']}: " . ($config['note'] ?? 'No IMAP') . "\n";
$skipped++;
continue;
}
echo "Testing {$seed['email']} ({$config['isp']})... ";
$result = testIMAP($seed['email'], $seed['password'], $config['host'], $config['port']);
if ($result['success']) {
echo "\n";
$pdo->prepare("UPDATE admin.brain_seeds SET is_active = true, check_status = 'valid', isp = ?, imap_host = ?, last_checked = NOW(), check_error = NULL WHERE id = ?")
->execute([$config['isp'], $config['host'], $seed['id']]);
$valid++;
} else {
echo "" . substr($result['error'], 0, 50) . "\n";
$pdo->prepare("UPDATE admin.brain_seeds SET is_active = false, check_status = 'invalid', isp = ?, imap_host = ?, last_checked = NOW(), check_error = ? WHERE id = ?")
->execute([$config['isp'], $config['host'], $result['error'], $seed['id']]);
$invalid++;
}
usleep(300000); // 300ms delay
}
echo "\n" . str_repeat("=", 60) . "\n";
echo "✅ Valid: $valid | ❌ Invalid: $invalid | ⏭️ Skipped: $skipped\n";
} elseif ($mode === 'stats') {
// Show stats by ISP
$stats = $pdo->query("
SELECT isp,
COUNT(*) as total,
COUNT(CASE WHEN is_active THEN 1 END) as active,
COUNT(CASE WHEN check_status = 'valid' THEN 1 END) as valid
FROM admin.brain_seeds
GROUP BY isp
ORDER BY total DESC
LIMIT 30
")->fetchAll(PDO::FETCH_ASSOC);
printf("%-15s %8s %8s %8s\n", "ISP", "TOTAL", "ACTIVE", "VALID");
echo str_repeat("-", 45) . "\n";
foreach ($stats as $s) {
printf("%-15s %8d %8d %8d\n", $s['isp'] ?: 'UNKNOWN', $s['total'], $s['active'], $s['valid']);
}
} elseif ($mode === 'activate-valid') {
// Activate all seeds marked as valid
$count = $pdo->exec("UPDATE admin.brain_seeds SET is_active = true WHERE check_status = 'valid' AND is_active = false");
echo "✅ Activated $count seeds marked as valid\n";
} elseif ($mode === 'fix-isp') {
// Fix ISP detection for all seeds
$seeds = $pdo->query("SELECT id, email FROM admin.brain_seeds WHERE isp IS NULL OR isp = '' OR isp = 'OTHER' LIMIT $limit")->fetchAll(PDO::FETCH_ASSOC);
$fixed = 0;
foreach ($seeds as $seed) {
$config = getImapConfig($seed['email']);
$pdo->prepare("UPDATE admin.brain_seeds SET isp = ?, imap_host = ?, imap_port = ? WHERE id = ?")
->execute([$config['isp'], $config['host'], $config['port'] ?? 993, $seed['id']]);
$fixed++;
}
echo "✅ Fixed ISP for $fixed seeds\n";
}
// Final stats
$total = $pdo->query("SELECT COUNT(*) FROM admin.brain_seeds")->fetchColumn();
$active = $pdo->query("SELECT COUNT(*) FROM admin.brain_seeds WHERE is_active = true")->fetchColumn();
echo "\n📊 Total Seeds: $total | Active: $active\n";
function testIMAP($email, $password, $host, $port) {
$timeout = 10;
$mailbox = "{" . $host . ":" . $port . "/imap/ssl/novalidate-cert}INBOX";
imap_timeout(IMAP_OPENTIMEOUT, $timeout);
imap_timeout(IMAP_READTIMEOUT, $timeout);
$prev = error_reporting(0);
$imap = @imap_open($mailbox, $email, $password, OP_READONLY, 1);
error_reporting($prev);
if ($imap) {
imap_close($imap);
return ['success' => true];
}
$error = imap_last_error();
imap_errors();
return ['success' => false, 'error' => $error ?: 'Connection failed'];
}