
    jh              	          d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZmZmZmZmZ d dlZd dlZd dlmZ  ee      ZdZ eedd      Z ej0                  d	      Zej5                  e       ej6                  j9                  e       ej6                  j;                  ej<                          e
       Zd
 Z de!de"fdZ#de!de!de!de!dz  fdZ$ejK                  d      d        Z&ejK                  ddg      d        Z'y)    N)Flaskrender_templaterequestjsonify)getCmd
SnmpEngineCommunityDataUdpTransportTargetContextData
ObjectTypeObjectIdentity)RotatingFileHandlerz/usr/src/app/uptime.logi    )maxBytesbackupCountz4%(asctime)s - %(name)s - %(levelname)s - %(message)sc                      t        dd      5 } t        j                  |       }ddd       g }r0|j                         D ]  \  }}|}||d<   |j	                  |        |j                  d        |S # 1 sw Y   RxY w)u=   Carrega a configuração dos roteadores do arquivo hosts.yml.zapp/hosts.ymlrNroteadorc                     | d   S )NdisplayName )xs    /usr/src/app/app/main.py<lambda>zload_routers.<locals>.<lambda>%   s	    Am$4    )key)openyaml	safe_loaditemsappendsort)fileconfigrouters_list	router_iddetailsrouter_datas         r   load_routersr)      s    	os	#t% 
$ L"(,,.Iw!K&/K
#, #1
 45 
$	#s   A44A=ipreturnc                 ,   t        j                         j                         dk(  rdnd}d|ddd| g}	 t        j                  |t        j
                  t        j
                  d      }|j                  d	k(  S # t        j                  t        f$ r Y y
w xY w)z1Verifica a conectividade com um host usando ping.windowsz-nz-cping1z-W   )stdoutstderrtimeoutr   F)	platformsystemlower
subprocessrunDEVNULL
returncodeTimeoutExpiredFileNotFoundError)r*   paramcommandresponses       r   check_host_connectivityr@   (   s    OO%++-:DEuc4b1G>>'*2D2DZM_M_ijk""a''%%'89 s   AA7 7BB	communityoidc                    t        t        t        |      t        | dfdd      t	               t        t        |                  \  }}}}|r&t        j                  j                  d|  d|        y|rS|j                         }t        j                  j                  d|  d| d	|xr |t        |      dz
     d
   xs d        y|s$t        j                  j                  d|  d       yt        |d
   d         }|dz  }	t        |	d      \  }
}t        |d      \  }}t        |d      \  }}t        |
       dt        |       dt        |       dt        |       dS )z:Consulta o uptime via SNMP e retorna uma string formatada.   g      ?   )r3   retrieszErro de SNMP para o IP z: NzErro de Status SNMP para o IP z em r   ?zAviso de SNMP para o IP u,   : Nenhuma variável (varBinds) foi recebida.d   iQ i  <   z dias, zh zm s)r   snmp_enginer	   r
   r   r   r   apploggererrorprettyPrintintwarningdivmod)r*   rA   rB   errorIndicationerrorStatus
errorIndexvarBindserror_message	timetickstotal_secondsdaysremhoursminutessecondss                  r   get_snmp_uptimer_   2   s   9?i B9c1=>#&':6O[*h 

22$b8IJK	#//1

9"RdS]  TCbjknoykz}~k~b  AB  cC  TJ  GJ  SK  L  	MJJ!9"=ijkA'	!C=%0	cC&
s!#r?d)GCJ<r#g,r#g,qQQr   /c                  0    t               } t        d|       S )u6   Renderiza a página inicial com a lista de roteadores.z
index.htmlrouters)r)   r   rb   s    r   indexrd   N   s     nG<99r   z/check_uptimePOST)methodsc            
         t         j                  j                  d      t         j                  } t        j
                  j                  d|  d d       st        ddd      dfS t               }t        fd	|D        d
      }|st        ddd      dfS |d   }t        |      s:t        j
                  j                  d d| d|         t        dd| dd      S t        ||d   |d         }|r9t        j
                  j                  d d| d| d|         t        d|d      S t        j
                  j                  d d| d|         t        dd| dd      S )zBEndpoint da API para verificar o status e o uptime de um roteador.r&   u   Requisição recebida de z para consultar o roteador ''rN   u   ID do roteador não fornecido.)statusmessagei  c              3   4   K   | ]  }|d    k(  s|  yw)r   Nr   ).0r   r&   s     r   	<genexpr>zcheck_uptime.<locals>.<genexpr>`   s     KW*0J!Ws   Nu   Roteador não encontrado.i  r*   zFalha no ping para o roteador 'z	' com IP z. Cliente: DOWNzO host u     não está respondendo ao ping.rA   rB   zUptime para 'z' (z) obtido com sucesso: UP)ri   uptimez&Consulta SNMP falhou para o roteador 'u#    após ping bem-sucedido. Cliente: ERRORu]    está online, mas a consulta SNMP falhou. Verifique a community e as regras de firewall/ACL.)r   jsongetremote_addrrL   rM   infor   r)   nextr@   rQ   r_   rN   )	client_iprc   target_routerr*   rp   r&   s        @r   check_uptimery   T   s      -I##IJJOO/	{:VW`Vaabcd'6VWXZ]]]nGKWKTRM'6QRSUXXX	t	B"2&

<YKyQSPTT_`i_jkl&wrdBb5cdeeR{!;]5=QRF

-	{#bT9OPVxWbclbmno$&9::

A)IVXUYY|  ~G  }H  I  	J't  Da  7b  c  d  	dr   )(r   r7   r4   flaskr   r   r   r   pysnmp.hlapir   r   r	   r
   r   r   r   oslogginglogging.handlersr   __name__rL   log_file_pathhandler	Formatter	formattersetFormatterrM   
addHandlersetLevelINFOrK   r)   strboolr@   r_   routerd   ry   r   r   r   <module>r      s      : : w w w 	  0Ho *
mhA
NGTU	   Y  

  g  

  GLL ! l  R R R# R3: R8 3: :
 ?VH-d .dr   