
    QZi)                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dl	Z	d dl
Z
d dlZd dlZd dlmZ  G d d          Zd Zedk    r e             dS dS )    N)datetime	timedelta)pingc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )SystemReporterc                     t          j                    | _        t          j                    | _        |                                 | _        d | _        d | _	        d| _
        |                                  d S )NT)platformsystemsistemasocketgethostnamecomputer_namecargar_configuracionconfigconfiguracion_remotaultima_actualizacion_config
ejecutandoobtener_configuracion_remotaselfs    C:\MON_AGENTE\recursos.py__init__zSystemReporter.__init__   sf    ((#/11//11$(!+/( 	))+++++    c                    t           j                            t           j                            t                    d          }t           j                            |          s5t          d           t          d|            t          j        d           	 t          |dd          5 }t          j        |          ddd           n# 1 swxY w Y   nz# t          j        $ r0}t          d	|            t          j        d           Y d}~n@d}~wt          $ r0}t          d
|            t          j        d           Y d}~nd}~ww xY wddg}fd|D             }|r&t          d|            t          j        d           S )u>   Carga la configuración desde config.json - FALLA si no existeconfig.jsonz0ERROR CRITICO: Archivo config.json no encontradozRuta esperada:    rutf-8encodingNu9   ERROR CRITICO: config.json tiene formato JSON inválido: z-ERROR CRITICO: No se puede leer config.json: baseUrldispositivoIdc                     g | ]}|v|	S  r$   ).0campor   s     r   
<listcomp>z7SystemReporter.cargar_configuracion.<locals>.<listcomp>0   s$    XXXeEQWDWDWEDWDWDWr   z0ERROR CRITICO: Campos faltantes en config.json: )ospathjoindirname__file__existsprintsysexitopenjsonloadJSONDecodeError	Exception)r   config_pathfecampos_requeridoscampos_faltantesr   s         @r   r   z#SystemReporter.cargar_configuracion   s   gll27??8#<#<mLLw~~k** 	DEEE1K11222HQKKK	k3999 &Q1& & & & & & & & & & & & & & &# 	 	 	QaQQRRRHQKKKKKKKK 	 	 	E!EEFFFHQKKKKKKKK	
 '8XXXX/@XXX 	WEUWWXXXHQKKKsH   C +C C CC CC E'&DE&E

Ec           
         d}t          |          D ]}	 | j        d          d| j        d          }t          j        |d          }|                                 |                                }|                    d          dk    rd	|v r|d	         | _        t          j                    | _	        | j        d
         | j        d<   | 
                                 t          d           t          d| j        d
          d           t          dt          | j                            dg                                  dS t          d|            n# t          j        j        $ r t          d|dz    d|            Y nt          j        j        $ r t          d|dz    d|            Y nVt          j        j        $ r}t          d|            Y d}~n,d}~wt"          $ r}t          d|            Y d}~nd}~ww xY w||dz
  k     rt%          j        d|z             t          d           | j        2t          d           | j                            dd          g d| _        dS ) u-   Obtiene la configuración del servidor remoto   r!   z/v1/configuracion/r"   
   timeoutresponseSUCCESSdataconexionMinutosintervalMinutosu+   Configuración remota obtenida exitosamentezIntervalo actualizado:  minutosServicios configurados: 	serviciosTz#Respuesta inesperada del servidor: u,   Timeout obteniendo configuración - intento r   /u7   Error de conexión obteniendo configuración - intento u&   Error HTTP obteniendo configuración: Nu,   Error inesperado obteniendo configuración:    u2   ERROR: No se pudo obtener la configuración remotau'   Usando configuración local por defecto   )rC   rG   F)ranger   requestsgetraise_for_statusr2   r   r   nowr   guardar_configuracion_localr.   len
exceptionsTimeoutConnectionErrorRequestExceptionr5   timesleep)r   max_intentosintentourlr@   rB   r8   s          r   r   z+SystemReporter.obtener_configuracion_remota8   s   \** %	) %	)G!JY/aa4;C_aa#<R888))+++}}88J''944404VD-7?|~~D4 6:5NO`5aDK 1244666HIIIjD4MN_4`jjjkkkjS9R9V9VWbdf9g9g5h5hjjkkk44FFFGGGG&. c c caWq[aaS_aabbbbb&6 n n nlPWZ[P[ll^jllmmmmm&7 D D DBqBBCCCCCCCC J J JHQHHIIIIIIIIJ )))
1<(((BCCC$,;<<<#';??3Da#H#H) )D%
 us6   D+EE,H+H2HGH)H  Hc                 p   	 t           j                            t           j                            t                    d          }t          |dd          5 }t          j        | j        |dd           ddd           dS # 1 swxY w Y   dS # t          $ r}t          d	|            Y d}~dS d}~ww xY w)
