<?php
/**
 * Script pentru colectarea log-urilor PowerDNS filtrate pe domeniu
 * 
 * Acest script trebuie copiat pe fiecare nameserver la:
 * /var/www/html/query-logs.php (sau calea specificată în web_port)
 * 
 * Asigură-te că:
 * 1. PowerDNS log-urile sunt în /var/log/pdns.log (sau ajustează calea)
 * 2. Script-ul are permisiuni de citire pentru log-uri
 * 3. API key-ul este setat corect în baza de date
 */

header('Content-Type: application/json');

// Verifică API Key
$apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
$expectedApiKey = '453RDhywB0YplB3v0OUAaJhbQUlD4scW'; // Înlocuiește cu API key-ul real din baza de date

if ($apiKey !== $expectedApiKey) {
    http_response_code(401);
    echo json_encode(['success' => false, 'error' => 'Unauthorized']);
    exit;
}

// Parametri
$domain = $_GET['q'] ?? '';
$maxLines = min((int)($_GET['max'] ?? 1000), 5000); // Limită maximă 5000

if (empty($domain)) {
    http_response_code(400);
    echo json_encode(['success' => false, 'error' => 'Domain parameter (q) is required']);
    exit;
}

// Normalizează domeniul
$domain = rtrim($domain, '.');

// Calea către log-urile PowerDNS (în syslog)
$logFile = '/var/log/syslog';

if (!file_exists($logFile)) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => 'Log file not found']);
    exit;
}

try {
    // Folosește grep pentru a filtra log-urile ÎNAINTE de a le citi în PHP
    // Acest lucru este mult mai eficient decât să citim toate log-urile
    
    // Escape domeniul pentru folosire în regex (nu în shell)
    $regexDomain = preg_quote($domain, '/');
    
    // Caută domeniul și subdomeniile sale în log-uri din syslog
    // Folosim grep pentru a găsi log-urile PowerDNS care conțin 'wants' și domeniul nostru
    // Pattern: wants 'domeniu|TYPE' sau wants 'subdomeniu.domeniu|TYPE'
    $command = "grep 'pdns.*wants' {$logFile} | grep -iE \"wants '([a-zA-Z0-9*._-]*\\.)?{$regexDomain}\\|\" | tail -n {$maxLines}";
    
    exec($command, $output, $returnCode);
    
    if ($returnCode !== 0 && $returnCode !== 1) {
        // returnCode 1 înseamnă "no matches found", care este OK
        // orice altceva este o eroare
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => 'Failed to read logs']);
        exit;
    }
    
    $logs = $output;
    $linesReturned = count($logs);
    
    echo json_encode([
        'success' => true,
        'domain' => $domain,
        'lines_returned' => $linesReturned,
        'max_requested' => $maxLines,
        'logs' => $logs
    ]);
    
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
