суббота, 6 февраля 2016 г.

Использование библиотеки Yowsup 2 для отправки сообщений пользователю WhatsApp

Yowsup 2 является python библиотекой, которая позволяет строить приложения, используя услуги WhatsApp.

Установка Yowsup 2

Ставим пакеты, которые понадобятся:
# yum install python python-dateutil python-argparse 
# yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel zlib-devel
# yum install gcc
# yum install python-devel
# yum install protobuf pycrypto
# yum -y install python-pip
# pip install --upgrade pip
# yum install python-imaging
Выполняем установку:
# cd /usr/src/
# wget https://github.com/tgalal/yowsup/archive/master.zip
# unzip master
# cd yowsup-master/
# python setup.py install

Регистрация пользователя WhatsApp

Сервер, с которого будут рассылаться сообщения, должен иметь телефонный номер для регистрации. Этот же номер будет использоваться для отправки сообщений.  Наша задача запросить код регистрации на наш номер телефона. 
Это делается командой:
# python yowsup-cli registration --requestcode sms --phone 79171112222 --cc 7 --mcc 250 --mnc 01
Здесь:
79171112222 – номер телефона, от имени которого регистрируем сервер.
сс – код страны. Россия – 7
mcc - mobile country code - это другой код страны (для России это 250)
mnc - mobile network code - это код вашего оператора. (01 - МТС, 02 - мегафон, 20 - теле2, 99 - билайн)
У меня МТС поэтому, я буду вписывать mnc = 01
В ответ увидим:
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":64,"sms_wait":64,"voice_wait":64}
status: sent
retry_after: 64
length: 6
method: sms
На телефонный аппарат приходит SMS с кодом подтверждения
У меня код был такой: 930-620
Имея этот код, завершаем процедуру регистрации:
# python yowsup-cli registration --register 930-620 --phone 79171112222 --cc 7
Вывод ответа сервера:
INFO:yowsup.common.http.warequest:{"status":"ok","login":"79171112222","type":"new","pw":"0t7OhrPLwf9KjX5qkwnVqTtXXmg=","expiration":4444444444.0,"kind":"free","price":"33,00 \u0440\u0443\u0431.","cost":"33.00","currency":"RUB","price_expiration":1457232900} 
status: ok
kind: free
pw: 0t7OhrPLwf9KjX5qkwnVqTtXXmg=
price: 33,00 руб.
price_expiration: 1457232900
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 79171112222
type: new
Главное, что нам требуется пароль. Здесь он в строке:
pw: 0t7OhrPLwf9KjX5qkwnVqTtXXmg=

Создание конфигурации пользователя Yowsup 2

Прямо в каталоге /usr/src/yowsup-master/ создаем конфигурационный файл:
# nano yowsup-cli.config
Вписываем туда:
cc=7
phone=79171112222
password=0t7OhrPLwf9KjX5qkwnVqTtXXmg=

Отправка сообщений:

Отправка сообщений  WhatsApp через командную строку из директории /usr/src/yowsup-master/:
# yowsup-cli demos -c yowsup-cli.config -M -s 79171440055 "Авария"
Ответ сервера:
INFO:yowsup.demos.sendclient.layer:Message sent
Отправка сообщений из любого каталага:
# /usr/bin/yowsup-cli demos -c /usr/src/yowsup-master/yowsup-cli.config -M –s “Сообщение”
Для того что бы мы могли отправлять сообщения через самописную web-страницу, необходимо пользователю apache разрешить отправку сообщений из консоли. Для этого необходимо:
1) разрешить пользователю apache запускать команду /usr/bin/yowsup-cli. Это делается в файле /etc/sudoers 
# nano /etc/sudoers
После строчки
root    ALL=(ALL)       ALL
Вписываем
ALL ALL=(root) NOPASSWD: /usr/bin/yowsup-cli
2) скопировать установочный файл программы yowsup в домашний каталог apache
# cp -R /root/.yowsup/ /var/www/.yowsup
# chown -R apache:apache /var/www/.yowsup/
Если этого не сделать, то сообщения отправляться не будут, а в файле ошибок apache - /var/log/httpd/error_log будет появляться сообщение:
Traceback (most recent call last):
  File "/usr/bin/yowsup-cli", line 5, in <module>
    pkg_resources.run_script('yowsup2==2.4.48', 'yowsup-cli')
  <…..>
