vici: Add 'get|reset-counters' commands

This commit is contained in:
Tobias Brunner
2017-11-08 16:28:28 +01:00
parent 6f74b8748a
commit fdf33b0f1c
4 changed files with 191 additions and 1 deletions
+1
View File
@@ -2,6 +2,7 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/src/libstrongswan \
-I$(top_srcdir)/src/libstrongswan/plugins/pubkey \
-I$(top_srcdir)/src/libcharon \
-I$(top_srcdir)/src/libcharon/plugins/counters \
-DSWANCTLDIR=\""${swanctldir}\"" \
-DIPSEC_PIDDIR=\"${piddir}\"
+29
View File
@@ -682,6 +682,35 @@ List currently loaded algorithms and their implementation.
}
}
### get-counters() ###
List global or connection-specific counters for several IKE events.
{
name = <optional connection name, omit for global counters>
all = <yes to get counters for all connections, name is ignored>
} => {
counters = {
<name|empty for global counters> = {
<pairs of counter name and 64-bit counter value>
}
}
success = <yes or no>
errmsg = <error string on failure>
}
### reset-counters() ###
Reset global or connection-specific IKE event counters.
{
name = <optional connection name, omit for global counters>
all = <yes to reset counters for all connections, name is ignored>
} => {
success = <yes or no>
errmsg = <error string on failure>
}
## Server-issued events ##
Based on the packet layer, the vici plugin raises event messages using named
+1
View File
@@ -176,6 +176,7 @@ METHOD(plugin_t, get_features, int,
static plugin_feature_t f[] = {
PLUGIN_CALLBACK((plugin_feature_callback_t)register_vici, NULL),
PLUGIN_PROVIDE(CUSTOM, "vici"),
PLUGIN_SDEPEND(CUSTOM, "counters"),
};
*features = f;
return countof(f);
+160 -1
View File
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 Tobias Brunner, Andreas Steffen
* Copyright (C) 2015-2017 Tobias Brunner
* Copyright (C) 2015 Andreas Steffen
* HSR Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2014 Martin Willi
@@ -55,6 +56,32 @@
#include <asn1/asn1.h>
#include <credentials/certificates/certificate.h>
#include <credentials/certificates/x509.h>
#include <counters_query.h>
ENUM(vici_counter_type_names,
COUNTER_INIT_IKE_SA_REKEY, COUNTER_OUT_INFORMATIONAL_RSP,
"ike-rekey-init",
"ike-rekey-resp",
"child-rekey",
"invalid",
"invalid-spi",
"ike-init-in-req",
"ike-init-in-resp",
"ike-init-out-req",
"ike-init-out-resp",
"ike-auth-in-req",
"ike-auth-in-resp",
"ike-auth-out-req",
"ike-auth-out-resp",
"create-child-in-req",
"create-child-in-resp",
"create-child-out-req",
"create-child-out-resp",
"info-in-req",
"info-in-resp",
"info-out-req",
"info-out-resp",
);
typedef struct private_vici_query_t private_vici_query_t;
@@ -73,6 +100,11 @@ struct private_vici_query_t {
*/
vici_dispatcher_t *dispatcher;
/**
* Query interface for counters
*/
counters_query_t *counters;
/**
* Daemon startup timestamp
*/
@@ -1223,6 +1255,131 @@ CALLBACK(get_algorithms, vici_message_t*,
return b->finalize(b);
}
/**
* Make sure we have the counters query interface
*/
static inline bool ensure_counters(private_vici_query_t *this)
{
if (this->counters)
{
return TRUE;
}
return (this->counters = lib->get(lib, "counters")) != NULL;
}
/**
* Add a single set of counters to the message
*
* Frees the array of counter values
*/
static void add_counters(vici_builder_t *b, char *name, uint64_t *counters)
{
char buf[BUF_LEN];
counter_type_t i;
b->begin_section(b, name ?: "");
for (i = 0; i < COUNTER_MAX; i++)
{
snprintf(buf, sizeof(buf), "%N", vici_counter_type_names, i);
b->add_kv(b, buf, "%"PRIu64, counters[i]);
}
b->end_section(b);
free(counters);
}
CALLBACK(get_counters, vici_message_t*,
private_vici_query_t *this, char *name, u_int id, vici_message_t *request)
{
vici_builder_t *b;
enumerator_t *enumerator;
uint64_t *counters;
char *conn, *errmsg = NULL;
bool all;
b = vici_builder_create();
if (ensure_counters(this))
{
conn = request->get_str(request, NULL, "name");
all = request->get_bool(request, FALSE, "all");
b->begin_section(b, "counters");
if (all)
{
enumerator = this->counters->get_names(this->counters);
while (enumerator->enumerate(enumerator, &conn))
{
counters = this->counters->get_all(this->counters, conn);
if (counters)
{
add_counters(b, conn, counters);
}
}
enumerator->destroy(enumerator);
}
else
{
counters = this->counters->get_all(this->counters, conn);
if (counters)
{
add_counters(b, conn, counters);
}
else
{
errmsg = "no counters found for this connection";
}
}
b->end_section(b);
}
else
{
errmsg = "no counters available (plugin missing?)";
}
b->add_kv(b, "success", errmsg ? "no" : "yes");
if (errmsg)
{
b->add_kv(b, "errmsg", "%s", errmsg);
}
return b->finalize(b);
}
CALLBACK(reset_counters, vici_message_t*,
private_vici_query_t *this, char *name, u_int id, vici_message_t *request)
{
vici_builder_t *b;
char *conn, *errmsg = NULL;
bool all;
b = vici_builder_create();
if (ensure_counters(this))
{
conn = request->get_str(request, NULL, "name");
all = request->get_bool(request, FALSE, "all");
if (all)
{
this->counters->reset_all(this->counters);
}
else
{
this->counters->reset(this->counters, conn);
}
}
else
{
errmsg = "no counters available (plugin missing?)";
}
b->add_kv(b, "success", errmsg ? "no" : "yes");
if (errmsg)
{
b->add_kv(b, "errmsg", "%s", errmsg);
}
return b->finalize(b);
}
CALLBACK(version, vici_message_t*,
private_vici_query_t *this, char *name, u_int id, vici_message_t *request)
{
@@ -1423,6 +1580,8 @@ static void manage_commands(private_vici_query_t *this, bool reg)
manage_command(this, "list-conns", list_conns, reg);
manage_command(this, "list-certs", list_certs, reg);
manage_command(this, "get-algorithms", get_algorithms, reg);
manage_command(this, "get-counters", get_counters, reg);
manage_command(this, "reset-counters", reset_counters, reg);
manage_command(this, "version", version, reg);
manage_command(this, "stats", stats, reg);
}