Cliente de SMS + Modem 3G sobre contenedor OpenVZ = SMS to Mail
En este manual veremos como preparar un contenedor VZ en un entorno Proxmox para la utilización de un dongle/Modem 3G (en este caso un K3770 de Huawei) para recibir SMS dentro del contenedor VZ, y a la misma vez reenviarlos vía Email.
Me encuentro que dispongo de muchos servicios de verificación de identidad mediante código por SMS asociados a una SIM antigua y muchos de estos servicios no me permiten modificar el numero asociado, me he visto obligado a seguir conservando el antiguo numero, para facilitarme la tarea he realizado este manual que me envié por Email los SMS.
He visto varios manuales de como realizarlo sobre una raspberry, pero actualmente dispongo de un HP MicroServer trabajando sobre la plataforma Proxmox, mi idea era poder realizar esto sobre un contenedor VZ (para no tener que depender de mas equipos).
Lo primero que necesitamos es dar de alta un contenedor VZ utilizando la template debian-7.0-standard_7.0-2_i386.tar.gz 256MB de RAM, 5GB y 1 Core sera suficiente (recordemos activar que la maquina se inicie en el boot para cuando reiniciemos la maquina física).
Maquina física
Antes de pasar al contenedor VZ debemos realizar una pequeña preparación en la maquina física Proxmox, necesitaremos tener el paquete del usbswitch instalado para que la maquina nos reconozca el USB 3G en modo modem/phone y no en MassStorage, procedemos a conectar el Modem 3G a la maquina física y realizamos un:
lsusb
Vemos que nos indica que detecta el Modem 3G, pero en modo unidad de almacenamiento
Huawei Technologies Co., Ltd. K3770 Mass Storage
Para solucionar esto debemos instalar el paquete usb mode switch
apt-get install usb-modeswitch
Una vez instalado desconectamos el Modem 3G y lo volvemos a conectar, volvemos a realizar un:
lsusb
Podemos observar que ahora nos indica que lo detecta en modo Modem
Huawei Technologies Co., Ltd. K3770 3G Modem
El ultimo paso a realizar es mapear los puertos COM que utiliza el Modem 3G hacia el contenedor VZ, revisamos el nombre de los puertos
dmesg | grep tty
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2
usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3
Normalmente con el ttyUSB0 es suficiente (dado que el Modem 3G utiliza varios puertos para distintos servicios) pero nosotros los mapearemos todos, para realizar esto de forma manual el comando a realizar seria el siguiente
vzctl set 112 --devnodes ttyUSB0:rw --save
vzctl set 112 --devnodes ttyUSB1:rw --save
vzctl set 112 --devnodes ttyUSB2:rw --save
vzctl set 112 --devnodes ttyUSB3:rw --save
Donde 112 es el numero de container, este paso no queda de forma permanente en el fichero de configuración del contenedor, (solo almacena el ultimo comando) de forma que si queremos que se habilite de forma automática al iniciar el contenedor tendremos que aplicarlo en el fichero .conf del contenedor VZ.
nano /etc/vz/conf/112.conf
Recordando que 112 es el numero de container, añadimos las siguientes lineas al final del fichero y guardamos (si disponíamos de alguna similar la sobrescribimos)
DEVNODES="ttyUSB0:rw "
DEVNODES="ttyUSB1:rw "
DEVNODES="ttyUSB2:rw "
DEVNODES="ttyUSB3:rw "
Ya disponemos de la configuración adecuada en la maquina física para delegar la utilización del Modem 3G en el container VZ.
Contenedor VZ
Iniciamos el contenedor VZ, lo primero a realizar es actualizar los repositorios y los paquetes
aptitude update
aptitude upgrade
Procedemos a instalar los paquetes de Gammu que seran los encargados de comunicarse con el Modem 3G
aptitude install Gammu Gammu-smsd
Una vez instalado Gammu vamos a habilitar los permisos de los puertos COM en el contenedor, para ello lo que recomiendo es editar el rc.local para parar Gammu al iniciar, otorgar los permisos correctos a los puertos y volver a iniciar Gammu.
nano /etc/rc.local
Añadimos lo siguiente antes del exit 0
/etc/init.d/gammu-smsd stop
chmod a+rw /dev/ttyUSB*
/etc/init.d/gammu-smsd start
Vamos a la configuración de Gammu, editamos el fichero gammu-smsdrc para añadir la información de los puertos y habilitar el log en syslog.
nano /etc/gammu-smsdrc
Y lo dejamos con la siguiente información:
[gammu]
device = /dev/ttyUSB0
name = Phone on USB serial port (null) (null)
connection = at
[gammu1]
device = /dev/ttyUSB1
name = Phone on USB serial port (null) (null)
connection = at
[gammu2]
device = /dev/ttyUSB3
name = Phone on USB serial port (null) (null)
connection = at
# SMSD configuration, see gammu-smsdrc(5)
[smsd]
service = files
logfile = syslog
# Increase for debugging information
debuglevel = 1
RunOnReceive = /etc/enviarSMSMail.sh #Envio del SMS a Email
# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/
Procedemos a crear el script de envió de los SMS a Email, este script le hemos dicho a Gammu que ejecute al recibir un SMS, se encuentra en /etc
nano /etc/enviarSMSMail.sh
Y añadimos lo siguiente: (hay que tener en cuenta que nuestro contenedor VZ disponga de las herramientas necesarias para enviar Email, podeis consultar el anterior post para configurarlo como relay de Gmail)
cd /var/spool/gammu/inbox && cat $(ls -t | head -n 1) | mail -s "SMS Recibido" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
Assignamos permisos de ejecución:
chmod +x /etc/enviarSMSMail.sh
Ya disponemos del contenedor VZ preparado para recibir SMS vía Gammu y enviarlos por Email con el script que hemos creado, procedemos a apagar el contenedor VZ y volverlo a encender, revisamos los logs para verificar si hay algún error en Gammu y aprovechamos para mandarnos un SMS de prueba para verificar que funciona de forma correcta
Podeis utilizar http://www.afreesms.com/freesms/ para realizar un envio de SMS de prueba.
tail -f /var/log/syslog
Vemos que inicia de forma correcta
Nov 1 17:32:40 gsm gammu-smsd[2312]: mode: Send=1, Receive=1
Nov 1 17:32:40 gsm gammu-smsd[2312]: deliveryreport = no
Nov 1 17:32:40 gsm gammu-smsd[2312]: phoneid =
Nov 1 17:32:40 gsm gammu-smsd[2312]: Inbox is "/var/spool/gammu/inbox/" with format "standard"
Nov 1 17:32:40 gsm gammu-smsd[2312]: Outbox is "/var/spool/gammu/outbox/" with format "detail" and transmission format "7bit"
Nov 1 17:32:40 gsm gammu-smsd[2312]: Sent SMS moved to "/var/spool/gammu/sent/"
Nov 1 17:32:40 gsm gammu-smsd[2312]: SMS with errors moved to "/var/spool/gammu/error/"
Nov 1 17:32:40 gsm gammu-smsd[2313]: Created POSIX RW shared memory at 0xb770c000
Nov 1 17:32:40 gsm gammu-smsd[2313]: Starting phone communication...
Nov 1 17:32:40 gsm kernel: ioctl32(gammu-smsd:625172): Unknown cmd fd(4) cmd(00005309){t:'S';sz:0} arg(00000000) on /dev/ttyUSB0
Despues de unos segundos vemos que nos entra el SMS y Gammu lanza el script para reenviarlo por Email con éxito
Nov 1 17:36:43 gsm gammu-smsd[2313]: Received message from: +16264616576
Nov 1 17:36:43 gsm gammu-smsd[2313]: Read 1 messages
Nov 1 17:36:43 gsm gammu-smsd[2313]: Received IN20151101_173639_00_+16264616576_00.txt
Nov 1 17:36:43 gsm gammu-smsd[2578]: Starting run on receive: /etc/enviarSMSMail.sh IN20151101_173639_00_+16264616576_00.txt
Nov 1 17:36:43 gsm gammu-smsd[2313]: Process finished successfully
Nov 1 17:36:43 gsm postfix/pickup[2261]: 26C94908683: uid=104 from=<gammu>
Nov 1 17:36:43 gsm postfix/cleanup[2588]: 26C94908683: message-id=<Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.;
Nov 1 17:36:43 gsm postfix/qmgr[2262]: 26C94908683: from=<Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.;, size=333, nrcpt=1 (queue active)
Nov 1 17:36:45 gsm postfix/smtp[2590]: 26C94908683: to=<cmos486Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.;, relay=smtp.gmail.com[173.194.67.109]:587, delay=2.2, delays=0.02/0.04/1.4/0.73, dsn=2.0.0, status=sent (250 2.0.0 OK 1446395805 bo7sm17670094wjb.46 - gsmtp)
Nov 1 17:36:45 gsm postfix/qmgr[2262]: 26C94908683: removed
Si por alguna razón no nos llega el Email con el SMS podemos verificar si ha llegado en el log y verificar que ha quedado guardado en /var/spool/gammu/inbox/