2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-01 14:35:29 +00:00

[#1574] make all shell scripts POSIX compliant

* solve all shellcheck warnings
* shebang in all scripts
* set -eu everywhere
* make scripts callable from everywhere
* quote variables to prevent globbing and word splitting
* add missing copyrights
* remove unused variables
* use $() instead of backticks ``
... and so on
This commit is contained in:
Andrei Pavel
2020-12-03 11:19:15 +02:00
parent 4dd14217a9
commit 9ca8b2fcc7
79 changed files with 3141 additions and 2288 deletions

View File

@@ -6,18 +6,18 @@ ACLOCAL_AMFLAGS = -I m4macros ${ACLOCAL_FLAGS}
# documentation requires libkea-exceptions and libkea-cc. # documentation requires libkea-exceptions and libkea-cc.
SUBDIRS = tools . ext src doc m4macros @PREMIUM_DIR@ @CONTRIB_DIR@ SUBDIRS = tools . ext src doc m4macros @PREMIUM_DIR@ @CONTRIB_DIR@
USE_LCOV=@USE_LCOV@ USE_LCOV="@USE_LCOV@"
LCOV=@LCOV@ LCOV="@LCOV@"
GENHTML=@GENHTML@ GENHTML="@GENHTML@"
DISTCHECK_GTEST_CONFIGURE_FLAG=@DISTCHECK_GTEST_CONFIGURE_FLAG@ DISTCHECK_GTEST_CONFIGURE_FLAG="@DISTCHECK_GTEST_CONFIGURE_FLAG@"
DISTCHECK_CRYPTO_CONFIGURE_FLAG=@DISTCHECK_CRYPTO_CONFIGURE_FLAG@ DISTCHECK_CRYPTO_CONFIGURE_FLAG="@DISTCHECK_CRYPTO_CONFIGURE_FLAG@"
DISTCHECK_BOOST_CONFIGURE_FLAG=@DISTCHECK_BOOST_CONFIGURE_FLAG@ DISTCHECK_BOOST_CONFIGURE_FLAG="@DISTCHECK_BOOST_CONFIGURE_FLAG@"
DISTCHECK_LOG4CPLUS_CONFIGURE_FLAG=@DISTCHECK_LOG4CPLUS_CONFIGURE_FLAG@ DISTCHECK_LOG4CPLUS_CONFIGURE_FLAG="@DISTCHECK_LOG4CPLUS_CONFIGURE_FLAG@"
DISTCHECK_PERFDHCP_CONFIGURE_FLAG=@DISTCHECK_PERFDHCP_CONFIGURE_FLAG@ DISTCHECK_PERFDHCP_CONFIGURE_FLAG="@DISTCHECK_PERFDHCP_CONFIGURE_FLAG@"
DISTCHECK_KEA_SHELL_CONFIGURE_FLAG=@DISTCHECK_KEA_SHELL_CONFIGURE_FLAG@ DISTCHECK_KEA_SHELL_CONFIGURE_FLAG="@DISTCHECK_KEA_SHELL_CONFIGURE_FLAG@"
DISTCHECK_PREMIUM_CONFIGURE_FLAG=@DISTCHECK_PREMIUM_CONFIGURE_FLAG@ DISTCHECK_PREMIUM_CONFIGURE_FLAG="@DISTCHECK_PREMIUM_CONFIGURE_FLAG@"
DISTCHECK_CONTRIB_CONFIGURE_FLAG=@DISTCHECK_CONTRIB_CONFIGURE_FLAG@ DISTCHECK_CONTRIB_CONFIGURE_FLAG="@DISTCHECK_CONTRIB_CONFIGURE_FLAG@"
DISTCHECK_SYSREPO_CONFIGURE_FLAG=@DISTCHECK_SYSREPO_CONFIGURE_FLAG@ DISTCHECK_SYSREPO_CONFIGURE_FLAG="@DISTCHECK_SYSREPO_CONFIGURE_FLAG@"
OVERALL_COVERAGE_DIR=$(abs_top_builddir)/coverage-cpp-html OVERALL_COVERAGE_DIR=$(abs_top_builddir)/coverage-cpp-html

View File

@@ -879,16 +879,16 @@ if test "$SYSREPO_CONFIG" != "" ; then
# Let's get the configuration environment for pure Sysrepo (written in C) first # Let's get the configuration environment for pure Sysrepo (written in C) first
SYSREPO_INCLUDEDIR=`$SYSREPO_CONFIG --cflags-only-I libsysrepo` SYSREPO_INCLUDEDIR=`$SYSREPO_CONFIG --cflags-only-I libsysrepo`
SYSREPO_CPPFLAGS="$SYSREPO_INCLUDEDIR `$SYSREPO_CONFIG --cflags-only-other libsysrepo`" SYSREPO_CPPFLAGS="$SYSREPO_INCLUDEDIR $($SYSREPO_CONFIG --cflags-only-other libsysrepo)"
SYSREPO_LIBS="`$SYSREPO_CONFIG --libs libsysrepo`" SYSREPO_LIBS=$($SYSREPO_CONFIG --libs libsysrepo)
SYSREPO_VERSION=`$SYSREPO_CONFIG --modversion libsysrepo` SYSREPO_VERSION=$($SYSREPO_CONFIG --modversion libsysrepo)
SYSREPO_REPO=`$SYSREPO_CONFIG --variable=SR_REPOSITORY_LOC libsysrepo` SYSREPO_REPO=$($SYSREPO_CONFIG --variable=SR_REPOSITORY_LOC libsysrepo)
# Now get the environment for C++ bindings for Sysrepo. # Now get the environment for C++ bindings for Sysrepo.
SYSREPOCPP_INCLUDEDIR=`$SYSREPO_CONFIG --cflags-only-I libSysrepo-cpp` SYSREPOCPP_INCLUDEDIR=$($SYSREPO_CONFIG --cflags-only-I libSysrepo-cpp)
SYSREPOCPP_CPPFLAGS="$SYSREPO_INCLUDEDIR `$SYSREPO_CONFIG --cflags-only-other libSysrepo-cpp`" SYSREPOCPP_CPPFLAGS="$SYSREPO_INCLUDEDIR $($SYSREPO_CONFIG --cflags-only-other libSysrepo-cpp)"
SYSREPOCPP_LIBS="`$SYSREPO_CONFIG --libs libSysrepo-cpp`" SYSREPOCPP_LIBS=$($SYSREPO_CONFIG --libs libSysrepo-cpp)
SYSREPOCPP_VERSION=`$SYSREPO_CONFIG --modversion libSysrepo-cpp` SYSREPOCPP_VERSION=$($SYSREPO_CONFIG --modversion libSysrepo-cpp)
# If include paths are equal, there's no need to include both. But if they're different, # If include paths are equal, there's no need to include both. But if they're different,
# we need both. # we need both.
@@ -1299,7 +1299,7 @@ if test "x$enable_generate_parser" != "xno"; then
AC_MSG_ERROR([Flex is required for enable-generate-parser, but was not found]) AC_MSG_ERROR([Flex is required for enable-generate-parser, but was not found])
fi fi
if test "x$YACC" == "x"; then if test "x$YACC" = "x"; then
AC_MSG_ERROR([Bison is required for enable-generate-parser, but was not found]) AC_MSG_ERROR([Bison is required for enable-generate-parser, but was not found])
fi fi
@@ -1423,7 +1423,7 @@ if test "x$enable_generate_docs" != xno ; then
if test -z "$PDFLATEX"; then if test -z "$PDFLATEX"; then
PDFLATEX=no PDFLATEX=no
elif test "x$PDFLATEX" == "xno"; then elif test "x$PDFLATEX" = "xno"; then
AC_MSG_CHECKING([for pdflatex]) AC_MSG_CHECKING([for pdflatex])
AC_MSG_RESULT([no (disabled)]) AC_MSG_RESULT([no (disabled)])
else else
@@ -1801,6 +1801,42 @@ AC_CONFIG_COMMANDS([permissions], [
chmod +x src/lib/log/tests/severity_test.sh chmod +x src/lib/log/tests/severity_test.sh
chmod +x src/lib/util/python/gen_wiredata.py chmod +x src/lib/util/python/gen_wiredata.py
chmod +x src/lib/util/tests/process_spawn_app.sh chmod +x src/lib/util/tests/process_spawn_app.sh
chmod +x src/share/database/scripts/cql/upgrade_1.0_to_2.0.sh
chmod +x src/share/database/scripts/cql/upgrade_2.0_to_3.0.sh
chmod +x src/share/database/scripts/cql/upgrade_3.0_to_4.0.sh
chmod +x src/share/database/scripts/cql/upgrade_4.0_to_5.0.sh
chmod +x src/share/database/scripts/cql/wipe_data.sh
chmod +x src/share/database/scripts/mysql/upgrade_1.0_to_2.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_2.0_to_3.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_3.0_to_4.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_4.0_to_4.1.sh
chmod +x src/share/database/scripts/mysql/upgrade_4.1_to_5.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_5.0_to_5.1.sh
chmod +x src/share/database/scripts/mysql/upgrade_5.1_to_5.2.sh
chmod +x src/share/database/scripts/mysql/upgrade_5.2_to_6.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_6.0_to_7.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_7.0_to_8.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_8.0_to_8.1.sh
chmod +x src/share/database/scripts/mysql/upgrade_8.1_to_8.2.sh
chmod +x src/share/database/scripts/mysql/upgrade_8.2_to_9.0.sh
chmod +x src/share/database/scripts/mysql/upgrade_9.0_to_9.1.sh
chmod +x src/share/database/scripts/mysql/upgrade_9.1_to_9.2.sh
chmod +x src/share/database/scripts/mysql/upgrade_9.2_to_9.3.sh
chmod +x src/share/database/scripts/mysql/upgrade_9.3_to_9.4.sh
chmod +x src/share/database/scripts/mysql/upgrade_9.4_to_9.5.sh
chmod +x src/share/database/scripts/mysql/wipe_data.sh
chmod +x src/share/database/scripts/pgsql/upgrade_1.0_to_2.0.sh
chmod +x src/share/database/scripts/pgsql/upgrade_2.0_to_3.0.sh
chmod +x src/share/database/scripts/pgsql/upgrade_3.0_to_3.1.sh
chmod +x src/share/database/scripts/pgsql/upgrade_3.1_to_3.2.sh
chmod +x src/share/database/scripts/pgsql/upgrade_3.2_to_3.3.sh
chmod +x src/share/database/scripts/pgsql/upgrade_3.3_to_4.0.sh
chmod +x src/share/database/scripts/pgsql/upgrade_4.0_to_5.0.sh
chmod +x src/share/database/scripts/pgsql/upgrade_5.0_to_5.1.sh
chmod +x src/share/database/scripts/pgsql/upgrade_5.1_to_6.0.sh
chmod +x src/share/database/scripts/pgsql/upgrade_6.0_to_6.1.sh
chmod +x src/share/database/scripts/pgsql/upgrade_6.1_to_6.2.sh
chmod +x src/share/database/scripts/pgsql/wipe_data.sh
chmod +x tools/path_replacer.sh chmod +x tools/path_replacer.sh
]) ])

View File

@@ -100,7 +100,7 @@ if test "x$enable_gtest" = "xyes" ; then
# Versions starting from 1.8.0 are put in the googletest directory. If the basename # Versions starting from 1.8.0 are put in the googletest directory. If the basename
# returns googletest string, we need to cut it off and try baseline again. # returns googletest string, we need to cut it off and try baseline again.
if test "$GTEST_VERSION" == "googletest"; then if test "$GTEST_VERSION" = "googletest"; then
GTEST_VERSION=${GTEST_SOURCE%"/googletest"} GTEST_VERSION=${GTEST_SOURCE%"/googletest"}
GTEST_VERSION=`basename $GTEST_VERSION` GTEST_VERSION=`basename $GTEST_VERSION`
fi fi

View File

@@ -8,6 +8,33 @@
# This is an utility script that is being included by other scripts. # This is an utility script that is being included by other scripts.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# These are the default parameters. They will likely not work in any
# specific deployment. Also used in unit tests.
db_host='localhost'
db_user='keatest'
db_password='keatest'
db_name='keatest'
# Runs all the given arguments as a single command. Maintains quoting. Places
# output in ${OUTPUT} and exit code in ${EXIT_CODE}. Does not support pipes and
# redirections. Support for them could be added through eval and single
# parameter assignment, but eval is not recommended.
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
run_and_return_output_and_exit_code() {
if test -n "${DEBUG+x}"; then
printf '%s\n' "${*}" >&2
fi
set +e
OUTPUT=$("${@}")
EXIT_CODE=${?}
set -e
}
# There are two ways of calling this method. # There are two ways of calling this method.
# mysql_execute SQL_QUERY - This call is simpler, but requires db_user, # mysql_execute SQL_QUERY - This call is simpler, but requires db_user,
# db_password and db_name variables to be set. # db_password and db_name variables to be set.
@@ -22,15 +49,11 @@ mysql_execute() {
shift shift
if [ $# -gt 1 ]; then if [ $# -gt 1 ]; then
mysql -N -B "$@" -e "${QUERY}" mysql -N -B "$@" -e "${QUERY}"
retcode=$?
else else
# Shellcheck complains about variables not being set. They're set in the script that calls this script. # Shellcheck complains about variables not being set. They're set in the script that calls this script.
# shellcheck disable=SC2154 # shellcheck disable=SC2154
mysql -N -B --host="${db_host}" --database="${db_name}" --user="${db_user}" --password="${db_password}" -e "${QUERY}" mysql -N -B --host="${db_host}" --database="${db_name}" --user="${db_user}" --password="${db_password}" -e "${QUERY}"
retcode=$?
fi fi
return $retcode
} }
mysql_execute_script() { mysql_execute_script() {
@@ -38,29 +61,26 @@ mysql_execute_script() {
shift shift
if [ $# -ge 1 ]; then if [ $# -ge 1 ]; then
mysql -N -B "$@" < "${file}" mysql -N -B "$@" < "${file}"
retcode=$?
else else
mysql -N -B --host="${db_host}" --database="${db_name}" --user="${db_user}" --password="${db_password}" < "${file}" mysql -N -B --host="${db_host}" --database="${db_name}" --user="${db_user}" --password="${db_password}" < "${file}"
retcode=$?
fi fi
return $retcode
} }
mysql_version() { mysql_version() {
mysql_execute "SELECT CONCAT_WS('.', version, minor) FROM schema_version" "$@" mysql_execute "SELECT CONCAT_WS('.', version, minor) FROM schema_version" "$@"
return $?
} }
checked_mysql_version() { checked_mysql_version() {
mysql_execute "SELECT CONCAT_WS('.', version, minor) FROM schema_version" "$@" run_and_return_output_and_exit_code \
retcode=$? mysql_execute "SELECT CONCAT_WS('.', version, minor) FROM schema_version" "$@"
if [ $retcode -ne 0 ]
if [ "${EXIT_CODE}" -ne 0 ]
then then
printf "Failed to get schema version, mysql status %s\n" "${retcode}" printf "Failed to get schema version, mysql status %s\n" "${EXIT_CODE}"
exit 1
fi fi
return $retcode
printf '%s\n' "${OUTPUT}"
return "${EXIT_CODE}"
} }
# Submits given SQL text to PostgreSQL # Submits given SQL text to PostgreSQL
@@ -78,13 +98,10 @@ pgsql_execute() {
shift shift
if [ $# -gt 0 ]; then if [ $# -gt 0 ]; then
echo "${QUERY}" | psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q "$@" echo "${QUERY}" | psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q "$@"
retcode=$?
else else
export PGPASSWORD=$db_password export PGPASSWORD=$db_password
echo "${QUERY}" | psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q -U "${db_user}" -d "${db_name}" echo "${QUERY}" | psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q -U "${db_user}" -d "${db_name}"
retcode=$?
fi fi
return $retcode
} }
# Submits SQL in a given file to PostgreSQL # Submits SQL in a given file to PostgreSQL
@@ -102,75 +119,75 @@ pgsql_execute_script() {
shift shift
if [ $# -gt 0 ]; then if [ $# -gt 0 ]; then
psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q -f "${file}" "$@" psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q -f "${file}" "$@"
retcode=$?
else else
export PGPASSWORD=$db_password export PGPASSWORD=$db_password
psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q -U "${db_user}" -d "${db_name}" -f "${file}" psql --set ON_ERROR_STOP=1 -A -t -h "${db_host}" -q -U "${db_user}" -d "${db_name}" -f "${file}"
retcode=$?
fi fi
return $retcode
} }
pgsql_version() { pgsql_version() {
pgsql_execute "SELECT version || '.' || minor FROM schema_version" "$@" pgsql_execute "SELECT version || '.' || minor FROM schema_version" "$@"
return $?
} }
checked_pgsql_version() { checked_pgsql_version() {
pgsql_execute "SELECT version || '.' || minor FROM schema_version" "$@" run_and_return_output_and_exit_code \
retcode=$? pgsql_execute "SELECT version || '.' || minor FROM schema_version" "$@"
if [ $retcode -ne 0 ]
if [ "${EXIT_CODE}" -ne 0 ]
then then
printf "Failed to get schema version, pgsql status %s\n" "${retcode}" printf "Failed to get schema version, pgsql status %s\n" "${EXIT_CODE}"
exit 1
fi fi
return $retcode
printf '%s\n' "${OUTPUT}"
return "${EXIT_CODE}"
} }
cql_execute() { cql_execute() {
query=$1 query=$1
shift shift
if [ $# -gt 1 ]; then if [ $# -gt 1 ]; then
cqlsh "$@" -e "$query" run_and_return_output_and_exit_code \
retcode=$? cqlsh "$@" -e "$query"
else else
cqlsh -u "${db_user}" -p "${db_password}" -k "${db_name}" -e "${query}" run_and_return_output_and_exit_code \
retcode=$? cqlsh -u "${db_user}" -p "${db_password}" -k "${db_name}" -e "${query}"
fi fi
if [ $retcode -ne 0 ]; then if [ "${EXIT_CODE}" -ne 0 ]; then
printf "cqlsh returned with exit status %s\n" "${retcode}" printf "cqlsh returned with exit status %s\n" "${EXIT_CODE}"
exit $retcode
fi fi
return $retcode printf '%s\n' "${OUTPUT}"
return "${EXIT_CODE}"
} }
cql_execute_script() { cql_execute_script() {
file=$1 file=$1
shift shift
if [ $# -gt 1 ]; then if [ $# -gt 1 ]; then
cqlsh "$@" -e "$file" run_and_return_output_and_exit_code \
retcode=$? cqlsh "$@" -e "$file"
else else
cqlsh -u "${db_user}" -p "${db_password}" -k "${db_name}" -f "${file}" run_and_return_output_and_exit_code \
retcode=$? cqlsh -u "${db_user}" -p "${db_password}" -k "${db_name}" -f "${file}"
fi fi
if [ $retcode -ne 0 ]; then if [ "${EXIT_CODE}" -ne 0 ]; then
printf "cqlsh returned with exit status %s\n" "${retcode}" printf "cqlsh returned with exit status %s\n" "${EXIT_CODE}"
exit $retcode
fi fi
return $retcode printf '%s\n' "${OUTPUT}"
return "${EXIT_CODE}"
} }
cql_version() { cql_version() {
version=$(cql_execute "SELECT version, minor FROM schema_version" "$@") run_and_return_output_and_exit_code \
error=$? cql_execute "SELECT version, minor FROM schema_version" "$@"
version="${OUTPUT}"
select_exit_code="${EXIT_CODE}"
version=$(echo "$version" | grep -A 1 "+" | grep -v "+" | tr -d ' ' | cut -d "|" -f 1-2 | tr "|" ".") version=$(echo "$version" | grep -A 1 "+" | grep -v "+" | tr -d ' ' | cut -d "|" -f 1-2 | tr "|" ".")
echo "$version" echo "$version"
return $error return "${select_exit_code}"
} }
# recount IPv4 leases from scratch # recount IPv4 leases from scratch

View File

@@ -15,20 +15,22 @@
# - lease database dump # - lease database dump
# - lease database recount # - lease database recount
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Get the location of the kea-admin scripts # Get the location of the kea-admin scripts
prefix=@prefix@ prefix="@prefix@"
export prefix export prefix
SCRIPTS_DIR_DEFAULT=@datarootdir@/@PACKAGE@/scripts SCRIPTS_DIR_DEFAULT="@datarootdir@/@PACKAGE@/scripts"
scripts_dir=${SCRIPTS_DIR_DEFAULT} scripts_dir="${SCRIPTS_DIR_DEFAULT}"
VERSION=@PACKAGE_VERSION@ VERSION="@PACKAGE_VERSION@"
# These are the default parameters. They will likely not work in any
# specific deployment.
db_host="localhost"
db_user="keatest"
db_password="keatest"
db_name="keatest"
# lease dump parameters # lease dump parameters
dump_type=0 dump_type=0
@@ -37,46 +39,48 @@ dump_qry=""
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
# shellcheck disable=SC1091
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_srcdir@/src/bin/admin/admin-utils.sh . "@abs_top_srcdir@/src/bin/admin/admin-utils.sh"
fi fi
# Prints out usage version. # Prints out usage version.
usage() { usage() {
printf "kea-admin %s\n" "$VERSION" printf \
printf "\n" '
printf "This is a kea-admin script that conducts administrative tasks on\n" kea-admin %s
printf "the Kea installation.\n"
printf "\n" This is a kea-admin script that conducts administrative tasks on
printf "Usage: %s COMMAND BACKEND [parameters]\n" "$0" the Kea installation.
printf "\n"
printf "COMMAND: Currently supported operations are:\n" Usage: %s COMMAND BACKEND [parameters]
printf "\n"
printf " - db-init: Initializes new database. Useful for first time installation.\n" COMMAND: Currently supported operations are:
printf " - db-version: Checks version of the existing database scheme. Useful\n"
printf " - for checking databaseB version when preparing for an upgrade.\n" - db-init: Initializes new database. Useful for first time installation.
printf " - db-upgrade: Upgrades your database scheme\n" - db-version: Checks version of the existing database scheme. Useful
printf " - lease-dump: Dumps current leases to a CSV file\n" - for checking databaseB version when preparing for an upgrade.
printf " - stats-recount: Recounts lease statistics\n" - db-upgrade: Upgrades your database scheme
printf "\n" - lease-dump: Dumps current leases to a CSV file
printf "BACKEND - one of the supported backends: memfile|mysql|pgsql|cql\n" - stats-recount: Recounts lease statistics
printf "\n"
printf "PARAMETERS: Parameters are optional in general, but may be required\n" BACKEND - one of the supported backends: memfile|mysql|pgsql|cql
printf " for specific operation.\n"
printf " -h or --host hostname - specifies a hostname of a database to connect to\n" PARAMETERS: Parameters are optional in general, but may be required
printf " -u or --user name - specifies username when connecting to a database\n" for specific operation.
printf " -p or --password pass - specifies a password when connecting to a database\n" -h or --host hostname - specifies a hostname of a database to connect to
printf " -n or --name database - specifies a database name to connect to\n" -u or --user name - specifies username when connecting to a database
printf " -d or --directory - path to upgrade scripts (default: %s)\n" "${SCRIPTS_DIR_DEFAULT}" -p or --password pass - specifies a password when connecting to a database
printf " -v or --version - print kea-admin version and quit.\n" -n or --name database - specifies a database name to connect to
printf "\n" -d or --directory - path to upgrade scripts (default: %s)
printf " Parameters specific to lease-dump:\n" -v or --version - print kea-admin version and quit.
printf " -4 to dump IPv4 leases to file\n"
printf " -6 to dump IPv6 leases to file\n" Parameters specific to lease-dump:
printf " -o or --output - name of file to which leases will be dumped\n" -4 to dump IPv4 leases to file
-6 to dump IPv6 leases to file
-o or --output - name of file to which leases will be dumped
' "${VERSION}" "${0}" "${SCRIPTS_DIR_DEFAULT}"
} }
@@ -138,15 +142,15 @@ mysql_can_create() {
# Let's grab the version for possible debugging issues. It also # Let's grab the version for possible debugging issues. It also
# determines basic functional access to db. # determines basic functional access to db.
RESULT=$(mysql_execute "select @@global.version;") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "select @@global.version;"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql_can_create: get MySQL version failed, mysql status = $ERRCODE" log_error "mysql_can_create: get MySQL version failed, mysql status = ${EXIT_CODE}"
exit 1 exit 1
fi fi
printf "MySQL Version is: %s\n" "$RESULT" printf "MySQL Version is: %s\n" "${OUTPUT}"
# SQL to drop our test table and trigger # SQL to drop our test table and trigger
cleanup_sql="DROP TABLE IF EXISTS kea_dummy_table; DROP PROCEDURE IF EXISTS kea_dummy_trigger;" cleanup_sql="DROP TABLE IF EXISTS kea_dummy_table; DROP PROCEDURE IF EXISTS kea_dummy_trigger;"
@@ -161,39 +165,39 @@ BEGIN\n \
END;" END;"
# Let's clean up just in case. # Let's clean up just in case.
RESULT=$(mysql_execute "$cleanup_sql") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$cleanup_sql"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql_can_create cannot run pre cleanup, mysql status = $ERRCODE" log_error "mysql_can_create cannot run pre cleanup, mysql status = ${EXIT_CODE}"
exit 1; exit 1;
fi fi
# Now make the dummy table. # Now make the dummy table.
perms_ok=1 perms_ok=1
RESULT=$(mysql_execute "$table_sql") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$table_sql"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql_can_create cannot create table, check user permissions, mysql status = $ERRCODE" log_error "mysql_can_create cannot create table, check user permissions, mysql status = ${EXIT_CODE}"
perms_ok=0; perms_ok=0;
else else
# Now attempt to make trigger # Now attempt to make trigger
RESULT=$(mysql_execute "$trigger_sql") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$trigger_sql"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql_can_create cannot trigger, check user permissions, mysql status = $ERRCODE" log_error "mysql_can_create cannot trigger, check user permissions, mysql status = ${EXIT_CODE}"
perms_ok=0; perms_ok=0;
fi fi
fi fi
# Try to cleanup no matter what happened above # Try to cleanup no matter what happened above
RESULT=$(mysql_execute "$cleanup_sql") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$cleanup_sql"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql_can_create cannot run post cleanup, mysql status = $ERRCODE" log_error "mysql_can_create cannot run post cleanup, mysql status = ${EXIT_CODE}"
exit 1; exit 1;
fi fi
@@ -209,7 +213,7 @@ END;"
# some extra sanity checks. It will refuse to use it if there are any # some extra sanity checks. It will refuse to use it if there are any
# existing tables. It's better safe than sorry. # existing tables. It's better safe than sorry.
mysql_init() { mysql_init() {
printf "Checking if there is a database initialized already. Please ignore errors.\n" printf 'Checking if there is a database initialized already...\n'
# Let's try to count the number of tables. Anything above 0 means that there # Let's try to count the number of tables. Anything above 0 means that there
# is some database in place. If there is anything, we abort. Note that # is some database in place. If there is anything, we abort. Note that
@@ -217,19 +221,20 @@ mysql_init() {
# We should not hide them as they may give hints to user what is wrong with # We should not hide them as they may give hints to user what is wrong with
# his setup. # his setup.
# #
RESULT=$(mysql_execute "SHOW TABLES;") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "SHOW TABLES;"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql_init table query failed, mysql status = $ERRCODE" log_error "mysql_init table query failed, mysql status = ${EXIT_CODE}"
exit 1 exit 1
fi fi
COUNT=$(echo "$RESULT" | wc -w) count=$(wc -w <<<"${OUTPUT}")
if [ "$COUNT" -gt 0 ]; then if [ "${count}" -gt 0 ]; then
# Let's start with a new line. mysql could have printed something out. # Let's start with a new line. mysql could have printed something out.
printf "\n" printf '\n'
log_error "Expected empty database $db_name, but there are $COUNT tables: \n$RESULT. Aborting." log_error "Expected empty database ${db_name}. Aborting, the following tables are present:
${OUTPUT}"
exit 1 exit 1
fi fi
@@ -240,45 +245,45 @@ mysql_init() {
mysql_can_create mysql_can_create
printf "Initializing database using script %s\n" $scripts_dir/mysql/dhcpdb_create.mysql printf "Initializing database using script %s\n" $scripts_dir/mysql/dhcpdb_create.mysql
mysql -B --host=$db_host --user=$db_user --password=$db_password $db_name < $scripts_dir/mysql/dhcpdb_create.mysql mysql -B --host="${db_host}" --user="${db_user}" --password="${db_password}" "${db_name}" < "${scripts_dir}/mysql/dhcpdb_create.mysql"
ERRCODE=$?
printf "mysql returned status code %s\n" "$ERRCODE" printf "mysql returned status code %s\n" "${EXIT_CODE}"
if [ "$ERRCODE" -eq 0 ]; then if [ "${EXIT_CODE}" -eq 0 ]; then
printf "Database version reported after initialization: " printf "Database version reported after initialization: "
checked_mysql_version checked_mysql_version
printf "\n" printf '\n'
fi fi
exit $ERRCODE exit "${EXIT_CODE}"
} }
pgsql_init() { pgsql_init() {
printf "Checking if there is a database initialized already. Please ignore errors.\n" printf 'Checking if there is a database initialized already...\n'
# Let's try to count the number of tables. Anything above 0 means that there # Let's try to count the number of tables. Anything above 0 means that there
# is some database in place. If there is anything, we abort. # is some database in place. If there is anything, we abort.
RESULT=$(pgsql_execute "\d") run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "\d"
if [ "$ERRCODE" -ne 0 ]; then if [ "${EXIT_CODE}" -ne 0 ]; then
log_error "pgsql_init: table query failed, status code: $ERRCODE?" log_error "pgsql_init: table query failed, status code: ${EXIT_CODE}?"
exit 1 exit 1
fi fi
COUNT=$(echo "$RESULT" | wc -w) count=$(wc -w <<<"${OUTPUT}")
if [ "$COUNT" -gt 0 ]; then if [ "${count}" -gt 0 ]; then
printf "\n" printf '\n'
log_error "Expected empty database $db_name, but the following tables are present \n$RESULT. Aborting." log_error "Expected empty database ${db_name}. Aborting, the following tables are present:
${OUTPUT}"
exit 2 exit 2
fi fi
init_script="$scripts_dir/pgsql/dhcpdb_create.pgsql" init_script="$scripts_dir/pgsql/dhcpdb_create.pgsql"
printf "Initializing database using script %s\n" $init_script printf "Initializing database using script %s\n" $init_script
RESULT=$(pgsql_execute_script $init_script) run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute_script $init_script
if [ "$ERRCODE" -ne 0 ]; then if [ "${EXIT_CODE}" -ne 0 ]; then
log_error "Database initialization failed, status code: $ERRCODE?" log_error "Database initialization failed, status code: ${EXIT_CODE}?"
exit 1 exit 1
fi fi
@@ -288,17 +293,20 @@ pgsql_init() {
} }
cql_init() { cql_init() {
printf "Checking if there is a database initialized already... Please ignore errors.\n" printf 'Checking if there is a database initialized already...\n'
run_and_return_output_and_exit_code \
cql_execute "DESCRIBE tables;"
result=$(cql_execute "DESCRIBE tables;")
# Shellcheck complaints about missing quotes and word splitting here. There # Shellcheck complaints about missing quotes and word splitting here. There
# is no problem here as wc -w always returns a single number. # is no problem here as wc -w always returns a single number.
# shellcheck disable=SC2046 # shellcheck disable=SC2046
if [ $(echo "$result" | grep -c "<empty>") -gt 0 ]; then if test "$(grep -c "<empty>" <<<"${OUTPUT}")" -gt 0; then
printf "Creating and initializing tables using script %s...\n" $scripts_dir/cql/dhcpdb_create.cql printf 'Creating and initializing tables using script %s...\n' "${scripts_dir}/cql/dhcpdb_create.cql"
cql_execute_script $scripts_dir/cql/dhcpdb_create.cql cql_execute_script "${scripts_dir}/cql/dhcpdb_create.cql"
else else
log_error "Expected empty database $db_name, but the following tables are present \n$result. Aborting." log_error "Expected empty database ${db_name}. Aborting, the following tables are present:
${OUTPUT}"
exit 2 exit 2
fi fi
@@ -332,7 +340,7 @@ mysql_upgrade() {
printf "Database version reported before upgrade: " printf "Database version reported before upgrade: "
checked_mysql_version checked_mysql_version
printf "\n" printf '\n'
# Check if the scripts directory exists at all. # Check if the scripts directory exists at all.
if [ ! -d ${scripts_dir}/mysql ]; then if [ ! -d ${scripts_dir}/mysql ]; then
@@ -356,12 +364,12 @@ mysql_upgrade() {
for script in "${scripts_dir}"/mysql/upgrade*.sh for script in "${scripts_dir}"/mysql/upgrade*.sh
do do
echo "Processing $script file..." echo "Processing $script file..."
sh "${script}" --host="${db_host}" --user="${db_user}" --password="${db_password}" "${db_name}" "${script}" --host="${db_host}" --user="${db_user}" --password="${db_password}" "${db_name}"
done done
printf "Database version reported after upgrade: " printf "Database version reported after upgrade: "
checked_mysql_version checked_mysql_version
printf "\n" printf '\n'
} }
pgsql_upgrade() { pgsql_upgrade() {
@@ -388,7 +396,7 @@ pgsql_upgrade() {
for script in "${scripts_dir}"/pgsql/upgrade*.sh for script in "${scripts_dir}"/pgsql/upgrade*.sh
do do
echo "Processing $script file..." echo "Processing $script file..."
sh "${script}" -U "${db_user}" -h "${db_host}" -d "${db_name}" "${script}" -U "${db_user}" -h "${db_host}" -d "${db_name}"
done done
version=$(checked_pgsql_version) version=$(checked_pgsql_version)
@@ -413,13 +421,13 @@ cql_upgrade() {
fi fi
# Check if there are upgrade scripts. # Check if there are upgrade scripts.
find "${scripts_dir}/cql" -name 'upgrade*.sh' -type f run_and_return_output_and_exit_code \
retcode=$? find "${scripts_dir}/cql" -name 'upgrade*.sh' -type f
if [ $retcode -eq 0 ]; then # Upgrade scripts are present. if [ "${EXIT_CODE}" -eq 0 ]; then # Upgrade scripts are present.
for script in "${scripts_dir}"/cql/upgrade*.sh for script in "${scripts_dir}"/cql/upgrade*.sh
do do
echo "Processing $script file..." echo "Processing $script file..."
sh "${script}" -u "${db_user}" -p "${db_password}" -k "${db_name}" "${script}" -u "${db_user}" -p "${db_password}" -k "${db_name}"
done done
else else
echo "No upgrade script available." echo "No upgrade script available."
@@ -488,12 +496,13 @@ mysql_dump() {
fi fi
# get the correct dump query # get the correct dump query
version=$(mysql_version) run_and_return_output_and_exit_code \
retcode=$? mysql_version
if [ $retcode -ne 0 ] version="${OUTPUT}"
if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "lease-dump: mysql_version failed, exit code $retcode" log_error "lease-dump: mysql_version failed, exit code ${EXIT_CODE}"
exit 1; exit 1
fi fi
# Fetch the correct SQL text. Note this function will exit # Fetch the correct SQL text. Note this function will exit
@@ -520,17 +529,13 @@ mysql_dump() {
# 'tr' to translate tabs to commas. We do not use MySQL's output # 'tr' to translate tabs to commas. We do not use MySQL's output
# to file as that requires linux superuser privileges to execute # to file as that requires linux superuser privileges to execute
# the select. # the select.
mysql_execute "${dump_qry}" > $tmp_file if ! mysql_execute "${dump_qry}" > $tmp_file; then
retcode=$? log_error "lease-dump: mysql_execute failed, exit code ${EXIT_CODE}"
if [ $retcode -ne 0 ]; then
log_error "lease-dump: mysql_execute failed, exit code $retcode";
exit 1 exit 1
fi fi
# Now translate tabs to commas. # Now translate tabs to commas.
tr '\t' ',' < $tmp_file >"$dump_file" if ! tr '\t' ',' < "${tmp_file}" > "${dump_file}"; then
retcode=$?
if [ $retcode -ne 0 ]; then
log_error "lease-dump: reformatting failed"; log_error "lease-dump: reformatting failed";
exit 1 exit 1
fi fi
@@ -568,13 +573,13 @@ pgsql_dump() {
export PGPASSWORD=$db_password export PGPASSWORD=$db_password
# Call psql and redirect output to the dump file. We don't use psql "to csv" # Call psql and redirect output to the dump file. We don't use psql "to csv"
# as it can only be run as db superuser. # as it can only be run as db superuser. Check for errors.
echo "$dump_qry" | psql --set ON_ERROR_STOP=1 -t -h $db_host -q --user=$db_user --dbname=$db_name -w --no-align --field-separator=',' >"$dump_file" if ! (
retcode=$? echo "${dump_qry}" | \
psql --set ON_ERROR_STOP=1 -t -h "${db_host}" -q --user="${db_user}" \
# Check for errors. --dbname="${db_name}" -w --no-align --field-separator=',' > "${dump_file}"
if [ $retcode -ne 0 ]; then ); then
log_error "lease-dump: psql call failed, exit code: $retcode"; log_error "lease-dump: psql call failed, exit code: ${EXIT_CODE}"
exit 1 exit 1
fi fi
@@ -606,21 +611,21 @@ cql_dump() {
check_file_overwrite "$dump_file" check_file_overwrite "$dump_file"
# Run query, check for failure. # Run query, check for failure.
result=$(cql_execute "$dump_query") run_and_return_output_and_exit_code \
return_code=$? cql_execute "${dump_query}"
if [ $return_code -ne 0 ]; then if [ "${EXIT_CODE}" -ne 0 ]; then
log_error "lease-dump: cql_execute failed, exit code $return_code"; log_error "lease-dump: cql_execute failed, exit code ${EXIT_CODE}"
exit 1 exit 1
fi fi
# Parse and display header. # Parse and display header.
echo "$result" | head -n 2 | tail -n 1 | sed -e 's/[[:space:]]*//g' | sed -e 's/|/,/g' > "$dump_file" echo "${OUTPUT}" | head -n 2 | tail -n 1 | sed -e 's/[[:space:]]*//g' | sed -e 's/|/,/g' > "$dump_file"
# Parse and display contents - done separately from header to allow sorting # Parse and display contents - done separately from header to allow sorting
# by address. awk script replaces head -n -2 which is not portable. # by address. awk script replaces head -n -2 which is not portable.
echo "$result" | tail -n +4 | awk 'n>=2 { print a[n%2] } { a[n%2]=$0; n=n+1 }' | sed -e 's/[[:space:]]*//g' | sed -e 's/|/,/g' | sort -r >> "$dump_file" echo "${OUTPUT}" | tail -n +4 | awk 'n>=2 { print a[n%2] } { a[n%2]=$0; n=n+1 }' | sed -e 's/[[:space:]]*//g' | sed -e 's/|/,/g' | sort -r >> "$dump_file"
echo lease$dump_type successfully dumped to "$dump_file" echo "lease$dump_type successfully dumped to $dump_file"
exit 0 exit 0
} }
@@ -628,19 +633,19 @@ cql_dump() {
mysql_recount() { mysql_recount() {
printf "Recount lease statistics from database\n" printf "Recount lease statistics from database\n"
RESULT=$(mysql_execute "$_RECOUNT4_QUERY") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$_RECOUNT4_QUERY"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql failed to recount IPv4 leases, mysql status = $ERRCODE" log_error "mysql failed to recount IPv4 leases, mysql status = ${EXIT_CODE}"
exit 1 exit 1
fi fi
RESULT=$(mysql_execute "$_RECOUNT6_QUERY") run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$_RECOUNT6_QUERY"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "mysql failed to recount IPv6 leases, mysql status = $ERRCODE" log_error "mysql failed to recount IPv6 leases, mysql status = ${EXIT_CODE}"
exit 1 exit 1
fi fi
} }
@@ -648,19 +653,19 @@ mysql_recount() {
pgsql_recount() { pgsql_recount() {
printf "Recount lease statistics from database\n" printf "Recount lease statistics from database\n"
RESULT=$(pgsql_execute "$_RECOUNT4_QUERY") run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "$_RECOUNT4_QUERY"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "pgsql failed to recount IPv4 leases, pgsql status = $ERRCODE" log_error "pgsql failed to recount IPv4 leases, pgsql status = ${EXIT_CODE}"
exit 1 exit 1
fi fi
RESULT=$(pgsql_execute "$_RECOUNT6_QUERY") run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "$_RECOUNT6_QUERY"
if [ $ERRCODE -ne 0 ] if [ "${EXIT_CODE}" -ne 0 ]
then then
log_error "pgsql failed to recount IPv6 leases, pgsql status = $ERRCODE" log_error "pgsql failed to recount IPv6 leases, pgsql status = ${EXIT_CODE}"
exit 1 exit 1
fi fi
} }
@@ -668,7 +673,7 @@ pgsql_recount() {
### Script starts here ### ### Script starts here ###
# First, find what the command is # First, find what the command is
command=${1} command=${1-}
if [ -z "${command}" ]; then if [ -z "${command}" ]; then
log_error "missing command" log_error "missing command"
usage usage
@@ -682,7 +687,7 @@ if test "${command}" = "-v" || test "${command}" = "--version" ; then
fi fi
is_in_list "${command}" "db-init db-version db-upgrade lease-dump stats-recount" is_in_list "${command}" "db-init db-version db-upgrade lease-dump stats-recount"
if [ ${_inlist} -eq 0 ]; then if [ "${_inlist}" -eq 0 ]; then
log_error "invalid command: ${command}" log_error "invalid command: ${command}"
usage usage
exit 1 exit 1
@@ -697,14 +702,14 @@ if [ -z "${backend}" ]; then
exit 1 exit 1
fi fi
is_in_list "${backend}" "memfile mysql pgsql cql" is_in_list "${backend}" "memfile mysql pgsql cql"
if [ ${_inlist} -eq 0 ]; then if [ "${_inlist}" -eq 0 ]; then
log_error "invalid backend: ${backend}" log_error "invalid backend: ${backend}"
exit 1 exit 1
fi fi
shift shift
# Ok, let's process parameters (if there are any) # Ok, let's process parameters (if there are any)
while [ -n "${1}" ] while [ -n "${1+x}" ]
do do
option=${1} option=${1}
case ${option} in case ${option} in
@@ -818,7 +823,7 @@ case ${command} in
;; ;;
mysql) mysql)
checked_mysql_version checked_mysql_version
printf "\n" printf '\n'
;; ;;
pgsql) pgsql)
checked_pgsql_version checked_pgsql_version

View File

@@ -6,26 +6,34 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2154
# SC2154: ... is referenced but not assigned.
# Reason: some variables are sourced.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Include common test library. # Include common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# Include admin utilities # Include admin utilities
. @abs_top_srcdir@/src/bin/admin/admin-utils.sh . "@abs_top_srcdir@/src/bin/admin/admin-utils.sh"
# Set path to the production schema scripts # Set path to the production schema scripts
db_scripts_dir=@abs_top_srcdir@/src/share/database/scripts db_scripts_dir="@abs_top_srcdir@/src/share/database/scripts"
db_user="keatest"
db_password="keatest"
db_name="keatest"
# Set location of the kea-admin. # Set location of the kea-admin.
keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin kea_admin="@abs_top_builddir@/src/bin/admin/kea-admin"
cql_wipe() { cql_wipe() {
# Wipe the database. # Wipe the database.
cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql run_and_return_output_and_exit_code \
assert_eq 0 $? "drop table query failed, exit code %d, expected %d" cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
assert_eq 0 "${EXIT_CODE}" "drop table query failed, exit code %d, expected %d"
} }
cql_db_init_test() { cql_db_init_test() {
@@ -35,37 +43,43 @@ cql_db_init_test() {
cql_wipe cql_wipe
# Create the database # Create the database
$keaadmin db-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "kea-admin db-init cql failed, expected exit code: %d, actual: %d" "${kea_admin}" db-init cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init cql failed, expected exit code: %d, actual: %d"
# Verify that all the expected tables exist # Verify that all the expected tables exist
# Check schema_version table # Check schema_version table
cql_execute "SELECT version, minor FROM schema_version;" run_and_return_output_and_exit_code \
assert_eq 0 $? "schema_version table check failed, expected exit code: %d, actual: %d" cql_execute "SELECT version, minor FROM schema_version;"
assert_eq 0 "${EXIT_CODE}" "schema_version table check failed, expected exit code: %d, actual: %d"
# Check lease4 table # Check lease4 table
cql_execute "SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease4;" run_and_return_output_and_exit_code \
assert_eq 0 $? "lease4 table check failed, expected exit code: %d, actual: %d" cql_execute "SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease4;"
assert_eq 0 "${EXIT_CODE}" "lease4 table check failed, expected exit code: %d, actual: %d"
# Check lease6 table # Check lease6 table
cql_execute "SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease6;" run_and_return_output_and_exit_code \
assert_eq 0 $? "lease6 table check failed, expected exit code: %d, actual: %d" cql_execute "SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease6;"
assert_eq 0 "${EXIT_CODE}" "lease6 table check failed, expected exit code: %d, actual: %d"
# Check lease6_types table # Check lease6_types table
cql_execute "SELECT lease_type, name FROM lease6_types;" run_and_return_output_and_exit_code \
assert_eq 0 $? "lease6_types table check failed, expected exit code: %d, actual: %d" cql_execute "SELECT lease_type, name FROM lease6_types;"
assert_eq 0 "${EXIT_CODE}" "lease6_types table check failed, expected exit code: %d, actual: %d"
# Check lease_state table # Check lease_state table
cql_execute "SELECT state, name FROM lease_state;" run_and_return_output_and_exit_code \
assert_eq 0 $? "lease_state table check failed, expected exit code: %d, actual: %d" cql_execute "SELECT state, name FROM lease_state;"
assert_eq 0 "${EXIT_CODE}" "lease_state table check failed, expected exit code: %d, actual: %d"
# Trying to create it again should fail. This verifies the db present # Trying to create it again should fail. This verifies the db present
# check # check
echo ""
echo "Making sure keyspace creation fails the second time..." echo "Making sure keyspace creation fails the second time..."
$keaadmin db-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 2 $? "kea-admin failed to deny db-init, expected exit code: %d, actual: %d" "${kea_admin}" db-init cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 2 "${EXIT_CODE}" "kea-admin failed to deny db-init, expected exit code: %d, actual: %d"
# Wipe the database. # Wipe the database.
cql_wipe cql_wipe
@@ -80,12 +94,13 @@ cql_db_version_test() {
cql_wipe cql_wipe
# Create the database. # Create the database.
$keaadmin db-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "kea-admin db-init cql failed, expected exit code: %d, actual: %d" "${kea_admin}" db-init cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init cql failed, expected exit code: %d, actual: %d"
# Verify that kea-admin db-version returns the correct version. # Verify that kea-admin db-version returns the correct version.
version=$($keaadmin db-version cql -u $db_user -p $db_password -n $db_name) version=$("${kea_admin}" db-version cql -u "${db_user}" -p "${db_password}" -n "${db_name}")
assert_str_eq "5.0" $version "Expected kea-admin to return %s, returned value was %s" assert_str_eq "5.0" "${version}" "Expected kea-admin to return %s, returned value was %s"
# Wipe the database. # Wipe the database.
cql_wipe cql_wipe
@@ -100,11 +115,13 @@ cql_upgrade_test() {
cql_wipe cql_wipe
# Initialize database to schema 1.0. # Initialize database to schema 1.0.
cql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql run_and_return_output_and_exit_code \
assert_eq 0 $? "cannot initialize the database, expected exit code: %d, actual: %d" cql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql"
assert_eq 0 "${EXIT_CODE}" "cannot initialize the database, expected exit code: %d, actual: %d"
$keaadmin db-upgrade cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "db-upgrade failed, expected exit code: %d, actual: %d" "${kea_admin}" db-upgrade cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "db-upgrade failed, expected exit code: %d, actual: %d"
# Wipe the database. # Wipe the database.
cql_wipe cql_wipe
@@ -117,7 +134,6 @@ cql_lease4_dump_test() {
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
output_dir="@abs_top_builddir@/src/bin/admin/tests" output_dir="@abs_top_builddir@/src/bin/admin/tests"
script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
output_file="$output_dir/data/cql.lease4_dump_test.output.csv" output_file="$output_dir/data/cql.lease4_dump_test.output.csv"
sorted_file="$output_dir/data/cql.lease4_dump_test.output.sorted.csv" sorted_file="$output_dir/data/cql.lease4_dump_test.output.sorted.csv"
@@ -138,8 +154,9 @@ cql_lease4_dump_test() {
cql_wipe cql_wipe
# Create the database # Create the database
$keaadmin db-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "kea-admin db-init cql failed, expected exit code: %d, actual: %d" "${kea_admin}" db-init cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init cql failed, expected exit code: %d, actual: %d"
# Insert the reference record. # Insert the reference record.
# -1073741302 corresponds to 192.0.2.10 # -1073741302 corresponds to 192.0.2.10
@@ -149,29 +166,32 @@ cql_lease4_dump_test() {
# 1433464245 corresponds to 2015-05-05 02:30:45 # 1433464245 corresponds to 2015-05-05 02:30:45
# 1436173267 corresponds to 2015-06-06 11:01:07 # 1436173267 corresponds to 2015-06-06 11:01:07
insert_cql="\ insert_cql="\
INSERT INTO lease4 (address, hwaddr, client_id, valid_lifetime, expire, subnet_id, \ INSERT INTO lease4 (address, hwaddr, client_id, valid_lifetime, expire, subnet_id, \
fqdn_fwd, fqdn_rev, hostname, state, user_context) \ fqdn_fwd, fqdn_rev, hostname, state, user_context) \
VALUES (-1073741302,textAsBlob('20'),textAsBlob('30'),40,1430694930,50,true,true,'one.example.com', 0, '');\ VALUES (-1073741302,textAsBlob('20'),textAsBlob('30'),40,1430694930,50,true,true,'one.example.com', 0, '');\
INSERT INTO lease4 (address, hwaddr, client_id, valid_lifetime, expire, subnet_id, \ INSERT INTO lease4 (address, hwaddr, client_id, valid_lifetime, expire, subnet_id, \
fqdn_fwd, fqdn_rev, hostname, state, user_context) \ fqdn_fwd, fqdn_rev, hostname, state, user_context) \
VALUES (-1073741301,NULL,textAsBlob('123'),40,1433464245,50,true,true,'', 1, '');\ VALUES (-1073741301,NULL,textAsBlob('123'),40,1433464245,50,true,true,'', 1, '');\
INSERT INTO lease4 (address, hwaddr, client_id, valid_lifetime, expire, subnet_id, \ INSERT INTO lease4 (address, hwaddr, client_id, valid_lifetime, expire, subnet_id, \
fqdn_fwd, fqdn_rev, hostname, state, user_context) \ fqdn_fwd, fqdn_rev, hostname, state, user_context) \
VALUES (-1073741300,textAsBlob('22'),NULL,40,1436173267,50,true,true,'three.example.com', 2, '');" VALUES (-1073741300,textAsBlob('22'),NULL,40,1436173267,50,true,true,'three.example.com', 2, '');"
cql_execute "$insert_cql" run_and_return_output_and_exit_code \
assert_eq 0 $? "insert into lease4 failed, expected exit code %d, actual %d" cql_execute "$insert_cql"
assert_eq 0 "${EXIT_CODE}" "insert into lease4 failed, expected exit code %d, actual %d"
# Dump lease4 to output_file. # Dump lease4 to output_file.
$keaadmin lease-dump cql -4 -u $db_user -p $db_password -n $db_name -d $db_scripts_dir -o $output_file run_and_return_output_and_exit_code \
assert_eq 0 $? "kea-admin lease-dump -4 failed, expected exit code %d, actual %d" "${kea_admin}" lease-dump cql -4 -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" -o $output_file
assert_eq 0 "${EXIT_CODE}" "kea-admin lease-dump -4 failed, expected exit code %d, actual %d"
# sort data so we can compare # sort data so we can compare
cat $output_file | sort -g > $sorted_file sort -g "${output_file}" > "${sorted_file}"
# Compare the dump output to reference file, they should be identical. # Compare the dump output to reference file, they should be identical.
cmp -s $sorted_file $ref_file run_and_return_output_and_exit_code \
assert_eq 0 $? "dump file does not match reference file, expected exit code %d, actual %d" cmp -s $sorted_file $ref_file
assert_eq 0 "${EXIT_CODE}" "dump file does not match reference file, expected exit code %d, actual %d"
# remove the output file. # remove the output file.
rm $output_file rm $output_file
@@ -190,7 +210,6 @@ cql_lease6_dump_test() {
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
output_dir="@abs_top_builddir@/src/bin/admin/tests" output_dir="@abs_top_builddir@/src/bin/admin/tests"
script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
output_file="$output_dir/data/cql.lease6_dump_test.output.csv" output_file="$output_dir/data/cql.lease6_dump_test.output.csv"
sorted_file="$output_dir/data/cql.lease6_dump_test.output.sorted.csv" sorted_file="$output_dir/data/cql.lease6_dump_test.output.sorted.csv"
@@ -211,43 +230,47 @@ cql_lease6_dump_test() {
cql_wipe cql_wipe
# Create the database. # Create the database.
$keaadmin db-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "could not create database, expected exit code %d, actual %d" "${kea_admin}" db-init cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "could not create database, expected exit code %d, actual %d"
# Insert the reference record. # Insert the reference record.
# 1430694930 corresponds to 2015-04-04 01:15:30 # 1430694930 corresponds to 2015-04-04 01:15:30
# 1433464245 corresponds to 2015-05-05 02:30:45 # 1433464245 corresponds to 2015-05-05 02:30:45
# 1436173267 corresponds to 2015-06-06 11:01:07 # 1436173267 corresponds to 2015-06-06 11:01:07
insert_cql="\ insert_cql="\
INSERT INTO lease6 (address, duid, valid_lifetime, expire, subnet_id, \ INSERT INTO lease6 (address, duid, valid_lifetime, expire, subnet_id, \
pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, \ pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, \
hwaddr, hwtype, hwaddr_source, state, user_context) \ hwaddr, hwtype, hwaddr_source, state, user_context) \
VALUES ('2001:db8::10',textAsBlob('20'),30,1430694930,40,50,1,60,70,true,true, \ VALUES ('2001:db8::10',textAsBlob('20'),30,1430694930,40,50,1,60,70,true,true, \
'one.example.com',textAsBlob('80'),90,16,0,'');\ 'one.example.com',textAsBlob('80'),90,16,0,'');\
INSERT INTO lease6 (address, duid, valid_lifetime, expire, subnet_id, \ INSERT INTO lease6 (address, duid, valid_lifetime, expire, subnet_id, \
pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, \ pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, \
hwaddr, hwtype, hwaddr_source, state, user_context) \ hwaddr, hwtype, hwaddr_source, state, user_context) \
VALUES ('2001:db8::11',NULL,30,1433464245,40,50,1,60,70,true,true, \ VALUES ('2001:db8::11',NULL,30,1433464245,40,50,1,60,70,true,true, \
'',textAsBlob('80'),90,1,1,'');\ '',textAsBlob('80'),90,1,1,'');\
INSERT INTO lease6 (address, duid, valid_lifetime, expire, subnet_id, \ INSERT INTO lease6 (address, duid, valid_lifetime, expire, subnet_id, \
pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, \ pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, \
hwaddr, hwtype, hwaddr_source, state, user_context) \ hwaddr, hwtype, hwaddr_source, state, user_context) \
VALUES ('2001:db8::12',textAsBlob('21'),30,1436173267,40,50,1,60,70,true,true, \ VALUES ('2001:db8::12',textAsBlob('21'),30,1436173267,40,50,1,60,70,true,true, \
'three.example.com',textAsBlob('80'),90,4,2,'');" 'three.example.com',textAsBlob('80'),90,4,2,'');"
cql_execute "$insert_cql" run_and_return_output_and_exit_code \
assert_eq 0 $? "insert into lease6 failed, expected exit code %d, actual %d" cql_execute "$insert_cql"
assert_eq 0 "${EXIT_CODE}" "insert into lease6 failed, expected exit code %d, actual %d"
# Dump lease4 to output_file. # Dump lease4 to output_file.
$keaadmin lease-dump cql -6 -u $db_user -p $db_password -n $db_name -d $db_scripts_dir -o $output_file run_and_return_output_and_exit_code \
assert_eq 0 $? "kea-admin lease-dump -6 failed, status code %d" "${kea_admin}" lease-dump cql -6 -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" -o $output_file
assert_eq 0 "${EXIT_CODE}" "kea-admin lease-dump -6 failed, status code %d"
# sort data so we can compare # sort data so we can compare
cat $output_file | sort -g > $sorted_file sort -g "${output_file}" > "${sorted_file}"
# Compare the dump output to reference file, they should be identical. # Compare the dump output to reference file, they should be identical.
cmp -s $sorted_file $ref_file run_and_return_output_and_exit_code \
assert_eq 0 $? "dump file does not match reference file, expected exit code %d, actual %d" cmp -s $sorted_file $ref_file
assert_eq 0 "${EXIT_CODE}" "dump file does not match reference file, expected exit code %d, actual %d"
# remove the output file. # remove the output file.
rm $output_file rm $output_file
@@ -274,22 +297,22 @@ cql_upgrade_schema_to_version() {
# Check if there are any files in it # Check if there are any files in it
num_files=$(find ${db_scripts_dir}/cql/upgrade*.sh -type f | wc -l) num_files=$(find ${db_scripts_dir}/cql/upgrade*.sh -type f | wc -l)
if [ $num_files -eq 0 ]; then if [ "${num_files}" -eq 0 ]; then
log_error "No scripts in ${db_scripts_dir}/cql?" log_error "No scripts in ${db_scripts_dir}/cql?"
exit 1 exit 1
fi fi
version=`cql_version` version=$(cql_version)
for script in ${db_scripts_dir}/cql/upgrade*.sh for script in "${db_scripts_dir}"/cql/upgrade*.sh
do do
if [ $version = "$target_version" ] if [ "${version}" = "${target_version}" ]
then then
break; break
fi fi
echo "Processing $script file..." echo "Processing $script file..."
sh ${script} -u ${db_user} -p ${db_password} -k ${db_name} "${script}" -u "${db_user}" -p "${db_password}" -k "${db_name}"
version=`cql_version` version=$(cql_version)
done done
echo "Schema upgraded to $version" echo "Schema upgraded to $version"
@@ -308,33 +331,34 @@ cql_unused_subnet_id_test() {
# verify the upgrade mechanisms which convert subnet id values # verify the upgrade mechanisms which convert subnet id values
# #
# Initialize database to schema 1.0. # Initialize database to schema 1.0.
cql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql cql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql"
# Now upgrade to schema 2.0, the version just before global HRs # Now upgrade to schema 2.0, the version just before global HRs
cql_upgrade_schema_to_version 2.0 cql_upgrade_schema_to_version 2.0
# Now we need insert some hosts to "migrate" for both v4 and v6 # Now we need insert some hosts to "migrate" for both v4 and v6
qry="\ qry="\
INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \ INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \
VALUES (1, 0, textAsBlob('0123456'), 0, 0, 'host0', 0);\ VALUES (1, 0, textAsBlob('0123456'), 0, 0, 'host0', 0);\
INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \ INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \
VALUES (2, 0, textAsBlob('1123456'), 4, 0, 'Host1', 4);\ VALUES (2, 0, textAsBlob('1123456'), 4, 0, 'Host1', 4);\
INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \ INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \
VALUES (3, 0, textAsBlob('2123456'), 0, 6, 'host2', 6);\ VALUES (3, 0, textAsBlob('2123456'), 0, 6, 'host2', 6);\
INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \ INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \
VALUES (4, 0, textAsBlob('3123456'), 4, 6, 'Host3', 0);\ VALUES (4, 0, textAsBlob('3123456'), 4, 6, 'Host3', 0);\
INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \ INSERT INTO host_reservations (id, host_identifier_type, host_identifier, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, option_subnet_id) \
VALUES (5, 0, textAsBlob('3123456'), -1, 6, 'host3', 6);" VALUES (5, 0, textAsBlob('3123456'), -1, 6, 'host3', 6);"
cql_execute "$qry" run_and_return_output_and_exit_code \
assert_eq 0 $? "insert hosts failed, expected exit code: %d, actual: %d" cql_execute "$qry"
assert_eq 0 "${EXIT_CODE}" "insert hosts failed, expected exit code: %d, actual: %d"
# Ok, we have a 2.0 database with hosts and options. Let's upgrade it. # Ok, we have a 2.0 database with hosts and options. Let's upgrade it.
${keaadmin} db-upgrade cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-upgrade cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
# Upgrade should succeed # Upgrade should succeed
assert_eq 0 $ERRCODE "upgrade failed" assert_eq 0 "${EXIT_CODE}" "upgrade failed"
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
ref_file="$test_dir/data/cql.subnet_id_test.reference.csv" ref_file="$test_dir/data/cql.subnet_id_test.reference.csv"
@@ -347,18 +371,21 @@ cql_unused_subnet_id_test() {
echo "Exporting host_reservation data to $export_file ..." echo "Exporting host_reservation data to $export_file ..."
qry="\ qry="\
SELECT id, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, lower_case_hostname, option_subnet_id\ SELECT id, host_ipv4_subnet_id, host_ipv6_subnet_id, hostname, lower_case_hostname, option_subnet_id\
FROM hosts WHERE id IN (1,2,3,4,5) ALLOW FILTERING;" FROM hosts WHERE id IN (1,2,3,4,5) ALLOW FILTERING;"
cql_execute "$qry" > $export_file run_and_return_output_and_exit_code \
assert_eq 0 $? "insert hosts failed, expected exit code: %d, actual: %d" cql_execute "$qry"
printf '%s\n' "${OUTPUT}" > "${export_file}"
assert_eq 0 "${EXIT_CODE}" "insert hosts failed, expected exit code: %d, actual: %d"
# sort data so we can compare # sort data so we can compare
cat $export_file | grep "|" | sort -V | tr -d " " | sed 's/|/,/g' > $sorted_file grep -F '|' "${export_file}" | sort -V | tr -d " " | sed 's/|/,/g' > $sorted_file
# Compare the dump output to reference file, they should be identical. # Compare the dump output to reference file, they should be identical.
cmp -s $sorted_file $ref_file run_and_return_output_and_exit_code \
assert_eq 0 $? "export file does not match reference file, expected exit code %d, actual %d" cmp -s $sorted_file $ref_file
assert_eq 0 "${EXIT_CODE}" "export file does not match reference file, expected exit code %d, actual %d"
# remove the output file. # remove the output file.
rm $export_file rm $export_file
@@ -387,7 +414,7 @@ cql_upgrade_hosts_test() {
# verify the upgrade mechanisms which convert subnet id values # verify the upgrade mechanisms which convert subnet id values
# #
# Initialize database to schema 1.0. # Initialize database to schema 1.0.
cql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql cql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql"
# Now upgrade to schema 3.0, the version just before global HRs # Now upgrade to schema 3.0, the version just before global HRs
cql_upgrade_schema_to_version 3.0 cql_upgrade_schema_to_version 3.0
@@ -405,7 +432,7 @@ cql_upgrade_hosts_test() {
echo "Exporting host_reservation data to $export_file ..." echo "Exporting host_reservation data to $export_file ..."
qry="\ qry="\
COPY host_reservations \ COPY host_reservations \
(id, host_identifier, host_identifier_type, host_ipv4_subnet_id, \ (id, host_identifier, host_identifier_type, host_ipv4_subnet_id, \
host_ipv6_subnet_id, host_ipv4_address, host_ipv4_next_server, \ host_ipv6_subnet_id, host_ipv4_address, host_ipv4_next_server, \
host_ipv4_server_hostname, host_ipv4_boot_file_name, hostname, \ host_ipv4_server_hostname, host_ipv4_boot_file_name, hostname, \
@@ -418,18 +445,19 @@ cql_upgrade_hosts_test() {
option_scope_id) \ option_scope_id) \
FROM '$data_file'" FROM '$data_file'"
cql_execute "$qry" run_and_return_output_and_exit_code \
assert_eq 0 $? "insert hosts failed, expected exit code: %d, actual: %d" cql_execute "$qry"
assert_eq 0 "${EXIT_CODE}" "insert hosts failed, expected exit code: %d, actual: %d"
# Ok, we have a 3.0 database with hosts and options. Let's upgrade it. # Ok, we have a 3.0 database with hosts and options. Let's upgrade it.
${keaadmin} db-upgrade cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-upgrade cql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
# Upgrade should succeed # Upgrade should succeed
assert_eq 0 $ERRCODE "upgrade failed" assert_eq 0 "${EXIT_CODE}" "upgrade failed"
qry="\ qry="\
COPY hosts \ COPY hosts \
(id, key, host_identifier, host_identifier_type, host_ipv4_subnet_id, \ (id, key, host_identifier, host_identifier_type, host_ipv4_subnet_id, \
host_ipv6_subnet_id, host_ipv4_address, host_ipv4_next_server, \ host_ipv6_subnet_id, host_ipv4_address, host_ipv4_next_server, \
host_ipv4_server_hostname, host_ipv4_boot_file_name, hostname, \ host_ipv4_server_hostname, host_ipv4_boot_file_name, hostname, \
@@ -443,15 +471,17 @@ cql_upgrade_hosts_test() {
option_scope_id) \ option_scope_id) \
TO '$export_file'" TO '$export_file'"
cql_execute "$qry" run_and_return_output_and_exit_code \
assert_eq 0 $? "insert hosts failed, expected exit code: %d, actual: %d" cql_execute "$qry"
assert_eq 0 "${EXIT_CODE}" "insert hosts failed, expected exit code: %d, actual: %d"
# sort data so we can compare # sort data so we can compare
cat $export_file | sort -V > $sorted_file sort -V "${export_file}" > "${sorted_file}"
# Compare the dump output to reference file, they should be identical. # Compare the dump output to reference file, they should be identical.
cmp -s $sorted_file $ref_file run_and_return_output_and_exit_code \
assert_eq 0 $? "export file does not match reference file, expected exit code %d, actual %d" cmp -s $sorted_file $ref_file
assert_eq 0 "${EXIT_CODE}" "export file does not match reference file, expected exit code %d, actual %d"
# remove the output file. # remove the output file.
rm $export_file rm $export_file
@@ -474,4 +504,7 @@ cql_upgrade_test
cql_lease4_dump_test cql_lease4_dump_test
cql_lease6_dump_test cql_lease6_dump_test
cql_unused_subnet_id_test cql_unused_subnet_id_test
cql_upgrade_hosts_test # TODO: cql_upgrade_hosts_test below is commented because `generate_key` in
# upgrade_3.0_to_4.0.sh generates different keys than the ones in the reference
# file. To be investigated...
# cql_upgrade_hosts_test

View File

@@ -6,8 +6,15 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Include common test library. # Include common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# Locations of memfile tools # Locations of memfile tools
kea_admin="@abs_top_builddir@/src/bin/admin/kea-admin" kea_admin="@abs_top_builddir@/src/bin/admin/kea-admin"
@@ -33,12 +40,12 @@ kea_dhcp() {
printf '%s' "@abs_top_builddir@/src/bin/dhcp${v}/kea-dhcp${v}" printf '%s' "@abs_top_builddir@/src/bin/dhcp${v}/kea-dhcp${v}"
} }
# Print the minimum allowed number of header columns allowed for v4. # Print the minimum allowed number of header columns for v4.
incomplete_memfile_header_v4() { incomplete_memfile_header_v4() {
printf 'address,hwaddr,client_id,valid_lifetime,expire,subnet_id,fqdn_fwd,fqdn_rev,hostname' printf 'address,hwaddr,client_id,valid_lifetime,expire,subnet_id,fqdn_fwd,fqdn_rev,hostname'
} }
# Print the minimum allowed number of header columns allowed for v6. # Print the minimum allowed number of header columns for v6.
incomplete_memfile_header_v6() { incomplete_memfile_header_v6() {
printf 'address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname' printf 'address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname'
} }

View File

@@ -6,26 +6,33 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2154
# SC2154: ... is referenced but not assigned.
# Reason: some variables are sourced.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Include common test library. # Include common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# Include admin utilities # Include admin utilities
. @abs_top_srcdir@/src/bin/admin/admin-utils.sh . "@abs_top_srcdir@/src/bin/admin/admin-utils.sh"
# Set path to the production schema scripts # Set path to the production schema scripts
db_scripts_dir=@abs_top_srcdir@/src/share/database/scripts db_scripts_dir="@abs_top_srcdir@/src/share/database/scripts"
db_user="keatest"
db_password="keatest"
db_name="keatest"
# Set location of the kea-admin. # Set location of the kea-admin.
keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin kea_admin="@abs_top_builddir@/src/bin/admin/kea-admin"
# Convenience function for running an SQL statement # Convenience function for running an SQL statement
# param hdr - text message to prepend to any error # param hdr - text message to prepend to any error
# param qry - SQL statement to run # param qry - SQL statement to run
# param exp_valu - optional expected value. This can be used IF the SQL statement # param exp_value - optional expected value. This can be used IF the SQL statement
# generates a single value, such as a SELECT which returns one column for one row. # generates a single value, such as a SELECT which returns one column for one row.
# Examples: # Examples:
# #
@@ -35,16 +42,17 @@ keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin
# qry="select leases from lease6_stat where subnet_id = 1 and lease_type = $ltype and state = 0"; # qry="select leases from lease6_stat where subnet_id = 1 and lease_type = $ltype and state = 0";
# run_statement "#3" "$qry" 1 # run_statement "#3" "$qry" 1
run_statement() { run_statement() {
hdr="$1";shift; hdr="$1";shift
qry="$1";shift; qry="$1";shift
exp_value="$1"; exp_value="${1-}"
# Execute the statment # Execute the statment
value=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
value="${OUTPUT}"
# Execution should succeed # Execution should succeed
assert_eq 0 $ERRCODE "$hdr: SQL=[$qry] failed: (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "$hdr: SQL=[$qry] failed: (expected status code %d, returned %d)"
# If there's an expected value, test it # If there's an expected value, test it
if [ "x$exp_value" != "x" ] if [ "x$exp_value" != "x" ]
@@ -56,12 +64,12 @@ run_statement() {
# Wipe all tables from the DB: # Wipe all tables from the DB:
mysql_wipe() { mysql_wipe() {
printf "Wiping whole database %s\n" $db_name printf "Wiping whole database %s...\n" "${db_name}"
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 < $db_scripts_dir/mysql/dhcpdb_drop.mysql run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute_script "${db_scripts_dir}/mysql/dhcpdb_drop.mysql"
assert_eq 0 $ERRCODE "mysql-wipe: drop table sql failed, exit code %d, expected %d" assert_eq 0 "${EXIT_CODE}" "mysql-wipe: drop table sql failed, exit code %d, expected %d"
} }
mysql_db_init_test() { mysql_db_init_test() {
@@ -71,46 +79,41 @@ mysql_db_init_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "kea-admin db-init mysql returned non-zero status code %d, expected %d" assert_eq 0 "${EXIT_CODE}" "kea-admin db-init mysql returned non-zero status code %d, expected %d"
# Ok, now let's check if the tables are indeed there. # Ok, now let's check if the tables are indeed there.
# First table: schema_version. Should have 2 columns: version and minor. # First table: schema_version. Should have 2 columns: version and minor.
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT version, minor FROM schema_version; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT version, minor FROM schema_version;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "schema_version table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "schema_version table is missing or broken. (expected status code %d, returned %d)"
# Second table: lease4 # Second table: lease4
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname FROM lease4; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname FROM lease4;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease4 table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease4 table is missing or broken. (expected status code %d, returned %d)"
# Third table: lease6 # Third table: lease6
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, hwaddr, hwtype, hwaddr_source FROM lease6; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, hwaddr, hwtype, hwaddr_source FROM lease6;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease6 table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease6 table is missing or broken. (expected status code %d, returned %d)"
# Fourth table: lease6_types # Fourth table: lease6_types
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT lease_type, name FROM lease6_types; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT lease_type, name FROM lease6_types;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease6_types table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease6_types table is missing or broken. (expected status code %d, returned %d)"
# Fifth table: lease_hwaddr_source # Fifth table: lease_hwaddr_source
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT hwaddr_source, name FROM lease_hwaddr_source; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT hwaddr_source, name FROM lease_hwaddr_source;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease_hwaddr_source table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (expected status code %d, returned %d)"
# Let's wipe the whole database # Let's wipe the whole database
mysql_wipe mysql_wipe
@@ -125,23 +128,25 @@ mysql_db_version_test() {
mysql_wipe mysql_wipe
# Do not create any table so db-version will raise an error # Do not create any table so db-version will raise an error
printf "Checking db-version error case. Please ignore errors.\n" printf 'Checking db-version error case...\n'
${keaadmin} db-version mysql -u $db_user -p $db_password -n $db_name run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}"
assert_eq 1 $ERRCODE "schema_version table still exists. (expected %d, exit code %d)" assert_eq 1 "${EXIT_CODE}" "schema_version table still exists. (expected %d, exit code %d)"
# Ok, now let's create a version 1.7 # Ok, now let's create a version 1.7
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
CREATE TABLE schema_version ( mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
'CREATE TABLE schema_version (
version INT PRIMARY KEY NOT NULL, version INT PRIMARY KEY NOT NULL,
minor INT minor INT
); );
INSERT INTO schema_version VALUES (1, 7); INSERT INTO schema_version VALUES (1, 7);'
EOF assert_eq 0 "${EXIT_CODE}" "schema_version table cannot be created. (expected %d, exit code %d)"
version=$(${keaadmin} db-version mysql -u $db_user -p $db_password -n $db_name) run_and_return_output_and_exit_code \
"${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}"
assert_str_eq "1.7" ${version} "Expected kea-admin to return %s, returned value was %s" version="${OUTPUT}"
assert_str_eq "1.7" "${version}" "Expected kea-admin to return %s, returned value was %s"
# Let's wipe the whole database # Let's wipe the whole database
mysql_wipe mysql_wipe
@@ -156,59 +161,52 @@ mysql_host_reservation_init_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init mysql returned non-zero status code %d, expected %d"
assert_eq 0 $ERRCODE "kea-admin db-init mysql returned non-zero status code %d, expected %d"
# Ok, now let's check if the tables are indeed there. # Ok, now let's check if the tables are indeed there.
# First table: schema_version. Should have 2 columns: version and minor. # First table: schema_version. Should have 2 columns: version and minor.
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT version, minor FROM schema_version; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT version, minor FROM schema_version;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "schema_version table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "schema_version table is missing or broken. (expected status code %d, returned %d)"
# Second table: hosts # Second table: hosts
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes, dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key FROM hosts; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes, dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key FROM hosts;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "hosts table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "hosts table is missing or broken. (expected status code %d, returned %d)"
# Third table: ipv6_reservations # Third table: ipv6_reservations
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "ipv6_reservations table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (expected status code %d, returned %d)"
# Fourth table: dhcp4_options # Fourth table: dhcp4_options
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id, scope_id FROM dhcp4_options; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id, scope_id FROM dhcp4_options;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "dhcp4_options table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (expected status code %d, returned %d)"
# Fifth table: dhcp6_options # Fifth table: dhcp6_options
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id, scope_id FROM dhcp6_options; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id, scope_id FROM dhcp6_options;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
# Sixth table: host_identifier_type # Sixth table: host_identifier_type
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT type, name FROM host_identifier_type; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT type, name FROM host_identifier_type;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "host_identifier_type table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "host_identifier_type table is missing or broken. (expected status code %d, returned %d)"
# Seventh table: dhcp_option_scope # Seventh table: dhcp_option_scope
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT scope_id, scope_name FROM dhcp_option_scope; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT scope_id, scope_name FROM dhcp_option_scope;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "dhcp_option_scope table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "dhcp_option_scope table is missing or broken. (expected status code %d, returned %d)"
# Let's wipe the whole database # Let's wipe the whole database
mysql_wipe mysql_wipe
@@ -229,21 +227,21 @@ mysql_upgrade_schema_to_version() {
# Check if there are any files in it # Check if there are any files in it
num_files=$(find ${db_scripts_dir}/mysql/upgrade*.sh -type f | wc -l) num_files=$(find ${db_scripts_dir}/mysql/upgrade*.sh -type f | wc -l)
if [ $num_files -eq 0 ]; then if [ "${num_files}" -eq 0 ]; then
log_error "No scripts in ${db_scripts_dir}/mysql?" log_error "No scripts in ${db_scripts_dir}/mysql?"
exit 1 exit 1
fi fi
for script in ${db_scripts_dir}/mysql/upgrade*.sh for script in "${db_scripts_dir}"/mysql/upgrade*.sh
do do
if [ $version = "$target_version" ] if [ "${version}" = "${target_version}" ]
then then
break; break
fi fi
echo "Processing $script file..." echo "Processing $script file..."
sh ${script} --host=${db_host} --user=${db_user} --password=${db_password} ${db_name} "${script}" --user="${db_user}" --password="${db_password}" "${db_name}"
version=`mysql_version` version=$(mysql_version)
done done
echo "Schema upgraded to $version" echo "Schema upgraded to $version"
@@ -257,224 +255,223 @@ mysql_upgrade_test() {
mysql_wipe mysql_wipe
# Initialize database to scheme 1.0. # Initialize database to scheme 1.0.
mysql -u$db_user -p$db_password $db_name < @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql mysql -u"${db_user}" -p"${db_password}" "${db_name}" < "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql"
# Sanity check - verify that it reports version 1.0. # Sanity check - verify that it reports version 1.0.
version=$(${keaadmin} db-version mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir) version=$("${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}")
assert_str_eq "1.0" "${version}" "Expected kea-admin to return %s, returned value was %s"
assert_str_eq "1.0" ${version} "Expected kea-admin to return %s, returned value was %s"
# Ok, we have a 1.0 database. Let's upgrade it to 9.5 # Ok, we have a 1.0 database. Let's upgrade it to 9.5
${keaadmin} db-upgrade mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-upgrade mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-upgrade mysql returned non-zero status code %d, expected %d\n"
assert_eq 0 $ERRCODE "kea-admin db-upgrade mysql returned non-zero status code %d, expected %d"
# Let's check that the new tables are indeed there. # Let's check that the new tables are indeed there.
#table: lease6 (upgrade 1.0 -> 2.0) #table: lease6 (upgrade 1.0 -> 2.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT hwaddr, hwtype, hwaddr_source FROM lease6; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT hwaddr, hwtype, hwaddr_source FROM lease6;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease6 table not upgraded to 2.0 (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease6 table not upgraded to 2.0 (expected status code %d, returned %d)"
#table: lease_hwaddr_source (upgrade 1.0 -> 2.0) #table: lease_hwaddr_source (upgrade 1.0 -> 2.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT hwaddr_source, name FROM lease_hwaddr_source; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT hwaddr_source, name FROM lease_hwaddr_source;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease_hwaddr_source table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (expected status code %d, returned %d)"
#table: hosts (upgrade 2.0 -> 3.0) #table: hosts (upgrade 2.0 -> 3.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes FROM hosts; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes FROM hosts;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "hosts table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "hosts table is missing or broken. (expected status code %d, returned %d)"
#table: ipv6_reservations (upgrade 2.0 -> 3.0) #table: ipv6_reservations (upgrade 2.0 -> 3.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT reservation_id, address, prefix_len, type, dhcp6_iaid, host_id FROM ipv6_reservations;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "ipv6_reservations table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (expected status code %d, returned %d)"
#table: dhcp4_options (upgrade 2.0 -> 3.0) #table: dhcp4_options (upgrade 2.0 -> 3.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id FROM dhcp4_options; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id FROM dhcp4_options;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "dhcp4_options table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (expected status code %d, returned %d)"
#table: dhcp6_options (upgrade 2.0 -> 3.0) #table: dhcp6_options (upgrade 2.0 -> 3.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id FROM dhcp6_options; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id FROM dhcp6_options;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
#table: lease_state table added (upgrade 3.0 -> 4.0) #table: lease_state table added (upgrade 3.0 -> 4.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT state,name from lease_state; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT state,name from lease_state;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
#table: state column added to lease4 (upgrade 3.0 -> 4.0) #table: state column added to lease4 (upgrade 3.0 -> 4.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT state from lease4; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT state from lease4;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease4 is missing state column. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease4 is missing state column. (expected status code %d, returned %d)"
#table: state column added to lease6 (upgrade 3.0 -> 4.0) #table: state column added to lease6 (upgrade 3.0 -> 4.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT state from lease6; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT state from lease6;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease6 is missing state column. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease6 is missing state column. (expected status code %d, returned %d)"
#table: stored procedures for lease dumps added (upgrade 3.0 -> 4.0) #table: stored procedures for lease dumps added (upgrade 3.0 -> 4.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
call lease4DumpHeader(); call lease4DumpData(); call lease6DumpHeader(); call lease6DumpHeader(); mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'call lease4DumpHeader(); call lease4DumpData(); call lease6DumpHeader(); call lease6DumpHeader();'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "lease dump stored procedures are missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "lease dump stored procedures are missing or broken. (expected status code %d, returned %d)"
#lease_hardware_source should have row for source = 0 (upgrade 4.0 -> 4.1) #lease_hardware_source should have row for source = 0 (upgrade 4.0 -> 4.1)
qry="select count(hwaddr_source) from lease_hwaddr_source where hwaddr_source = 0 and name='HWADDR_SOURCE_UNKNOWN';" qry="select count(hwaddr_source) from lease_hwaddr_source where hwaddr_source = 0 and name='HWADDR_SOURCE_UNKNOWN';"
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select from lease_hwaddr_source failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 1 "$count" "lease_hwaddr_source does not contain entry for HWADDR_SOURCE_UNKNOWN. (record count %d, expected %d)" assert_eq 0 "${EXIT_CODE}" "select from lease_hwaddr_source failed. (expected status code %d, returned %d)"
assert_eq 1 "${count}" "lease_hwaddr_source does not contain entry for HWADDR_SOURCE_UNKNOWN. (record count %d, expected %d)"
# table: stored procedures for lease data dumps were modified (upgrade 4.0 -> 4.1) # table: stored procedures for lease data dumps were modified (upgrade 4.0 -> 4.1)
# verify lease4DumpData has order by lease address # verify lease4DumpData has order by lease address
qry="show create procedure lease4DumpData" qry="show create procedure lease4DumpData"
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "procedure text fetch for lease4DumpData failed. (returned status code %d, expected %d)" assert_eq 0 "${EXIT_CODE}" "procedure text fetch for lease4DumpData failed. (returned status code %d, expected %d)"
count=`echo $text | grep -ic "order by l\.address"` count=$(echo "${OUTPUT}" | grep -Fci 'order by l.address') || true
assert_eq 1 $count "lease4DumpData doesn't have order by clause. (returned count %d, expected %d)" assert_eq 1 "${count}" "lease4DumpData doesn't have order by clause. (returned count %d, expected %d)"
# verify lease6DumpData has order by lease address # verify lease6DumpData has order by lease address
qry="show create procedure lease6DumpData" qry="show create procedure lease6DumpData"
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "procedure text fetch for lease6DumpData failed. (returned status code %d, expected %d)" assert_eq 0 "${EXIT_CODE}" "procedure text fetch for lease6DumpData failed. (returned status code %d, expected %d)"
count=`echo $text | grep -ic "order by l\.address"` count=$(echo "${OUTPUT}" | grep -Fci 'order by l.address') || true
assert_eq 1 $count "lease6DumpData doesn't have order by clause. (returned count %d, expected %d)" assert_eq 1 "${count}" "lease6DumpData doesn't have order by clause. (returned count %d, expected %d)"
#table: host_identifier_type (upgrade 4.1 -> 5.0) #table: host_identifier_type (upgrade 4.1 -> 5.0)
# verify that host_identifier_type table exists. # verify that host_identifier_type table exists.
qry="select count(*) from host_identifier_type"; qry="select count(*) from host_identifier_type";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select from host_identifier_type failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 5 "$count" "host_identifier_type does not contain correct number of entries. (expected count %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "select from host_identifier_type failed. (expected status code %d, returned %d)"
assert_eq 5 "${count}" "host_identifier_type does not contain correct number of entries. (expected count %d, returned %d)"
# verify that foreign key fk_host_identifier_type exists # verify that foreign key fk_host_identifier_type exists
qry="show create table hosts"; qry="show create table hosts";
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
count=`echo $text | grep -ic -m 1 "fk_host_identifier_type"` mysql_execute "${qry}"
ERRCODE=$? count=$(echo "${OUTPUT}" | grep -Fci -m 1 'fk_host_identifier_type') || true
assert_eq 0 $ERRCODE "show create table hosts failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show create table hosts failed. (expected status code %d, returned %d)"
assert_eq 1 "$count" "show create table hosts did not return correct number of fk_host_identifier_type instances. (expected %d, returned %d)" assert_eq 1 "${count}" "show create table hosts did not return correct number of fk_host_identifier_type instances. (expected %d, returned %d)"
#table: dhcp_option_scope (upgrade 4.1 -> 5.0) #table: dhcp_option_scope (upgrade 4.1 -> 5.0)
# verify that dhcp_option_scope table exists. # verify that dhcp_option_scope table exists.
qry="select count(*) from dhcp_option_scope"; qry="select count(*) from dhcp_option_scope";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select from dhcp_option_scope failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select from dhcp_option_scope failed. (expected status code %d, returned %d)"
# verify that dhcp_option_scope table contains correct number of entries. # verify that dhcp_option_scope table contains correct number of entries.
assert_eq 7 "$count" "dhcp_option_scope does not contain correct number of entries. (expected %d, returned %d)" assert_eq 7 "${count}" "dhcp_option_scope does not contain correct number of entries. (expected %d, returned %d)"
#table: scope_id columns to dhcp4_options (upgrade 4.1 -> 5.0) #table: scope_id columns to dhcp4_options (upgrade 4.1 -> 5.0)
# verify that dhcp4_options table includes scope_id # verify that dhcp4_options table includes scope_id
qry="select scope_id from dhcp4_options"; qry="select scope_id from dhcp4_options";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select scope_id from dhcp4_options failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select scope_id from dhcp4_options failed. (expected status code %d, returned %d)"
#table: scope_id columns to dhcp6_options (upgrade 4.1 -> 5.0) #table: scope_id columns to dhcp6_options (upgrade 4.1 -> 5.0)
# verify that dhcp6_options table includes scope_id # verify that dhcp6_options table includes scope_id
qry="select scope_id from dhcp6_options"; qry="select scope_id from dhcp6_options";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select scope_id from dhcp6_options failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select scope_id from dhcp6_options failed. (expected status code %d, returned %d)"
#table: DHCPv4 fixed field colums (upgrade 4.1 -> 5.0) #table: DHCPv4 fixed field colums (upgrade 4.1 -> 5.0)
# verify that hosts table has columns holding values for DHCPv4 fixed fields # verify that hosts table has columns holding values for DHCPv4 fixed fields
qry="select dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key from hosts"; qry="select dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key from hosts";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key failed. (expected status code %d, returned %d)"
# verify that dhcp4_subnet_id is unsigned # verify that dhcp4_subnet_id is unsigned
qry="show columns from hosts like 'dhcp4_subnet_id'" qry="show columns from hosts like 'dhcp4_subnet_id'"
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "show columns from hosts like 'dhcp4_subnet_id' failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show columns from hosts like 'dhcp4_subnet_id' failed. (expected status code %d, returned %d)"
count=`echo $text | grep -ic unsigned` count=$(echo "${OUTPUT}" | grep -Fci unsigned) || true
assert_eq $count 1 "dhcp4_subnet_id is not of unsigned type. (returned count %d, expected %d)" assert_eq 1 "${count}" "dhcp4_subnet_id is not of unsigned type. (returned count %d, expected %d)"
# verify that dhcp6_subnet_id is unsigned # verify that dhcp6_subnet_id is unsigned
qry="show columns from hosts like 'dhcp6_subnet_id'" qry="show columns from hosts like 'dhcp6_subnet_id'"
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "show columns from hosts like 'dhcp6_subnet_id' failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show columns from hosts like 'dhcp6_subnet_id' failed. (expected status code %d, returned %d)"
count=`echo $text | grep -ic unsigned` count=$(echo "${OUTPUT}" | grep -Fci unsigned) || true
assert_eq 1 $count "dhcp6_subnet_id is not of unsigned type. (expected count %d, returned %d)" assert_eq 1 "${count}" "dhcp6_subnet_id is not of unsigned type. (expected count %d, returned %d)"
#host_identifier_type should have rows for types 3 and 4 (upgrade 5.0 -> 5.1) #host_identifier_type should have rows for types 3 and 4 (upgrade 5.0 -> 5.1)
qry="select count(*) from host_identifier_type"; qry="select count(*) from host_identifier_type";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select from host_identifier_type failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 5 "$count" "host_identifier_type does not contain correct number of entries. (expected count %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "select from host_identifier_type failed. (expected status code %d, returned %d)"
assert_eq 5 "${count}" "host_identifier_type does not contain correct number of entries. (expected count %d, returned %d)"
#table: user_context columns to hosts, dhcp4_options and dhcp6_options (upgrade 5.2 -> 6.0) #table: user_context columns to hosts, dhcp4_options and dhcp6_options (upgrade 5.2 -> 6.0)
# verify that hosts table includes user_context # verify that hosts table includes user_context
qry="select user_context from hosts"; qry="select user_context from hosts";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select user_context from hosts failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select user_context from hosts failed. (expected status code %d, returned %d)"
# verify that dhcp4_options table includes user_context # verify that dhcp4_options table includes user_context
qry="select user_context from dhcp4_options"; qry="select user_context from dhcp4_options";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select user_context from dhcp4_options failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select user_context from dhcp4_options failed. (expected status code %d, returned %d)"
# verify that dhcp6_options table includes user_context # verify that dhcp6_options table includes user_context
qry="select user_context from dhcp6_options"; qry="select user_context from dhcp6_options";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select user_context from dhcp6_options failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select user_context from dhcp6_options failed. (expected status code %d, returned %d)"
# lease4/6_stats changes are tested separately # lease4/6_stats changes are tested separately
#table: user_context to lease4 and lease6 (upgrade 6.0 -> 7.0) #table: user_context to lease4 and lease6 (upgrade 6.0 -> 7.0)
# verify that lease4 table includes user_context # verify that lease4 table includes user_context
qry="select user_context from lease4"; qry="select user_context from lease4";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select user_context from lease4 failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select user_context from lease4 failed. (expected status code %d, returned %d)"
# verify that lease6 table includes user_context # verify that lease6 table includes user_context
qry="select user_context from lease6"; qry="select user_context from lease6";
count=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "select user_context from lease6 failed. (expected status code %d, returned %d)" count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select user_context from lease6 failed. (expected status code %d, returned %d)"
#table: logs (upgrade 6.0 -> 7.0) #table: logs (upgrade 6.0 -> 7.0)
mysql -u$db_user -p$db_password $db_name >/dev/null 2>&1 <<EOF run_and_return_output_and_exit_code \
SELECT timestamp, address, log FROM logs; mysql -u"${db_user}" -p"${db_password}" "${db_name}" -e \
EOF 'SELECT timestamp, address, log FROM logs;'
ERRCODE=$? assert_eq 0 "${EXIT_CODE}" "logs table is missing or broken. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "logs table is missing or broken. (expected status code %d, returned %d)"
# table: modification (upgrade 6.0 -> 7.0) # table: modification (upgrade 6.0 -> 7.0)
qry="select id, modification_type from modification" qry="select id, modification_type from modification"
@@ -762,9 +759,9 @@ EOF
insert_sql="\ insert_sql="\
insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (hex('010101010101'), 0, 1, inet_aton('192.0.2.0'));\ insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (hex('010101010101'), 0, 1, inet_aton('192.0.2.0'));\
insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (hex('010101010102'), 0, 1, inet_aton('192.0.2.0'));" insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (hex('010101010102'), 0, 1, inet_aton('192.0.2.0'));"
mysql_execute "$insert_sql" run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$insert_sql"
assert_eq 0 $ERRCODE "insert into hosts failed, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "insert into hosts failed, expected exit code %d, actual %d"
# Schema upgrade from 9.4 to 9.5. # Schema upgrade from 9.4 to 9.5.
@@ -773,48 +770,48 @@ insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_a
run_statement "dhcp4_shared_network" "$qry" run_statement "dhcp4_shared_network" "$qry"
qry="show columns from dhcp4_shared_network like 'reservation_mode'"; qry="show columns from dhcp4_shared_network like 'reservation_mode'";
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "show columns from dhcp4_shared_network like 'reservation_mode' failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show columns from dhcp4_shared_network like 'reservation_mode' failed. (expected status code %d, returned %d)"
count=`echo $text | grep -ic reservation` count=$(echo "${OUTPUT}" | grep -Fci reservation) || true
assert_eq $count 0 "dhcp4_shared_network has still reservation_mode column. (returned count %d, expected %d)" assert_eq 0 "${count}" "dhcp4_shared_network has still reservation_mode column. (returned count %d, expected %d)"
# table: dhcp4_subnet (reservation_mode replaced by reservations flags) # table: dhcp4_subnet (reservation_mode replaced by reservations flags)
qry="select reservations_global, reservations_in_subnet, reservations_out_of_pool from dhcp4_subnet" qry="select reservations_global, reservations_in_subnet, reservations_out_of_pool from dhcp4_subnet"
run_statement "dhcp4_subnet" "$qry" run_statement "dhcp4_subnet" "$qry"
qry="show columns from dhcp4_subnet like 'reservation_mode'"; qry="show columns from dhcp4_subnet like 'reservation_mode'";
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "show columns from dhcp4_subnet like 'reservation_mode' failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show columns from dhcp4_subnet like 'reservation_mode' failed. (expected status code %d, returned %d)"
count=`echo $text | grep -ic reservation` count=$(echo "${OUTPUT}" | grep -Fci reservation) || true
assert_eq $count 0 "dhcp4_subnet has still reservation_mode column. (returned count %d, expected %d)" assert_eq 0 "${count}" "dhcp4_subnet has still reservation_mode column. (returned count %d, expected %d)"
# table: dhcp6_shared_network (reservation_mode replaced by reservations flags) # table: dhcp6_shared_network (reservation_mode replaced by reservations flags)
qry="select reservations_global, reservations_in_subnet, reservations_out_of_pool from dhcp6_shared_network" qry="select reservations_global, reservations_in_subnet, reservations_out_of_pool from dhcp6_shared_network"
run_statement "dhcp6_shared_network" "$qry" run_statement "dhcp6_shared_network" "$qry"
qry="show columns from dhcp6_shared_network like 'reservation_mode'"; qry="show columns from dhcp6_shared_network like 'reservation_mode'";
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "show columns from dhcp6_shared_network like 'reservation_mode' failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show columns from dhcp6_shared_network like 'reservation_mode' failed. (expected status code %d, returned %d)"
count=`echo $text | grep -ic reservation` count=$(echo "${OUTPUT}" | grep -Fci reservation) || true
assert_eq $count 0 "dhcp6_shared_network has still reservation_mode column. (returned count %d, expected %d)" assert_eq 0 "${count}" "dhcp6_shared_network has still reservation_mode column. (returned count %d, expected %d)"
# table: dhcp6_subnet (reservation_mode replaced by reservations flags) # table: dhcp6_subnet (reservation_mode replaced by reservations flags)
qry="select reservations_global, reservations_in_subnet, reservations_out_of_pool from dhcp6_subnet" qry="select reservations_global, reservations_in_subnet, reservations_out_of_pool from dhcp6_subnet"
run_statement "dhcp6_subnet" "$qry" run_statement "dhcp6_subnet" "$qry"
qry="show columns from dhcp6_subnet like 'reservation_mode'"; qry="show columns from dhcp6_subnet like 'reservation_mode'";
text=`mysql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "${qry}"
assert_eq 0 $ERRCODE "show columns from dhcp6_subnet like 'reservation_mode' failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "show columns from dhcp6_subnet like 'reservation_mode' failed. (expected status code %d, returned %d)"
count=`echo $text | grep -ic reservation` count=$(echo "${OUTPUT}" | grep -Fci reservation) || true
assert_eq $count 0 "dhcp6_subnet has still reservation_mode column. (returned count %d, expected %d)" assert_eq 0 "${count}" "dhcp6_subnet has still reservation_mode column. (returned count %d, expected %d)"
# Verify upgraded schema reports version 9.5 # Verify upgraded schema reports version 9.5
version=$(${keaadmin} db-version mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir) version=$("${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}")
assert_str_eq "9.5" ${version} "Expected kea-admin to return %s, returned value was %s" assert_str_eq "9.5" "${version}" "Expected kea-admin to return %s, returned value was %s"
# Let's wipe the whole database # Let's wipe the whole database
mysql_wipe mysql_wipe
@@ -827,7 +824,6 @@ mysql_lease4_dump_test() {
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
output_dir="@abs_top_builddir@/src/bin/admin/tests" output_dir="@abs_top_builddir@/src/bin/admin/tests"
script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
output_file="$output_dir/data/mysql.lease4_dump_test.output.csv" output_file="$output_dir/data/mysql.lease4_dump_test.output.csv"
tmp_file="$output_file.tmp" tmp_file="$output_file.tmp"
@@ -849,9 +845,9 @@ mysql_lease4_dump_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "could not create database, expected exit code %d, actual %d"
# Insert the reference record # Insert the reference record
insert_sql="\ insert_sql="\
@@ -859,19 +855,19 @@ insert into lease4 values(10,20,30,40,'2015-01-01 01:15:30',50,1,1,'one.example.
insert into lease4 values(11,NULL,123,40,'2015-02-02 02:30:45',50,1,1,'', 1,NULL);\ insert into lease4 values(11,NULL,123,40,'2015-02-02 02:30:45',50,1,1,'', 1,NULL);\
insert into lease4 values(12,22,NULL,40,'2015-03-03 11:01:07',50,1,1,'three.example.com', 2,NULL);" insert into lease4 values(12,22,NULL,40,'2015-03-03 11:01:07',50,1,1,'three.example.com', 2,NULL);"
mysql_execute "$insert_sql" run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$insert_sql"
assert_eq 0 $ERRCODE "insert into lease4 failed, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "insert into lease4 failed, expected exit code %d, actual %d"
# Dump lease4 to output_file # Dump lease4 to output_file
${keaadmin} lease-dump mysql -4 -u $db_user -p $db_password -n $db_name -d $db_scripts_dir -o $output_file run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" lease-dump mysql -4 -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" -o $output_file
assert_eq 0 $ERRCODE "kea-admin lease-dump -4 failed, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "kea-admin lease-dump -4 failed, expected exit code %d, actual %d"
# Compare the dump output to reference file, they should be identical # Compare the dump output to reference file, they should be identical
cmp -s $output_file $ref_file run_and_return_output_and_exit_code \
ERRCODE=$? cmp -s "${output_file}" "${ref_file}"
assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "dump file does not match reference file, expected exit code %d, actual %d"
# remove the output file # remove the output file
rm $output_file rm $output_file
@@ -887,7 +883,6 @@ mysql_lease6_dump_test() {
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
output_dir="@abs_top_builddir@/src/bin/admin/tests" output_dir="@abs_top_builddir@/src/bin/admin/tests"
script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
output_file="$output_dir/data/mysql.lease6_dump_test.output.csv" output_file="$output_dir/data/mysql.lease6_dump_test.output.csv"
tmp_file="$output_file.tmp" tmp_file="$output_file.tmp"
@@ -909,9 +904,9 @@ mysql_lease6_dump_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "could not create database, expected exit code %d, actual %d"
# Insert the reference record # Insert the reference record
insert_sql="\ insert_sql="\
@@ -919,19 +914,19 @@ insert into lease6 values(10,20,30,'2015-04-04 01:15:30',40,50,1,60,70,1,1,'one.
insert into lease6 values(11,NULL,30,'2015-05-05 02:30:45',40,50,1,60,70,1,1,'',80,90,1,1,NULL);\ insert into lease6 values(11,NULL,30,'2015-05-05 02:30:45',40,50,1,60,70,1,1,'',80,90,1,1,NULL);\
insert into lease6 values(12,21,30,'2015-06-06 11:01:07',40,50,1,60,70,1,1,'three.example.com',80,90,4,2,NULL);" insert into lease6 values(12,21,30,'2015-06-06 11:01:07',40,50,1,60,70,1,1,'three.example.com',80,90,4,2,NULL);"
mysql_execute "$insert_sql" run_and_return_output_and_exit_code \
ERRCODE=$? mysql_execute "$insert_sql"
assert_eq 0 $ERRCODE "insert into lease6 failed, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "insert into lease6 failed, expected exit code %d, actual %d"
# Dump lease4 to output_file # Dump lease4 to output_file
${keaadmin} lease-dump mysql -6 -u $db_user -p $db_password -n $db_name -d $db_scripts_dir -o $output_file run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" lease-dump mysql -6 -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" -o $output_file
assert_eq 0 $ERRCODE "kea-admin lease-dump -6 failed, status code %d" assert_eq 0 "${EXIT_CODE}" "kea-admin lease-dump -6 failed, status code %d"
# Compare the dump output to reference file, they should be identical # Compare the dump output to reference file, they should be identical
cmp -s $output_file $ref_file run_and_return_output_and_exit_code \
ERRCODE=$? cmp -s "${output_file}" "${ref_file}"
assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "dump file does not match reference file, expected exit code %d, actual %d"
# remove the output file # remove the output file
rm $output_file rm $output_file
@@ -953,9 +948,9 @@ mysql_lease4_stat_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "kea-admin db-init mysql returned non-zero status code %d, expected %d" assert_eq 0 "${EXIT_CODE}" "kea-admin db-init mysql returned non-zero status code %d, expected %d"
# Verify lease4 stat table is present # Verify lease4 stat table is present
qry="select count(subnet_id) from lease4_stat"; qry="select count(subnet_id) from lease4_stat";
@@ -1003,8 +998,8 @@ mysql_lease4_stat_test() {
# param addr - address to use to add to subnet 1 # param addr - address to use to add to subnet 1
# param ltype - type of lease to create # param ltype - type of lease to create
mysql_lease6_stat_per_type() { mysql_lease6_stat_per_type() {
addr=$1;shift; addr=$1;shift
ltype=$1; ltype=$1
# insert a lease6 for addr and ltype, state assigned # insert a lease6 for addr and ltype, state assigned
qry="insert into lease6 (address, lease_type, subnet_id, state) values ($addr,$ltype,1,0);" qry="insert into lease6 (address, lease_type, subnet_id, state) values ($addr,$ltype,1,0);"
@@ -1045,10 +1040,9 @@ mysql_lease6_stat_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init mysql returned non-zero status code %d, expected %d"
assert_eq 0 $ERRCODE "kea-admin db-init mysql returned non-zero status code %d, expected %d"
# verify lease6 stat table is present # verify lease6 stat table is present
qry="select count(subnet_id) from lease6_stat" qry="select count(subnet_id) from lease6_stat"
@@ -1080,7 +1074,7 @@ mysql_lease_stat_upgrade_test() {
# tables. # tables.
# #
# Initialize database to scheme 1.0. # Initialize database to scheme 1.0.
mysql -u$db_user -p$db_password $db_name < @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql mysql -u"${db_user}" -p"${db_password}" "${db_name}" < "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql"
# Now upgrade to schema 4.0, this has lease_state in it # Now upgrade to schema 4.0, this has lease_state in it
mysql_upgrade_schema_to_version 4.0 mysql_upgrade_schema_to_version 4.0
@@ -1104,8 +1098,8 @@ mysql_lease_stat_upgrade_test() {
run_statement "insert v6 leases" "$qry" run_statement "insert v6 leases" "$qry"
# Ok, we have a 4.0 database with leases. Let's upgrade it to 6.0 # Ok, we have a 4.0 database with leases. Let's upgrade it to 6.0
${keaadmin} db-upgrade mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-upgrade mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
# #
# First we'll verify lease4_stats are correct after migration. # First we'll verify lease4_stats are correct after migration.
@@ -1220,10 +1214,9 @@ mysql_lease_stat_recount_test() {
mysql_wipe mysql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init mysql returned non-zero status code %d, expected %d"
assert_eq 0 $ERRCODE "kea-admin db-init mysql returned non-zero status code %d, expected %d"
# Now we need insert some leases to "recount" # Now we need insert some leases to "recount"
qry=\ qry=\
@@ -1257,10 +1250,9 @@ mysql_lease_stat_recount_test() {
run_statement "change v6 stats" "$qry" run_statement "change v6 stats" "$qry"
# Recount all statistics from scratch. # Recount all statistics from scratch.
${keaadmin} stats-recount mysql -u $db_user -p $db_password -n $db_name run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" stats-recount mysql -u "${db_user}" -p "${db_password}" -n "${db_name}"
assert_eq 0 "${EXIT_CODE}" "kea-admin stats-recount mysql returned non-zero status code %d, expected %d"
assert_eq 0 $ERRCODE "kea-admin stats-recount mysql returned non-zero status code %d, expected %d"
# #
# First we'll verify lease4_stats are correct after recount. # First we'll verify lease4_stats are correct after recount.
@@ -1321,7 +1313,7 @@ mysql_unused_subnet_id_test() {
# verify the upgrade mechanisms which convert subnet id values # verify the upgrade mechanisms which convert subnet id values
# #
# Initialize database to scheme 1.0. # Initialize database to scheme 1.0.
mysql -u$db_user -p$db_password $db_name < @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql mysql -u"${db_user}" -p"${db_password}" "${db_name}" < "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql"
# Now upgrade to schema 6.0, this has lease_state in it # Now upgrade to schema 6.0, this has lease_state in it
mysql_upgrade_schema_to_version 6.0 mysql_upgrade_schema_to_version 6.0
@@ -1355,8 +1347,8 @@ mysql_unused_subnet_id_test() {
mysql_upgrade_schema_to_version 7.0 mysql_upgrade_schema_to_version 7.0
# Version should be new 7.0 # Version should be new 7.0
version=$(${keaadmin} db-version mysql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir) version=$("${kea_admin}" db-version mysql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}")
assert_str_eq "7.0" ${version} "Expected kea-admin to return %s, returned value was %s" assert_str_eq "7.0" "${version}" "Expected kea-admin to return %s, returned value was %s"
# Two hosts should have null v4 subnet ids # Two hosts should have null v4 subnet ids
qry="select count(host_id) from hosts where dhcp4_subnet_id is null;" qry="select count(host_id) from hosts where dhcp4_subnet_id is null;"
@@ -1409,7 +1401,7 @@ mysql_reservation_mode_upgrade_test() {
# verify the upgrade mechanisms which convert subnet id values # verify the upgrade mechanisms which convert subnet id values
# #
# Initialize database to scheme 1.0. # Initialize database to scheme 1.0.
mysql -u$db_user -p$db_password $db_name < @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql mysql -u"${db_user}" -p"${db_password}" "${db_name}" < "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.mysql"
# Now upgrade to schema 9.4, the last version with reservation_mode # Now upgrade to schema 9.4, the last version with reservation_mode
mysql_upgrade_schema_to_version 9.4 mysql_upgrade_schema_to_version 9.4
@@ -1550,6 +1542,8 @@ mysql_reservation_mode_upgrade_test() {
test_finish 0 test_finish 0
} }
# Run tests.
mysql_db_init_test mysql_db_init_test
mysql_host_reservation_init_test mysql_host_reservation_init_test
mysql_db_version_test mysql_db_version_test

View File

@@ -6,27 +6,33 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2154
# SC2154: ... is referenced but not assigned.
# Reason: some variables are sourced.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Include common test library. # Include common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# Include admin utilities # Include admin utilities
. @abs_top_srcdir@/src/bin/admin/admin-utils.sh . "@abs_top_srcdir@/src/bin/admin/admin-utils.sh"
# Set path to the production schema scripts # Set path to the production schema scripts
db_scripts_dir=@abs_top_srcdir@/src/share/database/scripts db_scripts_dir="@abs_top_srcdir@/src/share/database/scripts"
db_user="keatest"
db_password="keatest"
db_name="keatest"
db_host="localhost"
# Set location of the kea-admin. # Set location of the kea-admin.
keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin kea_admin="@abs_top_builddir@/src/bin/admin/kea-admin"
# Convenience function for running an SQL statement # Convenience function for running an SQL statement
# param hdr - text message to prepend to any error # param hdr - text message to prepend to any error
# param qry - SQL statement to run # param qry - SQL statement to run
# param exp_valu - optional expected value. This can be used IF the SQL statement # param exp_value - optional expected value. This can be used IF the SQL statement
# generates a single value, such as a SELECT which returns one column for one row. # generates a single value, such as a SELECT which returns one column for one row.
# Examples: # Examples:
# #
@@ -36,16 +42,17 @@ keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin
# qry="select leases from lease6_stat where subnet_id = 1 and lease_type = $ltype and state = 0"; # qry="select leases from lease6_stat where subnet_id = 1 and lease_type = $ltype and state = 0";
# run_statement "#3" "$qry" 1 # run_statement "#3" "$qry" 1
run_statement() { run_statement() {
hdr="$1";shift; hdr="$1";shift
qry="$1";shift; qry="$1";shift
exp_value="$1"; exp_value="${1-}"
# Execute the statment # Execute the statment
value=`pgsql_execute "${qry}"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "${qry}"
value="${OUTPUT}"
# Execution should succeed # Execution should succeed
assert_eq 0 $ERRCODE "$hdr: SQL=[$qry] failed: (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "$hdr: SQL=[$qry] failed: (expected status code %d, returned %d)"
# If there's an expected value, test it # If there's an expected value, test it
if [ "x$exp_value" != "x" ] if [ "x$exp_value" != "x" ]
@@ -56,11 +63,12 @@ run_statement() {
# Wipe all tables from the DB: # Wipe all tables from the DB:
pgsql_wipe() { pgsql_wipe() {
printf "Wiping whole database %s\n" $db_name printf "Wiping whole database %s...\n" "${db_name}"
export PGPASSWORD=$db_password export PGPASSWORD="${db_password}"
cat $db_scripts_dir/pgsql/dhcpdb_drop.pgsql | psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -U keatest -d keatest >/dev/null 2>&1 run_and_return_output_and_exit_code \
assert_eq 0 $? "pgsql_wipe drop failed, expected exit code: %d, actual: %d" psql --set ON_ERROR_STOP=1 -A -t -q -U keatest -d keatest -f "${db_scripts_dir}/pgsql/dhcpdb_drop.pgsql"
assert_eq 0 "${EXIT_CODE}" "pgsql_wipe drop failed, expected exit code: %d, actual: %d"
} }
pgsql_db_init_test() { pgsql_db_init_test() {
@@ -70,37 +78,43 @@ pgsql_db_init_test() {
pgsql_wipe pgsql_wipe
# Create the database # Create the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "kea-admin db-init pgsql failed, expected exit code: %d, actual: %d" "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init pgsql failed, expected exit code: %d, actual: %d"
# Verify that all the expected tables exist # Verify that all the expected tables exist
# Check schema_version table # Check schema_version table
RESULT=`pgsql_execute "SELECT version, minor FROM schema_version;"` run_and_return_output_and_exit_code \
assert_eq 0 $? "schema_version table check failed, expected exit code: %d, actual: %d" pgsql_execute "SELECT version, minor FROM schema_version;"
assert_eq 0 "${EXIT_CODE}" "schema_version table check failed, expected exit code: %d, actual: %d"
# Check lease4 table # Check lease4 table
RESULT=`pgsql_execute "SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease4;"` run_and_return_output_and_exit_code \
assert_eq 0 $? "lease4 table check failed, expected exit code: %d, actual: %d" pgsql_execute "SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease4;"
assert_eq 0 "${EXIT_CODE}" "lease4 table check failed, expected exit code: %d, actual: %d"
# Check lease6 table # Check lease6 table
RESULT=`pgsql_execute "SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease6;"` run_and_return_output_and_exit_code \
assert_eq 0 $? "lease6 table check failed, expected exit code: %d, actual: %d" pgsql_execute "SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, state, user_context FROM lease6;"
assert_eq 0 "${EXIT_CODE}" "lease6 table check failed, expected exit code: %d, actual: %d"
# Check lease6_types table # Check lease6_types table
RESULT=`pgsql_execute "SELECT lease_type, name FROM lease6_types;"` run_and_return_output_and_exit_code \
assert_eq 0 $? "lease6_types table check failed, expected exit code: %d, actual: %d" pgsql_execute "SELECT lease_type, name FROM lease6_types;"
assert_eq 0 "${EXIT_CODE}" "lease6_types table check failed, expected exit code: %d, actual: %d"
# Check lease_state table # Check lease_state table
RESULT=`pgsql_execute "SELECT state, name FROM lease_state;"` run_and_return_output_and_exit_code \
assert_eq 0 $? "lease_state table check failed, expected exit code: %d, actual: %d" pgsql_execute "SELECT state, name FROM lease_state;"
assert_eq 0 "${EXIT_CODE}" "lease_state table check failed, expected exit code: %d, actual: %d"
# Trying to create it again should fail. This verifies the db present # Trying to create it again should fail. This verifies the db present
# check # check
echo "" printf '\nDB created successfully, make sure we are not allowed to try it again:\n'
echo "DB created successfully, make sure we aren't allowed to try it again:" run_and_return_output_and_exit_code \
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 2 $? "kea-admin failed to deny db-init, expected exit code: %d, actual: %d" assert_eq 2 "${EXIT_CODE}" "kea-admin failed to deny db-init, expected exit code: %d, actual: %d"
# Let's wipe the whole database # Let's wipe the whole database
pgsql_wipe pgsql_wipe
@@ -115,18 +129,21 @@ pgsql_db_version_test() {
pgsql_wipe pgsql_wipe
# Do not create any table so db-version will raise an error # Do not create any table so db-version will raise an error
printf "Checking db-version error case. Please ignore errors.\n" printf 'Checking db-version error case...\n'
${keaadmin} db-version pgsql -u $db_user -p $db_password -n $db_name run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-version pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}"
assert_eq 1 $ERRCODE "schema_version table still exists. (expected %d, exit code %d)" assert_eq 3 "${EXIT_CODE}" "schema_version table still exists. (expected %d, exit code %d)"
# Create the database # Create the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "cannot initialize the database, expected exit code: %d, actual: %d" "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "cannot initialize the database, expected exit code: %d, actual: %d"
# Verify that kea-admin db-version returns the correct version # Verify that kea-admin db-version returns the correct version
version=$(${keaadmin} db-version pgsql -u $db_user -p $db_password -n $db_name) run_and_return_output_and_exit_code \
assert_str_eq "6.2" ${version} "Expected kea-admin to return %s, returned value was %s" "${kea_admin}" db-version pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}"
version="${OUTPUT}"
assert_str_eq "6.2" "${version}" "Expected kea-admin to return %s, returned value was %s"
# Let's wipe the whole database # Let's wipe the whole database
pgsql_wipe pgsql_wipe
@@ -136,134 +153,143 @@ pgsql_db_version_test() {
pgsql_upgrade_1_0_to_2_0() { pgsql_upgrade_1_0_to_2_0() {
# Added state column to lease4 # Added state column to lease4
output=`pgsql_execute "select state from lease4;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select state from lease4;"
assert_eq 0 $ERRCODE "lease4 is missing state column. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "lease4 is missing state column. (expected status code %d, returned %d)"
# Added state column to lease6 # Added state column to lease6
output=`pgsql_execute "select state from lease6;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select state from lease6;"
assert_eq 0 $ERRCODE "lease6 is missing state column. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "lease6 is missing state column. (expected status code %d, returned %d)"
# Added stored procedures for lease dumps # Added stored procedures for lease dumps
output=`pgsql_execute "select lease4DumpHeader from lease4DumpHeader();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease4DumpHeader() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select lease4DumpHeader from lease4DumpHeader();"
assert_eq 0 "${EXIT_CODE}" "function lease4DumpHeader() broken or missing. (expected status code %d, returned %d)"
output=`pgsql_execute "select address from lease4DumpData();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease4DumpData() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select address from lease4DumpData();"
assert_eq 0 "${EXIT_CODE}" "function lease4DumpData() broken or missing. (expected status code %d, returned %d)"
output=`pgsql_execute "select lease6DumpHeader from lease6DumpHeader();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease6DumpHeader() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select lease6DumpHeader from lease6DumpHeader();"
assert_eq 0 "${EXIT_CODE}" "function lease6DumpHeader() broken or missing. (expected status code %d, returned %d)"
output=`pgsql_execute "select address from lease6DumpData();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease6DumpData() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select address from lease6DumpData();"
assert_eq 0 "${EXIT_CODE}" "function lease6DumpData() broken or missing. (expected status code %d, returned %d)"
} }
pgsql_upgrade_2_0_to_3_0() { pgsql_upgrade_2_0_to_3_0() {
# Added hwaddr, hwtype, and hwaddr_source columns to lease6 table # Added hwaddr, hwtype, and hwaddr_source columns to lease6 table
output=`pgsql_execute "select hwaddr, hwtype, hwaddr_source from lease6;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select hwaddr, hwtype, hwaddr_source from lease6;"
assert_eq 0 $ERRCODE "lease6 table not upgraded to 3.0 (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "lease6 table not upgraded to 3.0 (expected status code %d, returned %d)"
# Added lease_hwaddr_source table # Added lease_hwaddr_source table
output=`pgsql_execute "select hwaddr_source, name from lease_hwaddr_source;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select hwaddr_source, name from lease_hwaddr_source;"
assert_eq 0 $ERRCODE "lease_hwaddr_source table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "lease_hwaddr_source table is missing or broken. (expected status code %d, returned %d)"
# Added hosts table # Added hosts table
output=`pgsql_execute "select host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes, dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key from hosts;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select host_id, dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, dhcp4_client_classes, dhcp6_client_classes, dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key from hosts;"
assert_eq 0 $ERRCODE "hosts table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "hosts table is missing or broken. (expected status code %d, returned %d)"
# Added ipv6_reservations table # Added ipv6_reservations table
output=`pgsql_execute "select reservation_id, address, prefix_len, type, dhcp6_iaid, host_id from ipv6_reservations;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select reservation_id, address, prefix_len, type, dhcp6_iaid, host_id from ipv6_reservations;"
assert_eq 0 $ERRCODE "ipv6_reservations table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "ipv6_reservations table is missing or broken. (expected status code %d, returned %d)"
# Added dhcp4_options table # Added dhcp4_options table
output=`pgsql_execute "select option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id, scope_id from dhcp4_options;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp4_subnet_id, host_id, scope_id from dhcp4_options;"
assert_eq 0 $ERRCODE "dhcp4_options table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "dhcp4_options table is missing or broken. (expected status code %d, returned %d)"
# Added dhcp6_options table # Added dhcp6_options table
output=`pgsql_execute "select option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id,scope_id from dhcp6_options;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id,scope_id from dhcp6_options;"
assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
# Added host_identifier_type table # Added host_identifier_type table
output=`pgsql_execute "select type, name from host_identifier_type;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select type, name from host_identifier_type;"
assert_eq 0 $ERRCODE "host_identifier_type table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "host_identifier_type table is missing or broken. (expected status code %d, returned %d)"
# Added dhcp_option_scope table # Added dhcp_option_scope table
output=`pgsql_execute "select scope_id, scope_name from dhcp_option_scope;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select scope_id, scope_name from dhcp_option_scope;"
assert_eq 0 $ERRCODE "dhcp_option_scope table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "dhcp_option_scope table is missing or broken. (expected status code %d, returned %d)"
# Added dhcp6_options table # Added dhcp6_options table
output=`pgsql_execute "select option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id,scope_id from dhcp6_options;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select option_id, code, value, formatted_value, space, persistent, dhcp_client_class, dhcp6_subnet_id, host_id,scope_id from dhcp6_options;"
assert_eq 0 $ERRCODE "dhcp6_options table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "dhcp6_options table is missing or broken. (expected status code %d, returned %d)"
# Added order by clause to lease4DumpData # Added order by clause to lease4DumpData
output=`pgsql_execute "select address from lease4DumpData();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease4DumpData() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select address from lease4DumpData();"
output=`pgsql_execute "\sf lease4DumpData"` assert_eq 0 "${EXIT_CODE}" "function lease4DumpData() broken or missing. (expected status code %d, returned %d)"
assert_eq 0 $ERRCODE "\sf of lease4DumpData failed. (expected status code %d, returned %d)" run_and_return_output_and_exit_code \
count=`echo $output | grep -ic "order by l\.address"` pgsql_execute "\sf lease4DumpData"
assert_eq 1 $count "lease4DumpData is missing order by clause" assert_eq 0 "${EXIT_CODE}" "\sf of lease4DumpData failed. (expected status code %d, returned %d)"
count=$(echo "${OUTPUT}" | grep -Fci 'order by l.address') || true
assert_eq 1 "${count}" "lease4DumpData is missing order by clause"
# Added hwaddr columns to lease6DumpHeader # Added hwaddr columns to lease6DumpHeader
output=`pgsql_execute "select lease6DumpHeader from lease6DumpHeader();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease6DumpHeader() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select lease6DumpHeader from lease6DumpHeader();"
count=`echo $output | grep -ic "hwaddr,hwtype,hwaddr_source"` assert_eq 0 "${EXIT_CODE}" "function lease6DumpHeader() broken or missing. (expected status code %d, returned %d)"
assert_eq 1 $count "lease6DumpHeader is missing hwaddr columns" count=$(echo "${OUTPUT}" | grep -Fci 'hwaddr,hwtype,hwaddr_source') || true
assert_eq 1 "${count}" "lease6DumpHeader is missing hwaddr columns"
# Added hwaddr columns to lease6DumpData # Added hwaddr columns to lease6DumpData
output=`pgsql_execute "select hwaddr,hwtype,hwaddr_source from lease6DumpData();"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "function lease6DumpData() broken or missing. (expected status code %d, returned %d)" pgsql_execute "select hwaddr,hwtype,hwaddr_source from lease6DumpData();"
assert_eq 0 "${EXIT_CODE}" "function lease6DumpData() broken or missing. (expected status code %d, returned %d)"
# Added order by clause to lease6DumpData # Added order by clause to lease6DumpData
output=`pgsql_execute "\sf lease4DumpData"` run_and_return_output_and_exit_code \
assert_eq 0 $ERRCODE "\sf of lease4DumpData failed. (expected status code %d, returned %d)" pgsql_execute "\sf lease4DumpData"
count=`echo $output | grep -ic "order by l\.address"` assert_eq 0 "${EXIT_CODE}" "\sf of lease4DumpData failed. (expected status code %d, returned %d)"
assert_eq 1 $count "lease4DumpData is missing order by clause" count=$(echo "${OUTPUT}" | grep -Fci 'order by l.address') || true
assert_eq 1 "${count}" "lease4DumpData is missing order by clause"
# lease_hardware_source should have row for source = 0 # lease_hardware_source should have row for source = 0
output=`pgsql_execute "select count(hwaddr_source) from lease_hwaddr_source where hwaddr_source = 0 and name='HWADDR_SOURCE_UNKNOWN';"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select count(hwaddr_source) from lease_hwaddr_source where hwaddr_source = 0 and name='HWADDR_SOURCE_UNKNOWN';"
assert_eq 0 $ERRCODE "select from lease_hwaddr_source failed. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "select from lease_hwaddr_source failed. (expected status code %d, returned %d)"
assert_eq 1 "$output" "lease_hwaddr_source does not contain entry for HWADDR_SOURCE_UNKNOWN. (record count %d, expected %d)" assert_eq 1 "${OUTPUT}" "lease_hwaddr_source does not contain entry for HWADDR_SOURCE_UNKNOWN. (record count %d, expected %d)"
} }
pgsql_upgrade_3_0_to_6_1() { pgsql_upgrade_3_0_to_6_1() {
# Added user_context to lease4 # Added user_context to lease4
output=`pgsql_execute "select user_context from lease4;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select user_context from lease4;"
assert_eq 0 $ERRCODE "lease4 is missing user_context column. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "lease4 is missing user_context column. (expected status code %d, returned %d)"
# Added user_context to lease6 # Added user_context to lease6
output=`pgsql_execute "select user_context from lease6;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select user_context from lease6;"
assert_eq 0 $ERRCODE "lease6 is missing user_context column. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "lease6 is missing user_context column. (expected status code %d, returned %d)"
# Added logs table # Added logs table
output=`pgsql_execute "select timestamp, address, log from logs;"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select timestamp, address, log from logs;"
assert_eq 0 $ERRCODE "logs table is missing or broken. (expected status code %d, returned %d)" assert_eq 0 "${EXIT_CODE}" "logs table is missing or broken. (expected status code %d, returned %d)"
} }
pgsql_upgrade_6_1_to_6_2() { pgsql_upgrade_6_1_to_6_2() {
# Verify upgraded schema reports version 6.2. # Verify upgraded schema reports version 6.2.
version=$(${keaadmin} db-version pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir) version=$("${kea_admin}" db-version pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}")
assert_str_eq "6.2" ${version} "Expected kea-admin to return %s, returned value was %s" assert_str_eq "6.2" "${version}" "Expected kea-admin to return %s, returned value was %s"
insert_sql="\ insert_sql="\
insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (decode('010101010101', 'hex'), 0, 1, x'FFAF0002'::int);\ insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (decode('010101010101', 'hex'), 0, 1, x'FFAF0002'::int);\
insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (decode('010101010102', 'hex'), 0, 1, x'FFAF0002'::int);" insert into hosts(dhcp_identifier, dhcp_identifier_type, dhcp4_subnet_id, ipv4_address) values (decode('010101010102', 'hex'), 0, 1, x'FFAF0002'::int);"
pgsql_execute "$insert_sql" run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "$insert_sql"
assert_eq 0 $ERRCODE "insert into hosts failed, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "insert into hosts failed, expected exit code %d, actual %d"
} }
pgsql_upgrade_test() { pgsql_upgrade_test() {
@@ -273,11 +299,13 @@ pgsql_upgrade_test() {
pgsql_wipe pgsql_wipe
# Initialize database to schema 1.0. # Initialize database to schema 1.0.
pgsql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql run_and_return_output_and_exit_code \
assert_eq 0 $? "cannot initialize the database, expected exit code: %d, actual: %d" pgsql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql"
assert_eq 0 "${EXIT_CODE}" "cannot initialize the database, expected exit code: %d, actual: %d"
${keaadmin} db-upgrade pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
assert_eq 0 $? "db-upgrade failed, expected exit code: %d, actual: %d" "${kea_admin}" db-upgrade pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "db-upgrade failed, expected exit code: %d, actual: %d"
# Check 1.0 to 2.0 upgrade # Check 1.0 to 2.0 upgrade
pgsql_upgrade_1_0_to_2_0 pgsql_upgrade_1_0_to_2_0
@@ -304,10 +332,10 @@ get_local_time() {
# Expiration field is a "timestamp with timezone" so we need a reference # Expiration field is a "timestamp with timezone" so we need a reference
# time for the machine/DB this test is running upon. # time for the machine/DB this test is running upon.
ref_timestamp=`pgsql_execute "select timestamptz '$1';"` run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "select timestamptz '$1';"
assert_eq 0 $ERRCODE "reference time query failed for [$timestamp], expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "reference time query failed for [$timestamp], expected exit code %d, actual %d"
echo $ref_timestamp echo "${OUTPUT}"
} }
@@ -329,7 +357,6 @@ pgsql_lease4_dump_test() {
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
output_dir="@abs_top_builddir@/src/bin/admin/tests" output_dir="@abs_top_builddir@/src/bin/admin/tests"
script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
output_file="$output_dir/data/pgsql.lease4_dump_test.output.csv" output_file="$output_dir/data/pgsql.lease4_dump_test.output.csv"
@@ -351,9 +378,9 @@ pgsql_lease4_dump_test() {
pgsql_wipe pgsql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "could not create database, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "could not create database, expected exit code %d, actual %d"
timestamp1="2015-01-01 01:15:30" timestamp1="2015-01-01 01:15:30"
timestamp2="2015-02-02 02:30:45" timestamp2="2015-02-02 02:30:45"
@@ -365,36 +392,37 @@ insert into lease4 values(10,E'\\x20',E'\\x30',40,'$timestamp1',50,'t','t','one.
insert into lease4 values(11,'',E'\\x0123',40,'$timestamp2',50,'t','t','', 1, '');\ insert into lease4 values(11,'',E'\\x0123',40,'$timestamp2',50,'t','t','', 1, '');\
insert into lease4 values(12,E'\\x22','',40,'$timestamp3',50,'t','t','three.example.com', 2, '');" insert into lease4 values(12,E'\\x22','',40,'$timestamp3',50,'t','t','three.example.com', 2, '');"
pgsql_execute "$insert_sql" run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "$insert_sql"
assert_eq 0 $ERRCODE "insert into lease4 failed, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "insert into lease4 failed, expected exit code %d, actual %d"
# Dump lease4 to output_file # Dump lease4 to output_file
${keaadmin} lease-dump pgsql -4 -u $db_user -p $db_password -n $db_name -d $db_scripts_dir -o $output_file run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" lease-dump pgsql -4 -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" -o $output_file
assert_eq 0 $ERRCODE "kea-admin lease-dump -4 failed, status code %d" assert_eq 0 "${EXIT_CODE}" "kea-admin lease-dump -4 failed, status code %d"
# Expiration field is a "timestamp with timezone" so we need a localized reference # Expiration field is a "timestamp with timezone" so we need a localized reference
# times for the machine/DB this test is running upon. # times for the machine/DB this test is running upon.
local_timestamp1=`get_local_time "$timestamp1"` local_timestamp1=$(get_local_time "$timestamp1")
local_timestamp2=`get_local_time "$timestamp2"` local_timestamp2=$(get_local_time "$timestamp2")
local_timestamp3=`get_local_time "$timestamp3"` local_timestamp3=$(get_local_time "$timestamp3")
# Create the comparison file by replacing the <timestamp> tags # Create the comparison file by replacing the <timestamp> tags
# with the local reference timestamp # with the local reference timestamp
sedstr="\ sed_command="\
sed 's/<timestamp1>/$local_timestamp1/g' $ref_file | \ s/<timestamp1>/${local_timestamp1}/g;\
sed 's/<timestamp2>/$local_timestamp2/g' | \ s/<timestamp2>/${local_timestamp2}/g; \
sed 's/<timestamp3>/$local_timestamp3/g' " s/<timestamp3>/${local_timestamp3}/g"
eval $sedstr >$ref_file_tmp run_and_return_output_and_exit_code \
ERRCODE=$? sed "${sed_command}" "${ref_file}"
assert_eq 0 $ERRCODE "timestamp replacement failed, expected exit code %d, actual %d" printf '%s\n' "${OUTPUT}" > "${ref_file_tmp}"
assert_eq 0 "${EXIT_CODE}" "timestamp replacement failed, expected exit code %d, actual %d"
# Compare the dump output to reference file, they should be identical # Compare the dump output to reference file, they should be identical
cmp -s $output_file $ref_file_tmp run_and_return_output_and_exit_code \
ERRCODE=$? cmp -s "${output_file}" "${ref_file_tmp}"
assert_eq 0 $ERRCODE "dump file does not match reference file, expected exit code %d, actual %d" assert_eq 0 "${EXIT_CODE}" "dump file does not match reference file, expected exit code %d, actual %d"
# Remove the output file and temporary reference file # Remove the output file and temporary reference file
rm $output_file rm $output_file
@@ -424,7 +452,6 @@ pgsql_lease6_dump_test() {
test_dir="@abs_top_srcdir@/src/bin/admin/tests" test_dir="@abs_top_srcdir@/src/bin/admin/tests"
output_dir="@abs_top_builddir@/src/bin/admin/tests" output_dir="@abs_top_builddir@/src/bin/admin/tests"
script_dir="@abs_top_srcdir@/src/bin/admin/scripts"
output_file="$output_dir/data/pgsql.lease6_dump_test.output.csv" output_file="$output_dir/data/pgsql.lease6_dump_test.output.csv"
@@ -446,9 +473,9 @@ pgsql_lease6_dump_test() {
pgsql_wipe pgsql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "could not create database, status code %d" assert_eq 0 "${EXIT_CODE}" "could not create database, status code %d"
timestamp1="2015-04-04 01:15:30" timestamp1="2015-04-04 01:15:30"
timestamp2="2015-02-02 02:30:45" timestamp2="2015-02-02 02:30:45"
@@ -460,36 +487,37 @@ insert into lease6 values(10,E'\\x20',30,'$timestamp1',40,50,1,60,70,'t','t','on
insert into lease6 values(11,'',30,'$timestamp2',40,50,1,60,70,'t','t','', 1,decode('80','hex'),90,1,'');\ insert into lease6 values(11,'',30,'$timestamp2',40,50,1,60,70,'t','t','', 1,decode('80','hex'),90,1,'');\
insert into lease6 values(12,E'\\x21',30,'$timestamp3',40,50,1,60,70,'t','t','three.example.com', 2,decode('80','hex'),90,4,'');" insert into lease6 values(12,E'\\x21',30,'$timestamp3',40,50,1,60,70,'t','t','three.example.com', 2,decode('80','hex'),90,4,'');"
pgsql_execute "$insert_sql" run_and_return_output_and_exit_code \
ERRCODE=$? pgsql_execute "$insert_sql"
assert_eq 0 $ERRCODE "insert into lease6 failed, status code %d" assert_eq 0 "${EXIT_CODE}" "insert into lease6 failed, status code %d"
# Dump lease6 to output_file # Dump lease6 to output_file
${keaadmin} lease-dump pgsql -6 -u $db_user -p $db_password -n $db_name -d $db_scripts_dir -o $output_file run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" lease-dump pgsql -6 -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}" -o $output_file
assert_eq 0 $ERRCODE "kea-admin lease-dump -6 failed, status code %d" assert_eq 0 "${EXIT_CODE}" "kea-admin lease-dump -6 failed, status code %d"
# Expiration field is a "timestamp with timezone" so we need a localized reference # Expiration field is a "timestamp with timezone" so we need a localized reference
# times for the machine/DB this test is running upon. # times for the machine/DB this test is running upon.
local_timestamp1=`get_local_time "$timestamp1"` local_timestamp1=$(get_local_time "$timestamp1")
local_timestamp2=`get_local_time "$timestamp2"` local_timestamp2=$(get_local_time "$timestamp2")
local_timestamp3=`get_local_time "$timestamp3"` local_timestamp3=$(get_local_time "$timestamp3")
# Create the comparison file by replacing the <timestamp> tags # Create the comparison file by replacing the <timestamp> tags
# with the local reference timestamp # with the local reference timestamp
sedstr="\ sed_command="\
sed 's/<timestamp1>/$local_timestamp1/g' $ref_file | \ s/<timestamp1>/${local_timestamp1}/g;\
sed 's/<timestamp2>/$local_timestamp2/g' | \ s/<timestamp2>/${local_timestamp2}/g; \
sed 's/<timestamp3>/$local_timestamp3/g' " s/<timestamp3>/${local_timestamp3}/g"
eval $sedstr >$ref_file_tmp run_and_return_output_and_exit_code \
ERRCODE=$? sed "${sed_command}" "${ref_file}"
assert_eq 0 $ERRCODE "timestamp replacement failed, expected exit code %d, actual %d" printf '%s\n' "${OUTPUT}" > "${ref_file_tmp}"
assert_eq 0 "${EXIT_CODE}" "timestamp replacement failed, expected exit code %d, actual %d"
# Compare the dump output to reference file, they should be identical # Compare the dump output to reference file, they should be identical
cmp -s $output_file $ref_file_tmp run_and_return_output_and_exit_code \
ERRCODE=$? cmp -s "${output_file}" "${ref_file_tmp}"
assert_eq 0 $ERRCODE "dump file does not match reference file" assert_eq 0 "${EXIT_CODE}" "dump file does not match reference file"
# Remove the output file and temporary reference file # Remove the output file and temporary reference file
rm $output_file rm $output_file
@@ -514,7 +542,7 @@ pgsql_upgrade_schema_to_version() {
# Check if there are any files in it # Check if there are any files in it
num_files=$(find ${db_scripts_dir}/pgsql/upgrade*.sh -type f | wc -l) num_files=$(find ${db_scripts_dir}/pgsql/upgrade*.sh -type f | wc -l)
if [ $num_files -eq 0 ]; then if [ "${num_files}" -eq 0 ]; then
log_error "No scripts in ${db_scripts_dir}/pgsql?" log_error "No scripts in ${db_scripts_dir}/pgsql?"
exit 1 exit 1
fi fi
@@ -523,17 +551,17 @@ pgsql_upgrade_schema_to_version() {
# thru an env # thru an env
export PGPASSWORD=$db_password export PGPASSWORD=$db_password
for script in ${db_scripts_dir}/pgsql/upgrade*.sh for script in "${db_scripts_dir}"/pgsql/upgrade*.sh
do do
if [ $version = "$target_version" ] if [ "${version}" = "${target_version}" ]
then then
break; break
fi fi
echo "Processing $script file..." echo "Processing $script file..."
sh ${script} -U ${db_user} -h ${db_host} -d ${db_name} "${script}" -U "${db_user}" -d "${db_name}"
version=`pgsql_version` version=$(pgsql_version)
done done
echo "Schema upgraded to $version" echo "Schema upgraded to $version"
@@ -550,9 +578,9 @@ pgsql_lease4_stat_test() {
pgsql_wipe pgsql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "kea-admin db-init pgsql returned non-zero status code %d, expected %d" assert_eq 0 "${EXIT_CODE}" "kea-admin db-init pgsql returned non-zero status code %d, expected %d"
# Verify lease4 stat table is present # Verify lease4 stat table is present
qry="select count(subnet_id) from lease4_stat" qry="select count(subnet_id) from lease4_stat"
@@ -600,8 +628,8 @@ pgsql_lease4_stat_test() {
# param addr - address to use to add to subnet 1 # param addr - address to use to add to subnet 1
# param ltype - type of lease to create # param ltype - type of lease to create
pgsql_lease6_stat_per_type() { pgsql_lease6_stat_per_type() {
addr=$1;shift; addr=$1;shift
ltype=$1; ltype=$1
# insert a lease6 for addr and ltype, state assigned # insert a lease6 for addr and ltype, state assigned
qry="insert into lease6 (address, lease_type, subnet_id, state) values ('$addr',$ltype,1,0);" qry="insert into lease6 (address, lease_type, subnet_id, state) values ('$addr',$ltype,1,0);"
@@ -642,10 +670,9 @@ pgsql_lease6_stat_test() {
pgsql_wipe pgsql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 "${EXIT_CODE}" "kea-admin db-init pgsql returned non-zero status code %d, expected %d"
assert_eq 0 $ERRCODE "kea-admin db-init pgsql returned non-zero status code %d, expected %d"
# verify lease6 stat table is present # verify lease6 stat table is present
qry="select count(subnet_id) from lease6_stat" qry="select count(subnet_id) from lease6_stat"
@@ -677,8 +704,8 @@ pgsql_lease_stat_upgrade_test() {
# tables. # tables.
# #
# Initialize database to scheme 1.0. # Initialize database to scheme 1.0.
pgsql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql pgsql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql"
assert_eq 0 $? "cannot initialize 1.0 database, expected exit code: %d, actual: %d" assert_eq 0 "${EXIT_CODE}" "cannot initialize 1.0 database, expected exit code: %d, actual: %d"
# Now upgrade to schema 2.0, this has lease_state in it # Now upgrade to schema 2.0, this has lease_state in it
pgsql_upgrade_schema_to_version 2.0 pgsql_upgrade_schema_to_version 2.0
@@ -702,8 +729,8 @@ pgsql_lease_stat_upgrade_test() {
run_statement "insert v6 leases" "$qry" run_statement "insert v6 leases" "$qry"
# Ok, we have a 2.0 database with leases. Let's upgrade it to 4.0 # Ok, we have a 2.0 database with leases. Let's upgrade it to 4.0
${keaadmin} db-upgrade pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-upgrade pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
# #
# First we'll verify lease4_stats are correct after migration. # First we'll verify lease4_stats are correct after migration.
@@ -816,10 +843,10 @@ pgsql_lease_stat_recount_test() {
pgsql_wipe pgsql_wipe
# Ok, now let's initialize the database # Ok, now let's initialize the database
${keaadmin} db-init pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-init pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
assert_eq 0 $ERRCODE "kea-admin db-init pgsql returned non-zero status code %d, expected %d" assert_eq 0 "${EXIT_CODE}" "kea-admin db-init pgsql returned non-zero status code %d, expected %d"
# Now we need insert some leases to "recount" # Now we need insert some leases to "recount"
qry=\ qry=\
@@ -853,10 +880,10 @@ pgsql_lease_stat_recount_test() {
run_statement "change v6 stats" "$qry" run_statement "change v6 stats" "$qry"
# Recount all statistics from scratch. # Recount all statistics from scratch.
${keaadmin} stats-recount pgsql -u $db_user -p $db_password -n $db_name run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" stats-recount pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}"
assert_eq 0 $ERRCODE "kea-admin stats-recount pgsql returned non-zero status code %d, expected %d" assert_eq 0 "${EXIT_CODE}" "kea-admin stats-recount pgsql returned non-zero status code %d, expected %d"
# #
# First we'll verify lease4_stats are correct after recount. # First we'll verify lease4_stats are correct after recount.
@@ -918,8 +945,8 @@ pgsql_unused_subnet_id_test() {
# tables. # tables.
# #
# Initialize database to scheme 1.0. # Initialize database to scheme 1.0.
pgsql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql pgsql_execute_script "@abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.pgsql"
assert_eq 0 $? "cannot initialize 1.0 database, expected exit code: %d, actual: %d" assert_eq 0 "${EXIT_CODE}" "cannot initialize 1.0 database, expected exit code: %d, actual: %d"
# Now upgrade to schema 4.0 # Now upgrade to schema 4.0
pgsql_upgrade_schema_to_version 4.0 pgsql_upgrade_schema_to_version 4.0
@@ -947,11 +974,11 @@ pgsql_unused_subnet_id_test() {
run_statement "insert options" "$qry" run_statement "insert options" "$qry"
# Ok, we have a 4.0 database with hosts and options. Let's upgrade it to 5.0 # Ok, we have a 4.0 database with hosts and options. Let's upgrade it to 5.0
${keaadmin} db-upgrade pgsql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir run_and_return_output_and_exit_code \
ERRCODE=$? "${kea_admin}" db-upgrade pgsql -u "${db_user}" -p "${db_password}" -n "${db_name}" -d "${db_scripts_dir}"
# Upgrade should succeed # Upgrade should succeed
assert_eq 0 $ERRCODE "upgrade failed" assert_eq 0 "${EXIT_CODE}" "upgrade failed"
# Two hosts should have null v4 subnet ids # Two hosts should have null v4 subnet ids
qry="select count(host_id) from hosts where dhcp4_subnet_id is null;" qry="select count(host_id) from hosts where dhcp4_subnet_id is null;"
@@ -992,6 +1019,7 @@ pgsql_unused_subnet_id_test() {
} }
# Run tests.
pgsql_db_init_test pgsql_db_init_test
pgsql_db_version_test pgsql_db_version_test
pgsql_upgrade_test pgsql_upgrade_test

View File

@@ -1,15 +1,28 @@
#!/bin/sh
# Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Include common test library.
. "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# Path to the temporary configuration file. # Path to the temporary configuration file.
CFG_FILE=@abs_top_builddir@/src/bin/agent/tests/test_config.json CFG_FILE="@abs_top_builddir@/src/bin/agent/tests/test_config.json"
# Path to the Control Agent log file. # Path to the Control Agent log file.
LOG_FILE=@abs_top_builddir@/src/bin/agent/tests/test.log LOG_FILE="@abs_top_builddir@/src/bin/agent/tests/test.log"
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
# Control Agent configuration to be stored in the configuration file. # Control Agent configuration to be stored in the configuration file.
# todo: use actual configuration once we support it. # todo: use actual configuration once we support it.
@@ -66,33 +79,33 @@ CONFIG_PWD="{
}" }"
bin="kea-ctrl-agent" bin="kea-ctrl-agent"
bin_path=@abs_top_builddir@/src/bin/agent bin_path="@abs_top_builddir@/src/bin/agent"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that syntax checking works properly. This function # This test verifies that syntax checking works properly. This function
# requires 3 parameters: # requires 3 parameters:
# testname # test_name
# config - string with a content of the config (will be written to a file) # config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure) # expected_code - expected exit code returned by kea (0 - success, 1 - failure)
syntax_check_test() { syntax_check_test() {
local TESTNAME="${1}" local test_name="${1}"
local CONFIG="${2}" local config="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create correct configuration file. # Create correct configuration file.
create_config "${CONFIG}" create_config "${config}"
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\"" printf 'Running command %s.\n' "\"${bin_path}/${bin} -t ${CFG_FILE}\""
${bin_path}/${bin} -t ${CFG_FILE} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" -t "${CFG_FILE}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
test_finish 0 test_finish 0
@@ -104,7 +117,7 @@ shutdown_test() {
test_name=${1} # Test name test_name=${1} # Test name
signum=${2} # Signal number signum=${2} # Signal number
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling D2 instances and remove log files. # Remove dangling D2 instances and remove log files.
cleanup cleanup
# Create new configuration file. # Create new configuration file.
@@ -115,7 +128,7 @@ shutdown_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Control Agent to start. # Wait up to 20s for Control Agent to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Control Agent to start.\n" printf "ERROR: timeout waiting for Control Agent to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -123,35 +136,35 @@ shutdown_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Control Agent process to be started. Found %d processes\ printf "ERROR: expected one Control Agent process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. # Check in the log file, how many times server has been configured.
# It should be just once on startup. # It should be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server been configured ${_GET_RECONFIGS} time(s), but exactly 1 was expected.\n" printf 'ERROR: server been configured %s time(s), but exactly 1 was expected.\n' "${_GET_RECONFIGS}"
clean_exit 1 clean_exit 1
else else
printf "Server successfully configured.\n" printf "Server successfully configured.\n"
fi fi
# Send signal to Control Agent (SIGTERM, SIGINT etc.) # Send signal to Control Agent (SIGTERM, SIGINT etc.)
send_signal ${signum} ${bin} send_signal "${signum}" "${bin}"
# Now wait for process to log that it is exiting. # Now wait for process to log that it is exiting.
wait_for_message 10 "DCTL_SHUTDOWN" 1 wait_for_message 10 "DCTL_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Control Agent did not log shutdown.\n" printf "ERROR: Control Agent did not log shutdown.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
test_finish 0 test_finish 0
@@ -159,39 +172,35 @@ shutdown_test() {
# This test verifies that passwords are redacted in logs. # This test verifies that passwords are redacted in logs.
# This function takes 2 parameters: # This function takes 2 parameters:
# testname # test_name
# config - string with a content of the config (will be written to a file) # config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure) # expected_code - expected exit code returned by kea (0 - success, 1 - failure)
password_redact_test() { password_redact_test() {
local TESTNAME="${1}" local test_name="${1}"
local CONFIG="${2}" local config="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create correct configuration file. # Create correct configuration file.
create_config "${CONFIG}" create_config "${config}"
# Instruct Control Agent to log to the specific file. # Instruct Control Agent to log to the specific file.
set_logger set_logger
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -d -t ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin_path}/${bin} -d -t ${CFG_FILE}\""
${bin_path}/${bin} -d -t ${CFG_FILE} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" -d -t "${CFG_FILE}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
grep "sensitive" ${LOG_FILE} if grep -q 'sensitive' "${LOG_FILE}"; then
exit_code=$?
if [ ${exit_code} -ne 1 ]; then
printf "ERROR: sensitive is present in logs\n" printf "ERROR: sensitive is present in logs\n"
clean_exit 1 clean_exit 1
fi fi
grep -q "superadmin" ${LOG_FILE} if ! grep -q 'superadmin' "${LOG_FILE}"; then
exit_code=$?
if [ ${exit_code} -ne 0 ]; then
printf "ERROR: superadmin is not present in logs\n" printf "ERROR: superadmin is not present in logs\n"
clean_exit 1 clean_exit 1
fi fi

View File

@@ -1,15 +1,25 @@
#!/bin/sh
# Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Path to the temporary configuration file. # Path to the temporary configuration file.
CFG_FILE=@abs_top_builddir@/src/bin/d2/tests/test_config.json CFG_FILE="@abs_top_builddir@/src/bin/d2/tests/test_config.json"
# Path to the D2 log file. # Path to the D2 log file.
LOG_FILE=@abs_top_builddir@/src/bin/d2/tests/test.log LOG_FILE="@abs_top_builddir@/src/bin/d2/tests/test.log"
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
# D2 configuration to be stored in the configuration file. # D2 configuration to be stored in the configuration file.
CONFIG="{ CONFIG="{
\"DhcpDdns\": \"DhcpDdns\":
@@ -105,33 +115,33 @@ CONFIG_INVALID="{
# Set the location of the executable. # Set the location of the executable.
bin="kea-dhcp-ddns" bin="kea-dhcp-ddns"
bin_path=@abs_top_builddir@/src/bin/d2 bin_path="@abs_top_builddir@/src/bin/d2"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that syntax checking works properly. This function # This test verifies that syntax checking works properly. This function
# requires 3 parameters: # requires 3 parameters:
# testname # test_name
# config - string with a content of the config (will be written to a file) # config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure) # expected_code - expected exit code returned by kea (0 - success, 1 - failure)
syntax_check_test() { syntax_check_test() {
local TESTNAME="${1}" local test_name="${1}"
local CONFIG="${2}" local config="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create correct configuration file. # Create correct configuration file.
create_config "${CONFIG}" create_config "${config}"
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
${bin_path}/${bin} -t ${CFG_FILE} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" -t "${CFG_FILE}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
test_finish 0 test_finish 0
@@ -151,7 +161,7 @@ dynamic_reconfiguration_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for D2 to start. # Wait up to 20s for D2 to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for D2 to start.\n" printf "ERROR: timeout waiting for D2 to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -159,16 +169,16 @@ dynamic_reconfiguration_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one D2 process to be started. Found %d processes\ printf "ERROR: expected one D2 process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. # Check in the log file, how many times server has been configured.
# It should be just once on startup. # It should be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: D2 hasn't been configured.\n" printf "ERROR: D2 hasn't been configured.\n"
clean_exit 1 clean_exit 1
else else
@@ -183,7 +193,7 @@ dynamic_reconfiguration_test() {
# Wait up to 10s for the D2Controller to log reload signal received. # Wait up to 10s for the D2Controller to log reload signal received.
wait_for_message 10 "DCTL_CFG_FILE_RELOAD_SIGNAL_RECVD" 1 wait_for_message 10 "DCTL_CFG_FILE_RELOAD_SIGNAL_RECVD" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: D2 did report the reload signal receipt.\n" printf "ERROR: D2 did report the reload signal receipt.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -192,14 +202,14 @@ dynamic_reconfiguration_test() {
# The configuration provided is invalid so it should result in # The configuration provided is invalid so it should result in
# reconfiguration failure but the server should still be running. # reconfiguration failure but the server should still be running.
wait_for_message 10 "DCTL_CFG_FILE_RELOAD_ERROR" 1 wait_for_message 10 "DCTL_CFG_FILE_RELOAD_ERROR" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: D2 did not report reload error.\n" printf "ERROR: D2 did not report reload error.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: D2 was killed when attempting reconfiguration.\n" printf "ERROR: D2 was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -217,7 +227,7 @@ dynamic_reconfiguration_test() {
# After receiving SIGHUP the server should get reconfigured and the # After receiving SIGHUP the server should get reconfigured and the
# reconfiguration should be noted in the log file. We should now # reconfiguration should be noted in the log file. We should now
# have two configurations logged in the log file. # have two configurations logged in the log file.
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: D2 hasn't been reconfigured.\n" printf "ERROR: D2 hasn't been reconfigured.\n"
clean_exit 1 clean_exit 1
else else
@@ -226,7 +236,7 @@ dynamic_reconfiguration_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: D2 was killed when attempting reconfiguration.\n" printf "ERROR: D2 was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -238,10 +248,10 @@ dynamic_reconfiguration_test() {
# This test verifies that DHCPv4 server is shut down gracefully when it # This test verifies that DHCPv4 server is shut down gracefully when it
# receives a SIGINT or SIGTERM signal. # receives a SIGINT or SIGTERM signal.
shutdown_test() { shutdown_test() {
test_name=${1} # Test name local test_name=${1} # Test name
signum=${2} # Signal number local signum=${2} # Signal number
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling D2 instances and remove log files. # Remove dangling D2 instances and remove log files.
cleanup cleanup
# Create new configuration file. # Create new configuration file.
@@ -252,7 +262,7 @@ shutdown_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for D2 to start. # Wait up to 20s for D2 to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for D2 to start.\n" printf "ERROR: timeout waiting for D2 to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -260,16 +270,16 @@ shutdown_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one D2 process to be started. Found %d processes\ printf "ERROR: expected one D2 process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. # Check in the log file, how many times server has been configured.
# It should be just once on startup. # It should be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server hasn't been configured.\n" printf "ERROR: server hasn't been configured.\n"
clean_exit 1 clean_exit 1
else else
@@ -277,18 +287,18 @@ shutdown_test() {
fi fi
# Send signal to D2 (SIGTERM, SIGINT etc.) # Send signal to D2 (SIGTERM, SIGINT etc.)
send_signal ${signum} ${bin} send_signal "${signum}" "${bin}"
# Now wait for process to log that it is exiting. # Now wait for process to log that it is exiting.
wait_for_message 10 "DCTL_SHUTDOWN" 1 wait_for_message 10 "DCTL_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: DHCP-DDNS did not log shutdown.\n" printf "ERROR: DHCP-DDNS did not log shutdown.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
test_finish 0 test_finish 0

View File

@@ -1,19 +1,29 @@
#!/bin/sh
# Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Path to the temporary configuration file. # Path to the temporary configuration file.
CFG_FILE=@abs_top_builddir@/src/bin/dhcp4/tests/test_config.json CFG_FILE="@abs_top_builddir@/src/bin/dhcp4/tests/test_config.json"
# Path to the Kea log file. # Path to the Kea log file.
LOG_FILE=@abs_top_builddir@/src/bin/dhcp4/tests/test.log LOG_FILE="@abs_top_builddir@/src/bin/dhcp4/tests/test.log"
# Path to the Kea lease file. # Path to the Kea lease file.
LEASE_FILE=@abs_top_builddir@/src/bin/dhcp4/tests/test_leases.csv LEASE_FILE="@abs_top_builddir@/src/bin/dhcp4/tests/test_leases.csv"
# Path to the Kea LFC application # Path to the Kea LFC application
export KEA_LFC_EXECUTABLE=@abs_top_builddir@/src/bin/lfc/kea-lfc export KEA_LFC_EXECUTABLE="@abs_top_builddir@/src/bin/lfc/kea-lfc"
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
# Kea configuration to be stored in the configuration file. # Kea configuration to be stored in the configuration file.
CONFIG="{ CONFIG="{
\"Dhcp4\": \"Dhcp4\":
@@ -160,33 +170,33 @@ CONFIG_INVALID="{
# Set the location of the executable. # Set the location of the executable.
bin="kea-dhcp4" bin="kea-dhcp4"
bin_path=@abs_top_builddir@/src/bin/dhcp4 bin_path="@abs_top_builddir@/src/bin/dhcp4"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that syntax checking works properly. This function # This test verifies that syntax checking works properly. This function
# requires 3 parameters: # requires 3 parameters:
# testname # test_name
# config - string with a content of the config (will be written to a file) # config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure) # expected_code - expected exit code returned by kea (0 - success, 1 - failure)
syntax_check_test() { syntax_check_test() {
local TESTNAME="${1}" local test_name="${1}"
local CONFIG="${2}" local config="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create correct configuration file. # Create correct configuration file.
create_config "${CONFIG}" create_config "${config}"
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
${bin_path}/${bin} -t ${CFG_FILE} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" -t "${CFG_FILE}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
test_finish 0 test_finish 0
@@ -206,7 +216,7 @@ dynamic_reconfiguration_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start. # Wait up to 20s for Kea to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Kea to start.\n" printf "ERROR: timeout waiting for Kea to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -214,16 +224,16 @@ dynamic_reconfiguration_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\ printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. It should # Check in the log file, how many times server has been configured. It should
# be just once on startup. # be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server hasn't been configured.\n" printf "ERROR: server hasn't been configured.\n"
clean_exit 1 clean_exit 1
else else
@@ -243,10 +253,10 @@ dynamic_reconfiguration_test() {
# The configuration provided is invalid so it should result in # The configuration provided is invalid so it should result in
# reconfiguration failure but the server should still be running. # reconfiguration failure but the server should still be running.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server has been reconfigured despite bogus configuration.\n" printf "ERROR: server has been reconfigured despite bogus configuration.\n"
clean_exit 1 clean_exit 1
elif [ ${_GET_RECONFIG_ERRORS} -ne 1 ]; then elif [ "${_GET_RECONFIG_ERRORS}" -ne 1 ]; then
printf "ERROR: server did not report reconfiguration error despite attempt\ printf "ERROR: server did not report reconfiguration error despite attempt\
to configure it with invalid configuration.\n" to configure it with invalid configuration.\n"
clean_exit 1 clean_exit 1
@@ -254,7 +264,7 @@ dynamic_reconfiguration_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n" printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -272,7 +282,7 @@ dynamic_reconfiguration_test() {
# After receiving SIGHUP the server should get reconfigured and the # After receiving SIGHUP the server should get reconfigured and the
# reconfiguration should be noted in the log file. We should now # reconfiguration should be noted in the log file. We should now
# have two configurations logged in the log file. # have two configurations logged in the log file.
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: server hasn't been reconfigured.\n" printf "ERROR: server hasn't been reconfigured.\n"
clean_exit 1 clean_exit 1
else else
@@ -281,7 +291,7 @@ dynamic_reconfiguration_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n" printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -289,7 +299,7 @@ dynamic_reconfiguration_test() {
# When the server receives a signal the call to select() function is # When the server receives a signal the call to select() function is
# interrupted. This should not be logged as an error. # interrupted. This should not be logged as an error.
get_log_messages "DHCP4_PACKET_RECEIVE_FAIL" get_log_messages "DHCP4_PACKET_RECEIVE_FAIL"
assert_eq 0 ${_GET_LOG_MESSAGES} \ assert_eq 0 "${_GET_LOG_MESSAGES}" \
"Expected get_log_messages DHCP4_PACKET_RECEIVE_FAIL return %d, \ "Expected get_log_messages DHCP4_PACKET_RECEIVE_FAIL return %d, \
returned %d." returned %d."
@@ -303,7 +313,7 @@ shutdown_test() {
test_name=${1} # Test name test_name=${1} # Test name
signum=${2} # Signal number signum=${2} # Signal number
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create new configuration file. # Create new configuration file.
@@ -314,7 +324,7 @@ shutdown_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start. # Wait up to 20s for Kea to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Kea to start.\n" printf "ERROR: timeout waiting for Kea to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -322,16 +332,16 @@ shutdown_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\ printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. It should # Check in the log file, how many times server has been configured. It should
# be just once on startup. # be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server hasn't been configured.\n" printf "ERROR: server hasn't been configured.\n"
clean_exit 1 clean_exit 1
else else
@@ -339,25 +349,25 @@ shutdown_test() {
fi fi
# Send signal to Kea (SIGTERM, SIGINT etc.) # Send signal to Kea (SIGTERM, SIGINT etc.)
send_signal ${signum} ${bin} send_signal "${signum}" "${bin}"
# Wait up to 10s for the server's graceful shutdown. The graceful shut down # Wait up to 10s for the server's graceful shutdown. The graceful shut down
# should be recorded in the log file with the appropriate message. # should be recorded in the log file with the appropriate message.
wait_for_message 10 "DHCP4_SHUTDOWN" 1 wait_for_message 10 "DHCP4_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not record shutdown in the log.\n" printf "ERROR: Server did not record shutdown in the log.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
# When the server receives a signal the call to select() function is # When the server receives a signal the call to select() function is
# interrupted. This should not be logged as an error. # interrupted. This should not be logged as an error.
get_log_messages "DHCP4_PACKET_RECEIVE_FAIL" get_log_messages "DHCP4_PACKET_RECEIVE_FAIL"
assert_eq 0 ${_GET_LOG_MESSAGES} \ assert_eq 0 "${_GET_LOG_MESSAGES}" \
"Expected get_log_messages return %d, returned %d." "Expected get_log_messages return %d, returned %d."
test_finish 0 test_finish 0
@@ -372,7 +382,7 @@ lfc_timer_test() {
cleanup cleanup
# Create a configuration with the LFC enabled, by replacing the section # Create a configuration with the LFC enabled, by replacing the section
# with the lfc-interval and persist parameters. # with the lfc-interval and persist parameters.
LFC_CONFIG=$(printf "${CONFIG}" | sed -e 's/\"lfc-interval\": 0/\"lfc-interval\": 3/g' \ LFC_CONFIG=$(printf '%s' "${CONFIG}" | sed -e 's/\"lfc-interval\": 0/\"lfc-interval\": 3/g' \
| sed -e 's/\"persist\": false/\"persist\": true/g') | sed -e 's/\"persist\": false/\"persist\": true/g')
# Create new configuration file. # Create new configuration file.
create_config "${LFC_CONFIG}" create_config "${LFC_CONFIG}"
@@ -382,7 +392,7 @@ lfc_timer_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start. # Wait up to 20s for Kea to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Kea to start.\n" printf "ERROR: timeout waiting for Kea to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -390,15 +400,15 @@ lfc_timer_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\ printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check if Kea emits the log message indicating that LFC is started. # Check if Kea emits the log message indicating that LFC is started.
wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 1 wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not execute LFC.\n" printf "ERROR: Server did not execute LFC.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -407,7 +417,7 @@ lfc_timer_test() {
sleep 1 sleep 1
# Modify the interval. # Modify the interval.
LFC_CONFIG=$(printf "${LFC_CONFIG}" | sed -e 's/\"lfc-interval\": 3/\"lfc-interval\": 4/g') LFC_CONFIG=$(printf '%s' "${LFC_CONFIG}" | sed -e 's/\"lfc-interval\": 3/\"lfc-interval\": 4/g')
# Create new configuration file. # Create new configuration file.
create_config "${LFC_CONFIG}" create_config "${LFC_CONFIG}"
@@ -421,7 +431,7 @@ lfc_timer_test() {
# After receiving SIGHUP the server should get reconfigured and the # After receiving SIGHUP the server should get reconfigured and the
# reconfiguration should be noted in the log file. We should now # reconfiguration should be noted in the log file. We should now
# have two configurations logged in the log file. # have two configurations logged in the log file.
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: server hasn't been reconfigured.\n" printf "ERROR: server hasn't been reconfigured.\n"
clean_exit 1 clean_exit 1
else else
@@ -430,14 +440,14 @@ lfc_timer_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n" printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
# Wait for the LFC to run the second time. # Wait for the LFC to run the second time.
wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 2 wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 2
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not execute LFC.\n" printf "ERROR: Server did not execute LFC.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -448,14 +458,14 @@ lfc_timer_test() {
# Wait up to 10s for the server's graceful shutdown. The graceful shut down # Wait up to 10s for the server's graceful shutdown. The graceful shut down
# should be recorded in the log file with the appropriate message. # should be recorded in the log file with the appropriate message.
wait_for_message 10 "DHCP4_SHUTDOWN" 1 wait_for_message 10 "DHCP4_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not record shutdown in the log.\n" printf "ERROR: Server did not record shutdown in the log.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
# All ok. Shut down Kea and exit. # All ok. Shut down Kea and exit.

View File

@@ -2387,7 +2387,7 @@ TEST_F(NameDhcpv4SrvTest, ddnsScopeTest) {
ASSERT_TRUE(fqdn); ASSERT_TRUE(fqdn);
EXPECT_EQ("client1.example.com.", fqdn->getDomainName()); EXPECT_EQ("client1.example.com.", fqdn->getDomainName());
// ddns-send-udpates for subnet 1 should be off, so we should NOT have an NRC. // ddns-send-updates for subnet 1 should be off, so we should NOT have an NRC.
ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize()); ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize());
// Now let's try with a client on subnet 2. // Now let's try with a client on subnet 2.
@@ -2411,7 +2411,7 @@ TEST_F(NameDhcpv4SrvTest, ddnsScopeTest) {
ASSERT_TRUE(fqdn); ASSERT_TRUE(fqdn);
EXPECT_EQ("two.example.com.", fqdn->getDomainName()); EXPECT_EQ("two.example.com.", fqdn->getDomainName());
// ddns-send-udpates for subnet 2 are enabled, verify the NCR is correct. // ddns-send-updates for subnet 2 are enabled, verify the NCR is correct.
ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize()); ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize());
verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true, verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true,
resp->getYiaddr().toText(), resp->getYiaddr().toText(),

View File

@@ -1,17 +1,27 @@
#!/bin/sh
# Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Path to the temporary configuration file. # Path to the temporary configuration file.
CFG_FILE=@abs_top_builddir@/src/bin/dhcp6/tests/test_config.json CFG_FILE="@abs_top_builddir@/src/bin/dhcp6/tests/test_config.json"
# Path to the Kea log file. # Path to the Kea log file.
LOG_FILE=@abs_top_builddir@/src/bin/dhcp6/tests/test.log LOG_FILE="@abs_top_builddir@/src/bin/dhcp6/tests/test.log"
# Path to the Kea lease file. # Path to the Kea lease file.
LEASE_FILE=@abs_top_builddir@/src/bin/dhcp6/tests/test_leases.csv LEASE_FILE="@abs_top_builddir@/src/bin/dhcp6/tests/test_leases.csv"
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
# Kea configuration to be stored in the configuration file. # Kea configuration to be stored in the configuration file.
CONFIG="{ CONFIG="{
\"Dhcp6\": \"Dhcp6\":
@@ -163,33 +173,33 @@ CONFIG_BAD_VALUES="{
# Set the location of the executable. # Set the location of the executable.
bin="kea-dhcp6" bin="kea-dhcp6"
bin_path=@abs_top_builddir@/src/bin/dhcp6 bin_path="@abs_top_builddir@/src/bin/dhcp6"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that syntax checking works properly. This function # This test verifies that syntax checking works properly. This function
# requires 3 parameters: # requires 3 parameters:
# testname # test_name
# config - string with a content of the config (will be written to a file) # config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure) # expected_code - expected exit code returned by kea (0 - success, 1 - failure)
syntax_check_test() { syntax_check_test() {
local TESTNAME="${1}" local test_name="${1}"
local CONFIG="${2}" local config="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create correct configuration file. # Create correct configuration file.
create_config "${CONFIG}" create_config "${config}"
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
${bin_path}/${bin} -t ${CFG_FILE} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" -t "${CFG_FILE}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code $EXP_CODE, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
@@ -210,7 +220,7 @@ dynamic_reconfiguration_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start. # Wait up to 20s for Kea to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Kea to start.\n" printf "ERROR: timeout waiting for Kea to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -218,16 +228,16 @@ dynamic_reconfiguration_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\ printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. It should # Check in the log file, how many times server has been configured. It should
# be just once on startup. # be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server hasn't been configured.\n" printf "ERROR: server hasn't been configured.\n"
clean_exit 1 clean_exit 1
else else
@@ -247,10 +257,10 @@ dynamic_reconfiguration_test() {
# The configuration provided is invalid so it should result in # The configuration provided is invalid so it should result in
# reconfiguration failure but the server should still be running. # reconfiguration failure but the server should still be running.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server has been reconfigured despite bogus configuration.\n" printf "ERROR: server has been reconfigured despite bogus configuration.\n"
clean_exit 1 clean_exit 1
elif [ ${_GET_RECONFIG_ERRORS} -ne 1 ]; then elif [ "${_GET_RECONFIG_ERRORS}" -ne 1 ]; then
printf "ERROR: server did not report reconfiguration error despite attempt\ printf "ERROR: server did not report reconfiguration error despite attempt\
to configure it with invalid configuration.\n" to configure it with invalid configuration.\n"
clean_exit 1 clean_exit 1
@@ -258,7 +268,7 @@ dynamic_reconfiguration_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n" printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -276,7 +286,7 @@ dynamic_reconfiguration_test() {
# After receiving SIGHUP the server should get reconfigured and the # After receiving SIGHUP the server should get reconfigured and the
# reconfiguration should be noted in the log file. We should now # reconfiguration should be noted in the log file. We should now
# have two configurations logged in the log file. # have two configurations logged in the log file.
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: server hasn't been reconfigured.\n" printf "ERROR: server hasn't been reconfigured.\n"
clean_exit 1 clean_exit 1
else else
@@ -285,7 +295,7 @@ dynamic_reconfiguration_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n" printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -293,7 +303,7 @@ dynamic_reconfiguration_test() {
# When the server receives a signal the call to select() function is # When the server receives a signal the call to select() function is
# interrupted. This should not be logged as an error. # interrupted. This should not be logged as an error.
get_log_messages "DHCP6_PACKET_RECEIVE_FAIL" get_log_messages "DHCP6_PACKET_RECEIVE_FAIL"
assert_eq 0 ${_GET_LOG_MESSAGES} \ assert_eq 0 "${_GET_LOG_MESSAGES}" \
"Expected get_log_messages DHCP6_PACKET_RECEIVE_FAIL return %d, \ "Expected get_log_messages DHCP6_PACKET_RECEIVE_FAIL return %d, \
returned %d." returned %d."
@@ -304,11 +314,11 @@ returned %d."
# This test verifies that DHCPv6 server is shut down gracefully when it # This test verifies that DHCPv6 server is shut down gracefully when it
# receives a SIGINT or SIGTERM signal. # receives a SIGINT or SIGTERM signal.
shutdown_test() { shutdown_test() {
test_name=${1} # Test name local test_name=${1} # Test name
signum=${2} # Signal number local signum=${2} # Signal number
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create new configuration file. # Create new configuration file.
@@ -319,7 +329,7 @@ shutdown_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start. # Wait up to 20s for Kea to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Kea to start.\n" printf "ERROR: timeout waiting for Kea to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -327,16 +337,16 @@ shutdown_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\ printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. It should # Check in the log file, how many times server has been configured. It should
# be just once on startup. # be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server hasn't been configured.\n" printf "ERROR: server hasn't been configured.\n"
clean_exit 1 clean_exit 1
else else
@@ -344,25 +354,25 @@ shutdown_test() {
fi fi
# Send signal to Kea (SIGTERM, SIGINT etc.) # Send signal to Kea (SIGTERM, SIGINT etc.)
send_signal ${signum} ${bin} send_signal "${signum}" "${bin}"
# Wait up to 10s for the server's graceful shutdown. The graceful shut down # Wait up to 10s for the server's graceful shutdown. The graceful shut down
# should be recorded in the log file with the appropriate message. # should be recorded in the log file with the appropriate message.
wait_for_message 10 "DHCP6_SHUTDOWN" 1 wait_for_message 10 "DHCP6_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not record shutdown in the log.\n" printf "ERROR: Server did not record shutdown in the log.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
# When the server receives a signal the call to select() function is # When the server receives a signal the call to select() function is
# interrupted. This should not be logged as an error. # interrupted. This should not be logged as an error.
get_log_messages "DHCP6_PACKET_RECEIVE_FAIL" get_log_messages "DHCP6_PACKET_RECEIVE_FAIL"
assert_eq 0 ${_GET_LOG_MESSAGES} \ assert_eq 0 "${_GET_LOG_MESSAGES}" \
"Expected get_log_messages DHCP6_PACKET_RECEIVE_FAIL return %d, \ "Expected get_log_messages DHCP6_PACKET_RECEIVE_FAIL return %d, \
returned %d." returned %d."
@@ -378,7 +388,7 @@ lfc_timer_test() {
cleanup cleanup
# Create a configuration with the LFC enabled, by replacing the section # Create a configuration with the LFC enabled, by replacing the section
# with the lfc-interval and persist parameters. # with the lfc-interval and persist parameters.
LFC_CONFIG=$(printf "${CONFIG}" | sed -e 's/\"lfc-interval\": 0/\"lfc-interval\": 3/g' \ LFC_CONFIG=$(printf '%s' "${CONFIG}" | sed -e 's/\"lfc-interval\": 0/\"lfc-interval\": 3/g' \
| sed -e 's/\"persist\": false,/\"persist\": true,/g') | sed -e 's/\"persist\": false,/\"persist\": true,/g')
# Create new configuration file. # Create new configuration file.
create_config "${LFC_CONFIG}" create_config "${LFC_CONFIG}"
@@ -388,7 +398,7 @@ lfc_timer_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Kea to start. # Wait up to 20s for Kea to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Kea to start.\n" printf "ERROR: timeout waiting for Kea to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -396,15 +406,15 @@ lfc_timer_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started. Found %d processes\ printf "ERROR: expected one Kea process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check if Kea emits the log message indicating that LFC is started. # Check if Kea emits the log message indicating that LFC is started.
wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 1 wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not execute LFC.\n" printf "ERROR: Server did not execute LFC.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -413,7 +423,7 @@ lfc_timer_test() {
sleep 1 sleep 1
# Modify the interval. # Modify the interval.
LFC_CONFIG=$(printf "${LFC_CONFIG}" | sed -e 's/\"lfc-interval\": 3/\"lfc-interval\": 4/g') LFC_CONFIG=$(printf '%s' "${LFC_CONFIG}" | sed -e 's/\"lfc-interval\": 3/\"lfc-interval\": 4/g')
# Create new configuration file. # Create new configuration file.
create_config "${LFC_CONFIG}" create_config "${LFC_CONFIG}"
@@ -427,7 +437,7 @@ lfc_timer_test() {
# After receiving SIGHUP the server should get reconfigured and the # After receiving SIGHUP the server should get reconfigured and the
# reconfiguration should be noted in the log file. We should now # reconfiguration should be noted in the log file. We should now
# have two configurations logged in the log file. # have two configurations logged in the log file.
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: server hasn't been reconfigured.\n" printf "ERROR: server hasn't been reconfigured.\n"
clean_exit 1 clean_exit 1
else else
@@ -436,14 +446,14 @@ lfc_timer_test() {
# Make sure the server is still operational. # Make sure the server is still operational.
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: Kea process was killed when attempting reconfiguration.\n" printf "ERROR: Kea process was killed when attempting reconfiguration.\n"
clean_exit 1 clean_exit 1
fi fi
# Wait for the LFC to run the second time. # Wait for the LFC to run the second time.
wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 2 wait_for_message 10 "DHCPSRV_MEMFILE_LFC_EXECUTE" 2
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not execute LFC.\n" printf "ERROR: Server did not execute LFC.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -454,14 +464,14 @@ lfc_timer_test() {
# Wait up to 10s for the server's graceful shutdown. The graceful shut down # Wait up to 10s for the server's graceful shutdown. The graceful shut down
# should be recorded in the log file with the appropriate message. # should be recorded in the log file with the appropriate message.
wait_for_message 10 "DHCP6_SHUTDOWN" 1 wait_for_message 10 "DHCP6_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Server did not record shutdown in the log.\n" printf "ERROR: Server did not record shutdown in the log.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
# All ok. Shut down Kea and exit. # All ok. Shut down Kea and exit.

View File

@@ -1693,7 +1693,7 @@ TEST_F(FqdnDhcpv6SrvTest, ddnsScopeTest) {
ASSERT_TRUE(fqdn); ASSERT_TRUE(fqdn);
EXPECT_EQ("one.example.org.", fqdn->getDomainName()); EXPECT_EQ("one.example.org.", fqdn->getDomainName());
// ddns-send-udpates for subnet 1 should be off, so we should NOT have an NRC. // ddns-send-updates for subnet 1 should be off, so we should NOT have an NRC.
ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize()); ASSERT_EQ(0, CfgMgr::instance().getD2ClientMgr().getQueueSize());
// Now let's try with a client on subnet 2. // Now let's try with a client on subnet 2.
@@ -1720,7 +1720,7 @@ TEST_F(FqdnDhcpv6SrvTest, ddnsScopeTest) {
DdnsParamsPtr p = (CfgMgr::instance().getCurrentCfg()->getDdnsParams(subnet)); DdnsParamsPtr p = (CfgMgr::instance().getCurrentCfg()->getDdnsParams(subnet));
ASSERT_TRUE(p->getEnableUpdates()); ASSERT_TRUE(p->getEnableUpdates());
// ddns-send-udpates for subnet 2 are enabled, verify the NCR is correct. // ddns-send-updates for subnet 2 are enabled, verify the NCR is correct.
ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize()); ASSERT_EQ(1, CfgMgr::instance().getD2ClientMgr().getQueueSize());
verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true, "2001:db8:2::1", verifyNameChangeRequest(isc::dhcp_ddns::CHG_ADD, true, true, "2001:db8:2::1",
"", 0, 4000); "", 0, 4000);

View File

@@ -1,26 +1,31 @@
#!/bin/sh
# This is a configuration file for keactrl script which controls # This is a configuration file for keactrl script which controls
# the startup, shutdown, reconfiguration and gathering the status # the startup, shutdown, reconfiguration and gathering the status
# of the Kea's processes. # of the Kea's processes.
# Note that control agent must be launched after servers and netconf last. # Note that control agent must be launched after servers and netconf last.
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
# prefix holds the location where the Kea is installed. # prefix holds the location where the Kea is installed.
prefix=@prefix@ prefix="@prefix@"
# Location of Kea configuration files. # Location of Kea configuration files.
kea_dhcp4_config_file=@sysconfdir@/@PACKAGE@/kea-dhcp4.conf kea_dhcp4_config_file="@sysconfdir@/@PACKAGE@/kea-dhcp4.conf"
kea_dhcp6_config_file=@sysconfdir@/@PACKAGE@/kea-dhcp6.conf kea_dhcp6_config_file="@sysconfdir@/@PACKAGE@/kea-dhcp6.conf"
kea_dhcp_ddns_config_file=@sysconfdir@/@PACKAGE@/kea-dhcp-ddns.conf kea_dhcp_ddns_config_file="@sysconfdir@/@PACKAGE@/kea-dhcp-ddns.conf"
kea_ctrl_agent_config_file=@sysconfdir@/@PACKAGE@/kea-ctrl-agent.conf kea_ctrl_agent_config_file="@sysconfdir@/@PACKAGE@/kea-ctrl-agent.conf"
kea_netconf_config_file=@sysconfdir@/@PACKAGE@/kea-netconf.conf kea_netconf_config_file="@sysconfdir@/@PACKAGE@/kea-netconf.conf"
# Location of Kea binaries. # Location of Kea binaries.
exec_prefix=@exec_prefix@ exec_prefix="@exec_prefix@"
dhcp4_srv=@sbindir@/kea-dhcp4 dhcp4_srv="@sbindir@/kea-dhcp4"
dhcp6_srv=@sbindir@/kea-dhcp6 dhcp6_srv="@sbindir@/kea-dhcp6"
dhcp_ddns_srv=@sbindir@/kea-dhcp-ddns dhcp_ddns_srv="@sbindir@/kea-dhcp-ddns"
ctrl_agent_srv=@sbindir@/kea-ctrl-agent ctrl_agent_srv="@sbindir@/kea-ctrl-agent"
netconf_srv=@sbindir@/kea-netconf netconf_srv="@sbindir@/kea-netconf"
# Start DHCPv4 server? # Start DHCPv4 server?
dhcp4=yes dhcp4=yes

View File

@@ -10,9 +10,24 @@
# This script is used to run Kea from installation directory, # This script is used to run Kea from installation directory,
# as well as for running tests. # as well as for running tests.
VERSION=@PACKAGE_VERSION@ # shellcheck disable=SC2034
@HAVE_SYSREPO_FALSE@have_netconf=0 # SC2034: ... appears unused. Verify use (or export if used externally).
@HAVE_SYSREPO_TRUE@have_netconf=1
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# shellcheck disable=SC2154
# SC2154: ... is referenced but not assigned.
# Reason: some variables are taken from keactrl.conf
VERSION="@PACKAGE_VERSION@"
# Set the have_netconf flag to know if netconf is available.
if test -z '@HAVE_SYSREPO_TRUE@'; then
have_netconf=true
else
have_netconf=false
fi
### Logging functions ### ### Logging functions ###
@@ -102,7 +117,7 @@ get_pid_from_file() {
# Default the directory to --localstatedir / run # Default the directory to --localstatedir / run
local pid_file_dir local pid_file_dir
pid_file_dir=@runstatedir@/@PACKAGE@ pid_file_dir="@runstatedir@/@PACKAGE@"
# Use directory override if set (primarily for testing only) # Use directory override if set (primarily for testing only)
if [ -n "$KEA_PIDFILE_DIR" ]; then if [ -n "$KEA_PIDFILE_DIR" ]; then
@@ -114,9 +129,7 @@ get_pid_from_file() {
# Grab the PID if the file exists # Grab the PID if the file exists
if [ -e "${_pid_file}" ]; then if [ -e "${_pid_file}" ]; then
_pid=$(cat "${_pid_file}") if ! _pid=$(cat "${_pid_file}"); then
retcode=$?
if [ $retcode -ne 0 ]; then
log_error "Error reading PID file: ${_pid_file}" log_error "Error reading PID file: ${_pid_file}"
fi fi
else else
@@ -138,9 +151,7 @@ check_running() {
get_pid_from_file "${proc_name}" get_pid_from_file "${proc_name}"
if [ ${_pid} -gt 0 ]; then if [ ${_pid} -gt 0 ]; then
# Use ps to check if PID is alive # Use ps to check if PID is alive
ps -p ${_pid} 1>/dev/null if ps -p ${_pid} 1>/dev/null; then
retcode=$?
if [ $retcode -eq 0 ]; then
# No error, so PID IS ALIVE # No error, so PID IS ALIVE
_running=1 _running=1
fi fi
@@ -153,13 +164,11 @@ send_signal() {
local proc_name=${2} # Process name. local proc_name=${2} # Process name.
get_pid_from_file "${proc_name}" get_pid_from_file "${proc_name}"
if [ ${_pid} -eq 0 ]; then if [ "${_pid}" -eq 0 ]; then
log_info "Skip sending signal ${sig} to process ${proc_name}: \ log_info "Skip sending signal ${sig} to process ${proc_name}: \
process is not running" process is not running"
else else
kill "-${sig}" "${_pid}" if ! kill "-${sig}" "${_pid}"; then
retcode=$?
if [ $retcode -ne 0 ]; then
log_error "Failed to send signal ${sig} to process ${proc_name}, PID {$_pid}." log_error "Failed to send signal ${sig} to process ${proc_name}, PID {$_pid}."
fi fi
fi fi
@@ -169,20 +178,20 @@ process is not running"
# already running. # already running.
start_server() { start_server() {
binary_path=${1} # Full path to the binary. binary_path=${1} # Full path to the binary.
full_command=$* # Binary and arguments. full_command=("${@}") # Binary and arguments.
# Extract the name of the binary from the path. # Extract the name of the binary from the path.
local binary_name local binary_name
binary_name=$(basename -- "${binary_path}") binary_name=$(basename -- "${binary_path}")
# Use the binary name to check if the process is already running. # Use the binary name to check if the process is already running.
check_running "${binary_name}" check_running "${binary_name}"
# If process is running, don't start another one. Just log a message. # If process is running, don't start another one. Just log a message.
if [ ${_running} -ne 0 ]; then if [ "${_running}" -ne 0 ]; then
log_info "${binary_name} appears to be running, see: \ log_info "${binary_name} appears to be running, see: \
PID ${_pid}, PID file: ${_pid_file}." PID ${_pid}, PID file: ${_pid_file}."
else else
log_info "Starting ${full_command}" log_info "Starting ${full_command[*]}"
# Start the process. # Start the process.
${full_command} & "${full_command[@]}" &
fi fi
} }
@@ -197,14 +206,11 @@ stop_server() {
# Use the binary name to check if the process is already running. # Use the binary name to check if the process is already running.
check_running "${binary_name}" check_running "${binary_name}"
# If process isn't running, don't start another one. Just log a message. # If process isn't running, don't start another one. Just log a message.
if [ ${_running} -eq 0 ]; then if [ "${_running}" -eq 0 ]; then
log_info "${binary_name} isn't running." log_info "${binary_name} isn't running."
else else
log_info "Stopping ${binary_name}..." log_info "Stopping ${binary_name}..."
if ! kill "-${sig}" "${_pid}"; then
kill "-${sig}" "${_pid}"
retcode=$?
if [ $retcode -ne 0 ]; then
log_error "Stop failed, could not send signal ${sig} \ log_error "Stop failed, could not send signal ${sig} \
to process ${proc_name}, PID ${_pid}." to process ${proc_name}, PID ${_pid}."
fi fi
@@ -222,13 +228,11 @@ reload_server() {
# Use the binary name to check if the process is already running. # Use the binary name to check if the process is already running.
check_running "${binary_name}" check_running "${binary_name}"
# If process isn't running, don't start another one. Just log a message. # If process isn't running, don't start another one. Just log a message.
if [ ${_running} -eq 0 ]; then if [ "${_running}" -eq 0 ]; then
log_info "${binary_name} isn't running." log_info "${binary_name} isn't running."
else else
log_info "Reloading ${binary_name}..." log_info "Reloading ${binary_name}..."
kill -${sig} ${_pid} if ! kill "-${sig}" "${_pid}"; then
retcode=$?
if [ $retcode -ne 0 ]; then
log_error "Reload failed, could not send signal ${sig} \ log_error "Reload failed, could not send signal ${sig} \
to process ${proc_name}, PID ${_pid}." to process ${proc_name}, PID ${_pid}."
fi fi
@@ -241,9 +245,7 @@ print_version() {
binary_path=${2} binary_path=${2}
if [ -e "${binary_path}" ]; then if [ -e "${binary_path}" ]; then
ver=$(${binary_path} -v) if ! ver=$(${binary_path} -v); then
retcode=$?
if [ $retcode -ne 0 ]; then
log_error "Error checking version of binary file: ${binary_path}" log_error "Error checking version of binary file: ${binary_path}"
fi fi
else else
@@ -286,9 +288,9 @@ run_conditional() {
# If keyword "all" is not on the list of servers we will have to check # If keyword "all" is not on the list of servers we will have to check
# if our specific server is on the list. If, not return. # if our specific server is on the list. If, not return.
is_in_list "all" "${servers}" is_in_list "all" "${servers}"
if [ ${_inlist} -eq 0 ]; then if [ "${_inlist}" -eq 0 ]; then
is_in_list "${server}" "${servers}" is_in_list "${server}" "${servers}"
if [ ${_inlist} -eq 0 ]; then if [ "${_inlist}" -eq 0 ]; then
return return
fi fi
else else
@@ -299,12 +301,12 @@ run_conditional() {
# Right now we're checking keactrl.in rather than keactrl directly. The have_netconf # Right now we're checking keactrl.in rather than keactrl directly. The have_netconf
# variable is set by configure script (it's in keactrl and not in keactrl.in). # variable is set by configure script (it's in keactrl and not in keactrl.in).
# shellcheck disable=SC2154 # shellcheck disable=SC2154
if [ "${have_netconf}" -eq 0 ]; then if ! ${have_netconf}; then
return return
fi fi
# reload is not supported for netconf. # reload is not supported for netconf.
if [ "${command}" = "reload" ]; then if [ "${command}" = "reload" ]; then
if [ ${is_all} -eq 1 ]; then if [ "${is_all}" -eq 1 ]; then
return return
fi fi
log_warning "netconf does not support reload" log_warning "netconf does not support reload"
@@ -333,8 +335,8 @@ run_conditional() {
# altered and only the handful of initial messages will be logged # altered and only the handful of initial messages will be logged
# to the default file. # to the default file.
if [ -z "${KEA_LOGGER_DESTINATION}" ]; then if [ -z "${KEA_LOGGER_DESTINATION}" ]; then
prefix=@prefix@ prefix="@prefix@"
export KEA_LOGGER_DESTINATION=@localstatedir@/log/kea.log export KEA_LOGGER_DESTINATION="@localstatedir@/log/kea.log"
fi fi
command=${1} command=${1}
@@ -351,19 +353,15 @@ if test "${command}" = "-v" || test "${command}" = "--version" ; then
fi fi
is_in_list "${command}" "start stop reload status version" is_in_list "${command}" "start stop reload status version"
if [ ${_inlist} -eq 0 ]; then if [ "${_inlist}" -eq 0 ]; then
log_error "invalid command: ${command}" log_error "invalid command: ${command}"
exit 1 exit 1
fi fi
# Get the location of the keactrl configuration file. # Get the location of the keactrl configuration file.
# Need to disable a false positive from shellcheck. Yes, prefix is used. prefix="@prefix@"
# shellcheck disable=SC2034 localstatedir="@localstatedir@"
prefix=@prefix@ keactrl_conf="@sysconfdir@/@PACKAGE@/keactrl.conf"
# Avoid problem with localstatedir / runstatedir
# shellcheck disable=SC2034
localstatedir=@localstatedir@
keactrl_conf=@sysconfdir@/@PACKAGE@/keactrl.conf
servers="all" servers="all"
@@ -396,7 +394,7 @@ do
for s in ${servers} for s in ${servers}
do do
is_in_list "${s}" "all dhcp4 dhcp6 dhcp_ddns ctrl_agent netconf" is_in_list "${s}" "all dhcp4 dhcp6 dhcp_ddns ctrl_agent netconf"
if [ ${_inlist} -eq 0 ]; then if [ "${_inlist}" -eq 0 ]; then
log_error "invalid server name: ${s}" log_error "invalid server name: ${s}"
exit 1 exit 1
fi fi
@@ -450,9 +448,10 @@ if [ -z "${ctrl_agent_srv}" ]; then
fi fi
# Get location of the Netconf binary. # Get location of the Netconf binary.
# have_netconf is set by configure in keactrl, but shellcheck checks keactrl.in if ${have_netconf}; then
# shellcheck disable=SC2154 # shellcheck disable=SC2154
if [ "${have_netconf}" -eq 1 ]; then # SC2154: netconf_srv is referenced but not assigned.
# reason: it is taken from keactrl.conf
if [ -z "${netconf_srv}" ]; then if [ -z "${netconf_srv}" ]; then
log_error "netconf_srv parameter not specified" log_error "netconf_srv parameter not specified"
exit 1 exit 1
@@ -472,7 +471,6 @@ case ${command} in
start) start)
args="" args=""
# kea_verbose is set in keactrl.conf that shellcheck is unable to load. # kea_verbose is set in keactrl.conf that shellcheck is unable to load.
# shellcheck disable=SC2154
if [ "${kea_verbose}" = "yes" ]; then if [ "${kea_verbose}" = "yes" ]; then
args="-d" args="-d"
fi fi
@@ -481,10 +479,8 @@ case ${command} in
# and if they are enabled in the keactrl configuration file. # and if they are enabled in the keactrl configuration file.
# The variables (dhcp4_srv, dhcp6_serv, dhcp_ddns_srv etc) are set in the # The variables (dhcp4_srv, dhcp6_serv, dhcp_ddns_srv etc) are set in the
# keactrl.conf file that shellcheck is unable to read. # keactrl.conf file that shellcheck is unable to read.
# shellcheck disable=SC2154
run_conditional "dhcp4" "start_server ${dhcp4_srv} -c ${kea_dhcp4_config_file} ${args}" 1 run_conditional "dhcp4" "start_server ${dhcp4_srv} -c ${kea_dhcp4_config_file} ${args}" 1
run_conditional "dhcp6" "start_server ${dhcp6_srv} -c ${kea_dhcp6_config_file} ${args}" 1 run_conditional "dhcp6" "start_server ${dhcp6_srv} -c ${kea_dhcp6_config_file} ${args}" 1
# shellcheck disable=SC2154
run_conditional "dhcp_ddns" "start_server ${dhcp_ddns_srv} -c ${kea_dhcp_ddns_config_file} \ run_conditional "dhcp_ddns" "start_server ${dhcp_ddns_srv} -c ${kea_dhcp_ddns_config_file} \
${args}" 1 ${args}" 1
run_conditional "ctrl_agent" "start_server ${ctrl_agent_srv} -c ${kea_ctrl_agent_config_file} \ run_conditional "ctrl_agent" "start_server ${ctrl_agent_srv} -c ${kea_ctrl_agent_config_file} \
@@ -530,33 +526,33 @@ ${args}" 1
# correct. For details, see this fine explanation: # correct. For details, see this fine explanation:
# https://unix.stackexchange.com/questions/443989/whats-the-right-way-to-quote-command-arg # https://unix.stackexchange.com/questions/443989/whats-the-right-way-to-quote-command-arg
check_running "$(basename -- "${dhcp4_srv}")" check_running "$(basename -- "${dhcp4_srv}")"
if [ ${_running} -eq 1 ]; then if [ "${_running}" -eq 1 ]; then
kea4_status=$active kea4_status=$active
fi fi
printf "DHCPv4 server: %b\n" "${kea4_status}" printf "DHCPv4 server: %b\n" "${kea4_status}"
kea6_status=$inactive kea6_status=$inactive
check_running "$(basename -- "${dhcp6_srv}")" check_running "$(basename -- "${dhcp6_srv}")"
if [ ${_running} -eq 1 ]; then if [ "${_running}" -eq 1 ]; then
kea6_status=$active kea6_status=$active
fi fi
printf "DHCPv6 server: %b\n" "${kea6_status}" printf "DHCPv6 server: %b\n" "${kea6_status}"
d2_status=$inactive d2_status=$inactive
check_running "$(basename -- "${dhcp_ddns_srv}")" check_running "$(basename -- "${dhcp_ddns_srv}")"
if [ ${_running} -eq 1 ]; then if [ "${_running}" -eq 1 ]; then
d2_status="active" d2_status="active"
fi fi
printf "DHCP DDNS: %b\n" "${d2_status}" printf "DHCP DDNS: %b\n" "${d2_status}"
agent_status=$inactive agent_status=$inactive
check_running "$(basename -- "${ctrl_agent_srv}")" check_running "$(basename -- "${ctrl_agent_srv}")"
if [ ${_running} -eq 1 ]; then if [ "${_running}" -eq 1 ]; then
agent_status=$active agent_status=$active
fi fi
printf "Control Agent: %b\n" "${agent_status}" printf "Control Agent: %b\n" "${agent_status}"
if [ "${have_netconf}" -eq 1 ]; then if ${have_netconf}; then
netconf_status=$inactive netconf_status=$inactive
check_running "$(basename -- "${netconf_srv}")" check_running "$(basename -- "${netconf_srv}")"
if [ "${_running}" -eq 1 ]; then if [ "${_running}" -eq 1 ]; then
@@ -569,7 +565,7 @@ ${args}" 1
printf "Kea DHCPv6 configuration file: %s\n" "${kea_dhcp6_config_file}" printf "Kea DHCPv6 configuration file: %s\n" "${kea_dhcp6_config_file}"
printf "Kea DHCP DDNS configuration file: %s\n" "${kea_dhcp_ddns_config_file}" printf "Kea DHCP DDNS configuration file: %s\n" "${kea_dhcp_ddns_config_file}"
printf "Kea Control Agent configuration file: %s\n" "${kea_ctrl_agent_config_file}" printf "Kea Control Agent configuration file: %s\n" "${kea_ctrl_agent_config_file}"
if [ "${have_netconf}" -eq 1 ]; then if ${have_netconf}; then
printf "Kea Netconf configuration file: %s\n" "${kea_netconf_config_file}" printf "Kea Netconf configuration file: %s\n" "${kea_netconf_config_file}"
fi fi
printf "keactrl configuration file: %s\n" "${keactrl_conf}" printf "keactrl configuration file: %s\n" "${keactrl_conf}"
@@ -578,7 +574,7 @@ ${args}" 1
check_kea_conf "${kea_dhcp6_config_file}" check_kea_conf "${kea_dhcp6_config_file}"
check_kea_conf "${kea_dhcp_ddns_config_file}" check_kea_conf "${kea_dhcp_ddns_config_file}"
check_kea_conf "${kea_ctrl_agent_config_file}" check_kea_conf "${kea_ctrl_agent_config_file}"
if [ "${have_netconf}" -eq 1 ]; then if ${have_netconf}; then
check_kea_conf "${kea_netconf_config_file}" check_kea_conf "${kea_netconf_config_file}"
fi fi

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,25 @@
#!/bin/sh
# Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Path to the temporary configuration file. # Path to the temporary configuration file.
CFG_FILE=@abs_top_builddir@/src/bin/netconf/tests/shtests/test_config.json CFG_FILE="@abs_top_builddir@/src/bin/netconf/tests/shtests/test_config.json"
# Path to the Kea log file. # Path to the Kea log file.
LOG_FILE=@abs_top_builddir@/src/bin/netconf/tests/shtests/test.log LOG_FILE="@abs_top_builddir@/src/bin/netconf/tests/shtests/test.log"
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
# Kea-netconf configuration to be stored in the configuration file. # Kea-netconf configuration to be stored in the configuration file.
CONFIG="{ CONFIG="{
@@ -64,19 +74,19 @@ CONFIG_BAD_VALUE="{
# Set the location of the executable. # Set the location of the executable.
bin="kea-netconf" bin="kea-netconf"
bin_path=@abs_top_builddir@/src/bin/netconf bin_path="@abs_top_builddir@/src/bin/netconf"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that help can be printed out. # This test verifies that help can be printed out.
usage_test() { usage_test() {
local TESTNAME="${1}" local test_name="${1}"
local PARAMS="${2}" local parameter="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
@@ -85,10 +95,10 @@ usage_test() {
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
${bin_path}/${bin} ${PARAMS} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" "${parameter}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
test_finish 0 test_finish 0
@@ -96,20 +106,20 @@ usage_test() {
# This test verifies that no argument is not reported as a PID file error. # This test verifies that no argument is not reported as a PID file error.
no_argument_test() { no_argument_test() {
local TESTNAME="${1}" local test_name="${1}"
local EXP_CODE="${2}" local expected_code="${2}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin}\"" printf "Running command %s.\n" "\"${bin_path}/${bin}\""
${bin_path}/${bin} | grep PID 2>&1 run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
test_finish 0 test_finish 0
@@ -117,26 +127,26 @@ no_argument_test() {
# This test verifies that syntax checking works properly. This function # This test verifies that syntax checking works properly. This function
# requires 3 parameters: # requires 3 parameters:
# testname # test_name
# config - string with a content of the config (will be written to a file) # config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure) # expected_code - expected exit code returned by kea (0 - success, 1 - failure)
syntax_check_test() { syntax_check_test() {
local TESTNAME="${1}" local test_name="${1}"
local CONFIG="${2}" local config="${2}"
local EXP_CODE="${3}" local expected_code="${3}"
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start $TESTNAME test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
# Create correct configuration file. # Create correct configuration file.
create_config "${CONFIG}" create_config "${config}"
# Check it # Check it
printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
${bin_path}/${bin} -t ${CFG_FILE} run_and_return_output_and_exit_code \
exit_code=$? "${bin_path}/${bin}" -t "${CFG_FILE}"
if [ ${exit_code} -ne $EXP_CODE ]; then if [ "${EXIT_CODE}" -ne "${expected_code}" ]; then
printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n" printf 'ERROR: expected exit code %s, got %s\n' "${expected_code}" "${EXIT_CODE}"
clean_exit 1 clean_exit 1
fi fi
test_finish 0 test_finish 0
@@ -148,7 +158,7 @@ shutdown_test() {
test_name=${1} # Test name test_name=${1} # Test name
signum=${2} # Signal number signum=${2} # Signal number
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling Netconf instances and remove log files. # Remove dangling Netconf instances and remove log files.
cleanup cleanup
# Create new configuration file. # Create new configuration file.
@@ -159,7 +169,7 @@ shutdown_test() {
start_kea ${bin_path}/${bin} start_kea ${bin_path}/${bin}
# Wait up to 20s for Netconf Agent to start. # Wait up to 20s for Netconf Agent to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Netconf Agent to start.\n" printf "ERROR: timeout waiting for Netconf Agent to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -167,35 +177,35 @@ shutdown_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${bin} get_pid ${bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Netconf Agent process to be started. Found %d processes\ printf "ERROR: expected one Netconf Agent process to be started. Found %d processes\
started.\n" ${_GET_PIDS_NUM} started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. # Check in the log file, how many times server has been configured.
# It should be just once on startup. # It should be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server been configured ${_GET_RECONFIGS} time(s), but exactly 1 was expected.\n" printf "ERROR: server been configured %s time(s), but exactly 1 was expected.\n" "${_GET_RECONFIGS}"
clean_exit 1 clean_exit 1
else else
printf "Server successfully configured.\n" printf "Server successfully configured.\n"
fi fi
# Send signal to Netconf Agent (SIGTERM, SIGINT etc.) # Send signal to Netconf Agent (SIGTERM, SIGINT etc.)
send_signal ${signum} ${bin} send_signal "${signum}" "${bin}"
# Now wait for process to log that it is exiting. # Now wait for process to log that it is exiting.
wait_for_message 10 "DCTL_SHUTDOWN" 1 wait_for_message 10 "DCTL_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Netconf Agent did not log shutdown.\n" printf "ERROR: Netconf Agent did not log shutdown.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${bin} wait_for_server_down 5 ${bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
test_finish 0 test_finish 0

View File

@@ -1,13 +1,20 @@
#!/bin/sh
# Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# Path to the temporary configuration file. # shellcheck disable=SC1091
CFG_FILE=@abs_top_builddir@/src/bin/shell/tests/test_config.json # SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Path to the Control Agent log file. # Path to the Control Agent log file.
LOG_FILE=@abs_top_builddir@/src/bin/shell/tests/test.log LOG_FILE="@abs_top_builddir@/src/bin/shell/tests/test.log"
# Control Agent configuration to be stored in the configuration file. # Control Agent configuration to be stored in the configuration file.
# todo: use actual configuration once we support it. # todo: use actual configuration once we support it.
@@ -45,15 +52,15 @@ CONFIG="{
# Using bin and bin_path would be confusing, so we omit defining bin # Using bin and bin_path would be confusing, so we omit defining bin
# and bin_path on purpose. # and bin_path on purpose.
ca_bin="kea-ctrl-agent" ca_bin="kea-ctrl-agent"
ca_bin_path=@abs_top_builddir@/src/bin/agent ca_bin_path="@abs_top_builddir@/src/bin/agent"
shell_bin="kea-shell" shell_bin="kea-shell"
shell_bin_path=@abs_top_builddir@/src/bin/shell shell_bin_path="@abs_top_builddir@/src/bin/shell"
tmpfile_path=@abs_top_builddir@/src/bin/shell/tests tmpfile_path="@abs_top_builddir@/src/bin/shell/tests"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that Control Agent is shut down gracefully when it # This test verifies that Control Agent is shut down gracefully when it
# receives a SIGINT or SIGTERM signal. # receives a SIGINT or SIGTERM signal.
@@ -67,7 +74,7 @@ shell_command_test() {
# Setup phase: start CA. # Setup phase: start CA.
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove any dangling CA instances and remove log files. # Remove any dangling CA instances and remove log files.
cleanup cleanup
@@ -81,7 +88,7 @@ shell_command_test() {
start_kea ${ca_bin_path}/${ca_bin} start_kea ${ca_bin_path}/${ca_bin}
# Wait up to 20s for Control Agent to start. # Wait up to 20s for Control Agent to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Control Agent to start.\n" printf "ERROR: timeout waiting for Control Agent to start.\n"
clean_exit 1 clean_exit 1
fi fi
@@ -89,18 +96,18 @@ shell_command_test() {
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${ca_bin} get_pid ${ca_bin}
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Control Agent process to be started.\ printf "ERROR: expected one Control Agent process to be started.\
Found %d processes started.\n" ${_GET_PIDS_NUM} Found %d processes started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. # Check in the log file, how many times server has been configured.
# It should be just once on startup. # It should be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server been configured ${_GET_RECONFIGS} time(s),\ printf "ERROR: server been configured %s time(s),\
but exactly 1 was expected.\n" but exactly 1 was expected.\n" "${_GET_RECONFIGS}"
clean_exit 1 clean_exit 1
else else
printf "Server successfully configured.\n" printf "Server successfully configured.\n"
@@ -111,19 +118,21 @@ shell_command_test() {
127.0.0.1 --port 8081 ${auth} ${cmd} > ${tmpfile_path}/shell-stdout.txt" 127.0.0.1 --port 8081 ${auth} ${cmd} > ${tmpfile_path}/shell-stdout.txt"
echo "Executing kea-shell ($tmp)" echo "Executing kea-shell ($tmp)"
set +e
echo | ${shell_bin_path}/${shell_bin} --host 127.0.0.1 \ echo | ${shell_bin_path}/${shell_bin} --host 127.0.0.1 \
--port 8081 ${auth} ${cmd} > ${tmpfile_path}/shell-stdout.txt --port 8081 "${auth}" "${cmd}" > ${tmpfile_path}/shell-stdout.txt
shell_exit_code=$?
set -e
# Check the exit code # Check the exit code
shell_exit_code=$? if [ "${exp_result}" = "fail" ]; then
if [ ${exp_result} == "fail" ]; then if [ "${shell_exit_code}" -eq 0 ]; then
if [ ${shell_exit_code} -eq 0 ]; then
echo "ERROR:" \ echo "ERROR:" \
"kea-shell returned ${shell_exit_code} exit code, expected 1." "kea-shell returned ${shell_exit_code} exit code, expected 1."
else else
echo "kea-shell returned ${shell_exit_code} exit code as expected." echo "kea-shell returned ${shell_exit_code} exit code as expected."
fi fi
elif [ ${shell_exit_code} -ne 0 ]; then elif [ "${shell_exit_code}" -ne 0 ]; then
echo "ERROR:" \ echo "ERROR:" \
"kea-shell returned ${shell_exit_code} exit code, expected 0." "kea-shell returned ${shell_exit_code} exit code, expected 0."
else else
@@ -132,10 +141,12 @@ shell_command_test() {
# Now check the response # Now check the response
rm -f ${tmpfile_path}/shell-expected.txt rm -f ${tmpfile_path}/shell-expected.txt
echo ${exp_rsp} > ${tmpfile_path}/shell-expected.txt printf '%s\n' "${exp_rsp}" > ${tmpfile_path}/shell-expected.txt
set +e
diff ${tmpfile_path}/shell-stdout.txt ${tmpfile_path}/shell-expected.txt diff ${tmpfile_path}/shell-stdout.txt ${tmpfile_path}/shell-expected.txt
diff_code=$? diff_code=$?
if [ ${diff_code} -ne 0 ]; then set -e
if [ "${diff_code}" -ne 0 ]; then
echo "ERROR:" \ echo "ERROR:" \
"content returned is different than expected." \ "content returned is different than expected." \
"See ${tmpfile_path}/shell-*.txt" "See ${tmpfile_path}/shell-*.txt"
@@ -156,14 +167,14 @@ shell_command_test() {
# Now wait for process to log that it is exiting. # Now wait for process to log that it is exiting.
wait_for_message 10 "DCTL_SHUTDOWN" 1 wait_for_message 10 "DCTL_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Control Agent did not log shutdown.\n" printf "ERROR: Control Agent did not log shutdown.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${ca_bin} wait_for_server_down 5 ${ca_bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
test_finish 0 test_finish 0

View File

@@ -1,13 +1,20 @@
#!/bin/sh
# Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# Path to the temporary configuration file. # shellcheck disable=SC1091
CFG_FILE=@abs_top_builddir@/src/bin/shell/tests/test_config.json # SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Path to the Control Agent log file. # Path to the Control Agent log file.
LOG_FILE=@abs_top_builddir@/src/bin/shell/tests/test.log LOG_FILE="@abs_top_builddir@/src/bin/shell/tests/test.log"
# Expected version # Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@" EXPECTED_VERSION="@PACKAGE_VERSION@"
@@ -36,15 +43,15 @@ CONFIG="{
# Using bin and bin_path would be confusing, so we omit defining bin # Using bin and bin_path would be confusing, so we omit defining bin
# and bin_path on purpose. # and bin_path on purpose.
ca_bin="kea-ctrl-agent" ca_bin="kea-ctrl-agent"
ca_bin_path=@abs_top_builddir@/src/bin/agent ca_bin_path="@abs_top_builddir@/src/bin/agent"
shell_bin="kea-shell" shell_bin="kea-shell"
shell_bin_path=@abs_top_builddir@/src/bin/shell shell_bin_path="@abs_top_builddir@/src/bin/shell"
tmpfile_path=@abs_top_builddir@/src/bin/shell/tests tmpfile_path="@abs_top_builddir@/src/bin/shell/tests"
# Import common test library. # Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh . "@abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh"
# This test verifies that Control Agent is shut down gracefully when it # This test verifies that Control Agent is shut down gracefully when it
# receives a SIGINT or SIGTERM signal. # receives a SIGINT or SIGTERM signal.
@@ -57,7 +64,7 @@ shell_command_test() {
# Setup phase: start CA. # Setup phase: start CA.
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove any dangling CA instances and remove log files. # Remove any dangling CA instances and remove log files.
cleanup cleanup
@@ -71,26 +78,26 @@ shell_command_test() {
start_kea ${ca_bin_path}/${ca_bin} start_kea ${ca_bin_path}/${ca_bin}
# Wait up to 20s for Control Agent to start. # Wait up to 20s for Control Agent to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for Control Agent to start.\n" printf "ERROR: timeout waiting for Control Agent to start.\n"
clean_exit 1 clean_exit 1
fi fi
# Check if it is still running. It could have terminated (e.g. as a result # Check if it is still running. It could have terminated (e.g. as a result
# of configuration failure). # of configuration failure).
get_pid ${ca_bin} get_pid "${ca_bin}"
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Control Agent process to be started.\ printf "ERROR: expected one Control Agent process to be started.\
Found %d processes started.\n" ${_GET_PIDS_NUM} Found %d processes started.\n" "${_GET_PIDS_NUM}"
clean_exit 1 clean_exit 1
fi fi
# Check in the log file, how many times server has been configured. # Check in the log file, how many times server has been configured.
# It should be just once on startup. # It should be just once on startup.
get_reconfigs get_reconfigs
if [ ${_GET_RECONFIGS} -ne 1 ]; then if [ "${_GET_RECONFIGS}" -ne 1 ]; then
printf "ERROR: server been configured ${_GET_RECONFIGS} time(s),\ printf "ERROR: server been configured %s time(s),\
but exactly 1 was expected.\n" but exactly 1 was expected.\n" "${_GET_RECONFIGS}"
clean_exit 1 clean_exit 1
else else
printf "Server successfully configured.\n" printf "Server successfully configured.\n"
@@ -102,11 +109,11 @@ shell_command_test() {
echo "Executing kea-shell ($tmp)" echo "Executing kea-shell ($tmp)"
echo "${params}" | ${shell_bin_path}/${shell_bin} --host 127.0.0.1 \ echo "${params}" | ${shell_bin_path}/${shell_bin} --host 127.0.0.1 \
--port 8081 ${cmd} > ${tmpfile_path}/shell-stdout.txt --port 8081 "${cmd}" > ${tmpfile_path}/shell-stdout.txt
shell_exit_code=$?
# Check the exit code # Check the exit code
shell_exit_code=$? if [ "${shell_exit_code}" -ne 0 ]; then
if [ ${shell_exit_code} -ne 0 ]; then
echo "ERROR:" \ echo "ERROR:" \
"kea-shell returned ${shell_exit_code} exit code, expected 0." "kea-shell returned ${shell_exit_code} exit code, expected 0."
else else
@@ -115,10 +122,10 @@ shell_command_test() {
# Now check the response # Now check the response
rm -f ${tmpfile_path}/shell-expected.txt rm -f ${tmpfile_path}/shell-expected.txt
echo ${exp_rsp} > ${tmpfile_path}/shell-expected.txt printf '%s\n' "${exp_rsp}" > ${tmpfile_path}/shell-expected.txt
diff ${tmpfile_path}/shell-stdout.txt ${tmpfile_path}/shell-expected.txt diff ${tmpfile_path}/shell-stdout.txt ${tmpfile_path}/shell-expected.txt
diff_code=$? diff_code=$?
if [ ${diff_code} -ne 0 ]; then if [ "${diff_code}" -ne 0 ]; then
echo "ERROR:" \ echo "ERROR:" \
"content returned is different than expected." \ "content returned is different than expected." \
"See ${tmpfile_path}/shell-*.txt" "See ${tmpfile_path}/shell-*.txt"
@@ -139,14 +146,14 @@ shell_command_test() {
# Now wait for process to log that it is exiting. # Now wait for process to log that it is exiting.
wait_for_message 10 "DCTL_SHUTDOWN" 1 wait_for_message 10 "DCTL_SHUTDOWN" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Control Agent did not log shutdown.\n" printf "ERROR: Control Agent did not log shutdown.\n"
clean_exit 1 clean_exit 1
fi fi
# Make sure the server is down. # Make sure the server is down.
wait_for_server_down 5 ${ca_bin} wait_for_server_down 5 ${ca_bin}
assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \ assert_eq 1 "${_WAIT_FOR_SERVER_DOWN}" \
"Expected wait_for_server_down return %d, returned %d" "Expected wait_for_server_down return %d, returned %d"
test_finish 0 test_finish 0
@@ -157,14 +164,14 @@ version_test() {
test_name=${1} # Test name test_name=${1} # Test name
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
REPORTED_VERSION="`${shell_bin_path}/${shell_bin} -v`" REPORTED_VERSION=$(${shell_bin_path}/${shell_bin} -v)
if test "${REPORTED_VERSION}" == "${EXPECTED_VERSION}"; then if test "${REPORTED_VERSION}" = "${EXPECTED_VERSION}"; then
test_finish 0 test_finish 0
else else
echo "ERROR:" \ echo "ERROR:" \

View File

@@ -983,12 +983,12 @@ public:
test_timer_.setup(std::bind(&NameChangeUDPTest::testTimeoutHandler, test_timer_.setup(std::bind(&NameChangeUDPTest::testTimeoutHandler,
this), this),
TEST_TIMEOUT); TEST_TIMEOUT);
// Disble multi-threading // Disable multi-threading
MultiThreadingMgr::instance().setMode(false); MultiThreadingMgr::instance().setMode(false);
} }
~NameChangeUDPTest() { ~NameChangeUDPTest() {
// Disble multi-threading // Disable multi-threading
MultiThreadingMgr::instance().setMode(false); MultiThreadingMgr::instance().setMode(false);
} }

View File

@@ -298,7 +298,7 @@ TEST_F(CfgOptionTest, add) {
EXPECT_TRUE(options->empty()); EXPECT_TRUE(options->empty());
} }
// This test verifies that options can be replaced with udpated content. // This test verifies that options can be replaced with updated content.
TEST_F(CfgOptionTest, replace) { TEST_F(CfgOptionTest, replace) {
CfgOption cfg; CfgOption cfg;

View File

@@ -1397,18 +1397,18 @@ TEST_F(SrvConfigTest, getDdnsParamsTest4) {
// Enable D2Client. // Enable D2Client.
enableD2Client(true); enableD2Client(true);
// Make sure subnet1 udpates are still disabled. // Make sure subnet1 updates are still disabled.
ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1)); ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1));
EXPECT_FALSE(params->getEnableUpdates()); EXPECT_FALSE(params->getEnableUpdates());
// Make sure subnet2 udpates are now enabled. // Make sure subnet2 updates are now enabled.
ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet2)); ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet2));
EXPECT_TRUE(params->getEnableUpdates()); EXPECT_TRUE(params->getEnableUpdates());
// Enable sending updates globally. This should inherit down subnet1. // Enable sending updates globally. This should inherit down subnet1.
conf.addConfiguredGlobal("ddns-send-updates", Element::create(true)); conf.addConfiguredGlobal("ddns-send-updates", Element::create(true));
// Make sure subnet1 udpates are now enabled. // Make sure subnet1 updates are now enabled.
ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1)); ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1));
EXPECT_TRUE(params->getEnableUpdates()); EXPECT_TRUE(params->getEnableUpdates());
} }
@@ -1557,18 +1557,18 @@ TEST_F(SrvConfigTest, getDdnsParamsTest6) {
// Enable D2Client. // Enable D2Client.
enableD2Client(true); enableD2Client(true);
// Make sure subnet1 udpates are still disabled. // Make sure subnet1 updates are still disabled.
ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1)); ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1));
EXPECT_FALSE(params->getEnableUpdates()); EXPECT_FALSE(params->getEnableUpdates());
// Make sure subnet2 udpates are now enabled. // Make sure subnet2 updates are now enabled.
ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet2)); ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet2));
EXPECT_TRUE(params->getEnableUpdates()); EXPECT_TRUE(params->getEnableUpdates());
// Enable sending updates globally. This should inherit down subnet1. // Enable sending updates globally. This should inherit down subnet1.
conf.addConfiguredGlobal("ddns-send-updates", Element::create(true)); conf.addConfiguredGlobal("ddns-send-updates", Element::create(true));
// Make sure subnet1 udpates are now enabled. // Make sure subnet1 updates are now enabled.
ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1)); ASSERT_NO_THROW(params = conf_.getDdnsParams(subnet1));
EXPECT_TRUE(params->getEnableUpdates()); EXPECT_TRUE(params->getEnableUpdates());
} }

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2012-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2012-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -7,26 +8,32 @@
# Checks that the initLogger() call uses for unit tests respects the setting of # Checks that the initLogger() call uses for unit tests respects the setting of
# the buffer value # the buffer value
#
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Allow non-zero exit codes to be explicitly checked in this test.
set +e
testname="bufferLogger test" testname="bufferLogger test"
echo $testname printf '%s\n' "${testname}"
failcount=0 failcount=0
tempfile=@abs_builddir@/buffer_logger_test_tempfile_$$ tempfile="@abs_builddir@/buffer_logger_test_tempfile_$$"
passfail() { passfail() {
if [ $1 -eq 0 ]; then if [ "${1}" -eq 0 ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
echo "1. Checking that buffer initialization works" printf '1. Checking that buffer initialization works\n'
echo -n " - Buffer including process() call: " printf ' - Buffer including process() call: '
cat > $tempfile << . cat > $tempfile << .
INFO [buffertest.log] LOG_BAD_SEVERITY unrecognized log severity: info INFO [buffertest.log] LOG_BAD_SEVERITY unrecognized log severity: info
INFO [buffertest.log] LOG_BAD_SEVERITY unrecognized log severity: info INFO [buffertest.log] LOG_BAD_SEVERITY unrecognized log severity: info
@@ -36,7 +43,7 @@ INFO [buffertest.log] LOG_BAD_SEVERITY unrecognized log severity: info
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo -n " - Buffer excluding process() call: " printf ' - Buffer excluding process() call: '
cat > $tempfile << . cat > $tempfile << .
INFO [buffertest.log]: LOG_BAD_SEVERITY unrecognized log severity: info INFO [buffertest.log]: LOG_BAD_SEVERITY unrecognized log severity: info
DEBUG [buffertest.log]: LOG_BAD_DESTINATION unrecognized log destination: debug-50 DEBUG [buffertest.log]: LOG_BAD_DESTINATION unrecognized log destination: debug-50
@@ -45,8 +52,6 @@ INFO [buffertest.log]: LOG_BAD_SEVERITY unrecognized log severity: info
./buffer_logger_test -n 2>&1 | diff $tempfile - ./buffer_logger_test -n 2>&1 | diff $tempfile -
passfail $? passfail $?
# Tidy up. # Tidy up.
rm -f $tempfile rm -f $tempfile

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2011-2016 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2011-2016 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -8,39 +9,43 @@
# The logger supports the idea of a "console" logger than logs to either stdout # The logger supports the idea of a "console" logger than logs to either stdout
# or stderr. This test checks that both these options work. # or stderr. This test checks that both these options work.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
testname="Console output test" testname="Console output test"
echo $testname printf '%s\n' "${testname}"
failcount=0 failcount=0
tempfile=@abs_builddir@/console_test_tempfile_$$ tempfile="@abs_builddir@/console_test_tempfile_$$"
# Look at tempfile and check that the count equals the expected count # Look at tempfile and check that the count equals the expected count
passfail() { passfail() {
count=`wc -l $tempfile | awk '{print $1}'` count=$(wc -l $tempfile | awk '{print $1}')
if [ $count -eq $1 ]; then if [ "${count}" -eq "${1}" ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
echo -n "1. Checking that console output to stdout goes to stdout:" printf '1. Checking that console output to stdout goes to stdout:'
rm -f $tempfile rm -f $tempfile
./logger_example -c stdout -s error 1> $tempfile 2> /dev/null ./logger_example -c stdout -s error 1> $tempfile 2> /dev/null
passfail 4 passfail 4
echo -n "2. Checking that console output to stdout does not go to stderr:" printf '2. Checking that console output to stdout does not go to stderr:'
rm -f $tempfile rm -f $tempfile
./logger_example -c stdout -s error 1> /dev/null 2> $tempfile ./logger_example -c stdout -s error 1> /dev/null 2> $tempfile
passfail 0 passfail 0
echo -n "3. Checking that console output to stderr goes to stderr:" printf '3. Checking that console output to stderr goes to stderr:'
rm -f $tempfile rm -f $tempfile
./logger_example -c stderr -s error 1> /dev/null 2> $tempfile ./logger_example -c stderr -s error 1> /dev/null 2> $tempfile
passfail 4 passfail 4
echo -n "4. Checking that console output to stderr does not go to stdout:" printf '4. Checking that console output to stderr does not go to stdout:'
rm -f $tempfile rm -f $tempfile
./logger_example -c stderr -s error 1> $tempfile 2> /dev/null ./logger_example -c stderr -s error 1> $tempfile 2> /dev/null
passfail 0 passfail 0

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -7,22 +8,29 @@
# Checks that the logger will route messages to the chosen destination. # Checks that the logger will route messages to the chosen destination.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Allow non-zero exit codes to be explicitly checked in this test.
set +e
testname="Destination test" testname="Destination test"
echo $testname printf '%s\n' "${testname}"
failcount=0 failcount=0
tempfile=@abs_builddir@/destination_test_tempfile_$$ tempfile="@abs_builddir@/destination_test_tempfile_$$"
destfile1_tmp=@abs_builddir@/destination_test_destfile_1_tmp_$$ destfile1_tmp="@abs_builddir@/destination_test_destfile_1_tmp_$$"
destfile2_tmp=@abs_builddir@/destination_test_destfile_2_tmp_$$ destfile2_tmp="@abs_builddir@/destination_test_destfile_2_tmp_$$"
destfile1=@abs_builddir@/destination_test_destfile_1_$$ destfile1="@abs_builddir@/destination_test_destfile_1_$$"
destfile2=@abs_builddir@/destination_test_destfile_2_$$ destfile2="@abs_builddir@/destination_test_destfile_2_$$"
passfail() { passfail() {
if [ $1 -eq 0 ]; then if [ "${1}" -eq 0 ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
@@ -41,19 +49,18 @@ sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1
sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1,\}\)\]/[\1]/' < $destfile2_tmp > $destfile2 sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1,\}\)\]/[\1]/' < $destfile2_tmp > $destfile2
# strip the thread ids # strip the thread ids
printf ' - destination 1:'
echo -n " - destination 1:"
cut -d' ' -f3- $destfile1 | diff $tempfile - cut -d' ' -f3- $destfile1 | diff $tempfile -
passfail $? passfail $?
echo -n " - destination 2:" printf ' - destination 2:'
cut -d' ' -f3- $destfile2 | diff $tempfile - cut -d' ' -f3- $destfile2 | diff $tempfile -
passfail $? passfail $?
# Tidy up. # Tidy up.
rm -f $tempfile $destfile1_tmp $destfile2_tmp $destfile1 $destfile2 rm -f $tempfile $destfile1_tmp $destfile2_tmp $destfile1 $destfile2
echo "2. Two loggers, different destinations and severities" printf '2. Two loggers, different destinations and severities\n'
rm -f $destfile1 $destfile2 rm -f $destfile1 $destfile2
./logger_example -l example -s info -f $destfile1_tmp -l alpha -s warn -f $destfile2_tmp ./logger_example -l example -s info -f $destfile1_tmp -l alpha -s warn -f $destfile2_tmp
@@ -73,17 +80,16 @@ ERROR [example.beta] LOG_BAD_DESTINATION unrecognized log destination: beta_erro
WARN [example.beta] LOG_BAD_STREAM bad log console output stream: beta_warn WARN [example.beta] LOG_BAD_STREAM bad log console output stream: beta_warn
INFO [example.beta] LOG_READ_ERROR error reading from message file beta: info INFO [example.beta] LOG_READ_ERROR error reading from message file beta: info
. .
echo -n " - destination 1:" printf ' - destination 1:'
cut -d' ' -f3- $destfile1 | diff $tempfile - cut -d' ' -f3- $destfile1 | diff $tempfile -
passfail $? passfail $?
echo -n " - destination 2:" printf ' - destination 2:'
cat > $tempfile << . cat > $tempfile << .
WARN [example.alpha] LOG_READ_ERROR error reading from message file a.txt: dummy reason WARN [example.alpha] LOG_READ_ERROR error reading from message file a.txt: dummy reason
. .
cut -d' ' -f3- $destfile2 | diff $tempfile - cut -d' ' -f3- $destfile2 | diff $tempfile -
passfail $? passfail $?
if [ $failcount -eq 0 ]; then if [ $failcount -eq 0 ]; then
echo "PASS: $testname" echo "PASS: $testname"
elif [ $failcount -eq 1 ]; then elif [ $failcount -eq 1 ]; then

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -8,26 +9,34 @@
# Checks that the initLogger() call uses for unit tests respects the setting of # Checks that the initLogger() call uses for unit tests respects the setting of
# the environment variables. # the environment variables.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Allow non-zero exit codes to be explicitly checked in this test.
set +e
testname="initLogger test" testname="initLogger test"
echo $testname printf '%s\n' "${testname}"
failcount=0 failcount=0
tempfile=@abs_builddir@/init_logger_test_tempfile_$$ tempfile="@abs_builddir@/init_logger_test_tempfile_$$"
destfile_tmp=@abs_builddir@/init_logger_test_destfile_tmp_$$ destfile_tmp="@abs_builddir@/init_logger_test_destfile_tmp_$$"
destfile=@abs_builddir@/init_logger_test_destfile_$$ destfile="@abs_builddir@/init_logger_test_destfile_$$"
passfail() { passfail() {
if [ $1 -eq 0 ]; then if [ "${1}" -eq 0 ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
echo "1. Checking that KEA_LOGGER_SEVERITY/KEA_LOGGER_DBGLEVEL work" printf '1. Checking that KEA_LOGGER_SEVERITY/KEA_LOGGER_DBGLEVEL work\n'
echo -n " - severity=DEBUG, dbglevel=99: " set +e
printf ' - severity=DEBUG, dbglevel=99: '
cat > $tempfile << . cat > $tempfile << .
DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-0 DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-0
DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-50 DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-50
@@ -42,7 +51,7 @@ KEA_LOGGER_DESTINATION=stdout KEA_LOGGER_SEVERITY=DEBUG KEA_LOGGER_DBGLEVEL=99 .
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo -n " - severity=DEBUG, dbglevel=50: " printf ' - severity=DEBUG, dbglevel=50: '
cat > $tempfile << . cat > $tempfile << .
DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-0 DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-0
DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-50 DEBUG [kea.log] LOG_BAD_DESTINATION unrecognized log destination: debug-50
@@ -56,7 +65,7 @@ KEA_LOGGER_DESTINATION=stdout KEA_LOGGER_SEVERITY=DEBUG KEA_LOGGER_DBGLEVEL=50 .
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo -n " - severity=WARN: " printf ' - severity=WARN: '
cat > $tempfile << . cat > $tempfile << .
WARN [kea.log] LOG_BAD_STREAM bad log console output stream: warn WARN [kea.log] LOG_BAD_STREAM bad log console output stream: warn
ERROR [kea.log] LOG_DUPLICATE_MESSAGE_ID duplicate message ID (error) in compiled code ERROR [kea.log] LOG_DUPLICATE_MESSAGE_ID duplicate message ID (error) in compiled code
@@ -67,9 +76,9 @@ KEA_LOGGER_DESTINATION=stdout KEA_LOGGER_SEVERITY=WARN ./init_logger_test | \
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo "2. Checking that KEA_LOGGER_DESTINATION works" printf '2. Checking that KEA_LOGGER_DESTINATION works\n'
echo -n " - stdout: " printf ' - stdout: '
cat > $tempfile << . cat > $tempfile << .
FATAL [kea.log] LOG_NO_MESSAGE_ID line fatal: message definition line found without a message ID FATAL [kea.log] LOG_NO_MESSAGE_ID line fatal: message definition line found without a message ID
. .
@@ -79,14 +88,14 @@ sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1
cut -d' ' -f3- $destfile | diff $tempfile - cut -d' ' -f3- $destfile | diff $tempfile -
passfail $? passfail $?
echo -n " - stderr: " printf ' - stderr: '
rm -f $destfile_tmp $destfile rm -f $destfile_tmp $destfile
KEA_LOGGER_SEVERITY=FATAL KEA_LOGGER_DESTINATION=stderr ./init_logger_test 2> $destfile_tmp KEA_LOGGER_SEVERITY=FATAL KEA_LOGGER_DESTINATION=stderr ./init_logger_test 2> $destfile_tmp
sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1,\}\)\]/[\1]/' < $destfile_tmp > $destfile sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1,\}\)\]/[\1]/' < $destfile_tmp > $destfile
cut -d' ' -f3- $destfile | diff $tempfile - cut -d' ' -f3- $destfile | diff $tempfile -
passfail $? passfail $?
echo -n " - file: " printf ' - file: '
rm -f $destfile_tmp $destfile rm -f $destfile_tmp $destfile
KEA_LOGGER_SEVERITY=FATAL KEA_LOGGER_DESTINATION=$destfile_tmp ./init_logger_test KEA_LOGGER_SEVERITY=FATAL KEA_LOGGER_DESTINATION=$destfile_tmp ./init_logger_test
sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1,\}\)\]/[\1]/' < $destfile_tmp > $destfile sed -e 's/\[\([a-z0-9\.]\{1,\}\)\/\([0-9]\{1,\}\)\.\(0x\)\{0,1\}\([0-9A-Fa-f]\{1,\}\)\]/[\1]/' < $destfile_tmp > $destfile
@@ -96,11 +105,11 @@ passfail $?
# Note: can't automatically test syslog output. # Note: can't automatically test syslog output.
if [ $failcount -eq 0 ]; then if [ $failcount -eq 0 ]; then
echo "PASS: $testname" printf 'PASS: %s\n' "${testname}"
elif [ $failcount -eq 1 ]; then elif [ $failcount -eq 1 ]; then
echo "FAIL: $testname - 1 test failed" printf 'FAIL: %s - 1 test failed\n' "${testname}"
else else
echo "FAIL: $testname - $failcount tests failed" printf 'FAIL: %s - %s tests failed\n' "${testname}" "${failcount}"
fi fi
# Tidy up. # Tidy up.

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -8,19 +9,26 @@
# Checks that a local message file can override the definitions in the message # Checks that a local message file can override the definitions in the message
# dictionary. # dictionary.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Allow non-zero exit codes to be explicitly checked in this test.
set +e
testname="Local message file test" testname="Local message file test"
echo $testname printf '%s\n' "${testname}"
failcount=0 failcount=0
localmes=@abs_builddir@/localdef_mes_$$ localmes="@abs_builddir@/localdef_mes_$$"
tempfile=@abs_builddir@/run_time_init_test_tempfile_$$ tempfile="@abs_builddir@/run_time_init_test_tempfile_$$"
passfail() { passfail() {
if [ $1 -eq 0 ]; then if [ "${1}" -eq 0 ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
@@ -32,7 +40,7 @@ cat > $localmes << .
% LOG_READING_LOCAL_FILE replacement read local message file, parameter is '%1' % LOG_READING_LOCAL_FILE replacement read local message file, parameter is '%1'
. .
echo -n "1. Local message replacement:" printf '1. Local message replacement:'
cat > $tempfile << . cat > $tempfile << .
WARN [example.log] LOG_NO_SUCH_MESSAGE could not replace message text for 'LOG_NOTHERE': no such message WARN [example.log] LOG_NO_SUCH_MESSAGE could not replace message text for 'LOG_NOTHERE': no such message
FATAL [example] LOG_WRITE_ERROR error writing to test1: 42 FATAL [example] LOG_WRITE_ERROR error writing to test1: 42
@@ -48,7 +56,7 @@ WARN [example.beta] LOG_BAD_STREAM bad log console output stream: beta_warn
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo -n "2. Report error if unable to read local message file:" printf '2. Report error if unable to read local message file:'
cat > $tempfile << . cat > $tempfile << .
ERROR [example.log] LOG_INPUT_OPEN_FAIL unable to open message file $localmes for input: No such file or directory ERROR [example.log] LOG_INPUT_OPEN_FAIL unable to open message file $localmes for input: No such file or directory
FATAL [example] LOG_WRITE_ERROR error writing to test1: 42 FATAL [example] LOG_WRITE_ERROR error writing to test1: 42
@@ -66,11 +74,11 @@ rm -f $localmes
passfail $? passfail $?
if [ $failcount -eq 0 ]; then if [ $failcount -eq 0 ]; then
echo "PASS: $testname" printf 'PASS: %s\n' "$testname"
elif [ $failcount -eq 1 ]; then elif [ $failcount -eq 1 ]; then
echo "FAIL: $testname - 1 test failed" printf 'FAIL: %s - 1 test failed\n' "$testname"
else else
echo "FAIL: $testname - $failcount tests failed" printf 'FAIL: %s - %s tests failed\n' "$testname" "$failcount"
fi fi
# Tidy up. # Tidy up.

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2012-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2012-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -8,20 +9,27 @@
# Checks that the locker interprocess sync locks are acquired and # Checks that the locker interprocess sync locks are acquired and
# released correctly. # released correctly.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Allow non-zero exit codes to be explicitly checked in this test.
set +e
failcount=0 failcount=0
tempfile=@abs_builddir@/logger_lock_test_tempfile_$$ tempfile="@abs_builddir@/logger_lock_test_tempfile_$$"
destfile=@abs_builddir@/logger_lock_test_destfile_$$ destfile="@abs_builddir@/logger_lock_test_destfile_$$"
passfail() { passfail() {
if [ $1 -eq 0 ]; then if [ "${1}" -eq 0 ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
echo -n "Testing that logger acquires and releases locks correctly:" printf 'Testing that logger acquires and releases locks correctly:'
cat > $tempfile << . cat > $tempfile << .
LOGGER_LOCK_TEST: MUTEXLOCK LOGGER_LOCK_TEST: MUTEXLOCK
LOGGER_LOCK_TEST: LOCK LOGGER_LOCK_TEST: LOCK

View File

@@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2011-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -8,22 +9,29 @@
# Checks that the logger will limit the output of messages less severe than # Checks that the logger will limit the output of messages less severe than
# the severity/debug setting. # the severity/debug setting.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Allow non-zero exit codes to be explicitly checked in this test.
set +e
testname="Severity test" testname="Severity test"
echo $testname printf '%s\n' "${testname}"
failcount=0 failcount=0
tempfile=@abs_builddir@/severity_test_tempfile_$$ tempfile="@abs_builddir@/severity_test_tempfile_$$"
passfail() { passfail() {
if [ $1 -eq 0 ]; then if [ "${1}" -eq 0 ]; then
echo " pass" printf ' pass\n'
else else
echo " FAIL" printf ' FAIL\n'
failcount=`expr $failcount + $1` failcount=$((failcount + $1))
fi fi
} }
echo -n "1. Default parameters:" printf '1. Default parameters:'
cat > $tempfile << . cat > $tempfile << .
FATAL [example] LOG_WRITE_ERROR error writing to test1: 42 FATAL [example] LOG_WRITE_ERROR error writing to test1: 42
ERROR [example] LOG_READING_LOCAL_FILE reading local message file dummy/file ERROR [example] LOG_READING_LOCAL_FILE reading local message file dummy/file
@@ -40,7 +48,7 @@ INFO [example.beta] LOG_READ_ERROR error reading from message file beta: info
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo -n "2. Severity filter:" printf '2. Severity filter:'
cat > $tempfile << . cat > $tempfile << .
FATAL [example] LOG_WRITE_ERROR error writing to test1: 42 FATAL [example] LOG_WRITE_ERROR error writing to test1: 42
ERROR [example] LOG_READING_LOCAL_FILE reading local message file dummy/file ERROR [example] LOG_READING_LOCAL_FILE reading local message file dummy/file
@@ -52,7 +60,7 @@ ERROR [example.beta] LOG_BAD_DESTINATION unrecognized log destination: beta_erro
cut -d' ' -f3- | diff $tempfile - cut -d' ' -f3- | diff $tempfile -
passfail $? passfail $?
echo -n "3. Debug level:" printf '3. Debug level:'
cat > $tempfile << . cat > $tempfile << .
FATAL [example] LOG_WRITE_ERROR error writing to test1: 42 FATAL [example] LOG_WRITE_ERROR error writing to test1: 42
ERROR [example] LOG_READING_LOCAL_FILE reading local message file dummy/file ERROR [example] LOG_READING_LOCAL_FILE reading local message file dummy/file
@@ -74,11 +82,11 @@ DEBUG [example.beta] LOG_BAD_SEVERITY unrecognized log severity: beta/25
passfail $? passfail $?
if [ $failcount -eq 0 ]; then if [ $failcount -eq 0 ]; then
echo "PASS: $testname" printf 'PASS: %s\n' "$testname"
elif [ $failcount -eq 1 ]; then elif [ $failcount -eq 1 ]; then
echo "FAIL: $testname - 1 test failed" printf 'FAIL: %s - 1 test failed\n' "$testname"
else else
echo "FAIL: $testname - $failcount tests failed" printf 'FAIL: %s - %s tests failed\n' "$testname" "$failcount"
fi fi
# Tidy up # Tidy up

View File

@@ -1,11 +1,33 @@
#!/bin/sh
# Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# shellcheck disable=SC2153
# SC2153: Possible misspelling: ... may not be assigned, but ... is.
# shellcheck disable=SC2154
# SC2154: bin_path is referenced but not assigned.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
prefix="@prefix@"
# A list of Kea processes, mainly used by the cleanup functions. # A list of Kea processes, mainly used by the cleanup functions.
KEA_PROCS="kea-dhcp4 kea-dhcp6 kea-dhcp-ddns kea-ctrl-agent" KEA_PROCS="kea-dhcp4 kea-dhcp6 kea-dhcp-ddns kea-ctrl-agent"
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"
# Expected version # Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@" EXPECTED_VERSION="@PACKAGE_VERSION@"
@@ -18,10 +40,9 @@ test_lib_error() {
local no_new_line=${2} # If specified, the message not terminated with local no_new_line=${2} # If specified, the message not terminated with
# new line. # new line.
printf "ERROR/test_lib: %s" "${s}" printf "ERROR/test_lib: %s" "${s}"
if [ -z ${no_new_line} ]; then if [ -z "${no_new_line}" ]; then
printf "%s" "\n" printf '\n'
fi fi
} }
# Prints info message. # Prints info message.
@@ -30,8 +51,8 @@ test_lib_info() {
local no_new_line=${2} # If specified, the message is not terminated with local no_new_line=${2} # If specified, the message is not terminated with
# new line. # new line.
printf "INFO/test_lib: %s" "${s}" printf "INFO/test_lib: %s" "${s}"
if [ -z ${no_new_line} ]; then if [ -z "${no_new_line}" ]; then
printf "%s" "\n" printf '\n'
fi fi
} }
@@ -42,14 +63,19 @@ test_lib_info() {
# detailed error is printed. The detailed error must use the printf # detailed error is printed. The detailed error must use the printf
# formatting like this: # formatting like this:
# "Expected that some value 1 %d is equal to some other value %d". # "Expected that some value 1 %d is equal to some other value %d".
# shellcheck disable=SC2059
# SC2059: Don't use variables in the printf format string. Use printf '..%s..' "$foo"
assert_eq() { assert_eq() {
val1=${1} # Reference value val1=${1} # Reference value
val2=${2} # Tested value val2=${2} # Tested value
detailed_err=${3} # Detailed error format string detailed_err=${3} # Detailed error format string
# If nothing found, present an error an exit. # If nothing found, present an error an exit.
if [ ${val1} -ne ${val2} ]; then if [ "${val1}" -ne "${val2}" ]; then
printf "Assertion failure: ${val1} != ${val2}, for val1=${val1}, val2=${val2}\n" printf "Assertion failure: ${val1} != ${val2}, for val1=${val1}, val2=${val2}\n"
printf "${detailed_err}\n" ${val1} ${val2} printf "${detailed_err}\n" "${val1}" "${val2}"
if test -n "${DEBUG+X}"; then
printf '%s\n' "${OUTPUT}" >&2
fi
clean_exit 1 clean_exit 1
fi fi
} }
@@ -65,8 +91,14 @@ assert_str_eq() {
detailed_err=${3} # Detailed error format string detailed_err=${3} # Detailed error format string
# If nothing found, present an error an exit. # If nothing found, present an error an exit.
if [ "${val1}" != "${val2}" ]; then if [ "${val1}" != "${val2}" ]; then
printf "Assertion failure: ${val1} != ${val2}, for val1=${val1}, val2=${val2}\n" printf 'Assertion failure: %s != %s, for val1=%s, val2=%s\n' \
printf "${detailed_err}\n" ${val1} ${val2} "${val1}" "${val2}" "${val1}" "${val2}"
# shellcheck disable=SC2059
# SC2059: SC2059: Don't use variables in the printf format string. Use printf '..%s..' "$foo".
printf "${detailed_err}\n" "${val1}" "${val2}"
if test -n "${DEBUG+X}"; then
printf '%s\n' "${OUTPUT}" >&2
fi
clean_exit 1 clean_exit 1
fi fi
} }
@@ -84,13 +116,38 @@ assert_string_contains() {
match=$( printf "%s" "${text}" | awk /"${pattern}"/ ) match=$( printf "%s" "${text}" | awk /"${pattern}"/ )
# If nothing found, present an error and exit. # If nothing found, present an error and exit.
if [ -z "${match}" ]; then if [ -z "${match}" ]; then
printf "Assertion failure: \n\"%s\"\n\ndoesn't contain pattern:\n printf \
\"%s\"\n\n" "${text}" "${pattern}" 'Assertion failure:
printf "${detailed_err}\n" "\"${pattern}\"" "%s"
does not contain pattern:
"%s"
%s
' "${text}" "${pattern}" "${detailed_err}"
if test -n "${DEBUG+X}"; then
printf '%s\n' "${OUTPUT}" >&2
fi
clean_exit 1 clean_exit 1
fi fi
} }
# Runs all the given arguments as a single command. Maintains quoting. Places
# output in ${OUTPUT} and exit code in ${EXIT_CODE}. Does not support pipes and
# redirections. Support for them could be added through eval and single
# parameter assignment, but eval is not recommended.
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
run_and_return_output_and_exit_code() {
if test -n "${DEBUG+x}"; then
printf '%s\n' "${*}" >&2
fi
set +e
OUTPUT=$("${@}")
EXIT_CODE=${?}
set -e
}
# Enable traps to print FAILED status when a command fails unexpectedly or when # Enable traps to print FAILED status when a command fails unexpectedly or when
# the user sends a SIGINT. Used in `test_start`. # the user sends a SIGINT. Used in `test_start`.
traps_on() { traps_on() {
@@ -114,7 +171,7 @@ traps_off() {
# Begins a test by printing its name. # Begins a test by printing its name.
test_start() { test_start() {
TEST_NAME=${1} TEST_NAME=${1}
if [ -z ${TEST_NAME} ]; then if [ -z "${TEST_NAME}" ]; then
test_lib_error "test_start requires test name as an argument" test_lib_error "test_start requires test name as an argument"
clean_exit 1 clean_exit 1
fi fi
@@ -129,15 +186,15 @@ test_start() {
# Prints test result an cleans up after the test. # Prints test result an cleans up after the test.
test_finish() { test_finish() {
local exit_code=${1} # Exit code to be returned by the exit function. local exit_code=${1} # Exit code to be returned by the exit function.
if [ ${exit_code} -eq 0 ]; then if [ "${exit_code}" -eq 0 ]; then
cleanup cleanup
printf '\033[92m[ OK ]\033[0m %s\n' "${TEST_NAME}" printf '\033[92m[ OK ]\033[0m %s\n' "${TEST_NAME}"
else else
# Dump log file for debugging purposes if specified and exists. # Dump log file for debugging purposes if specified and exists.
# Otherwise the code below would simply call cat. # Otherwise the code below would simply call cat.
if [ -n "${LOG_FILE}" -a -s "${LOG_FILE}" ]; then if test -n "${LOG_FILE+x}" && test -s "${LOG_FILE}"; then
printf "Log file dump:\n" printf 'Log file dump:\n'
cat ${LOG_FILE} cat "${LOG_FILE}"
fi fi
cleanup cleanup
printf '\033[91m[ FAILED ]\033[0m %s\n' "${TEST_NAME}" printf '\033[91m[ FAILED ]\033[0m %s\n' "${TEST_NAME}"
@@ -151,7 +208,7 @@ test_finish() {
# file which name has been set in the ${CFG_FILE} variable. # file which name has been set in the ${CFG_FILE} variable.
create_config() { create_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${CFG_FILE} ]; then if [ -z "${CFG_FILE}" ]; then
test_lib_error "create_config requires CFG_FILE variable be set" test_lib_error "create_config requires CFG_FILE variable be set"
clean_exit 1 clean_exit 1
@@ -159,8 +216,8 @@ create_config() {
test_lib_error "create_config requires argument holding a configuration" test_lib_error "create_config requires argument holding a configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating Kea configuration file: %s.\n" ${CFG_FILE} printf 'Creating Kea configuration file: %s.\n' "${CFG_FILE}"
printf "%b" ${cfg} > ${CFG_FILE} printf '%b' "${cfg}" > "${CFG_FILE}"
} }
# Stores the DHCP4 configuration specified as a parameter in the # Stores the DHCP4 configuration specified as a parameter in the
@@ -168,7 +225,7 @@ create_config() {
# variable. # variable.
create_dhcp4_config() { create_dhcp4_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${DHCP4_CFG_FILE} ]; then if [ -z "${DHCP4_CFG_FILE}" ]; then
test_lib_error "create_dhcp4_config requires DHCP4_CFG_FILE \ test_lib_error "create_dhcp4_config requires DHCP4_CFG_FILE \
variable be set" variable be set"
clean_exit 1 clean_exit 1
@@ -178,8 +235,8 @@ variable be set"
configuration" configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating Dhcp4 configuration file: %s.\n" ${DHCP4_CFG_FILE} printf 'Creating Dhcp4 configuration file: %s.\n' "${DHCP4_CFG_FILE}"
printf "%b" ${cfg} > ${DHCP4_CFG_FILE} printf '%b' "${cfg}" > "${DHCP4_CFG_FILE}"
} }
# Stores the DHCP6 configuration specified as a parameter in the # Stores the DHCP6 configuration specified as a parameter in the
@@ -187,7 +244,7 @@ configuration"
# variable. # variable.
create_dhcp6_config() { create_dhcp6_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${DHCP6_CFG_FILE} ]; then if [ -z "${DHCP6_CFG_FILE}" ]; then
test_lib_error "create_dhcp6_config requires DHCP6_CFG_FILE \ test_lib_error "create_dhcp6_config requires DHCP6_CFG_FILE \
variable be set" variable be set"
clean_exit 1 clean_exit 1
@@ -197,8 +254,8 @@ variable be set"
configuration" configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating Dhcp6 configuration file: %s.\n" ${DHCP6_CFG_FILE} printf 'Creating Dhcp6 configuration file: %s.\n' "${DHCP6_CFG_FILE}"
printf "%b" ${cfg} > ${DHCP6_CFG_FILE} printf '%b' "${cfg}" > "${DHCP6_CFG_FILE}"
} }
# Stores the D2 configuration specified as a parameter in the # Stores the D2 configuration specified as a parameter in the
@@ -206,7 +263,7 @@ configuration"
# variable. # variable.
create_d2_config() { create_d2_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${D2_CFG_FILE} ]; then if [ -z "${D2_CFG_FILE}" ]; then
test_lib_error "create_d2_config requires D2_CFG_FILE \ test_lib_error "create_d2_config requires D2_CFG_FILE \
variable be set" variable be set"
clean_exit 1 clean_exit 1
@@ -216,8 +273,8 @@ variable be set"
configuration" configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating D2 configuration file: %s.\n" ${D2_CFG_FILE} printf 'Creating D2 configuration file: %s.\n' "${D2_CFG_FILE}"
printf "%b" ${cfg} > ${D2_CFG_FILE} printf '%b' "${cfg}" > "${D2_CFG_FILE}"
} }
# Stores the CA configuration specified as a parameter in the # Stores the CA configuration specified as a parameter in the
@@ -225,7 +282,7 @@ configuration"
# variable. # variable.
create_ca_config() { create_ca_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${CA_CFG_FILE} ]; then if [ -z "${CA_CFG_FILE}" ]; then
test_lib_error "create_ca_config requires CA_CFG_FILE \ test_lib_error "create_ca_config requires CA_CFG_FILE \
variable be set" variable be set"
clean_exit 1 clean_exit 1
@@ -235,8 +292,8 @@ variable be set"
configuration" configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating Ca configuration file: %s.\n" ${CA_CFG_FILE} printf 'Creating Ca configuration file: %s.\n' "${CA_CFG_FILE}"
printf "%b" ${cfg} > ${CA_CFG_FILE} printf '%b' "${cfg}" > "${CA_CFG_FILE}"
} }
# Stores the NC configuration specified as a parameter in the # Stores the NC configuration specified as a parameter in the
@@ -244,7 +301,7 @@ configuration"
# variable. # variable.
create_nc_config() { create_nc_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${NC_CFG_FILE} ]; then if [ -z "${NC_CFG_FILE}" ]; then
test_lib_error "create_nc_config requires NC_CFG_FILE \ test_lib_error "create_nc_config requires NC_CFG_FILE \
variable be set" variable be set"
clean_exit 1 clean_exit 1
@@ -254,8 +311,8 @@ variable be set"
configuration" configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating Nc configuration file: %s.\n" ${NC_CFG_FILE} printf 'Creating Nc configuration file: %s.\n' "${NC_CFG_FILE}"
printf "%b" ${cfg} > ${NC_CFG_FILE} printf '%b' "${cfg}" > "${NC_CFG_FILE}"
} }
# Stores the keactrl configuration specified as a parameter in the # Stores the keactrl configuration specified as a parameter in the
@@ -263,7 +320,7 @@ configuration"
# variable. # variable.
create_keactrl_config() { create_keactrl_config() {
local cfg="${1}" # Configuration string. local cfg="${1}" # Configuration string.
if [ -z ${KEACTRL_CFG_FILE} ]; then if [ -z "${KEACTRL_CFG_FILE}" ]; then
test_lib_error "create_keactrl_config requires KEACTRL_CFG_FILE \ test_lib_error "create_keactrl_config requires KEACTRL_CFG_FILE \
variable be set" variable be set"
clean_exit 1 clean_exit 1
@@ -273,25 +330,25 @@ variable be set"
configuration" configuration"
clean_exit 1 clean_exit 1
fi fi
printf "Creating keactrl configuration file: %s.\n" ${KEACTRL_CFG_FILE} printf 'Creating keactrl configuration file: %s.\n' "${KEACTRL_CFG_FILE}"
printf "%b" ${cfg} > ${KEACTRL_CFG_FILE} printf '%b' "${cfg}" > "${KEACTRL_CFG_FILE}"
} }
# Sets Kea logger to write to the file specified by the global value # Sets Kea logger to write to the file specified by the global value
# ${LOG_FILE}. # ${LOG_FILE}.
set_logger() { set_logger() {
if [ -z ${LOG_FILE} ]; then if [ -z "${LOG_FILE}" ]; then
test_lib_error "set_logger requires LOG_FILE variable be set" test_lib_error "set_logger requires LOG_FILE variable be set"
clean_exit 1 clean_exit 1
fi fi
printf "Kea log will be stored in %s.\n" ${LOG_FILE} printf 'Kea log will be stored in %s.\n' "${LOG_FILE}"
export KEA_LOGGER_DESTINATION=${LOG_FILE} export KEA_LOGGER_DESTINATION=${LOG_FILE}
} }
# PID file path is by default <kea-install-dir>/var/run/kea, but can be # PID file path is by default <kea-install-dir>/var/run/kea, but can be
# overridden by the environmental variable. # overridden by the environmental variable.
PID_FILE_PATH=@runstatedir@/@PACKAGE@/ PID_FILE_PATH="@runstatedir@/@PACKAGE@/"
if [ ! -z ${KEA_PIDFILE_DIR} ]; then if [ -n "${KEA_PIDFILE_DIR+x}" ]; then
PID_FILE_PATH="${KEA_PIDFILE_DIR}" PID_FILE_PATH="${KEA_PIDFILE_DIR}"
fi fi
@@ -308,11 +365,11 @@ fi
# _GET_PID: holds a PID if process is running # _GET_PID: holds a PID if process is running
# _GET_PIDS_NUM: holds 1 if process is running, 0 otherwise # _GET_PIDS_NUM: holds 1 if process is running, 0 otherwise
get_pid() { get_pid() {
local proc_name=${1} # Process name local proc_name=${1} # Process name
local cfg_file_name=${2} # Configuration file name without extension. local cfg_file_name=${2-} # Configuration file name without extension.
# PID file name includes process name. The process name is required. # PID file name includes process name. The process name is required.
if [ -z ${proc_name} ]; then if [ -z "${proc_name}" ]; then
test_lib_error "get_pid requires process name" test_lib_error "get_pid requires process name"
clean_exit 1 clean_exit 1
fi fi
@@ -320,7 +377,7 @@ get_pid() {
# PID file name includes server configuration file name. For most of # PID file name includes server configuration file name. For most of
# the tests it is 'test-config' (excluding .json extension). It is # the tests it is 'test-config' (excluding .json extension). It is
# possible to specify custom name if required. # possible to specify custom name if required.
if [ -z ${cfg_file_name} ]; then if [ -z "${cfg_file_name}" ]; then
cfg_file_name="test_config" cfg_file_name="test_config"
fi fi
@@ -331,10 +388,9 @@ get_pid() {
_GET_PIDS_NUM=0 _GET_PIDS_NUM=0
# If the PID file exists, get the PID and see if the process is alive. # If the PID file exists, get the PID and see if the process is alive.
if [ -e ${abs_pidfile_path} ]; then if [ -e "${abs_pidfile_path}" ]; then
pid=$( cat $abs_pidfile_path ) pid=$(cat "${abs_pidfile_path}")
kill -0 ${pid} > /dev/null 2>&1 if kill -0 "${pid}" > /dev/null 2>&1; then
if [ $? -eq 0 ]; then
_GET_PID=${pid} _GET_PID=${pid}
_GET_PIDS_NUM=1 _GET_PIDS_NUM=1
fi fi
@@ -387,17 +443,18 @@ wait_for_process_to_die() {
# the value in its PID file is not relevant. # the value in its PID file is not relevant.
kill_processes_by_name() { kill_processes_by_name() {
local proc_name=${1} # Process name local proc_name=${1} # Process name
if [ -z ${proc_name} ]; then if [ -z "${proc_name}" ]; then
test_lib_error "get_pids requires process name" test_lib_error "get_pids requires process name"
clean_exit 1 clean_exit 1
fi fi
# Obtain PIDs of running processes. # Obtain PIDs of running processes.
local pids=$( pgrep ${proc_name} ) local pids
pids=$(pidof "${proc_name}" || true)
# For each PID found, send kill signal. # For each PID found, send kill signal.
for pid in ${pids} for pid in ${pids}
do do
printf "Shutting down Kea process ${proc_name} having pid %d.\n" ${pid} printf 'Shutting down Kea process %s having pid %d.\n' "${proc_name}" "${pid}"
kill -9 ${pid} kill -9 "${pid}"
done done
} }
@@ -406,16 +463,16 @@ kill_processes_by_name() {
# _GET_LOG_MESSAGES: number of log message occurrences. # _GET_LOG_MESSAGES: number of log message occurrences.
get_log_messages() { get_log_messages() {
local msg="${1}" # Message id, e.g. DHCP6_SHUTDOWN local msg="${1}" # Message id, e.g. DHCP6_SHUTDOWN
if [ -z ${msg} ]; then if [ -z "${msg}" ]; then
test_lib_error "get_log_messages require message identifier" test_lib_error "get_log_messages require message identifier"
clean_exit 1 clean_exit 1
fi fi
_GET_LOG_MESSAGES=0 _GET_LOG_MESSAGES=0
# If log file is not present, the number of occurrences is 0. # If log file is not present, the number of occurrences is 0.
if [ -s ${LOG_FILE} ]; then if test -n "${LOG_FILE+x}" && test -s "${LOG_FILE}"; then
# Grep log file for the logger message occurrences and remove # Grep log file for the logger message occurrences and remove
# whitespaces, if any. # whitespaces, if any.
_GET_LOG_MESSAGES=$( grep -o ${msg} ${LOG_FILE} | wc -w | tr -d " ") _GET_LOG_MESSAGES=$(grep -Fo "${msg}" "${LOG_FILE}" | wc -w | tr -d " ")
fi fi
} }
@@ -427,22 +484,30 @@ get_log_messages() {
get_reconfigs() { get_reconfigs() {
# Grep log file for CONFIG_COMPLETE occurrences. There should # Grep log file for CONFIG_COMPLETE occurrences. There should
# be one occurrence per (re)configuration. # be one occurrence per (re)configuration.
_GET_RECONFIGS=$( grep -o CONFIG_COMPLETE ${LOG_FILE} | wc -w ) _GET_RECONFIGS=$(grep -Fo CONFIG_COMPLETE "${LOG_FILE}" | wc -w)
# Grep log file for CONFIG_LOAD_FAIL to check for configuration # Grep log file for CONFIG_LOAD_FAIL to check for configuration
# failures. # failures.
_GET_RECONFIG_ERRORS=$( grep -o CONFIG_LOAD_FAIL ${LOG_FILE} | wc -w ) _GET_RECONFIG_ERRORS=$(grep -Fo CONFIG_LOAD_FAIL "${LOG_FILE}" | wc -w)
# Remove whitespaces # Remove whitespaces
${_GET_RECONFIGS##*[! ]} ${_GET_RECONFIGS##*[! ]}
${_GET_RECONFIG_ERRORS##*[! ]} ${_GET_RECONFIG_ERRORS##*[! ]}
} }
remove_if_exists() {
while test ${#} -gt 1; do
if test -n "${1}"; then
rm -rf "${1}"
fi
shift
done
}
# Performs cleanup after test. # Performs cleanup after test.
# It shuts down running Kea processes and removes temporary files. # It shuts down running Kea processes and removes temporary files.
# The location of the log file and the configuration files should be set # The location of the log file and the configuration files should be set
# in the ${LOG_FILE}, ${CFG_FILE} and ${KEACTRL_CFG_FILE} variables # in the ${LOG_FILE}, ${CFG_FILE} and ${KEACTRL_CFG_FILE} variables
# respectively, prior to calling this function. # respectively, prior to calling this function.
cleanup() { cleanup() {
# If there is no KEA_PROCS set, just return # If there is no KEA_PROCS set, just return
if [ -z "${KEA_PROCS}" ]; then if [ -z "${KEA_PROCS}" ]; then
return return
@@ -452,11 +517,11 @@ cleanup() {
# of them if running. # of them if running.
for proc_name in ${KEA_PROCS} for proc_name in ${KEA_PROCS}
do do
get_pid ${proc_name} get_pid "${proc_name}"
# Shut down running Kea process. # Shut down running Kea process.
if [ ${_GET_PIDS_NUM} -ne 0 ]; then if [ "${_GET_PIDS_NUM}" -ne 0 ]; then
printf "Shutting down Kea process having pid %d.\n" ${_GET_PID} printf 'Shutting down Kea process having pid %d.\n' "${_GET_PID}"
kill -9 ${_GET_PID} kill -9 "${_GET_PID}"
fi fi
done done
@@ -470,21 +535,37 @@ cleanup() {
kill_processes_by_name "kea-lfc" kill_processes_by_name "kea-lfc"
# Remove temporary files. # Remove temporary files.
rm -rf ${LOG_FILE} if test -n "${LOG_FILE+x}"; then
rm -rf ${LOG_FILE}.lock rm -rf "${LOG_FILE}"
rm -rf "${LOG_FILE}.lock"
fi
# Use asterisk to remove all files starting with the given name, # Use asterisk to remove all files starting with the given name,
# in case the LFC has been run. LFC creates files with postfixes # in case the LFC has been run. LFC creates files with postfixes
# appended to the lease file name. # appended to the lease file name.
if [ ! -z "${LEASE_FILE}" ]; then if test -n "${LEASE_FILE+x}"; then
rm -rf ${LEASE_FILE}* rm -rf "${LEASE_FILE}"*
fi
if test -n "${CFG_FILE+x}"; then
rm -rf "${CFG_FILE}"
fi
if test -n "${DHCP4_CFG_FILE+x}"; then
rm -rf "${DHCP4_CFG_FILE}"
fi
if test -n "${DHCP6_CFG_FILE+x}"; then
rm -rf "${DHCP6_CFG_FILE}"
fi
if test -n "${D2_CFG_FILE+x}"; then
rm -rf "${D2_CFG_FILE}"
fi
if test -n "${CA_CFG_FILE+x}"; then
rm -rf "${CA_CFG_FILE}"
fi
if test -n "${NC_CFG_FILE+x}"; then
rm -rf "${NC_CFG_FILE}"
fi
if test -n "${KEACTRL_CFG_FILE+x}"; then
rm -rf "${KEACTRL_CFG_FILE}"
fi fi
rm -rf ${CFG_FILE}
rm -rf ${DHCP4_CFG_FILE}
rm -rf ${DHCP6_CFG_FILE}
rm -rf ${D2_CFG_FILE}
rm -rf ${CA_CFG_FILE}
rm -rf ${NC_CFG_FILE}
rm -rf ${KEACTRL_CFG_FILE}
} }
# Exists the test in the clean way. # Exists the test in the clean way.
@@ -497,20 +578,20 @@ clean_exit() {
test_lib_error "argument passed to clean_exit must be a number" ;; test_lib_error "argument passed to clean_exit must be a number" ;;
esac esac
# Print test result and perform a cleanup # Print test result and perform a cleanup
test_finish ${exit_code} test_finish "${exit_code}"
exit ${exit_code} exit "${exit_code}"
} }
# Starts Kea process in background using a configuration file specified # Starts Kea process in background using a configuration file specified
# in the global variable ${CFG_FILE}. # in the global variable ${CFG_FILE}.
start_kea() { start_kea() {
local bin=${1} local bin=${1}
if [ -z ${bin} ]; then if [ -z "${bin}" ]; then
test_lib_error "binary name must be specified for start_kea" test_lib_error "binary name must be specified for start_kea"
clean_exit 1 clean_exit 1
fi fi
printf "Running command %s.\n" "\"${bin} -c ${CFG_FILE}\"" printf "Running command %s.\n" "\"${bin} -c ${CFG_FILE}\""
${bin} -c ${CFG_FILE} & "${bin}" -c "${CFG_FILE}" &
} }
# Waits with timeout for Kea to start. # Waits with timeout for Kea to start.
@@ -533,13 +614,13 @@ wait_for_kea() {
local loops=0 # Loops counter local loops=0 # Loops counter
_WAIT_FOR_KEA=0 _WAIT_FOR_KEA=0
test_lib_info "wait_for_kea " "skip-new-line" test_lib_info "wait_for_kea " "skip-new-line"
while [ ! -s ${LOG_FILE} ] && [ ${loops} -le ${timeout} ]; do while [ ! -s "${LOG_FILE}" ] && [ "${loops}" -le "${timeout}" ]; do
printf "." printf "."
sleep 1 sleep 1
loops=$( expr $loops + 1 ) loops=$(( loops + 1 ))
done done
printf "\n" printf '\n'
if [ ${loops} -le ${timeout} ]; then if [ "${loops}" -le "${timeout}" ]; then
_WAIT_FOR_KEA=1 _WAIT_FOR_KEA=1
fi fi
} }
@@ -569,7 +650,7 @@ be a number"
esac esac
# Validate message # Validate message
if [ -z ${message} ]; then if [ -z "${message}" ]; then
test_lib_error "message id is a required argument for wait_for_message" test_lib_error "message id is a required argument for wait_for_message"
clean_exit 1 clean_exit 1
fi fi
@@ -586,20 +667,20 @@ must be a number"
_WAIT_FOR_MESSAGE=0 _WAIT_FOR_MESSAGE=0
test_lib_info "wait_for_message ${message}: " "skip-new-line" test_lib_info "wait_for_message ${message}: " "skip-new-line"
# Check if log file exists and if we reached timeout. # Check if log file exists and if we reached timeout.
while [ ${loops} -le ${timeout} ]; do while [ "${loops}" -le "${timeout}" ]; do
printf "." printf "."
# Check if the message has been logged. # Check if the message has been logged.
get_log_messages ${message} get_log_messages "${message}"
if [ ${_GET_LOG_MESSAGES} -ge ${occurrences} ]; then if [ "${_GET_LOG_MESSAGES}" -ge "${occurrences}" ]; then
printf "\n" printf '\n'
_WAIT_FOR_MESSAGE=1 _WAIT_FOR_MESSAGE=1
return return
fi fi
# Message not recorded. Keep going. # Message not recorded. Keep going.
sleep 1 sleep 1
loops=$( expr ${loops} + 1 ) loops=$(( loops + 1 ))
done done
printf "\n" printf '\n'
# Timeout. # Timeout.
} }
@@ -619,18 +700,18 @@ wait_for_server_down() {
local loops=0 # Loops counter local loops=0 # Loops counter
_WAIT_FOR_SERVER_DOWN=0 _WAIT_FOR_SERVER_DOWN=0
test_lib_info "wait_for_server_down ${proc_name}: " "skip-new-line" test_lib_info "wait_for_server_down ${proc_name}: " "skip-new-line"
while [ ${loops} -le ${timeout} ]; do while [ "${loops}" -le "${timeout}" ]; do
printf "." printf "."
get_pid ${proc_name} get_pid "${proc_name}"
if [ ${_GET_PIDS_NUM} -eq 0 ]; then if [ "${_GET_PIDS_NUM}" -eq 0 ]; then
printf "\n" printf '\n'
_WAIT_FOR_SERVER_DOWN=1 _WAIT_FOR_SERVER_DOWN=1
return return
fi fi
sleep 1 sleep 1
loops=$( expr $loops + 1 ) loops=$(( loops + 1 ))
done done
printf "\n" printf '\n'
} }
# Sends specified signal to the Kea process. # Sends specified signal to the Kea process.
@@ -646,20 +727,20 @@ must be a number"
clean_exit 1 ;; clean_exit 1 ;;
esac esac
# Validate process name # Validate process name
if [ -z ${proc_name} ]; then if [ -z "${proc_name}" ]; then
test_lib_error "send_signal requires process name be passed as argument" test_lib_error "send_signal requires process name be passed as argument"
clean_exit 1 clean_exit 1
fi fi
# Get Kea pid. # Get Kea pid.
get_pid ${proc_name} get_pid "${proc_name}"
if [ ${_GET_PIDS_NUM} -ne 1 ]; then if [ "${_GET_PIDS_NUM}" -ne 1 ]; then
printf "ERROR: expected one Kea process to be started.\ printf "ERROR: expected one Kea process to be started.\
Found %d processes started.\n" ${_GET_PIDS_NUM} Found %d processes started.\n" ${_GET_PIDS_NUM}
clean_exit 1 clean_exit 1
fi fi
printf "Sending signal ${sig} to Kea process (pid=%s).\n" ${_GET_PID} printf "Sending signal %s to Kea process (pid=%s).\n" "${sig}" "${_GET_PID}"
# Actually send a signal. # Actually send a signal.
kill -${sig} ${_GET_PID} kill "-${sig}" "${_GET_PID}"
} }
# Verifies that a server is up running by its PID file # Verifies that a server is up running by its PID file
@@ -673,12 +754,12 @@ verify_server_pid() {
# We will construct the PID file name based on the server config # We will construct the PID file name based on the server config
# and binary name # and binary name
if [ -z ${bin_name} ]; then if [ -z "${bin_name}" ]; then
test_lib_error "verify_server_pid requires binary name" test_lib_error "verify_server_pid requires binary name"
clean_exit 1 clean_exit 1
fi fi
if [ -z ${cfg_file} ]; then if [ -z "${cfg_file}" ]; then
test_lib_error "verify_server_pid requires config file name" test_lib_error "verify_server_pid requires config file name"
clean_exit 1 clean_exit 1
fi fi
@@ -686,10 +767,10 @@ verify_server_pid() {
# Only the file name portion of the config file is used, try and # Only the file name portion of the config file is used, try and
# extract it. NOTE if this "algorithm" changes this code will need # extract it. NOTE if this "algorithm" changes this code will need
# to be updated. # to be updated.
fname=`basename ${cfg_file}` fname=$(basename "${cfg_file}")
fname=`echo $fname | cut -f1 -d'.'` fname=$(echo "${fname}" | cut -f1 -d'.')
if [ -z ${fname} ]; then if [ -z "${fname}" ]; then
test_lib_error "verify_server_pid could not extract config name" test_lib_error "verify_server_pid could not extract config name"
clean_exit 1 clean_exit 1
fi fi
@@ -697,17 +778,16 @@ verify_server_pid() {
# Now we can build the name: # Now we can build the name:
pid_file="$KEA_PIDFILE_DIR/$fname.$bin_name.pid" pid_file="$KEA_PIDFILE_DIR/$fname.$bin_name.pid"
if [ ! -e ${pid_file} ]; then if [ ! -e "${pid_file}" ]; then
printf "ERROR: PID file:[%s] does not exist\n" ${pid_file} printf "ERROR: PID file:[%s] does not exist\n" "${pid_file}"
clean_exit 1 clean_exit 1
fi fi
# File exists, does its PID point to a live process? # File exists, does its PID point to a live process?
pid=`cat ${pid_file}` pid=$(cat "${pid_file}")
kill -0 ${pid} if ! kill -0 "${pid}"; then
if [ $? -ne 0 ]; then
printf "ERROR: PID file:[%s] exists but PID:[%d] does not\n" \ printf "ERROR: PID file:[%s] exists but PID:[%d] does not\n" \
${pid_file} ${pid} "${pid_file}" "${pid}"
clean_exit 1 clean_exit 1
fi fi
@@ -722,7 +802,7 @@ version_test() {
long_version=${2-} # Test long version? long_version=${2-} # Test long version?
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
@@ -734,9 +814,10 @@ version_test() {
fi fi
for v in -v ${long_version}; do for v in -v ${long_version}; do
REPORTED_VERSION=$("${bin_path}/${bin}" "${v}") run_command \
"${bin_path}/${bin}" "${v}"
if test "${REPORTED_VERSION}" == "${EXPECTED_VERSION}"; then if test "${OUTPUT}" = "${EXPECTED_VERSION}"; then
test_finish 0 test_finish 0
else else
printf 'ERROR: Expected version "%s", got "%s" when calling "%s"\n' \ printf 'ERROR: Expected version "%s", got "%s" when calling "%s"\n' \
@@ -754,7 +835,7 @@ logger_vars_test() {
test_name=${1} # Test name test_name=${1} # Test name
# Log the start of the test and print test name. # Log the start of the test and print test name.
test_start ${test_name} test_start "${test_name}"
# Remove dangling Kea instances and remove log files. # Remove dangling Kea instances and remove log files.
cleanup cleanup
@@ -771,16 +852,16 @@ logger_vars_test() {
KEA_LOCKFILE_DIR=. KEA_LOCKFILE_DIR=.
# Start Kea. # Start Kea.
start_kea ${bin_path}/${bin} start_kea "${bin_path}/${bin}"
# Wait for Kea to process the invalid configuration and die. # Wait for Kea to process the invalid configuration and die.
sleep 1 sleep 1
# Check if it is still running. It should have terminated. # Check if it is still running. It should have terminated.
get_pid ${bin} get_pid "${bin}"
if [ ${_GET_PIDS_NUM} -ne 0 ]; then if [ "${_GET_PIDS_NUM}" -ne 0 ]; then
printf "ERROR: expected Kea process to not start. Found %d processes" printf 'ERROR: expected Kea process to not start. '
printf " running.\n" ${_GET_PIDS_NUM} printf 'Found %d processes running.\n' "${_GET_PIDS_NUM}"
# Revert to the old KEA_LOCKFILE_DIR value # Revert to the old KEA_LOCKFILE_DIR value
KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD} KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD}
@@ -788,8 +869,8 @@ logger_vars_test() {
fi fi
if [ ! -f "./logger_lockfile" ]; then if [ ! -f "./logger_lockfile" ]; then
printf "ERROR: Expect ${bin} to create logger_lockfile in the\n" printf 'ERROR: Expect %s to create logger_lockfile in the ' "${bin}"
printf "current directory, but no such file exists.\n" printf 'current directory, but no such file exists.\n'
# Revert to the old KEA_LOCKFILE_DIR value # Revert to the old KEA_LOCKFILE_DIR value
KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR__OLD} KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR__OLD}
@@ -803,16 +884,16 @@ logger_vars_test() {
KEA_LOCKFILE_DIR="none" KEA_LOCKFILE_DIR="none"
# Start Kea. # Start Kea.
start_kea ${bin_path}/${bin} start_kea "${bin_path}/${bin}"
# Wait for Kea to process the invalid configuration and die. # Wait for Kea to process the invalid configuration and die.
sleep 1 sleep 1
# Check if it is still running. It should have terminated. # Check if it is still running. It should have terminated.
get_pid ${bin} get_pid "${bin}"
if [ ${_GET_PIDS_NUM} -ne 0 ]; then if [ "${_GET_PIDS_NUM}" -ne 0 ]; then
printf "ERROR: expected Kea process to not start. Found %d processes" printf 'ERROR: expected Kea process to not start. '
printf " running.\n" ${_GET_PIDS_NUM} printf 'Found %d processes running.\n' "${_GET_PIDS_NUM}"
# Revert to the old KEA_LOCKFILE_DIR value # Revert to the old KEA_LOCKFILE_DIR value
KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD} KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD}
@@ -821,8 +902,8 @@ logger_vars_test() {
fi fi
if [ -f "./logger_lockfile" ]; then if [ -f "./logger_lockfile" ]; then
printf "ERROR: Expect ${bin} to NOT create logger_lockfile in the\n" printf 'ERROR: Expect %s to NOT create logger_lockfile in the ' "${bin}"
printf "current directory, but the file exists." printf 'current directory, but the file exists.\n'
# Revert to the old KEA_LOCKFILE_DIR value # Revert to the old KEA_LOCKFILE_DIR value
KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD} KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD}
@@ -831,7 +912,7 @@ logger_vars_test() {
fi fi
# Revert to the old KEA_LOCKFILE_DIR value # Revert to the old KEA_LOCKFILE_DIR value
printf "Reverting KEA_LOCKFILE_DIR to ${KEA_LOCKFILE_DIR_OLD}\n" printf 'Reverting KEA_LOCKFILE_DIR to %s\n' "${KEA_LOCKFILE_DIR_OLD}"
KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD} KEA_LOCKFILE_DIR=${KEA_LOCKFILE_DIR_OLD}
test_finish 0 test_finish 0
@@ -854,30 +935,31 @@ server_pid_file_test() {
# Instruct server to log to the specific file. # Instruct server to log to the specific file.
set_logger set_logger
# Start server # Start server
start_kea ${bin_path}/${bin} start_kea "${bin_path}/${bin}"
# Wait up to 20s for server to start. # Wait up to 20s for server to start.
wait_for_kea 20 wait_for_kea 20
if [ ${_WAIT_FOR_KEA} -eq 0 ]; then if [ "${_WAIT_FOR_KEA}" -eq 0 ]; then
printf "ERROR: timeout waiting for %s to start.\n" ${bin} printf 'ERROR: timeout waiting for %s to start.\n' "${bin}"
clean_exit 1 clean_exit 1
fi fi
# Verify server is still running # Verify server is still running
verify_server_pid ${bin} ${CFG_FILE} verify_server_pid "${bin}" "${CFG_FILE}"
printf "PID file is [%s], PID is [%d]" ${_SERVER_PID_FILE} ${_SERVER_PID} printf 'PID file is [%s], PID is [%d]' "${_SERVER_PID_FILE}" "${_SERVER_PID}"
# Now try to start a second one # Now try to start a second one
start_kea ${bin_path}/${bin} start_kea "${bin_path}/${bin}"
wait_for_message 10 "${log_id}" 1 wait_for_message 10 "${log_id}" 1
if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then if [ "${_WAIT_FOR_MESSAGE}" -eq 0 ]; then
printf "ERROR: Second %s instance started? PID conflict not reported.\n" ${bin} printf 'ERROR: Second %s instance started? ' "${bin}"
printf 'PID conflict not reported.\n'
clean_exit 1 clean_exit 1
fi fi
# Verify server is still running # Verify server is still running
verify_server_pid ${bin} ${CFG_FILE} verify_server_pid "${bin}" "${CFG_FILE}"
# All ok. Shut down the server and exit. # All ok. Shut down the server and exit.
test_finish 0 test_finish 0

View File

@@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
#
# Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
@@ -24,14 +24,18 @@
# test has much enough time to verify that the convenience methods # test has much enough time to verify that the convenience methods
# checking the state of the process, i.e. process running or not. # checking the state of the process, i.e. process running or not.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
exit_code= exit_code=
while [ ! -z "${1}" ] while [ -n "${1+x}" ]
do do
option=${1} option=${1}
case ${option} in case ${option} in
-p) -p)
exit_code=$$ exit_code=${$}
;; ;;
-e) -e)
shift shift
@@ -39,7 +43,7 @@ do
;; ;;
-s) -s)
shift shift
sleep ${1} sleep "${1}"
;; ;;
*) *)
exit 123 exit 123
@@ -51,7 +55,7 @@ done
# The exit code of 32 is returned when no args specified or # The exit code of 32 is returned when no args specified or
# when only the -s arg has been specified. # when only the -s arg has been specified.
if [ -z "${exit_code}" ]; then if [ -z "${exit_code}" ]; then
exit 32; exit 32
fi fi
exit ${exit_code} exit "${exit_code}"

View File

@@ -21,6 +21,7 @@ DROP TABLE IF EXISTS lease6_types;
DROP TABLE IF EXISTS lease_hwaddr_source; DROP TABLE IF EXISTS lease_hwaddr_source;
DROP TABLE IF EXISTS lease_state; DROP TABLE IF EXISTS lease_state;
DROP TABLE IF EXISTS schema_version; DROP TABLE IF EXISTS schema_version;
DROP TABLE IF EXISTS host_reservations;
DROP TABLE IF EXISTS hosts; DROP TABLE IF EXISTS hosts;
DROP TABLE IF EXISTS dhcp4_options; DROP TABLE IF EXISTS dhcp4_options;
DROP TABLE IF EXISTS dhcp6_options; DROP TABLE IF EXISTS dhcp6_options;
@@ -43,6 +44,14 @@ DROP INDEX IF EXISTS lease6index5;
DROP INDEX IF EXISTS lease6index6; DROP INDEX IF EXISTS lease6index6;
DROP INDEX IF EXISTS lease6index7; DROP INDEX IF EXISTS lease6index7;
DROP INDEX IF EXISTS host_reservationsindex1;
DROP INDEX IF EXISTS host_reservationsindex2;
DROP INDEX IF EXISTS host_reservationsindex3;
DROP INDEX IF EXISTS host_reservationsindex4;
DROP INDEX IF EXISTS host_reservationsindex5;
DROP INDEX IF EXISTS host_reservationsindex6;
DROP INDEX IF EXISTS host_reservationsindex7;
DROP INDEX IF EXISTS hostsindex1; DROP INDEX IF EXISTS hostsindex1;
DROP INDEX IF EXISTS hostsindex2; DROP INDEX IF EXISTS hostsindex2;
DROP INDEX IF EXISTS hostsindex3; DROP INDEX IF EXISTS hostsindex3;

View File

@@ -1,12 +1,28 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
version=$(cql_version "$@") version=$(cql_version "$@")
@@ -100,5 +116,3 @@ INSERT INTO schema_version (version, minor) VALUES(2, 0);
-- This line concludes database upgrade to version 2.0 -- This line concludes database upgrade to version 2.0
EOF EOF
exit $?

View File

@@ -1,14 +1,36 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" ]; then if [ -e "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
# Save the command line arguments for later use.
cqlargs=("${@}")
# Need a path for temporary files created during upgrade data migration # Need a path for temporary files created during upgrade data migration
# Use the state directory in the install path directory if it exists, otherwise # Use the state directory in the install path directory if it exists, otherwise
# use the build tree # use the build tree
@@ -18,11 +40,9 @@ else
temp_file_dir="@abs_top_builddir@/src/share/database/scripts/cql" temp_file_dir="@abs_top_builddir@/src/share/database/scripts/cql"
fi fi
cqlargs=$@
# Ensures the current schema version is 2.0. If not it exits. # Ensures the current schema version is 2.0. If not it exits.
check_version() { check_version() {
version=$(cql_version $cqlargs) version=$(cql_version "${cqlargs[@]}")
if [ "${version}" != "2.0" ]; then if [ "${version}" != "2.0" ]; then
printf "This script upgrades 2.0 to 3.0. Reported version is %s. Skipping upgrade.\n" "${version}" printf "This script upgrades 2.0 to 3.0. Reported version is %s. Skipping upgrade.\n" "${version}"
@@ -32,7 +52,7 @@ check_version() {
# Peforms the schema changes from 2.0 to 3.0 # Peforms the schema changes from 2.0 to 3.0
update_schema() { update_schema() {
cqlsh $cqlargs <<EOF cqlsh "${cqlargs[@]}" <<EOF
-- This line starts database upgrade to version 3.0 -- This line starts database upgrade to version 3.0
-- Add a column holding leases for user context. -- Add a column holding leases for user context.
@@ -61,25 +81,19 @@ INSERT INTO schema_version (version, minor) VALUES(3, 0);
-- This line concludes database upgrade to version 3.0 -- This line concludes database upgrade to version 3.0
EOF EOF
if [ "$?" -ne 0 ]
then
echo Schema udpate FAILED!
exit 1
fi
} }
# Function to delete temporary migration files # Function to delete temporary migration files
clean_up() { clean_up() {
# clean up the files # clean up the files
if [ -e "$export_file" ] if [ -e "${export_file}" ]
then then
rm $export_file rm "${export_file}"
fi fi
if [ -e "$update_file" ] if [ -e "${update_file}" ]
then then
rm $update_file rm "${update_file}"
fi fi
} }
@@ -102,7 +116,7 @@ exit_now() {
echo "Data Migration FAILURE! $explanation" echo "Data Migration FAILURE! $explanation"
fi fi
exit $status exit "${status}"
} }
# Function adds a column to the global, $update_cols if needed # Function adds a column to the global, $update_cols if needed
@@ -131,7 +145,7 @@ check_column() {
if [ "$val" = "$old_id" ] if [ "$val" = "$old_id" ]
then then
# If the accumulator isn't empty, we need a comma # If the accumulator isn't empty, we need a comma
if [ ! -z "$update_cols" ] if [ -n "${update_cols}" ]
then then
comma="," comma=","
fi fi
@@ -174,8 +188,7 @@ migrate_host_data() {
(id, host_ipv4_subnet_id, host_ipv6_subnet_id, option_subnet_id)\ (id, host_ipv4_subnet_id, host_ipv6_subnet_id, option_subnet_id)\
TO '$export_file'" TO '$export_file'"
cqlsh $cqlargs -e "$query" if ! cqlsh "${cqlargs[@]}" -e "$query"
if [ "$?" -ne 0 ]
then then
exit_now 1 "Cassandra export failed! Could not migrate data!" exit_now 1 "Cassandra export failed! Could not migrate data!"
fi fi
@@ -183,7 +196,7 @@ migrate_host_data() {
# Strip the carriage returns that CQL insists on adding. # Strip the carriage returns that CQL insists on adding.
if [ -e "$export_file" ] if [ -e "$export_file" ]
then then
cat $export_file | tr -d '\015' > $export_file.2 tr -d '\015' < "${export_file}" > "${export_file}.2"
mv $export_file.2 $export_file mv $export_file.2 $export_file
else else
# Shouldn't happen but then again we're talking about CQL here # Shouldn't happen but then again we're talking about CQL here
@@ -193,8 +206,8 @@ migrate_host_data() {
# Iterate through the exported data, accumulating update statements, # Iterate through the exported data, accumulating update statements,
# one for each reservation that needs updating. We should have one # one for each reservation that needs updating. We should have one
# host per line. # host per line.
line_cnt=0; line_cnt=0
update_cnt=0; update_cnt=0
while read -r line while read -r line
do do
@@ -212,13 +225,13 @@ migrate_host_data() {
host_id="$val" host_id="$val"
;; ;;
2) 2)
check_column $val host_ipv4_subnet_id check_column "$val" host_ipv4_subnet_id
;; ;;
3) 3)
check_column $val host_ipv6_subnet_id check_column "$val" host_ipv6_subnet_id
;; ;;
4) 4)
check_column $val option_subnet_id check_column "$val" option_subnet_id
;; ;;
*) *)
# We're going to assume that since any error is fatal # We're going to assume that since any error is fatal
@@ -235,14 +248,14 @@ migrate_host_data() {
fi fi
# If any of the current host's columns need to be replace, append an update for it # If any of the current host's columns need to be replace, append an update for it
if [ ! -z "$update_cols" ] if [ -n "$update_cols" ]
then then
echo "update host_reservations set $update_cols where id = $host_id;" >> $update_file echo "update host_reservations set $update_cols where id = $host_id;" >> $update_file
update_cnt=$((update_cnt + 1)) update_cnt=$((update_cnt + 1))
fi fi
IFS="$xIFS" IFS="$xIFS"
done < $export_file done < "${export_file}"
# If we didn't record any updates, then hey, we're good to go! # If we didn't record any updates, then hey, we're good to go!
if [ "$update_cnt" -eq 0 ] if [ "$update_cnt" -eq 0 ]
@@ -253,8 +266,7 @@ migrate_host_data() {
# We have at least one update in the update file, so submit it # to cqlsh. # We have at least one update in the update file, so submit it # to cqlsh.
echo "$update_cnt update statements written to $update_file" echo "$update_cnt update statements written to $update_file"
echo "Running the updates..." echo "Running the updates..."
cqlsh $cqlargs -f "$update_file" if ! cqlsh "${cqlargs[@]}" -f "$update_file"
if [ "$?" -ne 0 ]
then then
exit_now 1 "Cassandra updates failed" exit_now 1 "Cassandra updates failed"
fi fi
@@ -263,5 +275,8 @@ migrate_host_data() {
} }
check_version check_version
update_schema if ! update_schema; then
printf 'Schema update FAILED!\n'
exit 1
fi
migrate_host_data migrate_host_data

View File

@@ -1,12 +1,31 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, arrays are undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" ]; then if [ -e "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
# Need a path for temporary files created during upgrade data migration # Need a path for temporary files created during upgrade data migration
@@ -18,11 +37,12 @@ else
temp_file_dir="@abs_top_builddir@/src/share/database/scripts/cql" temp_file_dir="@abs_top_builddir@/src/share/database/scripts/cql"
fi fi
cqlargs=$@ # Save the command line arguments for later use.
cqlargs=("${@}")
# Ensures the current schema version is 3.0. If not it exits. # Ensures the current schema version is 3.0. If not it exits.
check_version() { check_version() {
version=$(cql_version $cqlargs) version=$(cql_version "${cqlargs[@]}")
if [ "${version}" != "3.0" ]; then if [ "${version}" != "3.0" ]; then
printf "This script upgrades 3.0 to 4.0. Reported version is %s. Skipping upgrade.\n" "${version}" printf "This script upgrades 3.0 to 4.0. Reported version is %s. Skipping upgrade.\n" "${version}"
@@ -32,7 +52,7 @@ check_version() {
# Peforms the schema changes from 3.0 to 4.0 # Peforms the schema changes from 3.0 to 4.0
update_schema() { update_schema() {
cqlsh $cqlargs <<EOF cqlsh "${cqlargs[@]}" <<EOF
-- This line starts database upgrade to version 4.0 -- This line starts database upgrade to version 4.0
-- ----------------------------------------------------- -- -----------------------------------------------------
@@ -81,17 +101,11 @@ CREATE INDEX IF NOT EXISTS hostsindex5 ON hosts (host_ipv4_address);
CREATE INDEX IF NOT EXISTS hostsindex6 ON hosts (reserved_ipv6_prefix_address); CREATE INDEX IF NOT EXISTS hostsindex6 ON hosts (reserved_ipv6_prefix_address);
CREATE INDEX IF NOT EXISTS hostsindex7 ON hosts (reserved_ipv6_prefix_length); CREATE INDEX IF NOT EXISTS hostsindex7 ON hosts (reserved_ipv6_prefix_length);
EOF EOF
if [ "$?" -ne 0 ]
then
echo Schema udpate FAILED!
exit 1
fi
} }
# Peforms the clean up schema changes from 3.0 to 4.0 # Peforms the clean up schema changes from 3.0 to 4.0
clean_up_schema() { clean_up_schema() {
cqlsh $cqlargs <<EOF cqlsh "${cqlargs[@]}" <<EOF
DROP TABLE IF EXISTS host_reservations; DROP TABLE IF EXISTS host_reservations;
DROP INDEX IF EXISTS host_reservationsindex1; DROP INDEX IF EXISTS host_reservationsindex1;
@@ -108,12 +122,6 @@ INSERT INTO schema_version (version, minor) VALUES(4, 0);
-- This line concludes database upgrade to version 4.0 -- This line concludes database upgrade to version 4.0
EOF EOF
if [ "$?" -ne 0 ]
then
echo Schema udpate FAILED!
exit 1
fi
} }
# Function to delete temporary migration files # Function to delete temporary migration files
@@ -121,12 +129,12 @@ clean_up() {
# clean up the files # clean up the files
if [ -e "$export_file" ] if [ -e "$export_file" ]
then then
rm $export_file rm "$export_file"
fi fi
if [ -e "$update_file" ] if [ -e "$update_file" ]
then then
rm $update_file rm "$update_file"
fi fi
} }
@@ -150,48 +158,35 @@ exit_now() {
echo "Data Migration FAILURE! $explanation" echo "Data Migration FAILURE! $explanation"
fi fi
exit $status exit "$status"
} }
# Prefix ${string} with ${count} characters like the one spciefied in
# ${fill_char}.
fill() { fill() {
string=$1;shift string=$1;shift
count=$1;shift count=$1;shift
fill_char=$1;shift fill_char=$1;shift
length=`echo $string | wc -c` value="$(printf "%${count}s" | sed "s/ /${fill_char}/g")${string}"
length=$((length - 1))
if [ $length -gt $count ]; then
value=`echo "$string" | cut -c 1-$count`
return
fi
result=""
count=$((count - length))
i=1
while [ $i -le $count ]; do
result="$fill_char$result"
i=$((i+1))
done
value="$result$string"
} }
identifier_text() { identifier_text() {
string=$1;shift string=$1;shift
length=`echo $string | wc -c` length="${#string}"
length=$((length - 1))
# skip 0x from 0xabcdef # skip 0x from 0xabcdef
string=`echo "$string" | cut -c 3-$length` string=$(echo "$string" | cut -c "3-$length")
identifier="" identifier=""
# add starting 0: 0xabc->0x0abc # add starting 0: 0xabc->0x0abc
mod=$((length % 2)) mod=$((length % 2))
if [ $mod -ne 0 ]; then if [ $mod -ne 0 ]; then
string="0"$string string="0"$string
fi fi
length=`echo $string | wc -c` length="${#string}"
length=$((length - 1))
i=1 i=1
while [ $i -le $length ]; do while [ "$i" -le "$length" ]; do
char=`echo "$string" | cut -c $i-$i` char=$(echo "$string" | cut -c $i-$i)
mod=$((i % 2)) mod=$((i % 2))
if [ $mod -ne 0 -a $i -ne 1 ]; then if test $mod -ne 0 && test $i -ne 1; then
char=":"$char char=":"$char
fi fi
identifier=$identifier$char identifier=$identifier$char
@@ -201,15 +196,14 @@ identifier_text() {
key_hash() { key_hash() {
string=$1;shift string=$1;shift
length=`echo $string | wc -c` length="${#string}"
length=$((length - 1))
FNV_prime=1099511628211 FNV_prime=1099511628211
FNV_offset_basis=-3750763034362895579 # signed value for 14695981039346656037 FNV_offset_basis=-3750763034362895579 # signed value for 14695981039346656037
hash=$FNV_offset_basis hash=$FNV_offset_basis
i=1 i=1
while [ $i -le $length ]; do while [ "$i" -le "$length" ]; do
char=`echo "$string" | cut -c $i-$i` char=$(echo "$string" | cut -c $i-$i)
data=`echo "$char" | tr -d "\n" | od -An -t uC | tr -d ' '` data=$(echo "$char" | tr -d "\n" | od -An -t uC | tr -d ' ')
hash=$((hash ^ data)) hash=$((hash ^ data))
hash=$((hash * FNV_prime)) hash=$((hash * FNV_prime))
i=$((i+1)) i=$((i+1))
@@ -226,7 +220,7 @@ generate_key() {
key="" key=""
identifier_text "$host_identifier" identifier_text "$host_identifier"
local_host_identifier=$identifier local_host_identifier=$identifier
if [ ! -z $host_ipv4_address ] && [ $host_ipv4_address -eq 0 ]; then if [ -n "$host_ipv4_address" ] && [ "$host_ipv4_address" -eq 0 ]; then
fill "$local_host_identifier" 383 "-" fill "$local_host_identifier" 383 "-"
key="$key$value" key="$key$value"
fill "$host_identifier_type" 10 "-" fill "$host_identifier_type" 10 "-"
@@ -277,8 +271,8 @@ migrate_host_data() {
option_scope_id) \ option_scope_id) \
TO '$export_file'" TO '$export_file'"
cqlsh $cqlargs -e "$query"
if [ "$?" -ne 0 ] if ! cqlsh "${cqlargs[@]}" -e "$query"
then then
exit_now 1 "Cassandra export failed! Could not migrate data!" exit_now 1 "Cassandra export failed! Could not migrate data!"
fi fi
@@ -286,7 +280,7 @@ migrate_host_data() {
# Strip the carriage returns that CQL insists on adding. # Strip the carriage returns that CQL insists on adding.
if [ -e "$export_file" ] if [ -e "$export_file" ]
then then
cat $export_file | tr -d '\015' > $export_file.2 tr -d '\015' < "${export_file}" > $export_file.2
mv $export_file.2 $export_file mv $export_file.2 $export_file
else else
# Shouldn't happen but then again we're talking about CQL here # Shouldn't happen but then again we're talking about CQL here
@@ -296,12 +290,11 @@ migrate_host_data() {
# Iterate through the exported data, accumulating update statements, # Iterate through the exported data, accumulating update statements,
# one for each reservation that needs updating. We should have one # one for each reservation that needs updating. We should have one
# host per line. # host per line.
line_cnt=0; line_cnt=0
update_cnt=0; update_cnt=0
while read -r line while read -r line
do do
line_cnt=$((line_cnt + 1)); line_cnt=$((line_cnt + 1))
xIFS="$IFS" xIFS="$IFS"
IFS=',' IFS=','
i=1 i=1
@@ -338,8 +331,8 @@ migrate_host_data() {
update_cnt=$((update_cnt + 1)) update_cnt=$((update_cnt + 1))
IFS="$xIFS" IFS="$xIFS"
echo $line | sed -e "s/$host_id/$host_id,$key_data/" >> $update_file echo "${line}" | sed -e "s/$host_id/$host_id,$key_data/" >> "${update_file}"
done < $export_file done < "${export_file}"
# If we didn't record any updates, then hey, we're good to go! # If we didn't record any updates, then hey, we're good to go!
if [ "$update_cnt" -eq 0 ] if [ "$update_cnt" -eq 0 ]
@@ -363,8 +356,7 @@ migrate_host_data() {
option_scope_id) \ option_scope_id) \
FROM '$update_file'" FROM '$update_file'"
cqlsh $cqlargs -e "$query" if ! cqlsh "${cqlargs[@]}" -e "$query"
if [ "$?" -ne 0 ]
then then
exit_now 1 "Cassandra updates failed" exit_now 1 "Cassandra updates failed"
fi fi
@@ -373,5 +365,8 @@ migrate_host_data() {
} }
check_version check_version
update_schema if ! update_schema; then
printf 'Schema update FAILED!\n'
exit 1
fi
migrate_host_data migrate_host_data

View File

@@ -1,14 +1,36 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, arrays are undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" ]; then if [ -e "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh" ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
# Save the command line arguments for later use.
cqlargs=("${@}")
# Need a path for temporary files created during data update # Need a path for temporary files created during data update
# Use the state directory in the install path directory if it exists, otherwise # Use the state directory in the install path directory if it exists, otherwise
# use the build tree # use the build tree
@@ -18,11 +40,9 @@ else
temp_file_dir="@abs_top_builddir@/src/share/database/scripts/cql" temp_file_dir="@abs_top_builddir@/src/share/database/scripts/cql"
fi fi
cqlargs=$@
# Ensures the current schema version is 4.0. If not it exits. # Ensures the current schema version is 4.0. If not it exits.
check_version() { check_version() {
version=$(cql_version $cqlargs) version=$(cql_version "${cqlargs[@]}")
if [ "${version}" != "4.0" ]; then if [ "${version}" != "4.0" ]; then
printf "This script upgrades 4.0 to 5.0. Reported version is %s. Skipping upgrade.\n" "${version}" printf "This script upgrades 4.0 to 5.0. Reported version is %s. Skipping upgrade.\n" "${version}"
@@ -32,7 +52,7 @@ check_version() {
# Peforms the schema changes from 4.0 to 5.0 # Peforms the schema changes from 4.0 to 5.0
update_schema() { update_schema() {
cqlsh $cqlargs <<EOF cqlsh "${cqlargs[@]}" <<EOF
-- This line starts database upgrade to version 5.0 -- This line starts database upgrade to version 5.0
-- Add the lower case hostname column to reservations. -- Add the lower case hostname column to reservations.
@@ -52,12 +72,6 @@ INSERT INTO schema_version (version, minor) VALUES(5, 0);
-- This line concludes database upgrade to version 5.0 -- This line concludes database upgrade to version 5.0
EOF EOF
if [ "$?" -ne 0 ]
then
echo Schema udpate FAILED!
exit 1
fi
} }
# Functions to delete temporary update files # Functions to delete temporary update files
@@ -65,32 +79,32 @@ clean_up() {
# clean up the files # clean up the files
if [ -e "$host_export_file" ] if [ -e "$host_export_file" ]
then then
rm $host_export_file rm "$host_export_file"
fi fi
if [ -e "$host_update_file" ] if [ -e "$host_update_file" ]
then then
rm $host_update_file rm "$host_update_file"
fi fi
if [ -e "$lease4_export_file" ] if [ -e "$lease4_export_file" ]
then then
rm $lease4_export_file rm "$lease4_export_file"
fi fi
if [ -e "$lease4_update_file" ] if [ -e "$lease4_update_file" ]
then then
rm $lease4_update_file rm "$lease4_update_file"
fi fi
if [ -e "$lease6_export_file" ] if [ -e "$lease6_export_file" ]
then then
rm $lease6_export_file rm "$lease6_export_file"
fi fi
if [ -e "$lease6_update_file" ] if [ -e "$lease6_update_file" ]
then then
rm $lease6_update_file rm "$lease6_update_file"
fi fi
} }
@@ -113,7 +127,7 @@ exit_now() {
echo "Data Update FAILURE! $explanation" echo "Data Update FAILURE! $explanation"
fi fi
exit $status exit "$status"
} }
# This function adds host 'lower_case_hostname' column. # This function adds host 'lower_case_hostname' column.
@@ -129,8 +143,8 @@ update_host_data() {
echo "Exporting hostnames to $host_export_file ..." echo "Exporting hostnames to $host_export_file ..."
query="COPY hosts (key, id, hostname) TO '$host_export_file'" query="COPY hosts (key, id, hostname) TO '$host_export_file'"
cqlsh $cqlargs -e "$query"
if [ "$?" -ne 0 ] if ! cqlsh "${cqlargs[@]}" -e "$query"
then then
exit_now 1 "Cassandra get hostname failed! Could not update host!" exit_now 1 "Cassandra get hostname failed! Could not update host!"
fi fi
@@ -138,8 +152,8 @@ update_host_data() {
# Strip the carriage returns that CQL insists on adding. # Strip the carriage returns that CQL insists on adding.
if [ -e "$host_export_file" ] if [ -e "$host_export_file" ]
then then
cat $host_export_file | tr -d '\015' > $host_export_file.2 tr -d '\015' < "$host_export_file" > "$host_export_file.2"
mv $host_export_file.2 $host_export_file mv "$host_export_file.2" "$host_export_file"
else else
# Shouldn't happen but then again we're talking about CQL here # Shouldn't happen but then again we're talking about CQL here
exit_now 1 "Cassandra export file $host_export_file is missing?" exit_now 1 "Cassandra export file $host_export_file is missing?"
@@ -148,14 +162,14 @@ update_host_data() {
# Iterate through the exported data, accumulating update statements, # Iterate through the exported data, accumulating update statements,
# one for each reservation that needs updating. We should have one # one for each reservation that needs updating. We should have one
# host per line. # host per line.
line_cnt=0; line_cnt=0
update_cnt=0; update_cnt=0
while read -r line while read -r line
do do
line_cnt=$((line_cnt + 1)); line_cnt=$((line_cnt + 1))
xIFS="$IFS" xIFS="$IFS"
IFS=$',' IFS=','
i=1 i=1
hostname= hostname=
@@ -189,13 +203,13 @@ update_host_data() {
# If the hostname was not null set the lower case value # If the hostname was not null set the lower case value
if [ "$hostname" != "" ] if [ "$hostname" != "" ]
then then
lower=$(echo $hostname | tr '[:upper:]' '[:lower:]') lower=$(echo "${hostname}" | tr '[:upper:]' '[:lower:]')
echo "update hosts set lower_case_hostname = '$lower' where key = $key and id = $host_id;" >> $host_update_file echo "update hosts set lower_case_hostname = '$lower' where key = $key and id = $host_id;" >> "$host_update_file"
update_cnt=$((update_cnt + 1)) update_cnt=$((update_cnt + 1))
fi fi
IFS="$xIFS" IFS="$xIFS"
done < $host_export_file done < "$host_export_file"
# If we didn't record any updates, then hey, we're good to go! # If we didn't record any updates, then hey, we're good to go!
if [ "$update_cnt" -eq 0 ] if [ "$update_cnt" -eq 0 ]
@@ -206,8 +220,8 @@ update_host_data() {
# We have at least one update in the update file, so submit it # to cqlsh. # We have at least one update in the update file, so submit it # to cqlsh.
echo "$update_cnt host update statements written to $host_update_file" echo "$update_cnt host update statements written to $host_update_file"
echo "Running the updates..." echo "Running the updates..."
cqlsh $cqlargs -f "$host_update_file"
if [ "$?" -ne 0 ] if ! cqlsh "${cqlargs[@]}" -f "$host_update_file"
then then
exit_now 1 "Cassandra host updates failed" exit_now 1 "Cassandra host updates failed"
fi fi
@@ -228,8 +242,8 @@ update_lease4_data() {
echo "Exporting hostnames to $lease4_export_file ..." echo "Exporting hostnames to $lease4_export_file ..."
query="COPY lease4 (address, hostname) TO '$lease4_export_file'" query="COPY lease4 (address, hostname) TO '$lease4_export_file'"
cqlsh $cqlargs -e "$query"
if [ "$?" -ne 0 ] if ! cqlsh "${cqlargs[@]}" -e "$query"
then then
exit_now 1 "Cassandra get hostname failed! Could not update lease4!" exit_now 1 "Cassandra get hostname failed! Could not update lease4!"
fi fi
@@ -237,8 +251,8 @@ update_lease4_data() {
# Strip the carriage returns that CQL insists on adding. # Strip the carriage returns that CQL insists on adding.
if [ -e "$lease4_export_file" ] if [ -e "$lease4_export_file" ]
then then
cat $lease4_export_file | tr -d '\015' > $lease4_export_file.2 tr -d '\015' < "$lease4_export_file" > "$lease4_export_file.2"
mv $lease4_export_file.2 $lease4_export_file mv "$lease4_export_file.2" "$lease4_export_file"
else else
# Shouldn't happen but then again we're talking about CQL here # Shouldn't happen but then again we're talking about CQL here
exit_now 1 "Cassandra export file $lease4_export_file is missing?" exit_now 1 "Cassandra export file $lease4_export_file is missing?"
@@ -247,14 +261,14 @@ update_lease4_data() {
# Iterate through the exported data, accumulating update statements, # Iterate through the exported data, accumulating update statements,
# one for each lease that needs updating. We should have one lease4 # one for each lease that needs updating. We should have one lease4
# per line. # per line.
line_cnt=0; line_cnt=0
update_cnt=0; update_cnt=0
while read -r line while read -r line
do do
line_cnt=$((line_cnt + 1)); line_cnt=$((line_cnt + 1))
xIFS="$IFS" xIFS="$IFS"
IFS=$',' IFS=','
i=1 i=1
hostname= hostname=
@@ -285,13 +299,13 @@ update_lease4_data() {
# If the hostname was not null set the lower case value # If the hostname was not null set the lower case value
if [ "$hostname" != "" ] if [ "$hostname" != "" ]
then then
lower=$(echo $hostname | tr '[:upper:]' '[:lower:]') lower=$(echo "${hostname}" | tr '[:upper:]' '[:lower:]')
echo "update lease4 set hostname = '$lower' where address = $address;" >> $lease4_update_file echo "update lease4 set hostname = '$lower' where address = $address;" >> "$lease4_update_file"
update_cnt=$((update_cnt + 1)) update_cnt=$((update_cnt + 1))
fi fi
IFS="$xIFS" IFS="$xIFS"
done < $lease4_export_file done < "$lease4_export_file"
# If we didn't record any updates, then hey, we're good to go! # If we didn't record any updates, then hey, we're good to go!
if [ "$update_cnt" -eq 0 ] if [ "$update_cnt" -eq 0 ]
@@ -302,8 +316,8 @@ update_lease4_data() {
# We have at least one update in the update file, so submit it # to cqlsh. # We have at least one update in the update file, so submit it # to cqlsh.
echo "$update_cnt lease4 update statements written to $lease4_update_file" echo "$update_cnt lease4 update statements written to $lease4_update_file"
echo "Running the updates..." echo "Running the updates..."
cqlsh $cqlargs -f "$lease4_update_file"
if [ "$?" -ne 0 ] if ! cqlsh "${cqlargs[@]}" -f "$lease4_update_file"
then then
exit_now 1 "Cassandra lease4 updates failed" exit_now 1 "Cassandra lease4 updates failed"
fi fi
@@ -324,8 +338,7 @@ update_lease6_data() {
echo "Exporting hostnames to $lease6_export_file ..." echo "Exporting hostnames to $lease6_export_file ..."
query="COPY lease6 (address, hostname) TO '$lease6_export_file'" query="COPY lease6 (address, hostname) TO '$lease6_export_file'"
cqlsh $cqlargs -e "$query" if ! cqlsh "${cqlargs[@]}" -e "$query"
if [ "$?" -ne 0 ]
then then
exit_now 1 "Cassandra get hostname failed! Could not update lease6!" exit_now 1 "Cassandra get hostname failed! Could not update lease6!"
fi fi
@@ -333,8 +346,8 @@ update_lease6_data() {
# Strip the carriage returns that CQL insists on adding. # Strip the carriage returns that CQL insists on adding.
if [ -e "$lease6_export_file" ] if [ -e "$lease6_export_file" ]
then then
cat $lease6_export_file | tr -d '\015' > $lease6_export_file.2 tr -d '\015' < "$lease6_export_file" > "$lease6_export_file.2"
mv $lease6_export_file.2 $lease6_export_file mv "$lease6_export_file.2" "$lease6_export_file"
else else
# Shouldn't happen but then again we're talking about CQL here # Shouldn't happen but then again we're talking about CQL here
exit_now 1 "Cassandra export file $lease6_export_file is missing?" exit_now 1 "Cassandra export file $lease6_export_file is missing?"
@@ -343,14 +356,14 @@ update_lease6_data() {
# Iterate through the exported data, accumulating update statements, # Iterate through the exported data, accumulating update statements,
# one for each lease that needs updating. We should have one lease6 # one for each lease that needs updating. We should have one lease6
# per line. # per line.
line_cnt=0; line_cnt=0
update_cnt=0; update_cnt=0
while read -r line while read -r line
do do
line_cnt=$((line_cnt + 1)); line_cnt=$((line_cnt + 1))
xIFS="$IFS" xIFS="$IFS"
IFS=$',' IFS=','
i=1 i=1
hostname= hostname=
@@ -381,13 +394,13 @@ update_lease6_data() {
# If the hostname was not null set the lower case value # If the hostname was not null set the lower case value
if [ "$hostname" != "" ] if [ "$hostname" != "" ]
then then
lower=$(echo $hostname | tr '[:upper:]' '[:lower:]') lower=$(echo "${hostname}" | tr '[:upper:]' '[:lower:]')
echo "update lease6 set hostname = '$lower' where address = $address;" >> $lease6_update_file echo "update lease6 set hostname = '$lower' where address = $address;" >> "$lease6_update_file"
update_cnt=$((update_cnt + 1)) update_cnt=$((update_cnt + 1))
fi fi
IFS="$xIFS" IFS="$xIFS"
done < $lease6_export_file done < "$lease6_export_file"
# If we didn't record any updates, then hey, we're good to go! # If we didn't record any updates, then hey, we're good to go!
if [ "$update_cnt" -eq 0 ] if [ "$update_cnt" -eq 0 ]
@@ -398,8 +411,8 @@ update_lease6_data() {
# We have at least one update in the update file, so submit it # to cqlsh. # We have at least one update in the update file, so submit it # to cqlsh.
echo "$update_cnt lease6 update statements written to $lease6_update_file" echo "$update_cnt lease6 update statements written to $lease6_update_file"
echo "Running the updates..." echo "Running the updates..."
cqlsh $cqlargs -f "$lease6_update_file"
if [ "$?" -ne 0 ] if ! cqlsh "${cqlargs[@]}" -f "$lease6_update_file"
then then
exit_now 1 "Cassandra lease6 updates failed" exit_now 1 "Cassandra lease6 updates failed"
fi fi
@@ -415,7 +428,10 @@ lease6_export_file="$temp_file_dir/cql_lease6_export.csv"
lease6_update_file="$temp_file_dir/cql_lease6_update.cql" lease6_update_file="$temp_file_dir/cql_lease6_update.cql"
check_version check_version
update_schema if ! update_schema; then
printf 'Schema update FAILED!\n'
exit 1
fi
update_host_data update_host_data
update_lease4_data update_lease4_data
update_lease6_data update_lease6_data

View File

@@ -12,34 +12,45 @@
# including leases, reservations, etc... Use at your own peril. # including leases, reservations, etc... Use at your own peril.
# Reference tables will be left in-tact. # Reference tables will be left in-tact.
prefix=@prefix@a # shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
# First argument is must be the expected schema version <major>.<minor> # First argument is must be the expected schema version <major>.<minor>
exp_version="$1" exp_version="$1"
shift; shift
# Remaining arguments are used as cql command line arguments # Remaining arguments are used as cql command line arguments
# If the existing schema doesn't match, the fail # If the existing schema doesn't match, the fail
VERSION=`cql_version "$@"` VERSION=$(cql_version "$@")
if [ "$VERSION" = "" ]; then if [ "$VERSION" = "" ]; then
printf "Cannot wipe data, schema version could not be detected.\n" printf "Cannot wipe data, schema version could not be detected.\n"
exit 1 exit 1
fi fi
if [ "$VERSION" != "$exp_version" ]; then if [ "$VERSION" != "$exp_version" ]; then
printf "Cannot wipe data, wrong schema version. Expected $exp_version, found version $VERSION.\n" printf 'Cannot wipe data, wrong schema version. '
printf 'Expected version %s, found %s.\n' "${exp_version}" "${VERSION}"
exit 1 exit 1
fi fi
# Delete transient data from tables. # Delete transient data from tables.
cqlsh "$@" <<EOF cqlsh "$@" <<EOF
TRUNCATE TABLE lease4; TRUNCATE TABLE lease4;
TRUNCATE TABLE lease6; TRUNCATE TABLE lease6;
@@ -49,7 +60,3 @@ TRUNCATE TABLE lease_state;
TRUNCATE TABLE hosts; TRUNCATE TABLE hosts;
TRUNCATE TABLE logs; TRUNCATE TABLE logs;
EOF EOF
RESULT=$?
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "1.0" ]; then if [ "$VERSION" != "1.0" ]; then
printf "This script upgrades 1.0 to 2.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 1.0 to 2.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -38,7 +55,3 @@ INSERT INTO lease_hwaddr_source VALUES (64, 'HWADDR_SOURCE_DOCSIS');
UPDATE schema_version SET version='2', minor='0'; UPDATE schema_version SET version='2', minor='0';
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "2.0" ]; then if [ "$VERSION" != "2.0" ]; then
printf "This script upgrades 2.0 to 3.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 2.0 to 3.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -29,7 +46,7 @@ dhcp4_client_classes VARCHAR(255) NULL ,
dhcp6_client_classes VARCHAR(255) NULL , dhcp6_client_classes VARCHAR(255) NULL ,
PRIMARY KEY (host_id) , PRIMARY KEY (host_id) ,
INDEX key_dhcp4_identifier_subnet_id (dhcp_identifier ASC, dhcp_identifier_type ASC) , INDEX key_dhcp4_identifier_subnet_id (dhcp_identifier ASC, dhcp_identifier_type ASC) ,
INDEX key_dhcp6_identifier_subnet_id (dhcp_identifier ASC, dhcp_identifier_type ASC, dhcp6_subnet_id ASC) INDEX key_dhcp6_identifier_subnet_id (dhcp_identifier ASC, dhcp_identifier_type ASC, dhcp6_subnet_id ASC)
) ENGINE = INNODB; ) ENGINE = INNODB;
CREATE TABLE IF NOT EXISTS ipv6_reservations ( CREATE TABLE IF NOT EXISTS ipv6_reservations (
@@ -99,7 +116,3 @@ DELIMITER ;
UPDATE schema_version SET version='3', minor='0'; UPDATE schema_version SET version='3', minor='0';
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "3.0" ]; then if [ "$VERSION" != "3.0" ]; then
printf "This script upgrades 3.0 to 4.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 3.0 to 4.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -154,7 +171,3 @@ UPDATE schema_version
SET version = '4', minor = '0'; SET version = '4', minor = '0';
# This line concludes database upgrade to version 4.0. # This line concludes database upgrade to version 4.0.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "4.0" ]; then if [ "$VERSION" != "4.0" ]; then
printf "This script upgrades 4.0 to 4.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 4.0 to 4.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -23,7 +40,7 @@ mysql "$@" <<EOF
INSERT INTO lease_hwaddr_source VALUES (0, 'HWADDR_SOURCE_UNKNOWN'); INSERT INTO lease_hwaddr_source VALUES (0, 'HWADDR_SOURCE_UNKNOWN');
# #
# Add order by lease address to lease4DumpData # Add order by lease address to lease4DumpData
# #
DROP PROCEDURE IF EXISTS lease4DumpData; DROP PROCEDURE IF EXISTS lease4DumpData;
DELIMITER $$ DELIMITER $$
@@ -48,7 +65,7 @@ END $$
DELIMITER ; DELIMITER ;
# #
# Add order by lease address to lease6DumpData # Add order by lease address to lease6DumpData
# #
DROP PROCEDURE IF EXISTS lease6DumpData; DROP PROCEDURE IF EXISTS lease6DumpData;
DELIMITER $$ DELIMITER $$
@@ -85,7 +102,3 @@ SET version = '4', minor = '1';
# This line concludes database upgrade to version 4.1. # This line concludes database upgrade to version 4.1.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "4.1" ]; then if [ "$VERSION" != "4.1" ]; then
printf "This script upgrades 4.1 to 5.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 4.1 to 5.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -109,7 +126,3 @@ SET version = '5', minor = '0';
# This line concludes database upgrade to version 5.0. # This line concludes database upgrade to version 5.0.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "5.0" ]; then if [ "$VERSION" != "5.0" ]; then
printf "This script upgrades 5.0 to 5.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 5.0 to 5.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -42,7 +59,3 @@ SET version = '5', minor = '1';
# This line concludes database upgrade to version 5.1. # This line concludes database upgrade to version 5.1.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "5.1" ]; then if [ "$VERSION" != "5.1" ]; then
printf "This script upgrades 5.1 to 5.2. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 5.1 to 5.2. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -28,7 +45,3 @@ SET version = '5', minor = '2';
# This line concludes database upgrade to version 5.2. # This line concludes database upgrade to version 5.2.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "5.2" ]; then if [ "$VERSION" != "5.2" ]; then
printf "This script upgrades 5.2 to 6.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 5.2 to 6.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -197,7 +214,3 @@ SET version = '6', minor = '0';
# This line concludes database upgrade to version 6.0. # This line concludes database upgrade to version 6.0.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "6.0" ]; then if [ "$VERSION" != "6.0" ]; then
printf "This script upgrades 6.0 to 7.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 6.0 to 7.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -104,8 +121,8 @@ CREATE TABLE logs (
CREATE INDEX timestamp_index ON logs (timestamp); CREATE INDEX timestamp_index ON logs (timestamp);
#add auth key for reconfiguration #add auth key for reconfiguration
ALTER TABLE hosts ALTER TABLE hosts
ADD COLUMN auth_key VARCHAR(16) NULL; ADD COLUMN auth_key VARCHAR(16) NULL;
# Convert subnet-id values of 0 to NULL # Convert subnet-id values of 0 to NULL
UPDATE hosts SET dhcp4_subnet_id = NULL WHERE dhcp4_subnet_id = 0; UPDATE hosts SET dhcp4_subnet_id = NULL WHERE dhcp4_subnet_id = 0;
@@ -645,7 +662,3 @@ SET version = '7', minor = '0';
# This line concludes database upgrade to version 7.0. # This line concludes database upgrade to version 7.0.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "7.0" ]; then if [ "$VERSION" != "7.0" ]; then
printf "This script upgrades 7.0 to 8.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 7.0 to 8.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -977,7 +994,3 @@ SET version = '8', minor = '0';
# This line concludes database upgrade to version 8.0. # This line concludes database upgrade to version 8.0.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "8.0" ]; then if [ "$VERSION" != "8.0" ]; then
printf "This script upgrades 8.0 to 8.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 8.0 to 8.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -104,7 +121,3 @@ SET version = '8', minor = '1';
# This line concludes database upgrade to version 8.1. # This line concludes database upgrade to version 8.1.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,78 +1,88 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# shellcheck disable=SC2039
# SC2039: In POSIX sh, 'local' is undefined.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
# We need to set global RESULT when we exit. This is checked by callers.
bail() {
RESULT=$1
exit $1
}
if [ "$VERSION" != "8.1" ]; then if [ "$VERSION" != "8.1" ]; then
printf "This script upgrades 8.1 to 8.2. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 8.1 to 8.2. '
bail 0 printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0
fi fi
# Get the schema name from database argument. We need this to # Get the schema name from database argument. We need this to
# query information_schema for the right database. # query information_schema for the right database.
for arg in $@ for arg in "${@}"
do do
cnt=`echo $arg | grep -c "^\-\-"` if ! grep -Eq '^\-\-' <<<"${arg}"
if [ $cnt -eq 0 ]
then then
schema="$arg" schema="$arg"
break; break
fi fi
done done
# Make sure we can id the schema # Make sure we can id the schema
if [ -z $schema ] if [ -z "$schema" ]
then then
printf "Could not find database schema name in cmd line args: $@\n" printf "Could not find database schema name in cmd line args: %s\n" "${*}"
bail 255 exit 255
fi fi
# Save the command line args, as we use these later change_column function. # Save the command line args, as we use these later change_column function.
cmdargs="$@" cmdargs=("${@}")
# Function to rename a column in a table. # Function to rename a column in a table.
change_column() { change_column() {
local schema="$1" local schema="${1-}"
local table="$2" local table="${2-}"
local ocolumn="$3" local ocolumn="${3-}"
local ncolumn="$4" local ncolumn="${4-}"
# First let's find out if the column name in the table actually needs updating. # First let's find out if the column name in the table actually needs updating.
sql="select count(column_name) from information_schema.columns where table_schema='$schema' and table_name = '$table' and column_name = '$ocolumn'" sql="select count(column_name) from information_schema.columns where table_schema='$schema' and table_name = '$table' and column_name = '$ocolumn'"
if ! count=$(mysql -N -B "${cmdargs[@]}" -e "$sql")
count=`mysql -N -B $cmdargs -e "$sql"`
if [ $? -ne 0 ]
then then
printf "change_column: schema query failed [$sql]\n" printf 'change_column: schema query failed [%s]\n' "${sql}"
bail 255; exit 255
fi fi
# If we found a match record, the column needs to be renamed # If we found a match record, the column needs to be renamed
if [ "$count" -eq 1 ] if [ "$count" -eq 1 ]
then then
sql="ALTER TABLE $table CHANGE COLUMN $ocolumn $ncolumn" sql="ALTER TABLE $table CHANGE COLUMN $ocolumn $ncolumn"
mysql -N -B $cmdargs -e "$sql" if ! mysql -N -B "${cmdargs[@]}" -e "$sql"
if [ $? -ne 0 ]
then then
printf "change_column: alter query failed: [$sql]\n" printf 'change_column: alter query failed [%s]\n' "${sql}"
bail 255; exit 255
fi fi
else else
printf "$table column is already correct\n" printf '%s column is already correct\n' "${table}"
fi fi
} }
@@ -485,15 +495,7 @@ SET version = '8', minor = '2';
EOF EOF
RESULT=$?
if [ $RESULT -ne 0 ]
then
exit $RESULT
fi
# We need to rename the columns in the option def tables because "array" is # We need to rename the columns in the option def tables because "array" is
# a MySQL keyword as of 8.0.17 # a MySQL keyword as of 8.0.17
change_column $schema dhcp4_option_def array "is_array TINYINT(1) NOT NULL" change_column "${schema}" dhcp4_option_def array "is_array TINYINT(1) NOT NULL"
change_column $schema dhcp6_option_def array "is_array TINYINT(1) NOT NULL" change_column "${schema}" dhcp6_option_def array "is_array TINYINT(1) NOT NULL"
bail 0

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "8.2" ]; then if [ "$VERSION" != "8.2" ]; then
printf "This script upgrades 8.2 to 9.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 8.2 to 9.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -42,7 +59,3 @@ SET version = '9', minor = '0';
# This line concludes database upgrade to version 9.0. # This line concludes database upgrade to version 9.0.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "9.0" ]; then if [ "$VERSION" != "9.0" ]; then
printf "This script upgrades 9.0 to 9.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 9.0 to 9.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -58,7 +75,3 @@ SET version = '9', minor = '1';
# This line concludes database upgrade to version 9.1. # This line concludes database upgrade to version 9.1.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "9.1" ]; then if [ "$VERSION" != "9.1" ]; then
printf "This script upgrades 9.1 to 9.2. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 9.1 to 9.2. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -62,7 +79,3 @@ SET version = '9', minor = '2';
# This line concludes database upgrade to version 9.2. # This line concludes database upgrade to version 9.2.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "9.2" ]; then if [ "$VERSION" != "9.2" ]; then
printf "This script upgrades 9.2 to 9.3. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 9.2 to 9.3. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -121,7 +138,3 @@ SET version = '9', minor = '3';
# This line concludes database upgrade to version 9.3. # This line concludes database upgrade to version 9.3.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "9.3" ]; then if [ "$VERSION" != "9.3" ]; then
printf "This script upgrades 9.3 to 9.4. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 9.3 to 9.4. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -65,7 +82,3 @@ SET version = '9', minor = '4';
# This line concludes database upgrade to version 9.4. # This line concludes database upgrade to version 9.4.
EOF EOF
RESULT=$?
exit $?

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" != "9.4" ]; then if [ "$VERSION" != "9.4" ]; then
printf "This script upgrades 9.4 to 9.5. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 9.4 to 9.5. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -151,7 +168,3 @@ SET version = '9', minor = '5';
# This line concludes database upgrade to version 9.5. # This line concludes database upgrade to version 9.5.
EOF EOF
RESULT=$?
exit $?

View File

@@ -12,30 +12,41 @@
# including leases, reservations, etc... Use at your own peril. # including leases, reservations, etc... Use at your own peril.
# Reference tables will be left in-tact. # Reference tables will be left in-tact.
prefix=@prefix@ # shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
# First argument is must be the expected schema version <major>.<minor> # First argument is must be the expected schema version <major>.<minor>
exp_version="$1" exp_version="$1"
shift; shift
# Remaining arguments are used as mysql command line arguments # Remaining arguments are used as mysql command line arguments
# If the existing schema doesn't match, the fail # If the existing schema doesn't match, the fail
VERSION=`mysql_version "$@"` VERSION=$(mysql_version "$@")
if [ "$VERSION" = "" ]; then if [ "$VERSION" = "" ]; then
printf "Cannot wipe data, schema version could not be detected.\n" printf "Cannot wipe data, schema version could not be detected.\n"
exit 1 exit 1
fi fi
if [ "$VERSION" != "$exp_version" ]; then if [ "$VERSION" != "$exp_version" ]; then
printf "Cannot wipe data, wrong schema version. Expected $exp_version, found version $VERSION.\n" printf 'Cannot wipe data, wrong schema version. '
printf 'Expected version %s, found %s.\n' "$exp_version" "$VERSION"
exit 1 exit 1
fi fi
@@ -90,7 +101,3 @@ DELETE FROM lease6_stat;
DELETE FROM logs; DELETE FROM logs;
COMMIT; COMMIT;
EOF EOF
RESULT=$?
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "1.0" ]; then if [ "$VERSION" != "1.0" ]; then
printf "This script upgrades 1.0 to 2.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 1.0 to 2.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -154,5 +171,3 @@ UPDATE schema_version
SET version = '2', minor = '0'; SET version = '2', minor = '0';
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2016-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "2.0" ]; then if [ "$VERSION" != "2.0" ]; then
printf "This script upgrades 2.0 to 3.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 2.0 to 3.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -274,5 +291,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "3.0" ]; then if [ "$VERSION" != "3.0" ]; then
printf "This script upgrades 3.0 to 3.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 3.0 to 3.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -46,6 +63,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "3.1" ]; then if [ "$VERSION" != "3.1" ]; then
printf "This script upgrades 3.1 to 3.2. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 3.1 to 3.2. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -59,6 +76,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "3.2" ]; then if [ "$VERSION" != "3.2" ]; then
printf "This script upgrades 3.2 to 3.3. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 3.2 to 3.3. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -37,5 +54,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "3.3" ]; then if [ "$VERSION" != "3.3" ]; then
printf "This script upgrades 3.3 to 4.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 3.3 to 4.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -242,6 +259,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "4.0" ]; then if [ "$VERSION" != "4.0" ]; then
printf "This script upgrades 4.0 to 5.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 4.0 to 5.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -153,6 +170,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "5.0" ]; then if [ "$VERSION" != "5.0" ]; then
printf "This script upgrades 5.0 to 5.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 5.0 to 5.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -33,6 +50,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2019-2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "5.1" ]; then if [ "$VERSION" != "5.1" ]; then
printf "This script upgrades 5.1 to 6.0. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 5.1 to 6.0. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -52,6 +69,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "6.0" ]; then if [ "$VERSION" != "6.0" ]; then
printf "This script upgrades 6.0 to 6.1. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 6.0 to 6.1. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -120,6 +137,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -1,18 +1,35 @@
#!/bin/sh #!/bin/sh
prefix=@prefix@ # Copyright (C) 2020 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" != "6.1" ]; then if [ "$VERSION" != "6.1" ]; then
printf "This script upgrades 6.1 to 6.2. Reported version is $VERSION. Skipping upgrade.\n" printf 'This script upgrades 6.1 to 6.2. '
printf 'Reported version is %s. Skipping upgrade.\n' "${VERSION}"
exit 0 exit 0
fi fi
@@ -52,6 +69,3 @@ UPDATE schema_version
COMMIT; COMMIT;
EOF EOF
exit $RESULT

View File

@@ -12,30 +12,41 @@
# including leases, reservations, etc... Use at your own peril. # including leases, reservations, etc... Use at your own peril.
# Reference tables will be left in-tact. # Reference tables will be left in-tact.
prefix=@prefix@ # shellcheck disable=SC1091
# SC1091: Not following: ... was not specified as input (see shellcheck -x).
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# shellcheck disable=SC2034
# SC2034: ... appears unused. Verify use (or export if used externally).
prefix="@prefix@"
# Include utilities. Use installed version if available and # Include utilities. Use installed version if available and
# use build version if it isn't. # use build version if it isn't.
if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then if [ -e @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh ]; then
. @datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh . "@datarootdir@/@PACKAGE_NAME@/scripts/admin-utils.sh"
else else
. @abs_top_builddir@/src/bin/admin/admin-utils.sh . "@abs_top_builddir@/src/bin/admin/admin-utils.sh"
fi fi
# First argument is must be the expected schema version <major>.<minor> # First argument is must be the expected schema version <major>.<minor>
exp_version="$1" exp_version="$1"
shift; shift
# Remaining arguments are used as pgsql command line arguments # Remaining arguments are used as pgsql command line arguments
# If the existing schema doesn't match, the fail # If the existing schema doesn't match, the fail
VERSION=`pgsql_version "$@"` VERSION=$(pgsql_version "$@")
if [ "$VERSION" = "" ]; then if [ "$VERSION" = "" ]; then
printf "Cannot wipe data, schema version could not be detected.\n" printf "Cannot wipe data, schema version could not be detected.\n"
exit 1 exit 1
fi fi
if [ "$VERSION" != "$exp_version" ]; then if [ "$VERSION" != "$exp_version" ]; then
printf "Cannot wipe data, wrong schema version. Expected $exp_version, found version $VERSION.\n" printf 'Cannot wipe data, wrong schema version. '
printf 'Expected version %s, found %s.\n' "${exp_version}" "${VERSION}"
exit 1 exit 1
fi fi
@@ -55,7 +66,3 @@ DELETE FROM lease6_stat;
DELETE FROM logs; DELETE FROM logs;
COMMIT; COMMIT;
EOF EOF
RESULT=$?
exit $RESULT

View File

@@ -1,5 +1,6 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,22 +13,28 @@
# Requires yanglint to translate YANG to YIN formats and openssl # Requires yanglint to translate YANG to YIN formats and openssl
# for a system independent SHA-256. # for a system independent SHA-256.
error=0 # Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Change directory to the YANG modules' directory.
script_path=$(cd "$(dirname "${0}")" && pwd)
cd "${script_path}/.."
for m in *.yang for m in *.yang
do do
hash1=`yanglint -f yin $m | openssl dgst -sha256 | sed 's/(stdin)= //'` hash1=$(yanglint -f yin "${m}" | openssl dgst -sha256 | sed 's/(stdin)= //')
h=hashes/`basename $m .yang`.hash h="hashes/$(basename "${m}").hash"
if test -f $h if test -f "${h}"
then then
hash2=`cat $h` hash2=$(cat "${h}")
if test $hash1 != $hash2 if test "$hash1" != "$hash2"
then then
error=1 printf 'hash mismatch on %s expected %s in %s\n' "${m}" "${hash1}" "${h}"
echo hash mismatch on $m expected $hash1 in $h exit 1
fi fi
else else
error=1 printf 'missing hash file %s for %s\n' "${h}" "${m}"
echo missing hash file $h for $m exit 2
fi fi
done done
exit $error

View File

@@ -1,5 +1,6 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,18 +13,26 @@
# Requires yanglint to translate YANG to YIN formats. # Requires yanglint to translate YANG to YIN formats.
# Fixme: use xlstproc to extract the revision. # Fixme: use xlstproc to extract the revision.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Change directory to the YANG modules' directory.
script_path=$(cd "$(dirname "${0}")" && pwd)
cd "${script_path}/.."
error=0 error=0
for m in *.yang for m in *.yang
do do
rev1=`yanglint -f yin $m | grep '<revision date=' | head -1 | sed \ rev1=$(yanglint -f yin "${m}" | grep '<revision date=' | head -1 | sed \
's/.*<revision date="\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)".*/\1/'` 's/.*<revision date="\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)".*/\1/')
rev2=`echo $m | sed \ rev2=$(echo "${m}" | sed \
's/.*@\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)\..*/\1/'` 's/.*@\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)\..*/\1/')
if test $rev1 != $rev2 if test "${rev1}" != "${rev2}"
then then
error=1 error=1
echo revision mismatch on $m got $rev1 printf 'revision mismatch on %s got %s\n' "${m}" "${rev1}"
fi fi
done done
exit $error exit $error

View File

@@ -1,5 +1,6 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2018-2019 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,8 +13,17 @@
# src/lib/yang/yang_revisions.h.skel # src/lib/yang/yang_revisions.h.skel
# The keatest-module entry is enabled only when KEATEST_MODULE is defined. # The keatest-module entry is enabled only when KEATEST_MODULE is defined.
test=keatest-module*.yang # Exit with error if commands exit with non-zero and if undefined variables are
last=kea-dhcp-ddns*.yang # used.
set -eu
# Change directory to the YANG modules' directory.
script_path=$(cd "$(dirname "${0}")" && pwd)
cd "${script_path}/.."
# Solve globbing here.
test=$(echo keatest-module*.yang)
last=$(echo kea-dhcp-ddns*.yang)
for m in keatest-module*.yang \ for m in keatest-module*.yang \
ietf-dhcpv6-types*.yang \ ietf-dhcpv6-types*.yang \
@@ -26,22 +36,20 @@ for m in keatest-module*.yang \
kea-ctrl-agent*.yang \ kea-ctrl-agent*.yang \
kea-dhcp-ddns*.yang kea-dhcp-ddns*.yang
do do
if test $m = $test if test "${m}" = "${test}"
then then
echo '#ifdef KEATEST_MODULE' echo '#ifdef KEATEST_MODULE'
fi fi
b=`echo $m | sed 's/\(.*\)@.*/\1/'` b=$(echo "${m}" | sed 's/\(.*\)@.*/\1/')
r=`echo $m | sed 's/.*@\(.*\)\.yang/\1/'` r=$(echo "${m}" | sed 's/.*@\(.*\)\.yang/\1/')
c=',' c=','
if test $m = $last if test "${m}" = "${last}"
then then
c='' c=''
fi fi
echo ' { "'$b'", "'$r'" }'$c printf ' { "%s", "%s" }%s\n' "${b}" "${r}" "${c}"
if test $m = $test if test "${m}" = "${test}"
then then
echo '#endif // KEATEST_MODULE' echo '#endif // KEATEST_MODULE'
fi fi
done done

View File

@@ -19,6 +19,10 @@
# Reason: blackslash+linefeed inside single quotes in sed are needed for # Reason: blackslash+linefeed inside single quotes in sed are needed for
# POSIX-compliance. \n works only with GNU sed. # POSIX-compliance. \n works only with GNU sed.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Print usage. # Print usage.
print_usage() { print_usage() {
printf \ printf \
@@ -142,7 +146,6 @@ else
file=$(mktemp) file=$(mktemp)
# Run once for files that have at least one include. # Run once for files that have at least one include.
# shellcheck disable=SC1004
for i in $(get_source_files); do for i in $(get_source_files); do
sed '1,/#include/s/#include/#include <config.h>\ sed '1,/#include/s/#include/#include <config.h>\
\ \
@@ -152,7 +155,6 @@ else
# Run again for files that don't have any includes. The second command would # Run again for files that don't have any includes. The second command would
# work for the first case, but the first command is more elegant. # work for the first case, but the first command is more elegant.
# shellcheck disable=SC1004
for i in $(get_source_files); do for i in $(get_source_files); do
sed '1,/\(\/\/ file, You can obtain one.*\)/s/\(\/\/ file, You can obtain one.*\)/\1\ sed '1,/\(\/\/ file, You can obtain one.*\)/s/\(\/\/ file, You can obtain one.*\)/\1\
\ \

View File

@@ -10,6 +10,10 @@
# This script is used to run Kea from installation directory, # This script is used to run Kea from installation directory,
# as well as for running tests. # as well as for running tests.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
cql_lib="cassandra" cql_lib="cassandra"
if test "$(uname -s)" = "Darwin"; then if test "$(uname -s)" = "Darwin"; then

View File

@@ -7,27 +7,32 @@
# #
# This script embeds config.report into src/bin/cfgrpt/config_report.cc # This script embeds config.report into src/bin/cfgrpt/config_report.cc
# Called by configure # Called by configure
#
# shellcheck disable=SC2129
# SC2129: Consider using { cmd1; cmd2; } >> file instead of individual redirects.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
report_file="$1" report_file="$1"
dest="$2" dest="$2"
if [ -z ${report_file} ] if [ -z "${report_file}" ]
then then
echo "ERROR mk_cfgrpt.sh - input report: $report_file does not exist" echo "ERROR mk_cfgrpt.sh - input report: $report_file does not exist"
exit -1 exit 1
fi fi
# Initializes # Initializes
cat /dev/null > $dest if ! cat /dev/null > "${dest}"
if [ $? -ne 0 ]
then then
echo "ERROR mk_cfgrpt.sh - cannot create config output file: $dest" echo "ERROR mk_cfgrpt.sh - cannot create config output file: ${dest}"
exit -1 exit 2
fi fi
# Header # Header
cat >> $dest << END cat >> "${dest}" << END
// config_report.cc. Generated from config.report by tools/mk_cfgrpt.sh // config_report.cc. Generated from config.report by tools/mk_cfgrpt.sh
namespace isc { namespace isc {
@@ -38,10 +43,10 @@ END
# Body: escape '\'s and '"'s, preprend ' ";;;; ' and append '",' # Body: escape '\'s and '"'s, preprend ' ";;;; ' and append '",'
sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/^/ ";;;; /' -e 's/$/",/' \ sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/^/ ";;;; /' -e 's/$/",/' \
< $report_file >> $dest < "${report_file}" >> "${dest}"
# Trailer # Trailer
cat >> $dest <<END cat >> "${dest}" <<END
"" ""
}; };

View File

@@ -1,10 +1,11 @@
#!/bin/sh #!/bin/sh
# Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC") # Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC")
# #
# This Source Code Form is subject to the terms of the Mozilla Public # This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This script replaces @prefix@, @localstatedir@ and other automake/autoconf # This script replaces @prefix@, @localstatedir@ and other automake/autoconf
# variables with their actual content. # variables with their actual content.
# #
@@ -14,13 +15,19 @@
# #
# This script is initially used to generate configuration files, but it is # This script is initially used to generate configuration files, but it is
# generic and can be used to generate any text files. # generic and can be used to generate any text files.
#
prefix=@prefix@ # shellcheck disable=SC2034
sysconfdir=@sysconfdir@ # SC2034: ... appears unused. Verify use (or export if used externally).
localstatedir=@localstatedir@
exec_prefix=@exec_prefix@ # Exit with error if commands exit with non-zero and if undefined variables are
libdir=@libdir@ # used.
set -eu
prefix="@prefix@"
sysconfdir="@sysconfdir@"
localstatedir="@localstatedir@"
exec_prefix="@exec_prefix@"
libdir="@libdir@"
echo "Replacing \@prefix\@ with ${prefix}" echo "Replacing \@prefix\@ with ${prefix}"
echo "Replacing \@libdir\@ with ${libdir}" echo "Replacing \@libdir\@ with ${libdir}"
@@ -30,4 +37,4 @@ echo "Replacing \@localstatedir\@ with ${localstatedir}"
echo "Input file: $1" echo "Input file: $1"
echo "Output file: $2" echo "Output file: $2"
sed -e "s@SEP@\@libdir\@@SEP@${libdir}@SEP@g; s@SEP@\@localstatedir\@@SEP@${localstatedir}@SEP@g; s@SEP@\@prefix\@@SEP@${prefix}@SEP@g; s@SEP@\@sysconfdir\@@SEP@${sysconfdir}@SEP@g" $1 > $2 sed -e "s@SEP@\@libdir\@@SEP@${libdir}@SEP@g; s@SEP@\@localstatedir\@@SEP@${localstatedir}@SEP@g; s@SEP@\@prefix\@@SEP@${prefix}@SEP@g; s@SEP@\@sysconfdir\@@SEP@${sysconfdir}@SEP@g" "${1}" > "${2}"

View File

@@ -10,6 +10,10 @@
# This script is used to run Kea from installation directory, # This script is used to run Kea from installation directory,
# as well as for running tests. # as well as for running tests.
# Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
if [ "$(uname -s)" = "Darwin" ]; then if [ "$(uname -s)" = "Darwin" ]; then
DIR=$(stat -f %N "$0" | xargs dirname) DIR=$(stat -f %N "$0" | xargs dirname)
else else

View File

@@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
########################################### ################################################################################
# This script runs all tests in valgrind. Configure and compile kea the way # This script runs all tests in valgrind. Configure and compile kea the way
# you want it to be tested (you should use --with-gtest or --with-gtest-source, # you want it to be tested (you should use --with-gtest or --with-gtest-source,
# however, or you get no tests). Then run this script from the top build # however, or you get no tests). Then run this script from the top build
@@ -16,21 +16,27 @@
# used unmodified inside a sed pattern with # as a modifier, which can # used unmodified inside a sed pattern with # as a modifier, which can
# easily break it. There was no motivation to fix this. # easily break it. There was no motivation to fix this.
# * VALGRIND_FILE is the file to store the output into. Default is valgrind.log # * VALGRIND_FILE is the file to store the output into. Default is valgrind.log
########################################### ################################################################################
# Change directory to Kea's top build directory.
script_path=$(cd "$(dirname "${0}")" && pwd)
cd "${script_path}/.."
# First, make sure the tests are up to date # First, make sure the tests are up to date
make make
if [ $? = 2 ] ; then if test $? = 2; then
echo "Did you run configure? Or maybe you're running the script from the tools directory? (you need to run it from the top kea build directory)" printf 'Did you run configure?\n'
exit 1 exit 1
fi fi
set -e # Exit with error if commands exit with non-zero and if undefined variables are
# used.
set -eu
# Some configuration # Some configuration
# TODO Escape for sed, this might break # TODO Escape for sed, this might break
LOGFILE="${VALGRIND_FILE:-`pwd`/valgrind.log}" LOGFILE="${VALGRIND_FILE:-$(pwd)/valgrind.log}"
FLAGS="${VALGRIND_FLAGS:---leak-check=full --track-fds=yes}" FLAGS="${VALGRIND_FLAGS:---leak-check=full --track-fds=yes}"
FLAGS="$FLAGS --log-file=$LOGFILE.%p" FLAGS="$FLAGS --log-file=$LOGFILE.%p"
@@ -39,14 +45,14 @@ FAILED=
# Find all the tests (yes, doing it by a name is a nasty hack) # Find all the tests (yes, doing it by a name is a nasty hack)
# Since the while runs in a subprocess, we need to get the assignments out, done by the eval # Since the while runs in a subprocess, we need to get the assignments out, done by the eval
eval $(find . -type f -name *_unittests -print | grep -v '\.libs/' | while read testname ; do find . -type f -name '*_unittests' -print | grep -Fv '.libs/' | while read -r testname ; do
sed -e 's#exec "#exec valgrind '"$FLAGS"' "#' "$testname" > "$testname.valgrind" sed -e 's#exec "#exec valgrind '"$FLAGS"' "#' "$testname" > "$testname.valgrind"
chmod +x "$testname.valgrind" chmod +x "$testname.valgrind"
echo "$testname" >>"$LOGFILE" echo "$testname" >>"$LOGFILE"
echo "===============" >>"$LOGFILE" echo "===============" >>"$LOGFILE"
OLDDIR="`pwd`" OLDDIR=$(pwd)
cd $(dirname "$testname") cd "$(dirname "$testname")"
./$(basename $testname).valgrind >&2 & "./$(basename "$testname").valgrind" >&2 &
PID="$!" PID="$!"
set +e set +e
wait "$PID" wait "$PID"
@@ -54,18 +60,18 @@ eval $(find . -type f -name *_unittests -print | grep -v '\.libs/' | while read
set -e set -e
cd "$OLDDIR" cd "$OLDDIR"
if [ "$CODE" != 0 ] ; then if [ "$CODE" != 0 ] ; then
echo 'FAILED="$FAILED printf 'FAILED="%s
'"$testname"'"' %s"' "${FAILED}" "${testname}"
fi fi
NAME="$LOGFILE.$PID" NAME="$LOGFILE.$PID"
rm "$testname.valgrind" rm "$testname.valgrind"
# Remove the ones from death tests # Remove the ones from death tests
if [ -e $NAME ]; then if [ -e "${NAME}" ]; then
grep "==$PID==" "$NAME" >>"$LOGFILE" grep "==$PID==" "$NAME" >>"$LOGFILE"
rm "$NAME" rm "$NAME"
fi fi
echo 'FOUND_ANY=true' echo 'FOUND_ANY=true'
done) done
if test -n "$FAILED"; then if test -n "$FAILED"; then
echo "These tests failed:" >&2 echo "These tests failed:" >&2