vici: Add 'get|reset-counters' commands
This commit is contained in:
@@ -2,6 +2,7 @@ AM_CPPFLAGS = \
|
|||||||
-I$(top_srcdir)/src/libstrongswan \
|
-I$(top_srcdir)/src/libstrongswan \
|
||||||
-I$(top_srcdir)/src/libstrongswan/plugins/pubkey \
|
-I$(top_srcdir)/src/libstrongswan/plugins/pubkey \
|
||||||
-I$(top_srcdir)/src/libcharon \
|
-I$(top_srcdir)/src/libcharon \
|
||||||
|
-I$(top_srcdir)/src/libcharon/plugins/counters \
|
||||||
-DSWANCTLDIR=\""${swanctldir}\"" \
|
-DSWANCTLDIR=\""${swanctldir}\"" \
|
||||||
-DIPSEC_PIDDIR=\"${piddir}\"
|
-DIPSEC_PIDDIR=\"${piddir}\"
|
||||||
|
|
||||||
|
|||||||
@@ -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 ##
|
## Server-issued events ##
|
||||||
|
|
||||||
Based on the packet layer, the vici plugin raises event messages using named
|
Based on the packet layer, the vici plugin raises event messages using named
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ METHOD(plugin_t, get_features, int,
|
|||||||
static plugin_feature_t f[] = {
|
static plugin_feature_t f[] = {
|
||||||
PLUGIN_CALLBACK((plugin_feature_callback_t)register_vici, NULL),
|
PLUGIN_CALLBACK((plugin_feature_callback_t)register_vici, NULL),
|
||||||
PLUGIN_PROVIDE(CUSTOM, "vici"),
|
PLUGIN_PROVIDE(CUSTOM, "vici"),
|
||||||
|
PLUGIN_SDEPEND(CUSTOM, "counters"),
|
||||||
};
|
};
|
||||||
*features = f;
|
*features = f;
|
||||||
return countof(f);
|
return countof(f);
|
||||||
|
|||||||
@@ -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
|
* HSR Hochschule fuer Technik Rapperswil
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 Martin Willi
|
* Copyright (C) 2014 Martin Willi
|
||||||
@@ -55,6 +56,32 @@
|
|||||||
#include <asn1/asn1.h>
|
#include <asn1/asn1.h>
|
||||||
#include <credentials/certificates/certificate.h>
|
#include <credentials/certificates/certificate.h>
|
||||||
#include <credentials/certificates/x509.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;
|
typedef struct private_vici_query_t private_vici_query_t;
|
||||||
|
|
||||||
@@ -73,6 +100,11 @@ struct private_vici_query_t {
|
|||||||
*/
|
*/
|
||||||
vici_dispatcher_t *dispatcher;
|
vici_dispatcher_t *dispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query interface for counters
|
||||||
|
*/
|
||||||
|
counters_query_t *counters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Daemon startup timestamp
|
* Daemon startup timestamp
|
||||||
*/
|
*/
|
||||||
@@ -1223,6 +1255,131 @@ CALLBACK(get_algorithms, vici_message_t*,
|
|||||||
return b->finalize(b);
|
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*,
|
CALLBACK(version, vici_message_t*,
|
||||||
private_vici_query_t *this, char *name, u_int id, vici_message_t *request)
|
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-conns", list_conns, reg);
|
||||||
manage_command(this, "list-certs", list_certs, reg);
|
manage_command(this, "list-certs", list_certs, reg);
|
||||||
manage_command(this, "get-algorithms", get_algorithms, 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, "version", version, reg);
|
||||||
manage_command(this, "stats", stats, reg);
|
manage_command(this, "stats", stats, reg);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user