
    ogfZ                     V   d Z dZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ d	d
lmZ 	 ddlmZ ej,                  Zd	dlmZmZ ej8                  j;                  ej8                  j=                  e      d      Z d Z! G d de      Z"y# e$ r dZY Uw xY w)z"Copyright (c) 2013 Steven HiscocksGPL    N   )FileContainerFilter)MyTime)
FailTicket)ActionsUtils   )	DummyJail)database)LogCaptureTestCaselogSysfilesc                 b    t         j                  j                  rt        d      S t        |       S )N:memory:)unittestF2B	memory_db
Fail2BanDb)filenames    A/usr/lib/python3/dist-packages/fail2ban/tests/databasetestcase.pygetFail2BanDbr   0   s%    LL	J	8    c                        e Zd Z fdZed        Zej                  d        Z fdZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )DatabaseTestc                     t         t        |           t        t	        j
                  d      d| _        t        j                  j                  st        j                  dd      \  }| _        d| _        y)zCall before every test case.NzEUnable to import fail2ban database module as sqlite is not available..db	fail2ban_:auto-create-in-memory:)superr   setUpr   r   SkipTest
dbFilenamer   r   tempfilemkstemp_db)self_	__class__s     r   r"   zDatabaseTest.setUp8   sd    d!#			
  $/			 ((<1do&$(r   c                     t        | j                  t              r)| j                  dk(  rt        | j                        | _        | j                  S )Nr    )
isinstancer'   strr   r$   r(   s    r   dbzDatabaseTest.dbD   s5    #488/H#HDOO,48	/r   c                 z    t        | j                  t              r| j                  j                          || _        y N)r,   r'   r   close)r(   values     r   r/   zDatabaseTest.dbI   s%    *%88>>$(r   c                     t         t        |           t        y| j                   t        j                  | j                         yy)zCall after every test case.N)r!   r   tearDownr   r$   osremove)r(   r*   s    r   r5   zDatabaseTest.tearDownO   s8    d$&		__ 99T__ !r   c                     | j                   j                  dk(  rt        j                  d      | j	                  | j
                  | j                   j                         y )Nr   in :memory: database)r/   r   r   r#   assertEqualr$   r.   s    r   testGetFilenamezDatabaseTest.testGetFilenameX   sD    	WW#			1	224??DGG$4$45r   c                 ,   | j                  | j                  j                  d       d| j                  _        | j                  | j                  j                  d       d| j                  _        | j                  | j                  j                  d       y )NiQ 1y6mon15d5h30mi_z2y 12mon 30d 10h 60miP)r:   r/   purgeager.   s    r   testPurgeAgezDatabaseTest.testPurgeAge]   sh    477##U+%$''477##X.+$''477##Z0r   c                 N    | j                  t        j                  t        d       y )Nz/this/path/should/not/exist)assertRaisessqlite3OperationalErrorr   r.   s    r   testCreateInvalidPathz"DatabaseTest.testCreateInvalidPathd   s    
 "r   c                 4   | j                   j                  dk(  rt        j                  d      | j	                          t        | j                        | _         | j                  | j                  j                  | j                   j                         v d       y )Nr   r9   z3Jail not retained in Db after disconnect reconnect.)r/   r   r   r#   testAddJailr   r$   
assertTruejailnamegetJailNamesr.   s    r   testCreateAndReconnectz#DatabaseTest.testCreateAndReconnectj   sn    	WW#			1	22t'$'//99>>TWW))++8:r   c                    t        j                  d      st        j                  d      d | _        | j
                  t        j                  dd      \  }| _        dD ]#  }| j                  d|z         t        j                  t        j                  j                  t        d      | j
                         t        j                  | j
                  t        j                         }t        j"                  ||       t        j$                  |       	 t'        | j
                        | _        |dk(  r}| j)                  d	d
dd       | j+                  | j                  j-                         t/        dg             | j+                  t1        | j                  j3                               d       n{| j)                  dd
dd       | j+                  t1        | j                  j-                               d       | j+                  t1        | j                  j3                               d       | j                  s| j                  j4                  dk7  st        j6                  | j                  j8                         d | _        & y # | j                  rK| j                  j4                  dk7  r1t        j6                  | j                  j8                         d | _        w w w xY w)Nzsqlite3 --versionzno sqlite3 commandr   r   )6  i  z)[test-repair], next phase - file-size: %ddatabase_v1.dbrM   zRepair seems to be successfulzCheck integrityzDatabase updatedT)all/tmp/Fail2BanDb_pUlZJh.logr   zRepair seems to be failedzNew database created.r   r   )r
   
