diff --git a/src/confd/yang/confd.inc b/src/confd/yang/confd.inc index e48c492f..0a635413 100644 --- a/src/confd/yang/confd.inc +++ b/src/confd/yang/confd.inc @@ -1,5 +1,6 @@ # -*- sh -*- # REMEMBER TO UPDATE infix-interfaces ALSO IN containers.inc +#FORCE_UPDATE="infix-interfaces" MODULES=( "ietf-system@2014-08-06.yang -e authentication -e local-users -e ntp -e ntp-udp-port -e timezone-name" "iana-timezones@2013-11-19.yang" diff --git a/utils/sysrepo-load-modules.sh b/utils/sysrepo-load-modules.sh index a50fae58..fabad4d1 100755 --- a/utils/sysrepo-load-modules.sh +++ b/utils/sysrepo-load-modules.sh @@ -7,16 +7,17 @@ # their respective enabled features in a MODULES array. # Example: # MODULES=("module@revision -e feature1 -e feature2") + +# shellcheck disable=SC1090 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 sysrepoctl -l $USER` +elif [ "$(id -u)" -eq 0 ] && [ -n "$USER" ] && [ -n "$(command -v su)" ]; then + SYSREPOCTL=$(command sysrepoctl -l "$USER") else - SYSREPOCTL=`command sysrepoctl` + SYSREPOCTL=$(command sysrepoctl) fi MODDIR=${SEARCH_PATH} @@ -26,22 +27,54 @@ PERMS="660" CMD_INSTALL= -# functions -INSTALL_MODULE_CMD() { + +install() +{ 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 + if [ -n "${OWNER}" ]; then CMD_INSTALL="$CMD_INSTALL -o '$OWNER'" fi - if [ ! -z "${GROUP}" ]; then + if [ -n "${GROUP}" ]; then CMD_INSTALL="$CMD_INSTALL -g '$GROUP'" fi } -UPDATE_MODULE() { - CMD="'$SYSREPOCTL' -U $MODDIR/$1 -s '$MODDIR' -v2" + +update() +{ + local module="$1" + local cmd="'$SYSREPOCTL' -U $MODDIR/$module -s '$MODDIR' -v2" + + local output rc + output=$(eval "$cmd" 2>&1) + rc=$? + + if [ $rc -ne 0 ]; then + if echo "$output" | grep -q "Module .* already installed"; then + echo "*** Warning: Module $module is already installed. Skipping update." + return 0 + fi + echo "*** Error: failed updating module $module: $output" >&2 + return $rc + fi + + echo "*** Successfully updated module $module." + return 0 +} + + +chperm() +{ + CMD="'$SYSREPOCTL' -c $1 -p '$PERMS' -v2" + if [ -n "${OWNER}" ]; then + CMD="$CMD -o '$OWNER'" + fi + if [ -n "${GROUP}" ]; then + CMD="$CMD -g '$GROUP'" + fi eval "$CMD" local rc=$? if [ $rc -ne 0 ]; then @@ -49,79 +82,68 @@ UPDATE_MODULE() { 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 + +enable() +{ + $SYSREPOCTL -c "$1" -e "$2" -v2 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/'` +# Skip first 5 lines of header and last 3 lines of footer +SCTL_MODULES=$($SYSREPOCTL -l |tail -n +5 |head -n -3) - SCTL_MODULE=`echo "$SCTL_MODULES" | grep "^$name \+|[^|]*| I"` +for module in "${MODULES[@]}"; do + name=$(echo "$module" | awk -F'[@.]' '{print $1}') + date=$(echo "$module" | awk -F'[@.]' '{print $2}') + + SCTL_MODULE=$(echo "$SCTL_MODULES" | grep "^$name \+|[^|]*| I") if [ -z "$SCTL_MODULE" ]; then # prepare command to install module with all its features echo "*** Installing YANG model $name ..." - INSTALL_MODULE_CMD "$i" + install "$module" continue fi - sctl_revision=`echo "$SCTL_MODULE" | sed 's/[^|]*| \([^ ]*\).*/\1/'` - revision=`echo "$i" | sed 's/[^@]*@\([^\.]*\).*/\1/'` - if [ "$sctl_revision" \< "$revision" ]; then + rev=$(echo "$SCTL_MODULE" | awk '{print $3}') + if [ "$rev" != "$date" ] || echo "$FORCE_UPDATE" | grep -qw "$name"; then # update module without any features - file=`echo "$i" | cut -d' ' -f 1` + file=$(echo "$module" | cut -d' ' -f 1) echo "*** Updating YANG model $name ($file) ..." - UPDATE_MODULE "$file" + update "$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/'` + #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 echo "*** Changing YANG model $name permissions ..." - CHANGE_PERMS "$name" + chperm "$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/'` + features=`echo "$module" | sed 's/[^ ]* \(.*\)/\1/'` while [ "${features:0:3}" = "-e " ]; do # skip "-e " features=${features:3} # parse feature - feature=`echo "$features" | sed 's/\([^[:space:]]*\).*/\1/'` + feature=$(echo "$features" | sed 's/\([^[:space:]]*\).*/\1/') # enable feature if not already - sctl_feature=`echo "$sctl_features" | grep " ${feature} "` + sctl_feature=$(echo "$sctl_features" | grep " ${feature} ") if [ -z "$sctl_feature" ]; then # enable feature - ENABLE_FEATURE $name $feature + enable "$name" "$feature" fi # next iteration, skip this feature - features=`echo "$features" | sed 's/[^[:space:]]* \(.*\)/\1/'` + features=$(echo "$features" | sed 's/[^[:space:]]* \(.*\)/\1/') done done