u3   Guarda la configuración actualizada en config.jsonr   wr   r      F)indentensure_asciiNu&   Error guardando configuración local: )r(   r)   r*   r+   r,   r1   r2   dumpr   r5   r.   )r   r6   r7   r8   s       r   rP   z*SystemReporter.guardar_configuracion_localn   s   	@',,rwx'@'@-PPKk3999 HQ	$+qGGGGH H H H H H H H H H H H H H H H H H 	@ 	@ 	@>1>>?????????	@s<   AB B4B BB B	B 
B5B00B5c                    | j         r| j                                         nd}|                                 r|rt|                    d          | j                             d          k    rCt	          d|                    d           d| j                             d           d           dS |rB|                    d          | j                             d          k    rt	          d           dS d	S )
u4   Verifica si hay actualizaciones en la configuraciónNrC   zIntervalo actualizado de z a rE   TrG   z#Servicios de monitoreo actualizadosF)r   copyr   rM   r.   )r   config_anteriors     r   %verificar_actualizacion_configuracionz4SystemReporter.verificar_actualizacion_configuracionw   s*   >B>Wa$388:::]a,,.. 	 ##$566$:S:W:WXi:j:jjj  X/2E2EFW2X2X  X  X]a]v]z]z  |M  ^N  ^N  X  X  X  Y  Y  Yt   ##K00D4M4Q4QR]4^4^^^;<<<tur   c                    	 | j         dk    r	 t          j        g dddd          }|j        dk    r#|j                                        }|r|dk    r|S n#  Y nxY w	 ddl}|                    |j        d	          }|	                    |d
          \  }}|
                    |           |r|dk    r|S n#  Y nxY w| j         dk    r	 t          j        g dddd          }|j        dk    r#|j                                        }|r|dk    r|S n#  Y nxY w	 t          dd          5 }|                                                                }|r|dk    r|cddd           S ddd           n# 1 swxY w Y   nP#  Y nLxY w| j         dk    r>t          j        g dddd          }|j        dk    r|j                                        S n)# t          $ r}t          d|            Y d}~nd}~ww xY wdS )u>   Obtiene la marca de la computadora según el sistema operativoWindows)
powershell-Commandz\Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -ExpandProperty ManufacturerTr=   capture_outputtextr?   r   To be filled by O.E.M.N HARDWARE\DESCRIPTION\System\BIOSSystemManufacturerLinux)	dmidecode-szsystem-manufacturerz/sys/class/dmi/id/sys_vendorr   Darwin)sysctlz-nzhw.modelrJ   zError obteniendo marca: Desconocido)r   
subprocessrun
returncodestdoutstripwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExCloseKeyr1   readr5   r.   )r   	resultadomanufacturerrz   key_r7   r8   s           r   obtener_marca_computadoraz(SystemReporter.obtener_marca_computadora   s   B	2|y(( * S  S  S'+! "	! ! !I !+q00'0'7'='='?'?' 0L<T,T,T#//D	!MMM ..)B(KM MC&,&9&9#?S&T&TOL!OOC(((# ,8P(P(P++D(( *BBB'+! "	! ! !I !+q00'0'7'='='?'?' 0L<T,T,T#//D<cBB 0a'(vvxx~~'7'7' 0L<T,T,T#/0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0D))&N000#'	  	 '1,,$+11333 	2 	2 	20Q0011111111	2 }s   G AA G AG AB8 6G 8B=:G AD G DG F -0E6F *F 6E::F =E:>F G FAG 
G9G44G9c                 D   	 | j         dk    r6	 ddl}|                    |j        d          }|                    |d          \  }}	 |                    |d          \  }}| d| }n# t
          $ r t          |          }Y nw xY w|                    |           |S # t          $ r}t          d|            Y d}~nd}~ww xY w	 t          j        g d	d
d
d          }|j        dk    r2|j                                        r|j                                        S n# t          $ r Y nw xY wt          j                    S | j         dk    r!	 t#          dd          5 }	|	D ]}
|
                    d          ri|
                    d          d                                                             d          }t          j                    }| d| dc cddd           S 	 ddd           n# 1 swxY w Y   n# t*          $ r Y nw xY w	 t          j        ddgd
