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

67 lines
3.5 KiB
PHP
Executable File

<?php
header('Content-Type: application/json');
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->exec("CREATE TABLE IF NOT EXISTS admin.ip_pool (id SERIAL PRIMARY KEY, ip_address VARCHAR(50) UNIQUE, provider VARCHAR(100), server_id INTEGER, ptr_record VARCHAR(255), warmup_day INTEGER DEFAULT 0, sends_today INTEGER DEFAULT 0, sends_total INTEGER DEFAULT 0, reputation INTEGER DEFAULT 100, status VARCHAR(50) DEFAULT 'warming')");
$action = $_POST['action'] ?? $_GET['action'] ?? '';
switch ($action) {
case 'add':
$stmt = $pdo->prepare("INSERT INTO admin.ip_pool (ip_address, provider, ptr_record) VALUES (?, ?, ?) ON CONFLICT (ip_address) DO NOTHING");
$stmt->execute([$_POST['ip'], $_POST['provider'] ?? '', $_POST['ptr'] ?? '']);
echo json_encode(['success' => true]);
break;
case 'list':
$ips = $pdo->query("SELECT * FROM admin.ip_pool ORDER BY warmup_day DESC, sends_today ASC")->fetchAll(PDO::FETCH_ASSOC);
echo json_encode(['ips' => $ips]);
break;
case 'get_available':
$minDay = intval($_POST['min_warmup_day'] ?? 30);
$ip = $pdo->query("SELECT * FROM admin.ip_pool WHERE status = 'active' AND warmup_day >= $minDay ORDER BY sends_today ASC LIMIT 1")->fetch(PDO::FETCH_ASSOC);
if ($ip) {
$pdo->exec("UPDATE admin.ip_pool SET sends_today = sends_today + 1, sends_total = sends_total + 1 WHERE id = {$ip['id']}");
echo json_encode(['success' => true, 'ip' => $ip['ip_address']]);
} else {
echo json_encode(['success' => false, 'error' => 'No available IPs']);
}
break;
case 'increment_warmup':
$pdo->exec("UPDATE admin.ip_pool SET warmup_day = warmup_day + 1, sends_today = 0 WHERE status IN ('warming', 'active')");
$pdo->exec("UPDATE admin.ip_pool SET status = 'active' WHERE warmup_day >= 30 AND status = 'warming'");
echo json_encode(['success' => true]);
break;
case 'check_blacklist':
$ip = $_POST['ip'];
$rbls = ['zen.spamhaus.org', 'bl.spamcop.net', 'b.barracudacentral.org'];
$reversed = implode('.', array_reverse(explode('.', $ip)));
$listed = [];
foreach ($rbls as $rbl) {
$lookup = $reversed . '.' . $rbl;
if (gethostbyname($lookup) != $lookup) $listed[] = $rbl;
}
$status = empty($listed) ? 'clean' : 'blacklisted';
$pdo->prepare("UPDATE admin.ip_pool SET status = ? WHERE ip_address = ?")->execute([$status == 'blacklisted' ? 'blacklisted' : 'active', $ip]);
echo json_encode(['ip' => $ip, 'listed' => $listed, 'status' => $status]);
break;
case 'stats':
echo json_encode([
'total' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool")->fetchColumn(),
'warming' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool WHERE status = 'warming'")->fetchColumn(),
'active' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool WHERE status = 'active'")->fetchColumn(),
'blacklisted' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool WHERE status = 'blacklisted'")->fetchColumn(),
'by_provider' => $pdo->query("SELECT provider, COUNT(*) as count FROM admin.ip_pool GROUP BY provider")->fetchAll(PDO::FETCH_ASSOC)
]);
break;
default:
echo json_encode(['actions' => ['add','list','get_available','increment_warmup','check_blacklist','stats']]);
}