o
    ɘehwj                     @   s   d 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ZddlmZm	Z	 ddl
mZmZ ddlZddlZeeZG dd dZdd ZG d	d
 d
ZG dd dZedkrke Ze Zeejeded dS dS )u   
Module de surveillance avancée pour NeuroPulse Monitor Pro
Collecte des métriques système détaillées et analyse les performances
    N)datetime	timedelta)defaultdictdequec                   @   sr   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )SystemMonitoru8   Classe principale pour la surveillance système avancéeNc                 C   sF   |pi | _ i | _d| _tdd| _tdd | _i | _tdd| _d S )N   i,  maxlenc                   S   s
   t ddS )N<   r   )r    r   r   !/var/www/html/utils/monitoring.py<lambda>   s   
 z(SystemMonitor.__init__.<locals>.<lambda>  )	configcachecache_timeoutr   network_historyr   process_historylast_network_statsalert_historyselfr   r   r   r   __init__   s   
zSystemMonitor.__init__c                 C   s   z-t   |  |  |  |  |  |  | 	 | 
 |  d
}| ||d< |W S  tyI } ztd|  i W  Y d}~S d}~ww )u*   Collecte complète des métriques système)
	timestampcpumemorydisknetwork	processesservicessystemsecurityperformance	anomaliesu+   Erreur lors de la collecte des métriques: N)r   now	isoformat_get_cpu_metrics_get_memory_metrics_get_disk_metrics_get_network_metrics_get_process_metrics_get_service_metrics_get_system_info_get_security_metrics_get_performance_metrics_detect_anomalies	Exceptionloggererror)r   metricser   r   r   get_system_metrics!   s&   
z SystemMonitor.get_system_metricsc           
      C   s  zt  }t  }t  }t jddd}i }z$t  }| D ]\}}d| v s/d| v r8dd |D ||< qW n   Y tt jddd	d
d |D t j	ddt j	dd|r_t|j
d	nd|rht|jd	nd|rqt|jd	ndd|j|j|jt|ddt|ddt|ddd|j|j|jt|dddttdrtt ng d|d	W S  ty }	 ztd|	  i W  Y d}	~	S d}	~	ww )u   Métriques CPU détailléesg?T)intervalpercpur   corec                 S   s   g | ]}|j qS r   )current).0sensorr   r   r   
<listcomp>J   s    z2SystemMonitor._get_cpu_metrics.<locals>.<listcomp>)r6      c                 S   s   g | ]}t |d qS )r=   )round)r:   pr   r   r   r<   P   s    )logicalFr   )r9   minmaxiowaitirqsoftirq)userr    idlerC   rD   rE   syscalls)ctx_switches
interruptssoft_interruptsrH   
getloadavg)r   r   r   )	percentpercent_per_corecount_logicalcount_physical	frequencytimesstatsload_avgtemperatureszErreur CPU metrics: N)psutil	cpu_times	cpu_statscpu_freqcpu_percentsensors_temperaturesitemslowerr>   	cpu_countr9   rA   rB   rF   r    rG   getattrrI   rJ   rK   hasattroslistrL   r0   r1   r2   )
r   rW   rX   rY   cpu_percent_per_corerU   sensorsnameentriesr4   r   r   r   r&   :   sV   




	
zSystemMonitor._get_cpu_metricsc                 C   s   zEt  }t  }|j|jt|jd|j|jt	|ddt	|ddt	|ddt	|ddt	|ddd
|j|j|jt|jd|j
|jd	d
W S  tya } ztd|  i W  Y d}~S d}~ww )u    Métriques mémoire détailléesr=   activer   inactivebufferscachedshared)
total	availablerM   usedfreerg   rh   ri   rj   rk   )rl   rn   ro   rM   sinsout)virtualswapzErreur memory metrics: N)rV   virtual_memoryswap_memoryrl   rm   r>   rM   rn   ro   r_   rp   rq   r0   r1   r2   )r   virtual_memswap_memr4   r   r   r   r'   n   s6   