executeCmdr   r#   r/   r$   r%   r&   pruneLogshutilcopyfiler6   pathjoinTEST_FILES_DIRopenO_RDWR	ftruncater2   r   assertLoggedr:   getLogPathssetlenrJ   _dbFilenamer7   _dbBackupFilename)r(   r)   	truncSizefs       r   testRepairDbzDatabaseTest.testRepairDbu   s#   			-	.			/	00$'	__ ((<1do ! i==<yHI	??GGLL!12DOOE 
wwt		*1<<988A;)DGE	6+  7	dgg))+S2N1O-PQ	c$''..0115	20d  <	c$''--/0!4	c$''..0115ww477&&*4YYtww(()TW1, ww477&&*4YYtww(()TW 5ws   DJAKc                 l   d | _         	 | j                  t        j                  dd      \  }| _        t	        j
                  t        j                  j                  t        d      | j                         t        | j                        | _         | j                  | j                   j                         t        dg             | j                  | j                   j                         t        dg             t        dddg      }| j                  | j                   j!                         d	   |       | j                  | j                   j#                  t        j$                        t        j$                         | j'                  t(        | j                   j"                  t        j$                  d
z          | j                   j+                  dd      }| j                  t-        |      d
       | j                  |d	   j/                         d       | j                   rD| j                   j0                  dk7  r*t        j2                  | j                   j4                         y y y # | j                   rD| j                   j0                  dk7  r*t        j2                  | j                   j4                         w w w xY w)Nr   r   rN   z"DummyJail #29162448 with 0 ticketsrP   	127.0.0.1gףծAabc
r   r   iWRi@ )fromtimecorrectBanTimer   )r/   r$   r%   r&   rS   rT   r6   rU   rV   rW   r   r:   rJ   r]   r\   r   getBansupdateDb__version__rA   NotImplementedErrorgetCurrentBansr^   
getBanTimer_   r7   r`   )r(   r)   ticketticketss       r   testUpdateDbzDatabaseTest.testUpdateDb   s   $')
oo!))%=At	??GGLL!12DOOE(47DGG((*C1U0V,WXDGG'')30L/M+NO{MG9=6DGGOO%a(&1DGG$$Z%;%;<j>T>TU($''*:*:J<R<RUV<VWWW##Z#O7CL!$GAJ))+V4
gg$''%%3IIdgg''( 4gdgg$''%%3IIdgg''( 4gs   HI! !AJ3c                 L   d | _         | j                  t        j                  dd      \  }| _        t	        j
                  t        j                  j                  t        d      | j                         t        | j                        | _         | j                  | j                   j                         t        dg             | j                  | j                   j                         t        dg             | j                   j                         }| j                  t!        |      d       t#        ddg d	      }|j%                  d
       | j                  |d   |       | j                  |d   j'                         d       | j                  | j                   j)                  t        j*                        t        j*                         t-        d      | _        | j                   j1                  | j.                  d      }| j                  t!        |      d       | j                  |d   j3                         d       | j5                  t6        | j                   j(                  t        j*                  dz          t        j8                  | j                   j:                         y )Nr   r   zdatabase_v2.dbzpam-genericz/var/log/auth.logr   z1.2.3.7if~T)zDec  3 09:31:08 f2btest test:auth[27658]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7zDec  3 09:31:32 f2btest test:auth[27671]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7zDec  3 09:31:34 f2btest test:auth[27673]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7   r   r   z1.2.3.8rI   )rH   rg   iX  )r/   r$   r%   r&   rS   rT   r6   rU   rV   rW   r   r:   rJ   r]   r\   ri   r^   r   
setAttemptgetIDrj   rk   r   rH   rm   rn   rA   rl   r7   r`   )r(   r)   bansro   rp   s        r   testUpdateDb2zDatabaseTest.testUpdateDb2   s   $'	__ ((<1do//77<< 014??Dt'$'477'')3+?@477&&(#/B.C*DE		$3t9a i . &
 	A47F#47==?I.477##J$:$:;Z=S=ST]+$)GG""		J"G'3w<#71:((*C0')9)9:;Q;QTU;UV))DGG%%&r   c                     t               | _        | j                  j                  | j                         | j	                  | j                  j
                  | j                  j                  d      v d       y )NTzJail not added to database)r   rH   r/   addJailrG   rI   rJ   r.   s    r   rF   zDatabaseTest.testAddJail   sM    k$)''//$))//99>>TWW))$//!r   c                    | j                          t        j                  dd      \  }}t        |d      | _        | j
                  j                  | j                  | j                        }| j                  |d u        | j                  || j
                  j                  | j                               t        j                  |       y )Nz.logFail2BanDb_utf-8)rF   r%   r&   r   fileContainerr/   addLogrH   rG   assertInr\   r6   r7   )r(   r)   r   poss       r   _testAddLogzDatabaseTest._testAddLog   s      7+!X$Xw7$tyy$"4"45#//#+--$''--dii89))Hr   c                 z   | j                          | j                  j                         }t        |d      }|j	                  d       |j                          | j                  j                          | j                  j                          | j                  j                          | j                  j                         }| j                  |dkD         | j                  j                  | j                  | j                         t        |d      | _        | j                  | j                  j                         d       | j                  | j                  j                  | j                  | j                        |       t        |d      }|j	                  d       |j                          t        |d      | _        | j                  | j                  j                         d       | j                  | j                  j                  | j                  | j                        d        t        j                   |       y )Nwz,Some text to write which will change md5sum
