17#include <hiredis/hiredis.h>
27#define G_LOG_DOMAIN "libgvm util"
29#if GLIB_CHECK_VERSION(2, 67, 3)
30#define memdup g_memdup2
32#define memdup g_memdup
45#define GLOBAL_DBINDEX_NAME "GVM.__GlobalDBIndex"
62#define redis_kb(__kb) ((struct kb_redis *) (__kb))
80 redisContext *ctx = kbr->
rctx;
88 if (rep->type != REDIS_REPLY_INTEGER)
90 else if (rep->integer == 0)
95 freeReplyObject (rep);
112 redisContext *ctx = kbr->
rctx;
113 redisReply *rep = NULL;
115 rep = redisCommand (ctx,
"CONFIG GET databases");
119 "%s: redis command failed with '%s'", __func__, ctx->errstr);
124 if (rep->type != REDIS_REPLY_ARRAY)
127 "%s: cannot retrieve max DB number: %s", __func__, rep->str);
132 if (rep->elements == 2)
134 kbr->
max_db = (unsigned) atoi (rep->element[1]->str);
139 "%s: unexpected reply length (%zd)", __func__, rep->elements);
144 g_debug (
"%s: maximum DB number: %u", __func__, kbr->
max_db);
148 freeReplyObject (rep);
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);
219 redisContext *ctx = kbr->
rctx;
225 rep = redisCommand (ctx,
"SELECT 0");
226 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
231 freeReplyObject (rep);
234 if (rep == NULL || rep->type != REDIS_REPLY_INTEGER)
244 freeReplyObject (rep);
254 if ((tmp = rindex (addr + tcp_indicator_len,
':')) == NULL)
256 is_ip_v6 = addr[tcp_indicator_len] ==
'[';
257 if (is_ip_v6 && (tmp - 1)[0] !=
']')
265 const char *tcp_indicator =
"tcp://";
266 const int tcp_indicator_len = strlen (tcp_indicator);
267 const int redis_default_port = 6379;
271 redisContext *result;
272 static int warn_flag = 0;
274 if (len < tcp_indicator_len + 1)
276 if (memcmp (addr, tcp_indicator, tcp_indicator_len) != 0)
278 host_len = len - tcp_indicator_len;
280 port = redis_default_port;
284 host_len -= strlen (tmp) + 1;
286 host = calloc (1, host_len);
287 memmove (host, addr + tcp_indicator_len, host_len);
288 result = redisConnect (host, port);
291 g_warning (
"A Redis TCP connection is being used. This feature is "
292 "experimental and insecure, since it is not an encrypted "
293 "channel. We discourage its usage in production environments");
299 return redisConnectUnix (addr);
316 if (kbr->
rctx != NULL)
320 if (kbr->
rctx == NULL || kbr->
rctx->err)
323 "%s: redis connection error to %s: %s", __func__, kbr->
path,
324 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
325 redisFree (kbr->
rctx);
333 g_log (
G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
"No redis DB available");
334 redisFree (kbr->
rctx);
339 g_debug (
"%s: connected to redis://%s/%d", __func__, kbr->
path, kbr->
db);
365 if (rep->type != REDIS_REPLY_STATUS)
371 if (g_ascii_strcasecmp (rep->str,
"PONG"))
379 freeReplyObject (rep);
401 if (kbr->
rctx != NULL)
404 redisFree (kbr->
rctx);
448 if (!rep || rep->type == REDIS_REPLY_ERROR)
451 freeReplyObject (rep);
474 kbr = g_malloc0 (
sizeof (
struct kb_redis));
476 kbr->
path = g_strdup (kb_path);
486 "%s: cannot access redis at '%s'", __func__, kb_path);
499 g_warning (
"%s: Memory purge was not successful", __func__);
521 kbr = g_malloc0 (
sizeof (
struct kb_redis));
523 kbr->
path = g_strdup (kb_path);
526 if (kbr->
rctx == NULL || kbr->
rctx->err)
529 "%s: redis connection error to %s: %s", __func__, kbr->
path,
530 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
531 redisFree (kbr->
rctx);
537 rep = redisCommand (kbr->
rctx,
"SELECT %d", kb_index);
538 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
541 freeReplyObject (rep);
542 redisFree (kbr->
rctx);
548 freeReplyObject (rep);
569 kbr = g_malloc0 (
sizeof (
struct kb_redis));
571 kbr->
path = g_strdup (kb_path);
578 if (kbr->
rctx == NULL || kbr->
rctx->err)
581 "%s: redis connection error to %s: %s", __func__, kbr->
path,
582 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
583 redisFree (kbr->
rctx);
594 if (rep == NULL || rep->type != REDIS_REPLY_INTEGER || rep->integer != 1)
597 freeReplyObject (rep);
599 redisFree (kbr->
rctx);
603 freeReplyObject (rep);
604 rep = redisCommand (kbr->
rctx,
"SELECT %u", i);
605 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
607 redisFree (kbr->
rctx);
612 freeReplyObject (rep);
622 redisFree (kbr->
rctx);
647 g_free (item->
v_str);
668 if (elt->type != REDIS_REPLY_STRING && elt->type != REDIS_REPLY_INTEGER)
674 if (elt->type == REDIS_REPLY_INTEGER)
677 item->
v_int = elt->integer;
682 item->
v_int = atoi (elt->str);
688 item->
len = elt->len;
718 case REDIS_REPLY_STRING:
719 case REDIS_REPLY_INTEGER:
723 case REDIS_REPLY_ARRAY:
724 for (i = 0; i < rep->elements; i++)
742 case REDIS_REPLY_NIL:
743 case REDIS_REPLY_STATUS:
744 case REDIS_REPLY_ERROR:
777 rep = redisvCommand (kbr->
rctx, fmt, aq);
783 freeReplyObject (rep);
818 rep =
redis_cmd (kbr,
"LINDEX %s -1", name);
819 if (rep == NULL || rep->type != REDIS_REPLY_STRING)
829 freeReplyObject (rep);
874 redisReply *rep = NULL;
881 rep =
redis_cmd (kbr,
"LPUSH %s %s", name, value);
882 if (!rep || rep->type == REDIS_REPLY_ERROR)
886 freeReplyObject (rep);
911 if (rep->type == REDIS_REPLY_STRING)
912 value = g_strdup (rep->str);
913 freeReplyObject (rep);
961 rep =
redis_cmd (kbr,
"LINDEX filename:%s %d", oid,
964 rep =
redis_cmd (kbr,
"LINDEX nvt:%s %d", oid, position);
967 if (rep->type == REDIS_REPLY_INTEGER)
968 res = g_strdup_printf (
"%lld", rep->integer);
969 else if (rep->type == REDIS_REPLY_STRING)
970 res = g_strdup (rep->str);
971 freeReplyObject (rep);
995 if (rep->type != REDIS_REPLY_ARRAY || rep->elements !=
NVT_NAME_POS + 1)
997 freeReplyObject (rep);
1020 freeReplyObject (rep);
1049 freeReplyObject (rep);
1072 rep =
redis_cmd (kbr,
"KEYS %s", pattern);
1075 if (rep->type != REDIS_REPLY_ARRAY)
1077 freeReplyObject (rep);
1083 for (i = 0; i < rep->elements; i++)
1084 redisAppendCommand (kbr->
rctx,
"LRANGE %s 0 -1", rep->element[i]->str);
1086 for (i = 0; i < rep->elements; i++)
1089 redisReply *rep_range;
1091 redisGetReply (kbr->
rctx, (
void **) &rep_range);
1097 freeReplyObject (rep_range);
1113 freeReplyObject (rep_range);
1116 freeReplyObject (rep);
1132 GSList *list = NULL;
1140 if (rep->type != REDIS_REPLY_ARRAY)
1142 freeReplyObject (rep);
1147 for (i = 0; i < rep->elements; i++)
1148 list = g_slist_prepend (list, g_strdup (rep->element[i]->str + 4));
1149 freeReplyObject (rep);
1171 rep =
redis_cmd (kbr,
"KEYS %s", pattern);
1175 if (rep->type != REDIS_REPLY_ARRAY)
1177 freeReplyObject (rep);
1181 count = rep->elements;
1182 freeReplyObject (rep);
1204 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1208 freeReplyObject (rep);
1228 int expire,
size_t len,
int pos)
1231 redisReply *rep = NULL;
1246 redisAppendCommand (ctx,
"LREM %s 1 %s", name, str);
1247 redisAppendCommand (ctx,
"%s %s %s", pos ?
"LPUSH" :
"RPUSH", name, str);
1248 redisAppendCommand (ctx,
"EXPIRE %s %d", name, expire);
1250 redisGetReply (ctx, (
void **) &rep);
1251 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1252 g_debug (
"Key '%s' already contained value '%s'", name, str);
1253 freeReplyObject (rep);
1255 redisGetReply (ctx, (
void **) &rep);
1256 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1262 redisGetReply (ctx, (
void **) &rep);
1263 if (rep == NULL || rep->type == REDIS_REPLY_ERROR
1264 || (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer != 1))
1266 g_warning (
"%s: Not able to set expire", __func__);
1273 redisAppendCommand (ctx,
"LREM %s 1 %b", name, str, len);
1274 redisAppendCommand (ctx,
"%s %s %b", pos ?
"LPUSH" :
"RPUSH", name, str,
1276 redisAppendCommand (ctx,
"EXPIRE %s %d", name, expire);
1278 redisGetReply (ctx, (
void **) &rep);
1279 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1280 g_debug (
"Key '%s' already contained string '%s'", name, str);
1281 freeReplyObject (rep);
1283 redisGetReply (ctx, (
void **) &rep);
1284 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1290 redisGetReply (ctx, (
void **) &rep);
1291 if (rep == NULL || rep->type == REDIS_REPLY_ERROR
1292 || (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer != 1))
1294 g_warning (
"%s: Not able to set expire", __func__);
1302 freeReplyObject (rep);
1324 redisReply *rep = NULL;
1339 redisAppendCommand (ctx,
"LREM %s 1 %s", name, str);
1340 redisAppendCommand (ctx,
"%s %s %s", pos ?
"LPUSH" :
"RPUSH", name, str);
1341 redisGetReply (ctx, (
void **) &rep);
1342 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1343 g_debug (
"Key '%s' already contained value '%s'", name, str);
1344 freeReplyObject (rep);
1345 redisGetReply (ctx, (
void **) &rep);
1349 redisAppendCommand (ctx,
"LREM %s 1 %b", name, str, len);
1350 redisAppendCommand (ctx,
"%s %s %b", pos ?
"LPUSH" :
"RPUSH", name, str,
1352 redisGetReply (ctx, (
void **) &rep);
1353 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1354 g_debug (
"Key '%s' already contained string '%s'", name, str);
1355 freeReplyObject (rep);
1356 redisGetReply (ctx, (
void **) &rep);
1358 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1362 freeReplyObject (rep);
1386 rep =
redis_cmd (kbr,
"RPUSH %s %s", name, str);
1388 rep =
redis_cmd (kbr,
"RPUSH %s %b", name, str, len);
1389 if (!rep || rep->type == REDIS_REPLY_ERROR)
1393 freeReplyObject (rep);
1411 redisReply *rep = NULL;
1419 redisAppendCommand (ctx,
"MULTI");
1420 redisAppendCommand (ctx,
"DEL %s", name);
1422 redisAppendCommand (ctx,
"RPUSH %s %s", name, val);
1424 redisAppendCommand (ctx,
"RPUSH %s %b", name, val, len);
1425 redisAppendCommand (ctx,
"EXEC");
1428 redisGetReply (ctx, (
void **) &rep);
1429 if (!rep || rep->type == REDIS_REPLY_ERROR)
1432 freeReplyObject (rep);
1460 redisAppendCommand (ctx,
"LREM %s 1 %d", name, val);
1461 redisAppendCommand (ctx,
"RPUSH %s %d", name, val);
1462 redisAppendCommand (ctx,
"EXPIRE %s %d", name, expire);
1464 redisGetReply (ctx, (
void **) &rep);
1465 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1466 g_debug (
"Key '%s' already contained integer '%d'", name, val);
1467 freeReplyObject (rep);
1469 redisGetReply (ctx, (
void **) &rep);
1470 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1476 redisGetReply (ctx, (
void **) &rep);
1477 if (rep == NULL || rep->type == REDIS_REPLY_ERROR
1478 || (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer != 1))
1480 g_warning (
"%s: Not able to set expire", __func__);
1487 freeReplyObject (rep);
1513 redisAppendCommand (ctx,
"LREM %s 1 %d", name, val);
1514 redisAppendCommand (ctx,
"RPUSH %s %d", name, val);
1515 redisGetReply (ctx, (
void **) &rep);
1516 if (rep && rep->type == REDIS_REPLY_INTEGER && rep->integer == 1)
1517 g_debug (
"Key '%s' already contained integer '%d'", name, val);
1518 freeReplyObject (rep);
1519 redisGetReply (ctx, (
void **) &rep);
1520 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1528 freeReplyObject (rep);
1549 if (!rep || rep->type == REDIS_REPLY_ERROR)
1552 freeReplyObject (rep);
1570 redisReply *rep = NULL;
1578 redisAppendCommand (ctx,
"MULTI");
1579 redisAppendCommand (ctx,
"DEL %s", name);
1580 redisAppendCommand (ctx,
"RPUSH %s %d", name, val);
1581 redisAppendCommand (ctx,
"EXEC");
1584 redisGetReply (ctx, (
void **) &rep);
1585 if (!rep || rep->type == REDIS_REPLY_ERROR)
1588 freeReplyObject (rep);
1607 redisReply *rep = NULL;
1610 gchar *cves, *bids, *xrefs;
1612 if (!nvt || !filename)
1617 xrefs =
nvti_refs (nvt, NULL,
"cve,bid", 1);
1621 kbr,
"RPUSH nvt:%s %s %s %s %s %s %s %s %s %s %s %s %d %s %s",
1635 if (rep == NULL || rep->type == REDIS_REPLY_ERROR)
1638 freeReplyObject (rep);
1646 rep =
redis_cmd (kbr,
"RPUSH oid:%s:prefs %d|||%s|||%s|||%s",
1649 if (!rep || rep->type == REDIS_REPLY_ERROR)
1652 freeReplyObject (rep);
1654 rep =
redis_cmd (kbr,
"RPUSH filename:%s %lu %s", filename, time (NULL),
1656 if (!rep || rep->type == REDIS_REPLY_ERROR)
1659 freeReplyObject (rep);
1678 if (kbr->
rctx != NULL)
1680 redisFree (kbr->
rctx);
1703 redisFree (kbr->
rctx);
1705 g_debug (
"%s: deleting all DBs at %s except %s", __func__, kbr->
path, except);
1711 if (kbr->
rctx == NULL || kbr->
rctx->err)
1714 "%s: redis connection error to %s: %s", __func__, kbr->
path,
1715 kbr->
rctx ? kbr->
rctx->errstr : strerror (ENOMEM));
1716 redisFree (kbr->
rctx);
1723 if (rep == NULL || rep->type != REDIS_REPLY_INTEGER || rep->integer != 1)
1725 freeReplyObject (rep);
1726 redisFree (kbr->
rctx);
1730 freeReplyObject (rep);
1731 rep = redisCommand (kbr->
rctx,
"SELECT %u", i);
1732 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
1734 freeReplyObject (rep);
1735 redisFree (kbr->
rctx);
1740 freeReplyObject (rep);
1749 redisFree (kbr->
rctx);
1755 redisFree (kbr->
rctx);
1781 g_debug (
"%s: saving all elements from KB #%u", __func__, kbr->
db);
1783 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
1793 freeReplyObject (rep);
1810 struct sigaction new_action, original_action;
1813 new_action.sa_flags = 0;
1814 if (sigemptyset (&new_action.sa_mask))
1816 new_action.sa_handler = SIG_IGN;
1817 if (sigaction (SIGPIPE, &new_action, &original_action))
1821 g_debug (
"%s: deleting all elements from KB #%u", __func__, kbr->
db);
1823 if (rep == NULL || rep->type != REDIS_REPLY_STATUS)
1832 if (sigaction (SIGPIPE, &original_action, NULL))
1835 freeReplyObject (rep);
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...
static const struct kb_operations KBRedisOperations
Default KB operations.
static int get_redis_ctx(struct kb_redis *kbr)
Get redis context if it is already connected or do a a connection.
static int redis_push_str(kb_t kb, const char *name, const char *value)
Push a new entry under a given key.
static int redis_memory_purge(kb_t kb)
Attempt to purge dirty pages.
#define G_LOG_DOMAIN
GLib logging domain.
static int redis_test_connection(struct kb_redis *kbr)
Test redis connection.
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.
static int redis_add_str_unique_volatile(kb_t kb, const char *name, const char *str, int expire, size_t len, int pos)
Insert (append) a new unique and volatile entry under a given name.
static char * redis_get_nvt(kb_t kb, const char *oid, enum kb_nvt_pos position)
Get field of a NVT.
static struct kb_item * redis2kbitem(const char *name, const redisReply *rep)
Fetch a KB item or list from a redis Reply.
static kb_t redis_find(const char *kb_path, const char *key)
Find an existing Knowledge Base object with key.
static int redis_delete(kb_t kb)
Delete all entries and release ownership on the namespace.
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.
static int select_database(struct kb_redis *kbr)
Select DB.
static int redis_delete_all(struct kb_redis *)
Delete all the KB's content.
void kb_item_free(struct kb_item *item)
Release a KB item (or a list).
static int redis_add_int_unique_volatile(kb_t kb, const char *name, int val, int expire)
Insert (append) a new unique entry under a given name.
static char * parse_port_of_addr(const char *addr, int tcp_indicator_len)
static struct kb_item * redis_get_all(kb_t kb, const char *name)
Get all items stored under a given name.
static int redis_add_int(kb_t kb, const char *name, int val)
Insert (append) a new entry under a given name.
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_add_str_unique(kb_t kb, const char *name, const char *str, size_t len, int pos)
Insert (append) a new unique entry under a given name.
static char * redis_get_str(kb_t kb, const char *name)
Get a single KB string item.
static struct kb_item * redis_get_pattern(kb_t kb, const char *pattern)
Get all items stored under a given pattern.
static GSList * redis_get_oids(kb_t kb)
Get all NVT OIDs.
static struct kb_item * redis2kbitem_single(const char *name, const redisReply *elt, int force_int)
Give a single KB item.
static int redis_save(kb_t kb)
Save all the elements from the KB.
static int redis_get_int(kb_t kb, const char *name)
Get a single KB integer item.
static redisContext * connect_redis(const char *addr, int len)
static char * redis_pop_str(kb_t kb, const char *name)
Pops a single KB string item.
static int redis_new(kb_t *kb, const char *kb_path)
Initialize a new Knowledge Base object.
static int redis_get_kb_index(kb_t kb)
Return the kb index.
static int redis_add_int_unique(kb_t kb, const char *name, int val)
Insert (append) a new unique entry under a given name.
static int try_database_index(struct kb_redis *kbr, int index)
Attempt to atomically acquire ownership of a database.
#define GLOBAL_DBINDEX_NAME
Name of the namespace usage bitmap in redis.
const struct kb_operations * KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (...
static int redis_flush_all(kb_t, const char *)
Flush all the KB's content. Delete all namespaces.
static size_t redis_count(kb_t kb, const char *pattern)
Count all items stored under a given pattern.
static int redis_release_db(struct kb_redis *kbr)
Release DB.
static struct kb_item * redis_get_single(kb_t kb, const char *name, enum kb_item_type type)
Get a single KB element.
static int redis_set_int(kb_t kb, const char *name, int val)
Set (replace) a new entry under a given name.
static int redis_add_nvt(kb_t kb, const nvti_t *nvt, const char *filename)
Insert a new nvt.
static int fetch_max_db_index(struct kb_redis *kbr)
Set the number of databases have been configured into kbr struct.
static redisReply * redis_cmd(struct kb_redis *kbr, const char *fmt,...)
Execute a redis command and get a redis reply.
static nvti_t * redis_get_nvt_all(kb_t kb, const char *oid)
Get a full NVT.
static int redis_del_items(kb_t kb, const char *name)
Delete all entries under a given name.
Knowledge base management API - Redis backend.
kb_nvt_pos
Possible positions of nvt values in cache list.
@ NVT_REQUIRED_UDP_PORTS_POS
struct kb * kb_t
type abstraction to hide KB internals.
kb_item_type
Possible type of a kb_item.
static char * kb_item_get_str(kb_t kb, const char *name)
Get a single KB string item.
nvti_t * nvti_new(void)
Create a new (empty) nvti structure.
gchar * nvti_dependencies(const nvti_t *n)
Get the dependencies list.
guint nvti_pref_len(const nvti_t *n)
Get the number of preferences of the NVT.
gchar * nvti_required_udp_ports(const nvti_t *n)
Get the required udp ports list.
gchar * nvti_required_ports(const nvti_t *n)
Get the required ports list.
gchar * nvti_refs(const nvti_t *n, const gchar *type, const gchar *exclude_types, guint use_types)
Get references as string.
gchar * nvtpref_type(const nvtpref_t *np)
Get the Type of a NVT Preference.
int nvti_set_excluded_keys(nvti_t *n, const gchar *excluded_keys)
Set the excluded keys of a NVT.
int nvti_set_dependencies(nvti_t *n, const gchar *dependencies)
Set the dependencies of a NVT.
int nvti_set_required_ports(nvti_t *n, const gchar *required_ports)
Set the required ports of a NVT.
int nvti_set_oid(nvti_t *n, const gchar *oid)
Set the OID of a NVT Info.
int nvti_set_tag(nvti_t *n, const gchar *tag)
Set the tags of a NVT.
int nvti_set_mandatory_keys(nvti_t *n, const gchar *mandatory_keys)
Set the mandatory keys of a NVT.
gint nvti_category(const nvti_t *n)
Get the category for this NVT.
gchar * nvti_family(const nvti_t *n)
Get the family name.
const nvtpref_t * nvti_pref(const nvti_t *n, guint p)
Get the n'th preferences of the NVT.
gchar * nvti_excluded_keys(const nvti_t *n)
Get the excluded keys list.
gchar * nvti_name(const nvti_t *n)
Get the name.
gchar * nvti_oid(const nvti_t *n)
Get the OID string.
int nvti_set_required_keys(nvti_t *n, const gchar *required_keys)
Set the required keys of a NVT.
int nvtpref_id(const nvtpref_t *np)
Get the ID of a NVT Preference.
int nvti_set_name(nvti_t *n, const gchar *name)
Set the name of a NVT.
gchar * nvti_required_keys(const nvti_t *n)
Get the required keys list.
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.
int nvti_set_required_udp_ports(nvti_t *n, const gchar *required_udp_ports)
Set the required udp ports of a NVT.
gchar * nvti_mandatory_keys(const nvti_t *n)
Get the mandatory keys list.
gchar * nvtpref_default(const nvtpref_t *np)
Get the Default of a NVT Preference.
int nvti_set_family(nvti_t *n, const gchar *family)
Set the family of a NVT.
gchar * nvtpref_name(const nvtpref_t *np)
Get the Name of a NVT Preference.
gchar * nvti_tag(const nvti_t *n)
Get the tags.
int nvti_set_category(nvti_t *n, const gint category)
Set the category type of a NVT Info.
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
KB interface. Functions provided by an implementation. All functions have to be provided,...
int(* kb_new)(kb_t *, const char *)
Subclass of struct kb, it contains the redis-specific fields, such as the redis context,...
Top-level KB. This is to be inherited by KB implementations.
const struct kb_operations * kb_ops
The structure of a information record that corresponds to a NVT.
The structure for a preference of a NVT.