OSError: [Errno 13] Permission denied: '/var/www/.yowsup'

27 марта 2016
После нескольких месяцев работы при отправке сообщения вдруг стал получать ошибку:
# yowsup-cli demos -c yowsup-cli.config -M -s 7917XXXXXXX "Текст сообщения"
/usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/demos/sendclient/stack.py:56: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  print("Authentication Error: %s" % e.message)
Authentication Error: not-authorized
Попытался повторно авторизоваться. Выдается ошибка:
# python yowsup-cli registration --requestcode sms --phone 7917XXXXXXX --cc 7 --mcc 250 --mnc 01
INFO:yowsup.common.http.warequest:{"status":"fail","reason":"old_version"}
INFO:yowsup.common.http.warequest:{"status":"fail","reason":"old_version"}
status: fail
reason: old_version

Установка новой версии Yowsup 2

# cd /usr/src/
Удаляем старые версии:
# rm -fR yowsup-master/
# rm -fR master
Качаем свежую версию и устанавливаем:
# wget https://github.com/tgalal/yowsup/archive/master.zip
# unzip master
# cd yowsup-master/
# python setup.py install
Закончится установка выводом:
Finished processing dependencies for yowsup2==2.4.48
Конфигурационные файлы после переустановки удалились.
Далее выполняем рекомендации, взятые отсюда: http://stackoverflow.com/questions/35877803/yowsup-old-version-error 
Открываем файл env_android.py:
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/env/env_android.py
И меняем содержание переменных _MD5_CLASSES, _KEY  и _VERSION
Должно быть так:
    _MD5_CLASSES = "7UDPOXwpiLBvEjT8uNwsuA=="
    _KEY = "eQV5aq/Cg63Gsq1sshN9T3gh+UUp0wIw0xgHYT1bnCjEqOJQKCRrWxdAe2yvsDeCJL+Y4G3PRD2HUF7oUgiGo8vGlNJOaux26k+A2F3hj8A="
_VERSION = "2.12.440"
Затем открываем файл yowsup/registration/coderequest.py:
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/registration/coderequest.py
Здесь вместо строк:
from yowsup.env import S40YowsupEnv
CURRENT_ENV = S40YowsupEnv()
пишем:
from yowsup.env import AndroidYowsupEnv
CURRENT_ENV = AndroidYowsupEnv()
То же делаем в файле warequest.py
# nano /usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/common/http/warequest.py

Повторная регистрация
# yowsup-cli registration --requestcode sms --phone 7917XXXXXXX --cc 7 --mcc 250 --mnc 01
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":65,"sms_wait":65,"voice_wait":65}
status: sent
retry_after: 65
length: 6
method: sms
Повторно подтверждаем регистрацию
# yowsup-cli registration --register 240-411 --phone 7917XXXXXXX --cc 7
INFO:yowsup.common.http.warequest:{"status":"ok","login":"7917XXXXXXX","type":"existing","pw":"jv5p/tEC5z61pkwQ0MwzjDMVn2M=","expiration":4444444444.0,"kind":"free","price":"33,00 \u0440\u0443\u0431.","cost":"33.00","currency":"RUB","price_expiration":1462183400}
status: ok
kind: free
pw: jv5p/tEC5z61pkwQ0MwzjDMVn2M=
price: 33,00 руб.
price_expiration: 1462183400
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 7917XXXXXXX
type: existing

Создаем конфигурационный файл 
# touch /usr/src/yowsup-master/yowsup-cli.config
# nano /usr/src/yowsup-master/yowsup-cli.config
и пишем в него:
cc=7
phone=7917XXXXXXX
password=jv5p/tEC5z61pkwQ0MwzjDMVn2M=

Отправка сообщений

