2020# This script is used to implement the tree node and tree structure.
2121
2222
23-
24-
2523from _settings import *
24+ from collections import Counter
2625import hashlib
2726import csv
2827import redis
28+ import zlib
29+ import rputil
2930
3031
3132# tag_rules
@@ -62,23 +63,27 @@ def __init__(self, n_weight=-1, n_pn="", n_parent=None):
6263 self .match = list ()
6364 self .permissions = set ()
6465 self .db = redis .StrictRedis (host = DB_HOST , port = DB_PORT , db = DB_ID , password = DB_PSWD )
66+ self .api_id_list = []
6567
66- def insert (self , package_name , weight , sha256 , permission_list ):
68+ def insert (self , package_name , weight , sha256 , permission_list , api_id_list ):
6769 # no matter how deep the package is, add permissions here.
6870 for permission in permission_list :
6971 self .permissions .add (permission )
72+ # no matter how deep the package is, add api_id_list
73+ # self.api_id_list = self.api_id_list + api_id_list
7074 current_depth = 0 if self .pn == "" else self .pn .count ('/' ) + 1
7175 target_depth = package_name .count ('/' ) + 1
7276 if current_depth == target_depth :
7377 self .sha256 = sha256
78+ self .api_id_list = api_id_list
7479 return "F: %s" % package_name
7580 target_package_name = '/' .join (package_name .split ('/' )[:current_depth + 1 ])
7681 if target_package_name in self .children :
7782 self .children [target_package_name ].weight += weight
78- return self .children [target_package_name ].insert (package_name , weight , sha256 , permission_list )
83+ return self .children [target_package_name ].insert (package_name , weight , sha256 , permission_list , api_id_list )
7984 else :
8085 self .children [target_package_name ] = TreeNode (n_weight = weight , n_pn = target_package_name , n_parent = self )
81- return self .children [target_package_name ].insert (package_name , weight , sha256 , permission_list )
86+ return self .children [target_package_name ].insert (package_name , weight , sha256 , permission_list , api_id_list )
8287
8388 def brand (self , package_name , standard_package ):
8489 current_depth = 0 if self .pn == "" else self .pn .count ('/' ) + 1
@@ -108,22 +113,15 @@ class Tree(object):
108113 """
109114 Tree
110115 """
111- def __init__ (self , lite = True ):
112- self .lite = lite
116+ def __init__ (self ):
113117 self .root = TreeNode ()
114118 self .db = None
115119 self .feature = None
116- if not self .lite :
117- self .db = redis .StrictRedis (host = DB_HOST , port = DB_PORT , db = DB_ID , password = DB_PSWD )
118- else :
119- self .feature = dict ()
120- with open (LITE_DATASET_10 , 'r' ) as file_rules :
121- csv_rules_reader = csv .reader (file_rules , delimiter = ',' , quotechar = '|' )
122- for row in csv_rules_reader :
123- self .feature [row [0 ]] = row [1 :5 ]
120+ self .db = redis .StrictRedis (host = DB_HOST , port = DB_PORT , db = DB_ID , password = DB_PSWD )
121+ self .db_rep = redis .StrictRedis (host = DB_HOST , port = DB_PORT , db = DB_ID_REP , password = DB_PSWD )
124122
125- def insert (self , package_name , weight , sha256 , permission_list ):
126- self .root .insert (package_name , weight , sha256 , permission_list )
123+ def insert (self , package_name , weight , sha256 , permission_list , api_id_list ):
124+ self .root .insert (package_name , weight , sha256 , permission_list , api_id_list )
127125
128126 def brand (self , package_name , standard_package ):
129127 return self .root .brand (package_name , standard_package )
@@ -139,6 +137,17 @@ def _pre_order_res(self, node, visit, res):
139137 for child_pn in node .children :
140138 self ._pre_order_res (node .children [child_pn ], visit , res )
141139
140+ def pre_order_res_ret (self , visit , res , ret ):
141+ self ._pre_order_res_ret (node = self .root , visit = visit , res = res , ret = ret )
142+
143+ def _pre_order_res_ret (self , node , visit , res , ret ):
144+ retu = visit (node , res , ret )
145+ if retu < 0 :
146+ return
147+ else :
148+ for child_pn in node .children :
149+ self ._pre_order_res_ret (node .children [child_pn ], visit , res , ret )
150+
142151 def pre_order (self , visit ):
143152 self ._pre_order (self .root , visit )
144153
@@ -183,17 +192,12 @@ def cal_sha256(self):
183192
184193 def _match (self , node ):
185194 a , c , u = None , None , None
186- if not self .lite :
187- pipe = self .db .pipeline ()
188- pipe .hget (name = DB_UN_OB_PN , key = node .sha256 )
189- pipe .hget (name = DB_FEATURE_CNT , key = node .sha256 )
190- pipe .hget (name = DB_UN_OB_CNT , key = node .sha256 )
191- pipe_res = pipe .execute ()
192- a , c , u = pipe_res
193- else :
194- if node .sha256 in self .feature :
195- acu_cur = self .feature [node .sha256 ]
196- a , c , u = acu_cur [3 ], acu_cur [0 ], acu_cur [2 ]
195+ pipe = self .db .pipeline ()
196+ pipe .hget (name = DB_UN_OB_PN , key = node .sha256 )
197+ pipe .hget (name = DB_FEATURE_CNT , key = node .sha256 )
198+ pipe .hget (name = DB_UN_OB_CNT , key = node .sha256 )
199+ pipe_res = pipe .execute ()
200+ a , c , u = pipe_res
197201
198202 # if could not find this package in database, search its children.
199203 if a is None :
@@ -308,17 +312,13 @@ def _find_untagged(self, node, res):
308312 a , c , u = None , None , None
309313 if len (node .match ) != 0 :
310314 return - 1
311- if not self .lite :
312- pipe = self .db .pipeline ()
313- pipe .hget (name = DB_UN_OB_PN , key = node .sha256 )
314- pipe .hget (name = DB_FEATURE_CNT , key = node .sha256 )
315- pipe .hget (name = DB_UN_OB_CNT , key = node .sha256 )
316- pipe_res = pipe .execute ()
317- a , c , u = pipe_res
318- else :
319- if node .sha256 in self .feature :
320- acu_cur = self .feature [node .sha256 ]
321- a , c , u = acu_cur [3 ], acu_cur [0 ], acu_cur [2 ]
315+ pipe = self .db .pipeline ()
316+ pipe .hget (name = DB_UN_OB_PN , key = node .sha256 )
317+ pipe .hget (name = DB_FEATURE_CNT , key = node .sha256 )
318+ pipe .hget (name = DB_UN_OB_CNT , key = node .sha256 )
319+ pipe_res = pipe .execute ()
320+ a , c , u = pipe_res
321+
322322
323323 if a is None :
324324 return 1
@@ -387,3 +387,25 @@ def _get_lib(node, res):
387387 def get_lib (self , res ):
388388 self .pre_order_res (visit = self ._get_lib , res = res )
389389
390+ @staticmethod
391+ def _get_repackage_main (node , res , ret ):
392+ if node .pn in res :
393+ return - 1
394+ if len (node .children ) == 0 :
395+ ret .extend (node .api_id_list )
396+ ret += node .api_id_list
397+ return 0
398+
399+ def get_repackage_main (self , res , hex_sha256 ):
400+ # res is a list of libraries. Result.
401+ pn_list = list ()
402+ for item in res :
403+ pn_list .append (item ["Package" ])
404+ ret = list ()
405+ self .pre_order_res_ret (visit = self ._get_repackage_main , res = pn_list , ret = ret )
406+ ret_length = len (ret )
407+ kvd = dict (Counter (ret ))
408+ str = rputil .Util .dict2str (kvd )
409+ zstr = zlib .compress (str ,1 )
410+ self .db_rep .hset (name = "apk_feature" , key = hex_sha256 , value = zstr )
411+ self .db_rep .zadd ("apk_weight" , ret_length , hex_sha256 )
0 commit comments