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/log/gammu.log. Могу еще добавить, что сообщения исходящие можно класть в каталог out по FTP, SSH, HTTP и другими способами, которых десятки. Есть даже mail2sms — конвертер писем в SMS.

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

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

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