-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
152 lines (131 loc) · 6.48 KB
/
main.py
File metadata and controls
152 lines (131 loc) · 6.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.responses import RedirectResponse
from starlette.middleware.sessions import SessionMiddleware
from src.utilitarios_centrais.logger import logger
from src.rotas import rt_fluig_chamados, rt_fluig_servicos, rt_fluig_datasets, rt_fluig_processos, rt_fluig_gmud
from src.rotas.webapp import rt_login, rt_chamado, rt_gmud, rt_configs
from src.web.web_auth_manager import (
iniciar_login_automatico,
parar_login_automatico,
)
from src.gmail_monitor.background_service import (
iniciar_monitoramento_gmail,
parar_monitoramento_gmail,
)
from src.historico_monitor.background_service import (
iniciar_monitoramento_historico,
parar_monitoramento_historico,
)
from src.modelo_dados.modelo_settings import ConfigEnvSetings, obter_versao_app
import uvicorn
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Gerencia o ciclo de vida da aplicação"""
# Startup - Todas as inicializações são não-bloqueantes e com tratamento de erros
# para garantir que a aplicação sempre inicie, mesmo se algum serviço falhar
# Inicia renovação automática de cookies (não-bloqueante)
try:
logger.info("Iniciando renovação automática de cookies do Fluig (intervalo: 20 minutos)...")
iniciar_login_automatico()
except Exception as e:
logger.error(f"Erro ao iniciar renovação automática de cookies: {str(e)}")
logger.warning("Aplicação continuará sem renovação automática de cookies")
# Verifica se o monitoramento de emails está habilitado
try:
gmail_enabled = getattr(ConfigEnvSetings, 'GMAIL_MONITOR_ENABLED', 'true').lower()
if gmail_enabled in ('true', '1', 'yes'):
logger.info("Iniciando monitoramento de emails do Gmail...")
iniciar_monitoramento_gmail()
else:
logger.info("Monitoramento de emails do Gmail desabilitado (GMAIL_MONITOR_ENABLED=false)")
except Exception as e:
logger.error(f"Erro ao iniciar monitoramento de emails: {str(e)}")
logger.warning("Aplicação continuará sem monitoramento de emails")
# Inicia monitoramento de histórico de chamados
try:
historico_enabled = getattr(ConfigEnvSetings, 'HISTORICO_MONITOR_ENABLED', 'true').lower()
if historico_enabled in ('true', '1', 'yes'):
logger.info("Iniciando monitoramento de histórico de chamados...")
iniciar_monitoramento_historico()
else:
logger.info("Monitoramento de histórico de chamados desabilitado (HISTORICO_MONITOR_ENABLED=false)")
except Exception as e:
logger.error(f"Erro ao iniciar monitoramento de histórico: {str(e)}")
logger.warning("Aplicação continuará sem monitoramento de histórico")
# Verifica se Google Drive está configurado (obrigatório agora)
try:
drive_sync_enabled = getattr(ConfigEnvSetings, 'DRIVE_SYNC_ENABLED', 'false').lower()
if drive_sync_enabled in ('true', '1', 'yes'):
logger.info("Sistema configurado para usar apenas Google Drive para configurações")
from src.configs.drive_config_manager import get_drive_config_manager
drive_manager = get_drive_config_manager()
if drive_manager:
logger.info("Google Drive disponível - configurações serão lidas/escritas apenas no Drive")
else:
logger.warning("Google Drive não disponível - sistema pode não funcionar corretamente")
else:
logger.warning("DRIVE_SYNC_ENABLED=false - Sistema requer Google Drive habilitado para funcionar")
except Exception as e:
logger.warning(f"Erro ao verificar Google Drive: {str(e)}")
logger.warning("Aplicação continuará sem verificação de Google Drive")
logger.info("Aplicação iniciada com sucesso - serviços de background iniciados")
yield
# Shutdown - Todas as paradas são protegidas com tratamento de erros
try:
gmail_enabled = getattr(ConfigEnvSetings, 'GMAIL_MONITOR_ENABLED', 'true').lower()
if gmail_enabled in ('true', '1', 'yes'):
logger.info("Parando monitoramento de emails...")
parar_monitoramento_gmail()
else:
logger.info("Monitoramento de emails já estava desabilitado")
except Exception as e:
logger.error(f"Erro ao parar monitoramento de emails: {str(e)}")
try:
historico_enabled = getattr(ConfigEnvSetings, 'HISTORICO_MONITOR_ENABLED', 'true').lower()
if historico_enabled in ('true', '1', 'yes'):
logger.info("Parando monitoramento de histórico de chamados...")
parar_monitoramento_historico()
else:
logger.info("Monitoramento de histórico de chamados já estava desabilitado")
except Exception as e:
logger.error(f"Erro ao parar monitoramento de histórico: {str(e)}")
try:
logger.info("Parando renovação automática de cookies...")
parar_login_automatico()
except Exception as e:
logger.error(f"Erro ao parar renovação automática de cookies: {str(e)}")
logger.info("Aplicação encerrada")
app = FastAPI(
title="API Fluig",
version=obter_versao_app(),
description="API REST para integração com Fluig",
lifespan=lifespan
)
app.add_middleware(SessionMiddleware, secret_key="CV7uYNpRr2tciYu2s4IEWaikuIAw")
app.mount("/static", StaticFiles(directory="src/site/static"), name="static")
app.include_router(rt_fluig_chamados.rt_fluig_chamados, prefix="/api/v1")
app.include_router(rt_fluig_servicos.rt_fluig_servicos, prefix="/api/v1")
app.include_router(rt_fluig_datasets.rt_fluig_datasets, prefix="/api/v1")
app.include_router(rt_fluig_processos.rt_fluig_processos)
app.include_router(rt_fluig_gmud.rt_fluig_gmud)
app.include_router(rt_login.router)
app.include_router(rt_chamado.router)
app.include_router(rt_gmud.router)
app.include_router(rt_configs.router)
@app.get("/")
async def root(request: Request):
"""Página inicial - redireciona para login do webapp"""
logger.info(f"Requisição recebida na rota raiz - IP: {request.client.host if request.client else 'N/A'}")
return RedirectResponse(url="/login")
if __name__ == "__main__":
logger.info("Iniciando servidor Uvicorn na porta 3000")
print("-"*60)
uvicorn.run(
"main:app",
host="localhost",
port=3000,
reload=True,
log_level="info"
)