Asterisk und Skype (unter Debian)

Aus NOBAQ
Zur Navigation springenZur Suche springen
Chanskype.gif

Endlich funktioniert es: chan_skype. Jetzt funktioniert die Kopplung von Skype und Asterisk. Die Möglichkeit rauszuwählen werde ich eher weniger in Anspruch nehmen, dafür ist die Möglichkeit, nun mehr per Skype erreichbar zu sein und im Haus klingeln alle Telephone wie wenn ein normales Gespräch kommt schon toll. Vor allem ist es jetzt meiner Schwester möglich, gratis nach Hause zu telephonieren.


Das Produkt um das es geht ist: http://www.chanskype.com/. Dabei muss ich gleich anfangen mich über die Firma aufzuregen. Ich verweise dabei auf http://www.ip-phone-forum.de/showthread.php?t=118366. Eigentlich will ich Skype ja als ganzes boykottieren. Und erst recht die Firma, die chan_skype herstellt. Nun werd ich es wahrscheinlich doch kaufen :-)

Auf alle Fälle fängt das erste Problem gleich damit an, dass chan_skype eine Funktion braucht, die die Libc unter Debian nicht zu Verfügung stellt: gnu_dev_makedev. Zuerst wollte ich die Datei einfach patchen und die Referenzen beinhart mit 0×90er (NOPs) überschreiben. Die viel bessere Idee ist aber eine ‘libfixchanskype.so’ zu schreiben, die die Funktion implementiert (der Code dazu kommt direkt vom Source der originalen libc) und dynamisch dazu zu linken. Der Code dazu sieht so aus:

unsigned long long int gnu_dev_makedev (unsigned int major, unsigned int minor)
{
	return ((minor & 0xff) | ((major & 0xfff) << 8 )
		| (((unsigned long long int) (minor & ~0xff)) << 12)
		| (((unsigned long long int) (major & ~0xfff)) << 32));
}

Compiliert wird das ganze dann mit

$ gcc -fPIC -c -Wall fixchanskype.c
$ gcc -shared -Wl,-soname,libfixchanskype.so -o libfixchanskype.so fixchanskype.o -lc

Die fertige Library kopiert man einfach nach z.B. /usr/local/lib und startet Asterisk mit

LD_PRELOAD=/usr/local/lib/libfixchanskype.so asterisk -U asterisk -gcvvvvvvvv

Asterisk regt sich nicht mehr auf. Was der Fehler war, warum es die letzten Monate nicht ging, kann ich nicht sagen. Ich hab es heute probiert und auf einmal ist es gegangen.

Aber auf noch etwas muss man bei Debian aufpassen: Es muss das Paket libstdc++6 installiert sein! Das Problem ist, dass es nicht viele Programme gibt, die davon abhängig sind und so das Paket nicht zwangsläufig installiert ist. Das Programm x11signaller ist davon abhängig und da die Ausgabe intelligenterweise nach /dev/null geleitet ist bemerkt der User nichts davon, ausser dass es nicht geht.

Ansonsten kann man sich im großen und ganzen an die Anleitung von ftp://ftp.chanskype.com/download/packages/README.txt halten.

Für eingehende Anrufe verwende ich wie gehabt:

context skype-in {
	skype1 => {
		&MyDial(${EXTEN},${ALL},${DELAY_DFLT},rtTw);
		VoiceMail(391985@default);
		Hangup();
	};
};