Fixed disco-fs-diff to only use rsync, sed, grep, etc to produce the filesystem changelog, python script is gone Minor fixups to other scripts
143 lines
3.9 KiB
Bash
Executable File
143 lines
3.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
PARAMROOT=/var/disco/parameters
|
|
|
|
function check_names_regex() {
|
|
echo $1 | grep -E '^[a-zA-Z0-9_\-\.\/]*$' >/dev/null 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
echo "error: Invalid characters in pathname '$1'. Valid pathname characters are [a-zA-Z0-9_-.\/]*." >&2
|
|
exit 1
|
|
fi
|
|
echo "$1" | grep "^/" >/dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
echo "error: Pathnames cannot start with /" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function disco_delete() {
|
|
if [ "$1" == "--help" ] || [ "$1" == "" ]; then
|
|
echo "info: disco-param delete [PATH_NAME] [optarg]... deletes parameter trees (recursively, if optarg is '-r'). PATH_NAME must not be empty." >&2
|
|
exit 1
|
|
fi
|
|
check_names_regex "$1" || exit 1
|
|
cd ${PARAMROOT}
|
|
if [ "$2" == "-r" ]; then
|
|
OUT=$(rm -rf ${1} 2>&1)
|
|
elif [ -d ${PARAMROOT}/${1} ]; then
|
|
# We want the error message from rmdir to have just the key path, not the param root in it
|
|
OUT=$(rmdir ${1} 2>&1)
|
|
else
|
|
OUT=$(rm -f ${1} 2>&1)
|
|
fi
|
|
if [ "$OUT" != "" ]; then
|
|
echo "error: $OUT" >&2
|
|
exit 1
|
|
fi
|
|
exit 0
|
|
}
|
|
|
|
function disco_set() {
|
|
if [ "$1" == "--help" ]; then
|
|
echo "info: disco-param set [PATH_NAME] [optarg] ... reads from stdin and sets PATH_NAME, unless [optarg] is {}, in which case a new hierarchy is made" >&2
|
|
echo "info: disco-param set - .... Reads lines from stdin, with each line being PATH_NAME=VALUE, and performs 'set' for each pair." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$1" == "-" ]; then
|
|
RETVAL=0
|
|
while read LINE
|
|
do
|
|
PATHNAME=$(echo $LINE | cut -d = -f 1)
|
|
VALUE=$(echo $LINE | cut -d = -f 2-| sed s/"^\s*"//g)
|
|
echo $PATHNAME = $VALUE
|
|
if [ "$VALUE" == "{}" ]; then
|
|
disco_set $PATHNAME "{}"
|
|
else
|
|
echo $VALUE | disco_set $PATHNAME
|
|
fi
|
|
RETVAL=$(expr $RETVAL + $?)
|
|
done
|
|
exit $RETVAL
|
|
fi
|
|
|
|
check_names_regex "$1" || exit 1
|
|
mkdir -p $(dirname ${PARAMROOT}/${1})
|
|
if [ "$2" == "" ]; then
|
|
cat > ${PARAMROOT}/${1}
|
|
elif [ "$2" == "{}" ]; then
|
|
if [ -e ${PARAMROOT}/${1} ] && [ ! -d ${PARAMROOT}/${1} ]; then
|
|
echo "error: ${1} : existing type '$(stat -c '%F' ${PARAMROOT}/${1})' cannot be overriden with type 'directory'." >&2
|
|
exit 1
|
|
fi
|
|
mkdir -p ${PARAMROOT}/${1}
|
|
else
|
|
echo "error: Unknown optarg '$2'." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function disco_keys() {
|
|
if [ "$1" == "--help" ]; then
|
|
echo "info: disco-param keys [PATH_NAME] ... returns a list of all keys present in the toplevel of the given directory" >&2
|
|
exit 1
|
|
fi
|
|
VARPATH=$(echo $1 | sed s/"^\/*"//g)
|
|
check_names_regex "$VARPATH" || exit 1
|
|
if [ -d ${PARAMROOT}/${VARPATH} ]; then
|
|
# Iterate over the path like a key/value dictionary
|
|
cd ${PARAMROOT}/${VARPATH}
|
|
for file in $(ls 2>/dev/null);
|
|
do
|
|
echo $file
|
|
done
|
|
exit 0
|
|
else
|
|
echo "error: $VARPATH does not exist or is not a directory" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function disco_dump() {
|
|
if [ "$1" == "--help" ]; then
|
|
echo "info: disco-param dump [PATH_NAME] ... Print each key/value pair in the tree in PATH_NAME = VALUE format, one per line." >&2
|
|
exit 1
|
|
fi
|
|
VARPATH=$(echo $1 | sed s/"^\/*"//g)
|
|
check_names_regex "$VARPATH" || exit 1
|
|
cd $PARAMROOT
|
|
find $VARPATH | sed s/"^\.\/*"//g | grep -v "^$" | while read line; do if [ -d $line ]; then echo $line = '{}' ; else echo $line = $(cat $line); fi; done | sort -u
|
|
exit 0
|
|
}
|
|
|
|
function disco_get() {
|
|
if [ "$1" == "--help" ]; then
|
|
echo "info: disco-param get [PATH_NAME] ... Get the value of the given path name." >&2
|
|
exit 1
|
|
fi
|
|
VARPATH=$(echo $1 | sed s/"^\/*"//g)
|
|
check_names_regex "$VARPATH" || exit 1
|
|
cd $PARAMROOT
|
|
if [ -d ${PARAMROOT}/${VARPATH} ]; then
|
|
echo '{}'
|
|
else
|
|
cat ${PARAMROOT}/${VARPATH}
|
|
fi
|
|
exit $?
|
|
}
|
|
|
|
if [ "$1" == "--help" ]; then
|
|
echo "info: disco-param [CMD] [OPTIONS] ... execute the given command with the given options, and return zero on success."
|
|
echo
|
|
$0 set --help
|
|
$0 get --help
|
|
$0 dump --help
|
|
$0 delete --help
|
|
$0 keys --help
|
|
exit 0
|
|
fi
|
|
|
|
disco_$1 "$2" "$3" "$4" "$5" "$6"
|
|
exit $?
|
|
# LocalWords: regex
|