list assigned leases using "ipsec leases"

This commit is contained in:
Martin Willi
2008-12-10 13:00:02 +00:00
parent ed2bcd0315
commit 6b83549d1a
10 changed files with 245 additions and 8 deletions
+88 -1
View File
@@ -412,6 +412,92 @@ static enumerator_t* create_pool_enumerator(private_stroke_attribute_t *this)
this->mutex, (void*)this->mutex->unlock);
}
/**
* lease enumerator
*/
typedef struct {
/** implemented enumerator interface */
enumerator_t public;
/** inner hash-table enumerator */
enumerator_t *inner;
/** enumerated pool */
pool_t *pool;
/** mutex to unlock on destruction */
mutex_t *mutex;
/** currently enumerated lease address */
host_t *current;
} lease_enumerator_t;
/**
* Implementation of lease_enumerator_t.enumerate
*/
static bool lease_enumerate(lease_enumerator_t *this, identification_t **id_out,
host_t **addr_out, bool *online)
{
identification_t *id;
uintptr_t offset;
DESTROY_IF(this->current);
this->current = NULL;
if (this->inner->enumerate(this->inner, &id, NULL))
{
offset = (uintptr_t)this->pool->online->get(this->pool->online, id);
if (offset)
{
*id_out = id;
*addr_out = this->current = offset2host(this->pool, offset);
*online = TRUE;
return TRUE;
}
offset = (uintptr_t)this->pool->offline->get(this->pool->offline, id);
if (offset)
{
*id_out = id;
*addr_out = this->current = offset2host(this->pool, offset);
*online = FALSE;
return TRUE;
}
}
return FALSE;
}
/**
* Implementation of lease_enumerator_t.destroy
*/
static void lease_enumerator_destroy(lease_enumerator_t *this)
{
DESTROY_IF(this->current);
this->inner->destroy(this->inner);
this->mutex->unlock(this->mutex);
free(this);
}
/**
* Implementation of stroke_attribute_t.create_lease_enumerator
*/
static enumerator_t* create_lease_enumerator(private_stroke_attribute_t *this,
char *pool)
{
lease_enumerator_t *enumerator;
this->mutex->lock(this->mutex);
enumerator = malloc_thing(lease_enumerator_t);
enumerator->pool = find_pool(this, pool);
if (!enumerator->pool)
{
this->mutex->unlock(this->mutex);
free(enumerator);
return NULL;
}
enumerator->public.enumerate = (void*)lease_enumerate;
enumerator->public.destroy = (void*)lease_enumerator_destroy;
enumerator->inner = enumerator->pool->ids->create_enumerator(enumerator->pool->ids);
enumerator->mutex = this->mutex;
enumerator->current = NULL;
return &enumerator->public;
}
/**
* Implementation of stroke_attribute_t.destroy
*/
@@ -434,10 +520,11 @@ stroke_attribute_t *stroke_attribute_create()
this->public.add_pool = (void(*)(stroke_attribute_t*, stroke_msg_t *msg))add_pool;
this->public.del_pool = (void(*)(stroke_attribute_t*, stroke_msg_t *msg))del_pool;
this->public.create_pool_enumerator = (enumerator_t*(*)(stroke_attribute_t*))create_pool_enumerator;
this->public.create_lease_enumerator = (enumerator_t*(*)(stroke_attribute_t*, char *pool))create_lease_enumerator;
this->public.destroy = (void(*)(stroke_attribute_t*))destroy;
this->pools = linked_list_create();
this->mutex = mutex_create(MUTEX_DEFAULT);
this->mutex = mutex_create(MUTEX_RECURSIVE);
return &this->public;
}
@@ -63,6 +63,17 @@ struct stroke_attribute_t {
*/
enumerator_t* (*create_pool_enumerator)(stroke_attribute_t *this);
/**
* Create an enumerator over the leases of a pool.
*
* Enumerator enumerates over
* identification_t *id, host_t *address, bool online
*
* @param pool name of the pool to enumerate
* @return enumerator, NULL if pool not found
*/
enumerator_t* (*create_lease_enumerator)(stroke_attribute_t *this,
char *pool);
/**
* Destroy a stroke_attribute instance.
*/
+72
View File
@@ -999,6 +999,77 @@ static void list(private_stroke_list_t *this, stroke_msg_t *msg, FILE *out)
DESTROY_OFFSET_IF(cert_list, offsetof(certificate_t, destroy));
}
/**
* Print leases of a single pool
*/
static void pool_leases(private_stroke_list_t *this, FILE *out, char *pool,
host_t *address, u_int size, u_int online, u_int offline)
{
enumerator_t *enumerator;
identification_t *id;
host_t *lease;
bool on;
int found = 0;
fprintf(out, "Leases in pool '%s', usage: %lu/%lu, %lu online\n",
pool, online + offline, size, online);
enumerator = this->attribute->create_lease_enumerator(this->attribute, pool);
while (enumerator && enumerator->enumerate(enumerator, &id, &lease, &on))
{
if (!address || address->ip_equals(address, lease))
{
fprintf(out, " %15H %s '%D'\n",
lease, on ? "online" : "offline", id);
found++;
}
}
enumerator->destroy(enumerator);
if (!found)
{
fprintf(out, " no matching leases found\n");
}
}
/**
* Implementation of stroke_list_t.leases
*/
static void leases(private_stroke_list_t *this, stroke_msg_t *msg, FILE *out)
{
enumerator_t *enumerator;
u_int size, offline, online;
host_t *address = NULL;
char *pool;
int found = 0;
if (msg->leases.address)
{
address = host_create_from_string(msg->leases.address, 0);
}
enumerator = this->attribute->create_pool_enumerator(this->attribute);
while (enumerator->enumerate(enumerator, &pool, &size, &online, &offline))
{
if (!msg->leases.pool || streq(msg->leases.pool, pool))
{
pool_leases(this, out, pool, address, size, online, offline);
found++;
}
}
enumerator->destroy(enumerator);
if (!found)
{
if (msg->leases.pool)
{
fprintf(out, "pool '%s' not found\n", msg->leases.pool);
}
else
{
fprintf(out, "no pools found\n");
}
}
DESTROY_IF(address);
}
/**
* Implementation of stroke_list_t.destroy
*/
@@ -1016,6 +1087,7 @@ stroke_list_t *stroke_list_create(stroke_attribute_t *attribute)
this->public.list = (void(*)(stroke_list_t*, stroke_msg_t *msg, FILE *out))list;
this->public.status = (void(*)(stroke_list_t*, stroke_msg_t *msg, FILE *out,bool))status;
this->public.leases = (void(*)(stroke_list_t*, stroke_msg_t *msg, FILE *out))leases;
this->public.destroy = (void(*)(stroke_list_t*))destroy;
this->uptime = time(NULL);
+11 -3
View File
@@ -53,9 +53,17 @@ struct stroke_list_t {
void (*status)(stroke_list_t *this, stroke_msg_t *msg, FILE *out, bool all);
/**
* Destroy a stroke_list instance.
*/
void (*destroy)(stroke_list_t *this);
* Log pool leases to stroke console.
*
* @param msg stroke message
* @param out stroke console stream
*/
void (*leases)(stroke_list_t *this, stroke_msg_t *msg, FILE *out);
/**
* Destroy a stroke_list instance.
*/
void (*destroy)(stroke_list_t *this);
};
/**
+15
View File
@@ -337,6 +337,18 @@ static void stroke_purge(private_stroke_socket_t *this,
CERT_X509_OCSP_RESPONSE);
}
/**
* list pool leases
*/
static void stroke_leases(private_stroke_socket_t *this,
stroke_msg_t *msg, FILE *out)
{
pop_string(msg, &msg->leases.pool);
pop_string(msg, &msg->leases.address);
this->list->leases(this->list, msg, out);
}
debug_t get_group_from_name(char *type)
{
if (strcasecmp(type, "any") == 0) return DBG_ANY;
@@ -498,6 +510,9 @@ static job_requeue_t process(stroke_job_context_t *ctx)
case STR_PURGE:
stroke_purge(this, msg, out);
break;
case STR_LEASES:
stroke_leases(this, msg, out);
break;
default:
DBG1(DBG_CFG, "received unknown stroke");
break;