#!/bin/sh set -e # TODO: convert data handling to DBD::AnyData # make data writable both from kannel and designated shell accounts umask 0007 vardir=/var/lib/kannel/hello sbindir=/usr/local/sbin exit0() { [ -n "$1" ] && echo "$1" exit 0 } exit1() { response="${1:+Error: }${1:-Internal error!}" # FIXME: pass error messages via stderr (not stdout) # echo >&2 "$response" echo "$response" exit 1 } findobjects() { set -e type="$1"; [ -n "$type" ] || return1 "Internal error (findobjects: empty type)!"; shift limit="$@" regex="$(echo "$limit" | perl -ne '/^\/(.+)\/$/ and print $1')" args="$(echo "$limit" | perl -ne 's/.*?([a-z0-9]+).*?/ $1/g and print')" [ -d "$vardir/$type" ] || exit0 if [ -z "$*" ]; then cd "$vardir/$type" && find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' elif [ -n "$regex" ]; then cd "$vardir/$type" && find -mindepth 1 -maxdepth 1 -type d -regex "$regex" elif [ -n "$args" ]; then args_multiline="$(echo "$args" | perl -pe 's/[[:space:]]+/\n/g')" cd "$vardir/$type" && ! find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' \ | grep -Fx "$args_multiline" || true else exit1 "Internal error (findobjects: illegal limit)!" fi } finditems() { set -e type="$1"; [ -n "$type" ] || exit1 "Internal error (finditems: empty type)!"; shift name="$1"; [ -n "$name" ] || exit1 "Internal error (finditems: empty name)!"; shift limit="$@" regex="$(echo "$limit" | perl -ne '/^\/(.+)\/$/ and print $1')" args="$(echo "$limit" | perl -ne 's/.*?([a-z0-9]+).*?/ $1/g and print')" dir="$type/$name" [ -d "$vardir/$dir" ] || exit0 if [ -z "$*" ]; then cd "$vardir/$dir" && find -mindepth 1 -maxdepth 1 -type f -printf '%f\n' elif [ -n "$regex" ]; then cd "$vardir/$dir" && find -mindepth 1 -maxdepth 1 -type f -regex "$regex" elif [ -n $args ]; then args_multiline="$(echo "$args" | perl -pe 's/[[:space:]]+/\n/g')" cd "$vardir/$dir" && ! find -mindepth 1 -maxdepth 1 -type f -printf '%f\n' \ | grep -Fx "$args_multiline" || true else exit1 "Internal error (finditems: illegal limit)!" fi } getitem() { set -e set -x type="$1"; [ -n "$type" ] || exit1 "Internal error (getitem: empty type)!"; shift name="$1"; [ -n "$name" ] || exit1 "Internal error (getitem: empty name)!"; shift item="$1"; [ -n "$item" ] || exit1 "Internal error (getitem: empty item)!"; shift file="$type/$name/$item" [ ! -s "$vardir/$file" ] || cat "$vardir/$file" } additem() { set -e type="$1"; [ -n "$type" ] || exit1 "Internal error (additem: empty type)!"; shift name="$1"; [ -n "$name" ] || exit1 "Internal error (additem: empty name)!"; shift item="$1"; [ -n "$item" ] || exit1 "Internal error (additem: empty item)!"; shift data="$*"; [ -n "$data" ] || exit1 "Internal error (additem: empty data)!"; shift data="$(echo "$data" | perl -0 -pe 's/\s+/ /g; s/^\s+//; s/\s+$//')" truename="$(findobjects "$type" "$name")" || exit1 "$truename" [ -n "$truename" ] || exit1 "No $type named \"$name\"!" file="$type/$truename/$item" # [ ! -s "$vardir/$file" ] || linecount="$(grep -c . "$vardir/$file")" # echo "$data" >> "$vardir/$file" # chgrp --reference="$vardir" "$vardir/$file" # echo "$data${linecount+ (on top of $linecount other values)}" [ ! -s "$vardir/$file" ] || linecount="$(grep -c . "$vardir/$file")" echo "$data" > "$vardir/$file" # chgrp --reference="$vardir" "$vardir/$file" echo "$data" } addobject() { set -e type="$1"; [ -n "$type" ] || exit1 "Internal error (addobject: empty type)!"; shift name="$1"; [ -n "$name" ] || exit1 "Internal error (addobject: empty name)!"; shift fallback="$1"; [ -n "$fallback" ] || exit1 "Internal error (addobject: empty fallback)!"; shift [ -z "$*" ] || exit1 "Internal error (addobject: too many options)!" case "$fallback" in keep|replace|fail) :;; *) exit1 "Internal error (addobject: unknown fallback)!";; esac # if [ -e "$vardir/$type/$name" ]; then oldname="$(findobjects "$type" "$name")" || exit1 "$oldname" if [ -n "$oldname" ]; then case "$fallback" in keep) action="kept" ;; replace) delopbject "$type" "$oldname" ;; # TODO rename) # TODO renameopbject "$type" "$oldname" # TODO ;; fail) exit1 "Adding $type failed ($name already exists)!" ;; esac else mkdir -p "$vardir/$type/$name" # chgrp -R --reference="$vardir" "$vardir/$type" fi } cmd="$1"; shift case "$cmd" in add|create) type="$1"; [ -n "$type" ] || exit1 "Internal error (empty type)!"; shift case "$type" in help) cat <