d
d          }|j        dk    r|j                                        S n# t          $ r Y nw xY wt          j                    S | j         dk    ri	 t          j        ddgd
d
d          }|j        dk    r|j                                        S n# t          $ r Y nw xY wt          j                    d         S n)# t          $ r}t          d|            Y d}~nd}~ww xY wt          j                    S )u   Obtiene la versión detallada del sistema operativo.
        En Windows: Build.UBR (ej: 26200.7462)
        En Linux: Versión del kernel o distribución
        rf   r   Nz,SOFTWARE\Microsoft\Windows NT\CurrentVersionCurrentBuildUBR.z#Error leyendo registro de Windows: )rg   rh   z(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").CurrentBuild + "." + (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").UBRTr=   ri   ro   z/etc/os-releaser   zVERSION_ID==r   "z	 (kernel )unamez-rrJ   rr   sw_versz-productVersionu"   Error obteniendo versión del SO: )r   rz   r{   r|   r}   WindowsErrorstrr~   r5   r.   ru   rv   rw   rx   ry   r	   versionr1   
startswithsplitreleaseFileNotFoundErrormac_ver)r   rz   r   current_buildr   ubrversion_completar8   r   r7   liner   kernels                r   !obtener_version_sistema_operativoz0SystemReporter.obtener_version_sistema_operativo   s   
V	<|y((E!MMM ..1G C (.':':3'O'O$M1>!'!4!4S%!@!@Q.;+C+Cc+C+C((' > > >+.}+=+=(((> OOC(((++  E E ECCCDDDDDDDDE *M M M'+! "! ! !I !+q00Y5E5K5K5M5M0(/55777    D  ')))((	/55 F$% F FD#}== F*.**S//!*<*B*B*D*D*J*J3*O*O)1)9););*1'E'EF'E'E'E E EF F F F F F F FFFF F F F F F F F F F F F F F F )   D
 * $'+! !	! ! !I !+q00(/55777 1    D  ')))))
 *"$56'+! !	! ! !I !+q00(/55777 1    D  '))!,, *  	< 	< 	<:q::;;;;;;;;	< !!!s,  K& 8B  A) (B )BB BB 
C)C ;K&  CK& 	AD!  K& !
D.+K& -D..K& K& G> !A6G2G> $G2&G> 2G66G> 9G6:G> =K& >
HK& 
HK& =I K& 
IK& IK& 1K& ==J< ;K& <
K	K& K		K& &
L0LLc                    d}|                                  }t          d|            t          |          D ]@}	 | j        d          d| j        d          }ddi}d|i}t	          j        |||d	
          }|                                 t          d|j                     dS # t          j        j	        $ r t          d|dz    d|            Y nt          j        j
        $ r t          d|dz    d|            Y nVt          j        j        $ r}t          d|            Y d}~n,d}~wt          $ r}t          d|            Y d}~nd}~ww xY w||dz
  k     rt          j        d|z             Bt          d           dS )u:   Actualiza la versión del sistema operativo en el servidorr<   u   Actualizando versión del SO: r!   z/v1/dispositivo/version-so/r"   Content-Typeapplication/jsonversionSistemaOperativor=   r2   headersr?   u3   Versión del SO actualizada exitosamente - Status: Tu+   Timeout actualizando versión SO - intento r   rH   u6   Error de conexión actualizando versión SO - intento u%   Error HTTP actualizando versión SO: Nu+   Error inesperado actualizando versión SO: rI   u5   ADVERTENCIA: No se pudo actualizar la versión del SOF)r   r.   rK   r   rL   putrN   status_coderR   rS   rT   rU   r5   rV   rW   )	r   rX   
version_sorY   rZ   r   bodyr@   r8   s	            r   actualizar_version_soz$SystemReporter.actualizar_version_so1  s#   ;;==
;z;;<<<\** 	) 	)GIY/jjDKXgLhjj)+=>1:>#<$QSTTT))+++bHL`bbccctt&. b b b`GaK``R^``aaaaa&6 m m mkwYZ{kk]ikklllll&7 C C CAaAABBBBBBBB I I IGAGGHHHHHHHHI )))
1<(((EFFFus0   A(B'',E+EED,,E9EEc                 Z   	 | j         dk    r	 t          j        g dddd          }|j        dk    r!|j                                        }|r|dvr|S n#  Y nxY w	 ddl}|                    |j        d	          }|	                    |d
          \  }}|
                    |           |r|dvr|S nM#  Y nHxY w| j         dk    r	 t          j        g dddd          }|j        dk    r!|j                                        }|r|dvr|S n#  Y nxY w	 t          dd          5 }|                                                                }|r|dvr|cddd           S ddd           n# 1 swxY w Y   n#  Y nxY w| j         dk    rut          j        ddgddd          }|j        dk    rP|j                            d          D ]5}d|v r/|                    d          d                                         c S 6n)# t          $ r}t          d|            Y d}~nd}~ww xY wdS )u'   Obtiene el número de serie del sistemarf   )rg   rh   zRGet-CimInstance -ClassName Win32_BIOS | Select-Object -ExpandProperty SerialNumberTr=   ri   r   )rl   Default string0Nrm   SystemProductName)rl   r   ro   )rp   rq   zsystem-serial-numberz /sys/class/dmi/id/product_serialr   rr   system_profilerSPHardwareDataTyperJ   