z!SystemMonitor._get_memory_metricsc              
   C   sX  zi }t jdd}t  D ]2}z%|jr3t |j}|j|j|j|j|jt	|j|j d dd||j
< W q ttfy?   Y qw t  }|rI|jnd|rO|jnd|rU|jnd|r[|jnd|ra|jnd|rg|jndd}i }|r| D ]\}}	|	j|	j|	j|	j|	j|	jd||< qs|||dW S  ty }
 ztd	|
  i W  Y d
}
~
S d
}
~
ww )u   Métriques disque détailléesT)perdiskd   r=   )
mountpointfstyperl   rn   ro   rM   r   )
read_countwrite_count
read_byteswrite_bytes	read_time
write_time)usage	io_globalio_per_diskzErreur disk metrics: N)rV   disk_io_countersdisk_partitionsr{   
disk_usagerz   rl   rn   ro   r>   devicePermissionErrorFileNotFoundErrorr|   r}   r~   r   r   r   r\   r0   r1   r2   )r   r   disk_io	partitionr   total_ioio_statsr   r   rS   r4   r   r   r   r(      sZ   

zSystemMonitor._get_disk_metricsc              
   C   s  zt  }t jdd}t  }t|tdd |D tdd |D tdd |D d}t }ddd	}d
| jv rf|| jd
  }|dkrf|j| jdd }|j| jdd }	|| |d< |	| |d< |j|j|d| _i }
t 	 
 D ]!\}}g |
|< |D ]}|jtjkr|
| |j|j|jd qqw|j|j|j|j|j|j|j|jd|||d |d t|d d dt|d d dd|
dW S  ty } ztd|  i W  Y d}~S d}~ww )u   Métriques réseau avancéesT)pernicc                 S      g | ]	}|j d kr|qS )ESTABLISHEDstatusr:   cr   r   r   r<          z6SystemMonitor._get_network_metrics.<locals>.<listcomp>c                 S   r   )LISTENr   r   r   r   r   r<      r   c                 S   r   )	TIME_WAITr   r   r   r   r   r<      r   )rl   establishedlisten	time_waitr   )inoutnetwork_timestamp
bytes_recv
bytes_sentr   r   )r   r   r   )addressnetmask	broadcast)r   r   packets_sentpackets_recverrinerroutdropindropouti   r=   )bytes_in_per_secbytes_out_per_seckb_in_per_seckb_out_per_sec)globalper_interfaceconnectionsspeeds	addresseszErreur network metrics: N)rV   net_io_countersnet_connectionslentimer   r   getr   net_if_addrsr\   familysocketAF_INETappendr   r   r   r   r   r   r   r   r   r>   r0   r1   r2   )r   net_ionet_io_per_nicr   
conn_statscurrent_timer   	time_diffbytes_in_diffbytes_out_diffr   	interfaceaddrsaddrr4   r   r   r   r)      sr   



z"SystemMonitor._get_network_metricsc                 C   s  zg }d}d}d}d}g }g }t g dD ]}zq|j}	|d7 }|	d t jkr,|d7 }n|	d t jkr8|d7 }n|	d t jkrC|d7 }|	d |	d t|	d pOddt|	d	 pWdd|	d |	d
 |	d rnd|	d dd ndd}
|
d dkr}||
 |
d	 dkr||
 W q t j	t j
fy   Y qw t|dd dddd }t|dd dddd }||||||dW S  ty } ztd|  i W  Y d}~S d}~ww )u   Métriques des processusr   )pidre   rZ   memory_percentr   create_timenum_threadscmdline   r   r   re   rZ   r=   r   r   r    N    )r   re   rZ   r   r   r   r   c                 S      | d S )NrZ   r   xr   r   r   r   A      z4SystemMonitor._get_process_metrics.<locals>.<lambda>T)keyreverse
   c                 S   r   )Nr   r   r   r   r   r   r   B  r   )rl   runningsleepingzombietop_cpu
