*{RZddlZddlZddlmZddlmZmZmZmZm Z m Z m Z ddl m Z mZmZmZddlZddlmZddlmZGdde ZGd d e ZGd d eZdS)N)ABCMeta) IPV4LENGTH IPV6LENGTH IPv4Address IPv4Network IPv6Address IPv6Network ip_network)IteratorListOptionalUnion)Signal)IPcdeZdZeZeZeZeZdZdS)SourceInterfacec"Kt)z":rtype: iterable[(ip, expiration)]NotImplementedErrorselfs P/opt/imunify360/venv/lib/python3.11/site-packages/im360/utils/tree_cache/core.py fetch_allzSourceInterface.fetch_all"s!###N) __name__ __module__ __qualname__raddeddeletedclearedupdatedrrrrrsU FHHEfhhGfhhGfhhG$$$$$rr) metaclasscxeZdZdZdZdeeeee e ffdZ deeeee e ffdZ dZ dS)TreeCacheInterfacec"Kt)zICheck if the cache contains specified ip. :type ip: str rrips rcontainszTreeCacheInterface.contains( "###rc"Kt)dCheck if the cache contains exactly specified ip, not parent subnet. :type ip: str rr's rcontains_exactlyz#TreeCacheInterface.contains_exactly/r*ripsc"Kt)z'Returns ips that is presented in cache.rrr.s rfilter_containedz#TreeCacheInterface.filter_contained6r*rc"Kt)z+Returns ips that is NOT presented in cache.rr0s rfilter_not_containedz'TreeCacheInterface.filter_not_contained=r*rct)* re-fill on the next call rrs rresetzTreeCacheInterface.resetDs"###rN)rrrr)r-r rrrrr r1r3r6r"rrr%r%'s$$$$$$$ % [+{JK L$$$$$ % [+{JK L$$$$$$$$$rr%cheZdZddZdZdZdZdZdZdZ e d e e e eeffd Zed e e e eeffd Zed Zd ZdZdZdee e e eeffdZdee e e eeffdZd edeefdZdZedZdedefdZ dZ!dS) TreeCachecL||_||_d|_d|_d|_|j|j||j|j ||j |j ||j |j |dS)z:type source: SourceInterfacerNF)_source_full_sync_period _last_sync_tree_expiredrconnect _on_addedr _on_deletedr _on_clearedr! _on_updated)rsourcefull_sync_periods r__init__zTreeCache.__init__Ls !1    T^V444t/888t/888t/88888rcr|jdS|jtj||dSN)r>insertradopt_to_ipvX_networkrsenderr( expirations rrAzTreeCache._on_added\s8 :  F "2266 CCCCCrc|jdS |jtj|dS#t$rYdSwxYwrI)r>deleterrKKeyError)rrMr(s rrBzTreeCache._on_deletedas] :  F  J  b6r:: ; ; ; ; ;    DD s,9 AAcBtjt|_dSrI)pytriciaPyTriciarr>)rrMs rrCzTreeCache._on_clearedjs&z22 rc4||||dSrI)rArLs rrDzTreeCache._on_updatedms vr:.....rcKtjt|_|j}|jd{VD]-\}}|tj||.dSrI) rSrTrr>r;rrJrrK)rtreer(rNs r _init_treezTreeCache._init_treeps&z22 z$(L$:$:$<$<<<<<<< B BNB KK044j A A A A B BrcK|j$tj|j|jzkr_|d{Vtj|_|j9tj|j|jzk]dSdSrI)r>timer=r<rXrs r_sync_if_neededzTreeCache._sync_if_neededvsj DIKK Od4 4% % //## # # # # # # #"ikkDO j DIKK Od4 4% % % % % % rr(cR|||\}}t|S)zM :return bool: if 'tree' contains ip as is or by subnet mask )_lookupbool)clsrWr(ip_nwk_s r _containszTreeCache._contains}s'KKb)) F||rc2tj|}tdD]e}||}|sdS||}|r-|t jkr||`||fcStd)zLookup specified ip or parent subnet considering expiration. :return tuple: str(ip_network(contains that ip)), expiration )NNzDToo deep recursion. Something goes wrong. Please contact developers.)rrKrangeget_keygetrZrP RuntimeError)rWr(rar`rNs rr]zTreeCache._lookups %b ) )s . .A\\"%%F .!zz"XXf-- .* ";";KK'''!:---- )   rctj|}||r0t||r||SdS)NF)rrKhas_keyr8rb)rWr(s r_contains_exactlyzTreeCache._contains_exactlysU  %b ) ) <<   (""4,, (||B'''urcpK|d{V||j|S)zCheck if the cache contains specified ip or parent subnet. :type ip: str :return tuple: str(ip_network(contains that ip)), expiration N)r[r]r>r's rlookupzTreeCache.lookupsB ""$$$$$$$$$||DJ+++rcpK|d{V||j|S)zZCheck if the cache contains specified ip or parent subnet. :type ip: str N)r[rbr>r's rr)zTreeCache.containssB ""$$$$$$$$$~~dj"---rcpK|d{V||j|S)r,N)r[rkr>r's rr-zTreeCache.contains_exactlysD ""$$$$$$$$$%%dj"555rr.c`K|s|Sd{Vfd|DS)z+Returns ips that is presented in the cache.NcJg|]}j|| Sr"rbr>.0r(rs r z.TreeCache.filter_contained..s.CCCrDNN4:r$B$BCCCCrr[r0s` rr1zTreeCache.filter_containedsT  J""$$$$$$$$$CCCCSCCCCrc`K|s|Sd{Vfd|DS)z/Returns ips that is NOT presented in the cache.NcJg|]}j|| Sr"rrrss rruz2TreeCache.filter_not_contained..s.GGGrtz2(F(FGGGGrrvr0s` rr3zTreeCache.filter_not_containedsT  J""$$$$$$$$$GGGGSGGGGrreturnc|K||d{V}tj|dr||kr|SdS)z%Returns IP network that contains `ip`NTstrict)_get_keyris_valid_ip_network)rr(keys r get_subnetzTreeCache.get_subnetsUMM"%%%%%%%%  !#d 3 3 3 r JtrcKtj|s Jd|z|d{V|j|S)Nz%s is not valid IP!)rr~r[r>rf)rip_ntws rr}zTreeCache._get_keyse%f--MM/Dv/MMM-""$$$$$$$$$z!!&)))rc$td|S)Nct|jtkr!tt|jn|SrI)r prefixlenrstrnetwork_address)r(s rz5TreeCache._fix_addresses_in_network..s7b>>+z99JrNN2333r)map) network_lists r_fix_addresses_in_networkz#TreeCache._fix_addresses_in_networks%       r target_subnetczKtjdstgS|d{V|j}|stgSfd|j|D}tj| |gS)z Returns a iterator of IP address and networks that located in cache and being members of `target_subnet` and `target_subnet` itself Tr{Nc3bK|])}t|jtv%|V*dSrI)r r)rtnetrs r z0TreeCache.get_ips_from_subnet..sK& & #.*]2K2KKK KKKK& & r) rr~iterr[r>rfchildren itertoolschainr)rr parent_subnetitems_in_subnet_from_caches ` rget_ips_from_subnetzTreeCache.get_ips_from_subnets %mDAAA 88O""$$$$$$$$$ **=99  88O& & & & z**=99& & & "   * *+E F F O   rcd|_dS)r5N)r>rs rr6zTreeCache.resets  rN)r9)"rrrrGrArBrCrDrXr[ classmethodrrrrr rb staticmethodr]rkrmr)r-r r1r3rr rr}rr rr6r"rrr8r8Ks(9999 DDD 333///BBB ***  +{KD E   [   [+{JK   \ @\,,,...666 D % [+{JK L D D D D H % [+{JK L H H H H 3 8C=    ***    \   s x    .rr8)rrZabcr ipaddressrrrrrr r typingr r r rrSblinkerrdefence360agent.utils.validaterrr%r8r"rrrsw 322222222222------$$$$$$$$$$!$!$!$!$!$7!$!$!$!$HSSSSS"SSSSSr