diff --git a/src/confd/src/Makefile.am b/src/confd/src/Makefile.am index 6813923f..393e5693 100644 --- a/src/confd/src/Makefile.am +++ b/src/confd/src/Makefile.am @@ -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 diff --git a/src/confd/src/sr_ext.c b/src/confd/src/sr_ext.c new file mode 100644 index 00000000..4def500f --- /dev/null +++ b/src/confd/src/sr_ext.c @@ -0,0 +1,60 @@ +#include + +#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; +} diff --git a/src/confd/src/sr_ext.h b/src/confd/src/sr_ext.h new file mode 100644 index 00000000..71731f29 --- /dev/null +++ b/src/confd/src/sr_ext.h @@ -0,0 +1,18 @@ +#ifndef CONFD_SR_EXT_H_ +#define CONFD_SR_EXT_H_ + +#include + +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_ */