Skip to content

Commit 262d23b

Browse files
Lukas955sedmicha
authored andcommitted
Merge branch 'fdsdump-changes-2' into 'fdsdump-base'
Fdsdump changes 2 See merge request monitoring/ipfixcol2!6
2 parents df57ca6 + 37df586 commit 262d23b

29 files changed

+625
-122
lines changed

src/tools/fdsdump/src/aggregator/mode.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <vector>
33

44
#include <common/flowProvider.hpp>
5+
#include <common/ieMgr.hpp>
56

67
#include <aggregator/aggregator.hpp>
78
#include <aggregator/mode.hpp>
@@ -13,19 +14,19 @@ namespace fdsdump {
1314
namespace aggregator {
1415

1516
void
16-
mode_aggregate(const shared_iemgr &iemgr, const Options &opts)
17+
mode_aggregate(const Options &opts)
1718
{
1819
ViewDefinition view_def = make_view_def(
1920
opts.get_aggregation_keys(),
2021
opts.get_aggregation_values(),
21-
iemgr.get());
22+
IEMgr::instance().ptr());
2223
std::vector<SortField> sort_fields = make_sort_def(
2324
view_def,
2425
opts.get_order_by());
2526
std::unique_ptr<Printer> printer = printer_factory(
2627
view_def,
2728
opts.get_output_specifier());
28-
FlowProvider flows {iemgr};
29+
FlowProvider flows;
2930
Aggregator aggr(view_def);
3031

3132
const size_t rec_limit = opts.get_output_limit();

src/tools/fdsdump/src/aggregator/mode.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace fdsdump {
77
namespace aggregator {
88

99
void
10-
mode_aggregate(const shared_iemgr &iemgr, const Options &opts);
10+
mode_aggregate(const Options &opts);
1111

1212
} // aggregator
1313
} // fdsdump

src/tools/fdsdump/src/common/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ set(COMMON_SRC
66
filelist.cpp
77
flowProvider.cpp
88
ipaddr.cpp
9+
ieMgr.cpp
910
)
1011

1112
add_library(common_obj OBJECT ${COMMON_SRC})

src/tools/fdsdump/src/common/field.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@
33
#include <stdexcept>
44

55
#include <common/field.hpp>
6+
#include <common/ieMgr.hpp>
67

78
namespace fdsdump {
89

9-
Field::Field(std::string name, const shared_iemgr &iemgr)
10-
: m_name(name), m_iemgr(iemgr)
10+
Field::Field(std::string name)
11+
: m_name(name)
1112
{
1213
string_trim(m_name);
1314

14-
m_alias = fds_iemgr_alias_find(m_iemgr.get(), m_name.c_str());
15+
auto *iemgr = IEMgr::instance().ptr();
16+
17+
m_alias = fds_iemgr_alias_find(iemgr, m_name.c_str());
1518
if (m_alias) {
1619
// Success
1720
m_type = get_type_of_alias(m_alias);
1821
return;
1922
}
2023

21-
m_elem = fds_iemgr_elem_find_name(m_iemgr.get(), m_name.c_str());
24+
m_elem = fds_iemgr_elem_find_name(iemgr, m_name.c_str());
2225
if (m_elem) {
2326
// Success
2427
m_type = get_type_of_element(m_elem);

src/tools/fdsdump/src/common/field.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,9 @@ struct Field {
3939
* @brief Create a new getter for an alias or an IPFIX Field.
4040
*
4141
* @param name Name of alias or an IPFIX Element to lookup
42-
* @param iemgr IE manager where to look for the field
4342
* @throw std::invalid_argument If the alias or element cannot be found.
4443
*/
45-
Field(std::string name, const shared_iemgr &iemgr);
44+
Field(std::string name);
4645
~Field() = default;
4746

4847
/**
@@ -93,8 +92,6 @@ struct Field {
9392
private:
9493
// Name of the field (trimmed)
9594
std::string m_name;
96-
// Reference to the IE manager
97-
shared_iemgr m_iemgr;
9895
// Data type of the the field
9996
FieldType m_type;
10097
// Alias definition (might be nullptr)

src/tools/fdsdump/src/common/fieldView.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include <common/fieldView.hpp>
66

7+
#include <libfds/converters.h>
8+
79
namespace fdsdump {
810

911
uint64_t
@@ -104,15 +106,45 @@ IPAddr
104106
FieldView::as_ipaddr() const
105107
{
106108
if (m_field.size == 4U) {
107-
const uint32_t *value = reinterpret_cast<uint32_t *>(m_field.data);
108-
return IPAddr(*value);
109+
return IPAddr::ip4(m_field.data);
109110
}
110111

111112
if (m_field.size == 16U) {
112-
return IPAddr(m_field.data);
113+
return IPAddr::ip6(m_field.data);
113114
}
114115

115116
throw std::invalid_argument("Conversion error (ipaddr)");
116117
}
117118

119+
std::string
120+
FieldView::as_string() const
121+
{
122+
std::string value;
123+
124+
if (m_field.size > 0) {
125+
// &value[0] doesn't work for zero-sized strings, so we have to handle this specially
126+
value.resize(m_field.size);
127+
int ret = fds_get_string(m_field.data, m_field.size, &value[0]);
128+
if (ret != FDS_OK) {
129+
throw std::invalid_argument("Conversion error (string)");
130+
}
131+
}
132+
133+
return value;
134+
}
135+
136+
std::vector<uint8_t>
137+
FieldView::as_bytes() const
138+
{
139+
std::vector<uint8_t> value;
140+
141+
value.resize(m_field.size);
142+
int ret = fds_get_octet_array(m_field.data, m_field.size, value.data());
143+
if (ret != FDS_OK) {
144+
throw std::invalid_argument("Conversion error (bytes)");
145+
}
146+
147+
return value;
148+
}
149+
118150
} // fdsdump

src/tools/fdsdump/src/common/fieldView.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11

22
#pragma once
33

4+
#include <cstdint>
45
#include <ctime>
6+
#include <string>
7+
#include <vector>
58

69
#include <libfds.h>
710

@@ -21,6 +24,8 @@ class FieldView {
2124
struct timespec as_datetime() const;
2225
uint64_t as_datetime_ms() const;
2326
IPAddr as_ipaddr() const;
27+
std::string as_string() const;
28+
std::vector<uint8_t> as_bytes() const;
2429

2530
private:
2631
const struct fds_drec_field &m_field;

src/tools/fdsdump/src/common/flowProvider.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
#include <common/fieldView.hpp>
77
#include <common/flowProvider.hpp>
8+
#include <common/ieMgr.hpp>
89

910
namespace fdsdump {
1011

11-
FlowProvider::FlowProvider(const shared_iemgr &iemgr)
12-
: m_iemgr(iemgr)
12+
FlowProvider::FlowProvider()
1313
{
1414
int ret;
1515

@@ -18,7 +18,7 @@ FlowProvider::FlowProvider(const shared_iemgr &iemgr)
1818
throw std::runtime_error("fds_file_init() has failed");
1919
}
2020

21-
ret = fds_file_set_iemgr(m_file.get(), m_iemgr.get());
21+
ret = fds_file_set_iemgr(m_file.get(), IEMgr::instance().ptr());
2222
if (ret != FDS_OK) {
2323
throw std::runtime_error("fds_file_set_iemgr() has failed: " + std::to_string(ret));
2424
}
@@ -36,7 +36,7 @@ FlowProvider::set_filter(const std::string &expr)
3636
fds_ipfix_filter_t *filter;
3737
int ret;
3838

39-
ret = fds_ipfix_filter_create(&filter, m_iemgr.get(), expr.c_str());
39+
ret = fds_ipfix_filter_create(&filter, IEMgr::instance().ptr(), expr.c_str());
4040
m_filter.reset(filter);
4141

4242
if (ret != FDS_OK) {

src/tools/fdsdump/src/common/flowProvider.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace fdsdump {
1414

1515
class FlowProvider {
1616
public:
17-
FlowProvider(const shared_iemgr &iemgr);
17+
FlowProvider();
1818
~FlowProvider() = default;
1919

2020
FlowProvider(const FlowProvider &) = delete;
@@ -65,7 +65,6 @@ class FlowProvider {
6565

6666
std::list<std::string> m_remains;
6767

68-
shared_iemgr m_iemgr;
6968
unique_filter m_filter {nullptr, &fds_ipfix_filter_destroy};
7069
unique_file m_file {nullptr, &fds_file_close};
7170
bool m_file_ready = false;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* @file
3+
* @author Michal Sedlak <[email protected]>
4+
* @brief Information element manager singleton
5+
*/
6+
7+
#include <common/ieMgr.hpp>
8+
9+
#include <string>
10+
#include <stdexcept>
11+
12+
namespace fdsdump {
13+
14+
IEMgr &
15+
IEMgr::instance()
16+
{
17+
static IEMgr iemgr;
18+
return iemgr;
19+
}
20+
21+
IEMgr::IEMgr() :
22+
m_iemgr(fds_iemgr_create(), &fds_iemgr_destroy)
23+
{
24+
if (!m_iemgr) {
25+
throw std::runtime_error("fds_iemgr_create() has failed");
26+
}
27+
28+
const std::string dir = fds_api_cfg_dir();
29+
int ret = fds_iemgr_read_dir(m_iemgr.get(), dir.c_str());
30+
if (ret != FDS_OK) {
31+
const std::string err_msg = fds_iemgr_last_err(m_iemgr.get());
32+
throw std::runtime_error("fds_iemgr_read_dir() failed: " + err_msg);
33+
}
34+
}
35+
36+
} // fdsdump

0 commit comments

Comments
 (0)