zSerial Number:r   u#   Error obteniendo número de serie: rt   )r   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r1   r   r   r5   r.   )	r   r   serialrz   r   r   r7   r   r8   s	            r   obtener_numero_seriez#SystemReporter.obtener_numero_serieV  sP   D	=|y(( * I  I  I'+! "	! ! !I !+q00!*!1!7!7!9!9! *f4e&e&e#)MD	!MMM ..)B(KM MC & 3 3C9L M MIFAOOC((( &&0\"\"\%D(( *CCC'+! "	! ! !I !+q00!*!1!7!7!9!9! *f4`&`&`#)MD@#FF *!!"!1!1! *f4`&`&`#)* * * * * * * * * * * * * * * * * * * * * * *D))&N&(<=#'	  	 '1,, ) 0 6 6t < < > >*d22#'::c??1#5#;#;#=#==== 3  	= 	= 	=;;;<<<<<<<<	= }s   H AA H AH AB4 2H 4B96H AD H DH E: '.E.E: "E: .E22E: 5E26E: 9H :E><BH  H 
H(H##H(c                    	 	 ddl }|                                }|                    dd          }n%# t          $ r t	          j                    pd}Y nw xY wt	          j                     dt	          j                     | j        | 	                                | 
                                |dS # t          $ r)}t          d|            d| j        ddddcY d}~S d}~ww xY w)u(   Obtiene información básica del sistemar   N	brand_rawrt    )	soTecnicohostnameTecnicomarcaTecnicoserialTecnicoprocesadorTecnicou'   Error obteniendo información básica: )cpuinfoget_cpu_inforM   ImportErrorr	   	processorr
   r   r   r   r   r5   r.   )r   r   cpu_infoprocesador_modelor8   s        r   obtener_info_basicaz"SystemReporter.obtener_info_basica  sC   	J"//11$,LLm$L$L!! J J J$,$6$8$8$IM!!!J !) 1 1HHH4D4F4FHH#'#5 $ > > @ @!%!:!:!<!<%6    	 	 	?A??@@@*#'#5 -!.%2       	s9   .2 B/ AB/ AAB/ /
C"9CC"C"c                    d}t          d           |                                 }t          d|d                     t          d|d                     t          d|d                     t          d	|d
                     t          d|d                     t          |          D ]<}	 | j        d          d| j        d          }ddi}t	          j        |||d          }|                                 t          d|j                     dS # t          j        j	        $ r t          d|dz    d|            Y nt          j        j
        $ r t          d|dz    d|            Y nVt          j        j        $ r}t          d|            Y d}~n,d}~wt          $ r}t          d|            Y d}~nd}~ww xY w||dz
  k     rt          j        d|z             >t          d           dS ) uA   Actualiza la información técnica del dispositivo en el servidorr<   u5   Actualizando información técnica del dispositivo...z  SO: r   z  Hostname: r   z	  Marca: r   z
  Serial: r   z  Procesador: r   r!   z/v1/dispositivo/tecnico/r"   r   r   r=   r   u9   Información técnica actualizada exitosamente - Status: Tu-   Timeout actualizando info técnica - intento r   rH   u8   Error de conexión actualizando info técnica - intento u'   Error HTTP actualizando info técnica: Nu-   Error inesperado actualizando info técnica: rI   u;   ADVERTENCIA: No se pudo actualizar la información técnicaF)r.   r   rK   r   rL   r   rN   r   rR   rS   rT   rU   r5   rV   rW   )r   rX   info_basicarY   rZ   r   r@   r8   s           r   actualizar_info_tecnicaz&SystemReporter.actualizar_info_tecnica  s   EFFF..001{;/11222=[):;==>>>7+n5778889;799:::A{+>?AABBB\** 	) 	)GKY/ggUdIegg)+=>#<+wXZ[[[))+++hRZRfhhiiitt&. d d dbgPQkbbT`bbccccc&6 o o omQX[\Q\mm_kmmnnnnn&7 E E ECCCDDDDDDDD K K KIaIIJJJJJJJJK )))
