#include "lua/lua.h"
#include "main/analyzer.h"
#include "main/analyzer_command.h"
-#include "main/request.h"
#include "main/shell.h"
#include "main/snort.h"
#include "main/snort_config.h"
return pig_poke->get(-1);
}
-static Request request;
-static Request* current_request = &request;
+static SharedRequest current_request = std::make_shared<Request>();
#ifdef SHELL
static int current_fd = -1;
#endif
-Request& get_current_request()
+SharedRequest get_current_request()
{
- return *current_request;
+ return current_request;
}
//-------------------------------------------------------------------------
else
current_request->respond("== reload failed - bad config\n");
- HostAttributesManager::load_failure_cleanup();
return 0;
}
+ if ( !sc->attribute_hosts_file.empty() )
+ {
+ if ( !HostAttributesManager::load_hosts_file(sc, sc->attribute_hosts_file.c_str()) )
+ current_request->respond("== reload failed - host attributes file failed to load\n");
+ }
+
int32_t num_hosts = HostAttributesManager::get_num_host_entries();
if ( num_hosts >= 0 )
LogMessage( "host attribute table: %d hosts loaded\n", num_hosts);
struct lua_State;
const char* get_prompt();
-Request& get_current_request();
+SharedRequest get_current_request();
// commands provided by the snort module
int main_delete_inspector(lua_State* = nullptr);
#include "utils/stats.h"
#include "analyzer.h"
-#include "request.h"
#include "snort.h"
#include "snort_config.h"
#include "swapper.h"
LogMessage("==================================================\n"); // Marking End of stats
}
-ACSwap::ACSwap(Swapper* ps, Request* req, bool from_shell) : ps(ps), request(req), from_shell(from_shell)
+ACSwap::ACSwap(Swapper* ps, SharedRequest req, bool from_shell) : ps(ps), request(req), from_shell(from_shell)
{
assert(Swapper::get_reload_in_progress() == false);
Swapper::set_reload_in_progress(true);
request->respond("== reload complete\n", from_shell, true);
}
-ACHostAttributesSwap::ACHostAttributesSwap(Request* req, bool from_shell)
+ACHostAttributesSwap::ACHostAttributesSwap(SharedRequest req, bool from_shell)
: request(req), from_shell(from_shell)
{
assert(Swapper::get_reload_in_progress() == false);
#ifndef ANALYZER_COMMANDS_H
#define ANALYZER_COMMANDS_H
-#include "main/snort_types.h"
+#include "request.h"
+#include "snort_types.h"
class Analyzer;
-class Request;
class Swapper;
namespace snort
{
public:
ACSwap() = delete;
- ACSwap(Swapper* ps, Request* req, bool from_shell);
+ ACSwap(Swapper* ps, SharedRequest req, bool from_shell);
bool execute(Analyzer&, void**) override;
const char* stringify() override { return "SWAP"; }
~ACSwap() override;
private:
Swapper *ps;
- Request* request;
+ SharedRequest request;
bool from_shell;
};
class ACHostAttributesSwap : public snort::AnalyzerCommand
{
public:
- ACHostAttributesSwap(Request* req, bool from_shell);
+ ACHostAttributesSwap(SharedRequest req, bool from_shell);
bool execute(Analyzer&, void**) override;
const char* stringify() override { return "HOST_ATTRIBUTES_SWAP"; }
~ACHostAttributesSwap() override;
private:
- Request* request;
+ SharedRequest request;
bool from_shell;
};
#include "utils/util.h"
#include "control_mgmt.h"
-#include "request.h"
#include "shell.h"
using namespace snort;
fd = i;
local_control = local;
sh = new Shell;
- request = new Request(fd);
+ request = std::make_shared<Request>(fd);
configure();
show_prompt();
}
if( !local_control )
close(fd);
delete sh;
- delete request;
}
void ControlConn::configure() const
ModuleManager::load_commands(sh);
}
-int ControlConn::shell_execute(int& current_fd, Request*& current_request)
+int ControlConn::shell_execute(int& current_fd, SharedRequest& current_request)
{
if ( !request->read() )
return -1;
#ifndef CONTROL_H
#define CONTROL_H
+#include "main/request.h"
#include "main/snort_types.h"
class ControlConn
int get_fd() const { return fd; }
class Shell* get_shell() const { return sh; }
- class Request* get_request() const { return request; }
+ SharedRequest get_request() const { return request; }
bool is_local_control() const { return local_control; }
void block();
bool is_blocked() const { return blocked; }
void configure() const;
- int shell_execute(int& current_fd, Request*& current_request);
+ int shell_execute(int& current_fd, SharedRequest& current_request);
bool show_prompt() const;
private:
bool blocked = false;
bool local_control;
class Shell *sh;
- class Request* request;
+ SharedRequest request;
};
#endif
#include "utils/stats.h"
#include "utils/util.h"
#include "control.h"
-#include "request.h"
#include "snort_config.h"
#include "utils/util_cstring.h"
return 0;
}
-bool ControlMgmt::process_control_commands(int& current_fd, Request*& current_request, int evnt_fd)
+bool ControlMgmt::process_control_commands(int& current_fd, SharedRequest& current_request, int evnt_fd)
{
auto control_conn = controls.find(evnt_fd);
if (control_conn == controls.end())
return false;
- Request* old_request = current_request;
+ SharedRequest old_request = current_request;
int fd = control_conn->second->shell_execute(current_fd, current_request);
current_fd = -1;
current_request = old_request;
return true;
}
-bool ControlMgmt::service_users(int& current_fd, Request*& current_request)
+bool ControlMgmt::service_users(int& current_fd, SharedRequest& current_request)
{
bool ret = false;
struct epoll_event events[MAX_EPOLL_EVENTS];
return 0;
}
-bool ControlMgmt::process_control_commands(int& current_fd, Request*& current_request)
+bool ControlMgmt::process_control_commands(int& current_fd, SharedRequest& current_request)
{
bool ret = false;
int fd = (*control)->get_fd();
if (FD_ISSET(fd, &inputs))
{
- Request* old_request = current_request;
+ SharedRequest old_request = current_request;
fd = (*control)->shell_execute(current_fd, current_request);
current_fd = -1;
current_request = old_request;
return ret;
}
-bool ControlMgmt::service_users(int& current_fd, Request*& current_request)
+bool ControlMgmt::service_users(int& current_fd, SharedRequest& current_request)
{
FD_ZERO(&inputs);
int max_fd = -1;
#include <vector>
+#include "request.h"
+
class ControlConn;
class ControlMgmt
static int socket_term();
static int socket_conn();
- static bool process_control_commands(int& current_fd, class Request*& current_request, int);
- static bool process_control_commands(int& current_fd, class Request*& current_request);
+ static bool process_control_commands(int& current_fd, SharedRequest& current_request, int);
+ static bool process_control_commands(int& current_fd, SharedRequest& current_request);
static ControlConn* find_control(int fd);
static bool find_control(int fd, std::vector<ControlConn*>::iterator& control);
static void delete_control(int fd);
static void delete_control(std::vector<ControlConn*>::iterator& control);
- static bool service_users(int& current_fd, class Request*& current_request);
+ static bool service_users(int& current_fd, SharedRequest& current_request);
private:
static int setup_socket_family();
}
#endif
-Request& get_dispatched_request()
+SharedRequest get_dispatched_request()
{
return get_current_request();
}
#ifndef REQUEST_H
#define REQUEST_H
+#include <memory>
#include <mutex>
#include <queue>
std::mutex queued_response_mutex;
};
-SO_PUBLIC Request& get_dispatched_request();
+using SharedRequest = std::shared_ptr<Request>;
+
+SO_PUBLIC SharedRequest get_dispatched_request();
#endif
public:
bool execute(Analyzer&, void**) override;
ACThirdPartyAppIdContextUnload(const AppIdInspector& inspector, ThirdPartyAppIdContext* tp_ctxt,
- Request& current_request, bool from_shell): inspector(inspector),
+ SharedRequest current_request, bool from_shell): inspector(inspector),
tp_ctxt(tp_ctxt), request(current_request), from_shell(from_shell) { }
~ACThirdPartyAppIdContextUnload() override;
const char* stringify() override { return "THIRD-PARTY_CONTEXT_UNLOAD"; }
private:
const AppIdInspector& inspector;
ThirdPartyAppIdContext* tp_ctxt = nullptr;
- Request& request;
+ SharedRequest request;
bool from_shell;
};
ctxt.create_tp_appid_ctxt();
main_broadcast_command(new ACThirdPartyAppIdContextSwap(inspector));
LogMessage("== reload third-party complete\n");
- request.respond("== reload third-party complete\n", from_shell, true);
+ request->respond("== reload third-party complete\n", from_shell, true);
Swapper::set_reload_in_progress(false);
}
public:
bool execute(Analyzer&, void**) override;
ACOdpContextSwap(const AppIdInspector& inspector, OdpContext& odp_ctxt,
- Request& current_request, bool from_shell) : inspector(inspector),
+ SharedRequest current_request, bool from_shell) : inspector(inspector),
odp_ctxt(odp_ctxt), request(current_request), from_shell(from_shell) { }
~ACOdpContextSwap() override;
const char* stringify() override { return "ODP_CONTEXT_SWAP"; }
private:
const AppIdInspector& inspector;
OdpContext& odp_ctxt;
- Request& request;
+ SharedRequest request;
bool from_shell;
};
ctxt.get_odp_ctxt().get_app_info_mgr().dump_appid_configurations(file_path);
}
LogMessage("== reload detectors complete\n");
- request.respond("== reload detectors complete\n", from_shell, true);
+ request->respond("== reload detectors complete\n", from_shell, true);
Swapper::set_reload_in_progress(false);
}
static int reload_third_party(lua_State* L)
{
bool from_shell = ( L != nullptr );
- Request& current_request = get_current_request();
+ SharedRequest current_request = get_current_request();
if (Swapper::get_reload_in_progress())
{
- current_request.respond("== reload pending; retry\n", from_shell);
+ current_request->respond("== reload pending; retry\n", from_shell);
return 0;
}
- current_request.respond(".. reloading third-party\n", from_shell);
+ current_request->respond(".. reloading third-party\n", from_shell);
AppIdInspector* inspector = (AppIdInspector*) InspectorManager::get_inspector(MOD_NAME);
if (!inspector)
{
- current_request.respond("== reload third-party failed - appid not enabled\n", from_shell);
+ current_request->respond("== reload third-party failed - appid not enabled\n", from_shell);
return 0;
}
const AppIdContext& ctxt = inspector->get_ctxt();
ThirdPartyAppIdContext* old_ctxt = ctxt.get_tp_appid_ctxt();
if (!old_ctxt)
{
- current_request.respond("== reload third-party failed - third-party module doesn't exist\n", from_shell);
+ current_request->respond("== reload third-party failed - third-party module doesn't exist\n", from_shell);
return 0;
}
Swapper::set_reload_in_progress(true);
- current_request.respond("== unloading old third-party configuration\n", from_shell);
+ current_request->respond("== unloading old third-party configuration\n", from_shell);
main_broadcast_command(new ACThirdPartyAppIdContextUnload(*inspector, old_ctxt,
current_request, from_shell), from_shell);
return 0;
static int reload_detectors(lua_State* L)
{
bool from_shell = ( L != nullptr );
- Request& current_request = get_current_request();
+ SharedRequest current_request = get_current_request();
if (Swapper::get_reload_in_progress())
{
- current_request.respond("== reload pending; retry\n", from_shell);
+ current_request->respond("== reload pending; retry\n", from_shell);
return 0;
}
- current_request.respond(".. reloading detectors\n", from_shell);
+ current_request->respond(".. reloading detectors\n", from_shell);
AppIdInspector* inspector = (AppIdInspector*) InspectorManager::get_inspector(MOD_NAME);
if (!inspector)
{
- current_request.respond("== reload detectors failed - appid not enabled\n", from_shell);
+ current_request->respond("== reload detectors failed - appid not enabled\n", from_shell);
return 0;
}
Swapper::set_reload_in_progress(true);
odp_thread_local_ctxt->initialize(ctxt, true, true);
odp_ctxt.initialize();
- current_request.respond("== swapping detectors configuration\n", from_shell);
+ current_request->respond("== swapping detectors configuration\n", from_shell);
main_broadcast_command(new ACOdpContextSwap(*inspector, old_odp_ctxt,
current_request, from_shell), from_shell);
return 0;
host_cache.invalidate();
- auto& request = get_dispatched_request();
- request.respond("data purge done\n", false, true);
+ SharedRequest request = get_dispatched_request();
+ request->respond("data purge done\n", false, true);
LogMessage("data purge done\n");
}
} // end of namespace snort
-static Request mock_request;
+static SharedRequest mock_request = std::make_shared<Request>();
void Request::respond(const char*, bool, bool) { }
-Request& get_dispatched_request() { return mock_request; }
+SharedRequest get_dispatched_request() { return mock_request; }
HostCacheMac* get_host_cache_mac() { return nullptr; }