summaryrefslogtreecommitdiff
path: root/localsmsadmin
blob: 7b6c8d1701650c723833dd4c84345dc598324407 (plain)
  1. #!/bin/sh
  2. set -e
  3. exit0() {
  4. echo "$1"
  5. exit 0
  6. }
  7. exit1() {
  8. # FIXME: pass error messages via stderr (not stdout)
  9. # echo >&2 "Error: $1"
  10. [ -z "$1" ] || echo "$1"
  11. exit 1
  12. }
  13. vardir="/var/lib/kannel/hello"
  14. findobjects() {
  15. set -e
  16. type="$1"; [ -n "$type" ] || return1 "Internal error (findobjects: empty type)!"; shift
  17. limit="$@"
  18. regex="$(echo "$limit" | perl -ne '/^\/(.+)\/$/ and print $1')"
  19. args="$(echo "$limit" | perl -ne 's/.*?([a-z0-9]+).*?/ $1/g and print')"
  20. [ -d "$vardir/$type" ] || exit0
  21. if [ -z "$*" ]; then
  22. cd "$vardir/$type" && find -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
  23. elif [ -n "$regex" ]; then
  24. cd "$vardir/$type" && find -mindepth 1 -maxdepth 1 -type d -regex "$regex"
  25. elif [ -n $args ]; then
  26. args_multiline="$(echo "$args" | perl -pe 's/[[:space:]]+/\n/g')"
  27. cd "$vardir/$type" && ! find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' \
  28. | grep -Fx "$args_multiline" || true
  29. else
  30. exit1 "Internal error (findobjects: illegal limit)!"
  31. fi
  32. }
  33. finditems() {
  34. set -e
  35. type="$1"; [ -n "$type" ] || exit1 "Internal error (finditems: empty type)!"; shift
  36. name="$1"; [ -n "$name" ] || exit1 "Internal error (finditems: empty name)!"; shift
  37. limit="$@"
  38. regex="$(echo "$limit" | perl -ne '/^\/(.+)\/$/ and print $1')"
  39. args="$(echo "$limit" | perl -ne 's/.*?([a-z0-9]+).*?/ $1/g and print')"
  40. dir="$type/$name"
  41. [ -d "$vardir/$dir" ] || exit0
  42. if [ -z "$*" ]; then
  43. cd "$vardir/$dir" && find -mindepth 1 -maxdepth 1 -type f -printf '%f\n'
  44. elif [ -n "$regex" ]; then
  45. cd "$vardir/$dir" && find -mindepth 1 -maxdepth 1 -type f -regex "$regex"
  46. elif [ -n $args ]; then
  47. args_multiline="$(echo "$args" | perl -pe 's/[[:space:]]+/\n/g')"
  48. cd "$vardir/$dir" && ! find -mindepth 1 -maxdepth 1 -type f -printf '%f\n' \
  49. | grep -Fx "$args_multiline" || true
  50. else
  51. exit1 "Internal error (finditems: illegal limit)!"
  52. fi
  53. }
  54. getitem() {
  55. set -e
  56. type="$1"; [ -n "$type" ] || exit1 "Internal error (getitem: empty type)!"; shift
  57. name="$1"; [ -n "$name" ] || exit1 "Internal error (getitem: empty name)!"; shift
  58. item="$1"; [ -n "$item" ] || exit1 "Internal error (getitem: empty item)!"; shift
  59. file="$type/$name/$item"
  60. [ ! -s "$vardir/$file" ] || cat "$vardir/$file"
  61. }
  62. additem() {
  63. set -e
  64. type="$1"; [ -n "$type" ] || exit1 "Internal error (additem: empty type)!"; shift
  65. name="$1"; [ -n "$name" ] || exit1 "Internal error (additem: empty name)!"; shift
  66. item="$1"; [ -n "$item" ] || exit1 "Internal error (additem: empty item)!"; shift
  67. data="$*"; [ -n "$data" ] || exit1 "Internal error (additem: empty data)!"; shift
  68. data="$(echo "$data" | perl -0 -pe 's/\s+/ /g; s/^\s+//; s/\s+$//')"
  69. truename="$(findobjects "$type" "$name")" || exit1 "$truename"
  70. [ -n "$truename" ] || exit1 "No $type named \"$name\"!"
  71. file="$type/$truename/$item"
  72. [ ! -s "$vardir/$file" ] || linecount="$(grep -c . "$vardir/$file")"
  73. echo "$data" >> "$vardir/$file"
  74. chgrp --reference="$vardir" "$vardir/$file"
  75. echo "$data${linecount+ (on top of $linecount other values)}"
  76. }
  77. addobject() {
  78. set -e
  79. type="$1"; [ -n "$type" ] || exit1 "Internal error (addobject: empty type)!"; shift
  80. name="$1"; [ -n "$name" ] || exit1 "Internal error (addobject: empty name)!"; shift
  81. oldname="$(findobjects "$type" "$name")" || exit1 "$oldname"
  82. [ -z "$oldname" ] || exit1 "$type \"$name\" already exist!"
  83. case "$type" in
  84. user)
  85. session="$(findobjects "session" "default")" || exit1 "$truename"
  86. [ -z "$session" ] || phone_ccc="$(finditems "session" "$session" "phone_ccc")" || exit1 "$phone_ccc"
  87. for chunk in $@; do
  88. case $chunk in
  89. +[[:digit:]]*)
  90. [ -z "$phone" ] || exit1 "Multiple phone numbers (use only a single number, e.g. 40843136 or +4540843136)!"
  91. phone_ccc="$chunk"
  92. ;;
  93. [[:digit:]][[:digit:]][[:digit:]][[:digit:]]*)
  94. [ -n "$phone_ccc" ] || [ -n "$phone_ccc_default" ] || exit1 "Unknown country calling code (use international phone numbering, e.g. +4540843136)!"
  95. [ -z "$phone" ] || exit1 "Multiple phone numbers (use only a single number, e.g. 40843136 or +4540843136)!"
  96. # TODO: optionally validate $phone_min and $phone_max
  97. phone="$phone_ccc$chunk"
  98. ;;
  99. [[:alpha:]][[:alnum:]]*)
  100. [ -z "$nick" ] || exit1 "Multiple nick names (use only a single nick name)!"
  101. nick="$chunk"
  102. ;;
  103. *)
  104. exit1 "Internal error (additems: unknown item)!"
  105. ;;
  106. esac
  107. done
  108. [ -n "$phone" ] || exit1 "Missing phone number (use a single full number, e.g. 40843136 or +4540843136)!"
  109. [ -n "$nick" ] || exit1 "Missing nick name!"
  110. ;;
  111. esac
  112. mkdir -p "$vardir/$type/$name"
  113. chgrp --reference="$vardir" "$vardir/$type/$name"
  114. case "$type" in
  115. user)
  116. additem "$type" "$name" "nick" "$nick"
  117. additem "$type" "$name" "phone" "$phone"
  118. details="with nick and phone number"
  119. ;;
  120. esac
  121. echo "$name${details+: ($details)}"
  122. }
  123. delobject() {
  124. set -e
  125. type="$1"; [ -n "$type" ] || exit1 "Internal error (delobject: empty type)!"; shift
  126. name="$1"; [ -n "$name" ] || exit1 "Internal error (delobject: empty name)!"; shift
  127. oldname="$(findobjects "$type" "$name")" || exit1 "$oldname"
  128. [ -n "$oldname" ] || exit1 "No $type named \"$name\"!"
  129. items="$(finditems "$type" "$name")" || exit1 "$items"
  130. for item in $items; do
  131. rm "$vardir/$type/$name/$item" || exit1 "Internal error!"
  132. done
  133. rmdir "$vardir/$type/$name" || exit1 "Internal error!"
  134. echo "$name"
  135. }
  136. cmd="$1"; shift
  137. case "$cmd" in
  138. add|create)
  139. case "$1" in
  140. user|group)
  141. type="$1"; shift
  142. response="$(addobject "$type" "$@")" || exit1 "Failed adding $type${response+: $response}"
  143. exit0 "Added $type: $response."
  144. ;;
  145. *)
  146. exit1 "Cannot add \"$1\" (try \"add user\" or \"add group\" instead)!"
  147. ;;
  148. esac
  149. ;;
  150. del|delete|remove)
  151. case "$1" in
  152. user|group)
  153. type="$1"; shift
  154. response="$(delobject "$type" "$@")" || exit1 "Failed deleting $type${response+: $response}"
  155. exit0 "Deleted $type: $response."
  156. ;;
  157. *)
  158. exit1 "Cannot delete \"$1\" (try \"del user\" or \"del group\" instead)!"
  159. ;;
  160. esac
  161. ;;
  162. list|show|view)
  163. case "$1" in
  164. user|group)
  165. type="$1"; shift
  166. response="$(listobject "$type" "$@")" || exit1 "Failed listing $type${response+: $response}"
  167. exit0 "Listing $type: $response."
  168. ;;
  169. *)
  170. exit1 "Cannot list \"$1\" (try \"list user\" or \"list group\" instead)!"
  171. ;;
  172. esac
  173. ;;
  174. status)
  175. msg="$(/usr/local/sbin/localshowkannelstatus)"
  176. exit0 "$msg"
  177. ;;
  178. *)
  179. exit1 "unknown command \"$cmd\"!"
  180. ;;
  181. esac