Commit | Line | Data |
---|---|---|
e540fe8a LM |
1 | #!/bin/bash |
2 | ||
3 | # constants | |
4 | MYDIR=$(dirname $0) | |
5 | PROGNAME=$(basename $0) | |
6 | ||
7 | # configuration variables | |
8 | CONFIG=$MYDIR/convert2sms.rc | |
9 | DOMAINS=$(hostname -d | awk '{ print "@" $0 }') | |
10 | [ -f "$CONFIG" ] && source $CONFIG | |
11 | [ -z "$GATEWAY" -o -z "$PASSWORD" ] \ | |
12 | && { echo "No valid configuration"; exit 1; } | |
13 | ||
14 | # default variables | |
15 | DRYRUN= | |
16 | PHONE= | |
17 | TEMPFILE=$HOME/tmp/smsto.$$ | |
18 | ||
19 | # urlencode function | |
20 | function urlencode () { | |
21 | string=$* | |
22 | ||
23 | #[ "$DRYRUN" ] && { echo $string; return; } | |
24 | ||
25 | for ((i = 0 ; i < ${#string} ; i++ )); do | |
26 | c=${string:$i:1} | |
27 | case "$c" in | |
28 | [-_.~a-zA-Z0-9]) echo -n $c;; | |
29 | *) printf '%%%02x' "'$c" | |
30 | esac | |
31 | done | |
32 | } | |
33 | ||
34 | # log function | |
35 | function log () { | |
36 | [ "$DRYRUN" ] && echo -e "\033[1;34m$*\033[0;0m" \ | |
37 | || logger -i -t SMSTO "$*" | |
38 | } | |
39 | ||
40 | # usage function | |
41 | function usage () { | |
42 | echo "usage: $PROGNAME [-h] [-p ..........]" | |
43 | echo " -d: dryrun" | |
44 | echo " -h: help message" | |
45 | echo " -p: phone number" | |
46 | exit $1 | |
47 | } | |
48 | ||
49 | # get phone number from argument | |
50 | while [ $# -ne 0 ]; do | |
51 | case "$1" in | |
52 | -d) DRYRUN=1;; | |
53 | -h) usage 0;; | |
54 | -p) shift; PHONE=$1;; | |
55 | *) usage 1;; | |
56 | esac | |
57 | shift | |
58 | done | |
59 | [ "$PHONE" ] || usage 1 | |
60 | ||
61 | # clean up when done | |
62 | trap "/bin/rm -f $TEMPFILE" 0 1 2 3 15 | |
63 | ||
64 | # get mail from standard input | |
65 | while read -t 1 line; do | |
66 | echo "$line" >> $TEMPFILE | |
67 | done | |
68 | [ -f "$TEMPFILE" ] || { echo "No input email"; exit 1; } | |
69 | ||
70 | # analyse message to get sender and subject | |
71 | FROM=$(awk '$1 == "From:" { sub(/[^ ]*: */, ""); print }' $TEMPFILE) | |
72 | SUBJECT=$(awk '$1 == "Subject:" { sub(/[^ ]*: */, ""); print }' $TEMPFILE) | |
73 | MESSAGE=$(awk '/^$/,0 { if (/^--/) exit; if (!/^$/) print }' $TEMPFILE) | |
74 | ||
75 | # check sender domain | |
76 | ERR=1 | |
77 | [ "$DOMAINS" ] || ERR=0 | |
78 | for d in $DOMAINS; do | |
79 | [ "$FROM" ] || break; | |
80 | [[ $FROM =~ $d ]] && { ERR=0; break; } | |
81 | done | |
82 | [ $ERR -ne 0 ] && { log "Reject from '$FROM'"; exit 1; } | |
83 | ||
84 | # check the right pattern of the number | |
85 | [[ "$PHONE" =~ ^0[0-9]*$ ]] \ | |
86 | || { log "Incorrect phone number '$PHONE' from '$FROM'"; exit 1; } | |
87 | [[ "$PHONE" =~ ^00 ]] \ | |
88 | && { log "International phone number '$PHONE' from '$FROM'"; exit 1; } | |
89 | [ ${#PHONE} -eq 10 ] \ | |
90 | || { log "Non standard phone number '$PHONE' from '$FROM'"; exit 1; } | |
91 | ||
92 | # log message | |
93 | log "Accept from '$FROM' to $PHONE" | |
94 | ||
95 | # build message | |
96 | EMAIL=${FROM/#*<}; EMAIL=${EMAIL/%>*} | |
97 | FROM=${FROM/%<*}; FROM=${FROM/% } | |
98 | [ "$FROM" ] || FROM=EMAIL | |
99 | [ "$SUBJECT" ] && SUBJECT=" "$SUBJECT":" | |
100 | [ "$MESSAGE" ] && MESSAGE=$'\n'$MESSAGE | |
101 | ||
102 | MESSAGE=$(urlencode "[$FROM]$SUBJECT$MESSAGE") | |
103 | ||
104 | # send http command | |
105 | [ "$DRYRUN" ] && echo "SMS: $MESSAGE" \ | |
106 | || wget --quiet --output-document=/dev/null \ | |
107 | "http://$GATEWAY:9090/sendsms?phone=$PHONE&text=$MESSAGE&password=$PASSWORD" | |
108 | ||
109 | exit $? |