Задача.
В ходе реализации проекта по доступу к гостевой WiFi сети при помощи Cisco ISE, была поставлена задача рассылать информационные сообщения с данными авторизации по средствам SMS на телефон конечного пользователя. Подробнее ознакомиться с описанием всего процесса можно в статье нашего CCNA инженера: Отправка гостевых учетных данных с помощью sms.
Решение.
В качестве решения для организации рассылки был выбран пакет SMS Server Tools 3. В предыдущей статье я уже описывал принцип работы. Что нам нужно для решения этой задачи:
- procmail
- postfix
- Скрипт обработки электронного письма
- Демон sms3
На вашем основном почтовом сервере компании необходимо сделать настройки, которые позволят пересылать всю почту для домена sms.example.com на ваш sms шлюз, который в свою очередь будет разбирать сообщения при помощи procmail и в зависимости от условий производить те или иные действия. В нашем случае при получении письма с адреса auth@example.com procmail передает письмо на обработку скрипту sendsms_auth, который в свою очередь использует переменные в теле письма для формирования sms сообщения и отправки адресату.
Схема прохождения обработки письма.
Настройка procmail.
Предположим что у нас уже установлен procmail. Особой настройки он не требует, необходимо лишь в файле procmailrc, расположенному в каталоге /etc, создать необходимое правило для обработки почты. Как я уже описывал выше, нам необходимо указать procmail, что всю почту приходящую с адреса auth@example.com необходимо передавать на обработку скрипту sendsms_auth, расположенному в директории /usr/local/bin, для этого создадим правило в секции #Rules
#Global options
VERBOSE=on
MAILDIR=/var/spool/mail
DEFAULT=/var/spool/mail/sms
LOGFILE=/var/log/procmail#Rules
:0
* ^From.auth@example.com
| /usr/local/bin/sendsms_auth
Следует помнить, что цепочка обработки правил начинается сверху и идет вниз по прядку, как в iptables. Иными словами, если у вас будет правило обработки всех сообщений для домена *.example.com и оно будет стоять первым, то все последующие правила обрабатываться не будут.
Скрипт разбора почты и отправки SMS.
Результатом работы procmail, будет передача электронного письма на обработку нашему скрипту. Скрипт в свою очередь используя оператор sed, получит тело письма:
sed ‘1,/^$/d’ < $TMPFILE_MAIL > $TMPFILE_CONVERT
Так как письмо не содержит кириллических символов, Cisco ISE отправляет его в семибитной кодировке и у нас нет необходимости делать расшифровку из Base64. Используем тело письма как есть.
По договоренности с администратором Cisco ISE в письме приходит набор переменных которые мы будем использовать в работе скрипта.
- phone — телефон пользователя в международном формате (+код страны-код города….)
- login — Логин пользователя
- pass — Пароль для доступа к WiFi
- dates — дата начала действия учетных данных
- datef — дата окончания действия учетных данных
- dtime — часовой пояс
Следующим этапом нам необходимо определить на каком языке отправлять сообщение, для этого используем следующую конструкцию:
#Parsing country code
country=${phone:0:2};
Из переменной $phone получаем первые два символа и передаем их в новую переменную $country, при помощи которой будем определять язык sms сообщения.
При помощи оператора IF создадим условие, в котором если переменная $country равна +7, отправляем sms с русским текстом, всем остальным на английском.
if [ $country = +7 ]; then
echo «Сведения для подключения к гостевой WiFi сети НАШЕЙ КОМПАНИИ. Имя WiFi сети(SSID): EXAMPLE. Ваш логин:»$name».» «Ваш пароль:»$pass».» «Действительно с:»$dates»».» Действительно до:»$datef».» «Часовой пояс:»$dtime». Помощь: 8(800)-000-0000» | sendsms $phone
else
echo «Info about the guest wireless network. Wireless Network(SSID): EXAMPLE. Your username:»$name».» «Your password:»$pass».» «Valid from:»$dates»».» Expiration date:»$datef».» «Time zone:»$dtime». Support: +7(831)-000-0000» | sendsms $phone
fi
Указывая в конце сообщения номер технической поддержки в формате 8-800, следует помнить, что данные номера не доступны для звонков с зарубежных номеров, поэтому в английском тексте необходимо указывать номер в международном формате.
Скрипт.
#!/bin/sh
#########################################
# Script by Alexey Orlov #
# https://blog.eaglenn.ru #
# Mail to alexey.n.orlov[AT]gmail.com #
# Date 13.03.2015 #
#########################################
# Smsd can send eMails via SMS. You simply need to store the eMail as text
# file in the outgoing queue directory with a unique filename.# The eMail must include the phone number in the To: field, for example:
# To: «Herbert +491721234567» <sms@localhost># This simple script creates a unique filename and copies the eMail from
# stdin to that file.# If you use procmail to deliver local eMail. Create the user sms and create
# the file /home/sms/.procmailrc with this content:# VERBOSE=off
# MAILDIR=/var/spool/mail
# DEFAULT=/var/spool/mail/sms
# LOGFILE=/var/log/procmail
#
# :0
# * ^TOsms
# | /usr/local/bin/email2sms# If you use QMail and vpopmail you need the file
# /home/vpopmail/domains/your-domain/.qmail-sms with this content:# | /usr/local/bin/email2sms
TMPFILE_MAIL=$(mktemp /tmp/tmp.out.XXXXXX)
TMPFILE_CONVERT=$(mktemp /tmp/tmp.out.XXXXXX)cat > $TMPFILE_MAIL
sed ‘1,/^$/d’ < $TMPFILE_MAIL > $TMPFILE_CONVERT#Parsing body mail
phone=`cat $TMPFILE_CONVERT | grep ‘phone’ | cut -d «:» -f 2`
name=`cat $TMPFILE_CONVERT | grep ‘name’ | cut -d «:» -f 2`
pass=`cat $TMPFILE_CONVERT | grep ‘pass’ | cut -d «:» -f 2`
dates=`cat $TMPFILE_CONVERT | grep ‘dates’ | cut -d «:» -f 2`
datef=`cat $TMPFILE_CONVERT | grep ‘datef’ | cut -d «:» -f 2`
dtime=`cat $TMPFILE_CONVERT | grep ‘dtime’ | cut -d «:» -f 2`#Parsing country code
country=${phone:0:2};#Send sms
if [ $country = +7 ]; then
echo «Сведения для подключения к гостевой WiFi сети НАША КОМПАНИЯ. Имя WiFi сети(SSID): EXAMPLE. Ваш логин:»$name».» «Ваш пароль:»$pass».» «Действительно с:»$dates»».» Действительно до:»$datef».» «Часовой пояс:»$dtime». Помощь: 8(800)-000-0000» | sendsms $phone
else
echo «Info about the guest wireless network. Wireless Network(SSID): EXAMPLE. Your username:»$name».» «Your password:»$pass».» «Valid from:»$dates»».» Expiration date:»$datef».» «Time zone:»$dtime». Support: +7(831)-000-000» | sendsms $phone
fi#Delete temp files
rm -f $TMPFILE_MAIL
rm -f $TMPFILE_CONVERT
Параметры выделенные красным необходимо изменить на свои.
Итог.
Результатом работы скрипта будет отправка смс сообщения пользователю с его данными для авторизации.
Уведомление: Отправка гостевых учетных данных с помощью sms | speicherhirn.eapea.ru