1<(((KLLLus1   1A$D,G+G3GFG*GGc                     	 t          t          j        d          pt          j                              t          t          t          j        d          d                    dS # t
          $ r dddcY S w xY w)	u0   Obtiene información del procesador - optimizadoF)logicalg?)intervalr   )procesadorNucleosprocesadorUsoPorcentajer   0.0)r   psutil	cpu_countroundcpu_percentr5   r   s    r   obtener_info_procesadorz&SystemReporter.obtener_info_procesador  s    	P%()9%)H)H)H)^FL\L^L^%_%_+.uV5GQT5U5U5UWX/Y/Y+Z+Z    	P 	P 	P),OOOOO	Ps   A%A( (A:9A:c                     	 t          j                    }t          t          |j        dz  d                    t          t          |j        d                    dS # t          $ r dddcY S w xY w)u(   Obtiene información de RAM - optimizado   @r]   r   )ramCapacidadGbramUsoPorcentajer   )r   virtual_memoryr   r   totalpercentr5   )r   vms     r   obtener_info_ramzSystemReporter.obtener_info_ram  s    	H&((B"%eBH,@!&D&D"E"E$'bj!(<(<$=$=    	H 	H 	H&+GGGGG	Hs   AA A/.A/c                     	 t          j                    }|r+dt          t          |j        d                    |j        dS n# t          $ r Y nw xY wddddS )u-   Obtiene información de batería - optimizadoTr   )bateriaInstaladabateriaCargaPorcentajebateriaConectadaFr   )r   sensors_batteryr   r   r   power_pluggedr5   )r   batterys     r   obtener_info_bateriaz#SystemReporter.obtener_info_bateria  s    		,..G (,.1%2K2K.L.L(/(=    	 	 	D	 !&&) %
 
 	
s   ?A 
AAc                    	 t          j                    }t          j        d           t          j                    }|r~|r||j        |j        z
  }|j        |j        z
  }|dz  dz  }|dz  dz  }d}t          d||z  dz            }t          d||z  dz            }	t          |d          t          |	d          fS n# t          $ r Y nw xY wdS )u,   Obtiene estrés de disco con muestra rápida      ?i   d   r           r   )	r   disk_io_countersrV   rW   
read_byteswrite_bytesminr   r5   )
r   disk_io_inicialdisk_io_final
bytes_readbytes_writeread_speed_mbswrite_speed_mbsmax_speed_typicalread_stresswrite_stresss
             r   obtener_estres_disco_rapidoz*SystemReporter.obtener_estres_disco_rapido  s   	$577OJsOOO"355M E= E*58RR
+7/:UU",s"2{!C#.#4"E$'!!#9J(Jc'QRR"3;L)LPS(STT[!,,eL!.D.DDD 	 	 	D	 xs   B9B= =
C
	C
c                    g }	 t          j                    }|                                 \  }}|D ]}	 |j        dv rt          j        |j                  }|                    |j        t          t          |j	        dz  d                    t          t          |j
        |j	        z  dz  d                    t          |          t          |          d           # t          t          f$ r Y w xY wn# t          $ r Y nw xY w|S )u+   Obtiene información de discos - optimizado) squashfstmpfsr   r]   r   )sistemaArchivoscapacidadGbusoPorcentajelecturaPorcentajeescrituraPorcentaje)r   disk_partitionsr   fstype
disk_usage
mountpointappendr   r   r   usedPermissionErrorOSErrorr5   )r   discos
partitionsavg_read	avg_write	partitionusages          r   obtener_info_discosz"SystemReporter.obtener_info_discos&  s<   	/11J"&"B"B"D"DHi'  	 '+DDD "-i.BCCEMM+4+;'*51H!+L+L'M'M),UEJ4LPS3SUV-W-W)X)X-0]]/29~~# #     (1   H   	 	 	D	 s?   .C7 	CC7 B!CC7 C30C7 2C33C7 7
DDc                 V   	 t          j        d          |         }t          j        d           t          j        d          |         }|j        |j        z
  }|j        |j        z
  }t          |dz  dz  d          }t          |dz  dz  d          }||fS # t          $ r Y dS w xY w)u.   Obtiene velocidad de red con medición rápidaT)pernicr      g       Ar]   r   )r   net_io_countersrV   rW   
