nowme-images-app / herramientas.py
Moibe's picture
Logs y estadísticas
421e233
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}")