
    BdZ                     R   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n# e$ r dZY nw xY wd	dlmZmZ ej                            ej                            e          d          Z d Z! G d de          Z"dS )z"Copyright (c) 2013 Steven HiscocksGPL    N   )FileContainerFilter)MyTime)
FailTicket)ActionsUtils   )	DummyJail)database)LogCaptureTestCaselogSysfilesc                 `    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+    L  	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| _        dS )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   sy    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   s;    # -48/H#H#HDO,,48	/r   c                 z    t          | j        t                    r| j                                         || _        d S N)r,   r'   r   close)r(   values     r   r/   zDatabaseTest.dbI   s3    *%% 8>>$(((r   c                     t          t          |                                            t          dS | j        t          j        | j                   dS dS )zCall after every test case.N)r!   r   tearDownr   r$   osremove)r(   r*   s    r   r5   zDatabaseTest.tearDownO   sR    d$$&&&	6	_ 9T_ ! r   c                     | j         j        dk    rt          j        d          |                     | j        | j         j                   d S )Nr   in :memory: database)r/   r   r   r#   assertEqualr$   r.   s    r   testGetFilenamezDatabaseTest.testGetFilenameX   sG    	W##		1	2	224?DG$455555r   c                     |                      | j        j        d           d| j        _        |                      | j        j        d           d| j        _        |                      | j        j        d           d S )NiQ 1y6mon15d5h30mi_z2y 12mon 30d 10h 60miP)r:   r/   purgeager.   s    r   testPurgeAgezDatabaseTest.testPurgeAge]   sm    47#U+++%$'47#X...+$'47#Z00000r   c                 R    |                      t          j        t          d           d S )Nz/this/path/should/not/exist)assertRaisessqlite3OperationalErrorr   r.   s    r   testCreateInvalidPathz"DatabaseTest.testCreateInvalidPathd   s0    
 " " " " "r   c                    | j         j        dk    rt          j        d          |                                  t          | j                  | _         |                     | j        j	        | j         
                                v d           d S )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   s    	W##		1	2	22t''$'//9>TW))+++8: : : : :r   c                 p   t          j        d          st          j        d          d | _        | j        t          j        dd          \  }| _        dD ]^}|                     d|z             t          j
        t          j                            t          d          | j                   t          j        | j        t          j                  }t          j        ||           t          j        |           	 t'          | j                  | _        |dk    r|                     d	d
dd           |                     | j                                        t/          dg                     |                     t1          | j                                                  d           n|                     dd
dd           |                     t1          | j                                                  d           |                     t1          | j                                                  d           | j        r5| j        j        dk    r%t          j        | j        j                   d | _        # | j        r5| j        j        dk    r%t          j        | j        j                   d | _        w xY wd S )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   		-	.	. 1		/	0	00$'	_ (<<1do !  i==<yHIII	?GLL!122DOE E E 
wt	**1<98A;;;))DGE	6+  7 7 7	dg))++S2N1O-P-PQQQ	c$'..001115555	20d  < < <	c$'--//00!444	c$'..00111555w 47&*44Ytw()))TW w 47&*44Ytw()))TW^^^^1 s   <D;I55>J3c                 .   d | _         	 | j        t          j        dd          \  }| _        t	          j        t          j                            t          d          | j                   t          | j                  | _         |                     | j                                         t          dg                     |                     | j                                         t          dg                     t          dddg          }|                     | j                                         d	         |           |                     | j                             t          j                  t          j                   |                     t(          | j         j        t          j        d
z              | j                             dd          }|                     t-          |          d
           |                     |d	                                         d           | j         r0| j         j        dk    r"t          j        | j         j                   d S d S d S # | j         r/| j         j        dk    r t          j        | j         j                   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   s8   $')
o!)%==At	?GLL!122DOE E E((47DG((**C1U0V,W,WXXXDG''))30L/M+N+NOOO{MG9==6DGOO%%a(&111DG$$Z%;<<j>TUUU($'*:J<RUV<VWWWW##Z#OO7CLL!$$$GAJ))++V444
g )$'%33Idg'((((() )33dg )$'%33Idg'(((()3s   HI 9Jc                    d | _         | j        t          j        dd          \  }| _        t	          j        t          j                            t          d          | j                   t          | j                  | _         |                     | j                                         t          dg                     |                     | j                                         t          dg                     | j                                         }|                     t!          |          d           t#          ddg d	          }|                    d
           |                     |d         |           |                     |d                                         d           |                     | j                             t          j                  t          j                   t-          d          | _        | j                             | j        d          }|                     t!          |          d           |                     |d                                         d           |                     t6          | j         j        t          j        dz              t          j        | j         j                   d S )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   sG   $'	_ (<<1do/7<< 0114?D D Dt''$'47''))3+?+?@@@47&&((#/B.C*D*DEEE			$3t99a   i . . .  &
 	A47F###47==??I...47##J$:;;Z=STTT]+++$)G""	J"GG'3w<<###71:((**C000')9:;QTU;UVVV)DG%&&&&&r   c                     t                      | _        | j                            | j                   |                     | j        j        | j                            d          v d           d S )NTzJail not added to database)r   rH   r/   addJailrG   rI   rJ   r.   s    r   rF   zDatabaseTest.testAddJail   sb    kk$)'//$)//9>TW))$///! ! ! ! !r   c                    |                                   t          j        dd          \  }}t          |d          | _        | j                            | j        | j                  }|                     |d u            | 	                    || j        
                    | j                             t          j        |           d S )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7+!X$Xw77$ty$"455#//#+--$'--di88999)Hr   c                    |                                   | j                                        }t          |d          }|                    d           |                                 | j                                         | j                                         | j                                         | j                                        }|                     |dk               | j	        
                    | j        | j                   t          |d          | _        |                     | j                                        d           |                     | j	                            | j        | j                  |           t          |d          }|                    d           |                                 t          |d          | _        |                     | j                                        d           |                     | j	                            | j        | j                  d            t          j        |           d S )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+'DIt1222 %Xw77$4%,,..222 7>>$)T/00'; ; ; x

%++6777++---$Xw77$4%,,..222 7>>$)T/00$8 8 8)Hr   c           
      l   |                                   |                     | j                            | j        d          d            dD ]h}| j                            | j        d|dt          |          z              |                     | j                            | j        d          |           id S )Nzsystemd-journal)i /hYi/hYi/hYTEST)rF   r:   r/   getJournalPosrH   updateJournalr-   )r(   ts     r   testUpdateJournalzDatabaseTest.testUpdateJournal
  s    47((4EFFMMM/ L La7$5q&Q-HHHDG))$)5FGGKKKKL Lr   c                 t   |                                   t          dddg          }| j                            | j        |           | j                            | j                  }|                     t          |          d           |                     t          |d         t                               d S )Nre   r   rf   rH   r   )
rF   r   r/   addBanrH   ri   r:   r^   rG   r,   )r(   ro   rp   s      r   
testAddBanzDatabaseTest.testAddBan  s    k1wi00&'..F###GOOO++'3w<<###//gaj*%%' ' ' ' 'r   c                 N   |                                   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        |           #|                     d           | j                            | j                  }|                     d           |                     t          |          d           t          |          D ]\  }}t          j        d|||                                                    t          j        d||                                           |                     ||                                         |                                           |                     t          ||                                                   t          |                                                     |                     d           t           j        }	 dt           _        |D ]"}| j                            | j        |           #|                     d           | j                            | j                  }|                     d           |                     t          |          d           |t           _        n# |t           _        w xY w|                     d           | j                            | j        t          d                     | j                            | j                  }|                     t          |          d           |                     dd           d S )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  sq    {Axxxyy{Axxxyy{Azzz{{{Ahhhii{A/BCDD{A/BCDD{A/CDEE'  % %f7>>$)V$$$$*+++TY//+*+++ 3{##Q'''
 W%% P Pia?(![^-C-C-E-EFFF?(!V^^-=-=>>>KN((**FLLNN;;;CA113344c&:K:K:M:M6N6NOOOO--0111 (":8 & &vGNN49f%%%%()))di00;())) C$$b)))!88!!!! --0111'..J{33444TY//+3{##R(((*,?@@@@@s   BK9 9Lc                 (   |                                   dD ]7}t          d|z  ddg          }| j                            | j        |           8| 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9967>>$)V$$$$GOOO++'3w<<###	.r   c                 D   |                                  }| j                            | j        |d                                                    |                     t          | j                            | j                            d           | j                            | j        |d                                         |d                                                    |                     t          | j                            | j                            d           d S )Nr   r   r   r   )r   r/   delBanrH   rv   r:   r^   ri   )r(   rp   s     r   
testDelBanzDatabaseTest.testDelBanb  s      ''..GAJ,,..///3twDI6677;;;'..GAJ,,..
0@0@0B0BCCC3twDI6677;;;;;r   c                     |                                   | j                            | j                   |                     t          | j                            | j                            d           d S )Nr   r   )r   r/   r   rH   r:   r^   ri   r.   s    r   testFlushBanszDatabaseTest.testFlushBansk  s`    '..3twDI6677;;;;;r   c                    |                                   | j                            | j        t	          dt          j                    dz
  dg                     | j                            | j        t	          dt          j                    dz
  dg                     |                     t          | j        	                    | j        d                    d           |                     t          | j        	                    | j        d                    d	           |                     t          | j        	                    | j        d
                    d           d S )Nre   <   rf   (   2   )rH   bantimer      r   r   )
