Kleine und große Linux AHAs
ScriptHints
Überwiegend Bash Tricks die man nicht unbedingt kennt und für die wir auch suchen mussten.
Asterisk Projekt: Season 6 – Manchmal kommt es anders, und öfters als man denkt
16. Dez
Was ein Sch…..
Also es ist nun schon einige Wochen her. Da gab es richtig Probleme mit der Anlage die ich hier beschreiben wollte. Auch daher die Verspätungen.
Was ist passiert?
Die Anlage wurde planmäßig installiert und in Betrieb genommen. Das waren so ca. 50 Telefone, 25 Analoge Nebenstellen (Faxe und DECT Telefone). Das ganze gepaart mit einer Queue und tollen Funktionen im Dialplan. Alle Tests waren erfolgreich und es sah super aus.
Die Anlage war also in Betrieb. Dann kam ein Elektriker. Der wollte einen Supertollen Umschalter im Rechenzentrum fertig installieren (Neubau). Ganz ohne dass der Strom ausfällt – versprochen
Also alle Server eingeschaltet gelassen. Passiert doch nix. Aber dann … wie von Geisterhand … auf einmal …. Dunkelheit … und diese Ruhe. Huch. Strom doch weg. Haha. Also RZ tot.
Naja, eigentlich kein Problem sollte man denken. Ok, die Server wieder hochfahren und gut is. Vielleicht macht der ein oder andere noch einen Festplattencheck, aber dann hat sich die Sache. War auch so. Alles wieder gut.
Oder?
Wenige Minuten später … ein Anruf übers Handy. Die TK Anlage steht still. Hä? Das gab’s ja bisher noch nie – egal was ich an Konfigurationsfehlern eingebaut hatte auf allen Testsystemen. Von nun an ging es hin&her. Fehlersuche … überall. Es gab einfach keine Fehlermeldung mit einem Hinweis auf den Fehler. Das Szenario war auch verschieden. Einerseits zog der asterisk Prozess 100% CPU und nahm nichts mehr an. Andererseits schmierte der Prozess mit einem Core Dump einfach sang und klanglos ab. Auch die Laufzeiten waren total verschieden. Mal lief der Prozess ein paar Stunden, mal nur wenige Minuten.
Das ganze ging zwei Wochen hin&her. Zuerst habe ich versucht herauszufinden was los ist – strace, tcpdump, entfernen der Scripte aus dem Dialplan … alles hat nichts gebracht. Auch andere Versionen wurden ausprobiert, keine Änderung. Zwischenzeitlich wurde eine externe Firma mit ins Boot genommen. Die sich genauso die Zähne ausgebissen haben (Konfig geprüft, eigene Versionen von Asterisk paketiert, …), allerdings hatten die dann auch die entscheidende Idee. Das ganze ging gut 2 Wochen.
And the problem was *trommeln* ….
Das Problem waren am Ende Umleitungen am Telefon. Und jetzt fragt ja nicht “Hä?”! Es handelt sich dabei auch nicht um einen Konfigurationsfehler, sondern um ein Fehler in der Asterisk Software. Dieser Fehler ist in Version 1.6 genau so vorhanden, wie in der 1.8 – die wir mittlerweile dann doch einsetzen
genauer gesagt …
Man kann an einer solchen Telefonanlage vieles auf verschiedene Arten lösen. Auch Umleitungen. Einerseits kann man die Umleitungen innerhalb der Anlage abhandeln und andererseits geht das über das Telefon. Besser ist definitiv das ganze über die Anlage zu machen. Das erweist sich auch an vielen anderen Stellen als sinnvoll.
Nun hatte ich das sogar so gemacht. Der “alte” Ablauf für eine Umleitung sah so aus:
- Benutzer drückt eine gewisse Taste am Telefon
- gibt das Umleitungsziel ein
- mit der Bestätigung wird im Telefon lokal die Umleitung gesetzt und im Hintergrund eine Nummer angerufen, die als Parameter ebenfalls das Umleitungsziel besitzt. Dadurch wird in der Anlage ebenfalls eine Umleitung gesetzt.
Am Ende war also im Telefon eine Umleitung, die jedoch im normalfall nicht zum Zug kam, weil bereits in der Anlage umgeleitet wurde. Das ganze funktionierte einwandfrei. Die jeweilige Nummer wurde in der AstDB gespeichert und war somit für den Server jederzeit verfügbar. Bei jedem Anruf wurde geprüft ob eine Umleitung in der Datenbank vorhanden war und entsprechend gehandelt.
Wie gesagt, das ganze funktioniert wunderbar. Jedoch nur solange die Datenbankinformationen mit denen der Telefone gleich sind. Hat ein Telefon eine Rufumleitung aktiviert und der Server nicht, so wird der Anruf an das Telefon weitergeleitet. Das Telefon leitet um und dann …. macht’s PENG!!! Kein Witz. Sobald die Umleitung vom Telefon die Anlage erreicht streckt die Asterisk die Flügel und gibt den Geist auf. Auf diese Idee muss man erst einmal kommen. Vor allem, weil das sich von der Version 1.6x bis 1.8x durchzieht.
Aber was hat das ganze mit dem Stromausfall zu tun?? Na das ist dann auch recht einfach. Da der Server nicht heruntergefahren wurde sondern hart ausgeschaltet, waren die Informationen in der Asterisk DB verloren. Also gab es einige Telefone die eine lokale Umleitung aktiviert hatten, der Server davon jedoch nichts mehr wußte. Mit jedem Anruf auf ein solches Telefon wurde die Anlage gekillt. Es gab natürlich einige resets auf dem Server. Die Datenbank frisch gemacht, auf einen anderen Server umgeschwenkt. Das System sogar komplett neu installiert. Aber – naja am Ende ist mal halt schlauer – was sollte das bringen, so lange man die Telefone nicht zurücksetzt. Wir sind eben immer von einem Serverproblem ausgegangen.
Abhilfe
Nachdem das Problem erkannt war wurde dann erst einmal schnelle Hilfe geleistet. Nagios bekam von mir einen Plugin spendiert, der den Status der Telefone mit dem der Datenbank verglich. Sobald es inkonsistenzen gab wurde es rot. Des Weiteren habe ich ein Script geschrieben, welches alle Umleitungen auf allen Telefonen ausschaltet. Das war jedoch nur die Notfallmedizin.
Nachdem ein wenig Ruhe eingekehrt war habe ich mich dann hingesetzt und die ganze Logik für die Rufumleitungen neu geschrieben. Das ganze funktioniert nun über eine Website für die Snom Telefone (xml). Dort wird das Umleitungsziel eingegeben, das ganze wird dann in eine MySQL Datenbank geschrieben und von Asterisk genutzt. Lokal am Telefon gibt es keine Umleitung mehr. Seit dem ist nun auch Ruhe.
Das ganze war einfach extrem blöd, weil die Anlage ja bereits im produktiven Einsatz war. Dadurch entsteht durchaus ein gewisser Druck
Asterisk Projekt: Season 5 – Die 5 Minuten Terrine oder: Asterisk installation
06. Okt
Ob nun 5 Minuten wirklich gebraucht werden
Asterisk Installation
Die Installation von Asterisk ist eine der Aufgaben die wirklich am einfachsten ist. Ich mache das ganze auf Debian, also hab ich auch die Debian Pakete genommen. apt-get la-le-lu und fertig. Welche Paket ich installiert habe? Diese:
ii asterisk 1:1.6.2.9-2+squeeze3 Open Source Private Branch Exchange (PBX) ii asterisk-config 1:1.6.2.9-2+squeeze3 Configuration files for Asterisk ii asterisk-core-sounds-en-gsm 1.4.19-1 asterisk PBX sound files - English/gsm ii asterisk-doc 1:1.6.2.9-2+squeeze3 Source code documentation for Asterisk ii asterisk-h323 1:1.6.2.9-2+squeeze3 H.323 protocol support for Asterisk ii asterisk-moh-opsound-g722 2.03-1 asterisk extra sound files - English/g722 ii asterisk-moh-opsound-gsm 2.03-1 asterisk extra sound files - English/gsm ii asterisk-moh-opsound-wav 2.03-1 asterisk extra sound files - English/wav ii asterisk-mp3 1.6.2.1-1 MP3 format support (format_mp3) for the Asterisk PBX ii asterisk-mysql 1.6.2.1-1 MySQL support for the Asterisk PBX (cdr mainly) ii libasterisk-agi-perl 1.01-2 Collections of Perl modules to be used with Asterisk PBX AGI
Damit hat man bereits quasi alles was benötigt wird um den Asterisk Server zu starten.
In den Debian Repositories ist noch Asterisk 1.6 – und das ist auch gut so. Asterisk 1.8 gibt es zwar auch schon länger, allerdings ist diese Version noch recht Buggy. Im Internet wird auch noch oft von der 1.8 abgeraten und die meisten Dokus beziehen sich auf 1.6. Ich hatte bisher auch noch keine Probleme mit dem Dienst an sich.
Auf die absoluten Basics (bspw. wie nun einen SIP/Account einrichten) möchte ich hier eigentlich – wie immer – nicht eingehen. Ich möchte mehr die Fallstricke beschreiben die ich auf meinem Weg beiseite räumen musste und ein Tipps geben. Eine gute Quelle ist das Asterisk Buch online ( http://www.das-asterisk-buch.de/2.1/ ). Dort werden gerade die Basics recht gut beschrieben.
Ein paar Konfighints
Konfiguration über Scripte erweitern
Datei: /etc/asterisk/asterisk.conf
Parameter: execincludes = yes ; support #exec in config files
Dadurch wird es möglich innerhalb von Konfigurationsdateien mit Hilfe von “#exec” externe Scripte auszuführen. Der Output eines solchen Scriptes muss im Format der Konfigurationsdatei sein.
Konfigurationen (Accounts & Voicemail) aus der Datenbank
Das ganze läuft unter dem Namen “realtime”. Der Name ist durchaus verständlich, da durch Änderungen an der Datenbank der Asterisk Prozess nicht neu geladen werden muss. Ändert man in den Dateien (sip.conf, voicemail.conf, etc.) muss der Dialplan oder teilweise der asterisk Prozess neu geladen werden.
Datei: /etc/asterisk/extconfig.conf
Parameter:
[settings] voicemail => mysql,general,voicemail sipusers => mysql,general,sip_devices sippeers => mysql,general,sip_devices
Diese Einstellungen bewirken, dass Asterisk nach den SIP Accounts (quasi der /etc/asterisk/sip.conf) auch in der Datenbank schaut. Das gleiche gilt für die /etc/asterisk/voicemail.conf.
Damit das ganze funktioniert müssen noch die Daten für den Connect auf die Datenbank eingerichtet werden.
Datei: /etc/asterisk/res_mysql.conf
Parameter:
[general] ;dbhost = 127.0.0.1 dbname = asterisk_db dbuser = root dbpass = test dbport = 3306 dbsock = /var/run/mysqld/mysqld.sock requirements=warn ; or createclose or createchar
Diese Einstellungen machen dem System die Datenbank bekannt. Man sieht nun auch, dass der Verweis aus der extconfig.conf “general” auf diese Verbindung zeigt und hier seine Referenz hat. Dem entsprechend können also auch mehrere Datenbanken genutzt werden.
Die Datenbanktabellen müssen noch erstellt werden. Dafür möchte ich gerne auf eine externe Seite verweisen -> http://www.voip-info.org/wiki/view/Asterisk+RealTime+Sip
Mit einem reload oder restart sollte dann die Konfiguration in der Datenbank berücksichtigt werden – falls vorhanden. Die Felder in der Datenbank sind analog zu denen in den Konfigdateien. Es gibt einige Spalten die in den jeweiligen Tabellen vorhanden sein müssen, die meisten können jedoch auch einfach gelöscht werden. Auch zusätzliche Spalten sind kein Problem – sie werden von Asterisk einfach ignoriert.
Dateirechte
Mir ist es häufig passiert, dass ich Änderungen vorgenommen habe die vom System nicht angenommen wurden. Das ganze ohne irgendeine Fehlermeldung (wenigstens in den “normalen” logs). Das passiert, wenn die Rechte einer Konfigurationsdatei nicht stimmen. Die Dateien sollten alle asterisk gehören.
Erster Test
Einen ersten Test kann man ganz einfach mit Hilfe eines Headsets und (bspw.) Ekiga oder Jitsi – also Softphones – machen. Ich habe dazu Voicemail konfiguriert und als Test die Mailbox angerufen.
Unleserliches debuggen, oder: Fehlersuche in verschlüsselten Protokollen
03. Mai
Immer mehr Datenverkehr wird verschlüsselt. Einerseits natürlich richtig und gut. Andererseits ein Problem. Früher konnte man mit Hilfe von Tools wie Wireshark (Ethereal) oder tcpdump relativ schnell Probleme (z.B.) in der Kommunikation zwischen Programm und Server herausfinden. Einfach den Netzwerkverkehr mitschneiden, ansehen / auswerten und es zeigten sich Fehler die man im Programm möglicherweise nicht zu Gesicht bekommen hat.
Mittlerweile sind die Pakete weitestgehend verschlüsselt und man kann nicht mehr einfach so “mit schreiben” – naja, man kann natürlich; aber lesen kann man es nicht. Also fällt ein mitschreiben – einfach mal so – flach.
Eine andere Möglichkeit die Kommunikation zwischen Programmen zu debuggen ist, sich einfach manuell zu verbinden und die Kommandos direkt einzugeben um zu prüfen ob der Server richtig reagiert. Dazu nahm man früher telnet … Auch telnet ist kein Kandidat mehr für verschlüsselte Protokolle.
Verbindung zu einem SSL geschützten Dienst
Eine Möglichkeit sich auf einen solchen Dienst zu verbinden bietet der Befehl
openssl s_client -connect <Zielrechner>:<Port>
Mit diesem Befehl kann man sich beispielsweise direkt auf einen per SSL geschützten IMAP Server (Port 993) verbinden und manuell Kommandos absetzen. Das ganze über eine SSL geschützte Verbindung – die nicht mitgeschnitten werden kann
Ganz wie früher mit telnet *freu*
Schizophrene Router überwachen
25. Mrz
Es geht um redundante Internetanbindungen. Bekommt man diese von seinem Provider installiert, so hat man zwei Router in seinem Rechenzentrum stehen. Beide Router haben eine IP Addresse und halten eine weitere, virtuelle Addresse dei das Gateway darstellt.
Unterschiedliche Bandbreiten
Nun ist es so, dass man nur selten zweimal mit der identischen Bandbreite angebunden wird. Beispielsweise – auch je nach Standort – kann es sein, dass man nur 10% der normalen Leistung auf dem Backupmedium hat. So ist es natürlich wichtig zu wissen wenn die Hauptleitung ausfällt um einerseits das Problem zu melden und auch andererseits vielleicht diverse Dienste abzuschalten. Nur wie kann man erkennen welcher Router gerade aktiv ist? SNMP Zugriff ist meist auf Providerrouter nicht möglich – warum auch immer.
Welcher ist aktiv?
Wir hatten dann zuerst geplant die MAC Addresse über ARP zu prüfen – wenn sie sich ändert wäre der Router umgeschaltet worden. Leider nimmt HSRP (Hot-Standby-Routing-Protocoll) die MAC Addresse mit. Also ging das auch nicht. Was dann ging ist das ganze per traceroute zu machen. Traceroute zeigt als einen Hop eine der festen IPs der Router. Auf diese Weise kann man also bestimmen welcher Router gerade aktiv ist.
Das Script dazu
#!/bin/bash
# Dieses Script prueft per traceroute welcher
# Router gerade aktiv ist.
#
# Da wir keinen Zugriff auf die Router haben
# (snmp oder anders) musste das so gemacht werden.
#
# Ronny Becker, 03.2011
# Gateway IPs
PRI_GW=""
SEC_GW=""
# HOPs to GW
GW_HOPCOUNT="2"
# Check Target(s)
TEST_TARGET="www.heise.de www.google.de"
# Do your job
for TARGET in $TEST_TARGET
do
# run trace
TRACE=$(traceroute -m $GW_HOPCOUNT $TARGET 2>&1)
if [ $? != 0 ]
then
continue
fi
# check if primary matches
if [[ $TRACE =~ $PRI_GW ]]
then
echo "Primary Gateway active"
exit 0
fi
# check if secondary matches
if [[ $TRACE =~ $SEC_GW ]]
then
echo "Seconday Gateway active"
exit 1
fi
done
echo "Unknown Gateway status"
exit 2
Das Script ist so gemacht, dass es von Nagios genutzt werden muss. Wer das ganze auf Mail umstellen möchte muss halt ein paar Änderungen vornehmen.
[Update] Und heute im Ü-Ei: Advanced Disclaimer für Postfix
10. Mrz
In meinem Artikel zum Advanced Disclaimer für Postfix mit Hilfe von altermime haben sich ein paar kleine Fehler eingeschlichen. Ich habe die Fehler nun korrigiert und den Artikel (den Script Teil) überarbeitet.
Fehler 1:
Die Empfängeraddresse wurde nicht richtig bestimmt
REC_DOMAIN=${2##*@}
muss heißen
REC_DOMAIN=${4##*@}
Fehler 2:
Durch diesen Fehler kann es passieren, dass Mails teilweise ganz abgeschnitten ankommen, bzw. auch teilweise “nur” der Anhang fehlt. Das ganze ist darauf zurückzuführen, dass sich in der Mail – wenigstens dann wenn sie von altermime bearbeitet wurde – eine Zeile mit lediglich einem Punkt befindet. Dies wird von Postfix bei der Rückgabe als “ende” interpretiert. Daher muss der sendmail Aufruf innerhalb des Scripts angepasst werden (3x).
Aus
$SENDMAIL "$@" <in.$$
wird also
$SENDMAIL -i "$@" <in.$$



