207 lines
5.8 KiB
Diff
207 lines
5.8 KiB
Diff
diff -ru frr-10.0.orig/lib/vty.c frr-10.0/lib/vty.c
|
|
--- frr-10.0.orig/lib/vty.c 2024-05-16 12:29:42.000000000 +0200
|
|
+++ frr-10.0/lib/vty.c 2024-05-16 13:22:41.208287747 +0200
|
|
@@ -39,6 +39,7 @@
|
|
#include "libfrr.h"
|
|
#include "frrstr.h"
|
|
#include "lib_errors.h"
|
|
+#include <libyang/version.h>
|
|
#include "northbound_cli.h"
|
|
#include "printfrr.h"
|
|
#include "json.h"
|
|
@@ -3668,15 +3669,24 @@
|
|
}
|
|
|
|
static void vty_out_yang_error(struct vty *vty, LYD_FORMAT format,
|
|
- struct ly_err_item *ei)
|
|
+ const struct ly_err_item *ei)
|
|
{
|
|
+#if (LY_VERSION_MAJOR < 3)
|
|
+#define data_path path
|
|
+#else
|
|
+#define data_path data_path
|
|
+#endif
|
|
bool have_apptag = ei->apptag && ei->apptag[0] != 0;
|
|
- bool have_path = ei->path && ei->path[0] != 0;
|
|
+ bool have_path = ei->data_path && ei->data_path[0] != 0;
|
|
bool have_msg = ei->msg && ei->msg[0] != 0;
|
|
const char *severity = NULL;
|
|
const char *evalid = NULL;
|
|
const char *ecode = NULL;
|
|
+#if (LY_VERSION_MAJOR < 3)
|
|
LY_ERR err = ei->no;
|
|
+#else
|
|
+ LY_ERR err = ei->err;
|
|
+#endif
|
|
|
|
if (ei->level == LY_LLERR)
|
|
severity = "error";
|
|
@@ -3701,7 +3711,8 @@
|
|
vty_out(vty, "<error-validation>%s</error-validation>\n",
|
|
evalid);
|
|
if (have_path)
|
|
- vty_out(vty, "<error-path>%s</error-path>\n", ei->path);
|
|
+ vty_out(vty, "<error-path>%s</error-path>\n",
|
|
+ ei->data_path);
|
|
if (have_apptag)
|
|
vty_out(vty, "<error-app-tag>%s</error-app-tag>\n",
|
|
ei->apptag);
|
|
@@ -3720,7 +3731,7 @@
|
|
if (evalid)
|
|
vty_out(vty, ", \"error-validation\": \"%s\"", evalid);
|
|
if (have_path)
|
|
- vty_out(vty, ", \"error-path\": \"%s\"", ei->path);
|
|
+ vty_out(vty, ", \"error-path\": \"%s\"", ei->data_path);
|
|
if (have_apptag)
|
|
vty_out(vty, ", \"error-app-tag\": \"%s\"", ei->apptag);
|
|
if (have_msg)
|
|
@@ -3737,18 +3748,19 @@
|
|
if (evalid)
|
|
vty_out(vty, " invalid: %s", evalid);
|
|
if (have_path)
|
|
- vty_out(vty, " path: %s", ei->path);
|
|
+ vty_out(vty, " path: %s", ei->data_path);
|
|
if (have_apptag)
|
|
vty_out(vty, " app-tag: %s", ei->apptag);
|
|
if (have_msg)
|
|
vty_out(vty, " msg: %s", ei->msg);
|
|
break;
|
|
}
|
|
+#undef data_path
|
|
}
|
|
|
|
static uint vty_out_yang_errors(struct vty *vty, LYD_FORMAT format)
|
|
{
|
|
- struct ly_err_item *ei = ly_err_first(ly_native_ctx);
|
|
+ const struct ly_err_item *ei = ly_err_first(ly_native_ctx);
|
|
uint count;
|
|
|
|
if (!ei)
|
|
diff -ru frr-10.0.orig/lib/yang.c frr-10.0/lib/yang.c
|
|
--- frr-10.0.orig/lib/yang.c 2024-05-16 12:29:42.000000000 +0200
|
|
+++ frr-10.0/lib/yang.c 2024-05-16 13:22:41.209287749 +0200
|
|
@@ -11,6 +11,7 @@
|
|
#include "lib_errors.h"
|
|
#include "yang.h"
|
|
#include "yang_translator.h"
|
|
+#include <libyang/version.h>
|
|
#include "northbound.h"
|
|
|
|
#include "lib/config_paths.h"
|
|
@@ -18,6 +19,17 @@
|
|
DEFINE_MTYPE_STATIC(LIB, YANG_MODULE, "YANG module");
|
|
DEFINE_MTYPE_STATIC(LIB, YANG_DATA, "YANG data structure");
|
|
|
|
+/* Safe to remove after libyang 2.2.8 */
|
|
+#if (LY_VERSION_MAJOR < 3)
|
|
+#define yang_lyd_find_xpath3(ctx_node, tree, xpath, format, prefix_data, vars, \
|
|
+ set) \
|
|
+ lyd_find_xpath3(ctx_node, tree, xpath, vars, set)
|
|
+#else
|
|
+#define yang_lyd_find_xpath3(ctx_node, tree, xpath, format, prefix_data, vars, \
|
|
+ set) \
|
|
+ lyd_find_xpath3(ctx_node, tree, xpath, LY_VALUE_JSON, NULL, vars, set)
|
|
+#endif
|
|
+
|
|
/* libyang container. */
|
|
struct ly_ctx *ly_native_ctx;
|
|
|
|
@@ -691,7 +703,12 @@
|
|
}
|
|
|
|
/* Make libyang log its errors using FRR logging infrastructure. */
|
|
-static void ly_log_cb(LY_LOG_LEVEL level, const char *msg, const char *path)
|
|
+static void ly_zlog_cb(LY_LOG_LEVEL level, const char *msg, const char *data_path
|
|
+#if !(LY_VERSION_MAJOR < 3)
|
|
+ ,
|
|
+ const char *schema_path, uint64_t line
|
|
+#endif
|
|
+)
|
|
{
|
|
int priority = LOG_ERR;
|
|
|
|
@@ -708,8 +725,14 @@
|
|
break;
|
|
}
|
|
|
|
- if (path)
|
|
- zlog(priority, "libyang: %s (%s)", msg, path);
|
|
+ if (data_path)
|
|
+ zlog(priority, "libyang: %s (%s)", msg, data_path);
|
|
+#if !(LY_VERSION_MAJOR < 3)
|
|
+ else if (schema_path)
|
|
+ zlog(priority, "libyang %s (%s)\n", msg, schema_path);
|
|
+ else if (line)
|
|
+ zlog(priority, "libyang %s (line %" PRIu64 ")\n", msg, line);
|
|
+#endif
|
|
else
|
|
zlog(priority, "libyang: %s", msg);
|
|
}
|
|
@@ -736,7 +759,8 @@
|
|
return err;
|
|
}
|
|
|
|
- err = lyd_find_xpath3(NULL, tree, xpath, NULL, &set);
|
|
+ err = yang_lyd_find_xpath3(NULL, tree, xpath, LY_VALUE_JSON, NULL, NULL,
|
|
+ &set);
|
|
if (err) {
|
|
zlog_err("Failed to parse notification: %s", ly_last_errmsg());
|
|
lyd_free_all(tree);
|
|
@@ -829,23 +853,29 @@
|
|
|
|
const char *yang_print_errors(struct ly_ctx *ly_ctx, char *buf, size_t buf_len)
|
|
{
|
|
- struct ly_err_item *ei;
|
|
+ const struct ly_err_item *ei;
|
|
|
|
ei = ly_err_first(ly_ctx);
|
|
if (!ei)
|
|
return "";
|
|
|
|
strlcpy(buf, "YANG error(s):\n", buf_len);
|
|
+#if (LY_VERSION_MAJOR < 3)
|
|
+#define data_path path
|
|
+#else
|
|
+#define data_path data_path
|
|
+#endif
|
|
for (; ei; ei = ei->next) {
|
|
- if (ei->path) {
|
|
+ if (ei->data_path) {
|
|
strlcat(buf, " Path: ", buf_len);
|
|
- strlcat(buf, ei->path, buf_len);
|
|
+ strlcat(buf, ei->data_path, buf_len);
|
|
strlcat(buf, "\n", buf_len);
|
|
}
|
|
strlcat(buf, " Error: ", buf_len);
|
|
strlcat(buf, ei->msg, buf_len);
|
|
strlcat(buf, "\n", buf_len);
|
|
}
|
|
+#undef data_path
|
|
|
|
ly_err_clean(ly_ctx, NULL);
|
|
|
|
@@ -897,7 +927,12 @@
|
|
void yang_init(bool embedded_modules, bool defer_compile)
|
|
{
|
|
/* Initialize libyang global parameters that affect all containers. */
|
|
- ly_set_log_clb(ly_log_cb, 1);
|
|
+ ly_set_log_clb(ly_zlog_cb
|
|
+#if (LY_VERSION_MAJOR < 3)
|
|
+ ,
|
|
+ 1
|
|
+#endif
|
|
+ );
|
|
ly_log_options(LY_LOLOG | LY_LOSTORE);
|
|
|
|
/* Initialize libyang container for native models. */
|
|
@@ -1209,7 +1244,8 @@
|
|
|
|
*root = lyd_first_sibling(*root);
|
|
|
|
- err = lyd_find_xpath3(NULL, *root, xpath, NULL, &set);
|
|
+ err = yang_lyd_find_xpath3(NULL, *root, xpath, LY_VALUE_JSON, NULL,
|
|
+ NULL, &set);
|
|
if (err) {
|
|
flog_err_sys(EC_LIB_LIBYANG,
|
|
"cannot obtain specific result for xpath \"%s\": %s",
|