push: code changes
This commit is contained in:
@@ -4,11 +4,11 @@
|
||||
#include "pyproxy/settings.cpp"
|
||||
#include "pyproxy/pyproxy.cpp"
|
||||
#include "classes/netfilter.cpp"
|
||||
#include <syncstream>
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <cstdlib>
|
||||
#include <endian.h>
|
||||
#include "utils.cpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace Firegex::PyProxy;
|
||||
@@ -33,13 +33,13 @@ def invalid_curl_agent(http):
|
||||
|
||||
The code is now edited adding an intestation and a end statement:
|
||||
```python
|
||||
global __firegex_pyfilter_enabled, __firegex_proto
|
||||
<user_code>
|
||||
__firegex_pyfilter_enabled = ["invalid_curl_agent", "func3"] # This list is dynamically generated by firegex backend
|
||||
__firegex_proto = "http"
|
||||
import firegex.nfproxy.internals
|
||||
<user_code>
|
||||
firegex.nfproxy.internals.compile() # This function can save other global variables, to use by the packet handler and is used generally to check and optimize the code
|
||||
firegex.nfproxy.internals.compile(globals(), locals()) # This function can save other global variables, to use by the packet handler and is used generally to check and optimize the code
|
||||
````
|
||||
(First lines are the same to keep line of code consistent on exceptions messages)
|
||||
|
||||
This code will be executed only once, and is needed to build the global and local context to use
|
||||
The globals and locals generated here are copied for each connection, and are used to handle the packets
|
||||
@@ -82,60 +82,53 @@ firegex lib will give you all the needed possibilities to do this is many ways
|
||||
Final note: is not raccomanded to use variables that starts with __firegex_ in your code, because they may break the nfproxy
|
||||
*/
|
||||
|
||||
ssize_t read_check(int __fd, void *__buf, size_t __nbytes){
|
||||
ssize_t bytes = read(__fd, __buf, __nbytes);
|
||||
if (bytes == 0){
|
||||
cerr << "[fatal] [updater] read() returned EOF" << endl;
|
||||
throw invalid_argument("read() returned EOF");
|
||||
}
|
||||
if (bytes < 0){
|
||||
cerr << "[fatal] [updater] read() returned an error" << bytes << endl;
|
||||
throw invalid_argument("read() returned an error");
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
void config_updater (){
|
||||
while (true){
|
||||
PyThreadState* state = PyEval_SaveThread(); // Release GIL while doing IO operation
|
||||
uint32_t code_size;
|
||||
read_check(STDIN_FILENO, &code_size, 4);
|
||||
//Python will send number always in little endian
|
||||
code_size = le32toh(code_size);
|
||||
string code;
|
||||
code.resize(code_size);
|
||||
read_check(STDIN_FILENO, code.data(), code_size);
|
||||
memcpy(&code_size, control_socket.recv(4).c_str(), 4);
|
||||
code_size = be32toh(code_size);
|
||||
string code = control_socket.recv(code_size);
|
||||
#ifdef DEBUG
|
||||
cerr << "[DEBUG] [updater] Received code: " << code << endl;
|
||||
#endif
|
||||
cerr << "[info] [updater] Updating configuration" << endl;
|
||||
PyEval_AcquireThread(state); //Restore GIL before executing python code
|
||||
try{
|
||||
config.reset(new PyCodeConfig(code));
|
||||
cerr << "[info] [updater] Config update done" << endl;
|
||||
osyncstream(cout) << "ACK OK" << endl;
|
||||
control_socket << "ACK OK" << endl;
|
||||
}catch(const std::exception& e){
|
||||
cerr << "[error] [updater] Failed to build new configuration!" << endl;
|
||||
osyncstream(cout) << "ACK FAIL " << e.what() << endl;
|
||||
control_socket << "ACK FAIL " << e.what() << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
// Connect to the python backend using the unix socket
|
||||
init_control_socket();
|
||||
|
||||
// Initialize the python interpreter
|
||||
Py_Initialize();
|
||||
atexit(Py_Finalize);
|
||||
init_handle_packet_code(); //Compile the static code used to handle packets
|
||||
|
||||
if (freopen(nullptr, "rb", stdin) == nullptr){ // We need to read from stdin binary data
|
||||
cerr << "[fatal] [main] Failed to reopen stdin in binary mode" << endl;
|
||||
return 1;
|
||||
}
|
||||
int n_of_threads = 1;
|
||||
char * n_threads_str = getenv("NTHREADS");
|
||||
if (n_threads_str != nullptr) n_of_threads = ::atoi(n_threads_str);
|
||||
if(n_of_threads <= 0) n_of_threads = 1;
|
||||
|
||||
config.reset(new PyCodeConfig());
|
||||
|
||||
MultiThreadQueue<PyProxyQueue> queue(n_of_threads);
|
||||
|
||||
osyncstream(cout) << "QUEUE " << queue.queue_num() << endl;
|
||||
control_socket << "QUEUE " << queue.queue_num() << endl;
|
||||
|
||||
cerr << "[info] [main] Queue: " << queue.queue_num() << " threads assigned: " << n_of_threads << endl;
|
||||
|
||||
thread qthr([&](){
|
||||
|
||||
Reference in New Issue
Block a user