rF   r/   r   rH   r   r   timer:   r^   ri   r.   s    r   testGetBansWithTimez DatabaseTest.testGetBansWithTimeq  s(   '..9jfkmmb&87)DDF F F'..9jfkmmb&87)DDF F F3twDIbAABBAFFF3twDIbAABBAFFF 3twDIbAABBAFFFFFr   c           
         |                                   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	 |D             }d
}|D ]b}|dz  }t          dt          j                    |z
  |          }|                    d           | j                            | j        |           c|| j        _	        | j        
                    d          }|                     |                                d           |                     |                                t          |                     |                     t          |                                          |           |                     |                                || d                     t          dt          j                    dz
  |dt          ddg          i          }|                    t          |                     | j                            | j        |           | j        
                    d          }|                     |                                dt          |          z             |                     t          |                                          |           |                     |                                || d                     | j                            | j        dt          j                    dz
            }|                     |d u           |                     |                                t          |                     |                     t          |                                          |           |                     |                                || d                     | j                            | j        dt          j                    dz
  d          }|                     t          |                                          d           |                     |                                |d         d                    | j                            | j        dt          j                    dz
  d          }|                     t          |                                          d           |                    g d           d| j        _	        | j                            | j        |           | j                            | j        dt          j                    dz
            }|                     |d u           |                     |                                t          |                     |                     t          |                                          d           d S )Nr   rf   test)matchesuser123
