/* * Copyright (c) 2026 RAVAPI Soluções. Todos os direitos reservados. * www.ravapi.com */ using System; using System.ServiceProcess; using System.Timers; namespace TechDeskAgent { public class AgentService : ServiceBase { private Timer _timer; private AgentConfig _config; private DataCollector _collector; private ApiClient _api; public AgentService() { ServiceName = "TechDeskAgent"; CanStop = true; CanPauseAndContinue = false; AutoLog = true; } // ── Ciclo de vida do serviço Windows ──────────────────────────────── protected override void OnStart(string[] args) { Logger.Info("TechDeskAgent iniciando..."); Inicializar(); } protected override void OnStop() { Logger.Info("TechDeskAgent encerrando..."); _timer?.Stop(); _timer?.Dispose(); } // ── Modo console (debug) ───────────────────────────────────────────── public void StartConsole() => Inicializar(); public void StopConsole() { _timer?.Stop(); _timer?.Dispose(); } // ── Inicialização ──────────────────────────────────────────────────── private void Inicializar() { try { _config = AgentConfig.Load(); _collector = new DataCollector(); _api = new ApiClient(_config); // Registra o terminal na primeira execução (obtém token) if (string.IsNullOrEmpty(_config.Token)) { Logger.Info("Terminal não registrado. Enviando registro inicial..."); var token = _api.Registrar(_collector.ColetarIdentidade()); if (!string.IsNullOrEmpty(token)) { _config.Token = token; _config.Save(); Logger.Info("Terminal registrado com sucesso. Token salvo."); } else { Logger.Error("Falha no registro. Tentará novamente no próximo ciclo."); } } // Coleta imediata na inicialização ExecutarCiclo(null, null); // Timer: a cada 15 minutos int intervaloMs = _config.IntervaloMinutos * 60 * 1000; _timer = new Timer(intervaloMs); _timer.Elapsed += ExecutarCiclo; _timer.AutoReset = true; _timer.Start(); Logger.Info($"Agente ativo. Coletando a cada {_config.IntervaloMinutos} minutos."); } catch (Exception ex) { Logger.Error($"Erro na inicialização: {ex.Message}"); } } // ── Ciclo principal de coleta ───────────────────────────────────────── private void ExecutarCiclo(object sender, ElapsedEventArgs e) { try { Logger.Info("Iniciando coleta de dados..."); var payload = new TelemetriaPayload { Token = _config.Token, Timestamp = DateTime.UtcNow, Hardware = _collector.ColetarHardware(), Softwares = _collector.ColetarSoftwares(), Processos = _collector.ColetarProcessos(), Eventos = _collector.ColetarEventos(), RedeArp = _collector.ColetarRedeArp() }; bool ok = _api.EnviarHeartbeat(payload); Logger.Info(ok ? "Heartbeat enviado com sucesso." : "Falha ao enviar heartbeat."); } catch (Exception ex) { Logger.Error($"Erro no ciclo de coleta: {ex.Message}"); } } } }