SMS Gateway mit dem Thomas-Krenn LES v2

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Dieser Artikel zeigt wie Sie ein SMS Gateway für Ihr Monitoring am Beispiel des Thomas-Krenn LES und dem CEP CT63 Modem aufbauen. Dies gelingt ebenso mit dem MultiTech MTD-H5-2.0 Modem. Als Software werden auf dem Low Energy Server v2 ein postfix-Mailserver und die SMS Server Tools 3 verwendet.

CEP CT63 USB powered Modem (Bildquelle: shop.netways.de)


Installation

Im nachfolgenden wird die Installation der erforderlichen Komponenten beschrieben.

Modem

Das CEP CT63 Modem bzw. das MultiTech MTD-H5-2.0 Modem wird per USB am LES v2 angeschlossen und automatisch erkannt. Weitere Informationen zur Installation finden Sie in den folgenden Artikeln:

SMS Server Tools 3

Die smstools werden auf dem LES v2 wie im Artikel SMS Server Tools Installation unter Ubuntu beschrieben installiert und konfiguriert.

postfix

Abschließend wird noch der postfix-Mailserver installiert.

Postfix Konfiguration

Nach der Installation der benötigten Komponenten wird nun postfix für die SMS Gateway Funktion konfiguriert.

Folgende Packages werden für den Perl-Filter installiert:

# apt-get install libemail-simple-perl libipc-run3-perl libdatetime-perl libtry-tiny-perl libcarp-clan-perl libmime-tools-perl

Filter

Es wird ein Content-Filter[1] mit der Bezeichnung SMSgateway im Unterordner /filter des postfix-Konfigurationsverzeichnisses erstellt. Dieser Filter extrahiert aus der empfangenen E-Mail den Betreff und übergibt ihn in das /var/spool/sms/outgoing-Verzeichnis. Von da ab kümmern sich die smstools um den Transport zum Empfänger.

tk@les2:/etc/postfix$ sudo mkdir filter
tk@les2:/etc/postfix/filter$ sudo vi SMSgateway

Da der Filter unter dem User smsd läuft, wird der Datei-Eigentümer des Filters angepasst:

tk@les2:/etc/postfix$ sudo chown smsd:root SMSgateway

Folgender Inhalt wird in die Datei eingefügt:

#!/usr/bin/perl -w
use strict;
use warnings;
use IPC::Run3;
use Try::Tiny;
use IO::File;
use Carp;
use Email::Simple;
use DateTime;
use MIME::Base64;

our $SENDMAIL = "/usr/sbin/sendmail";
our $MAILDIR = "/var/spool/sms/outgoing";
our $SMSLEN = 160;

# Start processing the email
my $msg_str;
while(<STDIN>){
    $msg_str .= $_;
}

try{
    my $sender = $ARGV[0];
    my $fname = $MAILDIR.'/'.getLogStamp().'-'.$sender;
    my $incmail = parseEmailStr($msg_str);
    my $telnum = $incmail->header("Subject");
    my $text = substr(getBody($incmail), 0, $SMSLEN);

    my $msgToSend = "To: ".$telnum."\n\n".$text;
    saveMsg($msgToSend, $fname, $sender);
    sendMail($msg_str);
} catch{
    print STDERR "Error: could not handle mail and send SMS with message: ".$_;
    exit(1);
};

sub saveMsg{
    my $message = shift;
    my $fname = shift;
    my $sender = shift;
    my $fh = new IO::File "> $fname";

    if(defined $fh){
            print $fh $message;
            $fh->close;
    }
    else{
        confess "Could not save message from ".$sender." to ".$fname;
    }
    return $fname;
}

sub getLogStamp{
        my $tz = DateTime::TimeZone->new( name => 'local' );
        my $dt = DateTime->now(time_zone =>$tz);
        return $dt->dmy()."-".$dt->hour()."-".$dt->minute();
}

sub sendMail{
        my $mail_str = shift;
        my @command = ($SENDMAIL, '-f', @ARGV);
        run3 \@command, \$mail_str;
}

sub parseEmailStr{
        my $msg_str = shift;

        #check if msg string is empty
        if(!defined($msg_str)){
                confess "Cannot parse an empty email message string.";
        }
        my $msg = Email::Simple->new($msg_str);
        return $msg;
}

sub getBody{
        my $msg = shift;
        if(!defined($msg)){confess "Cannot parse an undefined msg.";}
        if(getEncoding($msg) eq 'base64'){
                return decode_base64($msg->body);
        }
        return $msg->body;
}

sub getEncoding{
        my $msg = shift;
        if(!defined($msg)){confess "Cannot parse an undefined msg.";}
        return $msg->header('Content-Transfer-Encoding');
}

master.cf Konfigurationsdatei

Nach der einleitenden Beschreibung die Einträge smtp und sms-gateway in der master.cf-Konfigurationsdatei einfügen:

sudo vi /etc/postfix/master.cf
#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================

smtp      inet  n       -       -       -       -       smtpd
        -o content_filter=sms-gateway:dummy
        -o receive_override_options=no_address_mappings

sms-gateway unix     -  n       n       -       -       pipe
        flags=Rq user=smsd
        argv=/etc/postfix/filter/SMSgateway
        ${sender} ${recipient}

[...]

main.cf Konfigurationsdatei

In dieser Konfigurationsdatei ist unter anderem der Mail Name des postfix-Servers abgelegt.

tk@les2:/etc/postfix$ cat main.cf | grep mydestination
mydestination = les2.tk-intern.local, les2, localhost.localdomain, localhost

Testen der SMS-Zustellung

Zu Testzwecken haben wir am Evolution-Mailclient die IP-Adresse unseres LES v2 als SMTP-Serveradresse angefügt und eine Testmail an root@les2.tk-intern.local geschickt.

Sollten Probleme mit dem Filter auftreten, sind diese in der Datei /var/log/mail.log zu finden:

# grep -i filter /var/log/mail.log
May 22 13:56:47 les2 postfix/pipe[30203]: 6E925220A54: to=<monitor@thomas-krenn.com>, relay=sms-gateway, delay=0.41, delays=0.02/0.01/0/0.38, dsn=5.3.0,
status=bounced (Command died with status 1: "/etc/postfix/filter/SMSgateway". Command output: Error: could not handle mail and send SMS with message:
Undefined subroutine &main::decode_base64 called at /etc/postfix/filter/SMSgateway line 79, <STDIN> line 34. )

Einzelnachweise

  1. Simple content filter example (postfix.org)


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Foto Thomas Niedermeier.jpg

Autor: Thomas Niedermeier

Thomas Niedermeier, Abteilung Communications / Knowledge Transfer bei Thomas-Krenn, absolvierte an der Hochschule Deggendorf sein Studium zum Bachelor Wirtschaftsinformatik. Seit 2013 ist Thomas bei Thomas-Krenn beschäftigt und kümmert sich hier vor allem um das TKwiki. Er ist ein begeisterungsfähiger, technisch interessierter Linux und Mac Nutzer, fährt im Winter gerne Ski und geht im Sommer gern ins Schwimmbad.


Das könnte Sie auch interessieren

CEP CT63 Modem
VMware ESXi Hardware mit Nagios oder Icinga überwachen
Bedienung des Synology Assistant