Configure (autoconf) changes: Removed libcurl dependency, Disable restconf and disable restconf options. Added empty text datastore
This commit is contained in:
parent
af334bb746
commit
2758a30bb7
15 changed files with 812 additions and 182 deletions
|
|
@ -29,7 +29,12 @@
|
||||||
#
|
#
|
||||||
# ***** END LICENSE BLOCK *****
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
- Removed curl dependency
|
- Added datastore 'text'
|
||||||
|
|
||||||
|
- Configure (autoconf) changes
|
||||||
|
Removed libcurl dependency
|
||||||
|
Disable restconf (and fastcgi) with configure --disable-restconf
|
||||||
|
Disable keyvalue datastore (and qdbm) with configure --disable-keyvalue
|
||||||
|
|
||||||
- Created xmldb plugin api
|
- Created xmldb plugin api
|
||||||
Moved qdbm, chunk and xmldb to datastore keyvalue directories
|
Moved qdbm, chunk and xmldb to datastore keyvalue directories
|
||||||
|
|
@ -37,10 +37,17 @@ CC = @CC@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
with_restconf = @with_restconf@
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
SUBDIRS = cli backend dbctrl netconf restconf
|
SUBDIRS = backend
|
||||||
|
SUBDIRS += cli
|
||||||
|
SUBDIRS += dbctrl
|
||||||
|
SUBDIRS += netconf
|
||||||
|
ifeq ($(with_restconf),yes)
|
||||||
|
SUBDIRS += restconf
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: all clean depend install $(SUBDIRS)
|
.PHONY: all clean depend install $(SUBDIRS)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -141,8 +141,8 @@ usage(char *argv0, clicon_handle h)
|
||||||
" -p \t\tPrint database yang specification\n"
|
" -p \t\tPrint database yang specification\n"
|
||||||
" -t \t\tPrint alternate spec translation (eg if YANG print KEY, if KEY print YANG)\n"
|
" -t \t\tPrint alternate spec translation (eg if YANG print KEY, if KEY print YANG)\n"
|
||||||
" -g <group>\tClient membership required to this group (default: %s)\n"
|
" -g <group>\tClient membership required to this group (default: %s)\n"
|
||||||
"\t-y <file>\tOverride yang spec file (dont include .yang suffix)\n"
|
" -y <file>\tOverride yang spec file (dont include .yang suffix)\n"
|
||||||
"\t-x <plugin>\tXMLDB plugin\n",
|
" -x <plugin>\tXMLDB plugin\n",
|
||||||
argv0,
|
argv0,
|
||||||
plgdir ? plgdir : "none",
|
plgdir ? plgdir : "none",
|
||||||
confsock ? confsock : "none",
|
confsock ? confsock : "none",
|
||||||
|
|
|
||||||
147
configure
vendored
147
configure
vendored
|
|
@ -632,6 +632,8 @@ CPP
|
||||||
OBJEXT
|
OBJEXT
|
||||||
EXEEXT
|
EXEEXT
|
||||||
ac_ct_CC
|
ac_ct_CC
|
||||||
|
with_keyvalue
|
||||||
|
with_restconf
|
||||||
RANLIB
|
RANLIB
|
||||||
AR
|
AR
|
||||||
EXE_SUFFIX
|
EXE_SUFFIX
|
||||||
|
|
@ -702,6 +704,8 @@ ac_subst_files=''
|
||||||
ac_user_opts='
|
ac_user_opts='
|
||||||
enable_option_checking
|
enable_option_checking
|
||||||
with_cligen
|
with_cligen
|
||||||
|
with_restconf
|
||||||
|
with_keyvalue
|
||||||
with_qdbm
|
with_qdbm
|
||||||
'
|
'
|
||||||
ac_precious_vars='build_alias
|
ac_precious_vars='build_alias
|
||||||
|
|
@ -1327,6 +1331,8 @@ Optional Packages:
|
||||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||||
--with-cligen=dir Use CLIGEN here
|
--with-cligen=dir Use CLIGEN here
|
||||||
|
--without-restconf disable support for restconf
|
||||||
|
--without-keyvalue disable support for key-value xmldb datastore
|
||||||
--with-qdbm=dir Use QDBM here
|
--with-qdbm=dir Use QDBM here
|
||||||
|
|
||||||
Some influential environment variables:
|
Some influential environment variables:
|
||||||
|
|
@ -2320,6 +2326,8 @@ test -n "$target_alias" &&
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# If yes, compile apps/restconf
|
||||||
|
# If yes, compile datastore/keyvalue
|
||||||
|
|
||||||
#
|
#
|
||||||
ac_ext=c
|
ac_ext=c
|
||||||
|
|
@ -3534,7 +3542,6 @@ if test "${with_cligen}"; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
|
||||||
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
|
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
|
||||||
if ${ac_cv_path_GREP+:} false; then :
|
if ${ac_cv_path_GREP+:} false; then :
|
||||||
|
|
@ -3859,21 +3866,92 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# This is for qdbm
|
# This is for restconf (and fastcgi)
|
||||||
|
|
||||||
|
# Check whether --with-restconf was given.
|
||||||
|
if test "${with_restconf+set}" = set; then :
|
||||||
|
withval=$with_restconf;
|
||||||
|
else
|
||||||
|
with_restconf=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x${with_restconf}" == xyes; then
|
||||||
|
# Lives in libfcgi-dev
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FCGX_Init in -lfcgi" >&5
|
||||||
|
$as_echo_n "checking for FCGX_Init in -lfcgi... " >&6; }
|
||||||
|
if ${ac_cv_lib_fcgi_FCGX_Init+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
ac_check_lib_save_LIBS=$LIBS
|
||||||
|
LIBS="-lfcgi $LIBS"
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any GCC internal prototype to avoid an error.
|
||||||
|
Use char because int might match the return type of a GCC
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
char FCGX_Init ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return FCGX_Init ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
ac_cv_lib_fcgi_FCGX_Init=yes
|
||||||
|
else
|
||||||
|
ac_cv_lib_fcgi_FCGX_Init=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
LIBS=$ac_check_lib_save_LIBS
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fcgi_FCGX_Init" >&5
|
||||||
|
$as_echo "$ac_cv_lib_fcgi_FCGX_Init" >&6; }
|
||||||
|
if test "x$ac_cv_lib_fcgi_FCGX_Init" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_LIBFCGI 1
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
LIBS="-lfcgi $LIBS"
|
||||||
|
|
||||||
|
else
|
||||||
|
as_fn_error $? "libfcgi-dev missing" "$LINENO" 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This is for keyvalue datastore (and qdbm)
|
||||||
|
|
||||||
|
# Check whether --with-keyvalue was given.
|
||||||
|
if test "${with_keyvalue+set}" = set; then :
|
||||||
|
withval=$with_keyvalue;
|
||||||
|
else
|
||||||
|
with_keyvalue=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x${with_keyvalue}" == xyes; then
|
||||||
|
echo "yes keyvalue"
|
||||||
|
# This is for qdbm
|
||||||
|
|
||||||
# Check whether --with-qdbm was given.
|
# Check whether --with-qdbm was given.
|
||||||
if test "${with_qdbm+set}" = set; then :
|
if test "${with_qdbm+set}" = set; then :
|
||||||
withval=$with_qdbm;
|
withval=$with_qdbm;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "${with_qdbm}"; then
|
if test "${with_qdbm}"; then
|
||||||
echo "Using QDBM here: ${with_qdbm}"
|
echo "Using QDBM here: ${with_qdbm}"
|
||||||
CPPFLAGS="-I${with_qdbm}/include ${CPPFLAGS}"
|
CPPFLAGS="-I${with_qdbm}/include ${CPPFLAGS}"
|
||||||
LDFLAGS="-L${with_qdbm}/lib ${LDFLAGS}"
|
LDFLAGS="-L${with_qdbm}/lib ${LDFLAGS}"
|
||||||
fi
|
fi
|
||||||
|
# Problem: depot.h may be in qdbm/depot.h.
|
||||||
# Problem: depot.h may be in qdbm/depot.h.
|
for ac_header in depot.h
|
||||||
for ac_header in depot.h
|
|
||||||
do :
|
do :
|
||||||
ac_fn_c_check_header_mongrel "$LINENO" "depot.h" "ac_cv_header_depot_h" "$ac_includes_default"
|
ac_fn_c_check_header_mongrel "$LINENO" "depot.h" "ac_cv_header_depot_h" "$ac_includes_default"
|
||||||
if test "x$ac_cv_header_depot_h" = xyes; then :
|
if test "x$ac_cv_header_depot_h" = xyes; then :
|
||||||
|
|
@ -3900,7 +3978,7 @@ fi
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dpopen in -lqdbm" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dpopen in -lqdbm" >&5
|
||||||
$as_echo_n "checking for dpopen in -lqdbm... " >&6; }
|
$as_echo_n "checking for dpopen in -lqdbm... " >&6; }
|
||||||
if ${ac_cv_lib_qdbm_dpopen+:} false; then :
|
if ${ac_cv_lib_qdbm_dpopen+:} false; then :
|
||||||
$as_echo_n "(cached) " >&6
|
$as_echo_n "(cached) " >&6
|
||||||
|
|
@ -3947,6 +4025,7 @@ else
|
||||||
as_fn_error $? "libqdbm-dev required" "$LINENO" 5
|
as_fn_error $? "libqdbm-dev required" "$LINENO" 5
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5
|
||||||
$as_echo_n "checking for crypt in -lcrypt... " >&6; }
|
$as_echo_n "checking for crypt in -lcrypt... " >&6; }
|
||||||
|
|
@ -4185,58 +4264,9 @@ fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
# Lives in libfcgi-dev
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FCGX_Init in -lfcgi" >&5
|
|
||||||
$as_echo_n "checking for FCGX_Init in -lfcgi... " >&6; }
|
|
||||||
if ${ac_cv_lib_fcgi_FCGX_Init+:} false; then :
|
|
||||||
$as_echo_n "(cached) " >&6
|
|
||||||
else
|
|
||||||
ac_check_lib_save_LIBS=$LIBS
|
|
||||||
LIBS="-lfcgi $LIBS"
|
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
||||||
/* end confdefs.h. */
|
|
||||||
|
|
||||||
/* Override any GCC internal prototype to avoid an error.
|
|
||||||
Use char because int might match the return type of a GCC
|
|
||||||
builtin and then its argument prototype would still apply. */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
#endif
|
|
||||||
char FCGX_Init ();
|
|
||||||
int
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
return FCGX_Init ();
|
|
||||||
;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
_ACEOF
|
|
||||||
if ac_fn_c_try_link "$LINENO"; then :
|
|
||||||
ac_cv_lib_fcgi_FCGX_Init=yes
|
|
||||||
else
|
|
||||||
ac_cv_lib_fcgi_FCGX_Init=no
|
|
||||||
fi
|
|
||||||
rm -f core conftest.err conftest.$ac_objext \
|
|
||||||
conftest$ac_exeext conftest.$ac_ext
|
|
||||||
LIBS=$ac_check_lib_save_LIBS
|
|
||||||
fi
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fcgi_FCGX_Init" >&5
|
|
||||||
$as_echo "$ac_cv_lib_fcgi_FCGX_Init" >&6; }
|
|
||||||
if test "x$ac_cv_lib_fcgi_FCGX_Init" = xyes; then :
|
|
||||||
cat >>confdefs.h <<_ACEOF
|
|
||||||
#define HAVE_LIBFCGI 1
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
LIBS="-lfcgi $LIBS"
|
|
||||||
|
|
||||||
else
|
|
||||||
as_fn_error $? "libfcgi-dev missing" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
ac_config_files="$ac_config_files Makefile lib/Makefile lib/src/Makefile lib/clixon/Makefile apps/Makefile apps/cli/Makefile apps/backend/Makefile apps/netconf/Makefile apps/restconf/Makefile apps/dbctrl/Makefile include/Makefile etc/Makefile etc/clixonrc example/Makefile example/docker/Makefile docker/Makefile docker/cli/Makefile docker/cli/Dockerfile docker/backend/Makefile docker/backend/Dockerfile docker/netconf/Makefile docker/netconf/Dockerfile datastore/Makefile datastore/keyvalue/Makefile datastore/text/Makefile doc/Makefile"
|
||||||
|
|
||||||
ac_config_files="$ac_config_files Makefile lib/Makefile lib/src/Makefile lib/clixon/Makefile apps/Makefile apps/cli/Makefile apps/backend/Makefile apps/netconf/Makefile apps/restconf/Makefile apps/dbctrl/Makefile include/Makefile etc/Makefile etc/clixonrc example/Makefile example/docker/Makefile docker/Makefile docker/cli/Makefile docker/cli/Dockerfile docker/backend/Makefile docker/backend/Dockerfile docker/netconf/Makefile docker/netconf/Dockerfile datastore/Makefile datastore/keyvalue/Makefile doc/Makefile"
|
|
||||||
|
|
||||||
cat >confcache <<\_ACEOF
|
cat >confcache <<\_ACEOF
|
||||||
# This file is a shell script that caches the results of configure
|
# This file is a shell script that caches the results of configure
|
||||||
|
|
@ -4953,6 +4983,7 @@ do
|
||||||
"docker/netconf/Dockerfile") CONFIG_FILES="$CONFIG_FILES docker/netconf/Dockerfile" ;;
|
"docker/netconf/Dockerfile") CONFIG_FILES="$CONFIG_FILES docker/netconf/Dockerfile" ;;
|
||||||
"datastore/Makefile") CONFIG_FILES="$CONFIG_FILES datastore/Makefile" ;;
|
"datastore/Makefile") CONFIG_FILES="$CONFIG_FILES datastore/Makefile" ;;
|
||||||
"datastore/keyvalue/Makefile") CONFIG_FILES="$CONFIG_FILES datastore/keyvalue/Makefile" ;;
|
"datastore/keyvalue/Makefile") CONFIG_FILES="$CONFIG_FILES datastore/keyvalue/Makefile" ;;
|
||||||
|
"datastore/text/Makefile") CONFIG_FILES="$CONFIG_FILES datastore/text/Makefile" ;;
|
||||||
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
|
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
|
||||||
|
|
||||||
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
||||||
|
|
|
||||||
39
configure.ac
39
configure.ac
|
|
@ -77,6 +77,8 @@ AC_SUBST(SH_SUFFIX)
|
||||||
AC_SUBST(EXE_SUFFIX)
|
AC_SUBST(EXE_SUFFIX)
|
||||||
AC_SUBST(AR)
|
AC_SUBST(AR)
|
||||||
AC_SUBST(RANLIB)
|
AC_SUBST(RANLIB)
|
||||||
|
AC_SUBST(with_restconf) # If yes, compile apps/restconf
|
||||||
|
AC_SUBST(with_keyvalue) # If yes, compile datastore/keyvalue
|
||||||
|
|
||||||
#
|
#
|
||||||
AC_PROG_CC()
|
AC_PROG_CC()
|
||||||
|
|
@ -119,23 +121,40 @@ if test "${with_cligen}"; then
|
||||||
LDFLAGS="-L${with_cligen}/lib ${LDFLAGS}"
|
LDFLAGS="-L${with_cligen}/lib ${LDFLAGS}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(cligen/cligen.h,, AC_MSG_ERROR(cligen missing. Try: git clone https://github.com/olofhagsand/cligen.git))
|
AC_CHECK_HEADERS(cligen/cligen.h,, AC_MSG_ERROR(cligen missing. Try: git clone https://github.com/olofhagsand/cligen.git))
|
||||||
|
|
||||||
AC_CHECK_LIB(:libcligen.so.${CLIGEN_VERSION}, cligen_init,, AC_MSG_ERROR([CLIgen${CLIGEN_VERSION} missing. Try: git clone https://github.com/olofhagsand/cligen.git]))
|
AC_CHECK_LIB(:libcligen.so.${CLIGEN_VERSION}, cligen_init,, AC_MSG_ERROR([CLIgen${CLIGEN_VERSION} missing. Try: git clone https://github.com/olofhagsand/cligen.git]))
|
||||||
|
|
||||||
# This is for qdbm
|
# This is for restconf (and fastcgi)
|
||||||
AC_ARG_WITH(qdbm, [ --with-qdbm=dir Use QDBM here ] )
|
AC_ARG_WITH([restconf],
|
||||||
if test "${with_qdbm}"; then
|
[AS_HELP_STRING([--without-restconf],[disable support for restconf])],
|
||||||
|
[],
|
||||||
|
[with_restconf=yes])
|
||||||
|
if test "x${with_restconf}" == xyes; then
|
||||||
|
# Lives in libfcgi-dev
|
||||||
|
AC_CHECK_LIB(fcgi, FCGX_Init,, AC_MSG_ERROR([libfcgi-dev missing]))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This is for keyvalue datastore (and qdbm)
|
||||||
|
AC_ARG_WITH([keyvalue],
|
||||||
|
[AS_HELP_STRING([--without-keyvalue],[disable support for key-value xmldb datastore])],
|
||||||
|
[],
|
||||||
|
[with_keyvalue=yes])
|
||||||
|
|
||||||
|
if test "x${with_keyvalue}" == xyes; then
|
||||||
|
echo "yes keyvalue"
|
||||||
|
# This is for qdbm
|
||||||
|
AC_ARG_WITH(qdbm, [ --with-qdbm=dir Use QDBM here, if keyvalue ] )
|
||||||
|
if test "${with_qdbm}"; then
|
||||||
echo "Using QDBM here: ${with_qdbm}"
|
echo "Using QDBM here: ${with_qdbm}"
|
||||||
CPPFLAGS="-I${with_qdbm}/include ${CPPFLAGS}"
|
CPPFLAGS="-I${with_qdbm}/include ${CPPFLAGS}"
|
||||||
LDFLAGS="-L${with_qdbm}/lib ${LDFLAGS}"
|
LDFLAGS="-L${with_qdbm}/lib ${LDFLAGS}"
|
||||||
|
fi
|
||||||
|
# Problem: depot.h may be in qdbm/depot.h.
|
||||||
|
AC_CHECK_HEADERS(depot.h,,[AC_CHECK_HEADERS(qdbm/depot.h,,AC_MSG_ERROR(libqdbm-dev required))])
|
||||||
|
AC_CHECK_LIB(qdbm, dpopen,, AC_MSG_ERROR(libqdbm-dev required))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Problem: depot.h may be in qdbm/depot.h.
|
|
||||||
AC_CHECK_HEADERS(depot.h,,[AC_CHECK_HEADERS(qdbm/depot.h,,AC_MSG_ERROR(libqdbm-dev required))])
|
|
||||||
AC_CHECK_LIB(qdbm, dpopen,, AC_MSG_ERROR(libqdbm-dev required))
|
|
||||||
|
|
||||||
AC_CHECK_LIB(crypt, crypt)
|
AC_CHECK_LIB(crypt, crypt)
|
||||||
AC_CHECK_HEADERS(crypt.h)
|
AC_CHECK_HEADERS(crypt.h)
|
||||||
|
|
||||||
|
|
@ -153,9 +172,6 @@ AC_CHECK_LIB(dl, dlopen)
|
||||||
|
|
||||||
AC_CHECK_FUNCS(inet_aton sigaction sigvec strlcpy strsep strndup alphasort versionsort strverscmp)
|
AC_CHECK_FUNCS(inet_aton sigaction sigvec strlcpy strsep strndup alphasort versionsort strverscmp)
|
||||||
|
|
||||||
# Lives in libfcgi-dev
|
|
||||||
AC_CHECK_LIB(fcgi, FCGX_Init,, AC_MSG_ERROR([libfcgi-dev missing]))
|
|
||||||
|
|
||||||
AH_BOTTOM([#include <clixon_custom.h>])
|
AH_BOTTOM([#include <clixon_custom.h>])
|
||||||
|
|
||||||
AC_OUTPUT(Makefile
|
AC_OUTPUT(Makefile
|
||||||
|
|
@ -182,6 +198,7 @@ AC_OUTPUT(Makefile
|
||||||
docker/netconf/Dockerfile
|
docker/netconf/Dockerfile
|
||||||
datastore/Makefile
|
datastore/Makefile
|
||||||
datastore/keyvalue/Makefile
|
datastore/keyvalue/Makefile
|
||||||
|
datastore/text/Makefile
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,10 +37,15 @@ CC = @CC@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
|
with_restconf = @with_restconf@
|
||||||
|
with_keyvalue = @with_keyvalue@
|
||||||
|
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
SUBDIRS = keyvalue
|
SUBDIRS = text
|
||||||
|
ifeq ($(with_keyvalue),yes)
|
||||||
|
SUBDIRS += keyvalue
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: all clean depend install $(SUBDIRS)
|
.PHONY: all clean depend install $(SUBDIRS)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ LIBS = @LIBS@
|
||||||
DATASTORE = keyvalue
|
DATASTORE = keyvalue
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
|
||||||
INCLUDES = -I. @INCLUDES@ -I$(top_srcdir)/lib/clixon -I$(top_srcdir)/include -I$(top_srcdir)
|
INCLUDES = -I. -I$(top_srcdir)/lib -I$(top_srcdir)/include -I$(top_srcdir) @INCLUDES@
|
||||||
|
|
||||||
PLUGIN = $(DATASTORE).so
|
PLUGIN = $(DATASTORE).so
|
||||||
|
|
||||||
|
|
@ -63,9 +63,6 @@ all: $(PLUGIN)
|
||||||
|
|
||||||
-include $(DESTDIR)$(datarootdir)/clixon/clixon.mk
|
-include $(DESTDIR)$(datarootdir)/clixon/clixon.mk
|
||||||
|
|
||||||
#grideye_sysinfo.so.1: grideye_sysinfo.c
|
|
||||||
# $(CC) $(CFLAGS) -shared -o $@ -lc $^ -lm
|
|
||||||
|
|
||||||
$(PLUGIN): $(SRC)
|
$(PLUGIN): $(SRC)
|
||||||
$(CC) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) -shared -o $@ -lc $^ $(LIBS)
|
$(CC) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) -shared -o $@ -lc $^ $(LIBS)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
ensure errno is set and return -1/NULL */
|
ensure errno is set and return -1/NULL */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
@ -45,7 +46,11 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
/* clicon */
|
/* clicon */
|
||||||
#include "clixon_queue.h"
|
#include <cligen/cligen.h>
|
||||||
|
|
||||||
|
/* clicon */
|
||||||
|
#include <clixon/clixon.h>
|
||||||
|
|
||||||
#include "clixon_chunk.h"
|
#include "clixon_chunk.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -1552,7 +1552,7 @@ kv_init(clicon_handle h,
|
||||||
|
|
||||||
/*! plugin init function */
|
/*! plugin init function */
|
||||||
int
|
int
|
||||||
keyvalue_plugin_exit(void)
|
kv_plugin_exit(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1577,7 +1577,7 @@ static const struct xmldb_api api = {
|
||||||
1,
|
1,
|
||||||
XMLDB_API_MAGIC,
|
XMLDB_API_MAGIC,
|
||||||
clixon_xmldb_plugin_init,
|
clixon_xmldb_plugin_init,
|
||||||
keyvalue_plugin_exit,
|
kv_plugin_exit,
|
||||||
kv_get,
|
kv_get,
|
||||||
kv_put,
|
kv_put,
|
||||||
kv_dump,
|
kv_dump,
|
||||||
|
|
|
||||||
|
|
@ -78,9 +78,8 @@
|
||||||
#include <cligen/cligen.h>
|
#include <cligen/cligen.h>
|
||||||
|
|
||||||
/* clicon */
|
/* clicon */
|
||||||
#include "clixon_log.h"
|
#include <clixon/clixon.h>
|
||||||
#include "clixon_err.h"
|
|
||||||
#include "clixon_queue.h"
|
|
||||||
#include "clixon_chunk.h"
|
#include "clixon_chunk.h"
|
||||||
#include "clixon_qdb.h"
|
#include "clixon_qdb.h"
|
||||||
|
|
||||||
|
|
|
||||||
97
datastore/text/Makefile.in
Normal file
97
datastore/text/Makefile.in
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
#
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
#
|
||||||
|
# Copyright (C) 2009-2017 Olof Hagsand and Benny Holmgren
|
||||||
|
#
|
||||||
|
# This file is part of CLIXON
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
# Alternatively, the contents of this file may be used under the terms of
|
||||||
|
# the GNU General Public License Version 3 or later (the "GPL"),
|
||||||
|
# in which case the provisions of the GPL are applicable instead
|
||||||
|
# of those above. If you wish to allow use of your version of this file only
|
||||||
|
# under the terms of the GPL, and not to allow others to
|
||||||
|
# use your version of this file under the terms of Apache License version 2,
|
||||||
|
# indicate your decision by deleting the provisions above and replace them with
|
||||||
|
# the notice and other provisions required by the GPL. If you do not delete
|
||||||
|
# the provisions above, a recipient may use your version of this file under
|
||||||
|
# the terms of any one of the Apache License version 2 or the GPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
#
|
||||||
|
prefix = @prefix@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
bindir = @bindir@
|
||||||
|
libdir = @libdir@
|
||||||
|
dbdir = @prefix@/db
|
||||||
|
mandir = @mandir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
|
||||||
|
VPATH = @srcdir@
|
||||||
|
CC = @CC@
|
||||||
|
CFLAGS = @CFLAGS@ -rdynamic -fPIC
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
DATASTORE = text
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
|
||||||
|
INCLUDES = -I. -I$(top_srcdir)/lib -I$(top_srcdir)/include -I$(top_srcdir) @INCLUDES@
|
||||||
|
|
||||||
|
PLUGIN = $(DATASTORE).so
|
||||||
|
|
||||||
|
SRC = clixon_xmldb_text.c
|
||||||
|
|
||||||
|
OBJS = $(SRC:.c=.o)
|
||||||
|
|
||||||
|
all: $(PLUGIN)
|
||||||
|
|
||||||
|
-include $(DESTDIR)$(datarootdir)/clixon/clixon.mk
|
||||||
|
|
||||||
|
$(PLUGIN): $(SRC)
|
||||||
|
$(CC) $(CPPFLAGS) $(INCLUDES) $(CFLAGS) -shared -o $@ -lc $^ $(LIBS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(PLUGIN) $(OBJS) *.core
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f Makefile *~ .depend
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
.c.o: $(SRC)
|
||||||
|
$(CC) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $<
|
||||||
|
|
||||||
|
install: $(PLUGIN)
|
||||||
|
install -d $(DESTDIR)$(clixon_LIBDIR)/xmldb
|
||||||
|
install $(PLUGIN) $(DESTDIR)$(clixon_LIBDIR)/xmldb;
|
||||||
|
|
||||||
|
install-include:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -rf $(DESTDIR)$(clixon_LIBDIR)/xmldb/$(PLUGIN);
|
||||||
|
|
||||||
|
TAGS:
|
||||||
|
find . -name '*.[chyl]' -print | etags -
|
||||||
|
|
||||||
|
depend:
|
||||||
|
$(CC) $(DEPENDFLAGS) @DEFS@ $(INCLUDES) $(CFLAGS) -MM $(SRC) > .depend
|
||||||
|
|
||||||
|
#include .depend
|
||||||
|
|
||||||
501
datastore/text/clixon_xmldb_text.c
Normal file
501
datastore/text/clixon_xmldb_text.c
Normal file
|
|
@ -0,0 +1,501 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
***** BEGIN LICENSE BLOCK *****
|
||||||
|
|
||||||
|
Copyright (C) 2009-2017 Olof Hagsand and Benny Holmgren
|
||||||
|
|
||||||
|
This file is part of CLIXON.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
Alternatively, the contents of this file may be used under the terms of
|
||||||
|
the GNU General Public License Version 3 or later (the "GPL"),
|
||||||
|
in which case the provisions of the GPL are applicable instead
|
||||||
|
of those above. If you wish to allow use of your version of this file only
|
||||||
|
under the terms of the GPL, and not to allow others to
|
||||||
|
use your version of this file under the terms of Apache License version 2,
|
||||||
|
indicate your decision by deleting the provisions above and replace them with
|
||||||
|
the notice and other provisions required by the GPL. If you do not delete
|
||||||
|
the provisions above, a recipient may use your version of this file under
|
||||||
|
the terms of any one of the Apache License version 2 or the GPL.
|
||||||
|
|
||||||
|
***** END LICENSE BLOCK *****
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "clixon_config.h" /* generated by config & autoconf */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <fnmatch.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
|
/* cligen */
|
||||||
|
#include <cligen/cligen.h>
|
||||||
|
|
||||||
|
/* clicon */
|
||||||
|
#include <clixon/clixon.h>
|
||||||
|
|
||||||
|
#include "clixon_xmldb_text.h"
|
||||||
|
|
||||||
|
/*! Database locking for candidate and running non-persistent
|
||||||
|
* Store an integer for running and candidate containing
|
||||||
|
* the session-id of the client holding the lock.
|
||||||
|
*/
|
||||||
|
static int _running_locked = 0;
|
||||||
|
static int _candidate_locked = 0;
|
||||||
|
static int _startup_locked = 0;
|
||||||
|
|
||||||
|
/*! Translate from symbolic database name to actual filename in file-system
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Symbolic database name, eg "candidate", "running"
|
||||||
|
* @param[out] filename Filename. Unallocate after use with free()
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
|
* @note Could need a way to extend which databases exists, eg to register new.
|
||||||
|
* The currently allowed databases are:
|
||||||
|
* candidate, tmp, running, result
|
||||||
|
* The filename reside in CLICON_XMLDB_DIR option
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
db2file(clicon_handle h,
|
||||||
|
char *db,
|
||||||
|
char **filename)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
cbuf *cb;
|
||||||
|
char *dir;
|
||||||
|
|
||||||
|
if ((cb = cbuf_new()) == NULL){
|
||||||
|
clicon_err(OE_XML, errno, "cbuf_new");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if ((dir = clicon_xmldb_dir(h)) == NULL){
|
||||||
|
clicon_err(OE_XML, errno, "CLICON_XMLDB_DIR not set");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (strcmp(db, "running") != 0 &&
|
||||||
|
strcmp(db, "candidate") != 0 &&
|
||||||
|
strcmp(db, "startup") != 0 &&
|
||||||
|
strcmp(db, "tmp") != 0){
|
||||||
|
clicon_err(OE_XML, 0, "Unexpected database: %s", db);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
cprintf(cb, "%s/%s_db", dir, db);
|
||||||
|
if ((*filename = strdup4(cbuf_get(cb))) == NULL){
|
||||||
|
clicon_err(OE_UNIX, errno, "strdup");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
retval = 0;
|
||||||
|
done:
|
||||||
|
if (cb)
|
||||||
|
cbuf_free(cb);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Get content of database using xpath. return a set of matching sub-trees
|
||||||
|
* The function returns a minimal tree that includes all sub-trees that match
|
||||||
|
* xpath.
|
||||||
|
* @param[in] dbname Name of database to search in (filename including dir path
|
||||||
|
* @param[in] xpath String with XPATH syntax. or NULL for all
|
||||||
|
* @param[in] yspec Yang specification
|
||||||
|
* @param[out] xtop Single XML tree which xvec points to. Free with xml_free()
|
||||||
|
* @param[out] xvec Vector of xml trees. Free after use.
|
||||||
|
* @param[out] xlen Length of vector.
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
|
* @code
|
||||||
|
* cxobj *xt;
|
||||||
|
* cxobj **xvec;
|
||||||
|
* size_t xlen;
|
||||||
|
* yang_spec *yspec = clicon_dbspec_yang(h);
|
||||||
|
* if (xmldb_get("running", "/interfaces/interface[name="eth"]",
|
||||||
|
* &xt, &xvec, &xlen) < 0)
|
||||||
|
* err;
|
||||||
|
* for (i=0; i<xlen; i++){
|
||||||
|
* xn = xv[i];
|
||||||
|
* ...
|
||||||
|
* }
|
||||||
|
* xml_free(xt);
|
||||||
|
* free(xvec);
|
||||||
|
* @endcode
|
||||||
|
* @note if xvec is given, then purge tree, if not return whole tree.
|
||||||
|
* @see xpath_vec
|
||||||
|
* @see xmldb_get
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_get(clicon_handle h,
|
||||||
|
char *db,
|
||||||
|
char *xpath,
|
||||||
|
cxobj **xtop,
|
||||||
|
cxobj ***xvec0,
|
||||||
|
size_t *xlen0)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
// done:
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! Modify database provided an xml tree and an operation
|
||||||
|
*
|
||||||
|
* @param[in] h CLICON handle
|
||||||
|
* @param[in] db running or candidate
|
||||||
|
* @param[in] xt xml-tree. Top-level symbol is dummy
|
||||||
|
* @param[in] op OP_MERGE: just add it.
|
||||||
|
* OP_REPLACE: first delete whole database
|
||||||
|
* OP_NONE: operation attribute in xml determines operation
|
||||||
|
* @param[in] api_path According to restconf (Sec 3.5.1.1 in [restconf-draft 13])
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
|
* The xml may contain the "operation" attribute which defines the operation.
|
||||||
|
* @code
|
||||||
|
* cxobj *xt;
|
||||||
|
* if (clicon_xml_parse_str("<a>17</a>", &xt) < 0)
|
||||||
|
* err;
|
||||||
|
* if (xmldb_put(h, "running", OP_MERGE, NULL, xt) < 0)
|
||||||
|
* err;
|
||||||
|
* @endcode
|
||||||
|
* @see xmldb_put_xkey for single key
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_put(clicon_handle h,
|
||||||
|
char *db,
|
||||||
|
enum operation_type op,
|
||||||
|
char *api_path,
|
||||||
|
cxobj *xt)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
retval = 0;
|
||||||
|
// done:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Raw dump of database, just keys and values, no xml interpretation
|
||||||
|
* @param[in] f File
|
||||||
|
* @param[in] dbfile File-name of database. This is a local file
|
||||||
|
* @param[in] rxkey Key regexp, eg "^.*$"
|
||||||
|
* @note This function can only be called locally.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_dump(FILE *f,
|
||||||
|
char *dbfilename,
|
||||||
|
char *rxkey)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
// done:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Copy database from db1 to db2
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] from Source database copy
|
||||||
|
* @param[in] to Destination database
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 OK
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_copy(clicon_handle h,
|
||||||
|
char *from,
|
||||||
|
char *to)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
retval = 0;
|
||||||
|
// done:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Lock database
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Database
|
||||||
|
* @param[in] pid Process id
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 OK
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_lock(clicon_handle h,
|
||||||
|
char *db,
|
||||||
|
int pid)
|
||||||
|
{
|
||||||
|
if (strcmp("running", db) == 0)
|
||||||
|
_running_locked = pid;
|
||||||
|
else if (strcmp("candidate", db) == 0)
|
||||||
|
_candidate_locked = pid;
|
||||||
|
else if (strcmp("startup", db) == 0)
|
||||||
|
_startup_locked = pid;
|
||||||
|
clicon_debug(1, "%s: locked by %u", db, pid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Unlock database
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Database
|
||||||
|
* @param[in] pid Process id
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 OK
|
||||||
|
* Assume all sanity checks have been made
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_unlock(clicon_handle h,
|
||||||
|
char *db,
|
||||||
|
int pid)
|
||||||
|
{
|
||||||
|
if (strcmp("running", db) == 0)
|
||||||
|
_running_locked = 0;
|
||||||
|
else if (strcmp("candidate", db) == 0)
|
||||||
|
_candidate_locked = 0;
|
||||||
|
else if (strcmp("startup", db) == 0)
|
||||||
|
_startup_locked = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Unlock all databases locked by pid (eg process dies)
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] pid Process / Session id
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 Ok
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_unlock_all(clicon_handle h,
|
||||||
|
int pid)
|
||||||
|
{
|
||||||
|
if (_running_locked == pid)
|
||||||
|
_running_locked = 0;
|
||||||
|
if (_candidate_locked == pid)
|
||||||
|
_candidate_locked = 0;
|
||||||
|
if (_startup_locked == pid)
|
||||||
|
_startup_locked = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Check if database is locked
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Database
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 Not locked
|
||||||
|
* @retval >0 Id of locker
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_islocked(clicon_handle h,
|
||||||
|
char *db)
|
||||||
|
{
|
||||||
|
if (strcmp("running", db) == 0)
|
||||||
|
return (_running_locked);
|
||||||
|
else if (strcmp("candidate", db) == 0)
|
||||||
|
return(_candidate_locked);
|
||||||
|
else if (strcmp("startup", db) == 0)
|
||||||
|
return(_startup_locked);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Check if db exists
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Database
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 No it does not exist
|
||||||
|
* @retval 1 Yes it exists
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_exists(clicon_handle h,
|
||||||
|
char *db)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
char *filename = NULL;
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
if (db2file(h, db, &filename) < 0)
|
||||||
|
goto done;
|
||||||
|
if (lstat(filename, &sb) < 0)
|
||||||
|
retval = 0;
|
||||||
|
else
|
||||||
|
retval = 1;
|
||||||
|
done:
|
||||||
|
if (filename)
|
||||||
|
free(filename);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Delete database. Remove file
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Database
|
||||||
|
* @retval -1 Error
|
||||||
|
* @retval 0 OK
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_delete(clicon_handle h,
|
||||||
|
char *db)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
// done:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Initialize database
|
||||||
|
* @param[in] h Clicon handle
|
||||||
|
* @param[in] db Database
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
text_init(clicon_handle h,
|
||||||
|
char *db)
|
||||||
|
{
|
||||||
|
int retval = -1;
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
// done:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! plugin init function */
|
||||||
|
int
|
||||||
|
text_plugin_exit(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct xmldb_api api;
|
||||||
|
|
||||||
|
/*! plugin init function */
|
||||||
|
void *
|
||||||
|
clixon_xmldb_plugin_init(int version)
|
||||||
|
{
|
||||||
|
if (version != XMLDB_API_VERSION){
|
||||||
|
clicon_err(OE_DB, 0, "Invalid version %d expected %d",
|
||||||
|
version, XMLDB_API_VERSION);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
return (void*)&api;
|
||||||
|
done:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct xmldb_api api = {
|
||||||
|
1,
|
||||||
|
XMLDB_API_MAGIC,
|
||||||
|
clixon_xmldb_plugin_init,
|
||||||
|
text_plugin_exit,
|
||||||
|
text_get,
|
||||||
|
text_put,
|
||||||
|
text_dump,
|
||||||
|
text_copy,
|
||||||
|
text_lock,
|
||||||
|
text_unlock,
|
||||||
|
text_unlock_all,
|
||||||
|
text_islocked,
|
||||||
|
text_exists,
|
||||||
|
text_delete,
|
||||||
|
text_init,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 /* Test program */
|
||||||
|
/*
|
||||||
|
* Turn this on to get an xpath test program
|
||||||
|
* Usage: clicon_xpath [<xpath>]
|
||||||
|
* read xml from input
|
||||||
|
* Example compile:
|
||||||
|
gcc -g -o xmldb -I. -I../clixon ./clixon_xmldb.c -lclixon -lcligen
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
usage(char *argv0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage:\n%s\tget <db> <yangdir> <yangmod> [<xpath>]\t\txml on stdin\n", argv0);
|
||||||
|
fprintf(stderr, "\tput <db> <yangdir> <yangmod> set|merge|delete\txml to stdout\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
cxobj *xt;
|
||||||
|
cxobj *xn;
|
||||||
|
char *xpath;
|
||||||
|
enum operation_type op;
|
||||||
|
char *cmd;
|
||||||
|
char *db;
|
||||||
|
char *yangdir;
|
||||||
|
char *yangmod;
|
||||||
|
yang_spec *yspec = NULL;
|
||||||
|
clicon_handle h;
|
||||||
|
|
||||||
|
if ((h = clicon_handle_init()) == NULL)
|
||||||
|
goto done;
|
||||||
|
clicon_log_init("xmldb", LOG_DEBUG, CLICON_LOG_STDERR);
|
||||||
|
if (argc < 4){
|
||||||
|
usage(argv[0]);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
cmd = argv[1];
|
||||||
|
db = argv[2];
|
||||||
|
yangdir = argv[3];
|
||||||
|
yangmod = argv[4];
|
||||||
|
db_init(db);
|
||||||
|
if ((yspec = yspec_new()) == NULL)
|
||||||
|
goto done
|
||||||
|
if (yang_parse(h, yangdir, yangmod, NULL, yspec) < 0)
|
||||||
|
goto done;
|
||||||
|
if (strcmp(cmd, "get")==0){
|
||||||
|
if (argc < 5)
|
||||||
|
usage(argv[0]);
|
||||||
|
xpath = argc>5?argv[5]:NULL;
|
||||||
|
if (xmldb_get(h, db, xpath, &xt, NULL, NULL) < 0)
|
||||||
|
goto done;
|
||||||
|
clicon_xml2file(stdout, xt, 0, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (strcmp(cmd, "put")==0){
|
||||||
|
if (argc != 6)
|
||||||
|
usage(argv[0]);
|
||||||
|
if (clicon_xml_parse_file(0, &xt, "</clicon>") < 0)
|
||||||
|
goto done;
|
||||||
|
if (xml_rootchild(xt, 0, &xn) < 0)
|
||||||
|
goto done;
|
||||||
|
if (strcmp(argv[5], "set") == 0)
|
||||||
|
op = OP_REPLACE;
|
||||||
|
else
|
||||||
|
if (strcmp(argv[4], "merge") == 0)
|
||||||
|
op = OP_MERGE;
|
||||||
|
else if (strcmp(argv[5], "delete") == 0)
|
||||||
|
op = OP_REMOVE;
|
||||||
|
else
|
||||||
|
usage(argv[0]);
|
||||||
|
if (xmldb_put(h, db, op, NULL, xn) < 0)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
usage(argv[0]);
|
||||||
|
printf("\n");
|
||||||
|
done:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Test program */
|
||||||
56
datastore/text/clixon_xmldb_text.h
Normal file
56
datastore/text/clixon_xmldb_text.h
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
***** BEGIN LICENSE BLOCK *****
|
||||||
|
|
||||||
|
Copyright (C) 2009-2017 Olof Hagsand and Benny Holmgren
|
||||||
|
|
||||||
|
This file is part of CLIXON.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
Alternatively, the contents of this file may be used under the terms of
|
||||||
|
the GNU General Public License Version 3 or later (the "GPL"),
|
||||||
|
in which case the provisions of the GPL are applicable instead
|
||||||
|
of those above. If you wish to allow use of your version of this file only
|
||||||
|
under the terms of the GPL, and not to allow others to
|
||||||
|
use your version of this file under the terms of Apache License version 2,
|
||||||
|
indicate your decision by deleting the provisions above and replace them with
|
||||||
|
the notice and other provisions required by the GPL. If you do not delete
|
||||||
|
the provisions above, a recipient may use your version of this file under
|
||||||
|
the terms of any one of the Apache License version 2 or the GPL.
|
||||||
|
|
||||||
|
***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
Key-value store
|
||||||
|
*/
|
||||||
|
#ifndef _CLIXON_XMLDB_TEXT_H
|
||||||
|
#define _CLIXON_XMLDB_TEXT_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prototypes
|
||||||
|
*/
|
||||||
|
int text_get(clicon_handle h, char *db, char *xpath,
|
||||||
|
cxobj **xtop, cxobj ***xvec, size_t *xlen);
|
||||||
|
int text_put(clicon_handle h, char *db, enum operation_type op,
|
||||||
|
char *api_path, cxobj *xt);
|
||||||
|
int text_dump(FILE *f, char *dbfilename, char *rxkey);
|
||||||
|
int text_copy(clicon_handle h, char *from, char *to);
|
||||||
|
int text_lock(clicon_handle h, char *db, int pid);
|
||||||
|
int text_unlock(clicon_handle h, char *db, int pid);
|
||||||
|
int text_unlock_all(clicon_handle h, int pid);
|
||||||
|
int text_islocked(clicon_handle h, char *db);
|
||||||
|
int text_exists(clicon_handle h, char *db);
|
||||||
|
int text_delete(clicon_handle h, char *db);
|
||||||
|
int text_init(clicon_handle h, char *db);
|
||||||
|
|
||||||
|
#endif /* _CLIXON_XMLDB_TEXT_H */
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
/* lib/clixon/clixon.h. Generated from clixon.h.in by configure. */
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
***** BEGIN LICENSE BLOCK *****
|
|
||||||
|
|
||||||
Copyright (C) 2009-2017 Olof Hagsand and Benny Holmgren
|
|
||||||
|
|
||||||
This file is part of CLIXON.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
Alternatively, the contents of this file may be used under the terms of
|
|
||||||
the GNU General Public License Version 3 or later (the "GPL"),
|
|
||||||
in which case the provisions of the GPL are applicable instead
|
|
||||||
of those above. If you wish to allow use of your version of this file only
|
|
||||||
under the terms of the GPL, and not to allow others to
|
|
||||||
use your version of this file under the terms of Apache License version 2,
|
|
||||||
indicate your decision by deleting the provisions above and replace them with
|
|
||||||
the notice and other provisions required by the GPL. If you do not delete
|
|
||||||
the provisions above, a recipient may use your version of this file under
|
|
||||||
the terms of any one of the Apache License version 2 or the GPL.
|
|
||||||
|
|
||||||
***** END LICENSE BLOCK *****
|
|
||||||
|
|
||||||
* Meta-include file that includes all sub-files in control-lib
|
|
||||||
* Note: this include files is for external purposes. Do not include this
|
|
||||||
* file in clicon lib-routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This include file requires the following include file dependencies */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CLIXON version macros
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define CLIXON_VERSION_STRING "3.2.0"
|
|
||||||
#define CLIXON_VERSION_MAJOR 3
|
|
||||||
#define CLIXON_VERSION_MINOR 2
|
|
||||||
#define CLIXON_VERSION_PATCH 0
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use this constant to disable some prototypes that should not be visible outside the lib.
|
|
||||||
* This is an alternative to use separate internal include files.
|
|
||||||
*/
|
|
||||||
#define LIBCLIXON_API 1
|
|
||||||
|
|
||||||
#include <clixon/clixon_sig.h>
|
|
||||||
#include <clixon/clixon_log.h>
|
|
||||||
#include <clixon/clixon_err.h>
|
|
||||||
#include <clixon/clixon_queue.h>
|
|
||||||
#include <clixon/clixon_hash.h>
|
|
||||||
#include <clixon/clixon_handle.h>
|
|
||||||
#include <clixon/clixon_yang.h>
|
|
||||||
#include <clixon/clixon_yang_type.h>
|
|
||||||
#include <clixon/clixon_event.h>
|
|
||||||
#include <clixon/clixon_string.h>
|
|
||||||
#include <clixon/clixon_file.h>
|
|
||||||
#include <clixon/clixon_xml.h>
|
|
||||||
#include <clixon/clixon_proto.h>
|
|
||||||
#include <clixon/clixon_proto_encode.h>
|
|
||||||
#include <clixon/clixon_proto_client.h>
|
|
||||||
#include <clixon/clixon_proc.h>
|
|
||||||
#include <clixon/clixon_options.h>
|
|
||||||
#include <clixon/clixon_xml_map.h>
|
|
||||||
#include <clixon/clixon_xml_db.h>
|
|
||||||
#include <clixon/clixon_xsl.h>
|
|
||||||
#include <clixon/clixon_json.h>
|
|
||||||
#include <clixon/clixon_plugin.h>
|
|
||||||
#include <clixon/clixon_plugin.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Global variables generated by Makefile
|
|
||||||
*/
|
|
||||||
extern const char CLIXON_BUILDSTR[];
|
|
||||||
extern const char CLIXON_VERSION[];
|
|
||||||
|
|
@ -31,6 +31,9 @@
|
||||||
|
|
||||||
***** END LICENSE BLOCK *****
|
***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
* NOTE: clixon.h is a GENERATED FILE and should not be edited.
|
||||||
|
* clixon.h.in is the original
|
||||||
|
*
|
||||||
* Meta-include file that includes all sub-files in control-lib
|
* Meta-include file that includes all sub-files in control-lib
|
||||||
* Note: this include files is for external purposes. Do not include this
|
* Note: this include files is for external purposes. Do not include this
|
||||||
* file in clicon lib-routines.
|
* file in clicon lib-routines.
|
||||||
|
|
@ -67,13 +70,11 @@
|
||||||
#include <clixon/clixon_handle.h>
|
#include <clixon/clixon_handle.h>
|
||||||
#include <clixon/clixon_yang.h>
|
#include <clixon/clixon_yang.h>
|
||||||
#include <clixon/clixon_yang_type.h>
|
#include <clixon/clixon_yang_type.h>
|
||||||
#include <clixon/clixon_chunk.h>
|
|
||||||
#include <clixon/clixon_event.h>
|
#include <clixon/clixon_event.h>
|
||||||
#include <clixon/clixon_string.h>
|
#include <clixon/clixon_string.h>
|
||||||
#include <clixon/clixon_file.h>
|
#include <clixon/clixon_file.h>
|
||||||
#include <clixon/clixon_xml.h>
|
#include <clixon/clixon_xml.h>
|
||||||
#include <clixon/clixon_proto.h>
|
#include <clixon/clixon_proto.h>
|
||||||
#include <clixon/clixon_proto_encode.h>
|
|
||||||
#include <clixon/clixon_proto_client.h>
|
#include <clixon/clixon_proto_client.h>
|
||||||
#include <clixon/clixon_proc.h>
|
#include <clixon/clixon_proc.h>
|
||||||
#include <clixon/clixon_options.h>
|
#include <clixon/clixon_options.h>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue