Skip to content
API Documentation
BastionGuard™
main.cpp
Go to the documentation of this file.
4
5#include <csignal>
6#include <iostream>
7#include <memory>
8#include <string>
9
10static std::unique_ptr<bsc::service::DaemonService> g_service;
11
12static void on_signal(int) {
13 if (g_service) g_service->stop();
14}
15
16namespace {
17
18bool is_flag(const std::string& arg, const std::string& long_name, const std::string& short_name = {}) {
19 return arg == long_name || (!short_name.empty() && arg == short_name);
20}
21
22int clamp_log_level(int lvl) {
23 if (lvl <= 0) return 0;
24 if (lvl >= 3) return 3;
25 return lvl;
26}
27
28} // namespace
29
30int main(int argc, char** argv) {
31 std::string config_file = "/etc/bastionguard-secure-connectiond/default-config.json";
32 std::string rules_path_override;
33 std::string socket_override;
34 std::string log_file_override;
35 std::string fw_config_override;
36 std::string proc_monitor_method_override;
37 std::uint16_t queue_num_override = 0;
38 bool set_queue_num_override = false;
39 bool intercept_unknown_override = false;
40 bool set_intercept_override = false;
41 bool log_utc_override = true;
42 bool set_log_utc_override = false;
43 bool log_micro_override = false;
44 bool set_log_micro_override = false;
45 int log_level_override = -1;
46
47 for (int i = 1; i < argc; ++i) {
48 std::string arg = argv[i];
49 if ((is_flag(arg, "--config-file", "-config-file")) && i + 1 < argc) config_file = argv[++i];
50 else if ((is_flag(arg, "--rules-path", "-rules-path")) && i + 1 < argc) rules_path_override = argv[++i];
51 else if ((is_flag(arg, "--ui-socket", "-ui-socket")) && i + 1 < argc) socket_override = argv[++i];
52 else if ((is_flag(arg, "--log-file", "-log-file")) && i + 1 < argc) log_file_override = argv[++i];
53 else if ((is_flag(arg, "--fw-config-file", "-fw-config-file")) && i + 1 < argc) fw_config_override = argv[++i];
54 else if ((is_flag(arg, "--process-monitor-method", "-process-monitor-method")) && i + 1 < argc) proc_monitor_method_override = argv[++i];
55 else if ((is_flag(arg, "--queue-num", "-queue-num")) && i + 1 < argc) {
56 queue_num_override = static_cast<std::uint16_t>(std::stoul(argv[++i]));
57 set_queue_num_override = true;
58 }
59 else if (is_flag(arg, "--intercept-unknown", "-intercept-unknown")) { intercept_unknown_override = true; set_intercept_override = true; }
60 else if (is_flag(arg, "--no-intercept-unknown", "-no-intercept-unknown")) { intercept_unknown_override = false; set_intercept_override = true; }
61 else if (is_flag(arg, "--log-utc", "-log-utc")) { log_utc_override = true; set_log_utc_override = true; }
62 else if (is_flag(arg, "--no-log-utc", "-no-log-utc")) { log_utc_override = false; set_log_utc_override = true; }
63 else if (is_flag(arg, "--log-micro", "-log-micro")) { log_micro_override = true; set_log_micro_override = true; }
64 else if (is_flag(arg, "--debug", "-debug")) log_level_override = 0;
65 else if (is_flag(arg, "--warning", "-warning")) log_level_override = 1;
66 else if (is_flag(arg, "--important", "-important")) log_level_override = 2;
67 else if (is_flag(arg, "--error", "-error")) log_level_override = 3;
68 else if (arg == "--version" || arg == "-version") { std::cout << "bsc-daemon-cpp 0.6\n"; return 0; }
69 else if (arg == "--help" || arg == "-help") {
70 std::cout
71 << "Usage: bsc-daemon [--config-file PATH] [--rules-path DIR] [--ui-socket URI] [--log-file PATH]\n"
72 << " [--fw-config-file PATH] [--process-monitor-method proc|netlink|audit|ebpf]\n"
73 << " [--queue-num N] [--intercept-unknown|--no-intercept-unknown]\n";
74 return 0;
75 }
76 }
77
78 auto cfg = bsc::config::load_file(config_file);
79 cfg.source_path = config_file;
80 if (!rules_path_override.empty()) cfg.rules.path = rules_path_override;
81 if (!socket_override.empty()) cfg.server.address = socket_override;
82 if (!log_file_override.empty()) cfg.server.log_file = log_file_override;
83 if (!fw_config_override.empty()) cfg.fw_options.config_path = fw_config_override;
84 if (!proc_monitor_method_override.empty()) cfg.proc_monitor_method = proc_monitor_method_override;
85 if (set_queue_num_override) cfg.fw_options.queue_num = queue_num_override;
86 if (set_intercept_override) cfg.intercept_unknown = intercept_unknown_override;
87 if (set_log_utc_override) cfg.log_utc = log_utc_override;
88 if (set_log_micro_override) cfg.log_micro = log_micro_override;
89 if (log_level_override >= 0) cfg.log_level = clamp_log_level(log_level_override);
90
92 log.set_level(static_cast<bsc::logging::Level>(clamp_log_level(cfg.log_level)));
93 log.set_utc(cfg.log_utc);
94 log.set_microseconds(cfg.log_micro);
95 log.set_log_file(cfg.server.log_file);
96
97 std::signal(SIGINT, on_signal);
98 std::signal(SIGTERM, on_signal);
99 g_service = std::make_unique<bsc::service::DaemonService>(cfg);
100 g_service->run();
101 g_service.reset();
102 return 0;
103}
int main(int argc, char *argv[])
static Logger & instance()
Definition Logger.cpp:11
bool is_flag(const std::string &arg, const std::string &long_name, const std::string &short_name={})
Definition main.cpp:18
int clamp_log_level(int lvl)
Definition main.cpp:22
Config load_file(const std::string &path)
Definition Config.cpp:51
static std::unique_ptr< bsc::service::DaemonService > g_service
Definition main.cpp:10
static void on_signal(int)
Definition main.cpp:12