ABC
rootz1234
c                 *    g | ]}|d          d         S )r   r    ).0rb   s     r   
<listcomp>z=DatabaseTest.testGetBansMerged_MaxMatches.<locals>.<listcomp>  s     444a!I,q/444r   P   
   re   )datar   r   d   )rg   )rg   
maxmatchesrs   r   r   )123)rF   r]   r   r   r   ru   r/   r   rH   
maxMatchesgetBansMergedr:   rv   
getAttemptr^   r   rm   rG   
setMatches)r(   r   failuresmatches2findr   rb   ro   s          r   testGetBansMerged_MaxMatchesz)DatabaseTest.testGetBansMerged_MaxMatches}  s7   *y#vh--00y#vh--00y#vv&6"7"788z3'7#8#899	( 548444,! % %a71{FKMMA$5A>>>6	Q7>>$)V$$$$!$'7  --&6<<>>;///6$$&&H6663v((**++Z8886$$&&j[\\(BCCCk6;==2#5|	ff%&&') ) )&CMM"""'..F###7  --&6$$&&CMM(9:::3v((**++Z8886$$&&j[\\(BCCC7!!$)[6;==QTCT!UU&//&$%%%6$$&&H6663v((**++Z8886$$&&j[\\(BCCC7!!$)[6;==QTCT "  &3v((**++Q///6$$&&I(>???7!!$)[6;==QTCT "  &3v((**++Q///MMM"""$''..F###7!!$)[6;==QTCT!UU&//&$%%%6$$&&H6663v((**++Q/////r   c           	         |                                   t          d          }| j                            |           t	          dt          j                    dz
  dg          }|                    d           | j                            | j	        |           t	          dt          j                    dz
  dg          }|                    d	           | j                            | j	        |           t	          d
t          j                    d	z
  dg          }|                    d           | j                            | j	        |           t	          dt          j                    dz
  dg          }|                    d           | j                            ||           | j        
                    d          }|                     |                                d           |                     |                                d           |                     |                                g d           | j        
                    d| j	                  }|                     |                                d           |                     |                                d           |                     |                                ddg           |                     t          |          t          | j        
                    d| j	                                       t	          d
