Ten rozdział obejmuje tematy dla użytkowników zaawansowanych, które omijają normalny interfejs sieciowy zamiast go używać: bezpośredni dostęp do bazy danych i SQL, oraz skrypty oczyszczania bazy danych z wiersza poleceń. Większość użytkowników nigdy nie będzie potrzebować tego rozdziału.

Bezpośrednie połączenie z bazą danych SMSEagle

Baza danych SMSEagle działa na PostgreSQL. Możesz uzyskać do niej bezpośredni dostęp do odczytu lub zapisu wiadomości SMS za pośrednictwem zapytań SQL, zamiast korzystać z interfejsu sieciowego lub API.

Dostęp do bazy danych dla aplikacji zewnętrznych jest domyślnie wyłączony. Włącz go w sekcji Settings > Global settings > Application > Access to DB for external applications.

Po włączeniu połącz się z bazą danych z aplikacji zewnętrznej, używając:

  • Host: adres IP urządzenia

  • Nazwa bazy danych: smseagle

  • Użytkownik: smseagleuser

  • Hasło: postgreeagle

Wstrzykiwanie krótkiej wiadomości SMS za pomocą SQL

Krótka wiadomość tekstowa (do 160 znaków):

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;

Powyższa wiadomość należy do użytkownika z id_user 1 (domyślny użytkownik admin) - wartości id_user innych użytkowników znajdują się w tabeli public."user". Pole SenderID identyfikuje, który modem wysyła wiadomość: smseagle1 dla modemu 1, smseagle2 dla modemu 2.

Wstrzykiwanie długiej wiadomości SMS za pomocą SQL

Wiadomości wieloczęściowe wymagają również nagłówka UDH, przechowywane jako ciąg szesnastkowy w polu UDH. O ile nie masz konkretnego powodu, aby to robić ręcznie, użyj zamiast tego API (zobacz API i integracja dla deweloperów).

W przypadku długiej wiadomości tekstowej, UDH zaczyna się od 050003, a następnie jeden bajt używany jako odniesienie wiadomości (dowolna wartość szesnastkowa, ale różna dla każdej wiadomości - D3 poniżej), jeden bajt na całkowitą liczbę części (02 poniżej, unikatowa dla każdej wiadomości wysłanej na ten sam numer), i jeden bajt na numer bieżącej części (01 dla pierwszej części, 02 dla drugiej, i tak dalej).

Dwuczęściowa długa wiadomość wygląda następująco:

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;

Dodanie UDH zmniejsza miejsce na tekst - przykład powyżej pozwala tylko na 153 znaki na część wiadomości.

Skrypty oczyszczania bazy danych

Kilka skryptów jest dostępnych do usuwania wiadomości SMS z bazy danych za pośrednictwem Linux CLI, znajdujących się w /mnt/nand-user/scripts/:

Skrypt

Użycie

Cel

db_delete

./db_delete YYYYMMDDhhmm

Usun wiadomości SMS z Inbox i SentItems starsze niż podana data

db_delete_7days

./db_delete_7days

Usuń wiadomości SMS z Inbox i SentItems starsze niż 7 dni

db_delete_allfolders

./db_delete_allfolders

Czyszczenie Inbox, SentItems i Outbox — przeznaczone do okresowego uruchamiania przez cron

db_delete_select

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

Usuwanie wiadomości SMS z wybranego folderu

Dodawanie skryptu do crona: utwórz plik w katalogu /etc/cron.d/ (na przykład db_cleaner) z zawartością taką jak:

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

Ten przykład uruchamia skrypt czyszczący 1. dnia każdego miesiąca.

Przekazywanie dzienników do serwera zewnętrznego

SMSEagle zapisuje swoje dzienniki za pośrednictwem rsyslog. Aby wysłać ich kopię na centralny serwer syslog, dodaj regułę przekazywania przez SSH. Nie ma ustawienia dla tego w interfejsie sieciowym.

  1. Zaloguj się na urządzenie przez SSH jako root.

  2. Utwórz plik /etc/rsyslog.d/005-remote.conf z tą regułą, zastępując adres, port i protokół swoim serwerem:

    *.* action(type="omfwd" target="192.0.2.250" port="514" protocol="udp"
               action.resumeRetryCount="10"
               queue.type="linkedList" queue.size="10000")
    
    • target - adres IP lub nazwa hosta serwera syslog.

    • port - port, na którym nasłuchuje serwer, zwykle 514.

    • protocol - udp lub tcp.

    • Ustawienia kolejki przechowują do 10000 wiadomości na urządzeniu, gdy serwer jest niedostępny, i wysyłają je, gdy wróci do stanu dostępności.

  3. Sprawdź konfigurację, a następnie uruchom ponownie rsyslog:

    rsyslogd -N1
    systemctl restart rsyslog
    

Zachowaj nazwę pliku. Własne dzienniki SMSEagle (Application, API, Message i usługi email, call, Signal i WhatsApp) są zapisywane przez reguły w /etc/rsyslog.d/010-*.conf do 018-*.conf, a każda z tych reguł zatrzymuje dalsze przetwarzanie swoich wiadomości. Reguła przekazywania umieszczona po nich, na przykład na końcu /etc/rsyslog.conf, przekazuje tylko dzienniki systemowe. Prefiks 005- powoduje, że rsyslog odczytuje regułę przekazywania jako pierwszy, dzięki czemu każda wiadomość jest przekazywana.

Aby szyfrować ruch dziennika za pomocą TLS, zapoznaj się z przewodnikiem rsyslog Encrypting Syslog Traffic with TLS.