Skip to content

Commit 20c20fc

Browse files
committed
k8s delegation and json filtering (jq)
1 parent a580259 commit 20c20fc

17 files changed

+1051
-243
lines changed

.travis.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ script:
5151
- make
5252
- sudo cp -r include/* /usr/local/include/
5353
- sudo cp src/libb64.a /usr/local/lib/
54+
- cd ..
55+
- wget http://download.draios.com/dependencies/jq-1.5.tar.gz
56+
- tar -xzf jq-1.5.tar.gz
57+
- cd jq-1.5
58+
- ./configure --disable-maintainer-mode
59+
- make LDFLAGS=-all-static
60+
- sudo cp -r ./*.h /usr/local/include/
61+
- sudo cp .libs/libjq.a /usr/local/lib/
62+
- cd ..
5463
- popd
5564
- rm -rf userspace/libsinsp/third-party/jsoncpp
5665
- sudo apt-get install libncurses5-dev libluajit-5.1-dev libcurl4-openssl-dev libssl-dev
@@ -67,4 +76,4 @@ notifications:
6776
- https://webhooks.gitter.im/e/fdbc2356fb0ea2f15033
6877
on_success: change
6978
on_failure: always
70-
on_start: never
79+
on_start: never

CMakeLists.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,34 @@ else()
201201
endif()
202202
endif()
203203

204+
#
205+
# jq
206+
#
207+
if(NOT WIN32 AND NOT APPLE)
208+
option(USE_BUNDLED_JQ "Enable building of the bundled jq" ${USE_BUNDLED_DEPS})
209+
if(NOT USE_BUNDLED_JQ)
210+
find_path(JQ_INCLUDE jq.h PATH_SUFFIXES jq)
211+
find_library(JQ_LIB NAMES jq)
212+
if(JQ_INCLUDE AND JQ_LIB)
213+
message(STATUS "Found jq: include: ${JQ_INCLUDE}, lib: ${JQ_LIB}")
214+
else()
215+
message(FATAL_ERROR "Couldn't find system jq")
216+
endif()
217+
else()
218+
set(JQ_SRC "${PROJECT_BINARY_DIR}/jq-prefix/src/jq")
219+
message(STATUS "Using bundled jq in '${JQ_SRC}'")
220+
set(JQ_INCLUDE "${JQ_SRC}")
221+
set(JQ_LIB "${JQ_SRC}/.libs/libjq.a")
222+
ExternalProject_Add(jq
223+
URL "http://download.draios.com/dependencies/jq-1.5.tar.gz"
224+
URL_MD5 "0933532b086bd8b6a41c1b162b1731f9"
225+
CONFIGURE_COMMAND ./configure --disable-maintainer-mode --enable-all-static --disable-dependency-tracking
226+
BUILD_COMMAND ${CMD_MAKE} LDFLAGS=-all-static
227+
BUILD_IN_SOURCE 1
228+
INSTALL_COMMAND "")
229+
endif()
230+
endif()
231+
204232
#
205233
# ncurses, keep it simple for the moment
206234
#
@@ -267,6 +295,7 @@ if(NOT WIN32 AND NOT APPLE)
267295
else()
268296
set(OPENSSL_BUNDLE_DIR "${PROJECT_BINARY_DIR}/openssl-prefix/src/openssl")
269297
set(OPENSSL_INSTALL_DIR "${OPENSSL_BUNDLE_DIR}/target")
298+
set(OPENSSL_INCLUDE_DIR "${PROJECT_BINARY_DIR}/openssl-prefix/src/openssl/include")
270299
set(OPENSSL_LIBRARY_SSL "${OPENSSL_INSTALL_DIR}/lib/libssl.a")
271300
set(OPENSSL_LIBRARY_CRYPTO "${OPENSSL_INSTALL_DIR}/lib/libcrypto.a")
272301

userspace/libsinsp/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ if(NOT WIN32 AND NOT APPLE)
88
include_directories("${B64_INCLUDE}")
99
include_directories("${CURL_INCLUDE_DIR}")
1010
include_directories("${CURSES_INCLUDE_DIR}")
11+
include_directories("${JQ_INCLUDE}")
12+
include_directories("${OPENSSL_INCLUDE_DIR}")
1113
endif()
1214

1315
add_library(sinsp STATIC
@@ -28,6 +30,7 @@ add_library(sinsp STATIC
2830
filter.cpp
2931
filterchecks.cpp
3032
ifinfo.cpp
33+
json_query.cpp
3134
k8s.cpp
3235
k8s_collector.cpp
3336
k8s_component.cpp
@@ -75,6 +78,7 @@ if(NOT WIN32)
7578

7679
if(NOT APPLE)
7780
target_link_libraries(sinsp
81+
"${JQ_LIB}"
7882
"${B64_LIB}"
7983
"${CURL_LIBRARIES}"
8084
"${OPENSSL_LIBRARY_SSL}"

userspace/libsinsp/docker.cpp

Lines changed: 67 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,14 @@
1111

1212
const std::string docker::DOCKER_SOCKET_FILE = "/var/run/docker.sock";
1313

14-
docker::docker(const std::string& url,
14+
docker::docker(std::string url,
1515
const std::string& path,
1616
const std::string& http_version,
1717
int timeout_ms,
1818
bool is_captured,
1919
bool verbose,
2020
event_filter_ptr_t event_filter): m_id("docker"),
2121
#ifdef HAS_CAPTURE
22-
m_url(!url.empty() ? url : std::string(scap_get_host_root()) + DOCKER_SOCKET_FILE),
2322
m_collector(false),
2423
#endif // HAS_CAPTURE
2524
m_timeout_ms(timeout_ms),
@@ -33,6 +32,46 @@ docker::docker(const std::string& url,
3332
m_image_events{"delete", "import", "pull", "push", "tag", "untag"},
3433
m_volume_events{"create", "mount", "unmount", "destroy"},
3534
m_network_events{"create", "connect", "disconnect", "destroy"},
35+
m_severity_map
36+
{
37+
// container
38+
{ "attach", sinsp_logger::SEV_EVT_INFORMATION },
39+
{ "commit", sinsp_logger::SEV_EVT_INFORMATION },
40+
{ "copy", sinsp_logger::SEV_EVT_INFORMATION },
41+
{ "create", sinsp_logger::SEV_EVT_INFORMATION },
42+
{ "destroy", sinsp_logger::SEV_EVT_WARNING },
43+
{ "die", sinsp_logger::SEV_EVT_WARNING },
44+
{ "exec_create", sinsp_logger::SEV_EVT_INFORMATION },
45+
{ "exec_start", sinsp_logger::SEV_EVT_INFORMATION },
46+
{ "export", sinsp_logger::SEV_EVT_INFORMATION },
47+
{ "kill", sinsp_logger::SEV_EVT_WARNING },
48+
{ "oom", sinsp_logger::SEV_EVT_WARNING },
49+
{ "pause", sinsp_logger::SEV_EVT_INFORMATION },
50+
{ "rename", sinsp_logger::SEV_EVT_INFORMATION },
51+
{ "resize", sinsp_logger::SEV_EVT_INFORMATION },
52+
{ "restart", sinsp_logger::SEV_EVT_WARNING },
53+
{ "start", sinsp_logger::SEV_EVT_INFORMATION },
54+
{ "stop", sinsp_logger::SEV_EVT_INFORMATION },
55+
{ "top", sinsp_logger::SEV_EVT_INFORMATION },
56+
{ "unpause", sinsp_logger::SEV_EVT_INFORMATION },
57+
{ "update", sinsp_logger::SEV_EVT_INFORMATION },
58+
59+
// image
60+
{ "delete", sinsp_logger::SEV_EVT_INFORMATION },
61+
{ "import", sinsp_logger::SEV_EVT_INFORMATION },
62+
{ "pull", sinsp_logger::SEV_EVT_INFORMATION },
63+
{ "push", sinsp_logger::SEV_EVT_INFORMATION },
64+
{ "tag", sinsp_logger::SEV_EVT_INFORMATION },
65+
{ "untag", sinsp_logger::SEV_EVT_INFORMATION },
66+
67+
// volume
68+
{ "mount", sinsp_logger::SEV_EVT_INFORMATION },
69+
{ "unmount", sinsp_logger::SEV_EVT_INFORMATION },
70+
71+
// network
72+
{ "connect", sinsp_logger::SEV_EVT_INFORMATION },
73+
{ "disconnect", sinsp_logger::SEV_EVT_INFORMATION }
74+
},
3675
m_name_translation
3776
{
3877
// Container
@@ -78,54 +117,19 @@ docker::docker(const std::string& url,
78117
// { "destroy" "Destroyed" } duplicate
79118
}
80119
{
81-
#ifdef HAS_CAPTURE
82120
g_logger.log(std::string("Creating Docker object for " +
83-
(m_url.empty() ? std::string("capture replay") : m_url)),
121+
(url.empty() ? std::string("capture replay") : url)),
84122
sinsp_logger::SEV_DEBUG);
85-
86-
m_event_http = std::make_shared<handler_t>(*this, "events", m_url, path, http_version, timeout_ms);
123+
#ifdef HAS_CAPTURE
124+
if(url.empty())
125+
{
126+
url = std::string("file://").append(scap_get_host_root()).append(DOCKER_SOCKET_FILE);
127+
}
128+
m_event_http = std::make_shared<handler_t>(*this, "docker", url, path, http_version, timeout_ms);
87129
m_event_http->set_json_callback(&docker::set_event_json);
88130
m_event_http->set_json_end("}\n");
89131
m_collector.add(m_event_http);
90132
send_data_request();
91-
92-
// container
93-
m_severity_map["attach"] = sinsp_logger::SEV_EVT_INFORMATION;
94-
m_severity_map["commit"] = sinsp_logger::SEV_EVT_INFORMATION;
95-
m_severity_map["copy"] = sinsp_logger::SEV_EVT_INFORMATION;
96-
m_severity_map["create"] = sinsp_logger::SEV_EVT_INFORMATION;
97-
m_severity_map["destroy"] = sinsp_logger::SEV_EVT_WARNING;
98-
m_severity_map["die"] = sinsp_logger::SEV_EVT_WARNING;
99-
m_severity_map["exec_create"] = sinsp_logger::SEV_EVT_INFORMATION;
100-
m_severity_map["exec_start"] = sinsp_logger::SEV_EVT_INFORMATION;
101-
m_severity_map["export"] = sinsp_logger::SEV_EVT_INFORMATION;
102-
m_severity_map["kill"] = sinsp_logger::SEV_EVT_WARNING;
103-
m_severity_map["oom"] = sinsp_logger::SEV_EVT_WARNING;
104-
m_severity_map["pause"] = sinsp_logger::SEV_EVT_INFORMATION;
105-
m_severity_map["rename"] = sinsp_logger::SEV_EVT_INFORMATION;
106-
m_severity_map["resize"] = sinsp_logger::SEV_EVT_INFORMATION;
107-
m_severity_map["restart"] = sinsp_logger::SEV_EVT_WARNING;
108-
m_severity_map["start"] = sinsp_logger::SEV_EVT_INFORMATION;
109-
m_severity_map["stop"] = sinsp_logger::SEV_EVT_INFORMATION;
110-
m_severity_map["top"] = sinsp_logger::SEV_EVT_INFORMATION;
111-
m_severity_map["unpause"] = sinsp_logger::SEV_EVT_INFORMATION;
112-
m_severity_map["update"] = sinsp_logger::SEV_EVT_INFORMATION;
113-
114-
// image
115-
m_severity_map["delete"] = sinsp_logger::SEV_EVT_INFORMATION;
116-
m_severity_map["import"] = sinsp_logger::SEV_EVT_INFORMATION;
117-
m_severity_map["pull"] = sinsp_logger::SEV_EVT_INFORMATION;
118-
m_severity_map["push"] = sinsp_logger::SEV_EVT_INFORMATION;
119-
m_severity_map["tag"] = sinsp_logger::SEV_EVT_INFORMATION;
120-
m_severity_map["untag"] = sinsp_logger::SEV_EVT_INFORMATION;
121-
122-
// volume
123-
m_severity_map["mount"] = sinsp_logger::SEV_EVT_INFORMATION;
124-
m_severity_map["unmount"] = sinsp_logger::SEV_EVT_INFORMATION;
125-
126-
// network
127-
m_severity_map["connect"] = sinsp_logger::SEV_EVT_INFORMATION;
128-
m_severity_map["disconnect"] = sinsp_logger::SEV_EVT_INFORMATION;
129133
#endif
130134
}
131135

@@ -389,4 +393,23 @@ void docker::handle_event(Json::Value&& root)
389393
}
390394
}
391395

396+
std::string docker::get_socket_file()
397+
{
398+
string sock_file = scap_get_host_root();
399+
std::string::size_type len = sock_file.length();
400+
if(len && sock_file[len - 1] == '/')
401+
{
402+
if((len - 1) > 0)
403+
{
404+
sock_file = sock_file.substr(0, len - 1);
405+
}
406+
else
407+
{
408+
sock_file.clear();
409+
}
410+
}
411+
sock_file.append(DOCKER_SOCKET_FILE);
412+
return sock_file;
413+
}
414+
392415
#endif // __linux__

userspace/libsinsp/docker.h

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,14 @@
1717
class docker
1818
{
1919
public:
20-
static const std::string DOCKER_SOCKET_FILE;
21-
2220
typedef std::vector<std::string> uri_list_t;
2321
typedef std::shared_ptr<Json::Value> json_ptr_t;
2422
typedef std::set<std::string, ci_compare> event_filter_t;
2523
typedef user_event_filter_t::ptr_t event_filter_ptr_t;
2624

2725
static const int default_timeout_ms = 1000L;
2826

29-
docker(const std::string& url = "",
27+
docker(std::string url = "",
3028
const std::string& path = "/events",
3129
const std::string& http_version = "1.0",
3230
int timeout_ms = default_timeout_ms,
@@ -48,7 +46,10 @@ class docker
4846
void set_machine_id(const std::string& machine_id);
4947
const std::string& get_machine_id() const;
5048

49+
static std::string get_socket_file();
50+
5151
private:
52+
static const std::string DOCKER_SOCKET_FILE;
5253
void connect();
5354
void send_event_data_request();
5455
void check_collector_status(int expected);
@@ -78,58 +79,41 @@ class docker
7879
return false;
7980
}
8081

81-
bool is_container_event(const std::string& evt_name)
82-
{
83-
return m_container_events.find(evt_name) != m_container_events.end();
84-
}
85-
bool is_image_event(const std::string& evt_name)
86-
{
87-
return m_image_events.find(evt_name) != m_image_events.end();
88-
}
89-
bool is_volume_event(const std::string& evt_name)
90-
{
91-
return m_volume_events.find(evt_name) != m_volume_events.end();
92-
}
93-
bool is_network_event(const std::string& evt_name)
94-
{
95-
return m_network_events.find(evt_name) != m_network_events.end();
96-
}
82+
bool is_container_event(const std::string& evt_name);
83+
bool is_image_event(const std::string& evt_name);
84+
bool is_volume_event(const std::string& evt_name);
85+
bool is_network_event(const std::string& evt_name);
9786

9887
typedef socket_data_handler<docker> handler_t;
9988
typedef handler_t::ptr_t handler_ptr_t;
10089
typedef socket_collector<handler_t> collector_t;
10190

10291
std::string m_id;
103-
std::string m_url;
10492
handler_ptr_t m_event_http;
10593
collector_t m_collector;
10694
std::string m_event_uri;
10795
#endif // HAS_CAPTURE
10896

10997
private:
11098

111-
const std::string& translate_name(const std::string& event_name);
112-
113-
long m_timeout_ms;
114-
bool m_is_captured;
115-
bool m_verbose;
116-
event_filter_ptr_t m_event_filter;
117-
std::string m_machine_id;
118-
11999
typedef std::vector<json_ptr_t> event_list_t;
120100
typedef sinsp_logger::event_severity severity_t;
121101
typedef std::unordered_map<std::string, severity_t> severity_map_t;
122-
123-
event_list_t m_events;
124-
severity_map_t m_severity_map;
125-
102+
typedef std::unordered_map<std::string, std::string> name_translation_map_t;
126103
typedef std::set<std::string> entity_events_t;
127-
const entity_events_t m_container_events;
128-
const entity_events_t m_image_events;
129-
const entity_events_t m_volume_events;
130-
const entity_events_t m_network_events;
104+
const std::string& translate_name(const std::string& event_name);
131105

132-
typedef std::unordered_map<std::string, std::string> name_translation_map_t;
106+
long m_timeout_ms;
107+
bool m_is_captured;
108+
bool m_verbose;
109+
event_filter_ptr_t m_event_filter;
110+
std::string m_machine_id;
111+
event_list_t m_events;
112+
const entity_events_t m_container_events;
113+
const entity_events_t m_image_events;
114+
const entity_events_t m_volume_events;
115+
const entity_events_t m_network_events;
116+
severity_map_t m_severity_map;
133117
name_translation_map_t m_name_translation;
134118
};
135119

@@ -163,4 +147,24 @@ inline const std::string& docker::translate_name(const std::string& event_name)
163147
return event_name;
164148
}
165149

150+
inline bool docker::is_container_event(const std::string& evt_name)
151+
{
152+
return m_container_events.find(evt_name) != m_container_events.end();
153+
}
154+
155+
inline bool docker::is_image_event(const std::string& evt_name)
156+
{
157+
return m_image_events.find(evt_name) != m_image_events.end();
158+
}
159+
160+
inline bool docker::is_volume_event(const std::string& evt_name)
161+
{
162+
return m_volume_events.find(evt_name) != m_volume_events.end();
163+
}
164+
165+
inline bool docker::is_network_event(const std::string& evt_name)
166+
{
167+
return m_network_events.find(evt_name) != m_network_events.end();
168+
}
169+
166170
#endif // __linux__

userspace/libsinsp/ifinfo.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,8 @@ class SINSP_PUBLIC sinsp_ipv6_ifinfo
6363
class SINSP_PUBLIC sinsp_network_interfaces
6464
{
6565
public:
66-
sinsp_network_interfaces(sinsp* inspector)
66+
sinsp_network_interfaces(sinsp* inspector): m_inspector(inspector)
6767
{
68-
m_inspector = inspector;
6968
}
7069

7170
void import_interfaces(scap_addrlist* paddrlist);

0 commit comments

Comments
 (0)