Управляем сервером посредством SMS

Ноябрь 17, 2012 | HOWTOs, Публикации, Статьи by Plus

Основной источник: http://habrahabr.ru/post/114912/

Началось всё с того, что я наткнулся на эту статью в Интернете, сразу нашел завалявшиеся в закромах USB модемы.

Сначала следовал по инструкции и установил ряд пакетов:

apt-get install usb_modeswitch minicom smstools

После чего поправил конфиг /etc/usb-modeswitch.conf:

DefaultVendor = 0x12d1
DefaultProduct = 0x1446
MessageEndPoint = "0x01"
MessageContent = "55534243000000000000000000000011060000000000000000000000000000"

Это все делалось только для перевода модема в режим только модем.

После переподключил модем, следуя инструкции, дальше, все так же по инструкции, проверил:

ls /dev | grep ttyUSB:
ttyUSB0
ttyUSB1
ttyUSB2

Далее нужно настроить minicom, можно запустить так, как написано в инструкции с параметром -s, либо запустить minicom и открыть настройки комбинацией клавиш Ctrl+A+O. Заходим в настройки последовательного порта и меняем на свой (у меня это оказался ttyUSB1).

Следующим шагом нужно настроить smsd.

Дефолтных настроек в файле конфигурации куча, для адекватной работы достаточно оставить те, что описаны в инструкции (источнике). В качестве примера привожу свои в файле /etc/sms.conf:

devices = GSM1
logfile = /var/log/smsd.log
loglevel = 2
[GSM1]
device = /dev/ttyUSB0
baudrate = 115200
rtscts = no
init = at+cpms="sm","sm",""                       # редактированное init = at+cpms="mt","mt",""
incoming = yes
incoming = high
ВНИМАНИЕ!!!
Позднее попытавшись повторить на другом железе, возникла проблема, в том что в каталоге /var/spool/sms/incoming 
не создавались файлы с смской причиной тому стало то, что демон smsd не смотрел смски в памяти модема, а только на сим
карте, о чем было указано в /etc/smsd.conf в параметре init = at+cpms="sm","sm","" и проигнорировано мной. В последствии, не без помощи добрых людей, ткнувших мне в глаз и указав на путь истинный, решение нашлось.
Для того чтобы просматривать нужно поменять на наиболее подходящий параметр init, учитывая что:
"sm" — sim-card, "me" — memory, mt - проверять и на сим карте и в памяти. Другие дополнительные интересные параметры можно найти тут: http://www.developershome.com/sms/cpmsCommand.asp

Дальше по инструкции написано:

…настройки примерно понятные, запускаем демона, service smsd start и проверяем сие чудо: smssend 9128141111 ‘test message’…

Вот тут-то первая палка в колёса и прилетела. Дело в том что в последних версиях Ubuntu этого пакета просто нет. Начал искать в Интернетах нужный пакет и пытаться адаптировать. Время шло, дело не продвигалось, совсем опечалившись, но, еще питая надежду ;) , пошел читать маны (с английским у меня туго), и, о чудо, наткнулся на оффициальную инструкцию пакета… и тут эврика!

Повторюсь: дело в том, что в новых версих Ubuntu… Однако там есть замечательный пакет gsm-utils! в котором smssend заменен на gsmsendsms! Тут инструкция на русском.

Дальше ,опять вернувшись к инструкции, нужно научить сервер слушать и понимать, чего ему говорят:

Если отправить смс-ку на номер симки в модеме, через некоторое время smsd создаст файл в /var/spool/sms/incoming/huaweiE1550.* примерно следующего содержания:

From: 7913XXXXXXX
From_TOA: 91 international, ISDN/telephone
From_SMSC: 79126313431
Sent: 12-10-02 10:15:15
Received: 12-10-02 10:18:11
Subject: huaweiE1550
IMSI: 2500XXXXXXXXXXX
Report: no
Alphabet: ISO
UDH: false

Test message

Вот эти файлы и нужно проверять на наличие команд. Я приведу один способ, из двух описанных, который заработал у меня и ниже опишу какая ошибка возникла при втором способе.

Итак заработавший способ: это скрипт на bash, который пришлось мне немного изменить:

#!/bin/sh
# SMSCtrl Ubuntu 12.10
# Description: Sms control, Plus editor, 2012, http://www.omsklug.com
 
