Fixed real-time regex

This commit is contained in:
nik012003
2022-06-18 13:05:59 +02:00
committed by DomySh
parent da3e06a5e0
commit fa88940112
3 changed files with 94 additions and 68 deletions

View File

@@ -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()

View File

@@ -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));
}
}