diff --git a/logs/errors.log b/logs/errors.log index d42516f..f14256f 100644 --- a/logs/errors.log +++ b/logs/errors.log @@ -357,3 +357,35 @@ [2026-01-18 03:26:07] [INFO] [Monitor] Buscando app fidelizacion en API central... [2026-01-18 03:26:07] [INFO] [Monitor] App fidelizacion encontrada en cloud (ID: 4) [2026-01-18 03:26:07] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:27:14] [INFO] [Sistema] Iniciando SIAX Agent +[2026-01-18 03:27:14] [INFO] [Sistema] Escaneando servicios systemd existentes... +[2026-01-18 03:27:14] [INFO] [Discovery] Escaneando servicios systemd existentes... +[2026-01-18 03:27:14] [INFO] [Discovery] ✅ Descubiertos 0 servicios +[2026-01-18 03:27:14] [INFO] [Config] Usando archivo de configuración: config/monitored_apps.json +[2026-01-18 03:27:14] [INFO] [Config] ✅ Configuración cargada: 2 apps desde config/monitored_apps.json +[2026-01-18 03:27:14] [INFO] [Sistema] Servidor detectado: siax-intel +[2026-01-18 03:27:14] [INFO] [Sistema] Iniciando servidor unificado en puerto 8080 +[2026-01-18 03:27:14] [INFO] [Sistema] Sistema SIAX completamente operativo en puerto 8080 +[2026-01-18 03:27:15] [INFO] [Monitor] Vigilando procesos para siax-intel [SIAX-Agent/0.1.0 (linux/x86_64; Rust-Monitor)] +[2026-01-18 03:27:15] [INFO] [Monitor] Buscando app app_tareas en API central... +[2026-01-18 03:27:15] [INFO] [Monitor] App app_tareas encontrada en cloud (ID: 3) +[2026-01-18 03:27:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:27:15] [INFO] [Monitor] Buscando app fidelizacion en API central... +[2026-01-18 03:27:15] [INFO] [Monitor] App fidelizacion encontrada en cloud (ID: 4) +[2026-01-18 03:27:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:28:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando... +[2026-01-18 03:28:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:28:15] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando... +[2026-01-18 03:28:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:29:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando... +[2026-01-18 03:29:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:29:15] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando... +[2026-01-18 03:29:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:30:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando... +[2026-01-18 03:30:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:30:15] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando... +[2026-01-18 03:30:15] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:31:15] [INFO] [Monitor] App app_tareas ya existe (ID: 3), actualizando... +[2026-01-18 03:31:15] [ERROR] [Monitor] Error sincronizando app_tareas | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} +[2026-01-18 03:31:16] [INFO] [Monitor] App fidelizacion ya existe (ID: 4), actualizando... +[2026-01-18 03:31:16] [ERROR] [Monitor] Error sincronizando fidelizacion | HTTP 500 Internal Server Error: {"success":false,"message":"Error al actualizar el estado","error":"Table 'webControl.app_service_history' doesn't exist"} diff --git a/src/api/handlers.rs b/src/api/handlers.rs index 830653e..9a820d7 100644 --- a/src/api/handlers.rs +++ b/src/api/handlers.rs @@ -222,3 +222,19 @@ pub async fn health_handler( version: env!("CARGO_PKG_VERSION").to_string(), }))) } + +/// Endpoint para ver las apps monitoreadas desde el JSON +pub async fn get_monitored_apps_handler() -> Result, StatusCode> { + use crate::config::get_config_manager; + + let config_manager = get_config_manager(); + let apps = config_manager.get_apps(); + + let response = serde_json::json!({ + "success": true, + "count": apps.len(), + "apps": apps + }); + + Ok(Json(response)) +} diff --git a/src/discovery.rs b/src/discovery.rs index 7024b40..d70cd65 100644 --- a/src/discovery.rs +++ b/src/discovery.rs @@ -10,28 +10,40 @@ const SERVICE_PREFIX: &str = "siax-app-"; /// Descubre servicios systemd existentes con prefijo siax-app-* pub fn discover_services() -> Vec { let logger = get_logger(); - logger.info("Discovery", "Escaneando servicios systemd existentes..."); + logger.info("Discovery", &format!("🔍 Escaneando servicios systemd en: {}", SYSTEMD_DIR)); + println!("🔍 Discovery: Buscando servicios en {}", SYSTEMD_DIR); let mut services = Vec::new(); // Leer directorio de systemd let entries = match fs::read_dir(SYSTEMD_DIR) { - Ok(entries) => entries, + Ok(entries) => { + logger.info("Discovery", &format!("✅ Directorio {} accesible", SYSTEMD_DIR)); + println!("✅ Discovery: Directorio {} accesible", SYSTEMD_DIR); + entries + }, Err(e) => { - logger.error("Discovery", "No se pudo leer directorio systemd", Some(&e.to_string())); + logger.error("Discovery", &format!("❌ No se pudo leer directorio {}", SYSTEMD_DIR), Some(&e.to_string())); + println!("❌ Discovery: ERROR - No se pudo leer {}: {}", SYSTEMD_DIR, e); return services; } }; // Buscar archivos siax-app-*.service + let mut total_files = 0; + let mut siax_files = 0; + for entry in entries.flatten() { + total_files += 1; let path = entry.path(); if let Some(filename) = path.file_name() { let filename_str = filename.to_string_lossy(); // Verificar que sea un archivo .service con nuestro prefijo if filename_str.starts_with(SERVICE_PREFIX) && filename_str.ends_with(".service") { - logger.info("Discovery", &format!("Encontrado: {}", filename_str)); + siax_files += 1; + logger.info("Discovery", &format!("✅ Encontrado: {}", filename_str)); + println!("✅ Discovery: Servicio detectado: {}", filename_str); // Extraer nombre de la app let app_name = extract_app_name(&filename_str); @@ -39,12 +51,19 @@ pub fn discover_services() -> Vec { // Leer configuración del servicio if let Some(service) = parse_service_file(&path, &app_name) { services.push(service); + } else { + logger.warning("Discovery", &format!("⚠️ No se pudo parsear: {}", filename_str), None); + println!("⚠️ Discovery: No se pudo parsear {}", filename_str); } } } } - logger.info("Discovery", &format!("✅ Descubiertos {} servicios", services.len())); + logger.info("Discovery", &format!("📊 Escaneados {} archivos, {} con prefijo '{}', {} parseados exitosamente", + total_files, siax_files, SERVICE_PREFIX, services.len())); + println!("📊 Discovery: Archivos totales: {}, siax-app-*: {}, parseados: {}", + total_files, siax_files, services.len()); + services } @@ -201,7 +220,8 @@ pub fn sync_discovered_services(services: Vec) { let logger = get_logger(); let config_manager = get_config_manager(); - logger.info("Discovery", "Sincronizando servicios descubiertos con configuración..."); + logger.info("Discovery", &format!("🔄 Sincronizando {} servicios descubiertos...", services.len())); + println!("🔄 Discovery: Sincronizando {} servicios con monitored_apps.json", services.len()); let mut added_count = 0; let mut skipped_count = 0; @@ -218,6 +238,7 @@ pub fn sync_discovered_services(services: Vec) { if already_exists { logger.info("Discovery", &format!("⏭️ {} ya existe en configuración", service.app_name)); + println!("⏭️ Discovery: {} ya existe, omitiendo", service.app_name); skipped_count += 1; continue; } @@ -247,15 +268,18 @@ pub fn sync_discovered_services(services: Vec) { match config_manager.add_app_full(app) { Ok(_) => { logger.info("Discovery", &format!("✅ {} agregado exitosamente", service.app_name)); + println!("✅ Discovery: {} agregado a monitored_apps.json", service.app_name); added_count += 1; } Err(e) => { logger.error("Discovery", &format!("Error agregando {}", service.app_name), Some(&e)); + println!("❌ Discovery: Error agregando {}: {}", service.app_name, e); } } } logger.info("Discovery", &format!("📊 Resumen: {} agregadas, {} ya existían", added_count, skipped_count)); + println!("📊 Discovery: Resumen final - {} apps nuevas, {} existentes", added_count, skipped_count); } /// Intenta detectar el puerto desde el nombre de la app diff --git a/src/main.rs b/src/main.rs index 533072f..c4554a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,6 +67,7 @@ async fn main() { // Router para la API REST let api_router = Router::new() .route("/api/health", get(api::health_handler)) + .route("/api/monitored", get(api::get_monitored_apps_handler)) .route("/api/apps", get(api::list_apps_handler).post(api::register_app_handler)) .route("/api/apps/:name", delete(api::unregister_app_handler)) .route("/api/apps/:name/status", get(api::get_app_status_handler))