r   r}   z%Some different text to change md5sum
)r   r~   getFileNamerX   writer2   readlinegetPosrG   r/   	updateLogrH   r   r:   r   r6   r7   )r(   r   file_lastPoss       r   testUpdateLogzDatabaseTest.testUpdateLog   s    ++-(
x
%++=>++- %%''//'A+''DIIt112 %Xw7$4%%,,.2 77>>$))T//0'; x
%++67++-$Xw7$4%%,,.2 77>>$))T//0$8))Hr   c           
      r   | j                          | j                  | j                  j                  | j                  d      d        dD ]l  }| j                  j                  | j                  d|dt        |      z          | j                  | j                  j                  | j                  d      |       n y )Nzsystemd-journal)i /hYi/hYi/hYTEST)rF   r:   r/   getJournalPosrH   updateJournalr-   )r(   ts     r   testUpdateJournalzDatabaseTest.testUpdateJournal
  s    477((4EFM/ La77$5q&Q-HDGG))$))5FGKLr   c                 R   | j                          t        dddg      }| j                  j                  | j                  |       | j                  j                  | j                        }| j                  t        |      d       | j                  t        |d   t                     y )Nre   r   rf   rH   r   )
rF   r   r/   addBanrH   ri   r:   r^   rG   r,   )r(   ro   rp   s      r   
testAddBanzDatabaseTest.testAddBan  sz    k1wi0&''..F#GGOOO+'3w<#//gaj*%'r   c                    | j                          t        ddg d      t        ddg d      t        ddg d      t        ddg d      t        d	dd
dg      t        ddd
dg      t        ddd
dg      g}|D ](  }| j                  j                  | j                  |       * | j                  d       | j                  j                  | j                        }| j                  d       | j                  t        |      d       t        |      D ]  \  }}t        j                  d|||   j                                t        j                  d||j                                | j                  ||   j                         |j                                | j                  t        ||   j                               t        |j                                       | j                  d       t         j"                  }	 dt         _        |D ](  }| j                  j                  | j                  |       * | j%                  d       | j                  j                  | j                        }| j%                  d       | j                  t        |      d       |t         _        | j                  d       | j                  j                  | j                  t        d             | j                  j                  | j                        }| j                  t        |      d       | j                  dd       y # |t         _        w xY w)Nre   r   )user "test"   user "Ñâåòà"u   user "Ã¤Ã¶Ã¼Ã"	127.0.0.2z	127.0.0.3)r   s   user ""s   user "äöüß"z	127.0.0.4)r   r   u   user "äöüß"z	127.0.0.5r   u   unterminated Ïz	127.0.0.6z	127.0.0.7s   unterminated zjson dumps failedr   zjson loads failed   zreadtickets[%d]: %rz == tickets[%d]: %rz[test-phase 2] simulate errorszf2b-test::non-existing-encoding   z[test-phase 3] still operable?z	127.0.0.8   )rF   r   r/   r   rH   assertNotLoggedri   r:   r^   	enumerate	DefLogSysdebuggetDatarv   
getMatchesrR   r   
PREFER_ENCr[   )r(   rp   ro   readticketsipriorEncs         r   testAddBanInvalidEncodedz%DatabaseTest.testAddBanInvalidEncoded  s    {Axy{Axy{Az{{Ahi{A/BCD{A/BCD{A/CDE'  %f77>>$))V$% *+TYY/+*+ 3{#Q'
 W% Pia??(![^-C-C-EF??(!V^^-=>KN((*FLLN;CA1134c&:K:K:M6NO	P --01  (":8 &vGGNN499f%& ()dii0;() C$b)!8 --01''..J{34TYY/+3{#R(*,?@ "8s   ;BL5 5Mc                 $   | j                          dD ]9  }t        d|z  ddg      }| j                  j                  | j                  |       ; | j                  j                  | j                        }| j                  t        |      d       |S )N)r   r   rs   z
192.0.2.%dr   ztest
r   rs   )rF   r   r/   r   rH   ri   r:   r^   )r(   r   ro   rp   s       r   _testAdd3BanszDatabaseTest._testAdd3BansY  s{     %aq(1xj9677>>$))V$% GGOOO+'3w<#	.r   c                     | j                         }| j                  j                  | j                  |d   j	                                | j                  t        | j                  j                  | j                              d       | j                  j                  | j                  |d   j	                         |d   j	                                | j                  t        | j                  j                  | j                              d       y )Nr   r   r   r   )r   r/   delBanrH   rv   r:   r^   ri   )r(   rp   s     r   
testDelBanzDatabaseTest.testDelBanb  s     '''..GAJ,,./3twwDII67;''..GAJ,,.
0@0@0BC3twwDII67;r   c                     | j                          | j                  j                  | j                         | j	                  t        | j                  j                  | j                              d       y )Nr   r   )r   r/   r   rH   r:   r^   ri   r.   s    r   testFlushBanszDatabaseTest.testFlushBansk  sJ    ''..3twwDII67;r   c                    | j                          | j                  j                  | j                  t	        dt        j                         dz
  dg             | j                  j                  | j                  t	        dt        j                         dz
  dg             | j                  t        | j                  j                  | j                  d            d       | j                  t        | j                  j                  | j                  d            d	       | j                  t        | j                  j                  | j                  d
            d       y )Nre   <   rf   (   2   )rH   bantimer      r   r   )
rF   r/   r   rH   r   r   timer:   r^   ri   r.   s    r   testGetBansWithTimez DatabaseTest.testGetBansWithTimeq  s    ''..99jfkkmb&87)DF''..99jfkkmb&87)DF3twwDIIbABAF3twwDIIbABAF 3twwDIIbABAFr   c           
      
   | j                          d}dgt        dg      ddgt        dg      ddgt        ddg      ddgt        ddg      dg}|D cg c]
  }|d	   d
    }}d}|D ]a  }|dz  }t        dt        j                         |z
  |      }|j                  d       | j                  j                  | j                  |       c || j                  _	        | j                  j                  d      }| j                  |j                         d       | j                  |j                         t        |             | j                  t        |j                               |       | j                  |j                         || d         t        dt        j                         dz
  |dt        ddg      i      }|j                  t        |             | j                  j                  | j                  |       | j                  j                  d      }| j                  |j                         dt        |      z         | j                  t        |j                               |       | j                  |j                         || d         | j                  j!                  | j                  dt        j                         dz
        }| j#                  |d u       | j                  |j                         t        |             | j                  t        |j                               |       | j                  |j                         || d         | j                  j!                  | j                  dt        j                         dz
  d      }| j                  t        |j                               d       | j                  |j                         |d   d	          | j                  j!                  | j                  dt        j                         dz
  d
      }| j                  t        |j                               d
       |j%                  g d       d
| j                  _	        | j                  j                  | j                  |       | j                  j!                  | j                  dt        j                         dz
        }| j#                  |d u       | j                  |j                         t        |             | j                  t        |j                               d
       y c c}w )Nr   rf   test)matchesuser123
ABC
rootz1234
r   r   P   
   re   )datar   r   d   )rg   )rg   
maxmatchesrs   )123)rF   r]   r   r   r   ru   r/   r   rH   
maxMatchesgetBansMergedr:   rv   
getAttemptr^   r   rm   rG   
setMatches)r(   r   failuresrb   matches2findr   ro   s          r   testGetBansMerged_MaxMatchesz)DatabaseTest.testGetBansMerged_MaxMatches}  sA   *y#vh-0y#vh-0y#vv&6"78z3'7#89	( ,44a!I,q/4,4! %a71{FKKMA$5A>6	Q77>>$))V$	% "$''77  -&6<<>;/6$$&H63v((*+Z86$$&j[\(BCk6;;=2#5|	ff%&')&CM"''..F#77  -&6$$&CM(9:3v((*+Z86$$&j[\(BC77!!$))[6;;=QTCT!U&//&$%6$$&H63v((*+Z86$$&j[\(BC77!!$))[6;;=QTCT " &3v((*+Q/6$$&I(>?77!!$))[6;;=QTCT " &3v((*+Q/M"$''''..F#77!!$))[6;;=QTCT!U&//&$%6$$&H63v((*+Q/] 5s   T>c           	         | j                          t        d      }| j                  j                  |       t	        dt        j                         dz
  dg      }|j                  d       | j                  j                  | j                  |       t	        dt        j                         dz
  dg      }|j                  d	       | j                  j                  | j                  |       t	        d
t        j                         d	z
  dg      }|j                  d       | j                  j                  | j                  |       t	        dt        j                         dz
  dg      }|j                  d       | j                  j                  ||       | j                  j                  d      }| j                  |j                         d       | j                  |j                         d       | j                  |j                         g d       | j                  j                  d| j                        }| j                  |j                         d       | j                  |j                         d       | j                  |j                         ddg       | j                  t        |      t        | j                  j                  d| j                                     t	        d
t        j                         d	z
  dg      }|j                  d       | j                  j                  | j                  |       | j                  t        |      t        | j                  j                  d| j                                     t	        dt        j                         dz
  dg      }|j                  d       | j                  j                  | j                  |       | j!                  t        |      t        | j                  j                  d| j                                     | j                  j                         }| j                  t#        |      d       | j%                  t'        t)        d |D                    |D cg c]  }|j                          c}       | j                  j                  |      }| j                  t#        |      d       | j                  j                  d      }| j                  t#        |      d       | j                  j                  d      }| j                  t#        |      d       | j                  j                  d      }| j                  t#        |      d       | j                  j                  d      }| j                  t#        |      d       | j                  j+                  | j                        }| j                  t#        |      d       | j                  j+                  d d      }| j                  |j                         d       | j                  j+                  | j                  dt        j                               }| j                  t#        |      d       | j                  j+                  | j                  dt        j                         t        j,                  d      z         }| j                  t#        |      d       | j                  j+                  | j                  dt        j                         t        j,                  d      z         }| j                  t#        |      d       |j/                  d       | j                  j                  | j                  |       | j                  j+                  | j                  dt        j                         t        j,                  d      z         }| j                  t#        |      d       | j1                  d| j                  j3                         z         | j                  j4                  j/                  d       | j                  j+                  | j                  dt        j                         t        j,                  d      z         }| j                  t#        |      d       | j                  |d   j7                         d       y c c}w )NzDummyJail-2rt   re   r   rf   r      r   r   r   r   F   )rf   r   r   r   r   c              3   <   K   | ]  }|j                           y wr1   )rv   ).0ro   s     r   	<genexpr>z1DatabaseTest.testGetBansMerged.<locals>.<genexpr>  s     1vFLLN1s   r      )r   r      r   r   )rH   ip)rH   
