testing
This commit is contained in:
parent
fa20a9416b
commit
25d535703e
8 changed files with 76 additions and 47 deletions
27
CHANGELOG
27
CHANGELOG
|
|
@ -29,7 +29,34 @@
|
||||||
#
|
#
|
||||||
# ***** END LICENSE BLOCK *****
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
- The netconf support has been extended with lock/unlock
|
||||||
|
- clicon_rpc_call() has been removed and should be replaced by extending the
|
||||||
|
internal netconf protocol.
|
||||||
|
See downcall() function in example/routing_cli.c and
|
||||||
|
routing_downcall() in example/routing_backend.c
|
||||||
|
- Replace clicon_rpc_xmlput with clicon_rpc_edit_config
|
||||||
|
- Removed xmldb daemon. All xmldb acceses is made backend daemon.
|
||||||
|
No direct accesses by clients to xmldb API.
|
||||||
|
Instead use the rpc calls in clixon_proto_client.[ch]
|
||||||
|
In clients (eg cli/netconf) replace xmldb_get() in client code with
|
||||||
|
clicon_rpc_get_config().
|
||||||
|
If you use the vector arguments of xmldb_get(), replace as follows:
|
||||||
|
xmldb_get(h, db, api_path, &xt, &xvec, &xlen);
|
||||||
|
with
|
||||||
|
clicon_rpc_get_config(h, dbstr, api_path, &xt);
|
||||||
|
xpath_vec(xt, api_path, &xvec, &xlen)
|
||||||
|
|
||||||
|
- xmdlb_put_xkey() and xmldb_put_tree() have been folded into xmldb_put()
|
||||||
|
Replace xmldb_put_xkey with xmldb_put as follows:
|
||||||
|
xmldb_put_xkey(h, "candidate", cbuf_get(cb), str, OP_REPLACE);
|
||||||
|
with
|
||||||
|
clicon_xml_parse(&xml, "<config>%s</config>", str);
|
||||||
|
xmldb_put(h, "candidate", OP_REPLACE, cbuf_get(cb), xml);
|
||||||
|
xml_free(xml);
|
||||||
|
|
||||||
- Change internal protocol from clicon_proto.h to netconf.
|
- Change internal protocol from clicon_proto.h to netconf.
|
||||||
|
This means that the internal protocol defined in clixon_proto.[ch] is removed
|
||||||
|
|
||||||
- Netconf startup configuration support. Set CLICON_USE_STARTUP_CONFIG to 1 to
|
- Netconf startup configuration support. Set CLICON_USE_STARTUP_CONFIG to 1 to
|
||||||
enable. Eg, if backend_main is started with -CIr startup will be copied to
|
enable. Eg, if backend_main is started with -CIr startup will be copied to
|
||||||
running.
|
running.
|
||||||
|
|
|
||||||
|
|
@ -733,7 +733,7 @@ save_config_filev(clicon_handle h,
|
||||||
clicon_err(OE_CFG, errno, "Creating file %s", filename);
|
clicon_err(OE_CFG, errno, "Creating file %s", filename);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (clicon_xml2file(f, xt, 0, 0) < 0)
|
if (clicon_xml2file(f, xt, 0, 1) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,7 @@ Mapping netconf error-tag -> status code
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <assert.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <fcgi_stdio.h>
|
#include <fcgi_stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
@ -161,7 +162,7 @@ api_data_get_gen(clicon_handle h,
|
||||||
cbuf *cbx = NULL;
|
cbuf *cbx = NULL;
|
||||||
cxobj **vec = NULL;
|
cxobj **vec = NULL;
|
||||||
yang_spec *yspec;
|
yang_spec *yspec;
|
||||||
yang_stmt *y;
|
yang_stmt *y = NULL;
|
||||||
yang_stmt *ykey;
|
yang_stmt *ykey;
|
||||||
char *name;
|
char *name;
|
||||||
cvec *cvk = NULL; /* vector of index keys */
|
cvec *cvk = NULL; /* vector of index keys */
|
||||||
|
|
@ -189,6 +190,7 @@ api_data_get_gen(clicon_handle h,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
assert(y!=NULL);
|
||||||
if ((y = yang_find_syntax((yang_node*)y, name)) == NULL){
|
if ((y = yang_find_syntax((yang_node*)y, name)) == NULL){
|
||||||
clicon_err(OE_UNIX, errno, "No yang node found: %s", name);
|
clicon_err(OE_UNIX, errno, "No yang node found: %s", name);
|
||||||
goto done;
|
goto done;
|
||||||
|
|
|
||||||
|
|
@ -121,11 +121,6 @@ CLICON_BACKEND_PIDFILE localstatedir/APPNAME/APPNAME.pidfile
|
||||||
# Directory where "running", "candidate" and "startup" are placed
|
# Directory where "running", "candidate" and "startup" are placed
|
||||||
CLICON_XMLDB_DIR localstatedir/APPNAME
|
CLICON_XMLDB_DIR localstatedir/APPNAME
|
||||||
|
|
||||||
# CLICON_XMLDB_ADDR
|
|
||||||
|
|
||||||
# xmldb tcp port (if CLICON_XMLDB_RPC)
|
|
||||||
# CLICON_XMLDB_PORT
|
|
||||||
|
|
||||||
# Dont include keys in cvec in cli vars callbacks, ie a & k in 'a <b> k <c>' ignored
|
# Dont include keys in cvec in cli vars callbacks, ie a & k in 'a <b> k <c>' ignored
|
||||||
# CLICON_CLI_VARONLY 1
|
# CLICON_CLI_VARONLY 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,10 +59,6 @@ int clicon_rpc_commit(clicon_handle h);
|
||||||
int clicon_rpc_discard_changes(clicon_handle h);
|
int clicon_rpc_discard_changes(clicon_handle h);
|
||||||
int clicon_rpc_create_subscription(clicon_handle h, char *stream, char *filter,
|
int clicon_rpc_create_subscription(clicon_handle h, char *stream, char *filter,
|
||||||
int *s);
|
int *s);
|
||||||
|
|
||||||
int clicon_rpc_change(clicon_handle h, char *db,
|
|
||||||
enum operation_type op, char *key, char *val);
|
|
||||||
|
|
||||||
int clicon_rpc_debug(clicon_handle h, int level);
|
int clicon_rpc_debug(clicon_handle h, int level);
|
||||||
|
|
||||||
#endif /* _CLIXON_PROTO_CLIENT_H_ */
|
#endif /* _CLIXON_PROTO_CLIENT_H_ */
|
||||||
|
|
|
||||||
|
|
@ -963,11 +963,11 @@ xml_parse(char *str,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ya.ya_xparent = x_up;
|
ya.ya_xparent = x_up;
|
||||||
|
ya.ya_skipspace = 1; /* remove all non-terminal bodies (strip pretty-print) */
|
||||||
if (clixon_xml_parsel_init(&ya) < 0)
|
if (clixon_xml_parsel_init(&ya) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
if (clixon_xml_parseparse(&ya) != 0) /* yacc returns 1 on error */
|
if (clixon_xml_parseparse(&ya) != 0) /* yacc returns 1 on error */
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
clixon_xml_parsel_exit(&ya);
|
clixon_xml_parsel_exit(&ya);
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ struct xml_parse_yacc_arg{
|
||||||
|
|
||||||
cxobj *ya_xelement; /* xml active element */
|
cxobj *ya_xelement; /* xml active element */
|
||||||
cxobj *ya_xparent; /* xml parent element*/
|
cxobj *ya_xparent; /* xml parent element*/
|
||||||
int ya_skipspace; /* If set, translate successive space, \t \n with single space */
|
int ya_skipspace; /* If set, remove all non-terminal bodies (strip prettyr-print) */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char *clixon_xml_parsetext;
|
extern char *clixon_xml_parsetext;
|
||||||
|
|
|
||||||
|
|
@ -103,34 +103,19 @@ static int
|
||||||
xml_parse_content(struct xml_parse_yacc_arg *ya,
|
xml_parse_content(struct xml_parse_yacc_arg *ya,
|
||||||
char *str)
|
char *str)
|
||||||
{
|
{
|
||||||
int sz;
|
|
||||||
char s0;
|
|
||||||
cxobj *xn = ya->ya_xelement;
|
cxobj *xn = ya->ya_xelement;
|
||||||
cxobj *xp = ya->ya_xparent;
|
cxobj *xp = ya->ya_xparent;
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
|
||||||
ya->ya_xelement = NULL; /* init */
|
ya->ya_xelement = NULL; /* init */
|
||||||
s0 = str[0];
|
if (xn == NULL){
|
||||||
if (xn != NULL){
|
|
||||||
sz = strlen(xml_value(xn));
|
|
||||||
if (ya->ya_skipspace && (s0 == ' ' || s0 == '\n' || s0 == '\t')){
|
|
||||||
str[0] = ' ';
|
|
||||||
if (xml_value(xn)[sz-1] == ' ')
|
|
||||||
goto ok;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (ya->ya_skipspace && (s0 == ' ' || s0 == '\n' || s0 == '\t'))
|
|
||||||
goto ok;
|
|
||||||
if ((xn = xml_new("body", xp)) == NULL)
|
if ((xn = xml_new("body", xp)) == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
xml_type_set(xn, CX_BODY);
|
xml_type_set(xn, CX_BODY);
|
||||||
sz = 0;
|
|
||||||
}
|
}
|
||||||
if (xml_value_append(xn, str)==NULL)
|
if (xml_value_append(xn, str)==NULL)
|
||||||
goto done;
|
goto done;
|
||||||
ya->ya_xelement = xn;
|
ya->ya_xelement = xn;
|
||||||
ok:
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
return retval;
|
return retval;
|
||||||
|
|
@ -148,7 +133,6 @@ xml_parse_version(struct xml_parse_yacc_arg *ya, char *ver)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
xml_parse_id(struct xml_parse_yacc_arg *ya, char *name, char *namespace)
|
xml_parse_id(struct xml_parse_yacc_arg *ya, char *name, char *namespace)
|
||||||
{
|
{
|
||||||
|
|
@ -195,17 +179,30 @@ static int
|
||||||
xml_parse_bslash1(struct xml_parse_yacc_arg *ya, char *name)
|
xml_parse_bslash1(struct xml_parse_yacc_arg *ya, char *name)
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
cxobj *x = ya->ya_xelement;
|
||||||
|
cxobj *xc;
|
||||||
|
|
||||||
if (strcmp(xml_name(ya->ya_xelement), name)){
|
if (strcmp(xml_name(x), name)){
|
||||||
clicon_err(OE_XML, 0, "Sanity check failed: %s vs %s",
|
clicon_err(OE_XML, 0, "Sanity check failed: %s vs %s",
|
||||||
xml_name(ya->ya_xelement), name);
|
xml_name(x), name);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (xml_namespace(ya->ya_xelement)!=NULL){
|
if (xml_namespace(x)!=NULL){
|
||||||
clicon_err(OE_XML, 0, "Sanity check failed: %s:%s vs %s\n",
|
clicon_err(OE_XML, 0, "Sanity check failed: %s:%s vs %s\n",
|
||||||
xml_namespace(ya->ya_xelement), xml_name(ya->ya_xelement), name);
|
xml_namespace(x), xml_name(x), name);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* remove all non-terminal bodies (strip pretty-print) */
|
||||||
|
if (ya->ya_skipspace){
|
||||||
|
if (xml_child_nr(x) == 1 && (xml_type(xml_child_i(x, 0))==CX_BODY))
|
||||||
|
;
|
||||||
|
else{
|
||||||
|
xc = NULL;
|
||||||
|
while ((xc = xml_child_each(x, xc, CX_BODY)) != NULL)
|
||||||
|
xml_value_set(xc, ""); /* XXX remove */
|
||||||
|
}
|
||||||
|
}
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
free(name);
|
free(name);
|
||||||
|
|
@ -216,24 +213,36 @@ static int
|
||||||
xml_parse_bslash2(struct xml_parse_yacc_arg *ya, char *namespace, char *name)
|
xml_parse_bslash2(struct xml_parse_yacc_arg *ya, char *namespace, char *name)
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
cxobj *x = ya->ya_xelement;
|
||||||
|
cxobj *xc;
|
||||||
|
|
||||||
if (strcmp(xml_name(ya->ya_xelement), name)){
|
if (strcmp(xml_name(x), name)){
|
||||||
clicon_err(OE_XML, 0, "Sanity check failed: %s:%s vs %s:%s\n",
|
clicon_err(OE_XML, 0, "Sanity check failed: %s:%s vs %s:%s\n",
|
||||||
xml_namespace(ya->ya_xelement),
|
xml_namespace(x),
|
||||||
xml_name(ya->ya_xelement),
|
xml_name(x),
|
||||||
namespace,
|
namespace,
|
||||||
name);
|
name);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (xml_namespace(ya->ya_xelement)==NULL ||
|
if (xml_namespace(x)==NULL ||
|
||||||
strcmp(xml_namespace(ya->ya_xelement), namespace)){
|
strcmp(xml_namespace(x), namespace)){
|
||||||
clicon_err(OE_XML, 0, "Sanity check failed: %s:%s vs %s:%s\n",
|
clicon_err(OE_XML, 0, "Sanity check failed: %s:%s vs %s:%s\n",
|
||||||
xml_namespace(ya->ya_xelement),
|
xml_namespace(x),
|
||||||
xml_name(ya->ya_xelement),
|
xml_name(x),
|
||||||
namespace,
|
namespace,
|
||||||
name);
|
name);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
/* remove all non-terminal bodies (strip pretty-print) */
|
||||||
|
if (ya->ya_skipspace){
|
||||||
|
if (xml_child_nr(x) == 1 && (xml_type(xml_child_i(x, 0))==CX_BODY))
|
||||||
|
;
|
||||||
|
else{
|
||||||
|
xc = NULL;
|
||||||
|
while ((xc = xml_child_each(x, xc, CX_BODY)) != NULL)
|
||||||
|
xml_value_set(xc, ""); /* XXX remove */
|
||||||
|
}
|
||||||
|
}
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
done:
|
||||||
free(name);
|
free(name);
|
||||||
|
|
@ -301,7 +310,7 @@ emnt : '<' id attrs emnt1
|
||||||
;
|
;
|
||||||
|
|
||||||
id : NAME { if (xml_parse_id(_YA, $1, NULL) < 0) YYABORT;
|
id : NAME { if (xml_parse_id(_YA, $1, NULL) < 0) YYABORT;
|
||||||
clicon_debug(3, "id -> NAME");}
|
clicon_debug(3, "id -> NAME %s", $1);}
|
||||||
| NAME ':' NAME { if (xml_parse_id(_YA, $3, $1) < 0) YYABORT;
|
| NAME ':' NAME { if (xml_parse_id(_YA, $3, $1) < 0) YYABORT;
|
||||||
clicon_debug(3, "id -> NAME : NAME");}
|
clicon_debug(3, "id -> NAME : NAME");}
|
||||||
;
|
;
|
||||||
|
|
@ -315,8 +324,8 @@ emnt1 : ESLASH {_YA->ya_xelement = NULL;
|
||||||
;
|
;
|
||||||
|
|
||||||
etg : BSLASH NAME '>'
|
etg : BSLASH NAME '>'
|
||||||
{ if (xml_parse_bslash1(_YA, $2) < 0) YYABORT;
|
{ clicon_debug(3, "etg -> < </ NAME %s>", $2); if (xml_parse_bslash1(_YA, $2) < 0) YYABORT; }
|
||||||
clicon_debug(3, "etg -> < </ NAME >"); }
|
|
||||||
| BSLASH NAME ':' NAME '>'
|
| BSLASH NAME ':' NAME '>'
|
||||||
{ if (xml_parse_bslash2(_YA, $2, $4) < 0) YYABORT;
|
{ if (xml_parse_bslash2(_YA, $2, $4) < 0) YYABORT;
|
||||||
clicon_debug(3, "etg -> < </ NAME:NAME >"); }
|
clicon_debug(3, "etg -> < </ NAME:NAME >"); }
|
||||||
|
|
@ -329,7 +338,7 @@ list : list content { clicon_debug(3, "list -> list content"); }
|
||||||
content : emnt { clicon_debug(3, "content -> emnt"); }
|
content : emnt { clicon_debug(3, "content -> emnt"); }
|
||||||
| comment { clicon_debug(3, "content -> comment"); }
|
| comment { clicon_debug(3, "content -> comment"); }
|
||||||
| CHAR { if (xml_parse_content(_YA, $1) < 0) YYABORT;
|
| CHAR { if (xml_parse_content(_YA, $1) < 0) YYABORT;
|
||||||
clicon_debug(3, "content -> CHAR", $1); }
|
clicon_debug(3, "content -> CHAR %s", $1); }
|
||||||
| { clicon_debug(3, "content -> "); }
|
| { clicon_debug(3, "content -> "); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue