File size: 6,002 Bytes
219c926
89417a8
 
 
30278b0
89417a8
2011e87
12cb4be
 
 
 
30278b0
c0cf358
f7095e2
12cb4be
 
 
89417a8
12cb4be
f7095e2
30278b0
111f19a
 
 
 
71f867b
8fd0fe8
12cb4be
95da284
 
 
30278b0
f7095e2
12cb4be
 
 
cea1dd8
30278b0
12cb4be
00d1318
12cb4be
dc99960
12cb4be
 
 
 
89417a8
12cb4be
00d1318
02970bf
30278b0
12cb4be
111f19a
 
 
 
 
 
 
89417a8
111f19a
 
02970bf
71f867b
111f19a
2b6d34d
 
 
 
 
 
30278b0
2b6d34d
 
c0cf358
219c926
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9de3c9a
89417a8
00d1318
2690756
89417a8
02970bf
2690756
89417a8
c0cf358
 
89417a8
 
 
ddbe067
c0cf358
 
 
ddbe067
24916b1
 
89417a8
24916b1
89417a8
 
 
 
 
 
02970bf
 
89417a8
 
 
 
02970bf
 
89417a8
02970bf
c0cf358
421e233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
153
154
155
156
157
158
159
160
161
162
163
import pytz
import globales
import conexion_firebase
from datetime import datetime 

servidor = globales.servidor

def obtenUltimoTimestamp():
    """
    Obtiene el último timestamp de renovación guardado.
    """
    resultado = conexion_firebase.obtenDato('nowme', servidor, 'timestamp')
    
    return resultado
    
def obtenSegundosDisponibles(): 

    siEsDiaSiguienteRenueva()       

    #Finalmente obten los segundos disponibles después de las operaciones.
    return conexion_firebase.obtenDato('nowme', servidor, 'segundos')

def obtenSegundosDisponiblesInference(): 

    #Finalmente obten los segundos disponibles después de las operaciones.
    return conexion_firebase.obtenDato('nowme', servidor, 'inferencias')
    
    
def renuevaSegundosDisponibles():

    #Segundos de cuota total gratuita disponibles al momento.
    conexion_firebase.editaDato('nowme', servidor, 'segundos', globales.quota)
    renuevaTimestampActual()

def renuevaTimestampActual(): 

    timestamp_actual = imprimeTimeNow()
    conexion_firebase.editaDato('nowme', servidor, 'timestamp', timestamp_actual)    

def restaSegundosGPU(cuantos_segundos):
    """
    Lee el número de segundos disponibles,
    resta los segundos dados como parámetro y guarda el nuevo valor en el archivo.
    """

    segundos_disponibles = obtenSegundosDisponibles()    
    
    # Restar los segundos
    nuevos_segundos_disponibles = segundos_disponibles - cuantos_segundos
    print("Procesado, segundos disponibles ahora: ", nuevos_segundos_disponibles)
    conexion_firebase.editaDato('nowme', servidor, 'segundos', nuevos_segundos_disponibles)

def restaSegundosInference(cuantos_segundos):
    """
    Lee el número de segundos disponibles desde seconds_available.txt,
    resta los segundos dados como parámetro y guarda el nuevo valor en el archivo.
    """

    segundos_disponibles = obtenSegundosDisponiblesInference()    

    # Restar los segundos
    nuevos_segundos_disponibles = segundos_disponibles - cuantos_segundos
    print("Procesado, segundos disponibles ahora:  ", nuevos_segundos_disponibles)
    conexion_firebase.editaDato('nowme', servidor, 'inferencias', nuevos_segundos_disponibles)    

def modificaModeloActual(nuevo_modelo):
    """
    Actualiza el archivo archivos/modelo_actual.txt con el modelo funcional en caso de
    problemas con el actual.
    """

    conexion_firebase.editaDato('nowme', servidor, 'modelo_actual', nuevo_modelo)


def imprimeTimeNow(): 
    """
    Devuelve la fecha y hora actual en la zona horaria de la Ciudad de México (GMT-6).
    """
    # 1. Definir la zona horaria de la Ciudad de México
    # Puedes usar 'America/Mexico_City' para que pytz maneje el horario de verano automáticamente.
    mexico_city_tz = pytz.timezone('America/Mexico_City')

    # 2. Obtener la hora actual en UTC
    utc_now = datetime.now(pytz.utc)

    # 3. Convertir la hora UTC a la zona horaria deseada
    mexico_city_now = utc_now.astimezone(mexico_city_tz)

    # 4. Formatear la fecha y hora
    # El formato que deseas es "YYYY-MM-DD HH:MM:SS"
    formatted_time = mexico_city_now.strftime("%Y-%m-%d %H:%M:%S")

    return formatted_time

def siEsDiaSiguienteRenueva():    

    #Obtiene el último registro de fecha de la base de firestore.
    fecha_registro_dt = obtenUltimoTimestamp()
       
    #Timestamp actual
    fecha_actual_dt = imprimeTimeNow()    
    
    formato = "%Y-%m-%d %H:%M:%S"
    datetime_obj_1 = datetime.strptime(fecha_registro_dt, formato)    
    datetime_obj_2 = datetime.strptime(fecha_actual_dt, formato)  
            
    # Extraer solo la fecha de los objetos datetime
    fecha_registro = datetime_obj_1.date()
    fecha_actual = datetime_obj_2.date()

    # Verificar si las fechas son diferentes
    resultado = fecha_actual > fecha_registro    
    diferencia = fecha_actual - fecha_registro       

    if resultado == True:        
        if diferencia.days > 1:
            print("Renovando segundos.")
            renuevaSegundosDisponibles()
            renuevaTimestampActual()
        else: #Si la diferencia es de un solo día entonces si debe checar si ya rebaso la hora de renovación del servidor.        
            hora_actual = datetime_obj_2.time()
                         
            if int(hora_actual.hour) > int(globales.hora_renovacion):               
                print("Renovando segundos.")
                renuevaSegundosDisponibles()
                renuevaTimestampActual()
            else:
                print("Aún no hay renovación de capa de procesamiento.")
                pass
    else: 
        print("Aún no hay renovación de capa de procesamiento.")
    
    return resultado

def despliegaInfoCliente(request):
    # 1. Obtener la IP del cliente (priorizando X-Forwarded-For)
    client_ip = request.headers.get("x-forwarded-for") or \
                request.headers.get("x-real-ip") or \
                (request.client.host if request.client else "unknown")

    # Si X-Forwarded-For es una lista de IPs separadas por coma
    if client_ip and "," in client_ip:
        client_ip = client_ip.split(",")[0].strip() # Tomamos la primera IP (la original)

    # 2. Obtener el User-Agent
    user_agent = request.headers.get("user-agent", "unknown")

    # 3. Información de autenticación (si aplica)
    auth_header = request.headers.get("authorization")
    user_id = "unauthenticated"
    if auth_header and auth_header.startswith("Bearer "):
        token = auth_header.split(" ")[1]
        # Aquí normalmente decodificarías el token JWT para obtener el user_id
        # Ejemplo simulado:
        if token == "mysecrettoken123":
            user_id = "user123_authenticated"
        else:
            user_id = "invalid_token"
            # O podrías lanzar un HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")

    print(f"Petición desde: {client_ip}")
    print(f"User-Agent: {user_agent}")
    print(f"Usuario (Auth): {user_id}")