#!/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