Gammu daemon во FreeBSD

Внезапно выяснилось, что во FreeBSD нет демона gammu. Сама gammu присутствует, порт ведется, обновляется. Но daemon gammu-smsd отсутствует. А мне потребовалось отправлять SMS через старенький модем ZTE MF112, установленный в компьютер с ОС FreeBSD 12. Причем таким образом, что SMS эти поступали на FTP пользователя gammu этого же компьютера. Пришлось быстренько накалякать свой..

Установка самой gammu не представляет никаких сложностей, элементарно:

# Устанавливаем gammu:
pkg install gammu

После установки втыкаем модем, у меня это ZTE, в /dev сразу же появилось несколько новых устройств, в их числе те, что интересуют нас:

# Смотрим устройства модема.
ls -al /dev/cuaU*
crw-rw----  1 uucp  dialer  0x93 22 авг.  15:55 /dev/cuaU0.0
crw-rw----  1 uucp  dialer  0x94 22 авг.  15:49 /dev/cuaU0.0.init
crw-rw----  1 uucp  dialer  0x95 22 авг.  15:49 /dev/cuaU0.0.lock
crw-rw----  1 uucp  dialer  0x99 22 авг.  16:02 /dev/cuaU0.1
crw-rw----  1 uucp  dialer  0x9a 22 авг.  15:49 /dev/cuaU0.1.init
crw-rw----  1 uucp  dialer  0x9b 22 авг.  15:49 /dev/cuaU0.1.lock
crw-rw----  1 uucp  dialer  0x9f 23 авг.  00:10 /dev/cuaU0.2
crw-rw----  1 uucp  dialer  0xa0 22 авг.  15:49 /dev/cuaU0.2.init
crw-rw----  1 uucp  dialer  0xa1 22 авг.  15:49 /dev/cuaU0.2.lock

Видим, что у нас три устройства. Нам нужно найти то, через которое идет обмен данными. Пробуем подключиться через screen к устройствам модема..

# Пробуем подключиться через screen  к устройствам модема.
screen /dev/cuaU0.2
Подключаемся поочередно к устройствам модема и пробуем ввести туда команды.

Поняв, что нужное нам — /dev/cuaU0.2, сочиняем конфиг gammu, файл /etc/gamurc:

nano /etc/gamurc
port = /dev/cuaU0.2
gammucoding = utf8
connection = fbus
name = ZTE
synchronizetime = no
model = MF112 (MF112)
connection = at9600
synchronizetime = yes
logfile =
logformat = notify
use_locking =
gammuloc =
unicode

Проверяем, сможет ли gammu использовать модем:

# Gammu говорит: все в порядке, вижу модем
gammu --identify
Устройство : /dev/cuaU0.2
Производитель : ZTE
Модель         : MF112 (MF112)
Прошивка     : BD_MF112V1.0.0B01
IMEI                 : 355434042361354
Номер SIM IMSI  : 250996656699529

Пробуем отправить SMS на телефон, раз все так здорово:

# Пробуем отправить SMS на телефон через GAMMU:
/usr/local/bin/gammu sendsms TEXT +910667XXXX -unicode -textutf8 "Горячий привет всем работникам связи!"

SMS уходит, и, что важно — приходит адресату! 😉 Теперь нужно автоматизировать процесс отправки SMS, организовать простенький шлюз. Я решил написать собственный демон для отправки SMS. Для этого создадим файл нашего демона в каталоге /usr/local/etc/rc.d/ и сделаем его исполняемым. Открываем редактор nano /usr/local/etc/rc.d/gammud
И добавляем текст туда:

#!/bin/sh
#
# PROVIDE: gammud
# REQUIRE: networking
# KEYWORD:
 
. /etc/rc.subr
 
name="gammud"
rcvar="gammud_enable"
command="/usr/local/gammud/gammud"
command_interpreter=/bin/sh
gammud_user="root"
pidfile="/var/run/${name}.pid"
 
