Ce chapitre couvre des sujets pour utilisateurs expérimentés qui contournent l’interface web normale plutôt que de la contourner : accès direct à la base de données et SQL, ainsi que des scripts de nettoyage de base de données en ligne de commande. La plupart des utilisateurs n’auront jamais besoin de ce chapitre.

Connexion directe à la base de données SMSEagle

La base de données de SMSEagle s’exécute sur PostgreSQL. Vous pouvez y accéder directement pour lire ou écrire des messages SMS via des requêtes SQL, au lieu de passer par l’interface web ou l’API.

L’accès à la base de données pour les applications externes est désactivé par défaut. Activez-le sous Settings > Global settings > Application > Access to DB for external applications.

Une fois activé, connectez-vous à la base de données à partir d’une application externe en utilisant :

  • Host : l’adresse IP de l’appareil

  • Database name : smseagle

  • User : smseagleuser

  • Password : postgreeagle

Injection d’un SMS court via SQL

Un message texte court (jusqu’à 160 caractères) :

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;

Le message ci-dessus appartient à l’utilisateur avec id_user 1 (l’utilisateur admin par défaut) - les valeurs id_user des autres utilisateurs se trouvent dans la table public."user". Le champ SenderID identifie quel modem envoie le message : smseagle1 pour le modem 1, smseagle2 pour le modem 2.

Injection d’un SMS long via SQL

Les messages multi-parties nécessitent également un en-tête UDH, stocké sous forme de chaîne hexadécimale dans le champ UDH. À moins d’avoir une raison spécifique de le faire manuellement, utilisez l’API à la place (voir API and Developer Integration).

Pour un long message texte, l’UDH commence par 050003, suivi d’un octet utilisé comme référence de message (n’importe quelle valeur hexadécimale, mais différente pour chaque message - D3 ci-dessous), un octet pour le nombre total de parties (02 ci-dessous, unique par message envoyé au même numéro), et un octet pour le numéro de partie actuel (01 pour la première partie, 02 pour la deuxième, et ainsi de suite).

Un message long en deux parties ressemble à ceci :

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;

L’ajout d’un UDH laisse moins de place au texte - l’exemple ci-dessus permet seulement 153 caractères par partie de message.

Scripts de nettoyage de la base de données

Quelques scripts sont disponibles pour supprimer des messages SMS de la base de données via l’interface de ligne de commande Linux, situés à /mnt/nand-user/scripts/ :

Script

Utilisation

Objectif

db_delete

./db_delete YYYYMMDDhhmm

Supprimer les SMS de Inbox et SentItems antérieurs à la date donnée

db_delete_7days

./db_delete_7days

Supprimer les SMS de Inbox et SentItems antérieurs à 7 jours

db_delete_allfolders

./db_delete_allfolders

Nettoie Inbox, SentItems et Outbox - conçu pour s’exécuter périodiquement via cron

db_delete_select

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

Supprimer les SMS d’un dossier choisi

Ajouter un script à cron : créer un fichier sous /etc/cron.d/ (par exemple db_cleaner) avec un contenu tel que :

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

Cet exemple exécute le script de nettoyage le 1er de chaque mois.

Transfert des journaux vers un serveur externe

SMSEagle écrit ses journaux via rsyslog. Pour envoyer une copie vers un serveur syslog central, ajoutez une règle de transfert via SSH. Il n’y a pas de paramètre pour cela dans l’interface web.

  1. Connectez-vous au dispositif via SSH en tant que root.

  2. Créez le fichier /etc/rsyslog.d/005-remote.conf avec cette règle, en remplaçant l’adresse, le port et le protocole par ceux de votre serveur :

    *.* action(type="omfwd" target="192.0.2.250" port="514" protocol="udp"
               action.resumeRetryCount="10"
               queue.type="linkedList" queue.size="10000")
    
    • target - adresse IP ou nom d’hôte du serveur syslog.

    • port - port sur lequel le serveur écoute, généralement 514.

    • protocol - udp ou tcp.

    • Les paramètres de file d’attente conservent jusqu’à 10 000 messages sur le dispositif pendant que le serveur est inaccessible, et les envoient une fois qu’il est de retour.

  3. Vérifiez la configuration, puis redémarrez rsyslog :

    rsyslogd -N1
    systemctl restart rsyslog
    

Conservez le nom du fichier. Les journaux propres à SMSEagle (Application, API, Message, et les services e-mail, appel, Signal et WhatsApp) sont écrits par des règles dans /etc/rsyslog.d/010-*.conf à 018-*.conf, et chacune de ces règles arrête le traitement ultérieur de ses messages. Une règle de transfert placée après elles, par exemple à la fin de /etc/rsyslog.conf, ne transfère que les journaux système. Le préfixe 005- fait que rsyslog lit la règle de transfert en premier, de sorte que chaque message est transféré.

Pour chiffrer le trafic des journaux avec TLS, consultez le guide rsyslog Encrypting Syslog Traffic with TLS.