From a94dc50114e7cb32974b14015a18d4a9fef673c4 Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Mon, 1 Jun 2015 15:29:41 -0500 Subject: [PATCH] Add --with-db-type-preference config param --- cf/db.m4 | 21 ++++++++++++++++++--- lib/hdb/hdb.c | 6 ++++++ tests/db/Makefile.am | 1 + tests/db/check-aliases.in | 2 +- tests/db/check-dbinfo.in | 5 ++++- tests/db/have-db.in | 13 +++++++++++++ tests/kdc/Makefile.am | 1 + tests/kdc/check-iprop.in | 18 ++++++++++++++++-- tests/kdc/krb5.conf.in | 4 ++-- 9 files changed, 62 insertions(+), 9 deletions(-) diff --git a/cf/db.m4 b/cf/db.m4 index 4ccf8bee1..7981f9ca3 100644 --- a/cf/db.m4 +++ b/cf/db.m4 @@ -4,6 +4,11 @@ dnl tests for various db libraries dnl AC_DEFUN([rk_DB],[ +AC_ARG_WITH(db-type-preference, + AS_HELP_STRING([--with-db-type-preference], + [specify HDB backend DB type preference as whitespace-separated list]), + [db_type_preference="$withval"], + [db_type_preference="db3 db1 lmdb sqlite"]) AC_ARG_WITH(berkeley-db, AS_HELP_STRING([--with-berkeley-db], [enable support for berkeley db @<:@default=check@:>@]), @@ -136,9 +141,18 @@ AS_IF([test "x$enable_mdb_db" != xno], AC_CHECK_LIB(lmdb, mdb_env_create, have_lmdb=yes; LMDBLIB="-llmdb" AC_DEFINE(HAVE_LMDB, 1, [define if you have the LMDB library]))])]) -AS_IF([test "x$have_db3" = xyes -a "$db_type" = unknown], db_type=db3, db_type=unknown) -AS_IF([test "x$have_db1" = xyes -a "$db_type" = unknown], db_type=db1, db_type=unknown) -AS_IF([test "x$have_lmdb" = xyes -a "$db_type" = unknown], db_type=lmdb, db_type=unknown) +for db_type in unknown $db_type_preference; do + if eval test \"x\$have_${db_type}\" = xyes; then + break + fi + db_type=unknown +done + +AS_IF([test "x$have_db3" = xyes -a "$db_type" = unknown], db_type=db3, db_type="$db_type") +AS_IF([test "x$have_db1" = xyes -a "$db_type" = unknown], db_type=db1, db_type="$db_type") +AS_IF([test "x$have_lmdb" = xyes -a "$db_type" = unknown], db_type=lmdb, db_type="$db_type") + +echo "CHECK: db_type=$db_type" > /dev/tty if test "$enable_ndbm_db" != "no"; then @@ -252,4 +266,5 @@ AC_SUBST(LMDBLIB)dnl AC_SUBST(NDBMLIB)dnl AC_SUBST(NDBMLIB)dnl AC_SUBST(db_type)dnl +AC_SUBST(db_type_preference)dnl ]) diff --git a/lib/hdb/hdb.c b/lib/hdb/hdb.c index 3b94c9c1b..65c5967fe 100644 --- a/lib/hdb/hdb.c +++ b/lib/hdb/hdb.c @@ -67,6 +67,12 @@ static struct hdb_method methods[] = { #if HAVE_DB1 || HAVE_DB3 { HDB_INTERFACE_VERSION, NULL, NULL, "db:", hdb_db_create}, #endif +#if HAVE_DB1 + { HDB_INTERFACE_VERSION, NULL, NULL, "db1:", hdb_db_create}, +#endif +#if HAVE_DB3 + { HDB_INTERFACE_VERSION, NULL, NULL, "db3:", hdb_db_create}, +#endif #if HAVE_DB1 { HDB_INTERFACE_VERSION, NULL, NULL, "mit-db:", hdb_mitdb_create}, #endif diff --git a/tests/db/Makefile.am b/tests/db/Makefile.am index 5c4ace0a3..9597a0b44 100644 --- a/tests/db/Makefile.am +++ b/tests/db/Makefile.am @@ -14,6 +14,7 @@ do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ -e 's,[@]top_builddir[@],$(top_builddir),g' \ -e 's,[@]objdir[@],$(top_builddir)/tests/db,g' \ -e 's,[@]default_db_type[@],$(db_type),g' \ + -e 's,[@]db_type_preference[@],$(db_type_preference),g' \ -e 's,[@]EGREP[@],$(EGREP),g' loaddump-db: loaddump-db.in Makefile diff --git a/tests/db/check-aliases.in b/tests/db/check-aliases.in index 47aa01067..dbef36dfb 100644 --- a/tests/db/check-aliases.in +++ b/tests/db/check-aliases.in @@ -48,7 +48,7 @@ R=TEST.H5L.SE kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l" -KRB5_CONFIG="${objdir}/krb5.conf" +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" export KRB5_CONFIG rm -f current-db* diff --git a/tests/db/check-dbinfo.in b/tests/db/check-dbinfo.in index 9905daede..0949051a4 100644 --- a/tests/db/check-dbinfo.in +++ b/tests/db/check-dbinfo.in @@ -37,7 +37,10 @@ srcdir="@srcdir@" objdir="@objdir@" -KRB5_CONFIG="${objdir}/krb5.conf" +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" export KRB5_CONFIG ../../lib/hdb/test_dbinfo > dbinfo.out || exit 1 diff --git a/tests/db/have-db.in b/tests/db/have-db.in index 667c408a3..917ceb47d 100644 --- a/tests/db/have-db.in +++ b/tests/db/have-db.in @@ -38,6 +38,18 @@ top_builddir="@top_builddir@" . ${top_builddir}/tests/bin/setup-env +if [ $# != 0 ]; then + for type in "$@"; do + for have_type in \ + `${kdc} --builtin-hdb | sed 's/^builtin hdb backends: //'`; do + if [ "$type" = "$have_type" ]; then + exit 0 + fi + done + done + exit 1 +fi + list=`${kdc} --builtin-hdb | sed 's/^builtin hdb backends: //'` oldIFS="$IFS" IPS=, @@ -52,6 +64,7 @@ while [ $# != 0 ] ; do db4:*) exit 0 ;; db3:*) exit 0 ;; lmdb:*) exit 0 ;; + sqlite:*) exit 0 ;; esac shift done diff --git a/tests/kdc/Makefile.am b/tests/kdc/Makefile.am index daad09c99..5175228b3 100644 --- a/tests/kdc/Makefile.am +++ b/tests/kdc/Makefile.am @@ -58,6 +58,7 @@ do_subst = $(heim_verbose)sed $(do_dlopen) \ -e 's,[@]pwport[@],$(pwport),g' \ -e 's,[@]objdir[@],$(top_builddir)/tests/kdc,g' \ -e 's,[@]top_builddir[@],$(top_builddir),g' \ + -e 's,[@]db_type[@],$(db_type),g' \ -e 's,[@]EGREP[@],$(EGREP),g' chmod = chmod diff --git a/tests/kdc/check-iprop.in b/tests/kdc/check-iprop.in index f85d99a2d..9cf0310de 100644 --- a/tests/kdc/check-iprop.in +++ b/tests/kdc/check-iprop.in @@ -35,8 +35,7 @@ top_builddir="@top_builddir@" env_setup="@env_setup@" objdir="@objdir@" -default_db_type=@default_db_type@ -db_type=${1:-${default_db_type}} +db_type=@db_type@ . ${env_setup} @@ -175,6 +174,11 @@ sleep 2 KRB5_CONFIG="${objdir}/krb5-slave.conf" \ ${kadmin} -l get host/bar@${R} > /dev/null 2>/dev/null && exit 1 +# See note below in LMDB sanity checking +echo "Re-add host" +${kadmin} -l add --random-key --use-defaults host/foo@${R} || exit 1 +${kadmin} -l add --random-key --use-defaults host/bar@${R} || exit 1 + echo "kill slave and remove log and database" > iprop-stats sh ${leaks_kill} ipropd-slave $ipds || exit 1 @@ -337,4 +341,14 @@ ${iprop_log} last-version > slave-last.tmp ${iprop_log} last-version > master-last.tmp cmp master-last.tmp slave-last.tmp || exit 1 +if [ "$db_type" = lmdb ]; then + # Sanity check that we have the same number of principals at the HDB + # and LMDB levels. + # + echo "checking that principals in DB == entries in LMDB" + princs=`${kadmin} -l list '*' | wc -l` + entries=`mdb_stat -n current-db.mdb | grep 'Entries:' | awk '{print $2}'` + [ "`expr 1 + "$princs"`" -eq "$entries" ] || exit 1 +fi + exit $ec diff --git a/tests/kdc/krb5.conf.in b/tests/kdc/krb5.conf.in index c7895c56c..4359e53d9 100644 --- a/tests/kdc/krb5.conf.in +++ b/tests/kdc/krb5.conf.in @@ -72,14 +72,14 @@ database = { label = { - dbname = @objdir@/current-db@kdc@ + dbname = @db_type@:@objdir@/current-db@kdc@ realm = TEST.H5L.SE mkey_file = @objdir@/mkey.file acl_file = @srcdir@/heimdal.acl log_file = @objdir@/current@kdc@.log } label2 = { - dbname = @objdir@/current-db@kdc@ + dbname = @db_type@:@objdir@/current-db@kdc@ realm = TEST2.H5L.SE mkey_file = @objdir@/mkey.file acl_file = @srcdir@/heimdal.acl