confd: Add helper to ensure that required modules are loaded

Unfortunately, sysrepo considers it an error to load a module that is
already loaded, ruling out using `sr_install_modules`.

Therefore, provide `require_modules` instead, which ensures that a
given set of modules are loaded, or loads them otherwise.
This commit is contained in:
Tobias Waldekranz
2023-04-17 14:09:24 +02:00
committed by Joachim Wiberg
parent db804eb9d0
commit a7fcdc8f4a
3 changed files with 79 additions and 1 deletions
+1 -1
View File
@@ -7,4 +7,4 @@ plugin_LTLIBRARIES = confd-plugin.la
confd_plugin_la_CFLAGS = $(augeas_CFLAGS) $(sysrepo_CFLAGS) $(CFLAGS)
confd_plugin_la_LIBADD = $(augeas_LIBS) $(sysrepo_LIBS)
confd_plugin_la_LDFLAGS = -module -avoid-version -shared
confd_plugin_la_SOURCES = core.c core.h run.c ietf-system.c ietf-interfaces.c
confd_plugin_la_SOURCES = core.c core.h run.c sr_ext.c sr_ext.h ietf-system.c ietf-interfaces.c
+60
View File
@@ -0,0 +1,60 @@
#include <libyang/libyang.h>
#include "sr_ext.h"
sr_error_t srx_require_module(sr_conn_ctx_t *conn,
const struct srx_module_requirement *mr)
{
sr_error_t err = SR_ERR_OK;
const struct ly_ctx *ly;
struct lys_module *mod;
const char **f;
char *path;
ly = sr_acquire_context(conn);
if (!ly)
return SR_ERR_INVAL_ARG;
mod = ly_ctx_get_module(ly, mr->name, mr->rev);
sr_release_context(conn);
if (mod && mod->implemented) {
if (!mr->features)
return SR_ERR_OK;
for (f = mr->features; *f; f++) {
switch (lys_feature_value(mod, *f)) {
case LY_SUCCESS:
continue;
case LY_ENOT:
err = sr_enable_module_feature(conn, mr->name, *f);
if (err)
return err;
break;
default:
return SR_ERR_UNSUPPORTED;
}
}
} else {
/* `search_dirs` argument is ignored by sysrepo 2.2.60,
* so we supply the full path instead.
*/
asprintf(&path, "%s/%s%s%s.yang", mr->dir ? : "", mr->name,
mr->rev ? "@" : "", mr->rev ? : "");
err = sr_install_module(conn, path, NULL, mr->features);
free(path);
}
return err;
}
sr_error_t srx_require_modules(sr_conn_ctx_t *conn,
const struct srx_module_requirement *mrs)
{
sr_error_t err = SR_ERR_OK;
for (; mrs->name && !err; mrs++)
err = srx_require_module(conn, mrs);
return err;
}
+18
View File
@@ -0,0 +1,18 @@
#ifndef CONFD_SR_EXT_H_
#define CONFD_SR_EXT_H_
#include <sysrepo.h>
struct srx_module_requirement {
const char *dir;
const char *name;
const char *rev;
const char **features;
};
sr_error_t srx_require_module(sr_conn_ctx_t *conn,
const struct srx_module_requirement *mr);
sr_error_t srx_require_modules(sr_conn_ctx_t *conn,
const struct srx_module_requirement *mrs);
#endif /* CONFD_SR_EXT_H_ */