bytes_sent
bytes_recvr   r5   )r   interfazstats_inicialstats_finalbytes_up
bytes_downmbps_up	mbps_downs           r   obtener_velocidad_red_rapidaz+SystemReporter.obtener_velocidad_red_rapidaB  s    	"2$???IMJsOOO 0===hGK"-0HHH$/-2JJJX\.?@!DDGzA~2CDaHHII%% 	 	 	88	s   BB 
B('B(c                 l   	 t          j                                        |g           }|D ]w}|j        t          j        k    r`|j        rP	 t          d |j                            d          D                       }|j	         d| c S #  |j	        cY c S xY w|j	        c S xn# t          $ r Y nw xY wdS )z'Obtiene IP de una interfaz - optimizadoc                 l    g | ]1}t          t          |                                        d           2S )1)binintcount)r%   xs     r   r'   z6SystemReporter.obtener_ip_interfaz.<locals>.<listcomp>[  s2    '`'`'`1CFF(9(9#(>(>'`'`'`r   r   rH   N/A)r   net_if_addrsrM   familyr   AF_INETnetmasksumr   addressr5   )r   r  addrsaddrcidrs        r   obtener_ip_interfazz"SystemReporter.obtener_ip_interfazS  s    	'))--h;;E ( (;&.00| 00#&'`'`HZHZ[^H_H_'`'`'`#a#aD&*l#;#;T#;#;;;;0#'</////<''' 1(  	 	 	D	us6   AB$ 
<B	B$ 		BB$ B$ "B$ $
B10B1c                     	 t          j                                        |g           }|D ] }|j        t           j        k    r	|j        c S !n# t          $ r Y nw xY wdS )z(Obtiene MAC de una interfaz - optimizador  )r   r   rM   r!  AF_LINKr%  r5   )r   r  r&  r'  s       r   obtener_mac_interfazz#SystemReporter.obtener_mac_interfazd  s    	'))--h;;E ( (;&.00<''' 1(  	 	 	D	us   AA A 
AAc                    g }	 t          j                    }|                                D ]\  }t          fddD                       r!|                               }|j        s|dk    rD|                               \  }}|                    |                               ||j        t          |          t          |          d           n# t          $ r Y nw xY w|S )u6   Obtiene información de interfaces de red - optimizadoc              3   D   K   | ]}|                                 v V  d S )N)lower)r%   skipr  s     r   	<genexpr>z4SystemReporter.obtener_info_redes.<locals>.<genexpr>w  sB        Dtx~~///      r   )loopbackvmware
virtualboxdocker	vethernetteredoisatap6to4r  )nombremacip	estadoRedvelocidadSubidaMbpsvelocidadBajadaMbps)r   net_if_statsitemsanyr)  isupr  r   r,  r   r5   )r   
interfacesr@  statsr<  velocidad_upvelocidad_downr  s          @r   obtener_info_redesz!SystemReporter.obtener_info_redeso  sD   
	!.00L#/#5#5#7#7  %     =        --h77z bEkk/3/P/PQY/Z/Z,n!!&44X>>!&+.|+<+<+.~+>+># #    .  	 	 	D	 s   CC 
C%$C%c                    	 t          |d          }|5t          t          |d                    }t          d| d| d           |S t          d| d	           d
S # t          $ r t          d| d           Y d
S t
          $ r }t          d| d|            Y d}~d
