false, 'message' => 'Error fatal: ' . $exception->getMessage(), 'file' => $exception->getFile(), 'line' => $exception->getLine() ]); exit; }); chdir(__DIR__); require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/src/IpSearchService.php'; require_once __DIR__ . '/src/PingService.php'; require_once __DIR__ . '/src/ApiHandlers.php'; use Ubnt\UcrmPluginSdk\Service\PluginLogManager; use Ubnt\UcrmPluginSdk\Service\PluginConfigManager; use SiipAvailableIps\IpSearchService; // Get UCRM log manager $log = PluginLogManager::create(); // Log TODAS las peticiones $log->appendLog('=== NUEVA PETICIÓN ===' ); $log->appendLog('Método: ' . $_SERVER['REQUEST_METHOD']); $log->appendLog('POST data: ' . json_encode($_POST)); $log->appendLog('GET data: ' . json_encode($_GET)); $log->appendLog('Content-Type: ' . ($_SERVER['CONTENT_TYPE'] ?? 'no definido')); $log->appendLog('User Agent: ' . ($_SERVER['HTTP_USER_AGENT'] ?? 'no definido')); // ============================================================================ // API REST - Manejar peticiones JSON (Postman, Webhooks, etc.) // ============================================================================ $contentType = $_SERVER['CONTENT_TYPE'] ?? ''; $isJsonRequest = stripos($contentType, 'application/json') !== false; if ($isJsonRequest && $_SERVER['REQUEST_METHOD'] === 'POST') { $log->appendLog('>>> Petición API JSON detectada'); $rawInput = file_get_contents('php://input'); $log->appendLog('Raw input length: ' . strlen($rawInput) . ' bytes'); $jsonData = json_decode($rawInput, true); if (json_last_error() !== JSON_ERROR_NONE) { $log->appendLog('ERROR: JSON inválido - ' . json_last_error_msg()); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'error' => 'Invalid JSON', 'message' => json_last_error_msg() ]); exit; } $log->appendLog('JSON parseado correctamente: ' . json_encode($jsonData)); // Procesar petición API handleApiRequest($jsonData, $log); exit; } // ============================================================================ // FRONTEND HTML - Manejar peticiones AJAX del formulario // ============================================================================ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'search') { $log->appendLog('>>> Entrando al handler de búsqueda AJAX'); try { // Obtener configuración del plugin desde data/config.json $configManager = PluginConfigManager::create(); $config = $configManager->loadConfig(); $log->appendLog('Configuración cargada: ' . json_encode([ 'ipserver' => $config['ipserver'] ?? 'NO CONFIGURADO', 'hasUnmsToken' => !empty($config['unmsApiToken']), 'hasApiToken' => !empty($config['apitoken']) ])); // Validar que exista la configuración necesaria if (empty($config['ipserver'])) { $log->appendLog('ERROR: No se ha configurado ipserver'); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'message' => 'El plugin no está configurado correctamente. Falta la dirección del servidor.' ]); exit; } if (empty($config['unmsApiToken'])) { $log->appendLog('ERROR: No se ha configurado unmsApiToken'); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'message' => 'El plugin no está configurado correctamente. Falta el token de API de UNMS.' ]); exit; } $segmento = $_POST['segment'] ?? ''; $verifyPing = isset($_POST['verify_ping']) && $_POST['verify_ping'] === 'true'; if ($verifyPing) { $log->appendLog("Buscando IPs en segmento: $segmento (con verificación por ping)"); } else { $log->appendLog("Buscando IPs en segmento: $segmento (sin verificación por ping)"); } // URL de la API de UISP - Usar HTTPS $apiUrl = "https://{$config['ipserver']}/nms/api/v2.1/devices/ips?suspended=false&management=true&includeObsolete=true"; $apiToken = $config['unmsApiToken']; $log->appendLog("URL de API: $apiUrl"); // Crear instancia del servicio y buscar IPs $ipService = new IpSearchService($apiUrl, $apiToken, $log); $resultado = $ipService->buscarIpsDisponibles($segmento, $verifyPing); $log->appendLog('Resultado de búsqueda: ' . json_encode([ 'success' => $resultado['success'], 'ipsDisponibles' => count($resultado['data'] ?? []), 'ipsEnUso' => count($resultado['used'] ?? []) ])); header('Content-Type: application/json'); echo json_encode($resultado); } catch (Exception $e) { $log->appendLog('EXCEPCIÓN en búsqueda de IPs: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString()); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'message' => 'Error al procesar la solicitud: ' . $e->getMessage(), 'error_file' => $e->getFile(), 'error_line' => $e->getLine() ]); } catch (Error $e) { $log->appendLog('ERROR FATAL en búsqueda de IPs: ' . $e->getMessage() . ' | Trace: ' . $e->getTraceAsString()); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'message' => 'Error fatal: ' . $e->getMessage(), 'error_file' => $e->getFile(), 'error_line' => $e->getLine() ]); } $log->appendLog('<<< Finalizando handler de búsqueda AJAX'); exit; } else if ($_SERVER['REQUEST_METHOD'] === 'POST') { $log->appendLog('Petición POST recibida pero sin action=search o action no válida'); $log->appendLog('Action recibida: ' . ($_POST['action'] ?? 'NO DEFINIDA')); } // Log de acceso público $log->appendLog('Acceso a la interfaz pública de búsqueda de IPs'); // Cargar configuración para verificar si ping está habilitado $configManager = PluginConfigManager::create(); $config = $configManager->loadConfig(); $pingEnabled = isset($config['enablePingVerification']) && $config['enablePingVerification'] === '1'; ?> Buscador de IPs Disponibles - SIIP

Buscador de IPs Disponibles

Sistema de gestión de direcciones IP para UISP

172.16.

Consultando IPs disponibles...

0
IPs Disponibles
0
IPs en Uso
-
Segmento
# Dirección IP Tipo de IP Acción