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

Conexión directa 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 usar 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 hacer esto 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 la base de datos

Hay varios 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 más antiguos que la fecha especificada

db_delete_7days

./db_delete_7days

Eliminar SMS de Inbox y SentItems más antiguos que 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 1º 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 central, agregue una regla de reenvío sobre SSH. No hay una 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 con 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, generalmente 514.

    • protocol - udp o tcp.

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

  3. Verifique la configuración y reinicie rsyslog:

    rsyslogd -N1
    systemctl restart rsyslog
    

Conserve el nombre del archivo. Los propios registros 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 posterior 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 la regla de reenvío primero, para que todos los mensajes se reenvíen.

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