a i?y@sgdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z Gddde Z Gddde Z Gddde ZGd d d e ZGd d d e ZGd dde ZeZdS)) LogTargetFileLogLoggerlogNc@s2eZdZdZddZd ddZddZd d Zd S) rz% Abstract class for logging targets. cCs d|_dSN)fdselfr 8/usr/lib/python3.9/site-packages/firewall/core/logger.py__init__(szLogTarget.__init__rcCs tddS)Nz%LogTarget.write is an abstract methodNotImplementedErrorr datalevelloggeris_debugr r r write+szLogTarget.writecCs tddS)Nz%LogTarget.flush is an abstract methodr rr r r flush.szLogTarget.flushcCs tddS)Nz%LogTarget.close is an abstract methodr rr r r close1szLogTarget.closeN)r)__name__ __module__ __qualname____doc__r rrrr r r r r&s  rc@s.eZdZddZd ddZddZdd Zd S) _StdoutLogcCst|tj|_dSr)rr sysstdoutrrr r r r 8s z_StdoutLog.__init__rcCs|j||dSr)rrrrr r r r<s z_StdoutLog.writecCs |dSr)rrr r r rAsz_StdoutLog.closecCs|jdSrrrrr r r rDsz_StdoutLog.flushN)rrrrr rrrr r r r r7s rc@seZdZddZdS) _StderrLogcCst|tj|_dSr)rr rstderrrrr r r r Ks z_StderrLog.__init__N)rrrr r r r r r Jsr c@s.eZdZddZd ddZddZdd Zd S) _SyslogLogcCs.t|ttjtjdtj tj dS)Nr) rr syslogZopenlogospathbasenamerargvZLOG_PIDZ LOG_DAEMONrr r r r Ss z_SyslogLog.__init__rcCsd}|rtj}nF||jkr"tj}n4||jkr4tj}n"||jkrFtj}n||jkrVtj }| drt|dt |d}t |dkr|durt|n t||dS)N r) r#Z LOG_DEBUGINFO1ZLOG_INFOWARNINGZ LOG_WARNINGERRORZLOG_ERRFATALZLOG_CRITendswithlen)r rrrrpriorityr r r ras"       z_SyslogLog.writecCs tdSr)r#Zcloselogrr r r rwsz_SyslogLog.closecCsdSrr rr r r rzsz_SyslogLog.flushN)rrr r r r r"Rs r"c@s<eZdZdZdddZddZddd Zd d Zd d ZdS)rz< FileLog class. File will be opened on the first write. wcCst|||_||_dSr)rr filenamemode)r r2r3r r r r s zFileLog.__init__cCsv|jr dStjtjB}|jdr,|tjO}t|j|d|_t |jdt |j|j|_t |jt j t j dS)Nai)rr$O_CREATO_WRONLYr3 startswithO_APPENDopenr2fchmodfdopenfcntlZF_SETFDZ FD_CLOEXEC)r flagsr r r r9s   z FileLog.openrcCs(|js||j||jdSr)rr9rrrr r r rs z FileLog.writecCs|js dS|jd|_dSr)rrrr r r rs z FileLog.closecCs|js dS|jdSrrrr r r rsz FileLog.flushN)r1)r) rrrrr r9rrrr r r r rs   rc@seZdZdZdZdZdZdZdZdZ e Z e Z eZd\d d Zd d Zd]ddZd^ddZd_ddZd`ddZddZddZddZddZdd Zd!d"Zed#fd$d%Zed#fd&d'Zed#fd(d)Zed#fd*d+Zed#fd,d-Z ed#fd.d/Z!d0d1Z"d2d3Z#d4d5Z$d6d7Z%d8d9Z&d:d;Z'dd?Z)d@dAZ*dBdCZ+dDdEZ,dadFdGZ-dHdIZ.dbdJdKZ/ed#dfdLdMZ0ed#dfdNdOZ1ed#dfdPdQZ2dcdRdSZ3dTdUZ4dVdWZ5dXdYZ6dddZd[Z7d#S)eraL Format string: %(class)s Calling class the function belongs to, else empty %(date)s Date using Logger.date_format, see time module %(domain)s Full Domain: %(module)s.%(class)s.%(function)s %(file)s Filename of the module %(function)s Function name, empty in __main__ %(label)s Label according to log function call from Logger.label %(level)d Internal logging level %(line)d Line number in module %(module)s Module name %(message)s Log message Standard levels: FATAL Fatal error messages ERROR Error messages WARNING Warning messages INFOx, x in [1..5] Information DEBUGy, y in [1..10] Debug messages NO_INFO No info output NO_DEBUG No debug output INFO_MAX Maximum info level DEBUG_MAX Maximum debug level x and y depend on info_max and debug_max from Logger class initialization. See __init__ function. Default logging targets: stdout Logs to stdout stderr Logs to stderr syslog Logs to syslog Additional arguments for logging functions (fatal, error, warning, info and debug): nl Disable newline at the end with nl=0, default is nl=1. fmt Format string for this logging entry, overloads global format string. Example: fmt="%(file)s:%(line)d %(message)s" nofmt Only output message with nofmt=1. The nofmt argument wins over the fmt argument. Example: from logger import log log.setInfoLogLevel(log.INFO1) log.setDebugLogLevel(log.DEBUG1) for i in range(1, log.INFO_MAX+1): log.setInfoLogLabel(i, "INFO%d: " % i) log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: " "%(level)d %(message)s") log.setDateFormat("%Y-%m-%d %H:%M:%S") fl = FileLog("/tmp/log", "a") log.addInfoLogging("*", fl) log.addDebugLogging("*", fl) log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s") log.debug3("debug3") log.debug2("debug2") log.debug1("debug1") log.info2("info2") log.info1("info1") log.warning("warning\n", nl=0) log.error("error\n", nl=0) log.fatal("fatal") log.info(log.INFO1, "nofmt info", nofmt=1) r c Csi|_i|_d|_d|_i|_i|_i|_i|_i|_i|_ |dkrPt d||dkrdt d||j |_ ||_ d|_||_||jd||jd||jd||j dtd|j dD]:}t|d ||||dt|d |d d ||qtd|jdD]@}t|d ||||d|t|d|dd ||q||j||j|d|d|d|j|j|j|j g|d|jddt|j|j dD|d|jddtd|jdDdS)z Logger class initialization r)zLogger: info_max %d is too lowrzLogger: debug_max %d is too lowz FATAL ERROR: zERROR: z WARNING: zINFO%dzinfo%dcsfddS)Ncsj|g|Ri|Sr)infomessageargskwargsr xr r  s3Logger.__init__....r rKr rKr rMsz!Logger.__init__..zDEBUG%dz DEBUG%d: zdebug%dcsfddS)Ncsj|g|Ri|Sr)debugrGrKr r rM)srNr rKr rKr rM(sz%(label)s%(message)sz%d %b %Y %H:%M:%S*cSsg|]}|qSr r .0ir r r 4z#Logger.__init__..cSsg|]}|qSr r rQr r r rT6rUN) _level _debug_level_format _date_format_label _debug_label_logging_debug_logging_domains_debug_domains ValueErrorr+NO_INFOINFO_MAXNO_DEBUG DEBUG_MAXsetInfoLogLabelr- TRACEBACKr,rangesetattrsetDebugLogLabelsetInfoLogLevelr*setDebugLogLevel setFormat setDateFormatsetInfoLoggingr!rsetDebugLogging)r Zinfo_maxZ debug_maxrVr r r r sf           zLogger.__init__cCsFt|j|jdD].}||jvr"q|j|D]\}}}|q,qdS)z Close all logging targets r)N)rgr-rdr\r)r rdummytargetr r r r8s  z Logger.closerPcCs$||||jvr|j|S|jS)z Get info log level. ) _checkDomainrVNOTHINGr domainr r r getInfoLogLevel@s   zLogger.getInfoLogLevelcCs8||||jkr|j}||jkr*|j}||j|<dS)z% Set log level [NOTHING .. INFO_MAX] N)rrrsrbrVr rrur r r rjGs    zLogger.setInfoLogLevelcCs*||||jvr$|j||jS|jS)z Get debug log level. )rrrWrcrtr r r getDebugLogLevelPs  zLogger.getDebugLogLevelcCs:|||dkrd}||jkr&|j}||j|j|<dS)z- Set debug log level [NO_DEBUG .. DEBUG_MAX] rN)rrrdrcrWrwr r r rkWs   zLogger.setDebugLogLevelcCs|jSrrXrr r r getFormat`szLogger.getFormatcCs ||_dSrryr rXr r r rlcszLogger.setFormatcCs|jSrrYrr r r getDateFormatfszLogger.getDateFormatcCs ||_dSrr|r{r r r rmiszLogger.setDateFormatcCs6||}|D]"}|j||j|jd||j|<qdS)U Set log label for level. Level can be a single level or an array of levels.  min_level max_levelN) _getLevels_checkLogLevelr-rbrZr rlabellevelsr r r rels   zLogger.setInfoLogLabelcCs:|j|dd}|D]"}|j||j|jd||j|<qdS)r~r)rrN)rrr*rdr[rr r r rius  zLogger.setDebugLogLabelNcCs|j||||dddS)z Set info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. rrN _setLoggingr rurqrfmtr r r rn~szLogger.setInfoLoggingcCs|j||||dddS)z Set debug log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r)rNrrr r r roszLogger.setDebugLoggingcCs|j||||dddS)z Add info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. rrN _addLoggingrr r r addInfoLoggingszLogger.addInfoLoggingcCs|j||||dddS)z Add debg log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r)rNrrr r r addDebugLoggingszLogger.addDebugLoggingcCs|j||||dddS)z Delete info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. rrN _delLoggingrr r r delInfoLoggingszLogger.delInfoLoggingcCs|j||||dddS)z Delete debug log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r)rNrrr r r delDebugLoggingszLogger.delDebugLoggingcCs|j|ddS)zN Is there currently any info logging for this log level (and domain)? rr_isLoggingHerer rr r r isInfoLoggingHereszLogger.isInfoLoggingHerecCs|j|ddS)zO Is there currently any debug logging for this log level (and domain)? r)rrrr r r isDebugLoggingHereszLogger.isDebugLoggingHerecOs2||d|d<|j|j|g|Ri|dS)z Fatal error log. rrN) _checkKWargs_logr-r rXrIrJr r r fatals z Logger.fatalcOs2||d|d<|j|j|g|Ri|dS)z Error log. rrN)rrr,rr r r errors z Logger.errorcOs2||d|d<|j|j|g|Ri|dS)z Warning log. rrN)rrr+rr r r warnings zLogger.warningcOsH|j|d|jd||d|d<|j||j|g|Ri|dS)z Information log using info level [1..info_max]. There are additional infox functions according to info_max from __init__r)rrrN)rrbrrrar rrXrIrJr r r rFs z Logger.infocOsB|j|d|jd||d|d<|j||g|Ri|dS)z Debug log using debug level [1..debug_max]. There are additional debugx functions according to debug_max from __init__r)rrN)rrdrrrr r r rOs z Logger.debugcCs|j|jtgiddS)N)rIrJ)rrf traceback format_excrr r r exceptionszLogger.exceptioncCs&||ks||kr"td|||fdS)Nz*Level %d out of range, should be [%d..%d].r`)r rrrr r r rszLogger._checkLogLevelcCs.|sdS|D]}|dvrtd|qdS)N)nlrnofmtz0Key '%s' is not allowed as argument for logging.)keysr`)r rJkeyr r r rs  zLogger._checkKWargscCs|r |dkrtd|dS)NrEzDomain '%s' is not valid.rrtr r r rrs zLogger._checkDomaincCs||jkrbt|tst|tr$|}n|g}|D]0}|rJ|j|d|jdq.|j||j|jdq.n6|rddt|j |jD}nddt|j|jD}|S)z Generate log level array. r)rcSsg|]}|qSr r rQr r r rTrUz%Logger._getLevels..cSsg|]}|qSr r rQr r r rTrU) ALL isinstancelisttuplerrdr-rbrgZDEBUG1)r rrrr r r rs    zLogger._getLevelscCsJt|tst|tr|}n|g}|D] }t|jts$td|jjq$|S)z Generate target array. z '%s' is no valid logging target.)rrr issubclass __class__rr`r)r rqtargets_targetr r r _getTargetss zLogger._getTargetscCs|r |j}|j}d|jdf}n|j}|j}|j|jdf}t|dkrP|t |d|dD]<}||vrpqb||D]$\}}}||vrx| |g |qxqbdS)z% Generate dict with domain by level. r)rN) r_r]rdr^r\r-rbr/clearrg setdefaultappend)r rr^r\Z_rangerrurpr r r _genDomainss zLogger._genDomainsc Csd|||||}||}|r,|j}n|j}|D]}|D]}|||fg||<q>q6||dSr)rrrrr]r\r r rurqrrrrrr\r r r rs   zLogger._setLoggingc Csl|||||}||}|r,|j}n|j}|D]&}|D]}||g|||fq>q6||dSr)rrrrr]r\rrrrr r r r-s   zLogger._addLoggingc Cs|||||}||}|r,|j}n|j}|D]x} |D]n}| |vrLq>|||f|| vr|| |||ft|| dkr|| =q>||jkr>td| ||j j |fq>q6| |dS)NrzENo matching logging for level %d, domain %s, target %s and format %s.) rrrrr]r\remover/rr`rrr) r rurqrrrrrr\rVr r r r<s(     zLogger._delLoggingcCsr|||}|sdS|dd}|r,|j}n|j}||D]2\}}}|dksf||sft|d|r:dSq:dS)NFru.rPT)_genDictr]r\r7fnmatch fnmatchcase)r rr_dict point_domainr\rurpr r r rUs  zLogger._isLoggingHerec Cs|jjdkrD|jjd}||jvrD|j|}||j|j}|rD|St|j}|j}|j|j vrt |j |jdr|j |jj |krdS|j D]J\}}t |tjrt ||jrt||j}t |tjr|j |kr|SqdS)z7 Function to get calling class. Returns class or None. rZ func_codeN)f_code co_argcount co_varnamesf_locals _getClass2rinspectZ getmoduleco_name__dict__hasattr__code__itemsrtypesZ ClassTypegetattr FunctionType) r frameZselfnameZ_selfobjmodulecoderpvaluer r r _getClassis,            zLogger._getClasscCsV|jD]"}t|tjr |j|kr |Sq |jD]}|||}|r4|Sq4dS)z@ Internal function to get calling class. Returns class or None. N)rvaluesrrrr __bases__r)r rrrbaseZ_objr r r rs      zLogger._getClass2cOshd}d|vr|d}d}d|vr(|d}d}d|vr<|d}|||}|sPdSt|dkrj|||d<n&t|dkr||d|d<n||d<|dd} |r|j} n|j} g} | |D]\} } }| | vrq| d ks| | dst|d| r|s|j}d |vr|d }|r.| |d|||n| ||||||rX| d |||| | qdS) Nrrr)rrrHrurrPrr() rr/r]r\r7rrrXrr)r rrXrIrJrrrrrr\Z used_targetsrurqr r r rsP      z Logger._logc Csg}d}|r |j}|j}|j}n|j}|j}|j}|D]H}|dkrh|||kr~d}t|dkrbg}qq6|||kr6||q6|st|dkrdS||vrdSt } | r| j r| j d|j kr| j } q| st d| j d} | d } |D]}| |rg}qq| j} t| } ||D]p}|d}|dkr:qn|dkrR|d|}n|}| t|krx| |sdSn|| sdSqd }||vr||}| j| j| d | jd ||t|jtd }|d d krd |d <d}||D]}|dkrqd}qq|jddksJ|jddksJ|sJt|dkrd|| }|rd|j|d<d |d|d<|dd kr|dd |d7<|d d kr|dd |d 7<t|dkr|S|dd }|D],}||st|d|r|SqdS)z Internal function. FrPTrr)Nrz Frame information not available.rrE) filelinerclassfunctionrurrdater?z %(domain)z%(class)rrru)rWr_r[rVr^rZr/rrZ currentframef_back f_globalsrr`r7rfind co_filenamef_linenortimestrftimerY localtimerXrrrr)r rrZ check_domainsZ simple_matchrr^rZrufZ module_nameZ point_moduleco_lenrSdZ level_strZ domain_neededrrr r r rs                        zLogger._genDict)rCrD)rP)rP)rP)rP)r)r)r)r)8rrrrrrsr-rfr,r+rrr r!r"r#r rrvrjrxrkrzrlr}rmrerirnrorrrrrrrrrrFrOrrrrrrrrrrrrrrrrr r r r rsdH ;           4r)__all__rrrrrr#rr<Zos.pathr$objectrrr r"rrrr r r r s.-(*