top_memoryzErreur process metrics: )rV   process_iterinfoSTATUS_RUNNINGSTATUS_SLEEPINGSTATUS_ZOMBIEr>   joinr   NoSuchProcessAccessDeniedsortedr0   r1   r2   )r   r   total_processesrunning_processessleeping_processeszombie_processestop_cpu_processestop_memory_processesprocr   process_datar4   r   r   r   r*     s`   

 


	z"SystemMonitor._get_process_metricsc                 C   s"  zg }| j dg }|D ]}|ddsq|d }||d||dd|dd	|d
dddi t  d
}ztjdd|gdddd}|j dk|d< tjdd|gdddd}|j dk|d< tjdd|dgdddd}i }|j 	dD ]}d|v r|	dd\}	}
|
||	< q{||d< |d
r|d
 }z t

t
jt
j}|d |d|f}|dk|d< |  W n   d|d< Y W n% tjy   d|d< Y n ty } zt||d< W Y d}~nd}~ww || q|W S  ty } ztd |  g W  Y d}~S d}~ww )!u"   Surveillance des services systèmeservices_to_monitorenabledTre   titleservice_typeServicecriticalityMoyenneportF)
re   r   typer   r   rg   r   	port_openstatus_details
last_check	systemctlz	is-activer   )capture_outputtexttimeoutrg   z
is-enabledshowz<--property=LoadState,ActiveState,SubState,MainPID,StatusText
=r   r   r=   	localhostr   r   u    Timeout lors de la vérificationr2   NzErreur service metrics: )r   r   r   r$   r%   
subprocessrunstdoutstripsplitr   r   SOCK_STREAM
settimeout
connect_excloseTimeoutExpiredr0   strr   r1   r2   )r   r   services_configservice_configservice_nameservice_inforesultdetailsliner   valuer   sockr4   r   r   r   r+   Q  s   






z"SystemMonitor._get_service_metricsc              
   C   s  zt t }t  | }z3tdd$}i }|D ]}d|v r0| dd\}}|d||< qW d   n1 s;w   Y  W n   i }Y g }t D ]}	|	|	j
|	j|	jt |	j d qNt tj
ttdrst jnd	ttdr~t jnd	ttdrt jnd	d
|| t| |j|jd |jd d d|tjjdW S  ty }
 ztd|
  i W  Y d}
~
S d}
~
ww )u!   Informations système généralesz/etc/os-releaserr   r   "N)re   terminalhoststartedunamezN/A)r    releaseversionmachinei  r
   )total_secondsdayshoursminutes)hostnameplatformos_info	boot_timeuptimeuserspython_versionzErreur system info: )r   fromtimestamprV   r%  r$   openr  r  r'  r   re   r  r  r  r%   r   gethostnamera   r`   r  r  r  r  intr  r  secondssysr0   r1   r2   )r   r%  r&  fr$  r  r   r  r'  rF   r4   r   r   r   r,     sZ   

zSystemMonitor._get_system_infoc              
   C   s  zpg g g g g d}z't jdd}t }|D ]}|jdkr&|jr&||jj qtt||d< W n   Y z4t 	g dD ](}z|j
d dkrW|d	 |j
d
 |j
d d W q= t jt jfye   Y q=w W |W S    Y |W S  ty } ztd|  i W  Y d}~S d}~ww )u   Métriques de sécurité)last_loginsfailed_logins
sudo_usage
open_portsrunning_as_rootinet)kindr   r3  )r   re   usernamer7  rootr4  r   re   )r   re   zErreur security metrics: N)rV   r   setr   laddraddr   r   rb   r   r   r   r   r   r0   r1   r2   )r   security_datar   listening_portsconnr   r4   r   r   r   r-     sN   	z#SystemMonitor._get_security_metricsc              
   C   s>  zdddddd}t  }t  }t| dr7t | j }|dkr7|j| jj | |d< |j| jj | |d< || _t | _t 	 }|j