К сожалению у меня так и  не получилось отправить сообщение. Все заканчивалось сообщением о неудачной авторизации.
# yowsup-cli demos -c /usr/src/yowsup-master/yowsup-cli.config -M -s 7917XXXXXXX "Авария на сети "
/usr/lib/python2.6/site-packages/yowsup2-2.4.48-py2.6.egg/yowsup/demos/sendclient/stack.py:56: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  print("Authentication Error: %s" % e.message)
Authentication Error: not-authorized

Промучившись несколько дней я так и не нашел решения. Весь вышеприведенный текст поэтому может оказаться бесполезным. Написал его для того что бы помнить, что я делал и может быть когда-то вернусь к этой теме. 
Если кто-то знает, как исправить ситуацию – напишите, буду рад. 



суббота, 30 января 2016 г.

Клонирование потока Netflow на несколько приемников трафика.

Имеется ситуация, когда с маршрутизатора Cisco ASR1006 в формате Netflow ver9 льется поток данных о NAT трансляциях. На маршрутизаторе Cisco ASR1006 в конфигурации прописано:
ip nat log translations flow-export v9 udp destination 10.200.15.117 2000
(лить nat log в формате netflow ver9 на ip 10.200.15.117 и порт 2000)
Эту строчку можно написать только один раз и следовательно лить логи NAT трансляций в формате Netflow можно только на один адрес/порт получателя. Но иногда возникает необходимость распараллелить поток Netflow на два сервера-приемника или больше. 
Для решения этой задачи можно воспользоваться утилитой samplicator, умеющей размножать UDP трафик. (https://github.com/sleinen/samplicator).
Схема должна в конечном счет получиться такая:



1. Установка утилиты samplicator, позволяющей размножать потоки UDP:
# cd /usr/src/
# git clone https://github.com/sleinen/samplicator
# cd samplicator
# automake
# ./autogen.sh
# ./ configure
# make 
# make install

2. Запуск утилиты samplicator выполняется командой:
# samplicate -S 127.0.0.1/2059 172.16.6.130/2059
После запуска утилиты консоль будет заблокирована и система начнет слушать порт 2000 (по умолчанию для утилиты samplicate) и все UDP пакеты отправлять получателям:
 - ip 127.0.0.1 порт 2059
 - ip 172.16.6.130 порт 2059
Ключ -S указывает на то что утилите необходимо сохранить оригинальный ip адрес источника трафика.
В соседней консоли сервера можно проконтролировать прием и отправку пакетов с помощью tcpdump:
Проверка приходящих пакетов на порт 2000:
#tcpdump port 2000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:25:13.250021 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
09:25:13.262595 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
09:25:13.275274 IP 10.200.15.118.59948 > 10.200.15.117.sieve-filter: UDP, length 1052
Видим, что пакеты при ходят с 10.200.15.118 на наш сервер (10.200.15.117)
Обозначение sieve-filter – это как раз порт 2000.
Проверка уходящих пакетов на порт 2059
#tcpdump port 2059
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:27:55.685079 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1052
09:27:55.690870 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1052
09:27:55.697099 IP 10.200.15.118.59948 > 172.16.6.130.bmc-messaging: UDP, length 1088
Видим, что пакеты уходят на второй сервер 172.16.6.130 на порт bmc-messaging (2059) с сохраненным ip адресом источника (10.200.15.118).

Что бы запустить команду в фоне выполняем:
# samplicate -Sf 127.0.0.1/2059 172.16.6.130/2059
Для добавления в автозагрузку добавляем эту строчку в файл /etc/rc.local
Чтобы заставить утилиту samplicate слушать не порт 2000, а любой другой необходимо применить ключ –p.
Например для прослушивания порта 4000 выполняем:
# samplicate -Sf -p 4000  127.0.0.1/2059 172.16.6.130/2059

3. Справка
Если нужно просто попрактиковаться и нет потока Netflow с Cisco, отправить UDP пакеты получателю на определенный ip и порт можно воспользоваться утилитой netcat и выполнить команду: 
# echo -n "foo" | nc -4u -w1 10.200.15.117 2000
Пакет с содержимым «foo» уйдет на ip 10.200.15.117 и на порт 2000

Что бы убедиться, что локальный приемник Netflow трафика принимает пакеты на Ip 127.0.0.1, порт 2059 не достаточно утилиты tcpdump. Она не может прослушать интерфейс lo.
Смотрим кто слушает порт 2059
# netstat -ltupn | grep 2059
udp        0    0 0.0.0.0:2059     0.0.0.0:*     1459/nfcapd
Ищем как запущен процесс nfcapd
# ps ax |  grep nfcapd
 1456 ? S 0:00 /usr/local/bin/nfcapd -w -D -l /mnt/disk1/NFLogs/netflow/R7/ -p 2055
 1459 ? S 9:53 /usr/local/bin/nfcapd -w -D -l /mnt/disk1/NFLogs/NEL/R7/ -p 2059
 6669 pts/0 S+   0:00 grep nfcapd
Видим, что порт 2059 прослушивается утилитой и при этом задействуется директория /mnt/disk1/NFLogs/NEL/R7/.
Смотрим содержимое директории несколько раз подряд:
# ls -l /mnt/disk1/NFLogs/NEL/R7/
итого 115708
-rw-r--r-- 1 root root 118482132 Янв 30 09:39 nfcapd.current.1457
# ls -l /mnt/disk1/NFLogs/NEL/R7/
итого 117756
-rw-r--r-- 1 root root 120579156 Янв 30 09:39 nfcapd.current.1457
Размер файла меняется. Значит данные получаются и записываются.
Если размер файла меняться не будет – значит что-то не так и локальный сборщик netflow не работает.

среда, 27 января 2016 г.

Установка и использование удаленного рабочего стола в CentOS7

Для возможности подключаться к удаленному рабочему столу Linux CentOS7 c Windows машины с использованием RDP необходимо сначала установить сам рабочий стол в CentOS7, запустить его, а затем установить и запустить сервер xdrp.

1. Установка GNOME проста:
# yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
Запуск графической оболочки выполняется командой:
# startx
При этом консоль будет заблокирована.

Остановка сервиса выполняется командой CTRL+C

Включить запуск графической оболочки при загрузке системы можно так:
# ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
После перезагрузки системы необходимо принять лицензионное соглашение. И это можно сделать только в консоле сервера. Доступ по SSH будет заблокирован.
Процедура принятия лицензионного соглашения в консоли сервера:
Сначала набираем «q»:


Потом набираем «yes»:


Затем принимаем лицензионное соглашение:



Теперь можно войти в графический интерфейс сервера с консоли:
   


После загрузки системы с графическим интерфейсом к ней можно подключиться по SSH.
Проверить статус графической системы можно так:
# systemctl status graphical.target

Включить запуск системы без графической оболочки можно следующим образом:
# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

2. Установка сервера xrdp в CentOS7
Убедиться, что имеется подключенный репозитарий EPEL.
Если репозитарий не установлен, то установить его:
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
Затем установка сервера xrdp:
# yum -y install xrdp tigervnc-server
Запуск и добавление сервиса xrdp в автозапуск:
# systemctl start xrdp.service
# systemctl enable xrdp.service
Проверка портов, который слушает xrdp:
# netstat -antup | grep xrdp
tcp      0  0 127.0.0.1:3350 0.0.0.0:*  LISTEN   17082/xrdp-sesman
tcp      0  0 0.0.0.0:3389   0.0.0.0:*  LISTEN   17083/xrdp
Порт 3389 должен быть открыт в Firewall на сервере.

3. Подключение по RDP к рабочему столу GNOME выполняется в следующей последовательности:
Запустить программу подключения к удаленному рабочем столу.


Сменить язык раскладки клавиатуры на английский (так как потом этого сделать будет нельзя)


Установить параметры подключения - глубину цвета "24 бита"


Нажать кнопку «Подключить»
Произойдет подключение к серверу:


Вводим логин и пароль пользователя и видим рабочий стол:
Все. Результат достигнут.