S d}~wt          $ r }t          d| d|            Y d}~d
S d}~ww xY w)uK   Realiza ping usando ping3 (librería Python pura) y extrae la latencia realr=   r>   Nr<   zLatencia encontrada para : szHost z no responder   z"Error de permisos al hacer ping a z). Se requieren permisos de administrador.zError de red al hacer ping a zError en ping para )r   r   r   r.   r  r  r5   )r   	direccionlatencialatencia_strr8   s        r   hacer_ping_nmapzSystemReporter.hacer_ping_nmap  sA   	 Ir222H#"51#5#566N)NN|NNNOOO## 5i555666u 	 	 	kykkklll55 	 	 	B)BBqBBCCC55555 	 	 	8	88Q8899955555	s0   AA 
A C?	CB##C0CCc           	      t   	 t          d| d|            t          j        t          j        t          j                  }|                    d           |                    ||f          }|                                 |dk    }|rt          d| d| d           nt          d| d| d           |S # t          j        $ r }t          d| d	|            Y d
}~dS d
}~wt          j        $ r t          d| d|            Y dS t          $ r#}t          d| d| d	|            Y d
}~dS d
}~ww xY w)u?   Verifica si un puerto está abierto usando socket (TCP connect)z    Verificando puerto z en rI   r   z    Puerto z: openz: closed/filteredz    Error DNS al verificar rJ  NFz    Timeout verificando puerto z    Error verificando puerto )
r.   r   r"  SOCK_STREAM
settimeout
connect_exclosegaierrorr?   r5   )r   rL  puertosockr   puerto_abiertor8   s          r   verificar_puertozSystemReporter.verificar_puerto  s   	CFCC	CCDDD =1CDDDOOA F(;<<IJJLLL (1nN NAFAA	AAABBBBLFLL	LLLMMM!! 	 	 	@	@@Q@@AAA55555~ 	 	 	KFKK	KKLLL55 	 	 	N&NNiNN1NNOOO55555	s*   B4B7 7D7C!!'D7	D7D22D7c                    g }| j         r	d| j         vrt          d           |S | j         d         }|D ]K}	 |                    dd          }|                    dd          }|                    dd          }|                    d	| d
|           }|                    dd          }|sz|ddt          |          d|d}	|r<|                     |          }
|
|	d<   |dk    r|                     ||          }||	d<   n;|dk    r|                     ||          }||	d<   |                     |          }
|
|	d<   |                    |	            # t          $ r }t          d| d|            Y d}~Ed}~ww xY w|S )uS   Obtiene latencia de ping y verificación de puertos basado en configuración remotarG   z-No hay servicios configurados para monitorearrL  r   rV  r   tipoServicioTdescripcionr   
servicioIdr   F)nombreDestinorespuestaMs
esRevisionnombrePuertorespuestaPuertor]  r_  rb  zError procesando servicio rJ  N)r   r.   rM   r   rO  rY  r   r5   )r   	latenciasrG   serviciorL  rV  tipo_servicior\  servicio_idlatencia_entrylatencia_msrX  r8   s                r   obtener_latencia_pingz$SystemReporter.obtener_latencia_ping  s   	( 	Kt?X,X,XABBB-k:	! *	 *	H)$LLb99	!h22 (^T B B&ll=Y:Q:Q:Q:QRR&ll<;;   &/#("&$'KK',"-" " ! @"&"6"6y"A"AK4?N=1 zz)-)>)>y&)Q)Q<J'89 zz)-)>)>y&)Q)Q<J'89 #'"6"6y"A"AK4?N=1  0000   B8BBqBBCCC s   A5E-B$E
E=E88E=c           
      :   d}t          |          D ]x}	 | j        d          d}ddi}t          j        |||d          }|                                 t          d|j                     d	S # t          j        j        $ r; t          d
|dz    d|            ||dz
  k     rt          j
        d|z             Y t          j        j        $ r; t          d|dz    d|            ||dz
  k     rt          j
        d|z             Y t          j        j        $ rF}t          d|dz    d| d|            ||dz
  k     rt          j
        d|z             Y d}~Md}~wt          $ r}t          d|            Y d}~ nd}~ww xY wt          d           dS )u7   Envía los datos a la API con manejo robusto de erroresr<   r!   z/v1/revisionr   r      r   z&Datos enviados exitosamente - Status: TzTimeout en intento r   rH   rI   u   Error de conexión en intento zError HTTP en intento rJ  NzError inesperado: uE   FALLO: No se pudieron enviar los datos después de todos los intentosF)rK   r   rL   postrN   r.   r   rR   rS   rV   rW   rT   rU   r5   )r   datosrX   rY   rZ   r   r@   r8   s           r   enviar_datos_apizSystemReporter.enviar_datos_api  s   \** 	 	GY/===)+=>#=5'SUVVV))+++Ux?SUUVVVtt&. - - -HGaKHH,HHIII\A---JqG|,,,&6 - - -Sw{SS\SSTTT\A---JqG|,,,&7 - - -Pw{PP\PPQPPQQQ\A---JqG|,,,   .1../// 	UVVVus2   AA00AF	>AF	F	;EF	,FF	c                 B   	 t          dt          j                                        d                      t          j                                                    }|                                 }|                                 }|                                 }|                                 }| 	                                }| 
                                }| j        d         ||d         |d         |d         |d         |d         |d	         |d
         | j        |||d}t          d|d          d|d          d           t          dt          |                      |                     |          }	|	S # t          $ r}
t          d|
            Y d}
