3 YÉj8„ã@s–dddddddddd d d d d ddddgZddlmZddlmZddlmZddlmZddlm Z Gdd„de ƒZ Gdd„de ƒZ Gdd„de ƒZ Gdd„de ƒZGdd„deƒZGdd„de ƒZGdd„de ƒZGdd„de ƒZGd d„de ƒZGd!d „d e ƒZGd"d „d e ƒZGd#d „d e ƒZGd$d „d e ƒZGd%d „d e ƒZGd&d„deƒZGd'd„de ƒZd(d)d/d1d+œZGd,d„de ƒZGd-d„de ƒZd.S)2Ú Rich_SourceÚRich_DestinationÚ Rich_ServiceÚ Rich_PortÚ Rich_ProtocolÚRich_MasqueradeÚRich_IcmpBlockÚ Rich_IcmpTypeÚRich_SourcePortÚRich_ForwardPortÚRich_LogÚ Rich_AuditÚ Rich_AcceptÚ Rich_RejectÚ Rich_DropÚ Rich_MarkÚ Rich_LimitÚ Rich_Ruleé)Ú functions)Úcheck_ipset_name)Ú REJECT_TYPES)Úerrors)Ú FirewallErrorc@seZdZddd„Zdd„ZdS)rFcCs˜||_|jdkrd|_||_|jdks0|jdkr8d|_n|jdk rN|jjƒ|_||_|jdkrdd|_||_|jdkr”|jdkr”|jdkr”ttjdƒ‚dS)NÚzno address, mac and ipset)ÚaddrÚmacÚupperÚipsetÚinvertrrÚ INVALID_RULE)Úselfrrrr©r!ú/usr/lib/python3.6/rich.pyÚ__init__$s    zRich_Source.__init__cCsjd|jr dnd}|jdk r*|d|jS|jdk rB|d|jS|jdk rZ|d|jSttjdƒ‚dS)Nz source%s z NOTrz address="%s"zmac="%s"z ipset="%s"zno address, mac and ipset)rrrrrrr)r Úretr!r!r"Ú__str__5s   zRich_Source.__str__N)F)Ú__name__Ú __module__Ú __qualname__r#r%r!r!r!r"r#s c@seZdZddd„Zdd„ZdS)rFcCsV||_|jdkrd|_||_|jdkr,d|_||_|jdkrR|jdkrRttjdƒ‚dS)Nrzno address and ipset)rrrrrr)r rrrr!r!r"r#Bs  zRich_Destination.__init__cCsRd|jr dnd}|jdk r*|d|jS|jdk rB|d|jSttjdƒ‚dS)Nzdestination%s z NOTrz address="%s"z ipset="%s"zno address and ipset)rrrrrr)r r$r!r!r"r%Ns  zRich_Destination.__str__N)F)r&r'r(r#r%r!r!r!r"rAs c@seZdZdd„Zdd„ZdS)rcCs ||_dS)N)Úname)r r)r!r!r"r#YszRich_Service.__init__cCs d|jS)Nzservice name="%s")r))r r!r!r"r%\szRich_Service.__str__N)r&r'r(r#r%r!r!r!r"rXsc@seZdZdd„Zdd„ZdS)rcCs||_||_dS)N)ÚportÚprotocol)r r*r+r!r!r"r#`szRich_Port.__init__cCsd|j|jfS)Nzport port="%s" protocol="%s")r*r+)r r!r!r"r%dszRich_Port.__str__N)r&r'r(r#r%r!r!r!r"r_sc@seZdZdd„ZdS)r cCsd|j|jfS)Nz#source-port port="%s" protocol="%s")r*r+)r r!r!r"r%hszRich_SourcePort.__str__N)r&r'r(r%r!r!r!r"r gsc@seZdZdd„Zdd„ZdS)rcCs ||_dS)N)Úvalue)r r,r!r!r"r#mszRich_Protocol.__init__cCs d|jS)Nzprotocol value="%s")r,)r r!r!r"r%pszRich_Protocol.__str__N)r&r'r(r#r%r!r!r!r"rlsc@seZdZdd„Zdd„ZdS)rcCsdS)Nr!)r r!r!r"r#tszRich_Masquerade.__init__cCsdS)NÚ masquerader!)r r!r!r"r%wszRich_Masquerade.__str__N)r&r'r(r#r%r!r!r!r"rssc@seZdZdd„Zdd„ZdS)rcCs ||_dS)N)r))r r)r!r!r"r#{szRich_IcmpBlock.__init__cCs d|jS)Nzicmp-block name="%s")r))r r!r!r"r%~szRich_IcmpBlock.__str__N)r&r'r(r#r%r!r!r!r"rzsc@seZdZdd„Zdd„ZdS)rcCs ||_dS)N)r))r r)r!r!r"r#‚szRich_IcmpType.__init__cCs d|jS)Nzicmp-type name="%s")r))r r!r!r"r%…szRich_IcmpType.__str__N)r&r'r(r#r%r!r!r!r"r�sc@seZdZdd„Zdd„ZdS)r cCs<||_||_||_||_|jdkr(d|_|jdkr8d|_dS)Nr)r*r+Úto_portÚ to_address)r r*r+r.r/r!r!r"r#‰s  zRich_ForwardPort.__init__cCs<d|j|j|jdkrd|jnd|jdkr4d|jndfS)Nz(forward-port port="%s" protocol="%s"%s%srz to-port="%s"z to-addr="%s")r*r+r.r/)r r!r!r"r%”szRich_ForwardPort.__str__N)r&r'r(r#r%r!r!r!r"r ˆs c@seZdZddd„Zdd„ZdS)r NcCs||_||_||_dS)N)ÚprefixÚlevelÚlimit)r r0r1r2r!r!r"r#›szRich_Log.__init__cCs>d|jrd|jnd|jr$d|jnd|jr6d|jndfS)Nz log%s%s%sz prefix="%s"rz level="%s"z %s)r0r1r2)r r!r!r"r%¡szRich_Log.__str__)NNN)r&r'r(r#r%r!r!r!r"r šs c@seZdZddd„Zdd„ZdS)r NcCs ||_dS)N)r2)r r2r!r!r"r#¨szRich_Audit.__init__cCsd|jrd|jndS)Nzaudit%sz %sr)r2)r r!r!r"r%¬szRich_Audit.__str__)N)r&r'r(r#r%r!r!r!r"r §s c@seZdZddd„Zdd„ZdS)r NcCs ||_dS)N)r2)r r2r!r!r"r#°szRich_Accept.__init__cCsd|jrd|jndS)Nzaccept%sz %sr)r2)r r!r!r"r%³szRich_Accept.__str__)N)r&r'r(r#r%r!r!r!r"r ¯s c@s&eZdZddd„Zdd„Zdd„ZdS) rNcCs||_||_dS)N)Útyper2)r Z_typer2r!r!r"r#·szRich_Reject.__init__cCs,d|jrd|jnd|jr$d|jndfS)Nz reject%s%sz type="%s"rz %s)r3r2)r r!r!r"r%»szRich_Reject.__str__cCsT|jrP|sttjdƒ‚|dkrP|jt|krPdjt|ƒ}ttjd|j|fƒ‚dS)Nz9When using reject type you must specify also rule family.Úipv4Úipv6z, z%Wrong reject type %s. Use one of: %s.)r4r5)r3rrrrÚjoin)r ÚfamilyZ valid_typesr!r!r"Úcheck¿s zRich_Reject.check)NN)r&r'r(r#r%r8r!r!r!r"r¶s c@seZdZdd„ZdS)rcCsd|jrd|jndS)Nzdrop%sz %sr)r2)r r!r!r"r%ÉszRich_Drop.__str__N)r&r'r(r%r!r!r!r"rÈsc@s&eZdZddd„Zdd„Zdd„ZdS) rNcCs||_||_dS)N)Úsetr2)r Z_setr2r!r!r"r#ÎszRich_Mark.__init__cCsd|j|jrd|jndfS)Nz mark set=%s%sz %sr)r9r2)r r!r!r"r%ÒszRich_Mark.__str__cCs�|jdk r|j}n ttjdƒ‚d|krv|jdƒ}t|ƒdkrHttj|ƒ‚tj|dƒ shtj|dƒ rŒttj|ƒ‚ntj|ƒsŒttj|ƒ‚dS)Nz no value setú/éré)r9rrZ INVALID_MARKÚsplitÚlenrZ checkUINT32)r ÚxÚsplitsr!r!r"r8Ös      zRich_Mark.check)N)r&r'r(r#r%r8r!r!r!r"rÍs r<é<é)ÚsÚmÚhÚdc@s‚eZdZddd„Zdd„Zedd„ƒZejdd„ƒZed d „ƒZejd d „ƒZe d d „ƒZ dd„Z e dd„ƒZ dd„Z dd„ZdS)rNcCs||_||_dS)N)r,Úburst)r r,rGr!r!r"r#ñszRich_Limit.__init__cCs|jƒ|jƒdS)N)Ú value_parseÚ burst_parse)r r!r!r"r8õszRich_Limit.checkcCs|jS)N)Ú_value)r r!r!r"r,ùszRich_Limit.valuec Csf|dkrd|_dSy|j|ƒ\}}Wntk r<|}YnX|›d|›�}t|ddƒ|krb||_dS)Nr:rJ)rJÚ _value_parserÚgetattr)r r,ÚrateÚdurationÚvr!r!r"r,ýs cCs|jS)N)Ú_burst)r r!r!r"rG szRich_Limit.burstc Cs\|dkrd|_dSy|j|ƒ}Wntk r8|}Yn Xt|ƒ}t|ddƒ|krX||_dS)NrP)rPÚ _burst_parserÚstrrL)r rGÚbr!r!r"rGs c Csâd}d|kr|jdƒ}| s(t|ƒdkr4ttj|ƒ‚|\}}y t|ƒ}Wnttj|ƒ‚YnX|dkrv|dd…}|dks†|dkr’ttj|ƒ‚d t||d kr¸ttjd|fƒ‚|dkrÚ|d krÚttjd|fƒ‚||fS)Nr:r;ÚsecondÚminuteÚhourÚdayr<rCrDrErFi'rz %s too fastz %s too slow)rTrUrVrW)rCrDrErF)r=r>rrÚ INVALID_LIMITÚintÚDURATION_TO_MULT)r,r@rMrNr!r!r"rKs&     zRich_Limit._value_parsecCs |j|jƒS)N)rKrJ)r r!r!r"rH:szRich_Limit.value_parsec CsR|dkr dSy t|ƒ}Wnttj|ƒ‚YnX|dksB|dkrNttj|ƒ‚|S)Nr<i€–˜)rYrrrX)rGrSr!r!r"rQ=s  zRich_Limit._burst_parsecCs |j|jƒS)N)rQrP)r r!r!r"rIKszRich_Limit.burst_parsecCs,d|j›d�}|jdk r(|d|j›�7}|S)Nz limit value="ú"z burst=)rJrP)r rCr!r!r"r%Ns zRich_Limit.__str__)N)r&r'r(r#r8Úpropertyr,ÚsetterrGÚ staticmethodrKrHrQrIr%r!r!r!r"rðs     c@s>eZdZdZdZddd„Zdd„Zd d „Zd d „Zd d„Z dS)ri€iÿNrcCsV|dk rt|ƒ|_nd|_||_d|_d|_d|_d|_d|_d|_|rR|j |ƒdS)N) rRr7ÚpriorityÚsourceÚ destinationÚelementÚlogÚauditÚactionÚ_import_from_string)r r7Úrule_strr_r!r!r"r#Xs zRich_Rule.__init__cCs”g}x|tj|ƒD]n}d|krp|jdƒ}t|ƒdksF|d sF|d rVttjd|ƒ‚|j|d|ddœƒq|jd|iƒqW|jddiƒ|S) z Lexical analysis ú=r;rr<zinternal error in _lexer(): %s)Ú attr_nameÚ attr_valuerbÚEOL)rZ splitArgsr=r>rrrÚappend)r rgÚtokensÚrÚattrr!r!r"Ú_lexeris   zRich_Rule._lexerc Csò|sttjdƒ‚tj|ƒ}d|_d|_d|_d|_d|_ d|_ d|_ d|_ |j |ƒ}|rv|djdƒdkrvttjdƒ‚i}g}d}�x`||jdƒdko |dgk�sä||jdƒ}||jdƒ}||jdƒ}|�rò|dHk�ràttjd|ƒ‚�nî|dIk�rÐ|dk�r|j�rttjd+ƒ‚n²|dk�r<|j�r|d <nBt|jd ƒ|jd ƒ|jd ƒ|jd d?ƒƒ|_|jƒ|jƒ|d2}�n| dk�r,|dOk�rÚ|||<nN|dPk�rîd>|d <n:t|jd ƒ|jd ƒ|jd d?ƒƒ|_|jƒ|jƒ|d2}�n®| dk�rd|dk�rTt|ƒ|_ |jƒn ttjd@ƒ‚�nv| dk�rœ|dk�rŒt|ƒ|_ |jƒn ttjdAƒ‚�n>| dk�rî|dQk�rº|||<n0t|jdƒ|jdƒƒ|_ |jƒ|jƒ|d2}�nì| dk�r&|dk�rt|ƒ|_ |jƒn ttjdBƒ‚�n´| dk�r^|dk�rNt|ƒ|_ |jƒn ttjdCƒ‚�n|| dk�rŒtƒ|_ |jƒ|jƒ|d2}�nN| d k�rî|dRk�rª|||<n@t|jdƒ|jdƒ|jdƒ|jdƒƒ|_ |jƒ|jƒ|d2}�nì| d!k�r@|dSk�r |||<n0t|jdƒ|jdƒƒ|_ |jƒ|jƒ|d2}�nš| d"k�r°|dTk�r^|||<nN|d(k�rt|jd(ƒn8t |jdƒ|jdƒ|jd(ƒƒ|_ |jƒ|jƒ|d2}�n*| d#k�rü|d(k�rÐ|jd(ƒn(t!|jd(ƒƒ|_ |jƒ|jƒ|d2}�nÞ| d$k�rH|d(k�r|jd(ƒn(t"|jd(ƒƒ|_ |jƒ|jƒ|d2}�n’| d%k�r”|d(k�rh|jd(ƒn(t#|jd(ƒƒ|_ |jƒ|jƒ|d2}�nF| d&k�rú|dk�r²|||<nF|d(k�rÈ|jd(ƒn0t$|jdƒ|jd(ƒƒ|_ |jƒ|jƒ|d2}nà| d'k�r`|dk�r|||<nF|d(k�r.|jd(ƒn0t%|jdƒ|jd(ƒƒ|_ |jƒ|jƒ|d2}nz| d(k�rÚ|dUk�r„||dD|›�<nVdE|k�ršttjdFƒ‚t&|dE|jdGƒƒ|d(<|jdEdƒ|jdGdƒ|jƒ|d2}|d2}q†W|j'ƒdS)VNz empty rulerrbrkÚrulerirjr_r7Úaddressrrrr,r*r+úto-portúto-addrr)r0r1r3r9rGzbad attribute '%s'r`raÚserviceú icmp-blockú icmp-typer-ú forward-portú source-portrcrdÚacceptÚdropÚrejectÚmarkr2ÚnotÚNOTzmore than one 'source' elementz#more than one 'destination' elementzFmore than one element. There cannot be both '%s' and '%s' in one rule.zmore than one 'log' elementzmore than one 'audit' elementzOmore than one 'action' element. There cannot be both '%s' and '%s' in one rule.zunknown element %sr<rz0'family' outside of rule. Use 'rule family=...'.z4'priority' outside of rule. Use 'rule priority=...'.z:'%s' outside of any element. Use 'rule %s= ...'.z,'%s' outside of rule. Use 'rule ... %s ...'.r4r5zH'family' attribute cannot have '%s' value. Use 'ipv4' or 'ipv6' instead.z(invalid 'priority' attribute value '%s'.zdwrong 'protocol' usage. Use either 'rule protocol value=...' or 'rule [forward-]port protocol=...'.zDattribute '%s' outside of any element. Use 'rule %s= ...'.TFzinvalid 'protocol' elementzinvalid 'service' elementzinvalid 'icmp-block' elementzinvalid 'icmp-type' elementzlimit.z limit.valuezinvalid 'limit' elementz limit.burst)r_r7rrrrrr,r*r+rsrtr)r0r1r3r9rG)rqr`rar+rur*rvrwr-rxryrcrdrzr{r|r}r2r~rrk)r+rur*rvrwr-rxry)rzr{r|r})r4r5)rrrrr)r~r)rrrr)r~r)r*r+)r*r+rsrt)r*r+)r0r1)r,rG)(rrrrZstripNonPrintableCharactersr_r7r`rarbrcrdrerpÚgetr>rlrYÚ ValueErrorÚINVALID_PRIORITYrÚpopÚclearrrrrrrrr r r r r rrrrr8) r rgrmZattrsZ in_elementsÚindexrbrirjZ in_elementZerr_msgr!r!r"rfzs”    ""               *      "                          (                                            zRich_Rule._import_from_stringc Cs`|jdk r"|jd kr"ttj|jƒ‚|jdkrn|jdk rB|jjdk sL|jdk rVttjƒ‚t|j ƒt krnttjƒ‚|j |j ks†|j |j kržttjd|j |j fƒ‚|j dkoÄ|jdksÈ|jdk oÄ|j dk�r |jdkrÞttjdƒ‚|jdkoú|jdkoú|j dk�r ttjdƒ‚t|j ƒtt tgk�rP|jdk�rP|jdk�rP|jdk�rPttjdƒ‚|jdk �rj|jjdk �rÞ|jdk�r€ttjƒ‚|jjdk �ršttjdƒ‚|jjdk �r´ttjd ƒ‚tj|j|jjƒ�sjttjt|jjƒƒ‚nŒ|jjdk �r,|jjdk �rttjd ƒ‚tj|jjƒ�sjttjt|jjƒƒ‚n>|jjdk �r^t|jjƒ�sjttjt|jjƒƒ‚n ttjd ƒ‚|jdk �r|jjdk �rÞ|jdk�ršttjƒ‚|jjdk �r´ttjd ƒ‚tj|j|jjƒ�sttjt|jjƒƒ‚n>|jjdk �rt|jjƒ�sttjt|jjƒƒ‚n ttjd ƒ‚t|j ƒt k�rd|j j!dk�sLt"|j j!ƒd k�r`ttj#t|j j!ƒƒ‚�nüt|j ƒt$k�r¶tj%|j j&ƒ�s”ttj'|j j&ƒ‚|j j(d!k�r`ttj)|j j(ƒ‚�nªt|j ƒt*k�rêtj+|j j,ƒ�s`ttj)|j j,ƒ‚�nvt|j ƒtk�r<|jdk �rttjdƒ‚|jdk �r`|jjdk �r`ttjdƒ‚�n$t|j ƒtk�r˜|j j!dk�slt"|j j!ƒd k�r€ttj-t|j j!ƒƒ‚|j�r`ttjdƒ‚�nÈt|j ƒt.k�rà|j j!dk�sÈt"|j j!ƒd k�r`ttj-t|j j!ƒƒ‚�n€t|j ƒt k�rîtj%|j j&ƒ�sttj'|j j&ƒ‚|j j(d"k�r.ttj)|j j(ƒ‚|j j/dk�rZ|j j0dk�rZttj'|j j/ƒ‚|j j/dk�rŠtj%|j j/ƒ �rŠttj'|j j/ƒ‚|j j0dk�r¾tj1|j|j j0ƒ �r¾ttj|j j0ƒ‚|jdk�rÔttjƒ‚|jdk �r`ttjdƒ‚nrt|j ƒt2k�r>tj%|j j&ƒ�sttj'|j j&ƒ‚|j j(d#k�r`ttj)|j j(ƒ‚n"|j dk �r`ttjdt|j ƒƒ‚|jdk �r®|jj3�r”|jj3d$k�r”ttj4|jj3ƒ‚|jj5dk �r®|jj5j6ƒ|jdk �rüt|jƒt7t8t9gk�râttj:t|jƒƒ‚|jj5dk �rü|jj5j6ƒ|jdk �r\t|jƒt8k�r(|jj6|jƒnt|jƒt;k�rB|jj6ƒ|jj5dk �r\|jj5j6ƒdS)%Nr4r5z/'priority' attribute must be between %d and %d.rzno element, no actionz%no element, no source, no destinationzno action, no log, no auditzaddress and maczaddress and ipsetz mac and ipsetzinvalid sourcezinvalid destinationr<ÚtcpÚudpÚsctpÚdccpzmasquerade and actionzmasquerade and mac sourcezicmp-block and actionrzforward-port and actionzUnknown element %sÚemergÚalertÚcritÚerrorÚwarningÚnoticeÚinfoÚdebug)r4r5)r†r‡rˆr‰)r†r‡rˆr‰)r†r‡rˆr‰)rŠr‹rŒr�rŽr�r�r‘)ZINVALID_SERVICErZ check_portr*Z INVALID_PORTr+ZINVALID_PROTOCOLrZ checkProtocolr,ZINVALID_ICMPTYPErr.r/Zcheck_single_addressr r1ZINVALID_LOG_LEVELr2r8r rrZINVALID_AUDIT_TYPEr)r r!r!r"r8hsö                                          zRich_Rule.checkcCs¸d}|jr|d|j7}|jr,|d|j7}|jr@|d|j7}|jrT|d|j7}|jrh|d|j7}|jr||d|j7}|jr�|d|j7}|jr¤|d|j7}tj r´tj |ƒS|S)Nrqz priority="%d"z family="%s"z %s) r_r7r`rarbrcrdrerZPY2Zu2b)r r$r!r!r"r%s$zRich_Rule.__str__i€ÿÿ)NNr) r&r'r(r’r“r#rprfr8r%r!r!r!r"rTs o-Nii i€Q)Ú__all__ZfirewallrZfirewall.core.ipsetrZfirewall.core.baserrZfirewall.errorsrÚobjectrrrrr rrrrr r r r rrrrZrrr!r!r!r"Ús@      d