3 YÉj®$ã@s&dgZddlZddlmZddlmZddlmZm Z m Z ddl m Z ddl mZddlmZmZddlZd gd d d gd d dgdœZiZiZiZx€ejƒD]tZgee<eƒee<x\eeD]PZeejdeƒeejdeefƒeejdeƒeejdeƒqºWqšWGdd„deƒZdS)ÚebtableséN)ÚrunProg)Úlog)ÚtempFileÚreadfileÚ splitArgs)ÚCOMMANDS)Ú ipXtables)Ú FirewallErrorÚ INVALID_IPVZBROUTINGZ PREROUTINGZ POSTROUTINGZOUTPUTZINPUTZFORWARD)ZbrouteZnatÚfilterz -N %s_directz-I %s 1 -j %s_directz-I %s_direct 1 -j RETURNz %s_directc@sÄeZdZdZdZdZdd„Zdd„Zdd„Zd d „Z d d „Z d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd/d d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd0d+d,„Zd-d.„ZdS)1rZebFcCsBt|j|_td|j|_|jƒ|_|jƒ|_|jƒg|_ dS)Nz %s-restore) rÚipvÚ_commandÚ_restore_commandÚ_detect_restore_noflush_optionZrestore_noflush_optionÚ_detect_concurrent_optionÚconcurrent_optionÚ fill_existsÚavailable_tables)Úself©rú/usr/lib/python3.6/ebtables.pyÚ__init__9s    zebtables.__init__cCs$tjj|jƒ|_tjj|jƒ|_dS)N)ÚosÚpathÚexistsrZcommand_existsrZrestore_command_exists)rrrrrAszebtables.fill_existscCs(d}t|jddgƒ}|ddkr$d}|S)NÚz --concurrentz-Lr)rr)rrÚretrrrrEs  z"ebtables._detect_concurrent_optionc Cs.g}y|j|dƒWntk r(dSXdS)NÚoffFT)Ú set_rulesÚ ValueError)rÚrulesrrrrOs z'ebtables._detect_restore_noflush_optioncCs‚g}|jr |j|kr |j|jƒ|dd„|Dƒ7}tjd|j|jdj|ƒƒt|j|ƒ\}}|dkr~td|jdj|ƒ|fƒ‚|S)NcSsg|] }d|‘qS)z%sr)Ú.0Úitemrrrú ^sz"ebtables.__run..z %s: %s %sú rz'%s %s' failed: %s) rÚappendrÚdebug2Ú __class__rÚjoinrr )rÚargsZ_argsÚstatusrrrrZ__runYs zebtables.__runcCs(x"dD]}||krttd|ƒ‚qWdS)Nú %%REJECT%%ú%%ICMP%%ú %%LOGTYPE%%z'%s' invalid for ebtables)r,r-r.)r r )rÚruleÚstrrrrÚ_rule_validatefs zebtables._rule_validatecCs|tko|t|kS)N)ÚBUILT_IN_CHAINS)rr ÚtableÚchainrrrÚis_chain_builtinlszebtables.is_chain_builtincCsJg}|r4|jd|d|gƒ|jd|d|dddgƒn|jd|d|gƒ|S)Nz-tz-Nz-IÚ1z-jZRETURNz-X)r&)rÚaddr3r4r!rrrÚbuild_chain_rulesps zebtables.build_chain_rulescCs8d|g}|r |d|t|ƒg7}n |d|g7}||7}|S)Nz-tz-Iz-D)r0)rr7r3r4Úindexr*r/rrrÚ build_rule{s  zebtables.build_rulecCs tj|ƒS)N)r Zcommon_reverse_rule)rr*rrrÚ reverse_rule„szebtables.reverse_rulecCstj|ƒdS)N)r Zcommon_check_passthrough)rr*rrrÚcheck_passthrough‡szebtables.check_passthroughcCs tj|ƒS)N)r Zcommon_reverse_passthrough)rr*rrrÚreverse_passthroughŠszebtables.reverse_passthroughc Cs<tƒ}d}i}xê|D]â}|dd…}|j|ƒxTdD]L}y|j|ƒ} Wntk rZYq4Xt|ƒ| dkr4|j| ƒ|j| ƒ}q4Wx^tt|ƒƒD]N} xHtjD]>} | || krž|| j dƒoÈ|| j dƒ ržd|| || <qžWq’W|j |gƒj |ƒqWxD|D]<}|j d|ƒx&||D]}|j dj|ƒd ƒ�qW�qW|jƒtj|jƒ} tjd |j|jd |j| jfƒg} | j d ƒt|j| |jd �\} }tjƒdk�rt|jƒ}|dk �rd} xH|D]@}tjd| |fddd�|j d ƒ�sútjddd�| d7} �qÄWtj|jƒ| dk�r8td|jdj| ƒ|fƒ‚dS)Nr ú-tú--tableéú"z"%s"z*%s r%Ú z %s: %s %sz%s: %dz --noflush)Ústdinéz%8d: %sr)ÚnofmtÚnlr)rEz'%s %s' failed: %s)r>r?)rr1r9r ÚlenÚpopÚrangeÚstringZ whitespaceÚ startswithÚendswithÚ setdefaultr&Úwriter)ÚcloserÚstatÚnamerr'r(rÚst_sizerZgetDebugLogLevelrZdebug3Úunlink)rr!Ú log_deniedZ temp_filer3Z table_rulesZ_ruler/ÚoptÚiÚcrPr*r+rÚlinesÚlinerrrr�sZ                zebtables.set_rulescCs|j|ƒ|j|ƒS)N)r1Ú_ebtables__run)rr/rTrrrÚset_ruleÍs zebtables.set_ruleNc CsŒg}|r|gntjƒ}xp|D]h}||jkr6|j|ƒqy*|jd|dgƒ|jj|ƒ|j|ƒWqtk r‚tjd|ƒYqXqW|S)Nz-tz-Lz#ebtables table '%s' does not exist.)r2Úkeysrr&rZr rZdebug1)rr3rZtablesrrrÚget_available_tablesÑs    zebtables.get_available_tablescCsiS)Nr)rr3rrrÚget_zone_table_chainsászebtables.get_zone_table_chainscCsFg}xs.