ó
    JjB  ã                  óÚ   • S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJ	r	  Sr
Sq " S S	\R                  5      r " S
 S\R                  5      rS\R                  4SS jjrSS jrSS jrg)u™  Structured logging for the agent.

Logs go to stderr (and the rotating agent log file), NEVER stdout. Command
output â€” especially the JSON emitted by ``discover --full`` â€” must stay clean on
stdout so it can be piped (e.g. into ``python3 -m json.tool``) without log
pollution. A redact() helper masks token-like values; callers must NEVER pass
raw secrets to the logger. See SECURITY rules in the README.
é    )ÚannotationsN)ÚRotatingFileHandler)ÚPathz0%(asctime)s %(levelname)-7s %(name)s %(message)sFc                  ó˜   • \ rS rSrSr\R                  " S5      S4\R                  " S5      S4\R                  " S5      S4/rSS	 jrS
r	g)ÚRedactingFilteré   zcFilter to redact sensitive information (tokens, passwords, bearer headers, etc.) from log messages.zwp_[a-zA-Z0-9_]+zwp_***z$(?i)(bearer\s+)[a-zA-Z0-9_\-\.\+/=]+z\1***zm(?i)(token|password|authorization|bearer|install_token|install\s+token)(["\'\s]*[:=]["\'\s]*)([^\s"\'&,;\n]+)z\1\2***c                ó  • [        UR                  [        5      (       a8  UR                  nU R                   H  u  p4UR	                  XB5      nM     X!l        UR
                  (       Ga   [        UR
                  [        5      (       ak  0 nUR
                  R                  5        HD  u  pg[        U[        5      (       a&  U R                   H  u  p4UR	                  XG5      nM     XuU'   MF     XQl        g[        UR
                  [        [        45      (       aq  / nUR
                   HO  n[        U[        5      (       a&  U R                   H  u  p4UR	                  XH5      nM     UR                  U5        MQ     [        U5      Ul        g)NT)Ú
isinstanceÚmsgÚstrÚPATTERNSÚsubÚargsÚdictÚitemsÚlistÚtupleÚappend)	ÚselfÚrecordr   ÚpatternÚreplÚnew_argsÚkÚvÚargs	            Ú0D:\Programs\laragon\www\wolf\agent\src\logger.pyÚfilterÚRedactingFilter.filter"   s&  € Ü�f—j‘j¤#×&Ñ&Ø—*‘*ˆCØ!%§¤‘�Ø—k‘k $Ó,’ñ "/àŒJà�;�;ˆ;Ü˜&Ÿ+™+¤t×,Ñ,Ø�Ø"ŸK™K×-Ñ-Ö/‘D�AÜ! !¤S×)Ñ)Ø-1¯]¬]™M˜GØ '§¡¨DÓ 4šAñ .;à"#˜Q“Kñ	 0ð
 '”ð ô ˜FŸK™K¬$´¨×7Ñ7Ø�Ø!Ÿ;œ;�CÜ! #¤s×+Ñ+Ø-1¯]¬]™M˜GØ")§+¡+¨dÓ"8šCñ .;à—O‘O CÖ(ñ	 'ô
 $ H›o�”àó    © N©r   zlogging.LogRecordÚreturnÚbool)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚreÚcompiler   r   Ú__static_attributes__r!   r    r   r   r      sW   † Ùmð 
�ŠÐ'Ó	(¨(Ð3à	�ŠÐ;Ó	<¸hÐGà	�Šð  Eó  
Fð  HRð  	Sð€H÷r    r   c                  ó>   ^ • \ rS rSrSrSSU 4S jjjrSS jrSrU =r$ )	ÚLoggerNameFilteré>   z/Filter log records by their logger name prefix.c                ób   >• [         TU ]  5         U=(       d    / U l        U=(       d    / U l        g )N)ÚsuperÚ__init__ÚincludeÚexclude)r   r3   r4   Ú	__class__s      €r   r2   ÚLoggerNameFilter.__init__A   s$   ø€ Ü‰ÑÔØ—} "ˆŒØ—} "ˆ�r    c                óH  • U R                    H8  nUR                  U:X  d%  UR                  R                  US-   5      (       d  M8    g   U R                  (       d  gU R                   H8  nUR                  U:X  d%  UR                  R                  US-   5      (       d  M8    g   g)NÚ.FT)r4   ÚnameÚ
startswithr3   )r   r   r9   s      r   r   ÚLoggerNameFilter.filterF   s}   € Ø—L”LˆDØ�{‰{˜dÓ" f§k¡k×&<Ñ&<¸TÀC¹Z×&HÓ&HÙñ !ð �|�|ØØ—L”LˆDØ�{‰{˜dÓ" f§k¡k×&<Ñ&<¸TÀC¹Z×&HÓ&HÙñ !ð r    )r4   r3   )NN)r3   úlist[str] | Noner4   r<   r#   ÚNoner"   )	r%   r&   r'   r(   r)   r2   r   r,   Ú__classcell__)r5   s   @r   r.   r.   >   s   ø† Ù9÷%ñ %÷
	ò 	r    r.   c                ó6  • [         (       a  g[        R                  " S5      nUR                  U5        UR	                  [        5       5        [        R                  " [        5      n[        R                  " [        R                  5      nUR                  U5        UR                  U5        U b½   U R                  R                  SSS9  [        U SSSS9nUR                  U5        UR	                  [!        / S	QS
95        UR                  U5        U R                  S-  n[        USSSS9nUR                  U5        UR	                  [!        / S	QS95        UR                  U5        Sq gSq g! ["         a  nUR%                  SX5         SnASq gSnAff = f)z9Configure root logging once. Safe to call multiple times.NÚ	wolfpanelT)ÚparentsÚexist_oki  P é   zutf-8)ÚmaxBytesÚbackupCountÚencoding)zwolfpanel.runnerzwolfpanel.workerzwolfpanel.actionszwolfpanel.update_action)r4   zjobs.log)r3   zfile logging disabled (%s): %s)Ú_configuredÚloggingÚ	getLoggerÚsetLevelÚ	addFilterr   Ú	FormatterÚ_LOG_FORMATÚStreamHandlerÚsysÚstderrÚsetFormatterÚ
addHandlerÚparentÚmkdirr   r.   ÚOSErrorÚwarning)	Úlog_fileÚlevelÚrootÚ	formatterÚstreamÚfile_handlerÚjobs_logÚjobs_handlerÚexcs	            r   Úsetup_loggingr`   R   s|  € ÷ ‚{Øä×Ò˜[Ó)€DØ‡M�M�%ÔØ‡N�N”?Ó$Ô%Ü×!Ò!¤+Ó.€Iô ×"Ò"¤3§:¡:Ó.€FØ
×Ñ˜	Ô"Ø‡O�O�FÔð Ñð&	JØ�O‰O×!Ñ!¨$¸Ð!Ñ>ô /Ø ?ÀÈGñˆLð ×%Ñ% iÔ0Ø×"Ñ"Ü òñô	ð �O‰O˜LÔ)ð  —‘¨Ñ3ˆHÜ.Ø ?ÀÈGñˆLð ×%Ñ% iÔ0Ø×"Ñ"Ü òñô	ð �O‰O˜LÔ)ð �K�$�Køô ó 	JØ�L‰LÐ9¸8×IÐIà�Kûð	Jús   Â1B9E0 Å0
FÅ:FÆFc                ó4   • [         R                  " SU  35      $ )z6Return a namespaced logger under the 'wolfpanel' root.z
wolfpanel.)rH   rI   )r9   s    r   Ú
get_loggerrb   �   s   € ä×Ò˜z¨$¨Ð0Ó1Ð1r    c                óL   • U (       d  g[        U 5      S::  a  gU SS  SU SS  3$ )zBMask a secret for safe display in logs (never log the full value).z<none>é   z****Né   z...éþÿÿÿ)Úlen)Úsecrets    r   Úredactri   •   s4   € æØÜ
ˆ6ƒ{�aÓØØ�R�aˆjˆ\˜˜V B C˜[˜MÐ*Ð*r    )rW   zPath | NonerX   Úintr#   r=   )r9   r   r#   zlogging.Logger)rh   z
str | Noner#   r   )r)   Ú
__future__r   r*   rH   rO   Úlogging.handlersr   Úpathlibr   rM   rG   ÚFilterr   r.   ÚINFOr`   rb   ri   r!   r    r   Ú<module>rp      sd   ðñõ #ã 	Û Û 
Ý 0Ý à@€Ø€ô%�g—n‘nô %ôP�w—~‘~ô ð( +/¸W¿\¹\ö ;ô|2õ
+r    