mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-22 09:13:01 +02:00
174 lines
4.5 KiB
Bash
Executable File
174 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# This is based on scripts/setup.sh from Netopeer2/libnetconf2
|
|
#
|
|
#set -x
|
|
|
|
# Source the include file, which contain the list of YANG models and
|
|
# 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"
|
|
else
|
|
SYSREPOCTL=sysrepoctl
|
|
fi
|
|
|
|
PERMS="660"
|
|
#OWNER=root
|
|
#GROUP=wheel
|
|
|
|
CMD_INSTALL=
|
|
|
|
|
|
install()
|
|
{
|
|
if [ -z "${CMD_INSTALL}" ]; then
|
|
CMD_INSTALL="'$SYSREPOCTL' -s $MODDIR -v2"
|
|
fi
|
|
CMD_INSTALL="$CMD_INSTALL -i $MODDIR/$1 -p '$PERMS'"
|
|
if [ -n "${OWNER}" ]; then
|
|
CMD_INSTALL="$CMD_INSTALL -o '$OWNER'"
|
|
fi
|
|
if [ -n "${GROUP}" ]; then
|
|
CMD_INSTALL="$CMD_INSTALL -g '$GROUP'"
|
|
fi
|
|
}
|
|
|
|
|
|
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
|
|
exit $rc
|
|
fi
|
|
}
|
|
|
|
|
|
enable()
|
|
{
|
|
local module=$1
|
|
local feature=$2
|
|
#echo "*** Enable feature $feature in $module."
|
|
$SYSREPOCTL -c $module -e $feature -v2
|
|
local rc=$?
|
|
if [ $rc -ne 0 ]; then
|
|
exit $rc
|
|
fi
|
|
}
|
|
|
|
# Skip first 5 lines of header and last 3 lines of footer
|
|
SCTL_MODULES=$($SYSREPOCTL -l |tail -n +5 |head -n -3)
|
|
|
|
for module in "${MODULES[@]}"; do
|
|
name=$(echo "$module" | awk '{match($1, /[^@.]+/); print substr($1, RSTART, RLENGTH)}')
|
|
date=$(echo "$module" | awk -F'[@.]' '{print $2}')
|
|
for dir in $SEARCH_PATH; do
|
|
if [ -n "${date}" ]; then
|
|
yang=${name}@${date}.yang
|
|
else
|
|
yang=${name}.yang
|
|
fi
|
|
if [ -f "${dir}/${yang}" ]; then
|
|
MODDIR="${dir}"
|
|
fi
|
|
done
|
|
|
|
# If no .yang we just modfify an existing model
|
|
if [[ "$module" == *.yang* && -z "$MODDIR" ]]; then
|
|
echo "Could not find ${yang} in ${SEARCH_PATH}"
|
|
exit 1
|
|
fi
|
|
|
|
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"
|
|
continue
|
|
fi
|
|
|
|
rev=$(echo "$SCTL_MODULE" | awk '{print $3}')
|
|
if [ -n "$date" ] && [ "$rev" != "$date" ] || echo "$FORCE_UPDATE" | grep -qw "$name"; then
|
|
# update module without any features
|
|
file=$(echo "$module" | cut -d' ' -f 1)
|
|
echo "*** Updating YANG model $name ($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/')
|
|
if [ "$sctl_perms" != "$PERMS" ]; then
|
|
# change permissions/owner
|
|
echo "*** Changing YANG model $name permissions ..."
|
|
chperm "$name"
|
|
fi
|
|
|
|
sctl_features="`echo "$SCTL_MODULE" | awk -F '|' '{print $NF}' | xargs`"
|
|
# parse features we want to enable
|
|
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/')
|
|
|
|
# enable feature if not already
|
|
sctl_feature=$(echo "$sctl_features" | grep " ${feature} ")
|
|
if [ -z "$sctl_feature" ]; then
|
|
# enable feature
|
|
enable "$name" "$feature"
|
|
fi
|
|
|
|
# next iteration, skip this feature
|
|
features=$(echo "$features" | sed 's/[^[:space:]]* \(.*\)/\1/')
|
|
done
|
|
done
|
|
|
|
# install all the new modules
|
|
if [ -n "${CMD_INSTALL}" ]; then
|
|
printf "*** Installing YANG models from %s ...\n%s" "$(basename "$1")" "$CMD_INSTALL"
|
|
eval $CMD_INSTALL
|
|
rc=$?
|
|
if [ $rc -ne 0 ]; then
|
|
exit $rc
|
|
fi
|
|
fi
|