#!/bin/sh set -e exit1() { echo >&2 "Error: $1" echo >&2 "Exiting..." exit 1 } simpleword() { # echo "$1" | tr '[A-Z]' '[a-z]' | egrep '^[a-z][a-z0-9-]+$' || exit 1 echo "$1" | tr '[A-Z]' '[a-z]' | egrep '^[a-zæøåÆØÅ!@/][a-zæøåÆØÅ0-9-]+$' || exit 1 } uriunescape() { if [ 0 = "$urldecode" ]; then echo "$@" else echo "$@" | perl -e 'use URI::Escape; print lc(uri_unescape());' fi } #from=`uriunescape "$1" | sed -e 's/\+/ /g'`; shift from=`uriunescape "$1"`; shift #to=`uriunescape "$1" | sed -e 's/\+/ /g'`; shift to=`uriunescape "$1"`; shift #set -- `uriunescape "$@" | sed -e 's/\+/ /g'` set -- `uriunescape "$@"` app_raw="$1" app=`simpleword "$1"`; shift export debug SMS_PHONE="$from" urldecode=0 export SMS_PHONE urldecode case "$SMS_REALM" in test) provider="dummy" mdpath="/home/hearth/public_webdata/hearth/content/sms" export mdpath ;; hello) provider="local" # provider="coolsms" # provider="clickatell" mdpath="/home/hearth/public_webdata/hearth/content/sms" export mdpath ;; cyber) provider="local" mdpath="/home/cyberhus/public_webdata/mdsms/content/sms" export mdpath ;; *) exit1 "unknown realm \"$SMS_REALM\"" ;; esac case "$provider" in dummy) dummy=1 ADMIN_OK=1 export ADMIN_OK dummy ;; local) export SMS_SMSC ;; coolsms) unset SMS_SMSC SMS_URL="https://sms.coolsmsc.dk:8081/" SMS_USER="drjones1" SMS_PW="rahYSeGY" SMS_CP="cp1252" SMS_MSGTAG="message" export SMS_URL SMS_USER SMS_PW SMS_CP SMS_MSGTAG ;; clickatell) # unset SMS_SMSC # SMS_URL="https://api.clickatell.com/http/sendmsg" # SMS_USER="jonas" # SMS_PW="inaritab6" # SMS_CP="cp1252" # SMS_USERTAG="user" # SMS_API="3231280" # SMS_CONCAT="3" # export SMS_URL SMS_USER SMS_PW SMS_CP SMS_USERTAG SMS_API SMS_CONCAT SMS_SMSC="X" SMS_DLR_MASK="7" SMS_DLR_URL="http://helloearth.jones.dk/test.cgi?type=dlr&msgid=XXX&smsid=%I&from=%p&to=%P&time=%t&unixtime=%T&dlr=%d&dlrmsg=%A" export SMS_SMSC SMS_DLR_MASK SMS_DLR_URL ;; *) exit1 "unknown provider \"$provider\"" ;; esac # by now sms connection should work, so let sender get errors too exit1() { echo >&2 "Error: $1" /usr/local/sbin/localsendsms "$to" "Error: $1" echo >&2 "Exiting..." exit 1 } return1() { echo >&2 "Error: $1" echo "$1" exit 1 } vardir="/var/lib/kannel/hello" 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" ] || return 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 return1 "Internal error (findobjects: illegal limit)!" fi } addobject() { set -e type="$1"; [ -n "$type" ] || return1 "Internal error (addobject: empty type)!"; shift name="$1"; [ -n "$name" ] || return1 "Internal error (addobject: empty name)!"; shift oldname="$(findobjects "$type" "$name")" || return1 "$oldname" [ -z "$oldname" ] || return1 "$type \"$name\" already exist." mkdir -p "$vardir/$type/$name" chgrp --reference="$vardir" "$vardir/$type/$name" echo "$name" } delobject() { set -e type="$1"; [ -n "$type" ] || return1 "Internal error (delobject: empty type)!"; shift name="$1"; [ -n "$name" ] || return1 "Internal error (delobject: empty name)!"; shift oldname="$(findobjects "$type" "$name")" || return1 "$oldname" [ -n "$oldname" ] || return1 "No $type named \"$name\" (typo? or perhaps already deleted?)." rmdir "$vardir/$type/$name" echo "$name" } case "$app" in @*) [ -n "$REDIRECT_OK" ] || exit1 "Redirection not permitted here!" to="$(echo "$app" | perl -pe 's/^@//;' -e 's/^([^+])/+45\1/')" # TODO: silence errors - or better: bounce those back to original sender /usr/local/sbin/localmarkdown2sms "$to" "$@" ;; # !*) # [ -n "$GROUP_OK" ] || exit1 "Redirection to group not permitted here!" # group="$(echo "$app" | perl -pe 's/^!//;')" # for to in $(echo "$group" | perl ...); do # /usr/local/sbin/localmarkdown2sms "$to" "$@" # done # ;; /*) [ -n "$ADMIN_OK" ] || exit1 "Administrative commands not permitted here!" cmd="$(echo "$app" | perl -pe 's/^\///;')" case "$cmd" in add|create) case "$1" in user|group) type="$1"; shift response="$(addobject "$type" "$@")" || exit1 "Failed adding $type${response+: $response}!" /usr/local/sbin/localsendsms "$to" "Added $type: $response." ;; *) exit1 "Cannot add \"$1\" (try \"add user\" or \"add group\" instead)." ;; esac ;; del|delete|remove) case "$1" in user|group) type="$1"; shift response="$(delobject "$type" "$@")" || exit1 "Failed deleting $type${respnse+: $response}!" /usr/local/sbin/localsendsms "$to" "Deleted $type: $response." ;; *) exit1 "Cannot delete \"$1\" (try \"del user\" or \"del group\" instead)." ;; esac ;; status) msg="$(/usr/local/sbin/localshowkannelstatus)" /usr/local/sbin/localsendsms "$to" "$msg" ;; *) exit1 "unknown command \"$cmd\"" ;; esac ;; yb) s="$(links -dump "http://www.yubnub.org/parser/parse?command=$@")" /usr/local/sbin/localsendsms "$to" "$s" ;; *) /usr/local/sbin/localmarkdown2sms "$to" "$app_raw" "$@" ;; esac