11# -*- coding: utf-8 -*-
2+ import bisect
3+ import logging
24import re
3- import yaml
45import sys
56import time
6- import bisect
7- import logging
7+ import yaml
8+ from functools import lru_cache
89from os .path import isfile
910
1011logger = logging .getLogger (__name__ )
@@ -25,7 +26,7 @@ def long2ip(num):
2526 return '.' .join (iplist )
2627
2728
28- class BaseIPPool (object ):
29+ class BaseFinder (object ):
2930
3031 def __init__ (self , ipfile , recordfile ):
3132 if not isfile (ipfile ) or not isfile (recordfile ):
@@ -45,14 +46,14 @@ def __init__(self, ipfile, recordfile):
4546 self .locmapip = {}
4647
4748 # load record data
48- self .LoadRecord ()
49+ self .loadRecord ()
4950
5051 # load ip data
51- self .LoadIP ()
52+ self .loadIP ()
5253
5354 print ('Init IP pool finished !' )
5455
55- def LoadIP (self ):
56+ def loadIP (self ):
5657 f = open (self .ipfile , 'r' )
5758 logger .warning ("before load: %s" % (time .time ()))
5859 for eachline in f :
@@ -72,14 +73,14 @@ def LoadIP(self):
7273 self .iphash [ipstart ] = [ipstart , ipend ,
7374 country , province , city , sp , {}]
7475 # 最好合并后再计算
75- self .JoinIP (ipstart )
76+ self .joinIP (ipstart )
7677 f .close ()
7778 logger .warning ("after load: %s" % (time .time ()))
7879 self .iplist .sort ()
7980 logger .warning ("after sort: %s" % (time .time ()))
8081
8182 # 重写LoadRecord和JoinIP,提升启动效率
82- def LoadRecord (self ):
83+ def loadRecord (self ):
8384 Add = [8 , 4 , 2 , 1 ]
8485 f = open (self .recordfile , 'r' )
8586 self .record = yaml .load (f , Loader = yaml .FullLoader )
@@ -126,31 +127,31 @@ def LoadRecord(self):
126127 f .close ()
127128 # logger.warning(self.locmapip)
128129
129- def JoinIP (self , ip ):
130+ def joinIP (self , ip ):
130131 for fqdnk , fqdnv in self .locmapip .items ():
131132 l1 = []
132133 l2 = []
133134 l3 = []
134135 weight = 0
135- #logger.warning("l1 : %s, %s" %(self.iphash[ip][2], fqdnv.keys()))
136+ # logger.warning("l1 : %s, %s" %(self.iphash[ip][2], fqdnv.keys()))
136137 if "" in fqdnv and "" != self .iphash [ip ][2 ]:
137138 l1 .append (fqdnv ["" ])
138139 if self .iphash [ip ][2 ] in fqdnv :
139140 l1 .append (fqdnv [self .iphash [ip ][2 ]])
140141 for k in l1 :
141- #logger.warning("l2 : %s, %s" %(self.iphash[ip][3], k.keys()))
142+ # logger.warning("l2 : %s, %s" %(self.iphash[ip][3], k.keys()))
142143 if "" in k and "" != self .iphash [ip ][3 ]:
143144 l2 .append (k ["" ])
144145 if self .iphash [ip ][3 ] in k :
145146 l2 .append (k [self .iphash [ip ][3 ]])
146147 for k in l2 :
147- #logger.warning("l3 : %s, %s" %(self.iphash[ip][4], k.keys()))
148+ # logger.warning("l3 : %s, %s" %(self.iphash[ip][4], k.keys()))
148149 if "" in k and "" != self .iphash [ip ][4 ]:
149150 l3 .append (k ["" ])
150151 if self .iphash [ip ][4 ] in k :
151152 l3 .append (k [self .iphash [ip ][4 ]])
152153 for k in l3 :
153- #logger.warning("l4 : %s, %s" %(self.iphash[ip][5], k.keys()))
154+ # logger.warning("l4 : %s, %s" %(self.iphash[ip][5], k.keys()))
154155 if "" in k and k ["" ][1 ] > weight :
155156 self .iphash [ip ][6 ][fqdnk ] = k ["" ]
156157 weight = k ["" ][1 ]
@@ -160,14 +161,15 @@ def JoinIP(self, ip):
160161 if fqdnk not in self .iphash [ip ][6 ]:
161162 self .iphash [ip ][6 ][fqdnk ] = [self .record [fqdnk ]['default' ], 0 ]
162163
163- def ListIP (self ):
164+ def listIP (self ):
164165 for key in self .iphash :
165166 print ("ipstart: %s ipend: %s country: %s province: %s city: %s sp: %s" % (
166- key , self .iphash [key ][1 ], self .iphash [key ][2 ], self .iphash [key ][3 ], self .iphash [key ][4 ], self .iphash [key ][5 ]))
167+ key , self .iphash [key ][1 ], self .iphash [key ][2 ], self .iphash [key ][3 ], self .iphash [key ][4 ],
168+ self .iphash [key ][5 ]))
167169 for i in self .iphash [key ][6 ]:
168170 print ("[domain:%s ip: %s]" % (i , self .iphash [key ][6 ][i ][0 ]))
169171
170- def SearchLocation (self , ip ):
172+ def searchLocation (self , ip ):
171173 ipnum = ip2long (ip )
172174 ip_point = bisect .bisect_right (self .iplist , ipnum )
173175 i = self .iplist [ip_point - 1 ]
@@ -178,8 +180,9 @@ def SearchLocation(self, ip):
178180
179181 return i , j , ipnum
180182
181- def FindIP (self , ip , name ):
182- i , _ , ipnum = self .SearchLocation (ip )
183+ @lru_cache (maxsize = 2048 * 2048 , typed = True )
184+ def findIP (self , ip , name ):
185+ i , _ , ipnum = self .searchLocation (ip )
183186 ip_list = None
184187 if i in self .iphash :
185188 ipstart = self .iphash [i ][0 ]
@@ -202,16 +205,14 @@ def FindIP(self, ip, name):
202205 return ip_list
203206
204207
205- class IPPool (object ):
208+ class Finder (object ):
206209
207210 def __init__ (self , ipfile , recordfile , monitor_mapping ):
208211 self .monitor_mapping = monitor_mapping
209- self .finder = BaseIPPool (ipfile , recordfile )
212+ self .finder = BaseFinder (ipfile , recordfile )
210213
211- def FindIP (self , ip , name ):
212- start_time = time .time ()
213- tmp_ip_list = self .finder .FindIP (ip , name )
214- logger .warning ("use time: %s" % (time .time () - start_time ))
214+ def findIP (self , ip , name ):
215+ tmp_ip_list = self .finder .findIP (ip , name )
215216 ip_list = [
216217 tmp_ip for tmp_ip in tmp_ip_list if self .monitor_mapping .check (name , tmp_ip )]
217218 if len (ip_list ) == 0 :
0 commit comments