forbantimerg   1yearz(ignore ticket (with new max ban-time %r))rF   r   r/   rz   r   r   r   ru   r   rH   r   r:   rv   r   r   idassertNotEqualr^   assertSortedEquallistr]   rm   str2seconds
setBanTimer[   getMaxBanTimeactionsrn   )r(   jail2ro   	newTicketrp   s        r   testGetBansMergedzDatabaseTest.testGetBansMerged  s   

'%''//%k6;;=2#5yA&B''..F#k6;;=2#5yA&B''..F#k6;;=2#5yA&B''..F#k6;;=2#5yA&B''.. 77  -&6<<>;/6$$&+6$$&(CD 77  499 =&6<<>;/6$$&+6$$&'(:; f:dggKdii89; fkkmb&87)D)B''..I&f:dggKdii89; fkkmb&87)D)B''..I&f:dggKdii89; GG!!#'3w<#1112!()vFLLN)+ GG!!u!-'3w<#GG!!"!-'3w<#GG!!"!-'3w<#GG!!!!,'3w<# GG!!"!-'3w<#GG""		"2'3w<#77!!t!<&6<<>;/ GG""		bKKM # '3w<#GG""		bKKMF..w77 # 9'3w<#GG""		bKKMF..w77 # 9'3w<#B''..F#GG""		bKKMF..w77 # 9' 3w<#>AXAXAZZ[))r"GG""		bKKMF..w77 # 9'3w<#71:((*B/_ *s   	c%
c                    | j                          | j                  | j                  _        | j                  j	                  | j                         | j                  j
                  }|j                  dt        j                  j                  t        d      i        |j                  j                  d       t        | j                        x| j                  _        }|j                  j!                  d       t#        d      }|j%                  d       |j'                  ddg       | j                  j)                  |       |j+                          | j-                  dd	z         | j-                  d
