From a3e9dd32695bdb4fe0dce3456fcfd6e33ff9022c Mon Sep 17 00:00:00 2001 From: nik012003 Date: Sun, 26 Jun 2022 02:12:57 +0200 Subject: [PATCH] Updated benchmark --- backend/app.py | 4 ++ backend/proxy/proxy.cpp | 26 +++++--- backend/proxy/test | 126 -------------------------------------- docs/FiregexBenchmark.png | Bin 17858 -> 18092 bytes tests/README.md | 34 +++++----- tests/benchmark.py | 4 +- 6 files changed, 40 insertions(+), 154 deletions(-) delete mode 100644 backend/proxy/test diff --git a/backend/app.py b/backend/app.py index fcae439..6ee7d0d 100644 --- a/backend/app.py +++ b/backend/app.py @@ -64,6 +64,7 @@ def get_status(): @app.route("/api/login", methods = ['POST']) def login(): + if DEBUG: return { "status":"ok" } if app.config["STATUS"] != "run": return abort(404) req = request.get_json(force = True) @@ -89,12 +90,14 @@ def login(): @app.route("/api/logout") def logout(): + if DEBUG: return { "status":"ok" } session["loggined"] = False return { "status":"ok" } @app.route('/api/change-password', methods = ['POST']) @login_required def change_password(): + if DEBUG: return { "status":"ok" } if app.config["STATUS"] != "run": return abort(404) req = request.get_json(force = True) @@ -123,6 +126,7 @@ def change_password(): @app.route('/api/set-password', methods = ['POST']) def set_password(): + if DEBUG: return { "status":"ok" } if app.config["STATUS"] != "init": return abort(404) req = request.get_json(force = True) try: diff --git a/backend/proxy/proxy.cpp b/backend/proxy/proxy.cpp index 24c7aff..370dd1d 100644 --- a/backend/proxy/proxy.cpp +++ b/backend/proxy/proxy.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -45,15 +45,15 @@ struct regex_rules{ shared_ptr regex_config; const char* config_file; -mutex mtx; +mutex update_mutex; bool filter_data(unsigned char* data, const size_t& bytes_transferred, vector> const &blacklist, vector> const &whitelist){ #ifdef DEBUG_PACKET - cout << "---------------- Packet ----------------" << endl; + cerr << "---------------- Packet ----------------" << endl; for(int i=0;i ele:blacklist){ try{ @@ -76,7 +76,7 @@ bool filter_data(unsigned char* data, const size_t& bytes_transferred, vector> &v){ - std::unique_lock lck(mtx); size_t expr_len = (strlen(arg)-2)/2; char expr[expr_len]; unhexlify(arg+2, arg+strlen(arg)-1, expr); @@ -334,13 +333,13 @@ void push_regex(char* arg, bool case_sensitive, vector> &v){ if (case_sensitive){ regex regex(expr_str); #ifdef DEBUG - cout << "Added case sensitive regex " << expr_str << endl; + cerr << "Added case sensitive regex " << expr_str << endl; #endif v.push_back(make_pair(string(arg), regex)); } else { regex regex(expr_str,regex_constants::icase); #ifdef DEBUG - cout << "Added case insensitive regex " << expr_str << endl; + cerr << "Added case insensitive regex " << expr_str << endl; #endif v.push_back(make_pair(string(arg), regex)); } @@ -351,6 +350,7 @@ void push_regex(char* arg, bool case_sensitive, vector> &v){ void update_regex(){ + std::unique_lock lck(update_mutex); fstream fd; fd.open(config_file,ios::in); if (!fd.is_open()){ @@ -397,13 +397,19 @@ void signal_handler(int signal_num) { if (signal_num == SIGUSR1){ #ifdef DEBUG - cout << "Updating configurtation" << endl; + cerr << "Updating configurtation" << endl; #endif update_regex(); }else if(signal_num == SIGTERM){ if (ios_loop != nullptr) ios_loop->stop(); + #ifdef DEBUG + cerr << "Close Requested" << endl; + #endif exit(0); }else if (signal_num == SIGSEGV){ + #ifdef DEBUG + cerr << "Forced Close" << endl; + #endif exit(0); } } diff --git a/backend/proxy/test b/backend/proxy/test deleted file mode 100644 index 483135d..0000000 --- a/backend/proxy/test +++ /dev/null @@ -1,126 +0,0 @@ -S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 -1C3733353138303461313162386234323563313931613664373937666264356630 -1S3733353138303461313162386234323563313931613664373937666264356630 -1C3065376433366539666631353833373263633764613966396235313538633766 -1S3065376433366539666631353833373263633764613966396235313538633766 -1C3638316561366437356466353765656265383933396630326262393338336438 -1S3638316561366437356466353765656265383933396630326262393338336438 -1C3739663566343265663536633261656665623338346135616464633539663930 -1S3739663566343265663536633261656665623338346135616464633539663930 diff --git a/docs/FiregexBenchmark.png b/docs/FiregexBenchmark.png index 9acb796a55611b591c828ef237aab8b9af0bacb8..4f9a050fbb639519c2820d21e1e39e7cd053b792 100644 GIT binary patch literal 18092 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 M_f)o2`uUsx1)?J#)c^nh diff --git a/tests/README.md b/tests/README.md index f90f6d6..b28c90f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -29,23 +29,25 @@ The testing methodology will soon be updated with more edge-cases. # Running a Benchmark ./benchmark.py options: - -h, --help show this help message and exit - --address ADDRESS, -a ADDRESS - Address of firegex backend - --service_port SERVICE_PORT, -P SERVICE_PORT - Port of the Benchmark service - --service_name SERVICE_NAME, -n SERVICE_NAME - Name of the Benchmark service - --password PASSWORD, -p PASSWORD - Firegex password - --num_of_regexes NUM_OF_REGEXES, -r NUM_OF_REGEXES - Number of regexes to benchmark with - --duration DURATION, -d DURATION - Duration of the Benchmark in seconds - --output_file OUTPUT_FILE, -o OUTPUT_FILE - Output results csv file + --address ADDRESS, -a ADDRESS + Address of firegex backend + --service_port SERVICE_PORT, -P SERVICE_PORT + Port of the Benchmark service + --service_name SERVICE_NAME, -n SERVICE_NAME + Name of the Benchmark service + --password PASSWORD, -p PASSWORD + Firegex password + --num_of_regexes NUM_OF_REGEXES, -r NUM_OF_REGEXES + Number of regexes to benchmark with + --duration DURATION, -d DURATION + Duration of the Benchmark in seconds + --output_file OUTPUT_FILE, -o OUTPUT_FILE + Output results csv file + --num_of_streams NUM_OF_STREAMS, -s NUM_OF_STREAMS + Output results csv file + --new_istance, -i Create a new service -Benchmarks let you evaluate the performance of the proxy. You can run one by typing in a shell ```test.py -p FIREGEX_PASSWORD -r NUM_OF_REGEX -d BENCHMARK_DURATION```. +Benchmarks let you evaluate the performance of the proxy. You can run one by typing in a shell ```test.py -p FIREGEX_PASSWORD -r NUM_OF_REGEX -d BENCHMARK_DURATION -i```. It uses iperf3 to benchmark the throughput in MB/s of the server, both with proxy, without proxy, and for each new added regex. It will automatically add a new random regex untill it has reached NUM_OF_REGEX specified in the arguments. diff --git a/tests/benchmark.py b/tests/benchmark.py index 9e0d0f7..7076ac3 100755 --- a/tests/benchmark.py +++ b/tests/benchmark.py @@ -22,7 +22,7 @@ def puts(text, *args, color=colors.white, is_bold=False, **kwargs): def sep(): puts("-----------------------------------", is_bold=True) parser = argparse.ArgumentParser() -parser.add_argument("--address", "-a", type=str , required=False, help='Address of firegex backend', default="http://127.0.0.1:5000/") +parser.add_argument("--address", "-a", type=str , required=False, help='Address of firegex backend', default="http://127.0.0.1:4444/") parser.add_argument("--service_port", "-P", type=int , required=False, help='Port of the Benchmark service', default=1337) parser.add_argument("--service_name", "-n", type=str , required=False, help='Name of the Benchmark service', default="Benchmark Service") parser.add_argument("--password", "-p", type=str, required=True, help='Firegex password') @@ -127,4 +127,4 @@ if args.new_istance: assert req.json()["status"] == "ok", f"Benchmark Failed: Couldn't delete service {req.text}" puts(f"Sucessfully delete service with id {service_id} ✔", color=colors.green) -server.terminate() \ No newline at end of file +server.terminate()