Вопрос SMS уведомлений в zabbix уже освещался на Хабре и проблема решалась с использованием СМС-шлюзов. Также упоминали про Отправку SMS c помощью Delphi. Я же хочу рассказать, как настроить SMS уведомления используя USB модем.
Итак, что имеем:
1) довольно обширная ИТ-инфраструктура
2) система мониторинга Zabbix 2.0.3 (актуальная версия на момент написания статьи) функционирующая под Fedora 14 x64
3) 3G USB модем ZTE MF100 от национального украинского оператора Киевстар.

4) Prepaid симка, которая шла в комплекте с модемом.
Также для модема была куплена корпоративная 3G симка, но её использовать не получится, так как с 3G-карточек невозможно позвонить и отправлять смс, а это нам не подходит.Итак, положил на карточку небольшую сумму «для опытов», втыкнул модем в USB и .
Первым делом я зарегистрировал карточку в системе Мой Киевстар. Через неё удобно смотреть остаток денег на счёте модема и заказывать доп. услуги.Напомню, что я все действия провожу в Fedora. Для других линуксов комманды могут отличаться, но думаю выяснить, чем из заменить для вас не составит труда. Также не буду рассматривать вариант установки необходимого из исходников, хотя так тоже можно поступить. Ограничусь установкой существующих стандартных пакетов:
Теперь настраиваем SMS Tools. Правим конфиг /etc/smsd.comf. Привожу готовый конфиг с комментариями:
Теперь создаем скрипт /etc/smsd/trsms.sh, который будет писать лог отправленных смс. Причём все кириллические сообщения будут попадать в него в читаемой кодировке. Не забываем дать права на выполнение скрипта пользователю smstool и на запись в лог /var/log/smsd/sms.log
SMSTools умеет обрабатывать события при помощи внешних программ, Наш скрипт поможет отправлять русские смс в правильной кодировке проверяя сообщения перед отправкой (за прототип был взят unicode2sms из стандартного пакета скриптов, который можно найти в /usr/bin. Аналогично, не забываем дать права на выполнение скрипта пользователю smstool
Напишем скрипт, который будет выполнять Zabbixдля отправи смски. В Zabbixтакие скрипты лежат в директории, определенной в переменной AlertScriptsPath.

Дальше в настройках пользователя (Администрирование -> Пользователи или Administration -> Users) добавляем Способ оповещений (Media):

После этого в настройках Действий (Actions) появится возможность использовать этот Media:

Стандартная цена одного СМС = 0,5 грн. Что при большом количестве смс может вылится в крупную копеечку. Что же предлагает оператор для уменьшения расходов?
вариант первый — Prepaid
Здесь варианта два:
вариант второй — контракт
Здесь варианта три:
К слову, цены получается конкурентоспособными. Например, интернет-сервис smscentre.kiev.ua для нашей организации предложил цену в 15 коп. за одно смс при количестве смс в месяц 1-25000 без абон. платы и с бесплатной активацией пакета.Но при использовании модема мы получаем одно неоспоримое преимущество — независимость от интернета. Ведь интересуют не массовые смс-рассылки, а уведомления от Zabbix. И при использовании интернет-сервисов рассылки смс я рискую НЕ получить важную смс в случае, например, продолжительного выключения света в офисе или аварии у провайдера. Какой из пакетов выбирать — решать вам.
Подробнее о смс-пакетах можно узнать на: для контракта и для Prepaid
Установка этого приложения не обязательна. Приложение необходимо для массовой рассылки смс, которые складывает в mysql базу.Для работы необходимы пакеты httpd, mysql, php, php-pear, php-mysql, php-cli, phpmyadmin. Но эти все пакеты я и так установил для работы Zabbix. Создаём нового пользователя и дериктории для PlaySMS. Скачиваем последнюю версию PlaySMS и создаём базу в mysql:
Проверяем, что в /etc/default/playsms указан правильный путь
Ссылки, которые натолкнут вас на мысли по дальнейшему совершенствованию идеи отправки СМС:
Статья со скриптом-шлюзом E-mail->SMS
Подробный мануал по AT-командам и отправке СМС
Описание различных AT-команд
Переадресация SMS с помощью SMSTools
Описание заголовков файла смс-сообщений
UPD: для просмотра остатка средств на счету и количества акционных смс необходимо установить пакет gsm-ussd. ФОрмат команды и результат следующий:
Итак, что имеем:
1) довольно обширная ИТ-инфраструктура
2) система мониторинга Zabbix 2.0.3 (актуальная версия на момент написания статьи) функционирующая под Fedora 14 x64
3) 3G USB модем ZTE MF100 от национального украинского оператора Киевстар.

