echo " listalgs|listpubkeys|listcerts [--utc]"
echo " listcacerts|listaacerts|listocspcerts [--utc]"
echo " listacerts|listgroups|listcainfos [--utc]"
- echo " listcrls|listocsp|listcards|listplugins|listcounters|listall [--utc]"
+ echo " listcrls|listocsp|listcards|listplugins|listall [--utc]"
+ echo " listcounters|resetcounters [name]"
echo " leases [<poolname> [<address>]]"
echo " rereadsecrets|rereadgroups"
echo " rereadcacerts|rereadaacerts|rereadocspcerts"
listalgs|listpubkeys|listplugins|\
listcerts|listcacerts|listaacerts|\
listacerts|listgroups|listocspcerts|\
-listcainfos|listcrls|listocsp|listcounters|listall|\
+listcainfos|listcrls|listocsp|listall|\
rereadsecrets|rereadcacerts|rereadaacerts|\
rereadacerts|rereadocspcerts|rereadcrls|\
-rereadall|purgeocsp)
+rereadall|purgeocsp|listcounters|resetcounters)
op="$1"
rc=7
shift
}
}
+METHOD(stroke_counter_t, reset, void,
+ private_stroke_counter_t *this, char *name)
+{
+ this->lock->lock(this->lock);
+ if (name)
+ {
+ entry_t *entry;
+
+ entry = this->conns->remove(this->conns, name);
+ if (entry)
+ {
+ destroy_entry(entry);
+ }
+ }
+ else
+ {
+ memset(&this->counter, 0, sizeof(this->counter));
+ }
+ this->lock->unlock(this->lock);
+}
+
METHOD(stroke_counter_t, destroy, void,
private_stroke_counter_t *this)
{
.message = _message_hook,
},
.print = _print,
+ .reset = _reset,
.destroy = _destroy,
},
.conns = hashtable_create((hashtable_hash_t)hash,
*/
void (*print)(stroke_counter_t *this, FILE *out, char *name);
+ /**
+ * Reset global or connection specific counters.
+ *
+ * @param name name of connection counters to reset, NULL for global
+ */
+ void (*reset)(stroke_counter_t *this, char *name);
+
/**
* Destroy a stroke_counter_t.
*/
{
pop_string(msg, &msg->counters.name);
- this->counter->print(this->counter, out, msg->counters.name);
+ if (msg->counters.reset)
+ {
+ this->counter->reset(this->counter, msg->counters.name);
+ }
+ else
+ {
+ this->counter->print(this->counter, out, msg->counters.name);
+ }
}
/**
break;
case STR_COUNTERS:
stroke_counters(this, msg, out);
+ break;
default:
DBG1(DBG_CFG, "received unknown stroke");
break;
return send_stroke_msg(&msg);
}
-static int counters(char *name)
+static int counters(int reset, char *name)
{
stroke_msg_t msg;
msg.type = STR_COUNTERS;
msg.length = offsetof(stroke_msg_t, buffer);
msg.counters.name = push_string(&msg, name);
+ msg.counters.reset = reset;
+
return send_stroke_msg(&msg);
}
res = user_credentials(argv[2], argv[3], argc > 4 ? argv[4] : NULL);
break;
case STROKE_COUNTERS:
- if (argc > 2)
- {
- res = counters(argv[2]);
- }
- else
- {
- res = counters(NULL);
- }
+ case STROKE_COUNTERS_RESET:
+ res = counters(token->kw == STROKE_COUNTERS_RESET,
+ argc > 2 ? argv[2] : NULL);
break;
default:
exit_usage(NULL);
STROKE_MEMUSAGE,
STROKE_USER_CREDS,
STROKE_COUNTERS,
+ STROKE_COUNTERS_RESET,
} stroke_keyword_t;
#define STROKE_LIST_FIRST STROKE_LIST_PUBKEYS
memusage, STROKE_MEMUSAGE
user-creds, STROKE_USER_CREDS
listcounters, STROKE_COUNTERS
+resetcounters, STROKE_COUNTERS_RESET
STR_MEMUSAGE,
/* set username and password for a connection */
STR_USER_CREDS,
- /* print counters */
+ /* print/reset counters */
STR_COUNTERS,
/* more to come */
} type;
/* data for STR_COUNTERS */
struct {
+ /* reset or print counters? */
+ int reset;
char *name;
} counters;
};