#!/usr/bin/env bash set -x # This is based on scripts/setup.sh from Netopeer2/libnetconf2 # env variables NP2_MODULE_DIR, NP2_MODULE_PERMS must be defined and NP2_MODULE_OWNER, NP2_MODULE_GROUP will be used if # defined when executing this script! #if [ -z "$NP2_MODULE_DIR" -o -z "$NP2_MODULE_PERMS" ]; then # echo "Required environment variables not defined!" # exit 1 #fi # Source the provided file, which is expected to contain the list of YANG modules and their features. # This file, specified by the first argument to the script ($1), is sourced to populate the MODULES # array with the modules and their respective features to be processed by this script. # The file typically includes definitions in the form of module@revision with optional features to enable, # e.g., module@revision -e feature1 -e feature2. source $1 # optional env variable override if [ -n "$SYSREPOCTL_EXECUTABLE" ]; then SYSREPOCTL="$SYSREPOCTL_EXECUTABLE" # avoid problems with sudo PATH elif [ `id -u` -eq 0 ] && [ -n "$USER" ] && [ `command -v su` ]; then SYSREPOCTL=`command -v sysrepoctl -l $USER` else SYSREPOCTL=`command -v sysrepoctl` fi MODDIR=${SEARCH_PATH} PERMS="660" #OWNER=root #GROUP=wheel CMD_INSTALL= # functions INSTALL_MODULE_CMD() { if [ -z "${CMD_INSTALL}" ]; then CMD_INSTALL="'$SYSREPOCTL' -s $MODDIR -v2" fi CMD_INSTALL="$CMD_INSTALL -i $MODDIR/$1 -p '$PERMS'" if [ ! -z "${OWNER}" ]; then CMD_INSTALL="$CMD_INSTALL -o '$OWNER'" fi if [ ! -z "${GROUP}" ]; then CMD_INSTALL="$CMD_INSTALL -g '$GROUP'" fi } UPDATE_MODULE() { CMD="'$SYSREPOCTL' -U $MODDIR/$1 -s '$MODDIR -v2" eval $CMD local rc=$? if [ $rc -ne 0 ]; then exit $rc fi } CHANGE_PERMS() { CMD="'$SYSREPOCTL' -c $1 -p '$PERMS' -v2" if [ ! -z "${OWNER}" ]; then CMD="$CMD -o '$OWNER'" fi if [ ! -z "${GROUP}" ]; then CMD="$CMD -g '$GROUP'" fi eval $CMD local rc=$? if [ $rc -ne 0 ]; then exit $rc fi } ENABLE_FEATURE() { "$SYSREPOCTL" -c $1 -e $2 -v2 local rc=$? if [ $rc -ne 0 ]; then exit $rc fi } # get current modules SCTL_MODULES=`$SYSREPOCTL -l` for i in "${MODULES[@]}"; do name=`echo "$i" | sed 's/\([^@]*\).*/\1/'` SCTL_MODULE=`echo "$SCTL_MODULES" | grep "^$name \+|[^|]*| I"` if [ -z "$SCTL_MODULE" ]; then # prepare command to install module with all its features INSTALL_MODULE_CMD "$i" continue fi sctl_revision=`echo "$SCTL_MODULE" | sed 's/[^|]*| \([^ ]*\).*/\1/'` revision=`echo "$i" | sed 's/[^@]*@\([^\.]*\).*/\1/'` if [ "$sctl_revision" \< "$revision" ]; then # update module without any features file=`echo "$i" | cut -d' ' -f 1` UPDATE_MODULE "$file" fi sctl_owner=`echo "$SCTL_MODULE" | sed 's/\([^|]*|\)\{3\} \([^:]*\).*/\2/'` sctl_group=`echo "$SCTL_MODULE" | sed 's/\([^|]*|\)\{3\}[^:]*:\([^ ]*\).*/\2/'` sctl_perms=`echo "$SCTL_MODULE" | sed 's/\([^|]*|\)\{4\} \([^ ]*\).*/\2/'` if [ "$sctl_perms" != "$PERMS" ]; then # change permissions/owner CHANGE_PERMS "$name" fi # parse sysrepoctl features and add extra space at the end for easier matching sctl_features="`echo "$SCTL_MODULE" | sed 's/\([^|]*|\)\{6\}\(.*\)/\2/'` " # parse features we want to enable features=`echo "$i" | sed 's/[^ ]* \(.*\)/\1/'` while [ "${features:0:3}" = "-e " ]; do # skip "-e " features=${features:3} # parse feature feature=`echo "$features" | sed 's/\([^[:space:]]*\).*/\1/'` # enable feature if not already sctl_feature=`echo "$sctl_features" | grep " ${feature} "` if [ -z "$sctl_feature" ]; then # enable feature ENABLE_FEATURE $name $feature fi # next iteration, skip this feature features=`echo "$features" | sed 's/[^[:space:]]* \(.*\)/\1/'` done done # install all the new modules if [ ! -z "${CMD_INSTALL}" ]; then eval $CMD_INSTALL rc=$? if [ $rc -ne 0 ]; then exit $rc fi fi