dz         y )Naction_checkainfozaction.d/action_checkainfo.pyr   r   z1.2.3.4r   r   zban ainfo %s, %s, %s, %s)TTTTzjail info %d, %d, %d, %d)r      r   r   )rF   r/   rH   r   rz   r   addr6   rU   rV   rW   
banManagersetBanTotalr   _Jail__filterfailManagersetFailTotalr   ru   r   putFailTicket_Actions__checkBanr[   )r(   r   fltro   s       r   testActionWithDBzDatabaseTest.testActionWithDB  s   ww$))''//$))II'	++77<< ?@ 
  $"("33$))C//r"i &AVV$%))&!	.1IIJ.?@r   c                 $   | j                          | j                  j                  | j                         | j                  j	                         }| j                  t        |      dk(  xr | j                  j                  |       | j                  j	                  d      }| j                  t        |      dk(  xr | j                  j                  |       | j                  j	                  d      }| j                  t        |      dk(         | j                  j                  | j                         | j                  j	                         }| j                  t        |      dk(  xr | j                  j                  |       | j                  j	                  d      }| j                  t        |      dk(  xr | j                  j                  |       | j                  j	                  d      }| j                  t        |      dk(         y )Nr   F)enabledTr   )
rF   r/   delJailrH   rJ   r   r^   rI   rG   rz   )r(   jailss     r   testDelAndAddJailzDatabaseTest.testDelAndAddJail4  sj   ''//$))
''


 %--E
a2DIINNE:
''

u

-%--E
a2DIINNE:
''

t

,%//#e*/"''//$))
''


 %--E
a2DIINNE:
''

t

,%--E
a2DIINNE:
''

u

-%//#e*/"r   c                 .   | j                          | j                  j                          | j                  t	        | j                  j                               d       | j                  j                  | j                         | j                  j                          | j                  t	        | j                  j                               d       | j                          | j                  j                  | j                         | j                  j                          | j                  t	        | j                  j                               d       | j                  t	        | j                  j                  | j                              d       | j                          | j                  j                  | j                  t        dt        j                         dg             | j                  j                  | j                         | j                  j                          | j                  t	        | j                  j                               d       | j                  t	        | j                  j                  | j                              d       y )Nr   r   r   re   rf   )rF   r/   purger:   r^   rJ   r   rH   r   ri   r   r   r   r   r.   s    r   	testPurgezDatabaseTest.testPurgeG  s   ''--/3tww++-.2''//$))''--/3tww++-.2//''//$))''--/3tww++-.23twwDII67; ''..99jfkkmgY?A''//$))''--/3tww++-.23twwDII67;r   )__name__
__module____qualname__r"   propertyr/   setterr5   r;   r?   rD   rK   rc   rq   rx   rF   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r*   s   @r   r   r   6   s    
'   )) 
6
1"	:!F).'B!
%NL':Ax<<
G70rg1RA*#&<r   r   )#__copyright____license__r6   sysr   r%   rB   rS   server.filterr   r   server.mytimer   server.ticketr   server.actionsr	   r
   	dummyjailr   serverr   r   ImportErrorutilsr   r   r   rU   rV   dirname__file__rW   r   r    r   r   <module>r     s   , 5 	 
     1 " & +  !! ;bggooh7Ah<% h<  s    B B('B(