GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Speichern Sie Kannel DLR in MySQL/MariaDB

In unserem früheren Artikel über Kannel haben wir gelernt, wie man Kannel installiert. In dieser Konfiguration speichern wir also den SMS Delivery Report (DLR) im Speicher der Bearerbox Prozess. Auf diese Weise, wenn bearerbox abstürzt oder wir den Prozess herunterfahren, aber noch DLRs offen sind, kann dies zu Problemen für SMS-Benutzer führen.

Um diese Situation zu vermeiden, können wir also einen externen DLR-Speicher wie MySQL verwenden Datenbank. Im vorherigen Artikel haben wir zwei Kannel-Boxen verwendet:Bearerbox und smsbox . Um DLR in der MySQL-Datenbank zu speichern, verwenden wir ein anderes Kannel-Programm:sqlbox . Die gesamte Kommunikation zwischen Bearerbox und smsbox erfolgt über sqlbox . In Betrieb, sqlbox verhält sich wie Bearerbox für SMS-Box und smsbox für Trägerbox .

Die Kommunikation zwischen verschiedenen Prozessen kann wie folgt dargestellt werden

LAB-Umgebung:

Host-Betriebssystem:Debian 10 (Buster)
Host-IP:192.168.10.38

Wir haben bereits die SMS-Verwaltungsanwendung PlaySMS auf demselben Host installiert. Informationen zur Installation von PlaySMS finden Sie in diesem Artikel.

Zum besseren Verständnis haben wir in diesem Artikel den vollständigen Installationsprozess von Kannel mit MySQL-Unterstützung gezeigt. Bitte lesen Sie diese Seite, um den Debian-Host für die Kannel-Installation vorzubereiten.

MariaDB-Server installieren

Also MySQL wurde von der Oracle Corporation erworben und hat sowohl Community- als auch kommerzielle Editionen.

In diesem Lab verwenden wir MariaDB Datenbank, eine Open-Source-Alternative zu MySQL. MariaDB wurde von MySQL gegabelt Open-Source-Projekt und von einigen der ursprünglichen Entwickler von MySQL entwickelt und unterstützt .

Installieren Sie also MariaDB Server mit den erforderlichen Abhängigkeiten

# apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'

Fügen Sie MariaDB-Repo-Informationen in die Datei /etc/apt/sources.list.d/MariaDB.list ein

# MariaDB 10.3 repository list - created 2021-12-28 18:41 UTC
# https://mariadb.org/download/
deb [arch=amd64,arm64,ppc64el] https://download.nus.edu.sg/mirror/mariadb/repo/10.3/debian buster main
deb-src https://download.nus.edu.sg/mirror/mariadb/repo/10.3/debian buster main

Repo aktualisieren und MariaDB installieren einschließlich notwendiger Abhängigkeiten

# apt-get update
# apt-get install –y mariadb-server libmariadb-dev default-libmysqlclient-dev

MariaDB-Dienst aktivieren und starten

# systemctl enable mariadb.service
# systemctl start mariadb.service

Führen Sie mysql_secure_installation aus um das Root-Passwort und andere Sicherheitsanweisungen wie unten zu setzen

Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Erstellen Sie MariaDB Datenbank und Benutzer für Kannel.

# mysql -u root –p
MariaDB [(none)]> CREATE DATABASE kannel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
MariaDB [(none)]> CREATE USER 'kannel'@'localhost' IDENTIFIED BY 'kannelPassword';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON kannel.* TO 'kannel'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit

Erstellen Sie dlr Tabelle für Kannel DLR. Zwei weitere Tabellen send_sms und sent_sms wird automatisch von Kannel sqlbox erstellt Prozess bei der ersten Ausführung

