Niniejszy rozdział zawiera tematy dla zaawansowanych użytkowników, które omijają zwykły 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 czytania lub pisania wiadomości SMS poprzez zapytania SQL, zamiast korzystać z interfejsu sieciowego lub interfejsu 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 nawiąż połączenie z bazą danych z aplikacji zewnętrznej, używając:

  • Host: adres IP urządzenia

  • Database name: smseagle

  • User: smseagleuser

  • Password: postgreeagle

Wstrzyknięcie krótką 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 określa, który modem wysyła wiadomość: smseagle1 dla modemu 1, smseagle2 dla modemu 2.

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

Wiadomości wieloczęściowe wymagają również nagłówka UDH, przechowywane jako ciąg heksadecymalny w polu UDH. Jeśli nie masz konkretnego powodu, aby robić to ręcznie, użyj zamiast tego interfejsu API (patrz API and Developer Integration).

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ść heksadecymalna, ale inna dla każdej wiadomości - D3 poniżej), jeden bajt dla całkowitej liczby części (02 poniżej, unikatowy dla każdej wiadomości wysyłanej na ten sam numer) i jeden bajt dla numeru 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 dostępne miejsce 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 Linux CLI, znajdujące się w /mnt/nand-user/scripts/:

Skrypt

Użycie

Cel

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

Czyści Inbox, SentItems i Outbox – zaprojektowane do uruchamiania okresowo za pośrednictwem crona

db_delete_select

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

Usuń SMS z wybranego folderu

Dodawanie skryptu do crona: utwórz plik w /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 pierwszego dnia każdego miesiąca.

Przekazywanie dzienników do serwera zewnętrznego

SMSEagle zapisuje swoje dzienniki za pośrednictwem rsyslog. Aby wysłać kopię dzienników na centralny serwer syslog, dodaj regułę przekazywania przez SSH. Ta opcja nie jest dostępna w interfejsie web.

  1. Zaloguj się do urządzenia przez SSH jako root.

  2. Utwórz plik /etc/rsyslog.d/005-remote.conf z tą regułą, zastępując adres, port i protokół danymi 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 rsyslog ponownie:

    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 pliku /etc/rsyslog.conf, przekazuje tylko dzienniki systemowe. Prefiks 005- powoduje, że rsyslog czyta regułę przekazywania jako pierwszą, dzięki czemu każda wiadomość jest przekazywana.

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