126 lines
4.5 KiB
PHP
Executable File
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'];
|
|
}
|