CREATE TABLE `dlr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`smsc` varchar(40) DEFAULT NULL,
`ts` varchar(40) DEFAULT NULL,
`destination` varchar(40) DEFAULT NULL,
`source` varchar(40) DEFAULT NULL,
`service` varchar(40) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`mask` int(10) DEFAULT NULL,
`status` int(10) DEFAULT NULL,
`boxc` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Installieren Sie Kannel mit MySQL-Unterstützung

Um DLR in MySQL zu speichern, müssen wir Kannel mit MySQL-Unterstützung kompilieren

# wget --no-check-certificate https://kannel.org/download/1.4.5/gateway-1.4.5.tar.gz
# tar -zxf gateway-1.4.5.tar.gz
# cd gateway-1.4.5/
# ./configure  --enable-start-stop-daemon --prefix=/usr/local/kannel --with-mysql
# make && make install

Installieren Sie smsbox Programm

# cd addons/sqlbox
# ./bootstrap

Da wir den Standardinstallationsort für Kannel geändert haben, müssen wir das erforderliche Bibliotheksverzeichnis und die C++-Flag-Variablen für Kannel und MariaDB mit configure bereitstellen Skript

Um die MariaDB-Flag-Variable zu finden, führen Sie den folgenden Befehl aus

# mysql_config --cflags --libs

Ausgabe:

Führen Sie configure aus Skript

# ./configure  --prefix=/usr/local/kannel \
--with-kannel-dir=/usr/local/kannel \
LDFLAGS="-L/usr/local/kannel/lib -L/usr/lib/x86_64-linux-gnu/ -lmariadb"  \
CPPFLAGS="-I/usr/local/kannel/include/kannel -I/usr/include/mariadb -I/usr/include/mariadb/mysql"

Kompilieren Sie sqlbox Programm

# make && make install

Erstellen Sie dann die erforderlichen Verzeichnisse

# mkdir /usr/local/kannel/etc
# mkdir /usr/local/kannel/run
# mkdir /var/log/kannel/

Fügen Sie danach den folgenden Inhalt in /usr/local/kannel/etc/kannel.conf ein Datei

##CORE
group = core
admin-port = 13000
smsbox-port = 13001
admin-password = sms-gw-admin-passwd
status-password = sms-gw-status-passwd
admin-deny-ip = "*.*.*.*"
admin-allow-ip = "*.*.*.*"
box-deny-ip = "*.*.*.*"
box-allow-ip = "*.*.*.*"
log-level = 0
log-file = "https://1118798822.rsc.cdn77.org/var/log/kannel/kannel.log"
dlr-storage = mysql
sms-resend-retry = 1


##SMSC
group = smsc
smsc = at
smsc-id = smsc01
my-number = 015XXXXXXXX
allowed-smsc-id = smsc01
preferred-smsc-id = smsc01
modemtype = Huawei
device = /dev/ttyUSB0
speed = 9600
alt-charset = "GSM"
sim-buffering = true
log-file = /var/log/kannel/smsc01-gsm1.log
log-level = 0


##MODEMS
group = modems
id = Huawei
enable-mms = true
init-string = "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0;+CNMI=1,3,2,2,1;+CMEE=1;+CPMS=\"SM\",\"SM\",\"SM\";+CMGF=0;+CSCS=GSM
speed = 9600
detect-string = "huawei"


##SMSBOX
group = smsbox
bearerbox-host = localhost
sendsms-port = 13013
bearerbox-port = 13010
mo-recode = true
sendsms-chars = "0123456789 +-"
log-file = "https://1118798822.rsc.cdn77.org/var/log/kannel/smsbox.log"
log-level = 0
access-log = "https://1118798822.rsc.cdn77.org/var/log/kannel/access.log"


##SMS-USER
group = sendsms-user
user-deny-ip = "*.*.*.*"
user-allow-ip = "*.*.*.*"
# MAKE VERY SURE that you change the PASSWORD for security reasons
username = kannel
password = kannelpasswd
default-smsc = smsc01
concatenation = 1
max-messages = 10


##SMS-SERVICE
group = sms-service
keyword = default
get-url = "http://localhost/index.php?app=call&cat=gateway&plugin=kannel&access=geturl&t=%t&q=%q&a=%a&Q=%Q&smsc=kannel"
accept-x-kannel-headers = true
max-messages = 10
concatenation = true
catch-all = true
omit-empty = true


##MySQL-Connection 
group = mysql-connection
id = mysql-dlr
host = localhost
username = kannel
password = kannelPassword
database = kannel
max-connections = 1


##MySQL DLR Table
##You should not change this group name as bearerbox uses this name for MySQL DLR storage
group = dlr-db
id = mysql-dlr
table = dlr
field-smsc = smsc
field-timestamp = ts
field-destination = destination
field-source = source
field-service = service
field-url = url
field-mask = mask
field-status = status
field-boxc-id = boxc

Erstellen Sie /usr/local/kannel/etc/sqlbox.conf Datei mit dem folgenden Inhalt

##MySQL Connection
group = mysql-connection
id = sqlbox-db
host = localhost
port = 3306
username = kannel
password = kannelPassword
database = kannel


#SQL BOX CONFIG
group = sqlbox
id = sqlbox-db
smsbox-id = sqlbox
bearerbox-host = localhost
bearerbox-port = 13001
smsbox-port = 13010
sql-log-table = sent_sms
sql-insert-table = send_sms
log-level = 0
log-file = "https://1118798822.rsc.cdn77.org/var/log/kannel/sqlbox.log"

Erstellen Sie dann das Start/Stopp-Skript /usr/local/kannel/sbin/kannel einschließlich des folgenden Inhalts

#!/bin/bash
# Start/stop the Kannel boxes: One bearer box and one WAP box.
# This is the default init.d script for Kannel. Its configuration is
# appropriate for a small site running Kannel on one machine.
# Make sure that the Kannel binaries can be found in $BOXPATH or somewhere
# else along $PATH. run_kannel_box has to be in $BOXPATH.
#
BOXPATH=/usr/local/kannel/sbin
PIDFILES=/usr/local/kannel/run
CONFDIR=/usr/local/kannel/etc
CONF=$CONFDIR/kannel.conf
SQL_CONF=$CONFDIR/sqlbox.conf


USER=kannel
VERSION=""


RB=$BOXPATH/run_kannel_box$VERSION
BB=$BOXPATH/bearerbox$VERSION
WB=$BOXPATH/wapbox$VERSION
SB=$BOXPATH/smsbox$VERSION
SSD=$BOXPATH/start-stop-daemon$VERSION

PATH=$BOXPATH:$PATH

# On Debian, the most likely reason for the bearerbox not being available
# is that the package is in the "removed" or "unconfigured" state, and the
# init.d script is still around because it's a conffile. This is normal,
# so don't generate any output.
# test -x $BOXPATH/$BB || exit 0

case "$1" in
  start)
    echo -n "Starting WAP gateway: bearerbox"
    $SSD --start --quiet --pidfile $PIDFILES/kannel_bearerbox.pid --exec $RB -- --pidfile $PIDFILES/kannel_bearerbox.pid $BB -- $CONF
    sleep 2
    echo -n " sqlbox"
    $BOXPATH/sqlbox -d $SQL_CONF
    sleep 2
    echo -n " smsbox"
    $SSD --start --quiet --pidfile $PIDFILES/kannel_smsbox.pid --exec $RB -- --pidfile $PIDFILES/kannel_smsbox.pid $SB -- $CONF
    sleep 1
    echo "."
    ;;

  stop)
    echo -n "Stopping WAP gateway: "
    echo -n " smsbox"
    $SSD --stop --quiet --pidfile $PIDFILES/kannel_smsbox.pid --exec $RB
    sleep 1
    echo -n " sqlbox"
    pkill "sqlbox"
    sleep 1
    echo -n " bearerbox"
    $SSD --stop --quiet --pidfile $PIDFILES/kannel_bearerbox.pid --exec $RB
    echo "."
    ;;

  status)
    CORE_CONF=$(grep -r 'group[[:space:]]*=[[:space:]]*core' $CONFDIR | cut -d: -f1)
    ADMIN_PORT=$(grep '^admin-port' $CORE_CONF | sed "s/.*=[[:space:]]*//")
    ADMIN_PASS=$(grep '^admin-password' $CORE_CONF | sed "s/.*=[[:space:]]*//")
    STATUS_URL="http://127.0.0.1:${ADMIN_PORT}/status.txt?password=${ADMIN_PASS}"
    curl $STATUS_URL
    ;;

  reload)
    # We don't have support for this yet.
    exit 1
    ;;

  restart|force-reload)
    $0 stop
    sleep 3
    $0 start
    ;;

  *)
    echo "Usage: $0 {start|stop|status|reload|restart|force-reload}"
    exit 1

esac
exit 0

Erstellen Sie die Datei /usr/local/kannel/sbin/kannel ausführbar

# chmod +x /usr/local/kannel/sbin/kannel

Fügen Sie Kannel mit systemd zum Start hinzu

Erstellen Sie nun die systemd-Unit-Datei /etc/systemd/system/kannel-gateway.service einschließlich der folgenden Inhalte

[Unit]
Description=Kannel - WAP and SMS Gateway
Documentation=https://www.kannel.org/doc.shtml
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/local/kannel/sbin/kannel start
ExecReload=/usr/local/kannel/sbin/kannel  restart
ExecStop=/usr/local/kannel/sbin/kannel stop

[Install]
WantedBy=multi-user.target

Systemd neu laden

# systemctl daemon-reload

kannel-gateway starten und aktivieren Dienst

# systemctl enable kannel-gateway.service
# systemctl start kannel-gateway.service
# systemctl status kannel-gateway.service

DLR-MASKE und DLR-URL

Kannel bietet die folgenden Lieferberichtstypen

1:Liefererfolg
2:Lieferfehler
4:Nachricht gepuffert
8:SMS senden
16:SMS ablehnen

Für mehrere Versandberichtstypen müssen Sie also die Werte summieren, die jedem Typ entsprechen, und als dlr-mask festlegen beim Senden der Nachricht.

Beispiel:Für eine Erfolgs-, Fehler- und/oder gepufferte Zustellstatusmeldung einer SMS müssen wir dlr-mask setzen als 1+2+4=7.

Mit dlr-Maske es ist notwendig, dlr-url zu senden Zustellbericht per SMS zurücksenden.

Wenn wir einer Send SMS-Anfrage von der PlaySMS-Anwendung folgen, finden wir die HTML-Anfrage wie unten

Hier verstehen wir, dass PlaySMS eine Erfolgs-, Fehler-, gepufferte und/oder SMS-Übermittlungsanfrage auf dlr-mask abfragt (15) und senden Sie auch dessen dlr-url mit der Anfrage.

SMS-Protokolle senden

Wir haben also eine SMS vom PlaySMS-Webportal gesendet und verschiedene Status von der MariaDB-Konsole überprüft

SMS gesendet, aber noch nicht empfangen von Empfänger:

MariaDB [kannel]> select * from dlr;
+----+---------------------+--------+------+---------------+-------------+---------+------------------------------------------------------------------------------------------------------------------+------+--------+------+
| id | datetime | smsc | ts | destination | source | service | url | mask | status | boxc |
+----+---------------------+--------+------+---------------+-------------+---------+------------------------------------------------------------------------------------------------------------------+------+--------+------+
| 1 | 2022-01-08 23:07:51 | smsc01 | 165 | 88017XXXXXXXX | 015XXXXXXXX | kannel | http://localhost//index.php?app=call&cat=gateway&plugin=kannel&access=dlr&type=%d&smslog_id=20&uid=1&smsc=kannel | 15 | 0 | |
+----+---------------------+--------+------+---------------+-------------+---------+------------------------------------------------------------------------------------------------------------------+------+--------+------+
1 row in set (0.000 sec)

MariaDB [kannel]> select * from sent_sms;
+--------+------+-------------+---------------+---------+----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------+------+---------+------+---------+---------+-------+------------------------+----------+------------+
| sql_id | momt | sender | receiver | udhdata | msgdata | time | smsc_id | service | account | id | sms_type | mclass | mwi | coding | compress | validity | deferred | dlr_mask | dlr_url | pid | alt_dcs | rpi | charset | boxc_id | binfo | meta_data | priority | foreign_id |
+--------+------+-------------+---------------+---------+----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------+------+---------+------+---------+---------+-------+------------------------+----------+------------+
| 1 | MT | 015XXXXXXXX | 88017XXXXXXXX | NULL | MySQL+DLR+Test | 1641661668 | smsc01 | kannel | admin | NULL | 2 | NULL | NULL | 0 | NULL | NULL | NULL | 15 | http://localhost//index.php?app=call&cat=gateway&plugin=kannel&access=dlr&type=%d&smslog_id=20&uid=1&smsc=kannel | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 2 | DLR | 015XXXXXXXX | 88017XXXXXXXX | NULL | ACK%2F | 1641661671 | smsc01 | kannel | NULL | NULL | 3 | NULL | NULL | NULL | NULL | NULL | NULL | 8 | http://localhost//index.php?app=call&cat=gateway&plugin=kannel&access=dlr&type=%d&smslog_id=20&uid=1&smsc=kannel | NULL | NULL | NULL | NULL | NULL | NULL | ?orig_msg?dlr_mask=15& | NULL | 165 |
+--------+------+-------------+---------------+---------+----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------+------+---------+------+---------+---------+-------+------------------------+----------+------------+
2 rows in set (0.001 sec)

Nachdem die SMS vom Ziel-Mobiltelefon empfangen wurde und Erfolg DLR vom GSM-Modem erhalten wurde

MariaDB [kannel]> select * from dlr;
Empty set (0.000 sec)

MariaDB [kannel]> select * from sent_sms;
+--------+------+-------------+---------------+---------+----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------+------+---------+------+---------+---------+-------+------------------------+----------+------------+
| sql_id | momt | sender | receiver | udhdata | msgdata | time | smsc_id | service | account | id | sms_type | mclass | mwi | coding | compress | validity | deferred | dlr_mask | dlr_url | pid | alt_dcs | rpi | charset | boxc_id | binfo | meta_data | priority | foreign_id |
+--------+------+-------------+---------------+---------+----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------+------+---------+------+---------+---------+-------+------------------------+----------+------------+
| 1 | MT | 015XXXXXXXX | 88017XXXXXXXX | NULL | MySQL+DLR+Test | 1641661668 | smsc01 | kannel | admin | NULL | 2 | NULL | NULL | 0 | NULL | NULL | NULL | 15 | http://localhost//index.php?app=call&cat=gateway&plugin=kannel&access=dlr&type=%d&smslog_id=20&uid=1&smsc=kannel | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 2 | DLR | 015XXXXXXXX | 88017XXXXXXXX | NULL | ACK%2F | 1641661671 | smsc01 | kannel | NULL | NULL | 3 | NULL | NULL | NULL | NULL | NULL | NULL | 8 | http://localhost//index.php?app=call&cat=gateway&plugin=kannel&access=dlr&type=%d&smslog_id=20&uid=1&smsc=kannel | NULL | NULL | NULL | NULL | NULL | NULL | ?orig_msg?dlr_mask=15& | NULL | 165 |
| 3 | DLR | 015XXXXXXXX | 88017XXXXXXXX | NULL | Success | 1641661727 | smsc01 | kannel | NULL | NULL | 3 | NULL | NULL | NULL | NULL | NULL | NULL | 1 | http://localhost//index.php?app=call&cat=gateway&plugin=kannel&access=dlr&type=%d&smslog_id=20&uid=1&smsc=kannel | NULL | NULL | NULL | NULL | NULL | NULL | ?orig_msg?dlr_mask=15& | NULL | 165 |
+--------+------+-------------+---------------+---------+----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------+------+---------+------+---------+---------+-------+------------------------+----------+------------+
3 rows in set (0.000 sec)

Eingehende SMS:

MariaDB [kannel]> select * from sent_sms where momt='MO';
+--------+------+----------------+-------------+---------+-----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+---------+------+---------+------+---------+---------+-------+-----------+----------+------------+
| sql_id | momt | sender | receiver | udhdata | msgdata | time | smsc_id | service | account | id | sms_type | mclass | mwi | coding | compress | validity | deferred | dlr_mask | dlr_url | pid | alt_dcs | rpi | charset | boxc_id | binfo | meta_data | priority | foreign_id |
+--------+------+----------------+-------------+---------+-----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+---------+------+---------+------+---------+---------+-------+-----------+----------+------------+
| 4 | MO | +88017XXXXXXXX | 015XXXXXXXX | NULL | SQLBOX+incoming | 1641663435 | smsc01 | NULL | NULL | NULL | 0 | NULL | NULL | 0 | 0 | NULL | NULL | NULL | NULL | 0 | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+--------+------+----------------+-------------+---------+-----------------+------------+---------+---------+---------+------+----------+--------+------+--------+----------+----------+----------+----------+---------+------+---------+------+---------+---------+-------+-----------+----------+------------+
1 row in set (0.000 sec)

SMSBOX-Protokoll:

Ausgangsprotokoll des PlaySMS-Portals:

Vom Telefon des Empfängers:

Referenzen

  • https://www.kannel.org/download/kannel-userguide-snapshot/userguide.html

Linux
  1. Installieren Sie MariaDB oder MySQL unter Linux

  2. MySQL vs. MariaDB:Was sind die Hauptunterschiede zwischen ihnen?

  3. So aktivieren Sie die MySQL/MariaDB-Abfrageprotokollierung

  4. So setzen Sie das MySQL- oder MariaDB-Root-Passwort zurück

  5. Wie speichere ich die Ausgabe von SHOW PROCESSLIST in einer Datei in MySQL?

So installieren Sie Apache, PHP 7.3 und MySQL unter CentOS 7.6

Spickzettel für MySQL-Datenbankbefehle für Linux

So installieren Sie MySQL/MariaDB unter Debian 11

So ändern / setzen Sie das MySQL- oder MariaDB-Root-Passwort zurück

Was ist MySQL vs. MariaDB vs. Percona?

8 Schritte zur Installation von MirthConnect mit MySQL / MariaDB unter Linux