
    QZi)                         S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SK	r	S SK
r
S SKrS SKrS SKJr   " S S5      rS r\S:X  a  \" 5         gg)    N)datetime	timedelta)pingc                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)SystemReporter   c                     [         R                  " 5       U l        [        R                  " 5       U l        U R                  5       U l        S U l        S U l	        SU l
        U R                  5         g )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__SystemReporter.__init__   sV    (#//1//1$(!+/( 	))+    c                 6   [         R                  R                  [         R                  R                  [        5      S5      n[         R                  R                  U5      (       d/  [        S5        [        SU 35        [        R                  " S5         [        USSS9 n[        R                  " U5      nSSS5        SS/nU Vs/ s H  ofW;  d  M
  UPM     nnU(       a$  [        SU 35        [        R                  " S5        W$ ! , (       d  f       NX= f! [        R                   a.  n[        S	U 35        [        R                  " S5         SnANSnAf[         a.  n[        S
U 35        [        R                  " S5         SnANSnAff = fs  snf )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dispositivoIdz0ERROR CRITICO: Campos faltantes en config.json: )ospathjoindirname__file__existsprintsysexitopenjsonloadJSONDecodeError	Exception)r   config_pathfr   ecampos_requeridoscampocampos_faltantess           r   r   #SystemReporter.cargar_configuracion   s3   ggll277??8#<mLww~~k**DEOK=12HHQK	k39Q1 : '8/@X/@eQWDWE/@XDEUDVWXHHQK# :9## 	MaSQRHHQKK 	A!EFHHQKK	 YsN   D !D
8D 	FF

DD D F/$EF%$FFc           
         Sn[        U5       GHS  n U R                  S    SU R                  S    3n[        R                  " USS9nUR	                  5         UR                  5       nUR                  S5      S:X  a  S	U;   a  US	   U l        [        R                  " 5       U l	        U R                  S
   U R                  S'   U R                  5         [        S5        [        SU R                  S
    S35        [        S[        U R                  R                  S/ 5      5       35          g[        SU 35         X!S-
  :  d  GM:  [$        R&                  " SU-  5        GMV     [        S5        U R                  c/  [        S5        U R                  R                  SS5      / S.U l        g! [        R                  R                   a    [        SUS-    SU 35         N[        R                  R                   a    [        SUS-    SU 35         N[        R                  R                    a  n[        SU 35         SnAGN	SnAf["         a  n[        SU 35         SnAGN*SnAff = f) 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   )rB   rF   F)ranger   requestsgetraise_for_statusr/   r   r   nowr   guardar_configuracion_localr+   len
exceptionsTimeoutConnectionErrorRequestExceptionr2   timesleep)r   max_intentosintentourlr?   rA   r5   s          r   r   +SystemReporter.obtener_configuracion_remota8   sD   \*G!JY/00B4;;C_B`a#<<R8))+}}88J'94404VD-7?||~D4 6:5N5NO`5aDKK 12446GI3D4M4MN_4`3aaijk4S9R9R9V9VWbdf9g5h4ijk?vFG ))

1<(K +N 	BC$$,;<#';;??3Da#H)D%
 1 &&.. cDWq[MQRS_R`ab&&66 nOPWZ[P[}\]^j]klm&&77 D>qcBCC JDQCHIIJs6   DF..F..2I,"1I,I,2II,I''I,c                 ^    [         R                  R                  [         R                  R                  [        5      S5      n[        USSS9 n[        R                  " U R                  USSS9  SSS5        g! , (       d  f       g= f! [         a  n[        S	U 35         SnAgSnAff = f)
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)   r.   r/   dumpr   r2   r+   )r   r3   r4   r5   s       r   rO   *SystemReporter.guardar_configuracion_localn   s}    	@'',,rwwx'@-PKk39Q		$++qG :99 	@:1#>??	@s6   AB
 "A90B
 9
BB
 B
 

B,B''B,c                    U R                   (       a  U R                   R                  5       OSnU R                  5       (       a  U(       ai  UR                  S5      U R                   R                  S5      :w  a;  [	        SUR                  S5       SU R                   R                  S5       S35        gU(       a:  UR                  S5      U R                   R                  S5      :w  a  [	        S5        gg	)
u4   Verifica si hay actualizaciones en la configuraciónNrB   zIntervalo actualizado de z a rD   TrF   z#Servicios de monitoreo actualizadosF)r   copyr   rL   r+   )r   config_anteriors     r   %verificar_actualizacion_configuracion4SystemReporter.verificar_actualizacion_configuracionw   s    >B>W>W$3388:]a,,..##$56$:S:S:W:WXi:jj1/2E2EFW2X1YY\]a]v]v]z]z  |M  ^N  ]O  OW  X  Y  ##K0D4M4M4Q4QR]4^^;<r   c                 &    U R                   S:X  a   [        R                  " / SQSSSS9nUR                  S:X  a)  UR                  R                  5       nU(       a  US:w  a  U$  SSKnUR                  UR                  S	5      nUR                  US
5      u  p%UR                  U5        U(       a  US:w  a  U$ GOU R                   S:X  a   [        R                  " / SQSSSS9nUR                  S:X  a)  UR                  R                  5       nU(       a  US:w  a  U$  [        SS5       nUR                  5       R                  5       nU(       a  US:w  a  UsSSS5        $ SSS5        gU R                   S:X  aC  [        R                  " / SQSSSS9nUR                  S:X  a  UR                  R                  5       $ g!    GN`= f!    N= f!    N= f! , (       d  f       g= f!    N,= f! [         a  n[        SU 35         SnAgSnAff = f)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.modelrI   zError obteniendo marca: Desconocido)r   
subprocessrun
returncodestdoutstripwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExCloseKeyr.   readr2   r+   )r   	resultadomanufacturerr|   key_r4   r5   s           r   obtener_marca_computadora(SystemReporter.obtener_marca_computadora   s   B	2||y( * S'+! "	!I !++q0'0'7'7'='='?'L<T,T#//
	! ..)B)B(KMC&,&9&9#?S&TOLOOC(#8P(P++ ( *B'+! "	!I !++q0'0'7'7'='='?'L<T,T#//
<cBa'(vvx~~'7'L<T,T#/ CBB(  )&NN0#'		 ''1,$++1133
 k CB( !  	2,QC011	2s   G. AG  &AG :G. AG  G' ,-G	G' #G' ,AG.  GG. G
G. GG. 
G$ G' $G' 'G+)G. .
H8HHc                 L    U R                   S:X  ad   SSKnUR                  UR                  S5      nUR	                  US5      u  p4 UR	                  US5      u  pTU SU 3nUR                  U5        U$ U R                   S:X  a   [#        SS5       n	U	 Hr  n
U
R%                  S5      (       d  M  U
R'                  S5      S   R                  5       R                  S5      n[        R(                  " 5       nU SU S3s  sSSS5        $    SSS5         [        R                  " SS/S
S
SS9nUR                  S:X  a  UR                  R                  5       $  [        R(                  " 5       $ U R                   S:X  a]   [        R                  " SS/S
S
SS9nUR                  S:X  a  UR                  R                  5       $  [        R,                  " 5       S   $  [        R                   " 5       $ ! [
         a    [        U5      n GNf = f! [         a  n[        SU 35         SnAOSnAff = f [        R                  " / S	QS
S
SS9nUR                  S:X  a9  UR                  R                  5       (       a  UR                  R                  5       $ O! [         a     Of = f[        R                   " 5       $ ! , (       d  f       GN= f! [*         a     GNf = f! [         a     GNf = f! [         a     GN9f = f! [         a  n[        SU 35         SnAGNBSnAff = f)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
rh   r   Nz,SOFTWARE\Microsoft\Windows NT\CurrentVersionCurrentBuildUBR.z#Error leyendo registro de Windows: )ri   rj   z(Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").CurrentBuild + "." + (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").UBRTr<   rk   rq   z/etc/os-releaser   zVERSION_ID==r   "z	 (kernel )unamez-rrI   rt   sw_versz-productVersionu"   Error obteniendo versión del SO: )r   r|   r}   r~   r   WindowsErrorstrr   r2   r+   rw   rx   ry   rz   r{   r
   versionr.   
startswithsplitreleaseFileNotFoundErrormac_ver)r   r|   r   current_buildr   ubrversion_completar5   r   r4   liner   kernels                r   !obtener_version_sistema_operativo0SystemReporter.obtener_version_sistema_operativo   s#   
V	<||y(E! ..11GC (.':':3'O$M>!'!4!4S%!@.;_AcU+C( OOC(++* (	/5$%D#}==*.**S/!*<*B*B*D*J*J3*O)1)9)9);*1)F81'E E 65$% 6
 * $'+! !	!I !++q0(//5577 1
  '')))
 *"$56'+! !	!I !++q0(//5577 1
  '')!,, *$ !!O ( >+.}+=(>
 ! E?sCDDE *M'+! "!I !++q0Y5E5E5K5K5M5M(//5577    ''))
 65 )  !  ! 
  	<6qc:;;	<s.  L  4H G1 #H 6L  K J;1AJ; 	K 
J;K AK L  .L  ?AK/ L  1H
H 	H

H 
H/H*%L  *H//L  3A!J L  
J# L  "J##L  ;
K
K L  
K 
KL  KL  
K,(L  +K,,L  /
K=9L  <K==L   
L#
LL#c                    SnU R                  5       n[        SU 35        [        U5       Hk  n U R                  S    SU R                  S    3nSS0nSU0n[        R
                  " XFUS	S
9nUR                  5         [        SUR                   35          g   [        S5        g! [        R                  R                   a    [        SUS-    SU 35         O[        R                  R                   a    [        SUS-    SU 35         OX[        R                  R                   a  n[        SU 35         SnAO(SnAf[         a  n[        SU 35         SnAOSnAff = fX1S-
  :  d  GME  [        R                  " SU-  5        GMa  )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<   r/   headersr>   u3   Versión del SO actualizada exitosamente - Status: Tu+   Timeout actualizando versión SO - intento r   rG   u6   Error de conexión actualizando versión SO - intento u%   Error HTTP actualizando versión SO: Nu+   Error inesperado actualizando versión SO: rH   u5   ADVERTENCIA: No se pudo actualizar la versión del SOF)r   r+   rJ   r   rK   putrM   status_coderQ   rR   rS   rT   r2   rU   rV   )	r   rW   
version_sorX   rY   r   bodyr?   r5   s	            r   actualizar_version_so$SystemReporter.actualizar_version_so1  s   ;;=
.zl;<\*GIY/00KDKKXgLhKij)+=>1:>#<<QST))+KHL`L`Kabc +6 	EF! &&.. bCGaK=PQR^Q_`a&&66 mNwYZ{m[\]i\jkl&&77 C=aSABB ICA3GHHI ))

1<(s0   A'B''2E#1E#E#+D>>E#EE#c                     U R                   S:X  a   [        R                  " / SQSSSS9nUR                  S:X  a)  UR                  R                  5       nU(       a  US;  a  U$  SSKnUR                  UR                  S	5      nUR                  US
5      u  p%UR                  U5        U(       a  US;  a  U$ GO5U R                   S:X  a   [        R                  " / SQSSSS9nUR                  S:X  a)  UR                  R                  5       nU(       a  US;  a  U$  [        SS5       nUR                  5       R                  5       nU(       a  US;  a  UsSSS5        $ SSS5        gU R                   S:X  au  [        R                  " SS/SSSS9nUR                  S:X  aL  UR                  R                  S5       H-  nSU;   d  M  UR                  S5      S   R                  5       s  $    g!    GN= f!    N= f!    N= f! , (       d  f       g= f!    N,= f! [         a  n[        SU 35         SnAgSnAff = f)u'   Obtiene el número de serie del sistemarh   )ri   rj   zRGet-CimInstance -ClassName Win32_BIOS | Select-Object -ExpandProperty SerialNumberTr<   rk   r   )rn   Default string0Nro   SystemProductName)rn   r   rq   )rr   rs   zsystem-serial-numberz /sys/class/dmi/id/product_serialr   rt   system_profilerSPHardwareDataTyperI   
zSerial Number:r   u#   Error obteniendo número de serie: rv   )r   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r.   r   r   r2   r+   )	r   r   serialr|   r   r   r4   r   r5   s	            r   obtener_numero_serie#SystemReporter.obtener_numero_serieV  s@   D	=||y( * I'+! "	!I !++q0!*!1!1!7!7!9!f4e&e#)M
	! ..)B)B(KMC & 3 3C9L MIFOOC(&0\"\% ( *C'+! "	!I !++q0!*!1!1!7!7!9!f4`&`#)M
@#F!!"!1!f4`&`#) GFF,  )&NN&(<=#'		 ''1, ) 0 0 6 6t <*d2#'::c?1#5#;#;#== != o GF, %  	=7s;<<	=s   H  AG2 &AG: :H  AH  H ,-H	H #H ,AH  #H  /H  2G74H  :G><H  HH  
HH H HH   
I*H==Ic                      SSK nUR                  5       nUR                  SS5      n[        R                  " 5        S[        R                  " 5        3U R                  U R                  5       U R                  5       US.$ ! [         a!    [        R
                  " 5       =(       d    Sn Nf = f! [         a*  n[        SU 35        SU R                  SSSS.s SnA$ SnAff = f)u(   Obtiene información básica del sistemar   N	brand_rawrv    )	soTecnicohostnameTecnicomarcaTecnicoserialTecnicoprocesadorTecnicou'   Error obteniendo información básica: )cpuinfoget_cpu_inforL   ImportErrorr
   	processorr   r   r   r   r   r2   r+   )r   r   cpu_infoprocesador_modelor5   s        r   obtener_info_basica"SystemReporter.obtener_info_basica  s    	J"//1$,LLm$L!
 !) 12!H4D4D4F3GH#'#5#5 $ > > @!%!:!:!<%6   J$,$6$6$8$IM!J  	;A3?@*#'#5#5 -!.%2 	s;   &B AB0 (B-*B0 ,B--B0 0
C$:CC$C$c                    Sn[        S5        U R                  5       n[        SUS    35        [        SUS    35        [        SUS    35        [        S	US
    35        [        SUS    35        [        U5       Hg  n U R                  S    SU R                  S    3nSS0n[        R
                  " XBUSS9nUR                  5         [        SUR                   35          g   [        S5        g! [        R                  R                   a    [        SUS-    SU 35         O[        R                  R                   a    [        SUS-    SU 35         OX[        R                  R                   a  n[        SU 35         SnAO(SnAf[         a  n[        SU 35         SnAOSnAff = fX1S-
  :  d  GMA  [        R                  " SU-  5        GM]  ) 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   rG   u8   Error de conexión actualizando info técnica - intento u'   Error HTTP actualizando info técnica: Nu-   Error inesperado actualizando info técnica: rH   u;   ADVERTENCIA: No se pudo actualizar la información técnicaF)r+   r   rJ   r   rK   r   rM   r   rQ   rR   rS   rT   r2   rU   rV   )r   rW   info_basicarX   rY   r   r?   r5   s           r   actualizar_info_tecnica&SystemReporter.actualizar_info_tecnica  s   EF..0{;/012[):;<=>	+n5678
;789:{+>?@AB\*GKY/00HUdIeHfg)+=>#<<wXZ[))+QRZRfRfQghi +4 	KL! &&.. dEgPQk]RST`Sabc&&66 oPQX[\Q\P]]^_k^lmn&&77 E?sCDD KEaSIJJK ))

1<(s1   A#C552F1)1F1F19FF1F,,F1c           	           [        [        R                  " SS9=(       d    [        R                  " 5       5      [        [        [        R                  " SS9S5      5      S.$ ! [
         a    SSS.s $ f = f)	u0   Obtiene información del procesador - optimizadoF)logicalg?)intervalr   )procesadorNucleosprocesadorUsoPorcentajer   0.0)r   psutil	cpu_countroundcpu_percentr2   r   s    r   obtener_info_procesador&SystemReporter.obtener_info_procesador  sm    	P%()9)9%)H)^FL\L\L^%_+.uV5G5GQT5UWX/Y+Z   	P),OO	Ps   A A# #A54A5c                      [         R                  " 5       n[        [        UR                  S-  S5      5      [        [        UR
                  S5      5      S.$ ! [         a    SSS.s $ f = f)u(   Obtiene información de RAM - optimizado   @r]   r   )ramCapacidadGbramUsoPorcentajer   )r   virtual_memoryr   r   totalpercentr2   )r   vms     r   obtener_info_ramSystemReporter.obtener_info_ram  si    	H&&(B"%eBHH,@!&D"E$'bjj!(<$=   	H&+GG	Hs   AA A+*A+c                      [         R                  " 5       nU(       a-  S[        [        UR                  S5      5      UR
                  S.$  SSSS.$ ! [         a     Nf = f)u-   Obtiene información de batería - optimizadoTr   )bateriaInstaladabateriaCargaPorcentajebateriaConectadaFr   )r   sensors_batteryr   r   r   power_pluggedr2   )r   batterys     r   obtener_info_bateria#SystemReporter.obtener_info_bateria  so    		,,.G(,.1%2K.L(/(=(=   !&&) %
 	
  		s   AA 
AAc                     [         R                  " 5       n[        R                  " S5        [         R                  " 5       nU(       a  U(       a~  UR                  UR                  -
  nUR
                  UR
                  -
  nUS-  S-  nUS-  S-  nSn[        SXW-  S-  5      n[        SXg-  S-  5      n	[        US5      [        U	S5      4$ g! [         a     gf = f)u,   Obtiene estrés de disco con muestra rápida      ?i   d   r           r   )	r   disk_io_countersrU   rV   
read_byteswrite_bytesminr   r2   )
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_rapido*SystemReporter.obtener_estres_disco_rapido  s    	$557OJJsO"335M=*558R8RR
+77/:U:UU",s"2{!C#.#4"E$'!!#(Jc'QR"3)LPS(ST[!,eL!.DDD   		s   CC 
CCc                 "   / n [         R                  " 5       nU R                  5       u  p4U H  n UR                  S;   a  M  [         R                  " UR
                  5      nUR                  UR                  [        [        UR                  S-  S5      5      [        [        UR                  UR                  -  S-  S5      5      [        U5      [        U5      S.5        M     U$ ! [        [        4 a     M  f = f! [         a     U$ f = f)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OSErrorr2   )r   discos
partitionsavg_read	avg_write	partitionusages          r   obtener_info_discos"SystemReporter.obtener_info_discos&  s    	//1J"&"B"B"DH'	 ''+DD "--i.B.BCEMM+4+;+;'*51H!+L'M),UEJJ4LPS3SUV-W)X-0]/29~#  (&  (1  		sA   ,D  C)D  B C)#D  )C=9D  <C==D   
DDc                 ^    [         R                  " SS9U   n[        R                  " S5        [         R                  " SS9U   nUR                  UR                  -
  nUR
                  UR
                  -
  n[        US-  S-  S5      n[        US-  S-  S5      nXg4$ ! [         a     gf = f)u.   Obtiene velocidad de red con medición rápidaT)pernicr      g       Ar]   r   )r   net_io_countersrU   rV   
bytes_sent
bytes_recvr   r2   )r   interfazstats_inicialstats_finalbytes_up
bytes_downmbps_up	mbps_downs           r   obtener_velocidad_red_rapida+SystemReporter.obtener_velocidad_red_rapidaB  s    	"22$?IMJJsO 00=hGK"--0H0HHH$//-2J2JJJX\.?@!DGzA~2CDaHI%% 		s   BB 
B,+B,c                     [         R                  " 5       R                  U/ 5      nU H  nUR                  [        R
                  :X  d  M#  UR                  (       aj   [        UR                  R                  S5       Vs/ s H&  n[        [        U5      5      R                  S5      PM(     sn5      nUR                   SU 3s  $ UR                  s  $    gs  snf !   UR                  s s  $ = f! [         a     gf = f)z'Obtiene IP de una interfaz - optimizador   1rG   N/A)r   net_if_addrsrL   familyr   AF_INETnetmasksumr   binintcountaddressr2   )r   r  addrsaddrxcidrs         r   obtener_ip_interfaz"SystemReporter.obtener_ip_interfazS  s    	'')--h;E;;&..0||0#&HZHZ[^H_'`H_1CF(9(9#(>H_'`#aD&*ll^1TF#;;  <<'   (a0#'<</ 		sT   AC2 C2 "C -C
-CC2 C2 C2 CC/+C2 /C2 2
C?>C?c                      [         R                  " 5       R                  U/ 5      nU H/  nUR                  [         R                  :X  d  M#  UR
                  s  $    g! [         a     gf = f)z(Obtiene MAC de una interfaz - optimizador(  )r   r)  rL   r*  AF_LINKr1  r2   )r   r  r2  r3  s       r   obtener_mac_interfaz#SystemReporter.obtener_mac_interfazd  sb    	'')--h;E;;&..0<<' 
   		s   AA A A 
A*)A*c                   ^ / n [         R                  " 5       nUR                  5        H  u  mn[        U4S jS 5       5      (       a  M"  U R	                  T5      nUR
                  (       d  US:X  a  ML  U R                  T5      u  pVUR                  TU R                  T5      UUR
                  [        U5      [        U5      S.5        M     U$ ! [         a     U$ f = f)u6   Obtiene información de interfaces de red - optimizadoc              3   H   >#    U  H  oTR                  5       ;   v   M     g 7f)N)lower).0skipr  s     r   	<genexpr>4SystemReporter.obtener_info_redes.<locals>.<genexpr>w  s#       =Dx~~// =s   ")loopbackvmware
virtualboxdocker	vethernetteredoisatap6to4r(  )nombremacip	estadoRedvelocidadSubidaMbpsvelocidadBajadaMbps)r   net_if_statsitemsanyr6  isupr$  r  r:  r   r2   )r   
interfacesrQ  statsrM  velocidad_upvelocidad_downr  s          @r   obtener_info_redes!SystemReporter.obtener_info_redeso  s    
	!..0L#/#5#5#7%  =     --h7zzbEk/3/P/PQY/Z,!!&44X>!&+.|+<+.~+>#  $84   		s   CC 
C C c                 Z    [        USS9nUb)  [        [        US5      5      n[        SU SU S35        U$ [        SU S	35        g
! [         a    [        SU S35         g
[
         a  n[        SU SU 35         SnAg
SnAf[         a  n[        SU SU 35         SnAg
SnAff = f)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  r2   )r   	direccionlatencialatencia_strr5   s        r   hacer_ping_nmapSystemReporter.hacer_ping_nmap  s    	 Ir2H#"51#561)B|nANO## i[56 	6ykAjkl 	1)BqcBC 	'	{"QC89	s.   5A A B*#	B*,BB*B%%B*c           	      V    [        SU SU 35        [        R                  " [        R                  [        R                  5      nUR	                  S5        UR                  X45      nUR                  5         US:H  nU(       a  [        SU SU S35        U$ [        SU SU S35        U$ ! [        R                   a  n[        SU S	U 35         S
nAgS
nAf[        R                   a    [        SU SU 35         g[         a  n[        SU SU S	U 35         S
nAgS
nAff = f)u?   Verifica si un puerto está abierto usando socket (TCP connect)z    Verificando puerto z en rH   r   z    Puerto z: openz: closed/filteredz    Error DNS al verificar r\  NFz    Timeout verificando puerto z    Error verificando puerto )
r+   r   r+  SOCK_STREAM
settimeout
connect_exclosegaierrorr>   r2   )r   r^  puertosockr   puerto_abiertor5   s          r   verificar_puertoSystemReporter.verificar_puerto  s(   	+F84	{CD ==1C1CDDOOA (;<IJJL (1nNF84	{&AB "! F84	{:KLM!! 	/	{"QC@A~~ 	3F84	{KL 	1&i[1#NO	s0   BB- B- -D(C(D(	D(
D##D(c                    / nU R                   (       a  SU R                   ;  a  [        S5        U$ U R                   S   nU H  n UR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  S	U S
U 35      nUR                  SS5      nU(       d  Ml  USS[        U5      SUS.n	U(       a1  U R	                  U5      n
XS'   US:  a  U R                  XE5      nXS'   O0US:  a  U R                  XE5      nXS'   U R	                  U5      n
XS'   UR                  U	5        M     U$ ! [         a  n[        SU SU 35         SnAGM  SnAff = f)uS   Obtiene latencia de ping y verificación de puertos basado en configuración remotarF   z-No hay servicios configurados para monitorearr^  r   ri  r   tipoServicioTdescripcionr   
servicioIdr   F)nombreDestinorespuestaMs
esRevisionnombrePuertorespuestaPuertorq  rs  rv  zError procesando servicio r\  N)r   r+   rL   r   ra  rl  r  r2   )r   	latenciasrF   servicior^  ri  tipo_serviciorp  servicio_idlatencia_entrylatencia_msrk  r5   s                r   obtener_latencia_ping$SystemReporter.obtener_latencia_ping  s   	((Kt?X?X,XAB--k:	!H)$LLb9	!h2 (^T B&ll=YKq:QR&ll<;  &/#("&$'K',"-" !"&"6"6y"AK4?=1 z)-)>)>y)Q<J'89 z)-)>)>y)Q<J'89 #'"6"6y"AK4?=1  0M "X 	  28*BqcBCs    A&D?.BD??
E&	E!!E&c           
      n   Sn[        U5       HX  n U R                  S    S3nSS0n[        R                  " XAUSS9nUR	                  5         [        SUR                   35          g	   [        S5        g! [        R                  R                   a<    [        S
US-    SU 35        X2S-
  :  a  [        R                  " SU-  5         M   M  [        R                  R                   a>    [        SUS-    SU 35        X2S-
  :  a  [        R                  " SU-  5         GM   GM  [        R                  R                   aK  n[        SUS-    SU SU 35        X2S-
  :  a   [        R                  " SU-  5         SnAGMw   SnAGM~  SnAf[         a  n[        SU 35         SnA  GME  SnAff = f)u7   Envía los datos a la API con manejo robusto de erroresr;   r#   z/v1/revisionr   r   r   r   z&Datos enviados exitosamente - Status: TzTimeout en intento r   rG   rH   u   Error de conexión en intento zError HTTP en intento r\  NzError inesperado: uE   FALLO: No se pudieron enviar los datos después de todos los intentosF)rJ   r   rK   postrM   r+   r   rQ   rR   rU   rV   rS   rT   r2   )r   datosrW   rX   rY   r   r?   r5   s           r   enviar_datos_apiSystemReporter.enviar_datos_api  s   \*GY/0=)+=>#=='SUV))+>x?S?S>TUV +< 	UV) &&.. -+GaK=,HIA--JJqG|, . &&66 -6w{m1\NSTA--JJqG|,, . &&77 -.w{m1\N"QCPQA--JJqG|,, .  *1#./s2   AA66AF4AF4)F48FF4F//F4c                     [        S[        R                  " 5       R                  S5       35        [        R                  " 5       R	                  5       nU R                  5       nU R                  5       nU R                  5       nU R                  5       nU R                  5       nU R                  5       nU R                  S   UUS   US   US   US   US   US	   US
   U R                  UUUS.n[        SUS    SUS    S35        [        S[        U5       35        U R                  U5      n	U	$ ! [         a  n
[        SU
 35         Sn
A
gSn
A
ff = f)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   rN   strftime	isoformatr   r   r   r  rY  r}  r   r   rP   r  r2   )r   r  info_procesadorinfo_raminfo_bateriainfo_discos
info_redeslatencia_ping	datos_apir   r5   s              r   recolectar_y_enviar"SystemReporter.recolectar_y_enviar-  s   )	-hlln.E.EFY.Z-[\]lln..0G #::<O,,.H446L 224K002J 668M "&_!="%45H%I+:;T+U"*+;"<$,-?$@$01C$D*67O*P$01C$D ..%#-!.I  2?C\3]2^^fgo  qC  hD  gE  EF  G  H,S-?,@AB --i8I 	+A3/0	s   D0D3 3
E=EEc           	         U R                   (       d  [        S5        gU R                   S   S-  n[        S5        [        SU R                  S    35        [        SU R                   35        [        S	U R                   S    S
35        [        SU R                  S    35        [        S[	        U R                   R                  S/ 5      5       35        [        S5        [        S5        U R                  5         U R                  5         [        S5        U R                  5         U R                  (       a   [        SU R                   S    S35        SnSnX!:  a  U R                  (       a  [        X1U-
  5      n[        R                  " U5        X$-  nX#S-  -  S:X  a:  U R                  5       (       a%  U R                   S   S-  nXQ:w  a  [        S5        UnOX!:  a  U R                  (       a  M  U R                  (       a  U R                  5         U R                  (       a  M  gg! [         a    [        S5        SU l	         g[         a9  n[        SU 35        [        S5        [        R                  " S5         SnANpSnAff = f)zLoop principal del agenteuD   ERROR: No se pudo obtener configuración inicial. Deteniendo agente.NrB   <   zAGENTE INICIADOzDispositivo ID: r$   z
Hostname: zIntervalo: rD   zAPI: r#   rE   rF   z<------------------------------------------------------------z=
============================================================z=============================================================
z
Esperando u'    minutos hasta próxima recolección...r      rH   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   rP   rL   r   r   r  r   r   rU   rV   re   KeyboardInterruptr2   )r   intervalo_segundostiempo_esperaintervalo_checktiempo_chunknuevo_intervalor5   s          r   ejecutar_loopSystemReporter.ejecutar_loopZ  s?   ((XY!667HIBN! _!= >?@
4--./0D556GHIRSdkk),-./(T-F-F-J-J;XZ-[)\(]^_h 	o$$&""$o 	  "oo 
4#<#<=N#O"PPwxy !""$#8T__#&]8Z#[LJJ|,!1M %!(;<AEEGG.2.G.GHY.Z]_._O.D %(b d5D 2 % $8T___ ??,,.1 ooo4 % ./"' 1!5612

2s%   9B9H* 4!H* *J
	J
/JJ
c                     SU l         g)z!Detiene el agente de forma seguraFN)r   r   s    r   detenerSystemReporter.detener  s	    r   )r   r   r   r   r   r   N) __name__
__module____qualname____firstlineno__r   r   r   rO   re   r   r   r   r   r   r   r   r   r   r   r  r$  r6  r:  rY  ra  rl  r}  r  r  r  r  __static_attributes__ r   r   r   r      s    	,:4l@&FP]"~#JHT8(TP	H
&08""	 D8!F6p#J+Z:x r   r   c                       [        5       n U R                  5         g! [         a    [        S5         g[         a     g[
         a.  n[        SU 35        [        R                  " S5         SnAgSnAff = f)u!   Función principal - simplificadaz
Agente detenido por el usuariozERROR CRITICO: r   N)r   r  r  r+   
SystemExitr2   r,   r-   )reporterr5   s     r   mainr    sc    
!#  201  s#$s    A6	A6	A6$A11A6__main__)r   r
   r   r/   rw   rU   rK   r   r   r%   re	threadingr,   ping3r   r   r  r  r  r   r   <module>r     sR           ( 	 	  
 I  I V zF r   