. /lib/lsb/init-functions
 
DAEMON=smsctrl
REFRESH_TIME=15
 
COMMAND_CHAR="#"
INCOMING_DIR=/var/spool/sms/incoming
ALLOW_PHONES="7********** "
SEND_BACK_REPORT=YES
 
to_log(){
        text=$1
        export LANG=en_EN
        log_date=`date "+%b %d %H:%M:%S "`
        log_host=`hostname -s`
        echo "$log_date $log_host $DAEMON: $text" >> /var/log/$DAEMON.log
}
 
start() {
        echo -n "Starting $DAEMON: "
        $0 --daemon &&   log_success_msg "$name is running" || log_failure_msg "$name is not running"
 
        RETVAL=$?
        echo
 
        [ $RETVAL = 0 ] && touch /var/lock/subsys/$DAEMON # тут нужно либо создать директорию, либо сменить директорию
        to_log "Starting ..."
        return $RETVAL
}
 
stop() {
        # Stop daemon.
        echo -n "Shutting down $DAEMON: "
        killproc $0
        RETVAL=$?
        to_log "Stopping ..."
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/$DAEMON
}
 
run() {
    for File in $(ls $INCOMING_DIR); do
        Allow=0
        for Phone in $ALLOW_PHONES; do
            cat $INCOMING_DIR/$File | grep "From: $Phone" > /dev/null 2>&1
            [ $? -eq 0 ] && Allow=1
        done;
        [ $Allow -eq 0 ] && continue
 
        cat $INCOMING_DIR/$File | grep "$COMMAND_CHAR"
        [ $? -ne 0 ] && continue
 
        FromPhone=`cat $INCOMING_DIR/$File | grep "From:" | cut -d " " -f2`
 
        command=`cat $INCOMING_DIR/$File | grep "$COMMAND_CHAR" | cut -d "$COMMAND_CHAR" -f2`
        to_log "Incoming command: $command from $FromPhone"
        out=`$command`
 
        if [ "$SEND_BACK_REPORT" = "YES" ]; then
 
# Здесь нужно обратить внимание, что прямо тут указано с каким устройством
# работать, по умолчанию там
#
#      /dev/mobilephone,
#
#   либо нужно побороть gsmsendsms, на использование нужно девайса...
 
   gsmsendsms -d /dev/ttyUSB0 $FromPhone "$out"
            to_log "Send sms to $FromPhone: $out"
        fi
# если тут добавить cp -f $INCOMING_DIR/$File /var/spool/sms/remove/
# тогда перед удалением файлы с смс будут складываться в /var/spool/sms/remove/
 
 rm -f $INCOMING_DIR/$File
 to_log "Deleting file $INCOMING_DIR/$File"
    done
}
 
daemon() {
        exec >/dev/null
        exec 2>/dev/null
        (
        trap "" TERM
        while [ true ]; do
            run
            sleep $REFRESH_TIME;
        done;
        )&
}
 
case "$1" in
    --daemon)
          daemon
          ;;
    run)
          run
          ;;
    start)
          start
          ;;
    stop)
          stop
          ;;
    restart)
          $0 stop
          $0 start
          exit $?
          ;;
    status)
          status $DAEMON
          echo
          ;;
    *)
          echo "Usage: $DAEMON {start|stop|restart|status|run}"
          exit 1
  esac
 
  exit 0

COMMAND_CHAR=”#” – Признак команды

INCOMING_DIR=/var/spool/sms/incoming –Директория для входящих смс-ок

ALLOW_PHONES=”79*********” – Номера с которых разрешены команды

SEND_BACK_REPORT=YES – Отправлять вывод SMS обратно.

Далее подготавливаю простенький скрипт, наиболее наглядный:

#!/bin/bash
reboot

Далее ложу его в директорию /var/smsscript/ (директория может быть любой другой, в офф статье это /root/bin/)

Теперь проверяем систему.

Отправляем заветную SMSку:

#/var/smsscript/reboot.sh sms

И комп успешно уходит в ребут, при этом на телефон прилетает ответное SMS.

Дальше только собственное воображение может ограничить использование данного сервиса.

Profit!

Прокомментировать

Вы должны быть авторизованы для комментирования.