int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
+int kr_rules_init(const char *, size_t);
int kr_view_insert_action(const char *, const char *);
int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
int kr_rule_tag_add(const char *, kr_rule_tags_t *);
int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
+int kr_rules_init(const char *, size_t);
int kr_view_insert_action(const char *, const char *);
int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
int kr_rule_tag_add(const char *, kr_rule_tags_t *);
int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
+int kr_rules_init(const char *, size_t);
int kr_view_insert_action(const char *, const char *);
int kr_view_select_action(const struct kr_request *, knot_db_val_t *);
int kr_rule_tag_add(const char *, kr_rule_tags_t *);
# FIXME: perhaps rename this exported symbol
packet_ttl
# New policy
+ kr_rules_init
kr_view_insert_action
kr_view_select_action
kr_rule_tag_add
goto cleanup;
}
- ret = kr_rules_init();
- if (ret) {
- kr_log_error(RULES, "failed to initialize policy rule engine: %s\n",
- kr_strerror(ret));
- ret = EXIT_FAILURE;
- goto cleanup;
- }
-
for (i = 0; i < the_args->config.len; ++i) {
const char *config = the_args->config.at[i];
if (engine_loadconf(&engine, config) != 0) {
lua_settop(engine.L, 0);
}
+ ret = kr_rules_init_ensure();
+ if (ret) {
+ kr_log_error(RULES, "failed to initialize policy rule engine: %s\n",
+ kr_strerror(ret));
+ ret = EXIT_FAILURE;
+ goto cleanup;
+ }
+
drop_capabilities();
if (engine_start(&engine) != 0) {
int kr_rule_tag_add(const char *tag, kr_rule_tags_t *tagset)
{
- kr_require(the_rules);
+ ENSURE_the_rules;
// Construct the DB key.
const uint8_t key_prefix[] = "\0tag_";
knot_db_val_t key;
}
-int kr_rules_init(void)
+int kr_rules_init_ensure(void)
{
- kr_require(!the_rules);
+ if (the_rules)
+ return kr_ok();
+ return kr_rules_init(NULL, 0);
+}
+int kr_rules_init(const char *path, size_t maxsize)
+{
+ if (the_rules)
+ return kr_error(EINVAL);
the_rules = calloc(1, sizeof(*the_rules));
kr_require(the_rules);
the_rules->api = kr_cdb_lmdb();
struct kr_cdb_opts opts = {
.is_cache = false,
- .path = "ruledb", // under current workdir
+ .path = path ? path : "ruledb", // under current workdir
// FIXME: the file will be sparse, but we still need to choose its size somehow.
// Later we might improve it to auto-resize in case of running out of space.
// Caveat: mdb_env_set_mapsize() can only be called without transactions open.
- .maxsize = 10 * 1024*(size_t)1024,
+ .maxsize = maxsize ? maxsize : 100 * 1024*(size_t)1024,
};
int ret = the_rules->api->open(&the_rules->db, &the_rules->stats, &opts, NULL);
/* No persistence - we always refill from config for now.
failure:
free(the_rules);
the_rules = NULL;
- auto_free const char *path = kr_absolutize_path(".", opts.path);
- kr_log_error(RULES, "failed while opening or initializing rule DB %s/\n", path);
+ auto_free const char *path_abs = kr_absolutize_path(".", opts.path);
+ kr_log_error(RULES, "failed while opening or initializing rule DB %s/\n", path_abs);
return ret;
}
return kr_ok();
}
-
knot_db_val_t local_data_key(const knot_rrset_t *rrs, uint8_t key_data[KEY_MAXLEN],
const char *ruleset_name)
{
int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_rds,
kr_rule_tags_t tags)
{
- kr_require(the_rules);
+ ENSURE_the_rules;
// Construct the DB key.
uint8_t key_data[KEY_MAXLEN];
knot_db_val_t key = local_data_key(rrs, key_data, RULESET_DEFAULT);
}
int kr_rule_local_data_del(const knot_rrset_t *rrs, kr_rule_tags_t tags)
{
- kr_require(the_rules);
+ ENSURE_the_rules;
uint8_t key_data[KEY_MAXLEN];
knot_db_val_t key = local_data_key(rrs, key_data, RULESET_DEFAULT);
return ruledb_op(remove, &key, 1);
int insert_trivial_zone(val_zla_type_t ztype, uint32_t ttl,
const knot_dname_t *apex, kr_rule_tags_t tags)
{
+ ENSURE_the_rules;
uint8_t key_data[KEY_MAXLEN];
knot_db_val_t key = zla_key(apex, key_data);
int kr_view_insert_action(const char *subnet, const char *action)
{
- kr_require(the_rules);
+ ENSURE_the_rules;
// Parse the subnet string.
union kr_sockaddr saddr;
saddr.ip.sa_family = kr_straddr_family(subnet);
/// Tags "capacity", i.e. numbered from 0 to _CAP - 1.
#define KR_RULE_TAGS_CAP (sizeof(kr_rule_tags_t) * 8)
+/** Open the rule DB.
+ *
+ * You can call this to override the path or size (NULL/0 -> default).
+ * Not allowed if already open (EINVAL), so this optional call has to come
+ * before writing anything into the DB. */
+KR_EXPORT
+int kr_rules_init(const char *path, size_t maxsize);
+/** kr_rules_init() but OK if already open, and not allowing to override defaults. */
KR_EXPORT
-int kr_rules_init(void);
+int kr_rules_init_ensure(void);
KR_EXPORT
void kr_rules_deinit(void);
int kr_rule_forward(const knot_dname_t *apex, kr_rule_fwd_flags_t flags,
const struct sockaddr * targets[])
{
+ ENSURE_the_rules;
const kr_rule_tags_t tags = KR_RULE_TAGS_ALL;
const val_zla_type_t ztype = VAL_ZLAT_FORWARD;
struct kr_rules;
extern struct kr_rules *the_rules;
+#define ENSURE_the_rules \
+ if (!the_rules) { \
+ int ret = kr_rules_init(NULL, 0); \
+ if (ret) return ret; \
+ }
+
#define KEY_RULESET_MAXLEN 16 /**< max. len of ruleset ID + 1(for kind) */
/** When constructing a key, it's convenient that the dname_lf ends on a fixed offset.
* Convention: the end here is before the final '\0' byte (if any). */
int kr_rule_zonefile(const struct kr_rule_zonefile_config *c)
{
- kr_require(c && the_rules);
+ ENSURE_the_rules;
zs_scanner_t s_storage, *s = &s_storage;
/* zs_init(), zs_set_input_file(), zs_set_processing() returns -1 in case of error,
* so don't print error code as it meaningless. */