
    /I_"                     b    S SK r S SKrS SKrS SKrS SKr\R
                  " 5       r " S S5      rg)    Nc                       \ rS rSrSrSrSr\R                  r	\R                  rSr\S 5       rS rSS j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)
LogManager!   	ifupdown2
ifupdown2di  Nc                  `   [         R                  (       d$   [        5       [         l        [         R                  $ [         R                  $ ! [         aY  n [        R                  R                  S[        U 5      -  5        [        R                  " 5          S n A [         R                  $ S n A ff = f)Nzwarning: ifupdown2.Log: %s
)	r   _LogManager__instance	Exceptionsysstderrwritestr	traceback	print_exc)es    /usr/share/ifupdown2/lib/log.pyget_instanceLogManager.get_instance+   s|    $$&(2
% $$$z$$$  &

  !?#a&!HI##%%$$$&s   A
 

B-A B((B-c                 p   [         R                  (       a  [        S5      eU [         l        SU l        SU l        [
        R                  " 5       U l        U R                  U R                  l	        SU l
        SU l        SU l        SU l        [
        R                  " [        R                   5      U l        U R                  R#                  [
        R$                  " U R                  5      5        U R                  R'                  U R                  5        [(        R*                  R-                  S5      (       a   [
        R.                  R1                  S[
        R.                  R0                  R2                  S9U l        U R                  R#                  [
        R$                  " U R                  5      5        [
        R:                  " [
        R<                  S5        [
        R:                  " [
        R>                  S	5        [
        R:                  " [
        R@                  S
5        [
        R:                  " [
        RB                  S5        [
        R:                  " [
        RD                  S5        g! [4         a<  n[        R                   R7                  S[9        U5      -  5        SU l         SnANSnAff = f)z
Setup root logger and console handler (stderr). To enable daemon, client
or standalone logging please call the proper function, see:
    "start_(daemon|client|standlone)_logging"
z1Log: invalid access. Please use Log.getInstance()z%(levelname)s: %(message)szi%(asctime)s: %(threadName)s: %(name)s: %(filename)s:%(lineno)d:%(funcName)s(): %(levelname)s: %(message)sNz/dev/log)addressfacilityzwarning: syslog: %s
criticalwarningerrordebuginfo)#r   r	   RuntimeError_LogManager__fmt_LogManager__debug_fmtlogging	getLogger_LogManager__root_loggerLOGGER_NAMEname_LogManager__socket_handler_LogManager__syslog_handler_LogManager__console_handlerdaemonStreamHandlerr   r   setFormatter	Formatter
addHandlerospathexistshandlersSysLogHandler
LOG_DAEMONr
   r   r   addLevelNameCRITICALWARNINGERRORDEBUGINFO)selfr   s     r   __init__LogManager.__init__5   s      RSS$(J!1
8 %..0"&"2"2 $ $!% ")!6!6szz!B++G,=,=djj,IJ%%d&<&<=77>>*%%-(/(8(8(F(F&$--;;FF )G )% %%2273D3DTZZ3PQ
 	W--z:W__i8W]]G4W]]G4W\\62  -

  !83q6!AB(,%%-s   7A>I/ /
J592J00J5c                    U(       a  [         R                  nOJU(       a  [         R                  nO2U(       a  [         R                  nOU(       a  [         R                  nOUnU R
                  R                   H  nUR                  U5        M     U R
                  R                  U:  a  U R
                  R                  U5        gg)zi
Set root handler logging level
:param default:
:param error:
:param warning:
:param info:
:param debug:
N)	r    r7   r8   r5   r6   r"   r0   setLevellevel)r9   defaultr   r   r   r   	log_levelhandlers           r   	set_levelLogManager.set_levelf   s     IIIII))22GY' 3
 ##i/''	2 0    c                 N    U R                   R                  U R                  5        g)z#Add console handler to root logger N)r"   r,   r'   r9   s    r   enable_consoleLogManager.enable_console   s    %%d&<&<=rD   c                 N    U R                   R                  U R                  5        g)z(Remove console handler from root logger N)r"   removeHandlerr'   rF   s    r   disable_consoleLogManager.disable_console   s    (()?)?@rD   c                     U R                   (       aK  U R                   U R                  R                  ;  a&  U R                  R                  U R                   5        ggg)z"Add syslog handler to root logger N)r&   r"   r0   r,   rF   s    r   enable_syslogLogManager.enable_syslog   sG      T%:%:$BTBTB]B]%]))$*?*?@ &^ rD   c                 r    U R                   (       a&  U R                  R                  U R                   5        gg)z'Remove syslog handler from root logger N)r&   r"   rJ   rF   s    r   disable_syslogLogManager.disable_syslog   s*      ,,T-B-BC !rD   c                 H    U R                   U R                  R                  ;   $ N)r&   r"   r0   rF   s    r   is_syslog_enabledLogManager.is_syslog_enabled   s    $$(:(:(C(CCCrD   c                 T    U R                   (       a  U R                   R                  $ S $ rT   )r&   r>   rF   s    r   get_syslog_log_levelLogManager.get_syslog_log_level   s!    .2.C.Ct$$**MMrD   c                     U R                   (       aR  U R                   R                  U5        U R                  R                  U:  a  U R                  R                  U5        g g g rT   )r&   r=   r"   r>   )r9   r>   s     r   set_level_syslogLogManager.set_level_syslog   sQ      !!**51!!''%/""++E2 0 !rD   c                    U R                   R                  U R                  5        U R                  R                  5         SU R                  l         U R                  R
                  (       d  U R                  R                  5         U R                  R                  5         U R                  R                  5         g! U R                  R                  5         U R                  R                  5         f = f)a8  Close socket to disconnect client.
We first have to perform this little hack: it seems like the socket is
not opened until data (LogRecord) are transmitted. In our most basic use
case (client sends "ifup -a") the daemon doesn't send back any LogRecord
but we can't predict that in the client. The client is already in a
blocking-select waiting for data on it's socket handler
(StreamRequestHandler). For this special case we need to manually call
"createSocket" to open the channel to the client so that we can properly
close it. That way the client can exit cleanly.
N)	r"   rJ   r%   acquire	retryTimesockcreateSocketclosereleaserF   s    r   close_log_streamLogManager.close_log_stream   s     	(()>)>?%%'*.'	,((--%%224!!'')!!))+ !!'')!!))+s   5B< <6C2c                 N    U R                   R                  U R                  5        g rT   )r"   r,   r%   rF   s    r   start_streamLogManager.start_stream   s    %%d&;&;<rD   c                 b    U R                  U R                  UR                  UR                  S9  g )Nr   r   )rB   DEFAULT_LOGGING_LEVEL_DAEMONverboser   r9   argss     r   set_daemon_logging_level#LogManager.set_daemon_logging_level   s%    t88t||SWS]S]^rD   c                    [        US5      (       a  UR                  (       d  U R                  5         O%U R                  R	                  U R
                  5        U R                  U R                  UR                  UR                  S9  g Nsyslogrj   )
hasattrrs   rQ   r"   rJ   r%   rB   DEFAULT_LOGGING_LEVEL_NORMALrl   r   rm   s     r   set_request_logging_level$LogManager.set_request_logging_level   s^    tX&&dkk!,,T-B-BCt88t||SWS]S]^rD   c                    U R                   U R                  l        [        US5      (       a1  UR                  (       a   U R                  5         U R                  5         U R                  U R                  UR                  UR                  S9  g)zUSetup root logger name and client log level
syslog is handled by the daemon directly
rs   rj   N)r#   r"   r$   rt   rs   rN   rK   rB   ru   rl   r   rm   s     r   start_client_loggingLogManager.start_client_logging   sf     #'"2"24""t{{   "t88t||SWS]S]^rD   c                 f   U R                   U R                  l        [        US5      (       aV  UR                  (       aE  U R                  5         U R                  5         U R                  R                  U R                  5        U R                  U R                  UR                  UR                  S9  g rr   )r#   r"   r$   rt   rs   rN   rK   rJ   r'   rB   ru   rl   r   rm   s     r   start_standalone_logging#LogManager.start_standalone_logging   s~    "&"2"24""t{{   ",,T-C-CDt88t||SWS]S]^rD   c                 p   U R                   U R                  l        SU l        U R	                  5         [
        R                  R                  SU R                  S9U l	        U R                  R                  U R                  5        UR                  (       d  U R                  5         U R                  U5        g)z
Daemon mode initialize a socket handler to transmit logging to the
client, we can also do syslog logging and/or console logging (probably
just for debugging purpose)
:param args:
:return:
T	localhost)portN)LOGGER_NAME_DAEMONr"   r$   r(   rN   r    r0   SocketHandlerDEFAULT_TCP_LOGGING_PORTr%   r,   consolerK   ro   rm   s     r   start_daemon_loggingLogManager.start_daemon_logging   s     #'"9"9 !( 0 0 > >.. !? !
 	%%d&;&;<||  "%%d+rD   c                 .    [         R                  U5        g rT   )root_loggerr   )r9   msgs     r   r   LogManager.write   s    rD   c                     U R                   $ rT   )r"   rF   s    r   r   LogManager.root_logger   s    !!!rD   )__console_handler__debug_fmt__fmt__root_logger__socket_handler__syslog_handlerr(   )FFFF)"__name__
__module____qualname____firstlineno__r#   r   r   r    r8   rk   r5   ru   r	   staticmethodr   r:   rB   rG   rK   rN   rQ   rU   rX   r[   rd   rg   ro   rv   ry   r|   r   r   r   __static_attributes__ rD   r   r   r   !   s    K%$#*<< #*?? J% %/3b38>AA
D
DN3,*=__
_	_,2"rD   r   )r-   r   r   r    logging.handlersr!   r   r   r   rD   r   <module>r      s0   . 
 
   !V" V"rD   