4) Prepaid симка, которая шла в комплекте с модемом.
Также для модема была куплена корпоративная 3G симка, но её использовать не получится, так как с 3G-карточек невозможно позвонить и отправлять смс, а это нам не подходит.Итак, положил на карточку небольшую сумму «для опытов», втыкнул модем в USB и .
Установка необходимого
Первым делом я зарегистрировал карточку в системе Мой Киевстар. Через неё удобно смотреть остаток денег на счёте модема и заказывать доп. услуги.Напомню, что я все действия провожу в Fedora. Для других линуксов комманды могут отличаться, но думаю выяснить, чем из заменить для вас не составит труда. Также не буду рассматривать вариант установки необходимого из исходников, хотя так тоже можно поступить. Ограничусь установкой существующих стандартных пакетов:
Теперь проверим, появился ли модемsudo yum install usb_modeswitch # для поддержки USB-модемов Huawei, T-Mobile, Vodafone, Option, ZTE, Novatel sudo yum install minicom # для терминального подключения к модему по /dev/ttyUSB* sudo yum install smstools # собстветвенно пакет для работы с смс.
Результат должен выглядеть примерно такls -l /dev/ttyUSB*
Модем создал 3 виртуальных USB порта. В моем случае для AT команд доступны ttyUSB1 и ttyUSB2. Если модем создал 5 и более виртуальных портов, то их количество можно уменьшить до 3х. Для этого нужно отключить в нём режимы cdrom и flash-drive. Выключение делается коммандой AT+ZCDRUN=E, включение AT+ZCDRUN=F. Если хотим отключить только cd-rom, то AT+ZCDRUN=8. Если хотим включить обратно — AT+ZCDRUN=9.Запускаю терминалcrw-rw----. 1 root dialout 188, 0 Oct 22 12:05 /dev/ttyUSB0 crw-rw----. 1 root dialout 188, 1 Oct 22 15:56 /dev/ttyUSB1 crw-rw----. 1 root dialout 188, 2 Oct 22 12:05 /dev/ttyUSB2
вижу приветствиеminicom -D /dev/ttyUSB1
выключаю CD-ROMWelcome to minicom 2.5 OPTIONS: I18n Compiled on Feb 24 2011, 11:25:55. Port /dev/ttyUSB1 Press CTRL-A Z for help on special keys AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0 OK
Вообще AT команд довольно много и раньше, во времена телефонных модемов, из знание было обязательным для уважающего себя админа. Сейчас всё измениилось и вспомнить подзабытые комманды можно с помощью гугла. Например вот хорошая статья справочного характера.Попробуем пообщаться с модемом.Посмотрим режим работы модема>AT+ZCDRUN=8 Close autorun state result(0:FAIL 1:SUCCESS):1 OK
в моем случае — =1,0,0 — Автоматический выбор только GSM сети. Поскольку я использую обычную, а не 3G симку, этот режим меня полностью устраивает. Также существуют следующие варианты режима работы:>AT+ZSNT? +ZSNT: 1,0,0 OK
Проверим, установлена ли защита пин-кодомAT+ZSNT=0,0,0 (Авто) - по умолчанию AT+ZSNT=0,0,1 Автоматический выбор сети: GSM+WCDMA, предпочтение GSM AT+ZSNT=0,0,2 Автоматический выбор сети: GSM+WCDMA, предпочтение WCDMA AT+ZSNT=1,0,0 Автоматический выбор сети: только GSM AT+ZSNT=2,0,0 Автоматический выбор сети: только WCDMA AT+ZSNT=0,1,0 Ручной выбор сети: GSM+WCDMA AT+ZSNT=1,1,0 Ручной выбор сети: только GSM AT+ZSNT=2,1,0 Ручной выбор сети: только WCDMA
отключаем PIN>AT+CPIN? +CPIN: SIM PIN OK
включаем PIN>AT+CLCK="SC",0,"1111"
Если она включена, то для продолжения работы нам необходимо его ввести>AT+CLCK="SC",1,"1111"
проверим ещё раз>AT+CPIN=”1234″ OK
Теперь пин-код принят. Посмотрим уровень сигнала>AT+CPIN? +CPIN: READY OK
получим версию IMEI модуля>AT+CSQ +CSQ: 21,99 OK
Посмотрим тип регистрации в сети>AT+GSN 359518034903581 OK
0 означает, что нет сообщения о сменен регистрации в сети1 — успешно зарегистрирован в сетиПосмотрим информацию об операторе>AT+CREG? +CREG: 0,1 OK
Первый 0 означает автоматический выбор сети, длинный тестовый формат имени (второй 0), и само названия оператора — Киевстар.проверим, установлен ли у нас и какой именно центр отправки смс (Service Center Address)>AT+COPS? +COPS: 0,0,"Kyivstar",0 OK
Для Киевстара это правильный номер.Теперь попробуем отправить сообщение. Перед отправкой сообщения нужно установить формат сообщения. Делается это коммандой AT+CMGF=x. где x — формат сообщений, 0-1.0, — режим PDU, управление кодом команды. Вывод сообщения в HEX коде. Режим по умолчанию1, — текстовый режим. Команды текстовые. Вывод сообщения в текстовом виде.В первый режиме сообщения будут выдаваться в виде шестнадцатеричных кодов ascii или unicode.Это очень неудобный режим.Отправка смс делается командой AT+CMGS=«ХХХХХХХХХХХ», где ХХХХХХХХХХХ — номер абонента. Отправка смс зависит от формата сообщения. После ввода команды выдает приглашение ">" после чего можно вводить текст сообщений. Завершается символом ESC или Ctrl-Z. Отправим сообщение используя текстовый режим и предварительно насильно установив SCA:AT+CSCA? +CSCA: "+380672021111",145 OK
Смс успешно пришла.Можно отправлять смс предварительно записав в память:AT+CMGF=1 OK AT+CSCA= "+380672021111" OK AT+CMGS="+38067xxxxxxx" > test message > +CMGS: 110 OK
При работе с AT командами не всегда всё проходит гладко. Иногда комманды выполняются с ошибками, возвращая трехзначный код ошибки. Вот список основных кодов ошибок:AT+CMGW="91234567"<CR>Sending text messages is easy.<Ctrl+z> AT+CMSS=3
Error code Meaning 0-127 GSM 04.11 Annex E-2 values 128-255 GSM 03.40 section 9.2.3.22 values 300 Phone failure 301 SMS service of phone reserved 302 Operation not allowed 303 Operation not supported 304 Invalid PDU mode parameter 305 Invalid text mode parameter 310 SIM not inserted 311 SIM PIN necessary 312 PH-SIM PIN necessary 313 SIM failure 314 SIM busy 315 SIM wrong 320 Memory failure 321 Invalid memory index 322 Memory full 330 SMSC (message service center) address unknown 331 No network service 332 Network timeout 500 Unknown error 512 Manufacturer specific
Настройка smstools
Теперь настраиваем SMS Tools. Правим конфиг /etc/smsd.comf. Привожу готовый конфиг с комментариями:
Подробнее обо всех параметрах конфига можно прочитать на официальном сайте smstool.#используемые устройства, если несколько — пишем через запятую devices = GSM1 #папки для сохранения смс incoming=/var/spool/sms/incoming outgoing=/var/spool/sms/outgoing checked=/var/spool/sms/checked sent=/var/spool/sms/sent # лог, если не указан — пишется в syslog, если = 1, пишет в stdout logfile = /var/log/smsd/smsd.log #уровень логирования loglevel = 5 #debug = 7 user = sms #включаем "умный" лог smart_logging = yes #скрипт, выполяющийся перед отправкой смс для автоматической конвертации кириллических сообщений в "правильную" кодировку. о нём подробнее ниже checkhandler = /etc/smsd/check.sh #скрипт, выполняющийся после отправки смс и создающий лог отправленного. о нём подробнее ниже eventhandler = /etc/smsd/trsms.sh [GSM1] #используемое устройство device = /dev/ttyUSB1 #пин-код pin = 1111 #SCA smsc = 380672021111
Скрипт trsms.sh
Теперь создаем скрипт /etc/smsd/trsms.sh, который будет писать лог отправленных смс. Причём все кириллические сообщения будут попадать в него в читаемой кодировке. Не забываем дать права на выполнение скрипта пользователю smstool и на запись в лог /var/log/smsd/sms.log
Сам скрипт:chown smstools:smstools /etc/smsd/trsms.sh chmod gu+x /etc/smsd/trsms.sh chmod gu+w /var/log/smsd/sms.log
Пример части лога:#!/bin/bash status="$1" file="$2" touch /etc/smsd/ok case "$1" in SENT) FILE=`mktemp /tmp/smsd_XXXXXX` head -5 $file | grep -e "^To: " -e "Alphabet: " -e "^Sent: " >> /var/log/smsd/sms.log if grep "Alphabet: Unicode" $file >/dev/null; then tail -n +6 $file | iconv -f UCS-2BE -t UTF-8 >> /var/log/smsd/sms.log else tail -n +5 $file >> /var/log/smsd/sms.log fi echo >> /var/log/smsd/sms.log echo "========================================" >> /var/log/smsd/sms.log echo >> /var/log/smsd/sms.log ;; esac
======================================== To: 38067XXXXXXX Alphabet: Unicode Sent: 12-10-23 21:07:29 test message ======================================== To: 38093XXXXXXX Alphabet: Unicode Sent: 12-10-19 12:16:28 лог пишет теперь и на русском ========================================
Скрипт check.sh
SMSTools умеет обрабатывать события при помощи внешних программ, Наш скрипт поможет отправлять русские смс в правильной кодировке проверяя сообщения перед отправкой (за прототип был взят unicode2sms из стандартного пакета скриптов, который можно найти в /usr/bin. Аналогично, не забываем дать права на выполнение скрипта пользователю smstool
Сам скрипт:chown smstools:smstools /etc/smsd/check.sh chmod gu+x /etc/smsd/check.sh
теперь всё готово к запуску.#!/bin/bash # checkhandler for SMS Tools 3 # autoconverts cyrillic messages to UCS-2BE # add checkhandler=/path/to/ucsautoconvert into global part of smsd.conf # written by lexy (lexy@mrlexy.ru), 2008 FILE=`mktemp /tmp/smsd_XXXXXX` if [ ! `grep '[А-Яа-я]' $1 > /dev/null` -o `grep 'Alphabet:\s*U' $1 > /dev/null` ] then exit 0 fi cat $1 | awk '{if(NF==0) {s=1} if(s==0 && NF>0 && $0!~/Alphabet:[ \t]*U/){print}}' > $FILE echo Alphabet: Unicode >> $FILE cat $1 | awk '{if(NF==0) {s=1} if(s==1){print}}' | iconv -t UCS-2BE >> $FILE mv $FILE $1 chmod 664 $1
проверяем, запустился ли>service smsd start Starting smsd: [ OK ]
пробуем отправить сообщение. номер абонента указываем в международном формате, но без знака «+»> ps ax | grep smsd 1345 ? Ss 0:00 /usr/sbin/smsd 1347 ? S 0:00 /usr/sbin/smsd 2322 pts/2 S+ 0:00 grep --color=auto smsd
смотрим лог.smssend "38067XXXXXXX" "test message" -- Text: test message To: 38067XXXXXXX
добавились строки> tail /var/log/smsd/smsd.log
проверяем отправленную смс:2012-10-23 21:07:08,5, GSM1: SMS sent, Message_id: 112, To: 38067XXXXXXX, sending time 7 sec. 2012-10-23 21:07:21,5, smsd: Moved file /var/spool/sms/outgoing/send_NpoTqX to /var/spool/sms/checked
>cat /var/spool/sms/sent/send_NpoTqX To: 38067XXXXXXX Alphabet: Unicode Modem: GSM1 Sent: 12-10-23 21:07:29 IMSI: 255030837719869 test message
Настройка Zabbix
Напишем скрипт, который будет выполнять Zabbixдля отправи смски. В Zabbixтакие скрипты лежат в директории, определенной в переменной AlertScriptsPath.
Сам скрипт называю sms_send.sh и состоит он практически из одной строки:cat /usr/local/etc/zabbix_server.conf | grep AlertScriptsPath ### Option: AlertScriptsPath AlertScriptsPath=/home/zabbix/bin/
Дальнейшая настройка осуществляется через веб-интерфейс. Сначала идем в Администрирование -> Способы оповещений (Administration Media types-> ) и создаем новый способ оповещений ( Media types). Название скрипта должно быть таким же, как и имя файла скрипта в директории AlertScriptsPath#!/bin/bash to=$1 subject="$2" body="$3" smssend $to "$subject"

Дальше в настройках пользователя (Администрирование -> Пользователи или Administration -> Users) добавляем Способ оповещений (Media):

После этого в настройках Действий (Actions) появится возможность использовать этот Media:

Тарифы
Стандартная цена одного СМС = 0,5 грн. Что при большом количестве смс может вылится в крупную копеечку. Что же предлагает оператор для уменьшения расходов?
вариант первый — Prepaid
Здесь варианта два:
- «Пакет 30 SMS» с абон.платой в 4 грн в неделю. Получается, что цена 1 смс =13,33 коп.
- «Пакет 60 SMS» с абон.платой в 6 грн в неделю. Получается, что цена 1 смс =10 коп.
- В обоих случаях неиспользованные в конце недели смс «сгорают».
- Нужно регулярно заходить в профиль на «Мой Киевстар» и дозаказывать услугу, а то можно в самый важный момент остаться без уведомления.
вариант второй — контракт
Здесь варианта три:
- «Пакет SMS -50%» с абон.платой в 3 грн в месяц. В пакет входит 500 смс со скидкой. Получается, что цена 1 смс =25 коп.
- «Пакет SMS -70%» с абон.платой в 7 грн в месяц. В пакет входит 500 смс со скидкой. Получается, что цена 1 смс =15 коп.
- «Пакет 1000 SMS» с абон.платой в 120 грн в месяц. В пакет входит 1000 бесплатных смс. Получается, что цена 1 смс =12 коп.
К слову, цены получается конкурентоспособными. Например, интернет-сервис smscentre.kiev.ua для нашей организации предложил цену в 15 коп. за одно смс при количестве смс в месяц 1-25000 без абон. платы и с бесплатной активацией пакета.Но при использовании модема мы получаем одно неоспоримое преимущество — независимость от интернета. Ведь интересуют не массовые смс-рассылки, а уведомления от Zabbix. И при использовании интернет-сервисов рассылки смс я рискую НЕ получить важную смс в случае, например, продолжительного выключения света в офисе или аварии у провайдера. Какой из пакетов выбирать — решать вам.
Подробнее о смс-пакетах можно узнать на: для контракта и для Prepaid
Настройка PlaySMS
Установка этого приложения не обязательна. Приложение необходимо для массовой рассылки смс, которые складывает в mysql базу.Для работы необходимы пакеты httpd, mysql, php, php-pear, php-mysql, php-cli, phpmyadmin. Но эти все пакеты я и так установил для работы Zabbix. Создаём нового пользователя и дериктории для PlaySMS. Скачиваем последнюю версию PlaySMS и создаём базу в mysql:
Импортируем в созданную базу:adduser playsms mkdir -p /var/www/playsms mkdir -p /var/spool/playsms mkdir -p /var/log/playsms chown -R apache /var/www/playsms chown -R apache /var/spool/playsms chown -R apache /var/log/playsms chmod -a -G smstools playsms wget http://downloads.sourceforge.net/project/playsms/playsms/Version%200.9.7.1/playsms-0.9.7.1.tar.gz tar -zxvf playsms-0.9.7.1.tar.gz -C /usr/local/src cd /usr/local/src/playsms-0.9.7.1/web/ cp -rR * /var/www/playsms cp playsmsd* sendsmsd* /usr/local/bin/ chown -R apache /var/www/playsms mysqladmin -u root -p create playsms
Копируем конфиг, предварительно отредактировав в нем пароль пароль для подключения к базе (и логин, если у вас не root)mysql -u root -p playsms < /usr/local/src/playsms-0.9.7.1/db/playsms.sql
Настраиваем автоматический запуск программы:cp /var/www/playsms/config-dist.php /var/www/playsms/config.php vi /var/www/playsms/config.php $core_config['db']['pass'] = 'ваш пароль'; // database password
В /etc/rc.d/rc.local добавлеям строчку — /usr/local/bin/playsmsd_start. Панель управления PlaySMS доступна по htpp://ip.адресс.вашего.сервера/playsms. Вход admin \ admin.cd /usr/local/src/playsms-0.9.7.1/bin cp playsmsd playsmsd.php playsmsd_start /usr/local/bin/ cp playsms /etc/default/
Проверяем, что в /etc/default/playsms указан правильный путь
PLAYSMS_PATH=/var/www/html/playsms
Полезные ссылки
Ссылки, которые натолкнут вас на мысли по дальнейшему совершенствованию идеи отправки СМС:
Статья со скриптом-шлюзом E-mail->SMS
Подробный мануал по AT-командам и отправке СМС
Описание различных AT-команд
Переадресация SMS с помощью SMSTools
Описание заголовков файла смс-сообщений
UPD: для просмотра остатка средств на счету и количества акционных смс необходимо установить пакет gsm-ussd. ФОрмат команды и результат следующий:
>gsm-ussd -m /dev/ttyUSB2 '*115#' Bonusy 55.0 SMS na nomery po Ukraini (dijsni do 2012-11-06 23:59:59). Zamovlennia Paketu SMS za tel. 477*030* >gsm-ussd -m /dev/ttyUSB2 '*111#' Na rahunku: 17.14 grn. Nomer die do 24-10-2013. Bonusy: 0 grn (dijsni do 14-10-2022); 104810496 bytes
