Rozdział obejmuje tematy dla zaawansowanych użytkowników, które omijają normalny interfejs sieciowy: bezpośredni dostęp do bazy danych i SQL, oraz skrypty czyszczące bazę 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 korzystania z interfejsu sieciowego lub API.

Dostęp do bazy danych dla aplikacji zewnętrznych jest domyślnie wyłączony. Włącz go w 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

Wstrzyknięcie 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;

Wiadomość powyżej 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.

Wstrzyknięcie długiej wiadomości SMS za pomocą SQL

Wiadomości wieloczęściowe wymagają również nagłówka UDH, przechowywanego jako ciąg szesnastkowy w polu UDH. Chyba że masz konkretny powód, aby robić to ręcznie, użyj zamiast tego API (zobacz API and Developer Integration).

Dla długiej wiadomości tekstowej UDH zaczyna się od 050003, a następnie jeden bajt używany jako odwołanie do wiadomości (dowolna wartość szesnastkowa, ale różna dla każdej wiadomości - D3 poniżej), jeden bajt dla całkowitej liczby części (02 poniżej, unikalny dla każdej wiadomości wysłanej na ten sam numer), i jeden bajt dla numeru bieżącej części (01 dla pierwszej części, 02 dla drugiej itd.).

Wiadomość dwuczęściowa 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 dostępne na tekst - przykład powyżej pozwala tylko na 153 znaki na każdą część wiadomości.

Skrypty czyszczące bazę danych

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

Skrypt

Użycie

Przeznaczenie

db_delete

./db_delete YYYYMMDDhhmm

Usuń 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 SMS z jednego wybranego folderu

Dodawanie skryptu do crona: utwórz plik w /etc/cron.d/ (na przykład db_cleaner) o zawartości takiej 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 na zewnętrzny serwer

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

  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ół Twojego serwera:

    *.* 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 po jego powrocie.

  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 najpierw czyta regułę przekazywania, więc każda wiadomość jest przekazywana.

Aby zaszyfrować ruch dziennika za pomocą TLS, zobacz przewodnik rsyslog Encrypting Syslog Traffic with TLS.