Greenbone Vulnerability Management Libraries
11.0.0
|
Knowledge base management API - Redis backend.
More...
#include "kb.h"
#include <errno.h>
#include <glib.h>
#include <hiredis/hiredis.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Go to the source code of this file.
|
struct | kb_redis |
| Subclass of struct kb, it contains the redis-specific fields, such as the redis context, current DB (namespace) id and the server socket path. More...
|
|
|
static int | redis_delete_all (struct kb_redis *kbr) |
| Delete all the KB's content. More...
|
|
static int | redis_lnk_reset (kb_t kb) |
| Reset connection to the KB. This is called after each fork() to make sure connections aren't shared between concurrent processes. More...
|
|
static int | redis_flush_all (kb_t kb, const char *except) |
| Flush all the KB's content. Delete all namespaces. More...
|
|
static redisReply * | redis_cmd (struct kb_redis *kbr, const char *fmt,...) |
| Execute a redis command and get a redis reply. More...
|
|
static int | try_database_index (struct kb_redis *kbr, int index) |
| Attempt to atomically acquire ownership of a database. More...
|
|
static int | fetch_max_db_index (struct kb_redis *kbr) |
| Set the number of databases have been configured into kbr struct. More...
|
|
static int | select_database (struct kb_redis *kbr) |
| Select DB. More...
|
|
static int | redis_release_db (struct kb_redis *kbr) |
| Release DB. More...
|
|
static int | get_redis_ctx (struct kb_redis *kbr) |
| Get redis context if it is already connected or do a a connection. More...
|
|
static int | redis_test_connection (struct kb_redis *kbr) |
| Test redis connection. More...
|
|
static int | redis_delete (kb_t kb) |
| Delete all entries and release ownership on the namespace. More...
|
|
static int | redis_get_kb_index (kb_t kb) |
| Return the kb index. More...
|
|
static int | redis_new (kb_t *kb, const char *kb_path) |
| Initialize a new Knowledge Base object. More...
|
|
static kb_t | redis_direct_conn (const char *kb_path, const int kb_index) |
| Connect to a Knowledge Base object with the given kb_index. More...
|
|
static kb_t | redis_find (const char *kb_path, const char *key) |
| Find an existing Knowledge Base object with key. More...
|
|
void | kb_item_free (struct kb_item *item) |
| Release a KB item (or a list). More...
|
|
static struct kb_item * | redis2kbitem_single (const char *name, const redisReply *elt, int force_int) |
| Give a single KB item. More...
|
|
static struct kb_item * | redis2kbitem (const char *name, const redisReply *rep) |
| Fetch a KB item or list from a redis Reply. More...
|
|
static struct kb_item * | redis_get_single (kb_t kb, const char *name, enum kb_item_type type) |
| Get a single KB element. More...
|
|
static char * | redis_get_str (kb_t kb, const char *name) |
| Get a single KB string item. More...
|
|
static int | redis_push_str (kb_t kb, const char *name, const char *value) |
| Push a new entry under a given key. More...
|
|
static char * | redis_pop_str (kb_t kb, const char *name) |
| Pops a single KB string item. More...
|
|
static int | redis_get_int (kb_t kb, const char *name) |
| Get a single KB integer item. More...
|
|
static char * | redis_get_nvt (kb_t kb, const char *oid, enum kb_nvt_pos position) |
| Get field of a NVT. More...
|
|
static nvti_t * | redis_get_nvt_all (kb_t kb, const char *oid) |
| Get a full NVT. More...
|
|
static struct kb_item * | redis_get_all (kb_t kb, const char *name) |
| Get all items stored under a given name. More...
|
|
static struct kb_item * | redis_get_pattern (kb_t kb, const char *pattern) |
| Get all items stored under a given pattern. More...
|
|
static GSList * | redis_get_oids (kb_t kb) |
| Get all NVT OIDs. More...
|
|
static size_t | redis_count (kb_t kb, const char *pattern) |
| Count all items stored under a given pattern. More...
|
|
static int | redis_del_items (kb_t kb, const char *name) |
| Delete all entries under a given name. More...
|
|
static int | redis_add_str_unique (kb_t kb, const char *name, const char *str, size_t len) |
| Insert (append) a new unique entry under a given name. More...
|
|
static int | redis_add_str (kb_t kb, const char *name, const char *str, size_t len) |
| Insert (append) a new entry under a given name. More...
|
|
static int | redis_set_str (kb_t kb, const char *name, const char *val, size_t len) |
| Set (replace) a new entry under a given name. More...
|
|
static int | redis_add_int_unique (kb_t kb, const char *name, int val) |
| Insert (append) a new unique entry under a given name. More...
|
|
static int | redis_add_int (kb_t kb, const char *name, int val) |
| Insert (append) a new entry under a given name. More...
|
|
static int | redis_set_int (kb_t kb, const char *name, int val) |
| Set (replace) a new entry under a given name. More...
|
|
static int | redis_add_nvt (kb_t kb, const nvti_t *nvt, const char *filename) |
| Insert a new nvt. More...
|
|
int | redis_save (kb_t kb) |
| Save all the elements from the KB. More...
|
|
Knowledge base management API - Redis backend.
Contains specialized structures and functions to use redis as a KB server.
Definition in file kb.c.
◆ _GNU_SOURCE
Definition at line 25 of file kb.c.
◆ G_LOG_DOMAIN
#define G_LOG_DOMAIN "lib kb" |
Definition at line 38 of file kb.c.
◆ GLOBAL_DBINDEX_NAME
#define GLOBAL_DBINDEX_NAME "GVM.__GlobalDBIndex" |
Name of the namespace usage bitmap in redis.
Definition at line 50 of file kb.c.
◆ redis_kb
#define redis_kb |
( |
|
__kb | ) |
((struct kb_redis *) (__kb)) |
Definition at line 67 of file kb.c.
◆ fetch_max_db_index()
static int fetch_max_db_index |
( |
struct kb_redis * |
kbr | ) |
|
|
static |
Set the number of databases have been configured into kbr struct.
- Parameters
-
[in] | kbr | Subclass of struct kb where to save the max db index founded. |
- Returns
- 0 on success, -1 on error.
Definition at line 111 of file kb.c.
114 redisContext *ctx = kbr->
rctx;
115 redisReply *rep = NULL;
117 rep = redisCommand (ctx,
"CONFIG GET databases");
121 "%s: redis command failed with '%s'", __func__, ctx->errstr);
126 if (rep->type != REDIS_REPLY_ARRAY)
129 "%s: cannot retrieve max DB number: %s", __func__, rep->str);
134 if (rep->elements == 2)
136 kbr->
max_db = (unsigned) atoi (rep->element[1]->str);
141 "%s: unexpected reply length (%zd)", __func__, rep->elements);
146 g_debug (
"%s: maximum DB number: %u", __func__, kbr->
max_db);
150 freeReplyObject (rep);
References G_LOG_DOMAIN, kb_redis::max_db, and kb_redis::rctx.
Referenced by redis_find(), and select_database().
◆ get_redis_ctx()
static int get_redis_ctx |
( |
struct kb_redis * |
kbr | ) |
|
|
static |
Get redis context if it is already connected or do a a connection.
- Parameters
-
[in] | kbr | Subclass of struct kb where to fetch the context. or where it is saved in case of a new connection. |
- Returns
- 0 on success, -1 on connection error, -2 on unavailable DB slot.
Definition at line 256 of file kb.c.
260 if (kbr->
rctx != NULL)
263 kbr->
rctx = redisConnectUnix (kbr->
path);
264 if (kbr->
rctx == NULL || kbr->
rctx->err)
267 "%s: redis connection error to %s: %s", __func__, kbr->
path,
268 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
269 redisFree (kbr->
rctx);
277 g_log (
G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"No redis DB available");
278 redisFree (kbr->
rctx);
283 g_debug (
"%s: connected to redis://%s/%d", __func__, kbr->
path, kbr->
db);
References kb_redis::db, G_LOG_DOMAIN, kb_redis::path, kb_redis::rctx, and select_database().
Referenced by redis_add_int_unique(), redis_add_str_unique(), redis_cmd(), redis_get_pattern(), redis_new(), redis_set_int(), and redis_set_str().
◆ kb_item_free()
void kb_item_free |
( |
struct kb_item * |
item | ) |
|
◆ redis2kbitem()
static struct kb_item* redis2kbitem |
( |
const char * |
name, |
|
|
const redisReply * |
rep |
|
) |
| |
|
static |
Fetch a KB item or list from a redis Reply.
- Parameters
-
[in] | name | Name of the item. |
[in] | rep | A redisReply element where to fetch the item. |
- Returns
- kb_item or list on success, NULL otherwise.
Definition at line 580 of file kb.c.
590 case REDIS_REPLY_STRING:
591 case REDIS_REPLY_INTEGER:
595 case REDIS_REPLY_ARRAY:
596 for (i = 0; i < rep->elements; i++)
614 case REDIS_REPLY_NIL:
615 case REDIS_REPLY_STATUS:
616 case REDIS_REPLY_ERROR:
References kb_item::name, kb_item::next, and redis2kbitem_single().
Referenced by redis_get_all(), and redis_get_pattern().
◆ redis2kbitem_single()
static struct kb_item* redis2kbitem_single |
( |
const char * |
name, |
|
|
const redisReply * |
elt, |
|
|
int |
force_int |
|
) |
| |
|
static |
Give a single KB item.
- Parameters
-
[in] | name | Name of the item. |
[in] | elt | A redisReply element where to fetch the item. |
[in] | force_int | To force string to integer conversion. |
- Returns
- Single retrieve kb_item on success, NULL otherwise.
Definition at line 538 of file kb.c.
543 if (elt->type != REDIS_REPLY_STRING && elt->type != REDIS_REPLY_INTEGER)
549 if (elt->type == REDIS_REPLY_INTEGER)
552 item->
v_int = elt->integer;
557 item->
v_int = atoi (elt->str);
562 item->
v_str = g_memdup (elt->str, elt->len + 1);
563 item->
len = elt->len;
References KB_TYPE_INT, KB_TYPE_STR, kb_item::len, kb_item::name, kb_item::namelen, kb_item::next, kb_item::type, kb_item::v_int, and kb_item::v_str.
Referenced by redis2kbitem(), and redis_get_single().
◆ redis_add_int()
static int redis_add_int |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
int |
val |
|
) |
| |
|
static |
Insert (append) a new entry under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
[in] | val | Item value. |
- Returns
- 0 on success, non-null on error.
Definition at line 1228 of file kb.c.
1234 if (!rep || rep->type == REDIS_REPLY_ERROR)
1237 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_add_int_unique()
static int redis_add_int_unique |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
int |
val |
|
) |
| |
|
static |
Insert (append) a new unique entry under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
[in] | val | Item value. |
- Returns
- 0 on success, non-null on error.
Definition at line 1189 of file kb.c.
1200 redisAppendCommand (ctx,
"LREM %s 1 %d", name, val);
1201 redisAppendCommand (ctx,
"RPUSH %s %d", name, val);
1202 redisGetReply (ctx, (
void **) &rep);
1203 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1204 g_debug (
"Key '%s' already contained integer '%d'", name, val);
1205 freeReplyObject (rep);
1206 redisGetReply (ctx, (
void **) &rep);
1207 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1215 freeReplyObject (rep);
References get_redis_ctx(), kb_redis::rctx, and redis_kb.
◆ redis_add_nvt()
static int redis_add_nvt |
( |
kb_t |
kb, |
|
|
const nvti_t * |
nvt, |
|
|
const char * |
filename |
|
) |
| |
|
static |
Insert a new nvt.
- Parameters
-
[in] | kb | KB handle where to store the nvt. |
[in] | nvt | nvt to store. |
[in] | filename | Path to nvt to store. |
- Returns
- 0 on success, non-null on error.
Definition at line 1285 of file kb.c.
1288 redisReply *rep = NULL;
1291 gchar *cves, *bids, *xrefs;
1293 if (!nvt || !filename)
1298 xrefs =
nvti_refs (nvt, NULL,
"cve,bid", 1);
1302 kbr,
"RPUSH nvt:%s %s %s %s %s %s %s %s %s %s %s %s %d %d %s %s",
1312 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1315 freeReplyObject (rep);
1323 rep =
redis_cmd (kbr,
"RPUSH oid:%s:prefs %d|||%s|||%s|||%s",
1326 if (!rep || rep->type == REDIS_REPLY_ERROR)
1329 freeReplyObject (rep);
1331 rep =
redis_cmd (kbr,
"RPUSH filename:%s %lu %s", filename, time (NULL),
1333 if (!rep || rep->type == REDIS_REPLY_ERROR)
1336 freeReplyObject (rep);
References nvti_category(), nvti_dependencies(), nvti_excluded_keys(), nvti_family(), nvti_mandatory_keys(), nvti_name(), nvti_oid(), nvti_pref(), nvti_pref_len(), nvti_refs(), nvti_required_keys(), nvti_required_ports(), nvti_required_udp_ports(), nvti_tag(), nvti_timeout(), nvtpref_default(), nvtpref_id(), nvtpref_name(), nvtpref_type(), redis_cmd(), and redis_kb.
◆ redis_add_str()
static int redis_add_str |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
const char * |
str, |
|
|
size_t |
len |
|
) |
| |
|
static |
Insert (append) a new entry under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
[in] | str | Item value. |
[in] | len | Value length. Used for blobs. |
- Returns
- 0 on success, non-null on error.
Definition at line 1123 of file kb.c.
1131 rep =
redis_cmd (kbr,
"RPUSH %s %s", name, str);
1133 rep =
redis_cmd (kbr,
"RPUSH %s %b", name, str, len);
1134 if (!rep || rep->type == REDIS_REPLY_ERROR)
1138 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_add_str_unique()
static int redis_add_str_unique |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
const char * |
str, |
|
|
size_t |
len |
|
) |
| |
|
static |
Insert (append) a new unique entry under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
[in] | str | Item value. |
[in] | len | Value length. Used for blobs. |
- Returns
- 0 on success, non-null on error.
Definition at line 1069 of file kb.c.
1072 redisReply *rep = NULL;
1087 redisAppendCommand (ctx,
"LREM %s 1 %s", name, str);
1088 redisAppendCommand (ctx,
"RPUSH %s %s", name, str);
1089 redisGetReply (ctx, (
void **) &rep);
1090 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1091 g_debug (
"Key '%s' already contained value '%s'", name, str);
1092 freeReplyObject (rep);
1093 redisGetReply (ctx, (
void **) &rep);
1097 redisAppendCommand (ctx,
"LREM %s 1 %b", name, str, len);
1098 redisAppendCommand (ctx,
"RPUSH %s %b", name, str, len);
1099 redisGetReply (ctx, (
void **) &rep);
1100 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1101 g_debug (
"Key '%s' already contained string '%s'", name, str);
1102 freeReplyObject (rep);
1103 redisGetReply (ctx, (
void **) &rep);
1105 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1109 freeReplyObject (rep);
References get_redis_ctx(), kb_redis::rctx, and redis_kb.
◆ redis_cmd()
static redisReply * redis_cmd |
( |
struct kb_redis * |
kbr, |
|
|
const char * |
fmt, |
|
|
|
... |
|
) |
| |
|
static |
Execute a redis command and get a redis reply.
- Parameters
-
[in] | kbr | Subclass of struct kb to connect to. |
[in] | fmt | Formatted variable argument list with the cmd to be executed. |
- Returns
- Redis reply on success, NULL otherwise.
Definition at line 631 of file kb.c.
647 rep = redisvCommand (kbr->
rctx, fmt, aq);
653 freeReplyObject (rep);
References get_redis_ctx(), kb_redis::rctx, and redis_lnk_reset().
Referenced by redis_add_int(), redis_add_nvt(), redis_add_str(), redis_count(), redis_del_items(), redis_delete_all(), redis_get_all(), redis_get_nvt(), redis_get_nvt_all(), redis_get_oids(), redis_get_pattern(), redis_get_single(), redis_pop_str(), redis_push_str(), redis_save(), and redis_test_connection().
◆ redis_count()
static size_t redis_count |
( |
kb_t |
kb, |
|
|
const char * |
pattern |
|
) |
| |
|
static |
Count all items stored under a given pattern.
- Parameters
-
[in] | kb | KB handle where to count the items. |
[in] | pattern | '*' pattern of the elements to count. |
- Returns
- Count of items.
Definition at line 1012 of file kb.c.
1020 rep =
redis_cmd (kbr,
"KEYS %s", pattern);
1024 if (rep->type != REDIS_REPLY_ARRAY)
1026 freeReplyObject (rep);
1030 count = rep->elements;
1031 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_del_items()
static int redis_del_items |
( |
kb_t |
kb, |
|
|
const char * |
name |
|
) |
| |
|
static |
Delete all entries under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
- Returns
- 0 on success, non-null on error.
Definition at line 1042 of file kb.c.
1051 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1055 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_delete()
static int redis_delete |
( |
kb_t |
kb | ) |
|
|
static |
◆ redis_delete_all()
int redis_delete_all |
( |
struct kb_redis * |
kbr | ) |
|
|
static |
Delete all the KB's content.
- Parameters
-
[in] | kbr | Subclass of struct kb. |
- Returns
- 0 on success, non-null on error.
Definition at line 1474 of file kb.c.
1478 struct sigaction new_action, original_action;
1481 new_action.sa_flags = 0;
1482 if (sigemptyset (&new_action.sa_mask))
1484 new_action.sa_handler = SIG_IGN;
1485 if (sigaction (SIGPIPE, &new_action, &original_action))
1488 g_debug (
"%s: deleting all elements from KB #%u", __func__, kbr->
db);
1490 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
1499 if (sigaction (SIGPIPE, &original_action, NULL))
1502 freeReplyObject (rep);
References kb_redis::db, and redis_cmd().
Referenced by redis_delete(), and redis_flush_all().
◆ redis_direct_conn()
static kb_t redis_direct_conn |
( |
const char * |
kb_path, |
|
|
const int |
kb_index |
|
) |
| |
|
static |
Connect to a Knowledge Base object with the given kb_index.
- Parameters
-
[in] | kb_path | Path to KB. |
[in] | kb_index | DB index |
- Returns
- Knowledge Base object, NULL otherwise.
Definition at line 404 of file kb.c.
409 kbr = g_malloc0 (
sizeof (
struct kb_redis) + strlen (kb_path) + 1);
411 strcpy (kbr->
path, kb_path);
413 kbr->
rctx = redisConnectUnix (kbr->
path);
414 if (kbr->
rctx == NULL || kbr->
rctx->err)
417 "%s: redis connection error to %s: %s", __func__, kbr->
path,
418 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
419 redisFree (kbr->
rctx);
424 rep = redisCommand (kbr->
rctx,
"SELECT %d", kb_index);
425 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
428 freeReplyObject (rep);
429 redisFree (kbr->
rctx);
433 freeReplyObject (rep);
References kb_redis::db, G_LOG_DOMAIN, kb_redis::kb, kb::kb_ops, KBRedisOperations, kb_redis::path, and kb_redis::rctx.
◆ redis_find()
static kb_t redis_find |
( |
const char * |
kb_path, |
|
|
const char * |
key |
|
) |
| |
|
static |
Find an existing Knowledge Base object with key.
- Parameters
-
[in] | kb_path | Path to KB. |
[in] | key | Marker key to search for in KB objects. |
- Returns
- Knowledge Base object, NULL otherwise.
Definition at line 444 of file kb.c.
449 kbr = g_malloc0 (
sizeof (
struct kb_redis) + strlen (kb_path) + 1);
451 strcpy (kbr->
path, kb_path);
457 kbr->
rctx = redisConnectUnix (kbr->
path);
458 if (kbr->
rctx == NULL || kbr->
rctx->err)
461 "%s: redis connection error to %s: %s", __func__, kbr->
path,
462 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
463 redisFree (kbr->
rctx);
473 if (rep == NULL || rep->type != REDIS_REPLY_INTEGER || rep->integer != 1)
476 freeReplyObject (rep);
478 redisFree (kbr->
rctx);
482 freeReplyObject (rep);
483 rep = redisCommand (kbr->
rctx,
"SELECT %u", i);
484 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
486 redisFree (kbr->
rctx);
491 freeReplyObject (rep);
501 redisFree (kbr->
rctx);
References kb_redis::db, fetch_max_db_index(), G_LOG_DOMAIN, GLOBAL_DBINDEX_NAME, kb_redis::kb, kb_item_get_str(), kb::kb_ops, KBRedisOperations, kb_redis::max_db, kb_redis::path, and kb_redis::rctx.
◆ redis_flush_all()
static int redis_flush_all |
( |
kb_t |
kb, |
|
|
const char * |
except |
|
) |
| |
|
static |
Flush all the KB's content. Delete all namespaces.
- Parameters
-
[in] | kb | KB handle. |
[in] | except | Don't flush DB with except key. |
- Returns
- 0 on success, non-null on error.
Definition at line 1369 of file kb.c.
1376 redisFree (kbr->
rctx);
1378 g_debug (
"%s: deleting all DBs at %s except %s", __func__, kbr->
path, except);
1383 kbr->
rctx = redisConnectUnix (kbr->
path);
1384 if (kbr->
rctx == NULL || kbr->
rctx->err)
1387 "%s: redis connection error to %s: %s", __func__, kbr->
path,
1388 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
1389 redisFree (kbr->
rctx);
1396 if (rep == NULL || rep->type != REDIS_REPLY_INTEGER || rep->integer != 1)
1398 freeReplyObject (rep);
1399 redisFree (kbr->
rctx);
1403 freeReplyObject (rep);
1404 rep = redisCommand (kbr->
rctx,
"SELECT %u", i);
1405 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
1407 freeReplyObject (rep);
1408 redisFree (kbr->
rctx);
1413 freeReplyObject (rep);
1422 redisFree (kbr->
rctx);
1428 redisFree (kbr->
rctx);
References kb_redis::db, G_LOG_DOMAIN, GLOBAL_DBINDEX_NAME, kb_item_get_str(), kb_redis::max_db, kb_redis::path, kb_redis::rctx, redis_delete_all(), redis_kb, and redis_release_db().
◆ redis_get_all()
static struct kb_item* redis_get_all |
( |
kb_t |
kb, |
|
|
const char * |
name |
|
) |
| |
|
static |
Get all items stored under a given name.
- Parameters
-
[in] | kb | KB handle where to fetch the items. |
[in] | name | Name of the elements to retrieve. |
- Returns
- Linked struct kb_item instances to be freed with kb_item_free() or NULL if no element was found or on error.
Definition at line 888 of file kb.c.
902 freeReplyObject (rep);
References kb_item::name, redis2kbitem(), redis_cmd(), and redis_kb.
◆ redis_get_int()
static int redis_get_int |
( |
kb_t |
kb, |
|
|
const char * |
name |
|
) |
| |
|
static |
◆ redis_get_kb_index()
static int redis_get_kb_index |
( |
kb_t |
kb | ) |
|
|
static |
Return the kb index.
- Parameters
-
- Returns
- kb_index on success, null on error.
Definition at line 357 of file kb.c.
◆ redis_get_nvt()
static char* redis_get_nvt |
( |
kb_t |
kb, |
|
|
const char * |
oid, |
|
|
enum kb_nvt_pos |
position |
|
) |
| |
|
static |
Get field of a NVT.
- Parameters
-
[in] | kb | KB handle where to store the nvt. |
[in] | oid | OID of NVT to get from. |
[in] | position | Position of field to get. |
- Returns
- Value of field, NULL otherwise.
Definition at line 809 of file kb.c.
817 rep =
redis_cmd (kbr,
"LINDEX filename:%s %d", oid,
820 rep =
redis_cmd (kbr,
"LINDEX nvt:%s %d", oid, position);
823 if (rep->type == REDIS_REPLY_INTEGER)
824 res = g_strdup_printf (
"%lld", rep->integer);
825 else if (rep->type == REDIS_REPLY_STRING)
826 res = g_strdup (rep->str);
827 freeReplyObject (rep);
References NVT_TIMESTAMP_POS, redis_cmd(), and redis_kb.
◆ redis_get_nvt_all()
static nvti_t* redis_get_nvt_all |
( |
kb_t |
kb, |
|
|
const char * |
oid |
|
) |
| |
|
static |
Get a full NVT.
- Parameters
-
[in] | kb | KB handle where to store the nvt. |
[in] | oid | OID of NVT to get. |
- Returns
- nvti_t of NVT, NULL otherwise.
Definition at line 839 of file kb.c.
849 if (rep->type != REDIS_REPLY_ARRAY || rep->elements !=
NVT_NAME_POS + 1)
851 freeReplyObject (rep);
875 freeReplyObject (rep);
References NVT_BIDS_POS, NVT_CATEGORY_POS, NVT_CVES_POS, NVT_DEPENDENCIES_POS, NVT_EXCLUDED_KEYS_POS, NVT_FAMILY_POS, NVT_FILENAME_POS, NVT_MANDATORY_KEYS_POS, NVT_NAME_POS, NVT_REQUIRED_KEYS_POS, NVT_REQUIRED_PORTS_POS, NVT_REQUIRED_UDP_PORTS_POS, NVT_TAGS_POS, NVT_TIMEOUT_POS, NVT_XREFS_POS, nvti_add_refs(), nvti_new(), nvti_set_category(), nvti_set_dependencies(), nvti_set_excluded_keys(), nvti_set_family(), nvti_set_mandatory_keys(), nvti_set_name(), nvti_set_oid(), nvti_set_required_keys(), nvti_set_required_ports(), nvti_set_required_udp_ports(), nvti_set_tag(), nvti_set_timeout(), redis_cmd(), and redis_kb.
◆ redis_get_oids()
static GSList* redis_get_oids |
( |
kb_t |
kb | ) |
|
|
static |
Get all NVT OIDs.
- Parameters
-
[in] | kb | KB handle where to fetch the items. |
- Returns
- Linked list of all OIDs or NULL.
Definition at line 977 of file kb.c.
989 if (rep->type != REDIS_REPLY_ARRAY)
991 freeReplyObject (rep);
996 for (i = 0; i < rep->elements; i++)
997 list = g_slist_prepend (list, g_strdup (rep->element[i]->str + 4));
998 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_get_pattern()
static struct kb_item* redis_get_pattern |
( |
kb_t |
kb, |
|
|
const char * |
pattern |
|
) |
| |
|
static |
Get all items stored under a given pattern.
- Parameters
-
[in] | kb | KB handle where to fetch the items. |
[in] | pattern | '*' pattern of the elements to retrieve. |
- Returns
- Linked struct kb_item instances to be freed with kb_item_free() or NULL if no element was found or on error.
Definition at line 915 of file kb.c.
923 rep =
redis_cmd (kbr,
"KEYS %s", pattern);
926 if (rep->type != REDIS_REPLY_ARRAY)
928 freeReplyObject (rep);
934 for (i = 0; i < rep->elements; i++)
935 redisAppendCommand (kbr->
rctx,
"LRANGE %s 0 -1", rep->element[i]->str);
937 for (i = 0; i < rep->elements; i++)
940 redisReply *rep_range;
942 redisGetReply (kbr->
rctx, (
void **) &rep_range);
948 freeReplyObject (rep_range);
964 freeReplyObject (rep_range);
967 freeReplyObject (rep);
References get_redis_ctx(), kb_item::next, kb_redis::rctx, redis2kbitem(), redis_cmd(), and redis_kb.
◆ redis_get_single()
◆ redis_get_str()
static char* redis_get_str |
( |
kb_t |
kb, |
|
|
const char * |
name |
|
) |
| |
|
static |
◆ redis_lnk_reset()
static int redis_lnk_reset |
( |
kb_t |
kb | ) |
|
|
static |
Reset connection to the KB. This is called after each fork() to make sure connections aren't shared between concurrent processes.
- Parameters
-
- Returns
- 0 on success, non-null on error.
Definition at line 1347 of file kb.c.
1353 if (kbr->
rctx != NULL)
1355 redisFree (kbr->
rctx);
References kb_redis::rctx, and redis_kb.
Referenced by redis_cmd().
◆ redis_new()
static int redis_new |
( |
kb_t * |
kb, |
|
|
const char * |
kb_path |
|
) |
| |
|
static |
Initialize a new Knowledge Base object.
- Parameters
-
[in] | kb | Reference to a kb_t to initialize. |
[in] | kb_path | Path to KB. |
- Returns
- 0 on success, -1 on connection error, -2 when no DB is available.
Definition at line 373 of file kb.c.
378 kbr = g_malloc0 (
sizeof (
struct kb_redis) + strlen (kb_path) + 1);
380 strcpy (kbr->
path, kb_path);
387 "%s: cannot access redis at '%s'", __func__, kb_path);
References G_LOG_DOMAIN, get_redis_ctx(), kb_redis::kb, kb::kb_ops, KBRedisOperations, kb_redis::path, redis_delete(), and redis_test_connection().
◆ redis_pop_str()
static char* redis_pop_str |
( |
kb_t |
kb, |
|
|
const char * |
name |
|
) |
| |
|
static |
Pops a single KB string item.
- Parameters
-
[in] | kb | KB handle where to fetch the item. |
[in] | name | Name of the key from where to retrieve. |
- Returns
- A string to be freed or NULL if list is empty or on error.
Definition at line 759 of file kb.c.
770 if (rep->type == REDIS_REPLY_STRING)
771 value = g_strdup (rep->str);
772 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_push_str()
static int redis_push_str |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
const char * |
value |
|
) |
| |
|
static |
Push a new entry under a given key.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Key to push to. |
[in] | value | Value to push. |
- Returns
- 0 on success, non-null on error.
Definition at line 735 of file kb.c.
738 redisReply *rep = NULL;
742 rep =
redis_cmd (kbr,
"LPUSH %s %s", name, value);
743 if (!rep || rep->type == REDIS_REPLY_ERROR)
747 freeReplyObject (rep);
References redis_cmd(), and redis_kb.
◆ redis_release_db()
static int redis_release_db |
( |
struct kb_redis * |
kbr | ) |
|
|
static |
Release DB.
- Parameters
-
[in] | kbr | Subclass of struct kb. |
- Returns
- 0 on success, -1 on error.
Definition at line 215 of file kb.c.
218 redisContext *ctx = kbr->
rctx;
224 rep = redisCommand (ctx,
"SELECT 0");
225 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
230 freeReplyObject (rep);
233 if (rep == NULL || rep->type != REDIS_REPLY_INTEGER)
243 freeReplyObject (rep);
References kb_redis::db, GLOBAL_DBINDEX_NAME, and kb_redis::rctx.
Referenced by redis_delete(), and redis_flush_all().
◆ redis_save()
int redis_save |
( |
kb_t |
kb | ) |
|
Save all the elements from the KB.
- Parameters
-
- Returns
- 0 on success, -1 on error.
Definition at line 1444 of file kb.c.
1451 g_debug (
"%s: saving all elements from KB #%u", __func__, kbr->
db);
1453 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
1463 freeReplyObject (rep);
References kb_redis::db, redis_cmd(), and redis_kb.
◆ redis_set_int()
static int redis_set_int |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
int |
val |
|
) |
| |
|
static |
Set (replace) a new entry under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
[in] | val | Item value. |
- Returns
- 0 on success, non-null on error.
Definition at line 1250 of file kb.c.
1253 redisReply *rep = NULL;
1261 redisAppendCommand (ctx,
"MULTI");
1262 redisAppendCommand (ctx,
"DEL %s", name);
1263 redisAppendCommand (ctx,
"RPUSH %s %d", name, val);
1264 redisAppendCommand (ctx,
"EXEC");
1267 redisGetReply (ctx, (
void **) &rep);
1268 if (!rep || rep->type == REDIS_REPLY_ERROR)
1271 freeReplyObject (rep);
References get_redis_ctx(), kb_redis::rctx, and redis_kb.
◆ redis_set_str()
static int redis_set_str |
( |
kb_t |
kb, |
|
|
const char * |
name, |
|
|
const char * |
val, |
|
|
size_t |
len |
|
) |
| |
|
static |
Set (replace) a new entry under a given name.
- Parameters
-
[in] | kb | KB handle where to store the item. |
[in] | name | Item name. |
[in] | val | Item value. |
[in] | len | Value length. Used for blobs. |
- Returns
- 0 on success, non-null on error.
Definition at line 1151 of file kb.c.
1154 redisReply *rep = NULL;
1162 redisAppendCommand (ctx,
"MULTI");
1163 redisAppendCommand (ctx,
"DEL %s", name);
1165 redisAppendCommand (ctx,
"RPUSH %s %s", name, val);
1167 redisAppendCommand (ctx,
"RPUSH %s %b", name, val, len);
1168 redisAppendCommand (ctx,
"EXEC");
1171 redisGetReply (ctx, (
void **) &rep);
1172 if (!rep || rep->type == REDIS_REPLY_ERROR)
1175 freeReplyObject (rep);
References get_redis_ctx(), kb_redis::rctx, and redis_kb.
◆ redis_test_connection()
static int redis_test_connection |
( |
struct kb_redis * |
kbr | ) |
|
|
static |
Test redis connection.
- Parameters
-
[in] | kbr | Subclass of struct kb to test. |
- Returns
- 0 on success, negative integer on error.
Definition at line 293 of file kb.c.
307 if (rep->type != REDIS_REPLY_STATUS)
313 if (g_ascii_strcasecmp (rep->str,
"PONG"))
321 freeReplyObject (rep);
References redis_cmd().
Referenced by redis_new().
◆ select_database()
static int select_database |
( |
struct kb_redis * |
kbr | ) |
|
|
static |
Select DB.
- Parameters
-
[in] | kbr | Subclass of struct kb where to save the db index. |
- Returns
- 0 on success, -1 on error.
WARNING: do not call redis_cmd in here, since our context is not fully acquired yet!
Definition at line 164 of file kb.c.
167 redisContext *ctx = kbr->
rctx;
168 redisReply *rep = NULL;
177 for (i = 1; i < kbr->
max_db; i++)
192 rep = redisCommand (ctx,
"SELECT %u", kbr->
db);
193 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
203 freeReplyObject (rep);
References kb_redis::db, fetch_max_db_index(), kb_redis::max_db, kb_redis::rctx, and try_database_index().
Referenced by get_redis_ctx().
◆ try_database_index()
static int try_database_index |
( |
struct kb_redis * |
kbr, |
|
|
int |
index |
|
) |
| |
|
static |
Attempt to atomically acquire ownership of a database.
- Returns
- 0 on success, negative integer otherwise.
Definition at line 82 of file kb.c.
84 redisContext *ctx = kbr->
rctx;
92 if (rep->type != REDIS_REPLY_INTEGER)
94 else if (rep->integer == 0)
99 freeReplyObject (rep);
References kb_redis::db, GLOBAL_DBINDEX_NAME, and kb_redis::rctx.
Referenced by select_database().
◆ KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (redis-based).
Definition at line 1542 of file kb.c.
Referenced by kb_direct_conn(), kb_find(), and kb_new().
◆ KBRedisOperations
const nvtpref_t * nvti_pref(const nvti_t *n, guint p)
Get the n'th preferences of the NVT.
int nvti_set_required_udp_ports(nvti_t *n, const gchar *required_udp_ports)
Set the required udp ports of a NVT.
static char * kb_item_get_str(kb_t kb, const char *name)
Get a single KB string item.
static struct kb_item * redis_get_all(kb_t kb, const char *name)
Get all items stored under a given name.
static redisReply * redis_cmd(struct kb_redis *kbr, const char *fmt,...)
Execute a redis command and get a redis reply.
int nvti_set_required_keys(nvti_t *n, const gchar *required_keys)
Set the required keys of a NVT.
gchar * nvti_family(const nvti_t *n)
Get the family name.
int redis_save(kb_t kb)
Save all the elements from the KB.
gchar * nvti_oid(const nvti_t *n)
Get the OID string.
static int redis_push_str(kb_t kb, const char *name, const char *value)
Push a new entry under a given key.
static kb_t redis_direct_conn(const char *kb_path, const int kb_index)
Connect to a Knowledge Base object with the given kb_index.
static int redis_del_items(kb_t kb, const char *name)
Delete all entries under a given name.
static char * redis_get_str(kb_t kb, const char *name)
Get a single KB string item.
static GSList * redis_get_oids(kb_t kb)
Get all NVT OIDs.
static int redis_new(kb_t *kb, const char *kb_path)
Initialize a new Knowledge Base object.
static struct kb_item * redis_get_pattern(kb_t kb, const char *pattern)
Get all items stored under a given pattern.
static struct kb_item * redis2kbitem_single(const char *name, const redisReply *elt, int force_int)
Give a single KB item.
static int try_database_index(struct kb_redis *kbr, int index)
Attempt to atomically acquire ownership of a database.
static int redis_add_str_unique(kb_t kb, const char *name, const char *str, size_t len)
Insert (append) a new unique entry under a given name.
int nvtpref_id(const nvtpref_t *np)
Get the ID of a NVT Preference.
static int redis_delete_all(struct kb_redis *)
Delete all the KB's content.
int nvti_set_name(nvti_t *n, const gchar *name)
Set the name of a NVT.
static int redis_lnk_reset(kb_t)
Reset connection to the KB. This is called after each fork() to make sure connections aren't shared b...
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
gchar * nvti_refs(const nvti_t *n, const gchar *type, const gchar *exclude_types, guint use_types)
Get references as string.
gchar * nvti_required_udp_ports(const nvti_t *n)
Get the required udp ports list.
The structure of a information record that corresponds to a NVT.
gchar * nvti_required_ports(const nvti_t *n)
Get the required ports list.
@ NVT_REQUIRED_UDP_PORTS_POS
gint nvti_category(const nvti_t *n)
Get the category for this NVT.
int nvti_set_excluded_keys(nvti_t *n, const gchar *excluded_keys)
Set the excluded keys of a NVT.
static int redis_get_kb_index(kb_t kb)
Return the kb index.
void kb_item_free(struct kb_item *item)
Release a KB item (or a list).
static int redis_get_int(kb_t kb, const char *name)
Get a single KB integer item.
int nvti_add_refs(nvti_t *n, const gchar *type, const gchar *ref_ids, const gchar *ref_text)
Add many new vtref from a comma-separated list.
static int redis_add_str(kb_t kb, const char *name, const char *str, size_t len)
Insert (append) a new entry under a given name.
The structure for a preference of a NVT.
static int get_redis_ctx(struct kb_redis *kbr)
Get redis context if it is already connected or do a a connection.
int nvti_set_timeout(nvti_t *n, const gint timeout)
Set the timeout of a NVT Info.
static int redis_set_str(kb_t kb, const char *name, const char *val, size_t len)
Set (replace) a new entry under a given name.
guint nvti_pref_len(const nvti_t *n)
Get the number of preferences of the NVT.
static int redis_release_db(struct kb_redis *kbr)
Release DB.
const struct kb_operations * kb_ops
int nvti_set_dependencies(nvti_t *n, const gchar *dependencies)
Set the dependencies of a NVT.
static int redis_add_nvt(kb_t kb, const nvti_t *nvt, const char *filename)
Insert a new nvt.
Subclass of struct kb, it contains the redis-specific fields, such as the redis context,...
static int redis_flush_all(kb_t, const char *)
Flush all the KB's content. Delete all namespaces.
static int redis_delete(kb_t kb)
Delete all entries and release ownership on the namespace.
gchar * nvti_tag(const nvti_t *n)
Get the tags.
int nvti_set_tag(nvti_t *n, const gchar *tag)
Set the tags of a NVT.
static char * redis_get_nvt(kb_t kb, const char *oid, enum kb_nvt_pos position)
Get field of a NVT.
static char * redis_pop_str(kb_t kb, const char *name)
Pops a single KB string item.
Top-level KB. This is to be inherited by KB implementations.
gchar * nvtpref_name(const nvtpref_t *np)
Get the Name of a NVT Preference.
gchar * nvti_mandatory_keys(const nvti_t *n)
Get the mandatory keys list.
gint nvti_timeout(const nvti_t *n)
Get the timeout for this NVT.
gchar * nvti_dependencies(const nvti_t *n)
Get the dependencies list.
static struct kb_item * redis2kbitem(const char *name, const redisReply *rep)
Fetch a KB item or list from a redis Reply.
gchar * nvti_name(const nvti_t *n)
Get the name.
static size_t redis_count(kb_t kb, const char *pattern)
Count all items stored under a given pattern.
static int select_database(struct kb_redis *kbr)
Select DB.
static const struct kb_operations KBRedisOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (...
static struct kb_item * redis_get_single(kb_t kb, const char *name, enum kb_item_type type)
Get a single KB element.
gchar * nvti_excluded_keys(const nvti_t *n)
Get the excluded keys list.
static kb_t redis_find(const char *kb_path, const char *key)
Find an existing Knowledge Base object with key.
static int redis_add_int_unique(kb_t kb, const char *name, int val)
Insert (append) a new unique entry under a given name.
int nvti_set_required_ports(nvti_t *n, const gchar *required_ports)
Set the required ports of a NVT.
gchar * nvtpref_default(const nvtpref_t *np)
Get the Default of a NVT Preference.
#define GLOBAL_DBINDEX_NAME
Name of the namespace usage bitmap in redis.
nvti_t * nvti_new(void)
Create a new (empty) nvti structure.
gchar * nvtpref_type(const nvtpref_t *np)
Get the Type of a NVT Preference.
int nvti_set_family(nvti_t *n, const gchar *family)
Set the family of a NVT.
struct kb * kb_t
type abstraction to hide KB internals.
int nvti_set_category(nvti_t *n, const gint category)
Set the category type of a NVT Info.
static nvti_t * redis_get_nvt_all(kb_t kb, const char *oid)
Get a full NVT.
int nvti_set_oid(nvti_t *n, const gchar *oid)
Set the OID of a NVT Info.
static int redis_test_connection(struct kb_redis *kbr)
Test redis connection.
static int fetch_max_db_index(struct kb_redis *kbr)
Set the number of databases have been configured into kbr struct.
int nvti_set_mandatory_keys(nvti_t *n, const gchar *mandatory_keys)
Set the mandatory keys of a NVT.
static int redis_add_int(kb_t kb, const char *name, int val)
Insert (append) a new entry under a given name.
static int redis_set_int(kb_t kb, const char *name, int val)
Set (replace) a new entry under a given name.
gchar * nvti_required_keys(const nvti_t *n)
Get the required keys list.