~
dS d}
~
ww xY w)u5   Recolecta datos del sistema y los envía - optimizadou   Iniciando recolección - z%Y-%m-%d %H:%M:%Sr"   r   r   r   r   r   r   r   )r"   momentor   r   r   r   r   r   r   hostnamer  interfacesRedeslatenciasPingu   Recolección completada. CPU: z%, RAM: %zServicios monitoreados: u   ERROR en recolección: NF)r.   r   rO   strftime	isoformatr   r   r   r	  rH  ri  r   r   rQ   rn  r5   )r   rp  info_procesadorinfo_raminfo_bateriainfo_discos
info_redeslatencia_ping	datos_apir   r8   s              r   recolectar_y_enviarz"SystemReporter.recolectar_y_enviar-  s   )	\hlnn.E.EFY.Z.Z\\]]]lnn..00G #::<<O,,..H4466L 2244K0022J 6688M "&_!="%45H%I+:;T+U"*+;"<$,-?$@$01C$D*67O*P$01C$D .%#-!. I    G?C\3]  G  Ggo  qC  hD  G  G  G  H  H  HAS-?-?AABBB --i88I 	 	 	/A//00055555	s   E4E7 7
FFFc           	      .   | j         st          d           dS | j         d         dz  }t          d           t          d| j        d                     t          d| j                    t          d	| j         d          d
           t          d| j        d                     t          dt	          | j                             dg                                 t          d           t          d           |                                  |                                  t          d           |                                  | j	        rE	 t          d| j         d          d           d}d}||k     r| j	        rt          |||z
            }t          j        |           ||z  }||dz  z  dk    r<|                                 r(| j         d         dz  }||k    rt          d           |}n||k     r| j	        | j	        r|                                  nn# t          $ r t          d           d| _	        Y dS t          $ r?}t          d|            t          d           t          j        d           Y d}~nd}~ww xY w| j	        CdS dS )zLoop principal del agenteuD   ERROR: No se pudo obtener configuración inicial. Deteniendo agente.NrC   <   zAGENTE INICIADOzDispositivo ID: r"   z
Hostname: zIntervalo: rE   zAPI: r!   rF   rG   z<------------------------------------------------------------z=
============================================================z=============================================================
z
Esperando u'    minutos hasta próxima recolección...r      rI   z:Intervalo actualizado. Reiniciando ciclo con nuevo tiempo.z
Deteniendo agente...FzERROR en loop principal: u   Continuando ejecución...r=   )r   r.   r   r   rQ   rM   r   r   r~  r   r   rV   rW   rd   KeyboardInterruptr5   )r   intervalo_segundostiempo_esperaintervalo_checktiempo_chunknuevo_intervalor8   s          r   ejecutar_loopzSystemReporter.ejecutar_loopZ  s   ( 	XYYYF!67HIBN !!!?_!=??@@@/4-//000RD56GHRRRSSS.dk),..///^T-F-J-J;XZ-[-[)\)\^^___h 	o$$&&&""$$$o 	  """o !	 x4#<=N#Oxxxyyy !""$#&888T_8#&8J]8Z#[#[LJ|,,,!\1M %!(;<AAEEGG &.2.GHY.Z]_._O.2DDD %&c d d d5D 2 % $&888T_8 ? /,,...$   .///"'   5!556661222
2= o !	 !	 !	 !	 !	s   CH  J 	J	5JJc                     d| _         dS )z!Detiene el agente de forma seguraFN)r   r   s    r   detenerzSystemReporter.detener  s    r   N)__name__
__module____qualname__r   r   r   rP   rd   r   r   r   r   r   r   r   r   r   r   r	  r  r)  r,  rH  rO  rY  ri  rn  r~  r  r  r$   r   r   r   r      s       	, 	, 	,  :4 4 4l@ @ @  &F F FP]" ]" ]"~# # #JH H HT  8( ( (TP P P	H 	H 	H
 
 
&  0  8  "  "	 	 	     D  8! ! !F6 6 6p# # #J+ + +Z: : :x         r   r   c                     	 t                      } |                                  dS # t          $ r t          d           Y dS t          $ r Y dS t
          $ r1}t          d|            t          j        d           Y d}~dS d}~ww xY w)u!   Función principal - simplificadaz
Agente detenido por el usuariozERROR CRITICO: r   N)r   r  r  r.   
SystemExitr5   r/   r0   )reporterr8   s     r   mainr    s    
!##      2 2 20111111      ###$$$s!   "& B	B	B&BB__main__)r   r	   r   r2   ru   rV   rL   r   r   r(   re	threadingr/   ping3r   r   r  r  r$   r   r   <module>r     s              ( ( ( ( ( ( ( ( 				 				     



      I  I  I  I  I  I  I  I V   zDFFFFF r   