Change internal protocol from clicon_proto.h to netconf.
This commit is contained in:
parent
2e09f54d12
commit
2fcefda831
66 changed files with 3012 additions and 5141 deletions
|
|
@ -44,11 +44,9 @@
|
|||
*/
|
||||
typedef int (*netconf_cb_t)(
|
||||
clicon_handle h,
|
||||
cxobj *xorig, /* Original request. */
|
||||
cxobj *xn, /* Sub-tree (under xorig) at child: <rpc><xn></rpc> */
|
||||
cbuf *cb, /* Output xml stream. For reply */
|
||||
cbuf *cb_err, /* Error xml stream. For error reply */
|
||||
void *arg /* Argument given at netconf_register_callback() */
|
||||
cxobj *xn, /* Request: <rpc><xn></rpc> */
|
||||
cxobj **xret, /* Return xml tree, eg <rpc-reply>... */
|
||||
void *arg /* Argument given at netconf_register_callback() */
|
||||
);
|
||||
|
||||
/*
|
||||
|
|
@ -57,25 +55,10 @@ typedef int (*netconf_cb_t)(
|
|||
*/
|
||||
int netconf_output(int s, cbuf *xf, char *msg);
|
||||
|
||||
int netconf_create_rpc_reply(cbuf *cb, /* msg buffer */
|
||||
cxobj *xr, /* orig request */
|
||||
char *body,
|
||||
int ok);
|
||||
|
||||
int netconf_register_callback(clicon_handle h,
|
||||
netconf_cb_t cb, /* Callback called */
|
||||
void *arg, /* Arg to send to callback */
|
||||
char *tag); /* Xml tag when callback is made */
|
||||
int netconf_create_rpc_error(cbuf *xf, /* msg buffer */
|
||||
cxobj *xr, /* orig request */
|
||||
char *tag,
|
||||
char *type,
|
||||
char *severity,
|
||||
char *message,
|
||||
char *info);
|
||||
|
||||
void netconf_ok_set(int ok);
|
||||
int netconf_ok_get(void);
|
||||
|
||||
int netconf_xpath(cxobj *xsearch,
|
||||
cxobj *xfilter,
|
||||
|
|
|
|||
|
|
@ -65,9 +65,7 @@
|
|||
#include "netconf_lib.h"
|
||||
#include "netconf_filter.h"
|
||||
|
||||
/*
|
||||
* xml_filter
|
||||
* xf specifices a filter, and xn is an xml tree.
|
||||
/* xf specifices a filter, and xn is an xml tree.
|
||||
* Select the part of xn that matches xf and return it.
|
||||
* Change xn destructively by removing the parts of the sub-tree that does
|
||||
* not match.
|
||||
|
|
@ -107,9 +105,9 @@ leafstring(cxobj *x)
|
|||
* @retval -1 Error
|
||||
*/
|
||||
static int
|
||||
xml_filter2(cxobj *xfilter,
|
||||
cxobj *xparent,
|
||||
int *remove_me)
|
||||
xml_filter_recursive(cxobj *xfilter,
|
||||
cxobj *xparent,
|
||||
int *remove_me)
|
||||
{
|
||||
cxobj *s;
|
||||
cxobj *sprev;
|
||||
|
|
@ -176,7 +174,7 @@ xml_filter2(cxobj *xfilter,
|
|||
}
|
||||
// XXX: s can be removed itself in the recursive call !
|
||||
remove_s = 0;
|
||||
if (xml_filter2(f, s, &remove_s) < 0)
|
||||
if (xml_filter_recursive(f, s, &remove_s) < 0)
|
||||
return -1;
|
||||
if (remove_s){
|
||||
xml_purge(s);
|
||||
|
|
@ -207,9 +205,9 @@ xml_filter(cxobj *xfilter,
|
|||
int remove_s;
|
||||
|
||||
/* Call recursive variant */
|
||||
retval = xml_filter2(xfilter,
|
||||
xconfig,
|
||||
&remove_s);
|
||||
retval = xml_filter_recursive(xfilter,
|
||||
xconfig,
|
||||
&remove_s);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,22 +68,8 @@
|
|||
/*
|
||||
* Exported variables
|
||||
*/
|
||||
enum transport_type transport = NETCONF_SSH;
|
||||
int cc_closed = 0;
|
||||
|
||||
static int cc_ok = 0;
|
||||
|
||||
void
|
||||
netconf_ok_set(int ok)
|
||||
{
|
||||
cc_ok = ok;
|
||||
}
|
||||
|
||||
int
|
||||
netconf_ok_get(void)
|
||||
{
|
||||
return cc_ok;
|
||||
}
|
||||
enum transport_type transport = NETCONF_SSH; /* XXX Remove SOAP support */
|
||||
int cc_closed = 0; /* XXX Please remove (or at least hide in handle) this global variable */
|
||||
|
||||
int
|
||||
add_preamble(cbuf *xf)
|
||||
|
|
@ -191,8 +177,7 @@ detect_endtag(char *tag, char ch, int *state)
|
|||
* @retval dbname Actual database file name
|
||||
*/
|
||||
char *
|
||||
netconf_get_target(clicon_handle h,
|
||||
cxobj *xn,
|
||||
netconf_get_target(cxobj *xn,
|
||||
char *path)
|
||||
{
|
||||
cxobj *x;
|
||||
|
|
@ -218,11 +203,13 @@ netconf_get_target(clicon_handle h,
|
|||
* @param[in] msg Only for debug
|
||||
*/
|
||||
int
|
||||
netconf_output(int s, cbuf *xf, char *msg)
|
||||
netconf_output(int s,
|
||||
cbuf *xf,
|
||||
char *msg)
|
||||
{
|
||||
char *buf = cbuf_get(xf);
|
||||
int len = cbuf_len(xf);
|
||||
int retval = -1;
|
||||
int len = cbuf_len(xf);
|
||||
int retval = -1;
|
||||
|
||||
clicon_debug(1, "SEND %s", msg);
|
||||
if (debug > 1){ /* XXX: below only works to stderr, clicon_debug may log to syslog */
|
||||
|
|
|
|||
|
|
@ -60,11 +60,6 @@ enum error_option{ /* edit-config */
|
|||
CONTINUE_ON_ERROR
|
||||
};
|
||||
|
||||
enum filter_option{ /* get-config/filter */
|
||||
FILTER_SUBTREE,
|
||||
FILTER_XPATH
|
||||
};
|
||||
|
||||
/*
|
||||
* Variables
|
||||
*/
|
||||
|
|
@ -74,14 +69,11 @@ extern int cc_closed;
|
|||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
void netconf_ok_set(int ok);
|
||||
int netconf_ok_get(void);
|
||||
|
||||
int add_preamble(cbuf *xf);
|
||||
int add_postamble(cbuf *xf);
|
||||
int add_error_preamble(cbuf *xf, char *reason);
|
||||
int detect_endtag(char *tag, char ch, int *state);
|
||||
char *netconf_get_target(clicon_handle h, cxobj *xn, char *path);
|
||||
char *netconf_get_target(cxobj *xn, char *path);
|
||||
int add_error_postamble(cbuf *xf);
|
||||
int netconf_output(int s, cbuf *xf, char *msg);
|
||||
|
||||
|
|
|
|||
|
|
@ -82,11 +82,12 @@ process_incoming_packet(clicon_handle h,
|
|||
{
|
||||
char *str;
|
||||
char *str0;
|
||||
cxobj *xml_req = NULL; /* Request (in) */
|
||||
cxobj *xreq = NULL; /* Request (in) */
|
||||
int isrpc = 0; /* either hello or rpc */
|
||||
cbuf *xf_out;
|
||||
cbuf *xf_err;
|
||||
cbuf *xf1;
|
||||
cbuf *cbret = NULL;
|
||||
cxobj *xret = NULL; /* Return (out) */
|
||||
cxobj *xrpc;
|
||||
cxobj *xc;
|
||||
|
||||
clicon_debug(1, "RECV");
|
||||
clicon_debug(2, "%s: RCV: \"%s\"", __FUNCTION__, cbuf_get(cb));
|
||||
|
|
@ -96,16 +97,15 @@ process_incoming_packet(clicon_handle h,
|
|||
}
|
||||
str = str0;
|
||||
/* Parse incoming XML message */
|
||||
if (clicon_xml_parse_string(&str, &xml_req) < 0){
|
||||
if ((cb = cbuf_new()) == NULL){
|
||||
netconf_create_rpc_error(cb, NULL,
|
||||
"operation-failed",
|
||||
"rpc", "error",
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (clicon_xml_parse_string(&str, &xreq) < 0){
|
||||
if ((cbret = cbuf_new()) == NULL){
|
||||
cprintf(cbret, "<rpc-reply><rpc-error>"
|
||||
"<error-tag>operation-failed</error-tag>"
|
||||
"<error-type>rpc</error-type>"
|
||||
"<error-severity>error</error-severity>"
|
||||
"<error-message>internal error</error-message>"
|
||||
"</rpc-error></rpc-reply>");
|
||||
netconf_output(1, cb, "rpc-error");
|
||||
cbuf_free(cb);
|
||||
}
|
||||
else
|
||||
clicon_log(LOG_ERR, "%s: cbuf_new", __FUNCTION__);
|
||||
|
|
@ -113,72 +113,56 @@ process_incoming_packet(clicon_handle h,
|
|||
goto done;
|
||||
}
|
||||
free(str0);
|
||||
if (xpath_first(xml_req, "//rpc") != NULL){
|
||||
if ((xrpc=xpath_first(xreq, "//rpc")) != NULL){
|
||||
isrpc++;
|
||||
}
|
||||
else
|
||||
if (xpath_first(xml_req, "//hello") != NULL)
|
||||
if (xpath_first(xreq, "//hello") != NULL)
|
||||
;
|
||||
else{
|
||||
clicon_log(LOG_WARNING, "Invalid netconf msg: neither rpc or hello: dropp\
|
||||
ed");
|
||||
goto done;
|
||||
}
|
||||
/* Initialize response buffers */
|
||||
if ((xf_out = cbuf_new()) == NULL){
|
||||
clicon_log(LOG_ERR, "%s: cbuf_new", __FUNCTION__);
|
||||
goto done;
|
||||
if (!isrpc){ /* hello */
|
||||
if (netconf_hello_dispatch(xreq) < 0)
|
||||
goto done;
|
||||
}
|
||||
else /* rpc */
|
||||
if (netconf_rpc_dispatch(h, xrpc, &xret) < 0){
|
||||
goto done;
|
||||
}
|
||||
else{ /* there is a return message in xret */
|
||||
cxobj *xa, *xa2;
|
||||
assert(xret);
|
||||
|
||||
/* Create error buf */
|
||||
if ((xf_err = cbuf_new()) == NULL){
|
||||
clicon_log(LOG_ERR, "%s: cbuf_new", __FUNCTION__);
|
||||
goto done;
|
||||
}
|
||||
netconf_ok_set(0);
|
||||
if (isrpc){
|
||||
if (netconf_rpc_dispatch(h,
|
||||
xml_req,
|
||||
xpath_first(xml_req, "//rpc"),
|
||||
xf_out, xf_err) < 0){
|
||||
assert(cbuf_len(xf_err));
|
||||
clicon_debug(1, "%s", cbuf_get(xf_err));
|
||||
if (isrpc){
|
||||
if (netconf_output(1, xf_err, "rpc-error") < 0)
|
||||
goto done;
|
||||
if ((cbret = cbuf_new()) != NULL){
|
||||
if ((xc = xml_child_i(xret,0))!=NULL){
|
||||
xa=NULL;
|
||||
while ((xa = xml_child_each(xrpc, xa, CX_ATTR)) != NULL){
|
||||
if ((xa2 = xml_dup(xa)) ==NULL)
|
||||
goto done;
|
||||
if (xml_addsub(xc, xa2) < 0)
|
||||
goto done;
|
||||
}
|
||||
add_preamble(cbret);
|
||||
|
||||
clicon_xml2cbuf(cbret, xml_child_i(xret,0), 0, 0);
|
||||
add_postamble(cbret);
|
||||
if (netconf_output(1, cbret, "rpc-reply") < 0){
|
||||
cbuf_free(cbret);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
if ((xf1 = cbuf_new()) != NULL){
|
||||
if (netconf_create_rpc_reply(xf1, xml_req, cbuf_get(xf_out), netconf_ok_get()) < 0){
|
||||
cbuf_free(xf_out);
|
||||
cbuf_free(xf_err);
|
||||
cbuf_free(xf1);
|
||||
goto done;
|
||||
}
|
||||
if (netconf_output(1, xf1, "rpc-reply") < 0){
|
||||
cbuf_reset(xf1);
|
||||
netconf_create_rpc_error(xf1, xml_req, "operation-failed",
|
||||
"protocol", "error",
|
||||
NULL, cbuf_get(xf_err));
|
||||
netconf_output(1, xf1, "rpc-error");
|
||||
cbuf_free(xf_out);
|
||||
cbuf_free(xf_err);
|
||||
cbuf_free(xf1);
|
||||
goto done;
|
||||
}
|
||||
cbuf_free(xf1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
netconf_hello_dispatch(xml_req); /* XXX: return-value */
|
||||
}
|
||||
cbuf_free(xf_out);
|
||||
cbuf_free(xf_err);
|
||||
done:
|
||||
if (xml_req)
|
||||
xml_free(xml_req);
|
||||
if (xreq)
|
||||
xml_free(xreq);
|
||||
if (xret)
|
||||
xml_free(xret);
|
||||
if (cbret)
|
||||
cbuf_free(cbret);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -268,28 +252,12 @@ send_hello(int s)
|
|||
return retval;
|
||||
}
|
||||
|
||||
/*! Initialize candidate database */
|
||||
static int
|
||||
init_candidate_db(clicon_handle h)
|
||||
{
|
||||
int retval = -1;
|
||||
|
||||
/* init shared candidate */
|
||||
if (xmldb_exists(h, "candidate") != 1){
|
||||
if (xmldb_copy(h, "running", "candidate") < 0)
|
||||
goto done;
|
||||
}
|
||||
retval = 0;
|
||||
done:
|
||||
unchunk_group(__FUNCTION__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
terminate(clicon_handle h)
|
||||
netconf_terminate(clicon_handle h)
|
||||
{
|
||||
yang_spec *yspec;
|
||||
|
||||
clicon_rpc_close_session(h);
|
||||
if ((yspec = clicon_dbspec_yang(h)) != NULL)
|
||||
yspec_free(yspec);
|
||||
clicon_handle_exit(h);
|
||||
|
|
@ -402,8 +370,6 @@ main(int argc, char **argv)
|
|||
if (netconf_plugin_load(h) < 0)
|
||||
return -1;
|
||||
|
||||
if (init_candidate_db(h) < 0)
|
||||
return -1;
|
||||
/* Call start function is all plugins before we go interactive */
|
||||
tmp = *(argv-1);
|
||||
*(argv-1) = argv0;
|
||||
|
|
@ -416,13 +382,11 @@ main(int argc, char **argv)
|
|||
goto done;
|
||||
if (debug)
|
||||
clicon_option_dump(h, debug);
|
||||
|
||||
if (event_loop() < 0)
|
||||
goto done;
|
||||
done:
|
||||
|
||||
netconf_plugin_unload(h);
|
||||
terminate(h);
|
||||
netconf_terminate(h);
|
||||
clicon_log_init(__PROGRAM__, LOG_INFO, 0); /* Log on syslog no stderr */
|
||||
clicon_log(LOG_NOTICE, "%s: %u Terminated\n", __PROGRAM__, getpid());
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -66,6 +66,15 @@
|
|||
#include "netconf_lib.h"
|
||||
#include "netconf_plugin.h"
|
||||
|
||||
/* Database dependency description */
|
||||
struct netconf_reg {
|
||||
qelem_t nr_qelem; /* List header */
|
||||
netconf_cb_t nr_callback; /* Validation/Commit Callback */
|
||||
void *nr_arg; /* Application specific argument to cb */
|
||||
char *nr_tag; /* Xml tag when matched, callback called */
|
||||
};
|
||||
typedef struct netconf_reg netconf_reg_t;
|
||||
|
||||
/*! Unload a plugin
|
||||
*/
|
||||
static int
|
||||
|
|
@ -245,10 +254,11 @@ catch:
|
|||
|
||||
/*! See if there is any callback registered for this tag
|
||||
*
|
||||
* @param xn Sub-tree (under xorig) at child of rpc: <rpc><xn></rpc>.
|
||||
* @param xf Output xml stream. For reply
|
||||
* @param xf_err Error xml stream. For error reply
|
||||
* @param xorig Original request.
|
||||
* @param[in] h clicon handle
|
||||
* @param[in] xn Sub-tree (under xorig) at child of rpc: <rpc><xn></rpc>.
|
||||
* @param[out] cb Output xml stream. For reply
|
||||
* @param[out] cb_err Error xml stream. For error reply
|
||||
* @param[out] xret Return XML, error or OK
|
||||
*
|
||||
* @retval -1 Error
|
||||
* @retval 0 OK, not found handler.
|
||||
|
|
@ -256,31 +266,24 @@ catch:
|
|||
*/
|
||||
int
|
||||
netconf_plugin_callbacks(clicon_handle h,
|
||||
cxobj *xn,
|
||||
cbuf *xf,
|
||||
cbuf *xf_err,
|
||||
cxobj *xorig)
|
||||
cxobj *xn,
|
||||
cxobj **xret)
|
||||
{
|
||||
netconf_reg_t *nr;
|
||||
netconf_reg_t *nreg;
|
||||
int retval;
|
||||
|
||||
if (deps == NULL)
|
||||
return 0;
|
||||
nr = deps;
|
||||
nreg = deps;
|
||||
do {
|
||||
if (strcmp(nr->nr_tag, xml_name(xn)) == 0){
|
||||
if ((retval = nr->nr_callback(h,
|
||||
xorig,
|
||||
xn,
|
||||
xf,
|
||||
xf_err,
|
||||
nr->nr_arg)) < 0)
|
||||
if (strcmp(nreg->nr_tag, xml_name(xn)) == 0){
|
||||
if ((retval = nreg->nr_callback(h, xn, xret, nreg->nr_arg)) < 0)
|
||||
return -1;
|
||||
else
|
||||
return 1; /* handled */
|
||||
}
|
||||
nr = NEXTQ(netconf_reg_t *, nr);
|
||||
} while (nr != deps);
|
||||
nreg = NEXTQ(netconf_reg_t *, nreg);
|
||||
} while (nreg != deps);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,14 +41,6 @@
|
|||
* Types
|
||||
*/
|
||||
|
||||
/* Database dependency description */
|
||||
struct netconf_reg {
|
||||
qelem_t nr_qelem; /* List header */
|
||||
netconf_cb_t nr_callback; /* Validation/Commit Callback */
|
||||
void *nr_arg; /* Application specific argument to cb */
|
||||
char *nr_tag; /* Xml tag when matched, callback called */
|
||||
};
|
||||
typedef struct netconf_reg netconf_reg_t;
|
||||
|
||||
/*
|
||||
* Prototypes
|
||||
|
|
@ -59,12 +51,6 @@ int netconf_plugin_start(clicon_handle h, int argc, char **argv);
|
|||
|
||||
int netconf_plugin_unload(clicon_handle h);
|
||||
|
||||
|
||||
int netconf_plugin_callbacks(clicon_handle h,
|
||||
// dbspec_key *dbspec,
|
||||
cxobj *xn,
|
||||
cbuf *xf,
|
||||
cbuf *xf_err,
|
||||
cxobj *xt);
|
||||
int netconf_plugin_callbacks(clicon_handle h, cxobj *xn, cxobj **xret);
|
||||
|
||||
#endif /* _NETCONF_PLUGIN_H_ */
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -42,20 +42,7 @@
|
|||
*/
|
||||
int
|
||||
netconf_rpc_dispatch(clicon_handle h,
|
||||
cxobj *xorig,
|
||||
cxobj *xn,
|
||||
cbuf *xf,
|
||||
cbuf *xf_err);
|
||||
|
||||
int netconf_create_rpc_reply(cbuf *xf, /* msg buffer */
|
||||
cxobj *xr, /* orig request */
|
||||
char *body, int ok);
|
||||
int netconf_create_rpc_error(cbuf *xf, /* msg buffer */
|
||||
cxobj *xr, /* orig request */
|
||||
char *tag,
|
||||
char *type,
|
||||
char *severity,
|
||||
char *message,
|
||||
char *info);
|
||||
cxobj *xn,
|
||||
cxobj **xret);
|
||||
|
||||
#endif /* _NETCONF_RPC_H_ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue