summaryrefslogtreecommitdiff
path: root/localkannel-dispatch
blob: f1fcf5fb53d2cecec7485156553f44ec75a7f991 (plain)
  1. #!/bin/sh
  2. set -e
  3. vardir=/var/lib/kannel/hello
  4. sbindir=/usr/local/sbin
  5. exit0() {
  6. [ -n "$1" ] && echo "$1"
  7. exit 0
  8. }
  9. exit1() {
  10. [ -z "$1" ] || echo "Error: $1" || echo "Internal error!"
  11. response="${1+Error: $1}${-Internal error!}"
  12. # FIXME: pass error messages via stderr (not stdout)
  13. # echo >&2 "$response"
  14. echo "$response"
  15. [ -z "$SMS_SMSC$SMS_URL" ] || $sbindir/localsendsms "$to" "$response"
  16. exit 1
  17. }
  18. simpleword() {
  19. # echo "$1" | tr '[A-Z]' '[a-z]' | egrep '^[a-z][a-z0-9-]+$' || exit 1
  20. echo "$1" | tr '[A-Z]' '[a-z]' | egrep '^[a-zæøåÆØÅ!@/][a-zæøåÆØÅ0-9-]+$' || exit 1
  21. }
  22. uriunescape() {
  23. if [ 0 = "$urldecode" ]; then
  24. echo "$@"
  25. else
  26. echo "$@" | perl -e 'use URI::Escape; print lc(uri_unescape(<STDIN>));'
  27. fi
  28. }
  29. #from=`uriunescape "$1" | sed -e 's/\+/ /g'`; shift
  30. from=`uriunescape "$1"`; shift
  31. #to=`uriunescape "$1" | sed -e 's/\+/ /g'`; shift
  32. to=`uriunescape "$1"`; shift
  33. set -- `uriunescape "$@" | sed -e 's/\+/ /g'`
  34. #set -- `uriunescape "$@"`
  35. app_raw="$1"
  36. app=`simpleword "$1"`; shift
  37. export debug
  38. SMS_PHONE="$from"
  39. urldecode=0
  40. export SMS_PHONE urldecode
  41. case "$SMS_REALM" in
  42. test)
  43. provider="dummy"
  44. mdpath="/home/hearth/public_webdata/hearth/content/sms"
  45. export mdpath
  46. ;;
  47. hello)
  48. provider="local"
  49. # provider="coolsms"
  50. # provider="clickatell"
  51. mdpath="/home/hearth/public_webdata/hearth/content/sms"
  52. export mdpath
  53. ;;
  54. cyber)
  55. provider="local"
  56. mdpath="/home/cyberhus/public_webdata/mdsms/content/sms"
  57. export mdpath
  58. ;;
  59. *)
  60. exit1 "unknown realm \"$SMS_REALM\"!"
  61. ;;
  62. esac
  63. case "$provider" in
  64. dummy)
  65. dummy=1
  66. ADMIN_OK=1
  67. export ADMIN_OK dummy
  68. ;;
  69. local)
  70. export SMS_SMSC
  71. ;;
  72. coolsms)
  73. unset SMS_SMSC
  74. SMS_URL="https://sms.coolsmsc.dk:8081/"
  75. SMS_USER="drjones1"
  76. SMS_PW="rahYSeGY"
  77. SMS_CP="cp1252"
  78. SMS_MSGTAG="message"
  79. export SMS_URL SMS_USER SMS_PW SMS_CP SMS_MSGTAG
  80. ;;
  81. clickatell)
  82. # unset SMS_SMSC
  83. # SMS_URL="https://api.clickatell.com/http/sendmsg"
  84. # SMS_USER="jonas"
  85. # SMS_PW="inaritab6"
  86. # SMS_CP="cp1252"
  87. # SMS_USERTAG="user"
  88. # SMS_API="3231280"
  89. # SMS_CONCAT="3"
  90. # export SMS_URL SMS_USER SMS_PW SMS_CP SMS_USERTAG SMS_API SMS_CONCAT
  91. SMS_SMSC="X"
  92. SMS_DLR_MASK="7"
  93. 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"
  94. SMS_VALIDITY="1"
  95. stripprefix="1"
  96. export SMS_SMSC SMS_DLR_MASK SMS_DLR_URL SMS_VALIDITY stripprefix
  97. ;;
  98. routo)
  99. SMS_SMSC="Y"
  100. export SMS_SMSC
  101. ;;
  102. *)
  103. exit1 "unknown provider \"$provider\"!"
  104. ;;
  105. esac
  106. if [ -n "$REDIRECT_OK" ]; then
  107. case "$app" in
  108. @*)
  109. to="$(echo "$app" | perl -pe 's/^@//;' -e 's/^([^+])/+45\1/')"
  110. # TODO: silence errors - or better: bounce those back to original sender
  111. $sbindir/localmarkdown2sms "$to" "$@"
  112. exit 0
  113. ;;
  114. esac
  115. fi
  116. if [ -n "$GROUP_OK" ]; then
  117. case "$app" in
  118. !*)
  119. group="$(echo "$app" | perl -pe 's/^!//;')"
  120. members=$(cd "$vardir/user" && grep -lF "$group" */group | perl -pe "s,/group$,,") || members=
  121. [ -n "$members" ] || exit1 "Message redirected for none: no members resolved in group \"$group\"!"
  122. for member in $members; do
  123. phone=$(head -n 1 "$vardir/user/$member/phone") || nophone="${nophone+$nophone }$member"
  124. [ -z "$phone" ] || $sbindir/localmarkdown2sms "$phone" "$@"
  125. done
  126. [ -n "$members" ] || exit1 "Message redirected for none: no members resolved in group \"$group\"!"
  127. membercount=$(echo "$members" | wc --word)
  128. [ -z "$nophone" ] || nophonecount=$(echo "$nophone" | wc --word)
  129. [ -z "$nophone" ] || exit1 "Message redirected for $membercount members of group \"$group\", but failed for $nophonecount of them (could not resolve phone number)!"
  130. exit0 "Message redirected for $membercount members of group \"$group\"."
  131. ;;
  132. esac
  133. fi
  134. case "$app" in
  135. /*)
  136. candidates=$(cd "$vardir/user" && grep -lF "$to" */phone | perl -pe "s,/phone$,,") || candidates=
  137. [ -z "$candidates" ] || $(grep -vqF "$candidates" "$vardir/group/admin/user") || admin=true
  138. if [ -n "$ADMIN_OK" ] && [ -n "$admin" ]; then
  139. cmd="$(echo "$app" | perl -pe 's/^\///;')"
  140. str="$($sbindir/localsmsadmin "$cmd" "$@" 2>&1)" || exit1 "$str"
  141. $sbindir/localsendsms "$to" $str
  142. exit 0
  143. fi
  144. ;;
  145. esac
  146. # yb)
  147. # s="$(links -dump "http://www.yubnub.org/parser/parse?command=$@")"
  148. # $sbindir/localsendsms "$to" "$s"
  149. # exit 0
  150. # ;;
  151. $sbindir/localmarkdown2sms "$to" "$app_raw" "$@"