You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

159 lines
4.8 KiB

/* Copyright 2016 Alex 'AdUser' Z (ad_user@runbox.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#if defined(__linux__)
#include <alloca.h>
#endif
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "../strlcpy.h"
enum loglevel {
debug = 0,
info = 1,
notice = 2,
warn = 3,
error = 4,
fatal = 5,
}; /* see log.h */
/**
* @file
* This header describes module API of type 'filter'
*
* Sample workflow of module usage:
*
* @msc
* f2b, filter;
* f2b => filter [label="create(id)"];
* f2b << filter [label="module handler, cfg_t *cfg"];
* |||;
* f2b => filter [label="config(cfg, param, value)"];
* f2b << filter [label="true"];
* f2b => filter [label="config(cfg, param, value)"];
* f2b << filter [label="true"];
* f2b => filter [label="config(cfg, param, value)"];
* f2b <<= filter [label="logcb(level, char *msg)"];
* f2b << filter [label="false"];
* --- [label="filter is ready for append()"];
* f2b => filter [label="append(cfg, pattern)"];
* f2b << filter [label="true"];
* f2b => filter [label="append(cfg, pattern)"];
* f2b <<= filter [label="logcb(level, char *msg)"];
* f2b << filter [label="false"];
* ||| [label="more calls of append()"];
* f2b => filter [label="ready(cfg)"];
* f2b << filter [label="true"];
* --- [label="filter is ready to use"];
* f2b => filter [label="match(cfg, line, buf, sizeof(buf))"];
* f2b << filter [label="false"];
* ... [label="no match"];
* f2b => filter [label="match(cfg, line, buf, sizeof(buf))"];
* f2b << filter [label="true"];
* ... [label="match found, buf filled with ipaddr"];
* f2b >> filter [label="stats(cfg, &matches, &pattern, true)"];
* f2b << filter [label="true"];
* f2b >> filter [label="stats(cfg, &matches, &pattern, false)"];
* f2b << filter [label="true"];
* f2b >> filter [label="stats(cfg, &matches, &pattern, false)"];
* f2b << filter [label="false"];
* ... [label="no more stats"];
* f2b => filter [label="flush(cfg)"];
* f2b << filter [label="true"];
* --- [label="now you may config(), append() or destroy() filter"];
* f2b => filter [label="destroy(cfg)"];
* @endmsc
*/
/**
* @def ID_MAX
* Maximum length of name for usage in @a start()
*/
#define ID_MAX 32
/**
* @def PATTERN_MAX
* Maximum length of regex
*/
#define PATTERN_MAX 256
/**
* @def HOST_TOKEN
* Use this string in place where to search for ip address
*/
#define HOST_TOKEN "<HOST>"
/**
* Opaque module handler, contains module internal structs
*/
typedef struct _config cfg_t;
typedef struct _regexp rx_t;
/**
* @brief Create instance of module
* @param id Module name string
* @returns Opaque module handler or NULL on failure
*/
extern cfg_t *create(const char *id);
/**
* @brief Contigure module instance
* @param cfg Module handler
* @param key Parameter name
* @param value Parameter value
* @returns true on success, false on error
*/
extern bool config(cfg_t *cfg, const char *key, const char *value);
/**
* @brief Add match pattern
* @param cfg Module handler
* @param pattern Regex expression
* @returns true on success, false on error
*/
extern bool append(cfg_t *cfg, const char *pattern);
/**
* @brief Checks is module ready for usage
* @param cfg Module handler
* @returns true if ready, false if not
*/
extern bool ready(cfg_t *cfg);
/**
* @brief Sets the log callback
* @param cfg Module handler
* @param cb Logging callback
* @note Optional, if this function is not called, warnings/errors of module will be suppressed
*/
extern void logcb(cfg_t *cfg, void (*cb)(enum loglevel l, const char *msg));
/**
* @brief Fetch filter match stats
* @param cfg Module handler
* @param buf Pointer to storage for stats report
* @param bufsize Available size for report on @a buf pointer
* @returns true on success, false on error
*/
extern bool stats(cfg_t *cfg, char *buf, size_t bufsize);
/**
* @brief Match given line against configured regexps
* @param cfg Module handler
* @param line Source line of data
* @param buf Buffer for storing match result
* @param bufsize Size of buffer above
* @returns false if no match or true otherwise with filling @a buf
*/
extern bool match(cfg_t *cfg, const char *line, char *buf, size_t bufsize);
/**
* @brief Destroy all added patterns and free it's resources
* @param cfg Module handler
*/
extern void flush(cfg_t *cfg);
/**
* @brief Free module handle
* @param cfg Module handler
* @note Module handler becomes invalid after calling this function on it
*/
extern void destroy(cfg_t *cfg);