summaryrefslogtreecommitdiff
path: root/localkannel-dispatch
blob: 5f1a60fa32e7f0faca12c62ad2ee0c4bf58952c7 (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. response="${1:+Error: }${1:-Internal error!}"
  11. # FIXME: pass error messages via stderr (not stdout)
  12. # echo >&2 "$response"
  13. echo "$response"
  14. [ -z "$SMS_SMSC$SMS_URL" ] || $sbindir/localsendsms "$to" "$response"
  15. exit 1
  16. }
  17. simpleword() {
  18. # echo "$1" | tr '[A-Z]' '[a-z]' | egrep '^[a-z][a-z0-9-]+$' || exit 1
  19. echo "$1" | tr '[A-Z]' '[a-z]' | egrep '^[a-zæøåÆØÅ!@/][a-zæøåÆØÅ0-9-]+$' || exit 1
  20. }
  21. uriunescape() {
  22. if [ 0 = "$urldecode" ]; then
  23. echo "$@"
  24. else
  25. echo "$@" | perl -e 'use URI::Escape; print lc(uri_unescape(<STDIN>));'
  26. fi
  27. }
  28. #from=`uriunescape "$1" | sed -e 's/\+/ /g'`; shift
  29. from=`uriunescape "$1"`; shift
  30. #to=`uriunescape "$1" | sed -e 's/\+/ /g'`; shift
  31. to=`uriunescape "$1"`; shift
  32. set -- `uriunescape "$@" | sed -e 's/\+/ /g'`
  33. #set -- `uriunescape "$@"`
  34. app_raw="$1"
  35. app=`simpleword "$1"`; shift
  36. export debug
  37. SMS_PHONE="$from"
  38. urldecode=0
  39. export SMS_PHONE urldecode
  40. case "$SMS_REALM" in
  41. test)
  42. provider="dummy"
  43. mdpath="/home/hearth/public_webdata/hearth/content/sms"
  44. export mdpath
  45. ;;
  46. hello)
  47. provider="local"
  48. # provider="coolsms"
  49. # provider="clickatell"
  50. mdpath="/home/hearth/public_webdata/hearth/content/sms"
  51. export mdpath
  52. ;;
  53. hellobudapest)
  54. provider="clickatell"
  55. mdpath="/home/www-hearth/public_webdata/hellobudapest/content/sms"
  56. export mdpath
  57. ;;
  58. hellotorino)
  59. provider="clickatell"
  60. mdpath="/home/www-hearth/public_webdata/hellotorino/content/sms"
  61. export mdpath
  62. ;;
  63. cyber)
  64. provider="local"
  65. mdpath="/home/cyberhus/public_webdata/mdsms/content/sms"
  66. export mdpath
  67. ;;
  68. *)
  69. exit1 "unknown realm \"$SMS_REALM\"!"
  70. ;;
  71. esac
  72. case "$provider" in
  73. dummy)
  74. dummy=1
  75. ADMIN_OK=1
  76. export ADMIN_OK dummy
  77. ;;
  78. local)
  79. export SMS_SMSC
  80. ;;
  81. coolsms)
  82. unset SMS_SMSC
  83. SMS_URL="https://sms.coolsmsc.dk:8081/"
  84. SMS_USER="drjones1"
  85. SMS_PW="rahYSeGY"
  86. SMS_CP="cp1252"
  87. SMS_MSGTAG="message"
  88. export SMS_URL SMS_USER SMS_PW SMS_CP SMS_MSGTAG
  89. ;;
  90. # supports concatenation and req_feat (e.g 48: sender ID)
  91. # does not support DLR, and only concatenates max. 3 smses
  92. clickatell)
  93. unset SMS_SMSC
  94. SMS_URL="https://api.clickatell.com/http/sendmsg"
  95. SMS_USER="jonas"
  96. SMS_PW="inaritab6"
  97. SMS_CP="iso8859-1"
  98. SMS_USERTAG="user"
  99. SMS_API="3231280"
  100. SMS_CONCAT="3"
  101. SMS_ESCALATE="1"
  102. SMS_VALIDITY="1"
  103. SMS_REQ_FEAT="24611" # 1+2+32+8192+16384 = text+8bit+numeric_src+dlr+concat
  104. stripprefix="1"
  105. export SMS_URL SMS_USER SMS_PW SMS_CP SMS_USERTAG SMS_API SMS_CONCAT SMS_ESCALATE SMS_VALIDITY SMS_REQ_FEAT stripprefix
  106. ;;
  107. # supports DLR
  108. # Kannel clickatell profile supports concatenation but not req_feat
  109. # Kannel generic profile supports req_feat but not concatenation
  110. clickatell_via_kannel)
  111. SMS_SMSC="X"
  112. SMS_CONCATENATION="1"
  113. SMS_DLR_MASK="7"
  114. 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"
  115. SMS_CP="iso8859-1"
  116. SMS_VALIDITY="1"
  117. SMS_BINFO="req_feat=24611&concat=3&escalate=1%validity=1" # 1+2+32+8192+16384 = text+8bit+numeric_src+dlr+concat
  118. stripprefix="1"
  119. export SMS_SMSC SMS_CONCATENATION SMS_DLR_MASK SMS_DLR_URL SMS_CP SMS_VALIDITY SMS_BINFO stripprefix
  120. ;;
  121. routo_via_kannel)
  122. SMS_SMSC="Y"
  123. export SMS_SMSC
  124. ;;
  125. *)
  126. exit1 "unknown provider \"$provider\"!"
  127. ;;
  128. esac
  129. # FIXME: some safety net against abusing this imposter feature
  130. #if [ -n "$REDIRECT_OK" ]; then
  131. case "$app" in
  132. @*)
  133. # FIXME: Avoid hardcoding national prefix
  134. to="$(echo "$app" | perl -pe 's/^@//;' -e 's/^([^+])/+39\1/')"
  135. # TODO: silence errors - or better: bounce those back to original sender
  136. $sbindir/localmarkdown2sms "$to" "$@"
  137. exit 0
  138. ;;
  139. esac
  140. #fi
  141. if [ -n "$GROUP_OK" ]; then
  142. case "$app" in
  143. !*)
  144. group="$(echo "$app" | perl -pe 's/^!//;')"
  145. members=$(cd "$vardir/user" && grep -lF "$group" */group | perl -pe "s,/group$,,") || members=
  146. [ -n "$members" ] || exit1 "Message redirected for none: no members resolved in group \"$group\"!"
  147. for member in $members; do
  148. phone=$(head -n 1 "$vardir/user/$member/phone") || nophone="${nophone+$nophone }$member"
  149. [ -z "$phone" ] || $sbindir/localmarkdown2sms "$phone" "$@"
  150. done
  151. [ -n "$members" ] || exit1 "Message redirected for none: no members resolved in group \"$group\"!"
  152. membercount=$(echo "$members" | wc --word)
  153. [ -z "$nophone" ] || nophonecount=$(echo "$nophone" | wc --word)
  154. [ -z "$nophone" ] || exit1 "Message redirected for $membercount members of group \"$group\", but failed for $nophonecount of them (could not resolve phone number)!"
  155. exit0 "Message redirected for $membercount members of group \"$group\"."
  156. ;;
  157. esac
  158. fi
  159. case "$app" in
  160. /*)
  161. cmd="$(echo "$app" | perl -pe 's/^\///;')"
  162. case "$cmd" in
  163. ping)
  164. if [ "help" = "$1" ]; then
  165. $sbindir/localsendsms "$to" "Usage:
  166. /ping [...]
  167. Respond \"pong\" and echo back any addition input."
  168. else
  169. $sbindir/localsendsms "$to" pong "$@"
  170. fi
  171. exit 0
  172. ;;
  173. esac
  174. candidates=$(cd "$vardir/user" && grep -lF "$to" */phone | perl -pe "s,/phone$,,") || candidates=
  175. [ -z "$candidates" ] || $(grep -vqF "$candidates" "$vardir/group/admin/user") || admin=true
  176. if [ -n "$ADMIN_OK" ] && [ -n "$admin" ]; then
  177. str="$($sbindir/localsmsadmin "$cmd" "$@" 2>&1)" || exit1 "$str"
  178. $sbindir/localsendsms "$to" $str
  179. exit 0
  180. elif [ "help" = "$cmd" ]; then
  181. $sbindir/localsendsms "$to" "Commands:
  182. /ping [...]
  183. /COMMAND help
  184. /help
  185. try e.g. \"/del help\"."
  186. exit 0
  187. fi
  188. ;;
  189. esac
  190. #FIXME: if sender has a mission, check for "done": process missionpending and report result to mission members
  191. # yb)
  192. # s="$(links -dump "http://www.yubnub.org/parser/parse?command=$@")"
  193. # $sbindir/localsendsms "$to" "$s"
  194. # exit 0
  195. # ;;
  196. $sbindir/localmarkdown2sms "$to" "$app_raw" "$@"