
    mci>                     Z    d Z ddlZddlZddlZddlZddlmZ d Zd Zd Z	d Z
d	 Zd
 ZdS )uN  
Funciones de utilidad: notificaciones, normalización y comparación de versiones.

- enviar_correo_error / registrar_error: reporte de errores a log y correo.
- limpiar_version / comparar_versiones: normalizar y comparar cadenas de versión.
- obtener_version / obtener_version_header: extraer versión de cadenas o cabeceras HTTP.
    N   )configc                    t           j        sdS 	 d}|  dt          j                                                            d           d}d t           j                            d          D             }dd	|d
t           j        dg|z   }t          j	        ||ddd          }|j
        r.t          j        d|j
                                                    |j        r.t          j        d|j                                                    |j        dk    r#t          j        dt           j                    dS t          j        d|j         d           dS # t"          $ r"}t          j        d|            Y d}~dS d}~ww xY w)u   
    Envía un correo notificando un error durante la ejecución (usa comando 'mail').

    Args:
        mensaje: Descripción del error.
    Nz![softlibre] Error en actualizadorz
Fecha: z%d-%m-%Y %H:%M
c                 6    g | ]}|                                 S  )strip).0ds     :/srv/repositorios/osluz/webnueva/scripts/descarga/utils.py
<listcomp>z'enviar_correo_error.<locals>.<listcomp>&   s     GGGqGGG    ,mailz-sz-rz--T   )inputtextcapture_outputtimeoutzmail STDOUT: zmail STDERR: r   zCorreo de error enviado a z"Error al enviar correo (exit code z).z&No se pudo enviar el correo de error: )r   ENVIAR_CORREOdatetimenowstrftimeEMAIL_TOsplit
EMAIL_FROM
subprocessrunstdoutlogginginfor	   stderr
returncodeerror	Exceptionwarning)mensajeasuntocuerpodestinatarioscmdresultes          r   enviar_correo_errorr.      s     F4 M M'++--667GHHM M M 	 HGFO,A,A#,F,FGGGtVT6+<dCmS6T[]^^^= 	BL@)<)<)>)>@@AAA= 	BL@)<)<)>)>@@AAA!!LGfoGGHHHHHMTv?PTTTUUUUU F F FDDDEEEEEEEEEFs   D&E 8E 
F!E>>Fc                 L    t          j        |            t          |            dS )uv   
    Registra un error en el log y envía notificación por correo.

    Args:
        mensaje: Mensaje de error.
    N)r    r$   r.   )r'   s    r   registrar_errorr0   5   s(     M'     r   c                     | sdS t          |                               dd                              dd          }t          j        dd|          }t          j        dd|                              d          }|S )u   
    Normaliza una cadena de versión (solo dígitos y puntos).

    Args:
        version: Cadena original (ej. "v1.2.3-beta").

    Returns:
        Versión limpia (ej. "1.2.3") o cadena vacía si version es None/vacía.
     _.-z[^0-9.]z\.{2,})strreplaceresubr	   )versionvs     r   limpiar_versionr<   E   su      rGS#&&..sC88A
z2q!!A
y#q!!'',,AHr   c                 J   | r|sdS t          |           }t          |          }|                    d          }|                    d          }t          t          t	          |          t	          |                              D ]}|t	          |          k     r/||                                         rt          ||                   nd}|t	          |          k     r/||                                         rt          ||                   nd}||k    r dS ||k     r dS dS )u   
    Compara dos versiones numéricas (segmentos separados por puntos).

    Returns:
        1 si version1 > version2, -1 si version1 < version2, 0 si son iguales.
    r   r4   r   )r<   r   rangemaxlenisdigitint)	version1version2v1v2	partes_v1	partes_v2ip1p2s	            r   comparar_versionesrM   W   s     8 q		"	"B		"	"BII3s9~~s9~~6677  "#c)nn"4"419M9M9O9O"4S1UV"#c)nn"4"419M9M9O9O"4S1UV77117722 1r   c                     | r|sdS t          j        | |          }|r>|                                r|                    d          n|                    d          S dS )u   
    Extrae la versión de una cadena (nombre de archivo o URL) con una regex.

    Args:
        pattern: Expresión regular (con grupo de captura opcional).
        filename: Cadena donde buscar.

    Returns:
        Versión encontrada o None.
    Nr   r   )r8   searchgroupsgroup)patternfilenamematchs      r   obtener_versionrU   n   sb      ( tIgx((E D!&Cu{{1~~~U[[^^C4r   c                     |                     d          }|r:t          j        d|          }|r#t          | |                    d                    S dS )u   
    Extrae la versión desde el header Content-Disposition de una respuesta HTTP.

    Args:
        pattern: Regex para la versión.
        headers: Diccionario de cabeceras.

    Returns:
        Versión extraída o None.
    zContent-Dispositionzfilename="?([^";]+)"?r   N)getr8   rO   rU   rQ   )rR   headerscontent_disprT   s       r   obtener_version_headerrZ      sW     ;;455L <	2LAA 	<"7EKKNN;;;4r   )__doc__r   r    r8   r   r2   r   r.   r0   r<   rM   rU   rZ   r   r   r   <module>r\      s       				          F F F<! ! !   $  .  &    r   