Starts writing modem scripts
Currently, I only have one for sending sms messages. Inspiration was taken from sxmo's send message script although I prefer to send a message from a file so I don't have to worry about escaping quotes etc. Also, i make use of flags
This commit is contained in:
parent
fb93abe720
commit
271c253178
2 changed files with 140 additions and 0 deletions
7
bin/.bin/modem/README.md
Normal file
7
bin/.bin/modem/README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Modem Scripts
|
||||||
|
|
||||||
|
These are used to interface with a modem.
|
||||||
|
|
||||||
|
They require Modem Manager to be installed.
|
||||||
|
|
||||||
|
Much of the code came from the SXMO project
|
133
bin/.bin/modem/sendSMS
Executable file
133
bin/.bin/modem/sendSMS
Executable file
|
@ -0,0 +1,133 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# This is where sms messages will be stored
|
||||||
|
SMS_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/SMS/"
|
||||||
|
|
||||||
|
FILE="$(mktemp)"
|
||||||
|
|
||||||
|
die(){
|
||||||
|
echo "$@" > /dev/stderr
|
||||||
|
rm "$FILE"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
usage(){
|
||||||
|
echo "sendSMS [options] [message|-]"
|
||||||
|
echo "Options:"
|
||||||
|
echo " -e|--edit Edit the message"
|
||||||
|
echo " -h|--help Display this help text"
|
||||||
|
echo " -m|--modem Specify a modem"
|
||||||
|
echo " -n|--number Specify a number"
|
||||||
|
echo " --dry-run Don't actually send the message"
|
||||||
|
}
|
||||||
|
|
||||||
|
mkdir -p "$SMS_DIR"
|
||||||
|
|
||||||
|
number=""
|
||||||
|
dryrun="false"
|
||||||
|
edit="false"
|
||||||
|
|
||||||
|
# Assume we want the first modem
|
||||||
|
# can be overwritten by the -m option
|
||||||
|
modem="$(mmcli -L | grep -qoE 'Modem\/[0-9]+' | head -n 1 | cut -d'/' -f2)"
|
||||||
|
|
||||||
|
|
||||||
|
# Iterate over options breaking -ab into -a -b when needed and --foo=bar into
|
||||||
|
# --foo bar
|
||||||
|
optstring=h
|
||||||
|
unset options
|
||||||
|
while (($#)); do
|
||||||
|
case $1 in
|
||||||
|
# If option is of type -ab
|
||||||
|
-[!-]?*)
|
||||||
|
# Loop over each character starting with the second
|
||||||
|
for ((i=1; i < ${#1}; i++)); do
|
||||||
|
c=${1:i:1}
|
||||||
|
|
||||||
|
# Add current char to options
|
||||||
|
options+=("-$c")
|
||||||
|
|
||||||
|
# If option takes a required argument, and it's not the last char make
|
||||||
|
# the rest of the string its argument
|
||||||
|
if [[ $optstring = *"$c:"* && ${1:i+1} ]]; then
|
||||||
|
options+=("${1:i+1}")
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
# If option is of type --foo=bar
|
||||||
|
--?*=*) options+=("${1%%=*}" "${1#*=}") ;;
|
||||||
|
# add --endopts for --
|
||||||
|
--) options+=(--endopts) ;;
|
||||||
|
# Otherwise, nothing special
|
||||||
|
*) options+=("$1") ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
set -- "${options[@]}"
|
||||||
|
unset options
|
||||||
|
|
||||||
|
|
||||||
|
# Read the options and set stuff
|
||||||
|
while [[ $1 = -?* ]]; do
|
||||||
|
case $1 in
|
||||||
|
-e|--edit) edit="true" ;;
|
||||||
|
-h|--help) usage; exit;;
|
||||||
|
-m|--modem) modem="$2"; shift ;;
|
||||||
|
-n|--number) number="$2"; shift ;;
|
||||||
|
--dry-run) dryrun="true" ;;
|
||||||
|
--) shift; break ;;
|
||||||
|
*) die "invalid option: '$1'." ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Store the remaining part as arguments.
|
||||||
|
args+=("$@")
|
||||||
|
|
||||||
|
# If the remaining argement is -, use stdin
|
||||||
|
if [ "${args[0]}" = "-" ]; then
|
||||||
|
cat - > "$FILE"
|
||||||
|
else
|
||||||
|
echo "${args[*]}" > "$FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Die if no number
|
||||||
|
[ -z "$number" ] && die "No number provided"
|
||||||
|
|
||||||
|
# Die if no modem
|
||||||
|
[ -z "$modem" ] && [ "$dryrun" = "false" ] && die "No modem found"
|
||||||
|
|
||||||
|
if [ "$edit" = "true" ]; then
|
||||||
|
"$EDITOR" "$FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$dryrun" = "false" ]; then
|
||||||
|
# Creates the message using the text from file
|
||||||
|
messageNumber=$(
|
||||||
|
mmcli -m "$modem" --messaging-create-sms="number=$number" \
|
||||||
|
--messaging-create-sms-with-data="$FILE" | grep -o "[0-9]*$"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Send the message
|
||||||
|
mmcli -s "$messageNumber" --send || die "Can't send message"
|
||||||
|
|
||||||
|
# If the messaeg is too long, the previous command will split it up (i think)
|
||||||
|
# The following loop will delete all sent messages from the modem storage
|
||||||
|
for i in $(mmcli -m "$modem" --messaging-list-sms | grep " (sent)" |
|
||||||
|
cut -f5 -d' ') ; do
|
||||||
|
mmcli -m "$modem" --messaging-delete-sms="$i"
|
||||||
|
done
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$SMS_DIR/$number"
|
||||||
|
log="$SMS_DIR/$number/sms.log"
|
||||||
|
|
||||||
|
echo "SENT"
|
||||||
|
echo "RECIPIENT: $number" >> $log
|
||||||
|
echo "TIME: $(date)" >> $log
|
||||||
|
echo "----" >> $log
|
||||||
|
cat "$FILE" >> $log
|
||||||
|
printf '\00\n' >> $log
|
Loading…
Add table
Add a link
Reference in a new issue