start_cmd="gammud_start"
stop_cmd="gammud_stop"
status_cmd="gammud_status"
 
 
gammud_start() {
        /usr/sbin/daemon -P ${pidfile} -r -f -u $gammud_user $command
}
 
gammud_stop() {
        if [ -e "${pidfile}" ]; then
                kill -s TERM `cat ${pidfile}`
        else
                echo "${name} is not running"
        fi
 
}
 
gammud_status() {
        if [ -e "${pidfile}" ]; then
                echo "${name} is running as pid `cat ${pidfile}`"
        else
                echo "${name} is not running"
        fi
}
 
load_rc_config $name
: ${gammud_enable:=no}
 
run_rc_command "$1"

Делаем его исполняемым:
chmod +x /usr/local/etc/rc.d/gammud

Добавляем демон в файл /etc/rc.conf, добавим туда строку gammud_enable=»YES»

Теперь пишем скрипт, который будет мониторить каталог с поступающими файлами SMS и отправляет сообщения абонентам. Для этого создаем каталог демона mkdir /usr/local/gammud и файл
/usr/local/gammud/gammud, в который помещаем следующий текст:

#!/bin/sh
#
homeDir="/home/gammu"
outDir=$homeDir"/out"
sentDir=$homeDir"/sent"
inDir=$homeDir"/in"
 
log="/var/log/gammu.log";
 
while true; do
    for f in "$outDir"/OUTA_*.txt; do
        sms_number=$(echo $f | /usr/local/bin/perl -n -e '/.*OUTA_([+\d]*)_[\d]*.txt/is && print "$1"' );
        sms_text=$(cat "$f" | xargs );
        if [ ! -z "$sms_number" ] && [ ! -z "$sms_number" ]; then
            echo $(date "+%Y-%m-%d %H:%M:%S" ) " $f $sms_number $sms_text"  >> $log
            /usr/local/bin/gammu sendsms TEXT $sms_number -unicode -textutf8 "$sms_text" | xargs >> $log
            /bin/mv $f $sentDir
        fi
    done
    sleep 10
done

Делаем файл исполняемым, cmod +x /usr/local/gammud/gammud Практически готово. Осталось только добавить пользователя gammu командой adduser и создать необходимые директории для работы демона. Выполняем следующие команды:

# Добавим пользователя в систему
adduser
# Создадим каталоги для получения/отправки SMS
# Каталог для исходящих SMS
mkdir /home/gammu/out 
# Каталог для отправленных SMS
mkdir /home/gammu/sent
mkdir /home/gammu/in

Теперь запускаем daemon:

# Run daemon
service gammud start
# Check daemon status
service gammud status
gammud is running as pid 1261

Все в порядке, демон работает..Теперь кладем в каталог исходящих сообщений специально сформированный файл, например: nano /home/gammu/out/OUTA_+7910667XXXX_42221.txt. В имени файла указываем номер телефона, это +7910667XXXX, а 42221 — ID SMS, его можно придумать от балды. Я через него веду учёт отправленных SMS. Внутри файла пишем текст нашего сообщения. Например: «Привет, всё хорошо, работает gammu daemon». Через некоторое время файл исчезнет из каталога out и будет перемещен в каталог sent. При этом на телефон +7910667XXXX поступит сообщение.

Если сообщение отправляется, приходит абоненту, то на этом всё. Если нет, то смотрим логи нашего демона, которые находятся в /var//gammu.log. Могу еще добавить, что сообщения исходящие можно класть в каталог out по FTP, , HTTP и другими способами, которых десятки. Есть даже mail2sms — конвертер писем в SMS.

Конечно же, написанный демон не совершенен, например — он не умеет читать входящие SMS, но это неплохая заготовка для думающих людей, которая позволит сделать то, что нужно добавлением нескольких строк в код скрипта. Кроме того, во FreeBSD имеется smstools, который умеет это всё, и даже больше. Но мне было быстрее сделать самому. Всем спасибо за внимание, используйте подручные средства для оповещений пользователей ваших сайтов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *