mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-30 04:33:00 +02:00
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:
committed by
Joachim Wiberg
parent
db804eb9d0
commit
a7fcdc8f4a
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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_ */
|
||||
Reference in New Issue
Block a user