dkrX|jt|dd |j
 d |d< t|d	rt|j|j|j|jt|d
dt|ddg}|dkr|j| d |d< |W S  ty } ztd|  i W  Y d}~S d}~ww )u)   Métriques de performance et optimisationr   )context_switches_per_secinterrupts_per_secmemory_pressureio_wait_timecache_hit_ratio_last_cpu_statsr?  r@  rj   ry   rA  rC   rD   rE   rB  zErreur performance metrics: N)rV   rX   rW   r`   r   _last_cpu_checkrI   rD  rJ   rt   rl   rn   r_   sumrF   r    rG   rC   r0   r1   r2   )r   	perf_datarX   rW   r   r   
total_timer4   r   r   r   r.     sN   	




z&SystemMonitor._get_performance_metricsc           
   
   C   sl  g }z| di  dd}|dkr#|ddd| dt  d	 | d
i  di  dd}|dkrG|ddd| dt  d	 | di  dd}|dkrf|ddd| t  d	 | di  di }| D ]#\}}| dddkr|ddd| d|d  dt  d	 qtW |S  ty }	 ztd|	  W Y d}	~	|S d}	~	ww )u   Détection d'anomalies basiquer   rM   r   _   cpu_criticalcriticalzCPU usage critically high: %)r   severitymessager   r   rr   b   memory_criticalzMemory usage critically high: r   r   r   r   warningz!High number of zombie processes: r   r   	disk_fullzDisk z critically full: u   Erreur détection anomalies: N)	r   r   r   r$   r%   r\   r0   r1   r2   )
r   r3   r#   rZ   r   zombie_countr   r   r   r4   r   r   r   r/   2  sV   





zSystemMonitor._detect_anomaliesN)__name__
__module____qualname____doc__r   r5   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r   r   r   r      s    
	4!8L>P3*4r   c               
   C   sj   t  } |  }|di dd|di di ddd|di |dg |di |d	g d
S )u1   Fonction de compatibilité avec l'ancien systèmer   rM   r   r   rr   r   r   r    r#   )r   ramr   r   r   r    r#   )r   r5   r   )monitorfull_metricsr   r   r   r5   f  s   



r5   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	AlertManageru   Gestionnaire d'alertes avancéc                 C   s   || _ tdd| _t | _d S )Nr   r   )r   r   r   r9  suppressed_alertsr   r   r   r   r   {  s   zAlertManager.__init__c                 C   s   g }| j di }|S )u!   Vérifier les conditions d'alertealert_thresholds)r   r   )r   r3   alerts
thresholdsr   r   r   check_alert_conditions  s   z#AlertManager.check_alert_conditionsc                 C      dS )zEnvoyer une notificationNr   )r   alertr   r   r   send_notification     zAlertManager.send_notificationN)rU  rV  rW  rX  r   rb  re  r   r   r   r   r]  x  s
    
r]  c                   @   r\  )	PerformanceAnalyzeru!   Analyseur de performance systèmec                 C   s   i | _ tt| _d S rT  )baseline_metricsr   rb   
trend_data)r   r   r   r   r     s   zPerformanceAnalyzer.__init__c                 C   rc  )z%Analyser les tendances de performanceNr   r   r3   r   r   r   analyze_trends  rf  z"PerformanceAnalyzer.analyze_trendsc                 C   rc  )u%   Prédire l'épuisement des ressourcesNr   rj  r   r   r   predict_resource_exhaustion  rf  z/PerformanceAnalyzer.predict_resource_exhaustionN)rU  rV  rW  rX  r   rk  rl  r   r   r   r   rg    s
    rg  __main__r=   )indentdefault)rX  rV   ra   r   r   r  jsonloggingr   r   collectionsr   r   	threadinghashlib	getLoggerrU  r1   r   r5   r]  rg  rZ  r3   printdumpsr  r   r   r   r   <module>   s4   
    U