a =Æ*f°Dã@sÀdZdZdZddlZddlmZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZdd lmZdd lmZdd lmZeeƒZGd d „d eƒZGdd„dƒZeƒZdS)zSerg G. Brester (sebres)z"Copyright (c) 2014 Serg G. BresterZGPLéNé)Ú JailThread)ÚFailManagerEmptyé)Ú getLogger)ÚMyTime)ÚUtilscsNeZdZdZejdZ‡fdd„Zdd„Zdd„Zd d „Z d d „Z d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„ZdGd$d%„Z‡fd&d'„ZdHd*d+„Zed,d-„ƒZdId.d/„ZdJd0d1„Zed2d3„ƒZejd4d3„ƒZed5d6„ƒZd7d8„Z d9d:„Z!d;d<„Z"Gd=d>„d>ƒZ#d?d@„Z$dAdB„Z%dCdD„Z&dEdF„Z'‡Z(S)KÚObserverThreada8Handles observing a database, managing bad ips and ban increment. Parameters ---------- Attributes ---------- daemon ident name status active : bool Control the state of the thread. idle : bool Control the idle state of the thread. sleeptime : int The time the thread sleeps for in the loop. é csZtt|ƒjddd|_t ¡|_g|_t ¡|_ d|_ i|_ d|_ d|_ d|_d|_dS)Nz f2b/observer)ÚnameTé<Fi)Úsuperr Ú__init__ÚidleÚ threadingÚRLockÚ _queue_lockÚ_queueÚEventÚ_notifyÚ sleeptimeÚ_timersÚ_pausedÚ_ObserverThread__dbÚ"_ObserverThread__db_purge_intervalÚdaemon©Úself©Ú __class__©ú|j|j |¡Wdƒn1s(0Y| ¡dS)z5Add a event to queue and notify thread to wake up. N)rrÚappendr@©rr7r r r!r4›s*zObserverThread.addcGs6|j|j |¡Wdƒn1s(0YdS)zÆóz$ObserverThread.run..cSsdSrIr r r r r!rJÇrK) ÚcallÚdb_setrHÚis_aliveZ is_activer5ÚstopÚnopÚshutdownrNFNrrú%sT©Úexc_infoz&Observer stopped, %s events remaining.z Observer stopped after error: %s)!ÚlogSysÚinfor9rrFrMrHÚisAliveÚisActiver5rOr4Úactiverrrr+rÚpopÚcallabler1ÚgetattrÚ ExceptionÚerrorrÚwaitrÚclearr<Úsleepr r:Úis_full)rZ_ObserverThread__methZevÚmethÚer?r r r!Úrun­s^ ô  * (   &&zObserverThread.runcCsdS)NTr rr r r!rWýszObserverThread.isAliveNcCs|jSr()rY)rZfromStrr r r!rXszObserverThread.isActivecs>|j$|jstt|ƒ ¡Wdƒn1s00YdSr()rrYr r r5rrr r!r5szObserverThread.startéTcCsª|jr¦|jr¦t d|¡|j0| d¡|j}|j ¡d|_Wdƒn1sT0Y| |¡sl|rˆ| ¡d|_d|_ d|_ n||_|  t |dƒ¡o¤|j SdS)Nz-Observer stop ... try to end queue %s secondsrQFTgà?)rYrrUrVrrCr>Ú wait_emptyr`rrÚ wait_idleÚminrb)rZwtimeZ forceQuitr?r r r!rO s    $zObserverThread.stopcCs<|j"t|jƒrdndWdƒS1s.0YdS)NTF)rr+rrr r r!rb#szObserverThread.is_fullcCs„t tj¡|dur t ¡|}|jdurH| d¡|jrH|jrH|  ¡|jrr|durdt ¡|krdqrt tj¡qH|  d¡|j S)zWWait observer is running and returns if observer has no more events (queue is empty) NrPgü©ñÒMbP?) r<rar r:rrrCrbrr@rh©rrrdr r r!rg(s      zObserverThread.wait_emptycCsZt tj¡|jrdS|dur*t ¡|}|jsT|durFt ¡|krFqTt tj¡q*|jS)zJWait observer is running and returns if observer idle (observer sleeps) TN)r<rar r:rrrjr r r!rh<s  zObserverThread.wait_idlecCs|jSr()rrr r r!ÚpausedJszObserverThread.pausedcCs |j|krdS||_| ¡dSr()rr@)rÚpauser r r!rkNs cCsdS)z/Status of observer to be implemented. [TODO] )Úrmr rr r r!ÚstatusWszObserverThread.statuscCs ||_dSr()r)rÚdbr r r!rMaszObserverThread.db_setcCs2t d¡|jdur|j ¡| d|jd¡dS)NzPurge database event occurredrGrH)rUÚdebugrÚpurger9rrr r r!rHds   zObserverThread.db_purgec Cs’| ¡r| d¡sdS| ¡}| ¡}t d|j|¡d}d}d}z|jj  ¡}|j } | durÚ|   ||¡D]8\}}} t ||  ¡ƒ}d|dkr’|nd>dd}q¦qlt||ƒ}|durÚ||krÚt d|j|||¡WdS|dkrèWdSt d |j|t |¡||||krd nd ¡|jj ||dd ¡}| |¡||krJ|j |¡Wn@tyŒ} z&tjd | t ¡tjkdWYd} ~ n d} ~ 00dS)z} Notify observer a failure for ip was found Observer will check ip was known (bad) and possibly increase an retry count Ú incrementNz[%s] Observer: failure found %srrérz8[%s] Ignore failure %s before last ban %s < %s, restoredz%[%s] Found %s, bad - %s, %s # -> %s%sz, BanrmTrRrS)rWÚgetBanTimeExtraÚgetIDÚgetTimerUrpr ÚfilterZ failManagerZ getMaxRetryÚdatabaseÚgetBanÚmaxÚ getBanCountrirVrÚtime2strZ addFailureÚ setBanCountZ performBanr]r^ÚgetEffectiveLevelÚloggingÚDEBUG) rÚjailÚticketÚipZunixTimeÚbanCountZ retryCountÚ timeOfBanZmaxRetryroÚ lastBanTimerdr r r!Ú failureFoundosD   ÿ  þ  zObserverThread.failureFoundc@seZdZdd„ZdS)zObserverThread.BanTimeIncrcCs||_||_dSr()ZTimeZCount)rÚbanTimer„r r r!r¢sz#ObserverThread.BanTimeIncr.__init__N©Ú__name__Ú __module__Ú __qualname__rr r r r!Ú BanTimeIncr¡srcCs| ¡}|d| ||¡ƒS)NÚ evformula)rtr)rrrˆr„Úber r r!Ú calcBanTime¦szObserverThread.calcBanTimec Cs@| ¡r|js|S| ¡}| ¡}|}zÔ|dkrø| dd¡rø|jj||| dd¡dD] \}}} || ¡krz| |d¡t  d|||¡|dkr¦|d|  ||¡ƒ}|  |¡|  ¡|krìt  d |j||t |¡t |¡t |¡f¡nd |_qøqVWn@ty:} z&tjd | t ¡tjkd WYd } ~ n d } ~ 00|S)ztCheck for IP address to increment ban time (if was already banned). Returns ------- float new ban time. rrrFÚ overalljails)r‘rz"IP %s was already banned: %s #, %srŽz/[%s] IP %s is bad: %s # last %s - incr %s to %sTrRrSN)rWrxrtrur1ryr{r}rUrprÚ setBanTimervrVr rr|Ú seconds2strÚrestoredr]r^r~rr€) rrrˆr‚rrƒZ orgBanTimer„r…r†rdr r r!Ú incrBanTimeªs2 ÿ    þ  0zObserverThread.incrBanTimec Csˆ|jr dSz6|}| ¡}t d|j||¡|dkrh| ¡durh| |||¡}|dks^||krh| |¡|dkr´| ¡|}t   |¡t   |¡f}|t   ¡kr¸t d|d¡WdSnd}||krtj d|j|| ¡g|¢RŽt d d |j|||f¡| td td ||d ƒƒ|j||¡|jdur@|js@|j ||¡Wn@ty‚}z&tjd |t ¡tjkdWYd}~n d}~00dS)úÁ Notify observer a ban occurred for ip Observer will check ip was known (bad) and possibly increase/prolong a ban time Secondary we will actualize the bans and bips (bad ip) in database Nz[%s] Observer: ban found %s, %séÿÿÿÿzIgnore old bantime %srF)Z permanentZinfinitez$[%s] Increase Ban %s (%d # %s -> %s)rfz[%s] Observer: prolong %s in %sr rrRrS)r”rurUrpr Ú getBanTimer•r’rvrr“r|r<Znoticer{Úlogr=rirzÚ prolongBanrxZaddBanr]r^r~rr€) rr‚rÚbtimeZoldbtimerƒZbendtimeZlogtimerdr r r!ÚbanFoundÓs:     ÿÿ&zObserverThread.banFoundc Csvz2| ¡}| ¡}t d|j||¡|j |¡Wn>typ}z&tjd|t  ¡t j kdWYd}~n d}~00dS)r–z[%s] Observer: prolong %s, %srRrSN) r˜rurUrpr ÚactionsZ _prolongBanr]r^r~rr€)rr‚rr›rƒrdr r r!ršýszObserverThread.prolongBan)N)rfT)N)N))rŠr‹rŒÚ__doc__rr:rr&r'r*r,r.r0r9r=r;r@r4rCrFrerWrXr5rOÚpropertyrbrgrhrkÚsetterrnrMrHr‡rrr•rœršÚ __classcell__r r rr!r (sN     P          2)*r c@seZdZdd„ZdS)Ú _ObserverscCs d|_dSr()ZMainrr r r!rsz_Observers.__init__Nr‰r r r r!r¢ sr¢)Ú __author__Z __copyright__Z __license__rZ jailthreadrZ failmanagerrÚosrr<ZdatetimeZmathZjsonZrandomÚsysZhelpersrZmytimerZutilsrrŠrUr r¢Z Observersr r r r!Ús"  8   h