Fixed real-time regex
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
from signal import SIGUSR1
|
||||
from secrets import token_urlsafe
|
||||
import subprocess, re, os
|
||||
|
||||
|
||||
#c++ -o proxy proxy.cpp
|
||||
|
||||
class Filter:
|
||||
@@ -25,33 +27,36 @@ class Filter:
|
||||
yield case_sensitive + "S" + self.regex.hex() if self.is_blacklist else case_sensitive + "s"+ self.regex.hex()
|
||||
|
||||
class Proxy:
|
||||
def __init__(self, internal_port, public_port, filters=None, public_host="0.0.0.0", internal_host="127.0.0.1"):
|
||||
def __init__(self, internal_port, public_port, callback_blocked_update=None, filters=None, public_host="0.0.0.0", internal_host="127.0.0.1"):
|
||||
self.public_host = public_host
|
||||
self.public_port = public_port
|
||||
self.internal_host = internal_host
|
||||
self.internal_port = internal_port
|
||||
self.filters = set(filters) if filters else set([])
|
||||
self.process = None
|
||||
self.callback_blocked_update = callback_blocked_update
|
||||
self.config_file_path = None
|
||||
while self.config_file_path is None:
|
||||
config_file_path = os.path.join("/tmp/" + token_urlsafe(16))
|
||||
if not os.path.exists(config_file_path):
|
||||
self.config_file_path = config_file_path
|
||||
|
||||
def start(self, callback=None):
|
||||
def start(self, in_pause=False):
|
||||
if self.process is None:
|
||||
filter_map = self.compile_filters()
|
||||
filters_codes = list(filter_map.keys())
|
||||
filters_codes = list(filter_map.keys()) if not in_pause else []
|
||||
proxy_binary_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"./proxy")
|
||||
config_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"./config_file")
|
||||
with open(config_file_path,'w') as config_file:
|
||||
for line in filters_codes:
|
||||
config_file.write(line + '\n')
|
||||
self.__write_config(filters_codes)
|
||||
|
||||
self.process = subprocess.Popen(
|
||||
[proxy_binary_path, str(self.public_host), str(self.public_port), str(self.internal_host), str(self.internal_port), config_file_path],
|
||||
[proxy_binary_path, str(self.public_host), str(self.public_port), str(self.internal_host), str(self.internal_port), self.config_file_path],
|
||||
stdout=subprocess.PIPE, universal_newlines=True
|
||||
)
|
||||
for stdout_line in iter(self.process.stdout.readline, ""):
|
||||
if stdout_line.startswith("BLOCKED"):
|
||||
regex_id = stdout_line.split()[1]
|
||||
filter_map[regex_id].blocked+=1
|
||||
if callback: callback(filter_map[regex_id])
|
||||
if self.callback_blocked_update: self.callback_blocked_update(filter_map[regex_id])
|
||||
self.process.stdout.close()
|
||||
return self.process.wait()
|
||||
|
||||
@@ -68,24 +73,37 @@ class Proxy:
|
||||
self.process = None
|
||||
return True
|
||||
|
||||
def restart(self):
|
||||
def restart(self, in_pause=False):
|
||||
status = self.stop()
|
||||
self.start()
|
||||
self.start(in_pause=in_pause)
|
||||
return status
|
||||
|
||||
def __write_config(self, filters_codes):
|
||||
with open(self.config_file_path,'w') as config_file:
|
||||
for line in filters_codes:
|
||||
config_file.write(line + '\n')
|
||||
|
||||
def reload(self):
|
||||
if self.process:
|
||||
if self.isactive():
|
||||
filter_map = self.compile_filters()
|
||||
filters_codes = list(filter_map.keys())
|
||||
config_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"./config_file")
|
||||
with open(config_file_path,'w') as config_file:
|
||||
for line in filters_codes:
|
||||
config_file.write(line + '\n')
|
||||
self.process.send_signal(SIGUSR1)
|
||||
self.__write_config(filters_codes)
|
||||
self.trigger_reload_config()
|
||||
|
||||
def isactive(self):
|
||||
return True if self.process else False
|
||||
|
||||
def trigger_reload_config(self):
|
||||
self.process.send_signal(SIGUSR1)
|
||||
|
||||
|
||||
def pause(self):
|
||||
if self.isactive():
|
||||
self.__write_config([])
|
||||
self.trigger_reload_config()
|
||||
else:
|
||||
self.start(in_pause=True)
|
||||
|
||||
def compile_filters(self):
|
||||
res = {}
|
||||
for filter_obj in self.filters:
|
||||
@@ -95,13 +113,3 @@ class Proxy:
|
||||
res[filter] = filter_obj
|
||||
except Exception: pass
|
||||
return res
|
||||
|
||||
def add_filter(self, filter):
|
||||
self.filters.add(filter)
|
||||
self.reload()
|
||||
|
||||
def remove_filter(self, filter):
|
||||
try:
|
||||
del self.filters[self.filters.remove(filter)]
|
||||
except ValueError: return
|
||||
self.reload()
|
||||
|
||||
@@ -318,12 +318,16 @@ void push_regex(char* arg, bool case_sensitive, vector<pair<string,boost::regex>
|
||||
if (case_sensitive){
|
||||
boost::regex regex(reinterpret_cast<char*>(expr),
|
||||
reinterpret_cast<char*>(expr) + expr_len);
|
||||
#ifdef DEBUG
|
||||
cout << "Added case sensitive regex " << expr << endl;
|
||||
#endif
|
||||
v.push_back(make_pair(string(arg), regex));
|
||||
} else {
|
||||
boost::regex regex(reinterpret_cast<char*>(expr),
|
||||
reinterpret_cast<char*>(expr) + expr_len, boost::regex::icase);
|
||||
#ifdef DEBUG
|
||||
cout << "Added case insensitive regex " << expr << endl;
|
||||
#endif
|
||||
v.push_back(make_pair(string(arg), regex));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user