3 YÉjq2ã @sÞdZdddgZddlZddlZddlmZddlmZddl m Z dd l m Z dd l mZmZdd lmZd Zd ddddddddddg ZdddddœZddddœZGd d„deƒZd!d„Zd"d„Zd#d$„Zd%d&„Zd'd(„ZdS))zThe ipset command wrapperÚipsetÚcheck_ipset_nameÚremove_default_create_optionséN)Úerrors)Ú FirewallError)ÚrunProg)Úlog)ÚtempFileÚreadfile)ÚCOMMANDSé zhash:ipz hash:ip,portzhash:ip,port,ipzhash:ip,port,netz hash:ip,markzhash:netz hash:net,netz hash:net,portzhash:net,port,netzhash:net,ifacezhash:macz inet|inet6Úvaluez value in secs)ÚfamilyÚhashsizeÚmaxelemÚtimeoutZinetZ1024Z65536)rrrc@sªeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd'd d„Z dd„Z dd„Z dd„Z d(dd„Z d)dd„Zdd„Zd*dd„Zd+dd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd S),rzipset command wrapper classcCstd|_d|_dS)Nr)r Ú_commandÚname)Úself©rú/usr/lib/python3.6/ipset.pyÚ__init__Ks zipset.__init__cCs^dd„|Dƒ}tjd|j|jdj|ƒƒt|j|ƒ\}}|dkrZtd|jdj|ƒ|fƒ‚|S)zCall ipset with argscSsg|] }d|‘qS)z%sr)Ú.0Úitemrrrú Rszipset.__run..z %s: %s %sú rz'%s %s' failed: %s)rÚdebug2Ú __class__rÚjoinrÚ ValueError)rÚargsZ_argsÚstatusÚretrrrZ__runOsz ipset.__runcCs t|ƒtkrttjd|ƒ‚dS)zCheck ipset namezipset name '%s' is not validN)ÚlenÚIPSET_MAXNAMELENrrZ INVALID_NAME)rrrrrÚ check_nameZs zipset.check_namecCs°g}d}y|jdgƒ}Wn0tk rH}ztjd|ƒWYdd}~XnX|jƒ}d}xT|D]L}|rš|jƒjddƒ}|d|krš|dtkrš|j|dƒ|j dƒr\d }q\W|S) z?Return types that are supported by the ipset command and kernelÚz--helpzipset error: %sNFérzSupported set types:T) Ú _ipset__runrrZdebug1Ú splitlinesÚstripÚsplitÚ IPSET_TYPESÚappendÚ startswith)rr"ÚoutputZexÚlinesZin_typesÚlineÚsplitsrrrÚset_supported_types`s    zipset.set_supported_typescCs(t|ƒtks|tkr$ttjd|ƒ‚dS)zCheck ipset typez!ipset type name '%s' is not validN)r#r$r,rrZ INVALID_TYPE)rÚ type_namerrrÚ check_typeuszipset.check_typeNcCsd|j|ƒ|j|ƒd||g}t|tƒrZx0|jƒD]$\}}|j|ƒ|dkr2|j|ƒq2W|j|ƒS)z+Create an ipset with name, type and optionsÚcreater&)r%r5Ú isinstanceÚdictÚitemsr-r()rÚset_namer4Úoptionsr ÚkeyÚvalrrrÚ set_create{s     zipset.set_createcCs|j|ƒ|jd|gƒS)NZdestroy)r%r()rr:rrrÚ set_destroyˆs zipset.set_destroycCsd||g}|j|ƒS)NÚadd)r()rr:Úentryr rrrÚset_addŒs z ipset.set_addcCsd||g}|j|ƒS)NÚdel)r()rr:rAr rrrÚ set_delete�s zipset.set_deletecCs,d||g}|r"|jddj|ƒƒ|j|ƒS)NÚtestz%sr)r-rr()rr:rAr;r rrrrE”s z ipset.testcCs2dg}|r|j|ƒ|r"|j|ƒ|j|ƒjdƒS)NÚlistÚ )r-Úextendr(r+)rr:r;r rrrÚset_listšs   zipset.set_listc Cs<|jdgd�}i}d}}i}�x|D�] }t|ƒdkr:q&dd„|jddƒDƒ}t|ƒdkr`q&q&|d d krv|d}q&|d d krŒ|d}q&|d d kr&|djƒ}d } x^| t|ƒk�r|| } | dk�rüt|ƒ| krì| d7} || || <ntjd|ƒiS| d7} qªW|�r$|�r$|t|ƒf||<d}}|jƒq&W|S)z" Get active ipsets (only headers) z-terse)r;NécSsg|] }|jƒ‘qSr)r*)rÚxrrrr¬sz.ipset.set_get_active_terse..ú:r'rÚNameZTypeZHeaderrrrrÚnetmaskz&Malformed ipset list -terse output: %s)rrrrrN)rIr#r+rÚerrorrÚclear) rr0r"Ú_nameZ_typeÚ_optionsr1Zpairr2ÚiÚoptrrrÚset_get_active_terse¢sD            zipset.set_get_active_tersecCsdg}|r|j|ƒ|j|ƒS)NÚsave)r-r()rr:r rrrrVÉs z ipset.savecCsê|j|ƒ|j|ƒtƒ}d|kr*d|}d||dg}|rlx0|jƒD]$\}} |j|ƒ| dkrD|j| ƒqDW|jddj|ƒƒ|jd|ƒxN|D]F} d| kr¨d| } |rÈ|jd|| dj|ƒfƒq”|jd || fƒq”W|jƒtj |j ƒ} t j d |j |jd |j | jfƒd g}t|j||j d �\} } t jƒdk�r¶yt|j ƒWntk �r`YnVXd}xNt|j ƒD]@}t jd||fddd�|jdƒ�s¨t jddd�|d7}�qrWtj|j ƒ| dk�rætd|jdj|ƒ| fƒ‚| S)Nrz'%s'r6z-existr&z%s z flush %s z add %s %s %s z add %s %s z%s: %s restore %sz%s: %dZrestore)Ústdinr'rJz%8d: %sr)ÚnofmtÚnlrG)rXz'%s %s' failed: %s)r%r5r r9r-ÚwriterÚcloseÚosÚstatrrrrrÚst_sizerZgetDebugLogLevelr Ú ExceptionZdebug3ÚendswithÚunlinkr)rr:r4ÚentriesZcreate_optionsZ entry_optionsZ temp_filer r<r=rAr]r!r"rSr1rrrÚ set_restoreÏsV         zipset.set_restorecCsdg}|r|j|ƒ|j|ƒS)NÚflush)r-r()rr:r rrrÚ set_flushs zipset.set_flushcCs|jd||gƒS)NÚrename)r()rZ old_set_nameZ new_set_namerrrrf sz ipset.renamecCs|jd||gƒS)NÚswap)r()rZ set_name_1Z set_name_2rrrrgsz ipset.swapcCs |jdgƒS)NÚversion)r()rrrrrhsz ipset.version)N)N)NN)N)NN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr(r%r3r5r>r?rBrDrErIrUrVrcrerfrgrhrrrrrHs&    '  7cCst|ƒtkrdSdS)z"Return true if ipset name is validFT)r#r$)rrrrrs cCs8|jƒ}x*tD]"}||krt|||kr||=qW|S)z( Return only non default create options )ÚcopyÚIPSET_DEFAULT_CREATE_OPTIONS)r;rRrTrrrrs   c Cshg}xX|jdƒD]J}y&|jdƒ|jttj|dd�ƒƒWqtk rX|j|ƒYqXqWdj|ƒS)z! Normalize IP addresses in entry ú,ú/F)Ústrict)r+Úindexr-ÚstrÚ ipaddressÚ ip_networkrr)rAZ_entryZ_partrrrÚnormalize_ipset_entry&s rvcCsxt|jdƒƒdkrdSytj|dd�}Wntk r<dSXx4|D],}|jtj|dd�ƒrDttjdj ||ƒƒ‚qDWdS)z: Check if entry overlaps any entry in the list of entries rorJNF)rqz,Entry '{}' overlaps with existing entry '{}') r#r+rtrurÚoverlapsrrÚ INVALID_ENTRYÚformat)rArbZ entry_networkZitrrrrÚcheck_entry_overlaps_existing2s rzcCs~ydd„|Dƒ}Wntk r&dSXt|ƒdkr8dS|jƒ|jdƒ}x.|D]&}|j|ƒrrttjdj||ƒƒ‚|}qPWdS)z> Check if any entry overlaps any entry in the list of entries cSsg|]}tj|dd�‘qS)F)rq)rtru)rrKrrrrEsz1check_for_overlapping_entries..NrzEntry '{}' overlaps entry '{}') rr#ÚsortÚpoprwrrrxry)rbZ prev_networkZcurrent_networkrrrÚcheck_for_overlapping_entriesBs 2   r})rlÚ__all__Zos.pathr\rtZfirewallrZfirewall.errorsrZfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsr r Zfirewall.configr r$r,ZIPSET_CREATE_OPTIONSrnÚobjectrrrrvrzr}rrrrÚsF      P