t          j                    d	z
  dg          }|                    d           | j                            | j	        |           |                     t          |          t          | j        
                    d| j	                                       t	          dt          j                    dz
  dg          }|                    d           | j                            | j	        |           |                     t          |          t          | j        
                    d| j	                                       | j        
                                }|                     t#          |          d           |                     t'          t)          d |D                                 d |D                        | j        
                    |          }|                     t#          |          d           | j        
                    d          }|                     t#          |          d           | j        
                    d          }|                     t#          |          d           | j        
                    d          }|                     t#          |          d           | j        
                    d          }|                     t#          |          d           | j                            | j	                  }|                     t#          |          d           | j                            d d          }|                     |                                d           | j                            | j	        dt          j                              }|                     t#          |          d           | j                            | j	        dt          j                    t          j        d          z             }|                     t#          |          d           | j                            | j	        dt          j                    t          j        d          z             }|                     t#          |          d           |                    d           | j                            | j	        |           | j                            | j	        dt          j                    t          j        d          z             }|                     t#          |          d           |                     d| j	                                        z             | j	        j                            d           | j                            | j	        dt          j                    t          j        d          z             }|                     t#          |          d           |                     |d                                         d           d S )NzDummyJail-2rt   re   r   rf   r      r   r   r   r   F   )rf   r   r   r   r   c              3   >   K   | ]}|                                 V  d S r1   rv   r   ro   s     r   	<genexpr>z1DatabaseTest.testGetBansMerged.<locals>.<genexpr>  s*      11vFLLNN111111r   c                 6    g | ]}|                                 S r   r   r   s     r   r   z2DatabaseTest.testGetBansMerged.<locals>.<listcomp>  s     )))vFLLNN)))r   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A&B'..F###k6;==2#5yAA&B'..F###k6;==2#5yAA&B'..F###k6;==2#5yAA&B'.. 7  --&6<<>>;///6$$&&+++6$$&&(C(C(CDDD 7  49 ==&6<<>>;///6$$&&+++6$$&&'(:;;; f::dgKdi8899; ; ; fkmmb&87)DD)B'..I&&&f::dgKdi8899; ; ; fkmmb&87)DD)B'..I&&&f::dgKdi8899; ; ; G!!##'3w<<###111111122)))))+ + + G!!u!--'3w<<###G!!"!--'3w<<###G!!"!--'3w<<###G!!!!,,'3w<<### G!!"!--'3w<<###G""	"22'3w<<###7!!t!<<&6<<>>;/// G""	bKMM #  '3w<<###G""	bKMMF.w777 # 9 9'3w<<###G""	bKMMF.w777 # 9 9'3w<<###B'..F###G""	bKMMF.w777 # 9 9' 3w<<###>AXAXAZAZZ[[[)r"""G""	bKMMF.w777 # 9 9'3w<<###71:((**B/////r   c                    |                                   | j        | j        _        | j                            | j                   | j        j        }|                    dt          j        	                    t          d          i            |j                            d           t          | j                  x| j        _        }|j                            d           t#          d          }|                    d           |                    ddg           | j                            |           |                                 |                     dd	z             |                     d
dz             d S )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  sU   w$)'//$)I'	++7<< ?@@   
  $$$"("3"33$)C/r"""i  &AVV$%%%)&!!!	.1IIJJJ.?@@@@@r   c                    |                                   | j                            | j                   | j                                        }|                     t          |          dk    o| j        j        |           | j                            d          }|                     t          |          dk    o| j        j        |           | j                            d          }|                     t          |          dk               | j        	                    | j                   | j                                        }|                     t          |          dk    o| j        j        |           | j                            d          }|                     t          |          dk    o| j        j        |           | j                            d          }|                     t          |          dk               d S )Nr   F)enabledTr   )
rF   r/   delJailrH   rJ   r   r^   rI   rG   rz   )r(   jailss     r   testDelAndAddJailzDatabaseTest.testDelAndAddJail4  s   '//$)
'


 
 %--E

a2DINE:::
'

u

-
-%--E

a2DINE:::
'

t

,
,%//#e**/"""'//$)
'


 
 %--E

a2DINE:::
'

t

,
,%--E

a2DINE:::
'

u

-
-%//#e**/"""""r   c                 V   |                                   | j                                         |                     t	          | j                                                  d           | j                            | j                   | j                                         |                     t	          | j                                                  d           |                                  | j                            | j                   | j                                         |                     t	          | j                                                  d           |                     t	          | j        	                    | j                            d           |                                   | j        
                    | j        t          dt          j                    dg                     | j                            | j                   | j                                         |                     t	          | j                                                  d           |                     t	          | j        	                    | j                            d           d S )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   '--///3tw++--..222'//$)'--///3tw++--..222//'//$)'--///3tw++--..2223twDI6677;;; '..9jfkmmgY??A A A'//$)'--///3tw++--..2223twDI667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 6 6
1 1 1" " "	: 	: 	:! ! !F) ) ).' ' 'B! ! !
 
 
% % %NL L L' ' ':A :A :Ax  < < << < <
G 
G 
G70 70 70rg1 g1 g1RA A 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   r   <module>r     s{  , 5 				 



     1 1 1 1 1 1 1 1 " " " " " " & & & & & & + + + + + + + +            !    : : : : : : : :bgooh77AA  h< h< h< h< h<% h< h< h< h< h<s    A AA