Este capítulo cubre temas para usuarios avanzados que evitan la interfaz web normal en lugar de usarla: acceso directo a bases de datos y SQL, y scripts de limpieza de bases de datos por línea de comandos. La mayoría de los usuarios nunca necesitarán este capítulo.

Conectarse directamente a la base de datos de SMSEagle

La base de datos de SMSEagle se ejecuta en PostgreSQL. Puede acceder a ella directamente para leer o escribir mensajes SMS mediante consultas SQL, en lugar de ir a través de la interfaz web o la API.

El acceso a la base de datos para aplicaciones externas está deshabilitado por defecto. Habilítelo en Settings > Global settings > Application > Access to DB for external applications.

Una vez habilitado, conéctese a la base de datos desde una aplicación externa usando:

  • Host: la dirección IP del dispositivo

  • Database name: smseagle

  • User: smseagleuser

  • Password: postgreeagle

Inyectar un SMS corto usando SQL

Un mensaje de texto corto (hasta 160 caracteres):

INSERT INTO outbox (
    DestinationNumber,
    TextDecoded,
    CreatorID,
    Coding,
    Class,
    SenderID
) VALUES (
    '1234567',
    'This is a SQL test message',
    'Program',
    'Default_No_Compression',
    -1,
    'smseagle1'
);
INSERT INTO user_outbox (
    id_outbox,
    id_user
) SELECT CURRVAL(pg_get_serial_sequence('outbox','ID')), 1;

El mensaje anterior pertenece al usuario con id_user 1 (el usuario admin predeterminado) - los valores de id_user de otros usuarios están en la tabla public."user". El campo SenderID identifica qué módem envía el mensaje: smseagle1 para el módem 1, smseagle2 para el módem 2.

Inyectar un SMS largo usando SQL

Los mensajes multiparte también necesitan un encabezado UDH, almacenado como una cadena hexadecimal en el campo UDH. A menos que tenga una razón específica para hacerlo manualmente, use la API en su lugar (consulte API and Developer Integration).

Para un mensaje de texto largo, el UDH comienza con 050003, seguido de un byte utilizado como referencia de mensaje (cualquier valor hexadecimal, pero diferente para cada mensaje - D3 abajo), un byte para el número total de partes (02 abajo, único por mensaje enviado al mismo número), y un byte para el número de parte actual (01 para la primera parte, 02 para la segunda, y así sucesivamente).

Un mensaje largo de dos partes se ve así:

INSERT INTO outbox (
    "DestinationNumber",
    "CreatorID",
    "MultiPart",
    "UDH",
    "TextDecoded",
    "Coding",
    "Class",
    "SenderID"
) VALUES (
    '1234567',
    'Program',
    'true',
    '050003D30201',
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, qui',
    'Default_No_Compression',
    -1,
    'smseagle1'
)
INSERT INTO outbox_multipart (
    "ID",
    "SequencePosition",
    "UDH",
    "TextDecoded",
    "Coding",
    "Class"
) SELECT
    CURRVAL(pg_get_serial_sequence('outbox','ID')),
    2,
    '050003D30202',
    's nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.',
    'Default_No_Compression',
    -1;
INSERT INTO user_outbox (
    id_outbox,
    id_user
) SELECT
    CURRVAL(pg_get_serial_sequence('outbox','ID')),
    1;

Agregar un UDH deja menos espacio para texto - el ejemplo anterior permite solo 153 caracteres por parte de mensaje.

Scripts de limpieza de bases de datos

Hay algunos scripts disponibles para eliminar mensajes SMS de la base de datos a través de la CLI de Linux, ubicados en /mnt/nand-user/scripts/:

Script

Uso

Propósito

db_delete

./db_delete YYYYMMDDhhmm

Eliminar SMS de Inbox y SentItems anteriores a la fecha especificada

db_delete_7days

./db_delete_7days

Eliminar SMS de Inbox y SentItems anteriores a 7 días

db_delete_allfolders

./db_delete_allfolders

Limpiar Inbox, SentItems y Outbox - diseñado para ejecutarse periódicamente vía cron

db_delete_select

./db_delete_select {inbox|outbox|sentitems|trash}

Eliminar SMS de una carpeta seleccionada

Agregar un script a cron: crear un archivo bajo /etc/cron.d/ (por ejemplo db_cleaner) con contenido como:

0 0 1 * * root /mnt/nand-user/scripts/db_delete_allfolders

Este ejemplo ejecuta el script de limpieza el primer día de cada mes.

Reenvío de registros a un servidor externo

SMSEagle escribe sus registros a través de rsyslog. Para enviar una copia a un servidor syslog centralizado, agregue una regla de reenvío sobre SSH. No hay ninguna configuración para esto en la interfaz web.

  1. Inicie sesión en el dispositivo por SSH como root.

  2. Cree el archivo /etc/rsyslog.d/005-remote.conf con esta regla, reemplazando la dirección, puerto y protocolo por los de su servidor:

    *.* action(type="omfwd" target="192.0.2.250" port="514" protocol="udp"
               action.resumeRetryCount="10"
               queue.type="linkedList" queue.size="10000")
    
    • target - dirección IP o nombre de host del servidor syslog.

    • port - puerto en el que escucha el servidor, normalmente 514.

    • protocol - udp o tcp.

    • La configuración de cola mantiene hasta 10000 mensajes en el dispositivo mientras el servidor es inaccesible, y los envía una vez que está disponible nuevamente.

  3. Compruebe la configuración y, a continuación, reinicie rsyslog:

    rsyslogd -N1
    systemctl restart rsyslog
    

Conserve el nombre del archivo. Los registros propios de SMSEagle (Application, API, Message y los servicios de correo electrónico, llamadas, Signal y WhatsApp) se escriben mediante reglas en /etc/rsyslog.d/010-*.conf a 018-*.conf, y cada una de esas reglas detiene el procesamiento adicional de sus mensajes. Una regla de reenvío colocada después de ellas, por ejemplo al final de /etc/rsyslog.conf, solo reenvía los registros del sistema. El prefijo 005- hace que rsyslog lea primero la regla de reenvío, de modo que todos los mensajes se reenvíen.

Para cifrar el tráfico de registro con TLS, consulte la guía de rsyslog Encrypting Syslog Traffic with TLS.