
    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&   fjj#&&**C!%kk$, "/J;;;&++t,,"KK--/DA!!S))-1]]MG 'D 4A .;"#QK	 0
 '  FKK$77!;;C!#s++-1]]MG")++d"8C .;OOC(	 '
 $Ho     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}    LLD{{d"fkk&<&<TCZ&H&H ! ||LLD{{d"fkk&<&<TCZ&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MM%NN?$%!!+.I ""3::.F
	"OOF &	JOO!!$!> /?GL %%i0"" 	 OOL)  3H.?GL %%i0"" 	 OOL) K$K  	JLL98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Raj\VBC[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 @%gnn %Pw~~ ( +/W\\ ;|2
+r    