Dieses Kapitel behandelt Themen für fortgeschrittene Benutzer, die den normalen Web-Interface umgehen und direkt mit ihm arbeiten: direkter Datenbankzugriff und SQL sowie Kommandozeilen-Datenbankbereinigungsskripte. Die meisten Benutzer werden dieses Kapitel nie benötigen.

Direkter Zugriff auf die SMSEagle-Datenbank

Die Datenbank von SMSEagle wird mit PostgreSQL betrieben. Sie können direkt darauf zugreifen, um SMS-Nachrichten über SQL-Abfragen zu lesen oder zu schreiben, anstatt über die Web-Oberfläche oder die API zu gehen.

Der Datenbankzugriff für externe Anwendungen ist standardmäßig deaktiviert. Aktivieren Sie ihn unter Settings > Global settings > Application > Access to DB for external applications.

Stellen Sie nach der Aktivierung eine Verbindung zur Datenbank von einer externen Anwendung aus her mit:

  • Host: die IP-Adresse des Geräts

  • Datenbankname: smseagle

  • Benutzer: smseagleuser

  • Passwort: postgreeagle

Injizieren einer Kurz-SMS mit SQL

Eine Kurznachricht (bis zu 160 Zeichen):

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;

Die obige Nachricht gehört zum Benutzer mit id_user 1 (dem Standard-Benutzer admin) – die id_user-Werte anderer Benutzer finden Sie in der Tabelle public."user". Das Feld SenderID bezeichnet, welches Modem die Nachricht sendet: smseagle1 für Modem 1, smseagle2 für Modem 2.

Injizieren einer Langtext-SMS mit SQL

Mehrteilige Nachrichten benötigen auch einen UDH-Header, der als Hexadezimalzeichenkette im Feld UDH gespeichert wird. Wenn Sie keinen spezifischen Grund haben, dies manuell zu tun, verwenden Sie stattdessen die API (siehe API and Developer Integration).

Bei einer Langtextnachricht beginnt der UDH mit 050003, gefolgt von einem Byte, das als Nachrichtenreferenz verwendet wird (ein beliebiger Hexadezimalwert, aber unterschiedlich für jede Nachricht – D3 unten), einem Byte für die Gesamtzahl der Teile (02 unten, eindeutig pro an die gleiche Nummer gesendete Nachricht) und einem Byte für die aktuelle Teilenummer (01 für den ersten Teil, 02 für den zweiten usw.).

Eine zweiteilige Langnachricht sieht folgendermaßen aus:

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;

Das Hinzufügen eines UDH lässt weniger Platz für Text – das obige Beispiel ermöglicht nur 153 Zeichen pro Nachrichtenteil.

Datenbankbereinigungsskripte

Mehrere Skripte zum Löschen von SMS-Nachrichten aus der Datenbank über die Linux-CLI sind unter /mnt/nand-user/scripts/ verfügbar:

Skript

Verwendung

Zweck

db_delete

./db_delete YYYYMMDDhhmm

SMS aus Inbox und SentItems löschen, die älter als das angegebene Datum sind

db_delete_7days

./db_delete_7days

SMS aus Inbox und SentItems löschen, die älter als 7 Tage sind

db_delete_allfolders

./db_delete_allfolders

Inbox, SentItems und Outbox bereinigen – konzipiert für regelmäßige Ausführung über cron

db_delete_select

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

SMS aus einem gewählten Ordner löschen

Skript zu cron hinzufügen: erstellen Sie eine Datei unter /etc/cron.d/ (zum Beispiel db_cleaner) mit folgendem Inhalt:

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

Dieses Beispiel führt das Bereinigungsskript am 1. jeden Monats aus.

Weitergabe von Logs an einen externen Server

SMSEagle schreibt seine Logs über rsyslog. Um eine Kopie davon an einen zentralen Syslog-Server zu senden, fügen Sie eine Weiterleitungsregel über SSH hinzu. Es gibt keine Einstellung dafür in der Weboberfläche.

  1. Melden Sie sich über SSH als root am Gerät an.

  2. Erstellen Sie die Datei /etc/rsyslog.d/005-remote.conf mit dieser Regel, ersetzen Sie die Adresse, den Port und das Protokoll durch die Ihres Servers:

    *.* action(type="omfwd" target="192.0.2.250" port="514" protocol="udp"
               action.resumeRetryCount="10"
               queue.type="linkedList" queue.size="10000")
    
    • target - IP-Adresse oder Hostname des Syslog-Servers.

    • port - Port, auf dem der Server lauscht, normalerweise 514.

    • protocol - udp oder tcp.

    • Die Warteschlangeneinstellungen behalten bis zu 10000 Nachrichten auf dem Gerät, während der Server nicht erreichbar ist, und senden diese, sobald er wieder verfügbar ist.

  3. Überprüfen Sie die Konfiguration und starten Sie dann rsyslog neu:

    rsyslogd -N1
    systemctl restart rsyslog
    

Behalten Sie den Dateinamen bei. SMSEagles eigene Logs (Application, API, Message und die E-Mail-, Anruf-, Signal- und WhatsApp-Services) werden durch Regeln in /etc/rsyslog.d/010-*.conf bis 018-*.conf geschrieben, und jede dieser Regeln stoppt die weitere Verarbeitung ihrer Nachrichten. Eine Weiterleitungsregel, die danach platziert ist, beispielsweise am Ende von /etc/rsyslog.conf, leitet nur die Systemlogs weiter. Das Präfix 005- bewirkt, dass rsyslog die Weiterleitungsregel zuerst liest, sodass jede Nachricht weitergeleitet wird.

Um den Log-Datenverkehr mit TLS zu verschlüsseln, siehe das rsyslog-Handbuch Encrypting Syslog Traffic with TLS.