Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 ³Y„j=Vã@sÐddlZddlZddlmZddlmZmZmZmZm Z m Z m Z m Z m Z mZddlmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZddlm Z ddl!m"Z"dd l#m$Z$Gd d „d e%ƒZ&dS) éN)Úlog) ÚportStrÚ checkIPnMaskÚ checkIP6nMaskÚ checkProtocolÚenable_ip_forwardingÚcheck_single_addressÚportInPortRangeÚget_nf_conntrack_short_nameÚcoalescePortRangeÚbreakPortRange) Ú Rich_RuleÚ Rich_AcceptÚ Rich_ServiceÚ Rich_PortÚ Rich_ProtocolÚRich_MasqueradeÚRich_ForwardPortÚRich_SourcePortÚRich_IcmpBlockÚ Rich_IcmpTypeÚ Rich_Mark)ÚFirewallTransaction)Úerrors)Ú FirewallError)ÚLastUpdatedOrderedDict)ÚSOURCE_IPSET_TYPESc@s¼eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z �d dd„Zdd„Zdd„Zdd„Z�d d d!„Z�d d"d#„Z�dd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Z�dd0d1„Zd2d3„Z�dd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Z �dd@dA„Z!dBdC„Z"�ddDdE„Z#dFdG„Z$dHdI„Z%dJdK„Z&dLdM„Z'dNdO„Z(dPdQ„Z)dRdS„Z*�ddTdU„Z+dVdW„Z,�ddXdY„Z-dZd[„Z.d\d]„Z/d^d_„Z0d`da„Z1dbdc„Z2�dddde„Z3dfdg„Z4�ddhdi„Z5djdk„Z6dldm„Z7dndo„Z8dpdq„Z9drds„Z:dtdu„Z;dvdw„Z<�ddxdy„Z=dzd{„Z>�dd|d}„Z?d~d„Z@d€d�„ZAd‚dƒ„ZBd„d…„ZCd†d‡„ZD�ddˆd‰„ZEdŠd‹„ZF�ddŒd�„ZGdŽd�„ZHd�d‘„ZId’d“„ZJd”d•„ZK�dd–d—„ZLd˜d™„ZM�ddšd›„ZNdœd�„ZOdždŸ„ZPd d¡„ZQd¢d£„ZR�dd¤d¥„ZSd¦d§„ZT�dd¨d©„ZUdªd«„ZVd¬d­„ZW�dd®d¯„ZX�d d°d±„ZY�d!d²d³„ZZd´dµ„Z[�d"d¶d·„Z\d¸d¹„Z]�d#dºd»„Z^d¼d½„Z_d¾d¿„Z`dÀdÁ„Za�d$dÂdÄZbdÄdÅ„Zc�d%dÆdÇ„ZddÈdÉ„ZedÊdË„ZfdÌdÍ„ZgdÎdÏ„Zh�d&dÐdÑ„ZidÒdÓ„ZjdÔdÕ„Zk�d'dÖdׄZldØdÙ„ZmdÚdÛ„ZndÜdÝ„ZodÞdß„Zpdàdá„Zqdâdã„Zrdädå„Zsdædç„Ztdèdé„Zu�d(dêdë„Zv�d)dìdí„Zwdîdï„Zxdðdñ„Zydòdó„Zzdôdõ„Z{�d*död÷„Z|dødù„Z}dúdû„Z~düdý„Zdþdÿ„Z€�d�d„Z��d�d„Z‚�d�d„Zƒ�d�d„Z„�d+�d �d „Z…dS(,ÚFirewallPolicycCs||_i|_i|_dS)N)Ú_fwÚ_chainsÚ _policies)ÚselfÚfw©r#ú/usr/lib/python3.6/fw_policy.pyÚ__init__szFirewallPolicy.__init__cCsd|j|j|jfS)Nz %s(%r, %r))Ú __class__rr )r!r#r#r$Ú__repr__szFirewallPolicy.__repr__cCs|jjƒ|jjƒdS)N)rÚclearr )r!r#r#r$Úcleanups zFirewallPolicy.cleanupcCs t|jƒS)N)rr)r!r#r#r$Únew_transaction$szFirewallPolicy.new_transactioncCst|jjƒƒS)N)Úsortedr Úkeys)r!r#r#r$Ú get_policies)szFirewallPolicy.get_policiescCs8g}x*|jƒD]}|j|ƒ}|js|j|ƒqWt|ƒS)N)r-Ú get_policyÚderived_from_zoneÚappendr+)r!ZpoliciesÚpÚp_objr#r#r$Ú"get_policies_not_derived_from_zone,s  z1FirewallPolicy.get_policies_not_derived_from_zonecCs~g}xt|jƒD]h}|j|ƒ}t|dƒt|jjjƒƒtddgƒB@rt|dƒt|jjjƒƒtddgƒB@r|j|ƒqW|S)NÚ ingress_zonesÚHOSTÚANYÚ egress_zones)r3Ú get_settingsÚsetrÚzoneZget_active_zonesr0)r!Zactive_policiesÚpolicyÚsettingsr#r#r$Ú)get_active_policies_not_derived_from_zone4s ((z8FirewallPolicy.get_active_policies_not_derived_from_zonecCs|jj|ƒ}|j|S)N)rÚ check_policyr )r!r;r1r#r#r$r.>s zFirewallPolicy.get_policyc Cs,dd„dDƒ|_||j|j<|j|jƒdS)NcSsi|] }tƒ|“qSr#)r)Ú.0Úxr#r#r$ú Csz-FirewallPolicy.add_policy..ÚservicesÚportsÚ masqueradeÚ forward_portsÚ source_portsÚ icmp_blocksÚrulesÚ protocolsÚicmp_block_inversionr4r7) rBrCrDrErFrGrHrIrJr4r7)r<r ÚnameÚcopy_permanent_to_runtime)r!Úobjr#r#r$Ú add_policyBs  zFirewallPolicy.add_policycCs0|j|}|jr|j|ƒ|jjƒ|j|=dS)N)r ÚappliedÚunapply_policy_settingsr<r()r!r;rMr#r#r$Ú remove_policyNs    zFirewallPolicy.remove_policycCsÒ|j|}|jrdSx|jD]}|j||dd�qWx|jD]}|j||dd�qr rOr*r/Ú%_get_table_chains_for_policy_dispatchÚ#_get_table_chains_for_zone_dispatchÚgen_chain_rulesr8Ú_ingress_egress_zonesÚ _icmp_blockÚ _forward_portÚ_serviceÚ_portÚ _protocolÚ _source_portÚ _masqueradeÚ_FirewallPolicy__ruler rr[Úexecute) r!Úenabler;rbÚ_policyrMÚ transactionÚtableÚchainr<Úkeyr`r#r#r$Ú_policy_settings—sj                zFirewallPolicy._policy_settingscCs|jd||d�dS)NT)rb)r)r!r;rbr#r#r$rcÖsz$FirewallPolicy.apply_policy_settingscCs|jd||d�dS)NF)rb)r)r!r;rbr#r#r$rPÙsz&FirewallPolicy.unapply_policy_settingsc Csr|j|ƒjƒ}|j|ƒ|j|ƒ|j|ƒ|j|ƒ|j|ƒ|j|ƒ|j|ƒ|j |ƒ|j |ƒ|j |ƒdœ }|j j ||ƒS)zH :return: exported config updated with runtime settings ) rBrCrGrDrEÚ rich_rulesrIrFr4r7)r.Zexport_config_dictÚ list_servicesÚ list_portsÚlist_icmp_blocksÚquery_masqueradeÚlist_forward_portsÚ list_rulesÚlist_protocolsÚlist_source_portsÚlist_ingress_zonesÚlist_egress_zonesrZ'combine_runtime_with_permanent_settings)r!r;Z permanentZruntimer#r#r$Úget_config_with_settings_dictÜsz,FirewallPolicy.get_config_with_settings_dictc s¶ddlm‰d ‡‡fdd„ }‡‡fdd„}ˆjˆjfˆjˆjfˆjˆjfˆjˆj fˆj ˆj f||fˆj ˆj fˆjˆjfˆjˆjfˆjˆjfdœ }ˆj|ƒ}ˆjj||ƒ\}} xt| D]l} t| | tƒ�rxV| | D]8} t| tƒrö|| d|f| žŽqÐ|| d|| ƒqÐWq²|| d|ƒq²WxŽ|D]†} t|| tƒ�r–xn|| D]J} t| tƒ�rv|| d|f| žd|d œŽn|| d|| d|d ��qFWn|| d|d|d ��q(WdS) Nr)r csˆj|ˆ|d�d|d�dS)N)rkr)rgrf)r^)r;rkrgrf)r r!r#r$Úadd_rule_wrapperñszFFirewallPolicy.set_config_with_settings_dict..add_rule_wrappercsˆj|ˆ|d�ƒdS)N)rk)Ú remove_rule)r;rk)r r!r#r$Úremove_rule_wrapperószIFirewallPolicy.set_config_with_settings_dict..remove_rule_wrapper) rBrCrGrDrEr€rIrFr4r7rj)rgrf)rN)Úfirewall.core.richr rWÚremove_servicerXÚ remove_portrUÚremove_icmp_blockr_Úremove_masqueraderVÚremove_forward_portr\Úremove_protocolr]Úremove_source_portrSÚremove_ingress_zonerTÚremove_egress_zoner‹rZget_added_and_removed_settingsÚ isinstanceÚlistÚtuple) r!r;r<rfrŒrŽZ setting_to_fnZ old_settingsZ add_settingsZremove_settingsr~r`r#)r r!r$Úset_config_with_settings_dictîs:                z,FirewallPolicy.set_config_with_settings_dictcCs&|sttjƒ‚|dkr"|jj|ƒdS)Nr5r6)r5r6)rrÚ INVALID_ZONErÚ check_zone)r!r:r#r#r$Úcheck_ingress_zones z!FirewallPolicy.check_ingress_zonecCs|j|ƒ|S)N)rŸ)r!r:r#r#r$Z__ingress_zone_id"s z FirewallPolicy.__ingress_zone_idrTc Cs‚|jj|ƒ}|jj|ƒ|jjƒ|j|}|j|ƒ} | |jdkrXttj d||fƒ‚d|jdks†d|jdks†|d kr’|jdr’ttj dƒ‚|dkr´d|jdkr´ttj dƒ‚|dkrÆ|j ƒ} n|} |�rJ|j rä|j d|| ƒ|j|| ||ƒ| j|j|| ƒ|j �s:||jƒk�rH|j|| d �| j|j|dƒn|j d || ƒn |j|| ||ƒ| j|j|| ƒ|dk�r~| jd ƒdS) Nr4z'%s' already in '%s'r6r5zI'ingress-zones' may only contain one of: many regular zones, ANY, or HOSTr7zF'HOST' can only appear in either ingress or egress zones, but not bothF)rbT)r6r5)rr>Ú check_timeoutÚ check_panicr Ú _FirewallPolicy__ingress_zone_idr<rrrZr�r*rOroÚ&_FirewallPolicy__register_ingress_zoneÚadd_failÚ(_FirewallPolicy__unregister_ingress_zoner=rcrerx) r!r;r:rgrfrbrRrzÚ_objÚzone_idr{r#r#r$rS&s<         zFirewallPolicy.add_ingress_zonecCs|j||ƒ|jd|<dS)Nr4)Ú_FirewallPolicy__gen_settingsr<)r!r¦r§rgrfr#r#r$Z__register_ingress_zoneSsz&FirewallPolicy.__register_ingress_zonecCsø|jj|ƒ}|jjƒ|j|}|j|ƒ}||jdkrLttjd||fƒ‚|dkr^|j ƒ}n|}|j rÒt |jdƒdkrˆ|j ||ƒn|j d||ƒ|j||ƒ|j|j||ddƒ||jƒkrâ|j d||ƒn|j|j||ƒ|dkrô|jdƒ|S)Nr4z'%s' not in '%s'rjFT)rr>r¡r r¢r<rrÚ NOT_ENABLEDr*rOÚlenrPror¥r¤r£r=Úadd_postrx)r!r;r:rbrzr¦r§r{r#r#r$r—Vs,        z"FirewallPolicy.remove_ingress_zonecCs||jdkr|jd|=dS)Nr4)r<)r!r¦r§r#r#r$Z__unregister_ingress_zoneysz(FirewallPolicy.__unregister_ingress_zonecCs|j|ƒ|j|ƒdkS)Nr4)r¢r8)r!r;r:r#r#r$Úquery_ingress_zone}sz!FirewallPolicy.query_ingress_zonecCst|j|ƒdjƒƒS)Nr4)ršr8r,)r!r;r#r#r$r‰€sz!FirewallPolicy.list_ingress_zonescCs&|sttjƒ‚|dkr"|jj|ƒdS)Nr5r6)r5r6)rrr�rrž)r!r:r#r#r$Úcheck_egress_zone…s z FirewallPolicy.check_egress_zonecCs|j|ƒ|S)N)r­)r!r:r#r#r$Z__egress_zone_id‹s zFirewallPolicy.__egress_zone_idc Cs‚|jj|ƒ}|jj|ƒ|jjƒ|j|}|j|ƒ} | |jdkrXttj d||fƒ‚d|jdks†d|jdks†|d kr’|jdr’ttj dƒ‚|dkr´d|jdkr´ttj dƒ‚|dkrÆ|j ƒ} n|} |�rJ|j rä|j d|| ƒ|j|| ||ƒ| j|j|| ƒ|j �s:||jƒk�rH|j|| d �| j|j|dƒn|j d || ƒn |j|| ||ƒ| j|j|| ƒ|dk�r~| jd ƒdS) Nr7z'%s' already in '%s'r6r5zH'egress-zones' may only contain one of: many regular zones, ANY, or HOSTr4zF'HOST' can only appear in either ingress or egress zones, but not bothF)rbT)r6r5)rr>r r¡r Ú_FirewallPolicy__egress_zone_idr<rrrZr�r*rOroÚ%_FirewallPolicy__register_egress_zoner¤Ú'_FirewallPolicy__unregister_egress_zoner=rcrerx) r!r;r:rgrfrbrRrzr¦r§r{r#r#r$rT�s<         zFirewallPolicy.add_egress_zonecCs|j||ƒ|jd|<dS)Nr7)r¨r<)r!r¦r§rgrfr#r#r$Z__register_egress_zone¼sz%FirewallPolicy.__register_egress_zonecCsø|jj|ƒ}|jjƒ|j|}|j|ƒ}||jdkrLttjd||fƒ‚|dkr^|j ƒ}n|}|j rÒt |jdƒdkrˆ|j ||ƒn|j d||ƒ|j||ƒ|j|j||ddƒ||jƒkrâ|j d||ƒn|j|j||ƒ|dkrô|jdƒ|S)Nr7z'%s' not in '%s'rjFT)rr>r¡r r®r<rrr©r*rOrªrPror°r¤r¯r=r«rx)r!r;r:rbrzr¦r§r{r#r#r$r˜¿s,        z!FirewallPolicy.remove_egress_zonecCs||jdkr|jd|=dS)Nr7)r<)r!r¦r§r#r#r$Z__unregister_egress_zoneâsz'FirewallPolicy.__unregister_egress_zonecCs|j|ƒ|j|ƒdkS)Nr7)r®r8)r!r;r:r#r#r$Úquery_egress_zoneæsz FirewallPolicy.query_egress_zonecCst|j|ƒdjƒƒS)Nr7)ršr8r,)r!r;r#r#r$rŠész FirewallPolicy.list_egress_zonescCs |jƒdS)N)Zcheck)r!Úruler#r#r$Ú check_ruleîszFirewallPolicy.check_rulecCs|j|ƒt|ƒS)N)r³Ústr)r!r²r#r#r$Z __rule_idñs zFirewallPolicy.__rule_idcCsx|sdS|jr,t|jƒrdSt|jƒrtdSnHt|dƒr@|jr@dSt|dƒrt|jrt|j|jƒ|j|jƒ|j|jƒSdS)NÚipv4Úipv6ÚmacÚÚipset) ZaddrrrÚhasattrr·r¹Ú_check_ipset_type_for_sourceÚ_check_ipset_appliedÚ _ipset_family)r!Úsourcer#r#r$Ú_rule_source_ipvõs     zFirewallPolicy._rule_source_ipvcCs|j||||ƒdS)N)Ú _rule_prepare)r!ryr;r²r{r#r#r$Z__ruleszFirewallPolicy.__rulec CsL|jj|ƒ}|jj|ƒ|jjƒ|j|}|j|ƒ}||jdkrh|jrP|jn|} tt j d|| fƒ‚|j�sä|j rît |j t ƒrîd|jdkrœtt jdƒ‚d|jdkr¶tt jdƒ‚x6|jdD](} | dkrÐqÂ|jjj| ƒrÂtt jd ƒ‚qÂW|j �rŽt |j tƒ�rŽd|jdk�r,|j j�rŽtt jd ƒ‚nb|jd�rŽ|j j�sNtt jd ƒ‚x>|jdD]0} | dk�rl�qZ|jjj| ƒ�rZtt jd ƒ‚�qZW|j�rät |jtƒ�räx>|jdD]0} | dk�rÂ�q°|jjj| ƒ�r°tt jd ƒ‚�q°W|dk�rø|jƒ} n|} |j�r|jd||| ƒ|j||||ƒ| j|j||ƒ|dk�rH| jdƒ|S)NrHz'%s' already in '%s'r5r7z.'masquerade' is invalid for egress zone 'HOST'r4z/'masquerade' is invalid for ingress zone 'HOST'r6zR'masquerade' cannot be used in a policy if an ingress zone has assigned interfaceszAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zonezS'forward-port' cannot be used in a policy if an egress zone has assigned interfaceszR'mark' action cannot be used in a policy if an egress zone has assigned interfacesT)r6r5)rr>r r¡r Ú_FirewallPolicy__rule_idr<r/rrrZÚelementr™rr�r:Úlist_interfacesrÚ to_addressÚINVALID_FORWARDÚactionrr*rOrwÚ_FirewallPolicy__register_ruler¤Ú _FirewallPolicy__unregister_rulerx) r!r;r²rgrfrbrzr¦Úrule_idÚ_namer:r{r#r#r$r^ s`                 zFirewallPolicy.add_rulecCs|j||ƒ|jd|<dS)NrH)r¨r<)r!r¦rÉrgrfr#r#r$Z__register_ruleEszFirewallPolicy.__register_rulec Cs®|jj|ƒ}|jjƒ|j|}|j|ƒ}||jdkr\|jrD|jn|}ttj d||fƒ‚|dkrn|j ƒ}n|}|j rˆ|j d|||ƒ|j |j||ƒ|dkrª|jdƒ|S)NrHz'%s' not in '%s'FT)rr>r¡r rÁr<r/rrr©r*rOrwr«rÈrx) r!r;r²rbrzr¦rÉrÊr{r#r#r$r�Is"      zFirewallPolicy.remove_rulecCs||jdkr|jd|=dS)NrH)r<)r!r¦rÉr#r#r$Z__unregister_ruledsz FirewallPolicy.__unregister_rulecCs|j|ƒ|j|ƒdkS)NrH)rÁr8)r!r;r²r#r#r$Ú query_rulehszFirewallPolicy.query_rulecCst|j|ƒdjƒƒS)NrH)ršr8r,)r!r;r#r#r$r†kszFirewallPolicy.list_rulescCs|jj|ƒdS)N)rÚ check_service)r!Úservicer#r#r$rÌpszFirewallPolicy.check_servicecCs|j|ƒ|S)N)rÌ)r!rÍr#r#r$Z __service_idss zFirewallPolicy.__service_idc CsÊ|jj|ƒ}|jj|ƒ|jjƒ|j|}|j|ƒ}||jdkrh|jrP|jn|} tt j d|| fƒ‚|dkrz|j ƒ} n|} |j r”|j d||| ƒ|j||||ƒ| j|j||ƒ|dkrÆ| jdƒ|S)NrBz'%s' already in '%s'T)rr>r r¡r Ú_FirewallPolicy__service_idr<r/rrrZr*rOrrÚ!_FirewallPolicy__register_servicer¤Ú#_FirewallPolicy__unregister_servicerx) r!r;rÍrgrfrbrzr¦Ú service_idrÊr{r#r#r$rWws&       zFirewallPolicy.add_servicecCs|j||ƒ|jd|<dS)NrB)r¨r<)r!r¦rÑrgrfr#r#r$Z__register_service”sz!FirewallPolicy.__register_servicec Cs®|jj|ƒ}|jjƒ|j|}|j|ƒ}||jdkr\|jrD|jn|}ttj d||fƒ‚|dkrn|j ƒ}n|}|j rˆ|j d|||ƒ|j |j||ƒ|dkrª|jdƒ|S)NrBz'%s' not in '%s'FT)rr>r¡r rÎr<r/rrr©r*rOrrr«rÐrx) r!r;rÍrbrzr¦rÑrÊr{r#r#r$r�˜s"      zFirewallPolicy.remove_servicecCs||jdkr|jd|=dS)NrB)r<)r!r¦rÑr#r#r$Z__unregister_service³sz#FirewallPolicy.__unregister_servicecCs|j|ƒ|j|ƒdkS)NrB)rÎr8)r!r;rÍr#r#r$Ú query_service·szFirewallPolicy.query_servicecCs|j|ƒdjƒS)NrB)r8r,)r!r;r#r#r$r�ºszFirewallPolicy.list_servicesc CsTg}xJ|D]B}y|jjj|ƒ}Wn tk r@ttj|ƒ‚YnX|j|ƒq W|S)N)rÚhelperÚ get_helperrrÚINVALID_HELPERr0)r!ÚhelpersÚ_helpersrÓÚ_helperr#r#r$Úget_helpers_for_service_helpers½s z.FirewallPolicy.get_helpers_for_service_helperscCs´g}xª|D]¢}y|jjj|ƒ}Wn tk r@ttj|ƒ‚YnXt|jƒdkr¢t|j ƒ}y|jjj|ƒ}|j |ƒWq¬tk rž|r˜t j d|ƒw Yq¬Xq |j |ƒq W|S)NrjzHelper '%s' is not available) rrÓrÔrrrÕrªrCr Úmoduler0rr[)r!Úmodulesryr×rÚrÓÚ_module_short_namerØr#r#r$Úget_helpers_for_service_modulesÇs"   z.FirewallPolicy.get_helpers_for_service_modulescCs|jj|ƒ|jj|ƒdS)N)rÚ check_portÚ check_tcpudp)r!ÚportÚprotocolr#r#r$rÞàs zFirewallPolicy.check_portcCs|j||ƒt|dƒ|fS)Nú-)rÞr)r!ràrár#r#r$Z __port_idäs zFirewallPolicy.__port_idcsŒ|jj|ƒ}|jj|ƒ|jjƒ|j|}tt‡fdd„|jdƒƒ} x@| D]8} t|| dƒrN|j rl|j n|} t t j d|ˆ| fƒ‚qNWt |dd„| Dƒƒ\} } |dkr´|jƒ}n|}|j�r x$| D]}|jd|t|d ƒˆ|ƒqÆWx$| D]}|jd |t|d ƒˆ|ƒqìWx:| D]2}|j|ˆƒ} |j|| ||ƒ|j|j|| ƒ�qWx*| D]"}|j|ˆƒ} |j|j|| ƒ�qNW|dk�rˆ|jdƒ|S) Ncs |dˆkS)Nrjr#)r@)rár#r$Úïsz)FirewallPolicy.add_port..rCrz'%s:%s' already in '%s'cSsg|] \}}|‘qSr#r#)r?rsrtr#r#r$ú ösz+FirewallPolicy.add_port..TrâF)rr>r r¡r ršÚfilterr<r r/rrrZr r*rOrsrÚ_FirewallPolicy__port_idÚ_FirewallPolicy__register_portr¤Ú _FirewallPolicy__unregister_portr«rx)r!r;ràrárgrfrbrzr¦Úexisting_port_idsÚport_idrÊÚ added_rangesÚremoved_rangesr{Úranger#)rár$rXès:              zFirewallPolicy.add_portcCs|j||ƒ|jd|<dS)NrC)r¨r<)r!r¦rêrgrfr#r#r$Z__register_portszFirewallPolicy.__register_portcs‚|jj|ƒ}|jjƒ|j|}tt‡fdd„|jdƒƒ}xB|D]}t||dƒrBPqBW|jrf|jn|} t t j d|ˆ| fƒ‚t |dd„|Dƒƒ\} } |dkrª|j ƒ} n|} |j�rx$| D]} |jd|t| d ƒˆ| ƒq¼Wx$| D]} |jd |t| d ƒˆ| ƒqâWx:| D]2} |j| ˆƒ}|j||ddƒ| j|j||ƒ�qWx*| D]"} |j| ˆƒ}| j|j||ƒ�qDW|dk�r~| jdƒ|S) Ncs |dˆkS)Nrjr#)r@)rár#r$rãsz,FirewallPolicy.remove_port..rCrz'%s:%s' not in '%s'cSsg|] \}}|‘qSr#r#)r?rsrtr#r#r$rä#sz.FirewallPolicy.remove_port..TrâF)rr>r¡r ršrår<r r/rrr©r r*rOrsrrærçr¤rèr«rx)r!r;ràrárbrzr¦rérêrÊrërìr{rír#)rár$r‘s:             zFirewallPolicy.remove_portcCs||jdkr|jd|=dS)NrC)r<)r!r¦rêr#r#r$Z__unregister_port=sz FirewallPolicy.__unregister_portcCs6x0|j|ƒdD]\}}t||ƒr||krdSqWdS)NrCTF)r8r )r!r;ràrársrtr#r#r$Ú query_portAszFirewallPolicy.query_portcCst|j|ƒdjƒƒS)NrC)ršr8r,)r!r;r#r#r$r‚HszFirewallPolicy.list_portscCst|ƒsttj|ƒ‚dS)N)rrrZINVALID_PROTOCOL)r!rár#r#r$Úcheck_protocolMszFirewallPolicy.check_protocolcCs|j|ƒ|S)N)rï)r!rár#r#r$Z __protocol_idQs zFirewallPolicy.__protocol_idc CsÊ|jj|ƒ}|jj|ƒ|jjƒ|j|}|j|ƒ}||jdkrh|jrP|jn|} tt j d|| fƒ‚|dkrz|j ƒ} n|} |j r”|j d||| ƒ|j||||ƒ| j|j||ƒ|dkrÆ| jdƒ|S)NrIz'%s' already in '%s'T)rr>r r¡r Ú_FirewallPolicy__protocol_idr<r/rrrZr*rOrtÚ"_FirewallPolicy__register_protocolr¤Ú$_FirewallPolicy__unregister_protocolrx) r!r;rárgrfrbrzr¦Ú protocol_idrÊr{r#r#r$r\Us&       zFirewallPolicy.add_protocolcCs|j||ƒ|jd|<dS)NrI)r¨r<)r!r¦rórgrfr#r#r$Z__register_protocolrsz"FirewallPolicy.__register_protocolc Cs®|jj|ƒ}|jjƒ|j|}|j|ƒ}||jdkr\|jrD|jn|}ttj d||fƒ‚|dkrn|j ƒ}n|}|j rˆ|j d|||ƒ|j |j||ƒ|dkrª|jdƒ|S)NrIz'%s' not in '%s'FT)rr>r¡r rðr<r/rrr©r*rOrtr«ròrx) r!r;rárbrzr¦rórÊr{r#r#r$r•vs$       zFirewallPolicy.remove_protocolcCs||jdkr|jd|=dS)NrI)r<)r!r¦rór#r#r$Z__unregister_protocol’sz$FirewallPolicy.__unregister_protocolcCs|j|ƒ|j|ƒdkS)NrI)rðr8)r!r;rár#r#r$Úquery_protocol–szFirewallPolicy.query_protocolcCst|j|ƒdjƒƒS)NrI)ršr8r,)r!r;r#r#r$r‡™szFirewallPolicy.list_protocolscCs|j||ƒt|dƒ|fS)Nrâ)rÞr)r!ràrár#r#r$Z__source_port_idžs zFirewallPolicy.__source_port_idcsŒ|jj|ƒ}|jj|ƒ|jjƒ|j|}tt‡fdd„|jdƒƒ} x@| D]8} t|| dƒrN|j rl|j n|} t t j d|ˆ| fƒ‚qNWt |dd„| Dƒƒ\} } |dkr´|jƒ}n|}|j�r x$| D]}|jd|t|d ƒˆ|ƒqÆWx$| D]}|jd |t|d ƒˆ|ƒqìWx:| D]2}|j|ˆƒ} |j|| ||ƒ|j|j|| ƒ�qWx*| D]"}|j|ˆƒ} |j|j|| ƒ�qNW|dk�rˆ|jdƒ|S) Ncs |dˆkS)Nrjr#)r@)rár#r$rã©sz0FirewallPolicy.add_source_port..rFrz'%s:%s' already in '%s'cSsg|] \}}|‘qSr#r#)r?rsrtr#r#r$rä°sz2FirewallPolicy.add_source_port..TrâF)rr>r r¡r ršrår<r r/rrrZr r*rOrurÚ_FirewallPolicy__source_port_idÚ%_FirewallPolicy__register_source_portr¤Ú'_FirewallPolicy__unregister_source_portr«rx)r!r;ràrárgrfrbrzr¦rérêrÊrërìr{rír#)rár$r]¢s:              zFirewallPolicy.add_source_portcCs|j||ƒ|jd|<dS)NrF)r¨r<)r!r¦rêrgrfr#r#r$Z__register_source_portÊsz%FirewallPolicy.__register_source_portcs‚|jj|ƒ}|jjƒ|j|}tt‡fdd„|jdƒƒ}xB|D]}t||dƒrBPqBW|jrf|jn|} t t j d|ˆ| fƒ‚t |dd„|Dƒƒ\} } |dkrª|j ƒ} n|} |j�rx$| D]} |jd|t| d ƒˆ| ƒq¼Wx$| D]} |jd |t| d ƒˆ| ƒqâWx:| D]2} |j| ˆƒ}|j||ddƒ| j|j||ƒ�qWx*| D]"} |j| ˆƒ}| j|j||ƒ�qDW|dk�r~| jdƒ|S) Ncs |dˆkS)Nrjr#)r@)rár#r$rãÔsz3FirewallPolicy.remove_source_port..rFrz'%s:%s' not in '%s'cSsg|] \}}|‘qSr#r#)r?rsrtr#r#r$räÝsz5FirewallPolicy.remove_source_port..TrâF)rr>r¡r ršrår<r r/rrr©r r*rOrurrõrör¤r÷r«rx)r!r;ràrárbrzr¦rérêrÊrërìr{rír#)rár$r–Îs:             z!FirewallPolicy.remove_source_portcCs||jdkr|jd|=dS)NrF)r<)r!r¦rêr#r#r$Z__unregister_source_port÷sz'FirewallPolicy.__unregister_source_portcCs6x0|j|ƒdD]\}}t||ƒr||krdSqWdS)NrFTF)r8r )r!r;ràrársrtr#r#r$Úquery_source_portûsz FirewallPolicy.query_source_portcCst|j|ƒdjƒƒS)NrF)ršr8r,)r!r;r#r#r$rˆsz FirewallPolicy.list_source_portscCsdS)NTr#)r!r#r#r$Z__masquerade_idszFirewallPolicy.__masquerade_idc Cs8|jj|ƒ}|jj|ƒ|jjƒ|j|}|jƒ}||jdkrb|jrN|jn|}tt j d|ƒ‚|jsÔd|jdkr‚tt j dƒ‚d|jdkrœtt j dƒ‚x6|jdD](} | dkr¶q¨|jj j | ƒr¨tt j d ƒ‚q¨W|dkræ|jƒ} n|} |j�r|jd || ƒ|j||||ƒ| j|j||ƒ|dk�r4| jd ƒ|S) NrDz"masquerade already enabled in '%s'r5r7z.'masquerade' is invalid for egress zone 'HOST'r4z/'masquerade' is invalid for ingress zone 'HOST'r6zR'masquerade' cannot be used in a policy if an ingress zone has assigned interfacesT)rr>r r¡r Ú_FirewallPolicy__masquerade_idr<r/rrrZr�r:rÃr*rOrvÚ$_FirewallPolicy__register_masquerader¤Ú&_FirewallPolicy__unregister_masqueraderx) r!r;rgrfrbrzr¦Ú masquerade_idrÊr:r{r#r#r$r_ s:          zFirewallPolicy.add_masqueradecCs|j||ƒ|jd|<dS)NrD)r¨r<)r!r¦rürgrfr#r#r$Z__register_masquerade2sz$FirewallPolicy.__register_masqueradecCs¦|jj|ƒ}|jjƒ|j|}|jƒ}||jdkrV|jrB|jn|}ttj d|ƒ‚|dkrh|j ƒ}n|}|j r€|j d||ƒ|j |j||ƒ|dkr¢|jdƒ|S)NrDzmasquerade not enabled in '%s'FT)rr>r¡r rùr<r/rrr©r*rOrvr«rûrx)r!r;rbrzr¦rürÊr{r#r#r$r“6s"      z FirewallPolicy.remove_masqueradecCs||jdkr|jd|=dS)NrD)r<)r!r¦rür#r#r$Z__unregister_masqueradePsz&FirewallPolicy.__unregister_masqueradecCs|jƒ|j|ƒdkS)NrD)rùr8)r!r;r#r#r$r„TszFirewallPolicy.query_masqueradecCs^|jj|ƒ|jj|ƒ|r(|jj|ƒ|rBt||ƒsBttj|ƒ‚| rZ| rZttjdƒ‚dS)Nz.port-forwarding is missing to-port AND to-addr)rrÞrßrrrZ INVALID_ADDRrÅ)r!ÚipvràráÚtoportÚtoaddrr#r#r$Úcheck_forward_portYs      z!FirewallPolicy.check_forward_portcCsLtd|ƒr|jd||||ƒn|jd||||ƒt|dƒ|t|dƒt|ƒfS)Nr¶rµrâ)rrrr´)r!ràrárþrÿr#r#r$Z__forward_port_idfs   z FirewallPolicy.__forward_port_idc CsZ|jj|ƒ} |jj|ƒ|jjƒ|j| } |j||||ƒ} | | jdkrt| jrV| jn| } tt j d||||| fƒ‚| jsìd| jdkrš|rìtt j dƒ‚nR| jdrì|s´tt j dƒ‚x6| jdD](} | dkrÎqÀ|jj j | ƒrÀtt jdƒ‚qÀW|dk�r|jƒ}n|}| j�r"|jd | |||||ƒ|j| | ||ƒ|j|j| | ƒ|dk�rV|jd ƒ| S) NrEz'%s:%s:%s:%s' already in '%s'r5r7zAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zoner6zS'forward-port' cannot be used in a policy if an egress zone has assigned interfacesT)rr>r r¡r Ú _FirewallPolicy__forward_port_idr<r/rrrZrÅr:rÃr�r*rOrqÚ&_FirewallPolicy__register_forward_portr¤Ú(_FirewallPolicy__unregister_forward_portrx)r!r;ràrárþrÿrgrfrbrzr¦Ú forward_idrÊr:r{r#r#r$rVnsB          zFirewallPolicy.add_forward_portcCs|j||ƒ|jd|<dS)NrE)r¨r<)r!r¦rrgrfr#r#r$Z__register_forward_port›sz&FirewallPolicy.__register_forward_portc CsÀ|jj|ƒ}|jjƒ|j|}|j||||ƒ} | |jdkrh|jrJ|jn|} ttj d||||| fƒ‚|dkrz|j ƒ} n|} |j rš|j d|| ||||ƒ| j |j|| ƒ|dkr¼| jdƒ|S)NrEz'%s:%s:%s:%s' not in '%s'FT)rr>r¡r rr<r/rrr©r*rOrqr«rrx) r!r;ràrárþrÿrbrzr¦rrÊr{r#r#r$r”Ÿs&     z"FirewallPolicy.remove_forward_portcCs||jdkr|jd|=dS)NrE)r<)r!r¦rr#r#r$Z__unregister_forward_port¼sz(FirewallPolicy.__unregister_forward_portcCs"|j||||ƒ}||j|ƒdkS)NrE)rr8)r!r;ràrárþrÿrr#r#r$Úquery_forward_portÀsz!FirewallPolicy.query_forward_portcCst|j|ƒdjƒƒS)NrE)ršr8r,)r!r;r#r#r$r…Åsz!FirewallPolicy.list_forward_portscCs|jj|ƒdS)N)rZcheck_icmptype)r!Úicmpr#r#r$Úcheck_icmp_blockÊszFirewallPolicy.check_icmp_blockcCs|j|ƒ|S)N)r)r!rr#r#r$Z__icmp_block_idÍs zFirewallPolicy.__icmp_block_idc CsÊ|jj|ƒ}|jj|ƒ|jjƒ|j|}|j|ƒ}||jdkrh|jrP|jn|} tt j d|| fƒ‚|dkrz|j ƒ} n|} |j r”|j d||| ƒ|j||||ƒ| j|j||ƒ|dkrÆ| jdƒ|S)NrGz'%s' already in '%s'T)rr>r r¡r Ú_FirewallPolicy__icmp_block_idr<r/rrrZr*rOrpÚ$_FirewallPolicy__register_icmp_blockr¤Ú&_FirewallPolicy__unregister_icmp_blockrx) r!r;rrgrfrbrzr¦Úicmp_idrÊr{r#r#r$rUÑs&       zFirewallPolicy.add_icmp_blockcCs|j||ƒ|jd|<dS)NrG)r¨r<)r!r¦r rgrfr#r#r$Z__register_icmp_blockîsz$FirewallPolicy.__register_icmp_blockc Cs®|jj|ƒ}|jjƒ|j|}|j|ƒ}||jdkr\|jrD|jn|}ttj d||fƒ‚|dkrn|j ƒ}n|}|j rˆ|j d|||ƒ|j |j||ƒ|dkrª|jdƒ|S)NrGz'%s' not in '%s'FT)rr>r¡r rr<r/rrr©r*rOrpr«r rx) r!r;rrbrzr¦r rÊr{r#r#r$r’òs"      z FirewallPolicy.remove_icmp_blockcCs||jdkr|jd|=dS)NrG)r<)r!r¦r r#r#r$Z__unregister_icmp_block sz&FirewallPolicy.__unregister_icmp_blockcCs|j|ƒ|j|ƒdkS)NrG)rr8)r!r;rr#r#r$Úquery_icmp_blockszFirewallPolicy.query_icmp_blockcCs|j|ƒdjƒS)NrG)r8r,)r!r;r#r#r$rƒszFirewallPolicy.list_icmp_blockscCsdS)NTr#)r!r#r#r$Z__icmp_block_inversion_idsz(FirewallPolicy.__icmp_block_inversion_idc Cs|jj|ƒ}|jjƒ|j|}|jƒ}||jdkrV|jrB|jn|}ttj d|ƒ‚|dkrh|j ƒ}n|}|j r¨x&|j |ƒdD]} |j d|| |ƒq‚W|jd||ƒ|j|||ƒ|j|j|||ƒ|j �rx&|j |ƒdD]} |j d|| |ƒqàW|jd||ƒ|dk�r|jdƒ|S)NrJz,icmp-block-inversion already enabled in '%s'rGFT)rr>r¡r Ú(_FirewallPolicy__icmp_block_inversion_idr<r/rrrZr*rOr8rpÚ_icmp_block_inversionÚ._FirewallPolicy__register_icmp_block_inversionr¤Ú*_FirewallPolicy__undo_icmp_block_inversionrx) r!r;rfrbrzr¦Úicmp_block_inversion_idrÊr{r`r#r#r$Úadd_icmp_block_inversions6        z'FirewallPolicy.add_icmp_block_inversioncCs|jd|ƒ|jd|<dS)NrrJ)r¨r<)r!r¦rrfr#r#r$Z__register_icmp_block_inversionEsz.FirewallPolicy.__register_icmp_block_inversioncCsŒ|jƒ}|jr6x&|j|ƒdD]}|jd|||ƒqW||jdkrP|jd|=|jr~x&|j|ƒdD]}|jd|||ƒqfW|jdƒdS)NrGFrJT)r*rOr8rpr<rx)r!rzr¦rr{r`r#r#r$Z__undo_icmp_block_inversionJs z*FirewallPolicy.__undo_icmp_block_inversionc Cs|jj|ƒ}|jjƒ|j|}|jƒ}||jdkrV|jrB|jn|}ttj d|ƒ‚|dkrh|j ƒ}n|}|j r¨x&|j |ƒdD]}|j d|||ƒq‚W|jd||ƒ|j||ƒ|j|j||dƒ|j �rx&|j |ƒdD]}|j d|||ƒqÞW|jd||ƒ|dk�r|jdƒ|S)NrJz(icmp-block-inversion not enabled in '%s'rGFT)rr>r¡r r r<r/rrr©r*rOr8rprÚ0_FirewallPolicy__unregister_icmp_block_inversionr¤rrx) r!r;rbrzr¦rrÊr{r`r#r#r$Úremove_icmp_block_inversion\s6        z*FirewallPolicy.remove_icmp_block_inversioncCs||jdkr|jd|=dS)NrJ)r<)r!r¦rr#r#r$Z!__unregister_icmp_block_inversion…sz0FirewallPolicy.__unregister_icmp_block_inversioncCs|jƒ|j|ƒdkS)NrJ)r r8)r!r;r#r#r$Úquery_icmp_block_inversion‰sz)FirewallPolicy.query_icmp_block_inversionc Csè|jjj|ƒ}|jr*|jjj|jd}n|}|rT||jkrt||f|j|krtdSn ||jksp||f|j|krtdSx@|jjƒD]2}|jr€||j ƒkr€|j ||||ƒ} |j || ƒq€W|j ||||fgƒ|j |j || ||fgƒdS)Nr)rr;r.r/r:Z_zone_policiesrÚenabled_backendsÚpolicies_supportedZget_available_tablesZbuild_policy_chain_rulesÚ add_rulesÚ_register_chainsr¤) r!r;Úcreater|r}r{rMZtracking_policyÚbackendrHr#r#r$rn�s$   zFirewallPolicy.gen_chain_rulescCsbx\|D]T\}}|r,|jj|gƒj||fƒq|j|j||fƒt|j|ƒdkr|j|=qWdS)Nr)rÚ setdefaultr0Úremoverª)r!r;rZtablesr|r}r#r#r$rªs zFirewallPolicy._register_chainscCs$|jjj|ƒdkrdS|jjj|ƒS)Nzhash:mac)rr¹Úget_typeZ get_family)r!rKr#r#r$r½µszFirewallPolicy._ipset_familycCs|jjj|ƒS)N)rr¹r)r!rKr#r#r$Z __ipset_typeºszFirewallPolicy.__ipset_typecCsdj|g|jjj|ƒƒS)Nú,)Újoinrr¹Z get_dimension)r!rKÚflagr#r#r$Ú_ipset_match_flags½sz!FirewallPolicy._ipset_match_flagscCs|jjj|ƒS)N)rr¹Z check_applied)r!rKr#r#r$r¼Àsz#FirewallPolicy._check_ipset_appliedcCs*|j|ƒ}|tkr&ttjd||fƒ‚dS)Nz.ipset '%s' with type '%s' not usable as source)Ú_FirewallPolicy__ipset_typerrrZ INVALID_IPSET)r!rKZ_typer#r#r$r»Ãs  z+FirewallPolicy._check_ipset_type_for_sourcec s†t|jƒtkr†ˆjjj|jjƒ}|dkr2|jjg}xR|jD]H}||krHq:ˆj|ƒ|j |ƒt j |ƒ}||j_ˆj |||||d�q:Wg} |j rš|j g} nH|jrât|jtƒs¸t|jtƒrâˆjjj|jjƒ‰ˆjrâ‡fdd„dDƒ} ˆj|jƒ} | �r&|j �r |j | k�r&ttjd| |j fƒ‚n| g} | �s4ddg} ‡fdd„| Dƒ} | |_�x2t‡fdd„| DƒƒD�]} t|jƒtk�r¨ˆjjj|jjƒ}g} t|jƒd k�rð|j�r¶ttjd ƒ‚xB| D].} | |jk�r¼| j| ƒ�r¼| j |j| ƒ�q¼Wn | j dƒ�x~| D�]œ}t|jƒtk�rˆj|j |ƒ}|ˆj!|j"ƒ7}t#t|ƒd d „d �}g}x¨|D] }|j$}t%|ƒ}|j&ddƒ}|j |ƒ|j dk�rœ| j|j ƒ �rœ�qTt|j'ƒdk�r¸|j |ƒn:x8|j'D].\}}| j(||||||j|ƒ}|j)| |ƒ�qÀW�qTW|j*|ƒx4|j'D]*\}}| j+||||||ƒ}|j)| |ƒ�q Wx.|j,D]$}| j-|||||ƒ}|j)| |ƒ�q@Wx4|j.D]*\}}| j/||||||ƒ}|j)| |ƒ�qpW�qW�qft|jƒt0k�rø|jj1}|jj2}ˆj3||ƒ| j+||||d|ƒ}|j)| |ƒ�qft|jƒt4k�r<|jj5}ˆj6|ƒ| j-|||d|ƒ}|j)| |ƒ�qft|jƒt7k�r˜|�rzx&| D]} | j| ƒ�rX|j8t9| ƒ�qXW| j:|||ƒ}|j)| |ƒ�qft|jƒt;k�r4|jj1}|jj2}|jj<}|jj=}xD| D]<} | j| ƒ�rðˆj>| ||||ƒ|�rÎ|�rÎ|j8t9| ƒ�qÎW| j?|||||||ƒ}|j)| |ƒ�qft|jƒt@k�r‚|jj1}|jj2}ˆj3||ƒ| j/||||d|ƒ}|j)| |ƒnút|jƒtk�s¢t|jƒtk�r>ˆjjj|jjƒ‰|j �rìˆj�rì|j ˆjk�rìttjAd|j |jjfƒ‚t|jƒtk�r |j�r t|jƒtk�r ttjdƒ‚| jB||ˆ|ƒ}|j)| |ƒn>|jdk�rf| jC|||ƒ}|j)| |ƒnttjdt|jƒƒ‚�qfWdS)N)Úincluded_servicescsg|]}|ˆjkr|‘qSr#)Ú destination)r?rý)Úictr#r$räàsz0FirewallPolicy._rule_prepare..rµr¶z;Source address family '%s' conflicts with rule family '%s'.csg|]}ˆjj|ƒr|‘qSr#)rÚis_ipv_enabled)r?rý)r!r#r$räñscsg|]}ˆjj|ƒ‘qSr#)rÚget_backend_by_ipv)r?r@)r!r#r$räösrz"Destination conflict with service.cSs|jS)N)rK)r@r#r#r$rãsz.FirewallPolicy._rule_prepare..)r~Ú conntrackÚnatr¸rjz3rich rule family '%s' conflicts with icmp type '%s'z'IcmpBlock not usable with accept actionzUnknown element %s)rµr¶)DÚtyperÂrrrÍÚ get_servicerKÚincludesrÌr0ÚcopyÚdeepcopyrÀÚfamilyr™rrÚconfigÚ get_icmptyper%r¿r¾rrZ INVALID_RULEÚipvsr9rªÚis_ipv_supportedrÆrrÝrÛrÙrÖr+rÚr ÚreplacerCÚbuild_policy_helper_ports_rulesrZ add_modulesÚbuild_policy_ports_rulesrIÚbuild_policy_protocol_rulesrFÚbuild_policy_source_ports_rulesrràrárÞrÚvaluerïrr«rÚbuild_policy_masquerade_rulesrZto_portrÄrÚbuild_policy_forward_port_rulesrZINVALID_ICMPTYPEÚbuild_policy_icmp_block_rulesZ*build_policy_rich_source_destination_rules)r!ryr;r²r{r$ÚsvcÚincludeZ_ruler3Z source_ipvrZ destinationsrýr%rÖrÛrÓrÚrÜÚ nat_moduleràÚprotorHrárþrÿr#)r&r!r$rÀËs                             zFirewallPolicy._rule_preparec Csb|jjj|ƒ}|j|j|ƒ}||j|jƒ7}tt|ƒdd„d�}|dkrN|g}x@|j D]6}||krdqV|j |ƒ|j |ƒ|j |||||d�qVWg} xnd D]f} |jj | ƒs¬qš|jj| ƒ} t|jƒdkræ| |jkrä| j | |j| fƒqš| df| krš| j | dfƒqšW�xV| D�]L\} } xª|D]¢} | j}t|ƒ}| jjdd ƒ}|j|ƒ| jd k�rf| j| jƒ �rf�qt| jƒd k�r‚|j|ƒn:x8| jD].\}}| j||||| | j|ƒ}|j| |ƒ�qŠW�qWx2|jD](\}}| j||||| ƒ}|j| |ƒ�qÊWx,|jD]"}| j|||| ƒ}|j| |ƒ�qþWx2|jD](\}}| j||||| ƒ}|j| |ƒ�q,W�q WdS) NcSs|jS)N)rK)r@r#r#r$rãŽsz)FirewallPolicy._service..)r~)r$rµr¶rr)r*r¸rj)rµr¶) rrÍr,rÝrÛrÙrÖr+r9r-rÌr0rrr'r(rªr%rÚr r5Z add_moduler0r4rCr6rKrr7rIr8rFr9)r!ryr;rÍr{r$r>rÖr?Z backends_ipvrýrr%rÓrÚrÜr@ràrArHrár#r#r$rrŠsb               zFirewallPolicy._servicecCs<x6|jjƒD](}|jsq |j||||ƒ}|j||ƒq WdS)N)rrrr7r)r!ryr;ràrár{rrHr#r#r$rsÊs  zFirewallPolicy._portcCs:x4|jjƒD]&}|jsq |j|||ƒ}|j||ƒq WdS)N)rrrr8r)r!ryr;rár{rrHr#r#r$rtÓs zFirewallPolicy._protocolcCs<x6|jjƒD](}|jsq |j||||ƒ}|j||ƒq WdS)N)rrrr9r)r!ryr;ràrár{rrHr#r#r$ruÛs zFirewallPolicy._source_portcCs8d}|jt|ƒ|jj|ƒ}|j||ƒ}|j||ƒdS)Nrµ)r«rrr(r;r)r!ryr;r{rýrrHr#r#r$rvãs    zFirewallPolicy._masqueradec CsXtd|ƒrd}nd}|r(|r(|jt|ƒ|jj|ƒ} | j||||||ƒ} |j| | ƒdS)Nr¶rµ)rr«rrr(r<r) r!ryr;r{ràrárþrÿrýrrHr#r#r$rqës    zFirewallPolicy._forward_portc Cs€|jjj|ƒ}xl|jjƒD]^}|js&qd}|jrXx&dD]}||jkr6|j|ƒs6d}Pq6W|r^q|j|||ƒ} |j|| ƒqWdS)NFrµr¶T)rµr¶) rr1r2rrr%r4r=r) r!ryr;rr{r&rZ skip_backendrýrHr#r#r$rpús   zFirewallPolicy._icmp_blockcCsh|j|j}|dkrdS|j|ƒ r0|dkr0dSx2|jjƒD]$}|jsHq<|j||ƒ}|j||ƒq|jdD]}|jjj|ƒd�rfP�qfW|jd$ƒ|jd%ƒ|Sd&g}|jj�s¸|jd'ƒx4|jdD]}|jjj|ƒd�rÄP�qÄW|jd(ƒx>|jdD]}|jjj|ƒd�rúP�qúW|jd)ƒ|jd*ƒ|SdS)+z:Create a list of (table, chain) needed for policy dispatchr6r4r5r7rårOr*rKÚmanglerLrPrNrMZ interfacesN)rårO)r*rK)rSrK)rLrK)rårO)rLrK)rårP)rårN)r*rK)r*rM)rSrK)rLrK)rårN)r*rK)rSrK)rLrK)r*rM)rårN)r*rM)rLrK)r*rK)rSrK)rårN)rLrK)r*rM)r*rK)rSrK)r r<rÚnftables_enabledr0r:r8)r!r;rMÚtcr:r#r#r$rl†sj                 z4FirewallPolicy._get_table_chains_for_policy_dispatchcCsr|j|}d|jdkr4dg}|jjs0|jdƒ|Sd|jdkrLdddgSd|jd krbddgStd|ƒSdS)z8Create a list of (table, chain) needed for zone dispatchr5r7rårOrLrKr6Ú FORWARD_INr*rSr4Ú FORWARD_OUTrMzInvalid policy: %sN)rårO)rLrK)rårV)r*rK)rSrK)rårW)r*rM)r r<rrTr0r)r!r;rMrUr#r#r$rmÖs  z2FirewallPolicy._get_table_chains_for_zone_dispatchFcCsÈ|jjj|ƒ}|jr|j}n||}d|jdkrl|dkrBd|S|dkrRd|S|jsh|dkrhd|S�nJd|jd kr”|js�|dkr�d |S�n"d |jdk�rö|dkrÄ|jrºd |Sd |Sn0|dkrâ|rØd|Sd|Sn|dk�r¶d|SnÀd |jd k�rh|dk�r*|j�r d|Sd |Sn<|dk�rL|�rBd|Sd|Sn|dk�r¶|j�s¶d|SnN|j�s¶|dk�r‚d |S|dk�r¤|�ršd|Sd|Sn|dk�r¶d|Std|||fƒS)Nr5r7råZIN_rLZPRE_rSr*r4ZOUT_r6ZFWDI_ZFWD_ZPOST_ZFWDO_z.Can't convert policy to chain name: %s, %s, %s)rSr*)rSrL)rSrL)rSrL)rr;r.r/r<r)r!r;r|Z policy_prefixZisSNATrMÚsuffixr#r#r$Úpolicy_base_chain_nameësb                z%FirewallPolicy.policy_base_chain_name)N)N)N)N)rNNT)N)rNNT)N)rNN)N)rNN)N)rNN)N)rNN)N)rNN)N)rNN)N)NN)NN)NNrNN)NNN)NN)rNN)N)NN)N)N)N)NN)F)†Ú__name__Ú __module__Ú __qualname__r%r'r)r*r-r3r=r.rNrQrLrdrer¨r8rrcrPr‹rœrŸr¢rSr£r—r¥r¬r‰r­r®rTr¯r˜r°r±rŠr³rÁr¿rwr^rÇr�rÈrËr†rÌrÎrWrÏr�rÐrÒr�rÙrÝrÞrærXrçr‘rèrîr‚rïrðr\rñr•ròrôr‡rõr]rör–r÷rørˆrùr_rúr“rûr„rrrVrr”rrr…rrrUr r’r r rƒr rrrrrrrnrr½r#r"r¼r»rÀrrrsrtrurvrqrprrJrQrRrorlrmrYr#r#r#r$rs$  '  ?  . , # , # :     ' (   ' ( '   +     ) )  @ @    ( P r)'rhr.Zfirewall.core.loggerrZfirewall.functionsrrrrrrr r r r r�r rrrrrrrrrrZfirewall.core.fw_transactionrZfirewallrZfirewall.errorsrZfirewall.fw_typesrZfirewall.core.baserÚobjectrr#r#r#r$Ús 04