o ;s*b !@sldZdZdZddlmZddlmZddlmZee Z Gdd d e Z Gd d d e Z Gd d d e ZdS)z Cyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL) getLogger)IPAddr)MyTimec@s:eZdZdZdZdZdZdddidfddZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZddZd>ddZd?dd Zd@d!d"Zd#d$Zd>d%d&Zd>d'd(Zd)d*Zd+d,Zd-d.Zd/d0Zed1d2Zejd3d2Zed4d5Zejd6d5Zd7d8Z dAd9d:Z!ed;d<Z"e"jd=d<Z"dS)BTicket)_ip_flags _banCount_banTime_time_data_retry _lastResetlrNcCs||d|_d|_d|_|dur|nt|_|pgdd|_|dur7|D] \}}|dur6||j|<q)|r@| |dSdS)z{Ticket constructor @param ip the IP address @param time the ban time @param matches (log) lines caused the ticket N)matchesfailures) setIPr r r rtimer r itemsupdate)selfiprrdataticketkvr8/usr/lib/python3/dist-packages/fail2ban/server/ticket.py__init__+s  zTicket.__init__c Cs<d|jjdd|j|j|j|j|jd|jdgfS)Nz@%s: ip=%s time=%s bantime=%s bancount=%s #attempts=%d matches=%r.rr) __class____name__splitrr r r r getrrrr__str__Bs zTicket.__str__cCst|SN)strr'rrr__repr__HszTicket.__repr__cCsHz|j|jkot|jdt|jdko|j|jkWSty#YdSw)NrF)rroundr r AttributeError)rotherrrr__eq__Ks   z Ticket.__eq__cCs0|jD]}t||d}|durt|||qdSr)) __slots__getattrsetattr)rrnrrrrrSs   z Ticket.updatecCst|tr t|}||_dSr)) isinstancer*rrrvaluerrrrZs  z Ticket.setIPcCs|jd|jS)Nfid)r r&rr'rrrgetID`sz Ticket.getIDcC|jSr))rr'rrrgetIPcz Ticket.getIPcC ||_dSr)r r5rrrsetTimef zTicket.setTimecCr9r)r=r'rrrgetTimeir;zTicket.getTimecCr<r)r r5rrr setBanTimelr?zTicket.setBanTimecCs|jdur|jS|Sr)rA)r defaultBTrrr getBanTimeoszTicket.getBanTimeFcCs|s||jkr ||_dSdSr)r )rr6alwaysrrr setBanCountrs zTicket.setBanCountcCs|j|7_dSr)rEr5rrr incrBanCountvszTicket.incrBanCountcCr9r)rEr'rrr getBanCountyr;zTicket.getBanCountcCs,|jdur|jn|}|dkrtjS|j|S)Nr")r rMAX_TIMEr )rrCbantimerrrgetEndOfBanTime|s zTicket.getEndOfBanTimecCs.|jdur|jn|}|dkrdS||j|kS)Nr"F)r r )rrrCrKrrr isTimedOutszTicket.isTimedOutcCs||jd<dSNrr r5rrr setAttemptszTicket.setAttemptcCs |jdSrNrOr'rrr getAttemptr?zTicket.getAttemptcCs6|r ||jd<dSz|jd=WdStyYdSw)Nr)r KeyError)rrrrr setMatchess zTicket.setMatchescCsdd|jddDS)NcSs(g|]}t|ttfs |nd|qS))r4listtuplejoin).0linerrr s z%Ticket.getMatches..rr)r r&r'rrr getMatchess zTicket.getMatchescC |jtj@Sr)r rRESTOREDr'rrrrestored zTicket.restoredcC.|r |jtjO_dS|jtjM_dSr)r]r5rrrr_cCr\r)r rBANNEDr'rrrbannedr`z Ticket.bannedcCrar)rcr5rrrrerbcOst|dkrtdd|dD|_n&t|dkr#|j|fnt|dkr;|jddtt|gdDt|rE|j|tdd|jD|_dS) NrcS g|] \}}|dur||fqSr)rrXrrrrrrZ z"Ticket.setData..rrcss|] \}}||fVqdSr)rrgrrr sz!Ticket.setData..cSrfr)rrgrrrrZrh)lendictrr rzipiter)rargsargvrrrsetDatas   $ zTicket.setDatacsdur|jS|js |Stttdttttfs>tr+t fdd|j DSt dr>t fdd|j DS|j |S)Ncs g|] \}}|r||fqSrrrgkeyrrrZrhz"Ticket.getData..__iter__cs g|] \}}|vr||fqSrrrgrqrrrZrh) r r4r*typeintfloatboolcomplexcallablerkrhasattrr&)rrrdefaultrrqrgetDatas zTicket.getDatacCs t|ddS)N _banEpochr)r1r'rrrbanEpochr`zTicket.banEpochcCr<r))r}r5rrrr~s r))F)r)NN)#r$ __module__ __qualname__r0rJr^rdr r(r+r/rrr8r:r>r@rBrDrGrHrIrLrMrPrQrSr[propertyr_setterrerpr|r~rrrrr#sP            rc@sNeZdZdddidfddZddZddZdd Zdd d Zed dZ dS) FailTicketNcCsXd|_d|_t||||||t|ts*|dur|n||_|jdd|_dSdS)Nrr) _firstTimerrr r4rr@r r&)rrrrrrrrrr s zFailTicket.__init__cCs:||_|jds d|jd<|sd|jd<g|jd<dSdS)z Set artificial retry count, normally equal failures / attempt, used in incremental features (BanTimeIncr) to increase retry count for bad IPs rrrrNrr r5rrrsetRetrys   zFailTicket.setRetrycCr9)zV Returns failures / attempt count or artificial retry count increased for bad IPs )rr'rrrgetRetryszFailTicket.getRetrycCsR||jkr'|j||kr"tt|jt||j||_|||_||_dSdS)z Adjust time of ticket and current attempts count considering given maxTime as estimation from rate by previous known interval (if it exceeds the findTime) N)r rrur,rrv)rrmaxTimerrr adjustTimes "  zFailTicket.adjustTimercCsX|j|7_|jd|7<|r*|jdr#|jd||jd<dS||jd<dSdS)Nrrr)rrattemptcountrrrinc s zFailTicket.inccC t|_|Sr))rr#orrrwrapzFailTicket.wrap)Nrr) r$rrr rrrr staticmethodrrrrrrs    rc@seZdZeddZdS) BanTicketcCrr))rr#rrrrr#rzBanTicket.wrapN)r$rrrrrrrrr!srN) __author__ __copyright__ __license__helpersripdnsrmytimerr$logSysobjectrrrrrrrs   @?