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