diff options
Diffstat (limited to 'src/share/yang/modules/utils/reinstall.sh.in')
-rw-r--r-- | src/share/yang/modules/utils/reinstall.sh.in | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/src/share/yang/modules/utils/reinstall.sh.in b/src/share/yang/modules/utils/reinstall.sh.in new file mode 100644 index 0000000..efb3627 --- /dev/null +++ b/src/share/yang/modules/utils/reinstall.sh.in @@ -0,0 +1,179 @@ +#!/bin/sh + +# Copyright (C) 2021-2022 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/. + +# Usage: +# +# reinstall.sh [-d|--debug] [-h|--help] [-s|--sysrepo ${SYSREPO_INSTALLATION}] + +# Exit with error if commands exit with non-zero and if undefined variables are +# used. +set -eu + +# Print usage. +# Expressions don't expand in single quotes, use double quotes for that. [SC2016] +# shellcheck disable=SC2016 +print_usage() { + printf \ +'Usage: %s {{options}} +Options: + [-d|--debug] enable debug mode, showing every executed command + [-h|--help] print usage (this text) + [-s|--sysrepo ${SYSREPO_INSTALLATION}] point to sysrepo installation which is needed for sysrepoctl + [-u|--uninstall-first] uninstall before installing +' \ + "$(basename "${0}")" +} + +# Define some ANSI color codes. +if test -t 1; then + red='\033[91m' + reset='\033[0m' +else + red= + reset= +fi + +# Parse parameters. +while test ${#} -gt 0; do + case "${1}" in + # [-d|--debug] enable debug mode, showing every executed command + '-d'|'--debug') set -vx ;; + + # [-h|--help] print usage (this text) + '-h'|'--help') print_usage; exit 0 ;; + + # [-s|--sysrepo ${SYSREPO_INSTALLATION}] point to sysrepo installation which is needed for sysrepoctl + '-s'|'--sysrepo') shift; sysrepo=${1} ;; + + # [-u|--uninstall-first] uninstall before installing + '-u'|'--uninstall-first') uninstall_first=true ;; + + # Unrecognized argument + *) + printf "${red}ERROR: Unrecognized argument '%s'${reset}\\n" "${1}" 1>&2; print_usage; exit 1 ;; + esac; shift +done + +SYSREPO_PREFIX='@SYSREPO_PREFIX@' + +# Default arguments +if test -z "${sysrepo+x}"; then + if test -d "${SYSREPO_PREFIX}"; then + sysrepo="${SYSREPO_PREFIX}" + LD_LIBRARY_PATH="${LD_LIBRARY_PATH-}:${SYSREPO_PREFIX}/lib:${SYSREPO_PREFIX}/lib64" + export LD_LIBRARY_PATH + else + sysrepo='/usr/local' + fi +fi +test -z "${uninstall_first+x}" && uninstall_first='false' + +#------------------------------------------------------------------------------# + +# Get script path. +script_path=$(cd "$(dirname "${0}")" && pwd) + +# shellcheck disable=SC2034 +# prefix appears unused. Verify use (or export if used externally). +# reason: prefix is used in datarootdir (@datarootdir@) below. +prefix="@prefix@" + +# Find modules location. +# If script is in sources, use modules from sources. +# If script is in installation, use modules from installation. +for i in \ + "@datarootdir@/@PACKAGE_NAME@/yang/modules" \ + "@abs_top_builddir@/src/share/yang/modules" \ +; do + if test "${script_path}" = "${i}/utils"; then + modules="${i}" + break + fi +done +if test -z "${modules+x}"; then + printf 'ERROR: cannot find location of modules. Use this script from sources or from installation.' >&2 + exit 1 +fi + +# sysrepoctl does not set its rpath. Set LD_LIBRARY_PATH instead. +export LD_LIBRARY_PATH="${LD_LIBRARY_PATH-}:${sysrepo}/lib:${sysrepo}/lib64" + +# Check if module is installed. +is_module_installed() { + module=${1} + if test "$("${sysrepo}/bin/sysrepoctl" -l | grep -F '| I' | cut -d ' ' -f 1 | tail -n +7 | head -n -1 | grep -Ec "^${module}")" -eq 0; then + # not installed + return 1 + fi + # installed + return 0 +} + +# Install a module from the Kea sources. Should upgrade automatically to a newer +# revision. +install_kea_module() { + module=${1} + + if is_module_installed "${module}"; then + # Upgrade. + flag="-U" + else + # Install. + flag="-i" + fi + + # Find a module starting with given name and act on it. + find "${modules}" -maxdepth 1 -type f -name "${module}*.yang" -exec \ + "${sysrepo}/bin/sysrepoctl" "${flag}" {} -s "${modules}" -v 4 \; +} + +# Uninstall a module if installed. +uninstall_module() { + module=${1} + if ! is_module_installed "${module}"; then + return; + fi + "${sysrepo}/bin/sysrepoctl" -u "${module}" -v 4 +} + +# Install all YANG modules in dependency order. +install_yang_modules() { + install_kea_module 'keatest-module' + install_kea_module 'ietf-interfaces' + install_kea_module 'ietf-dhcpv6-common' + install_kea_module 'ietf-dhcpv6-client' + install_kea_module 'ietf-dhcpv6-relay' + install_kea_module 'ietf-dhcpv6-server' + install_kea_module 'ietf-yang-types' + install_kea_module 'ietf-dhcpv6-options' + install_kea_module 'ietf-dhcpv6-types' + install_kea_module 'ietf-inet-types' + install_kea_module 'kea-types' + install_kea_module 'kea-dhcp-types' + install_kea_module 'kea-dhcp-ddns' + install_kea_module 'kea-ctrl-agent' + install_kea_module 'kea-dhcp4-server' + install_kea_module 'kea-dhcp6-server' +} + +# Uninstall all YANG modules in reverse dependency order. Only uninstalls Kea +# modules. IETF modules might be dependencies to sysrepo internal modules. +uninstall_yang_modules() { + uninstall_module 'kea-dhcp6-server' + uninstall_module 'kea-dhcp4-server' + uninstall_module 'kea-ctrl-agent' + uninstall_module 'kea-dhcp-ddns' + uninstall_module 'kea-dhcp-types' + uninstall_module 'kea-types' + uninstall_module 'keatest-module' +} + +if "${uninstall_first}"; then + uninstall_yang_modules +fi +install_yang_modules |