Thursday, September 24, 2009

Virtualisierung mit KVM

Ich habe auf meinem Server KVM ausprobiert. Da
Virtualisierungstechnologien immer kontrovers diskutiert werden, möchte
ich hier mal meine Erfahrungen aufschreiben.

KVM unterstützt die Hardwarevirtualisierung von Prozessoren sowie das
neuere IOMMU, welches direkten Zugriff auf IO Geräte zulässt.

KVM benutzt qemu als Unterbau. Somit sind die qemu und kvm Befehle bis
auf den Präfix identisch.

KVM in der Praxis

Als erstes muss eine virtuelle Festplatte angelegt werden:kvm-img create -f qcow2 hd1.img 100G

  • -f qcow2: gibt das Format der Festplatte an

  • hd1.img: ist der Dateiname

  • 100G: Ist die Größe

Man kann auch normale Blockdevices benutzen, aber wegen der einfacheren
Handhabung entschied ich mich für Dateien, auch wenn dann zwei Dateisysteme
arbeiten müssen. Außerdem wächst das Volume dynamisch, wodurch am Anfang
nur wenige 100 Kilobyte verbraucht werden.

Um die Maschine zu starten und ein voll funktionsfähiges Netzwerk zu
haben, muss eine funktionsfähige Bridge erstellt werden. Hier bin
ich nach dem Tutorial im Hetzner Wiki vorgegangen, welches ich im
Vergleich zu anderen sehr verständlich und simpel fand: http://wiki.hetzner.de/index.php/KVM

Die Maschine startete ich dann folgendermaßen:
kvm -hda IMAGE.img -cdrom BOOTDISC -boot c -m RAMSIZE -vnc
IP:DISPLAY - -monitor stdio -net nic -net
tap,ifname=VIRTNET,script=no,macaddr=MACADDR -k de -smp ANZ -name
NAME

  • -hda IMAGE.img: gibt das Festplattenimage an

  • -cdrom BOOTDISC: die VM soll ein CD Laufwerk mit der CD BOOTDISC haben

  • -boot c: Die VM soll von Festplatte starten. Angeblich wurden hier aus historischen Gründen die Windows Laufwerksbezeichnungen genommen. C für Festplatte, D für CD Laufwerk usw.

  • -m RAMSIZE: Größe des Arbeitsspeichers in Megabyte

  • -vnc IP:DISPLAY: vnc Server soll auf IP lauschen mit Displaynummer DISPLAY

  • -monitor stdio: der QEMU Monitor soll auf stdio laufen

  • -net nic: Erstellt eine Netzwerkkarte

  • -net tap,ifname=VIRTNET,script=no,macaddr=MACADDR: Verbindet die Netzwerkkarte mit einem tap Hostinterface namens VIRTNET. Skripte sollen keine beim Booten ausgeführt werden und die Macadresse MACADDR soll verwendet werden

  • -k de: Keyboard Layout de soll verwendet werden

  • -smp ANZ: ANZ Threads soll die VM benutzen dürfen. Dies ist quasi die Anzahl der Prozessoren die kvm benutzen darf.

  • -name NAME: NAME ist ein Bezeichner für die VM die besonders für libvirt benötigt wird. Dazu später mehr.

Per vncviewer lässt sich jetzt auf die Bildschirmausgabe verbinden. Das
ist äußerst unsicher, da sich jeder auf den VNC-Server verbinden kann.
Ich habe das nur zur Installation gemacht und die KVM später mit -
-nographic gestartet womit keine Ausgabe mehr auf irgend einem Xserver
oder ähnlichem mehr erfolgt. Es ist aber auch möglich sich per Klartext
Passwort zu authentifizieren oder sogar per SSL. Da ich die grafische
Ausgabe aber im Normalbetrieb nicht brauche habe ich darauf verzichtet.
Ursprünglich wollte ich Reversevnc benutzen womit sich der VNC Server
auf dem Reverse VNC Client verbindet. Somit könnte man nur durch
Man-in-the-Middle Angriffe o.ä. auf die Bildschirmausgabe zugreifen.
Leider wechselt beim Boot einmal der Videomodus und mein VNC Client
macht das nicht mit. Somit ist nach dem einmaligen Verbinden nach
wenigen Sekunden Schluss mit der Bildschirmausgabe.

Das System kann man dann ohne Besonderheiten zu beachten normal
installieren. Nur die Virtio Module habe ich im Gast geladen obwohl dies
durch IOMMU nicht nötig ist. Auf Systemen die kein IOMMU haben erhöht
dies aber die IO Performance drastisch durch Paravirtualisierung.

Ich habe mir auch den libvirtd angeschaut in Verbindung mit dem
Clientprogramm virt-manager. Die libvirt stellt eine einfache Verwaltung
für verschiedenste Virtualisierungstechnologien bereit. Xen und KVM, zum
Beispiel, werden unterstützt. Neben vielen Konsolentools die die
Verwaltung mehrerer Virtueller Maschinen erlauben gibt es noch den
grafischen virt-manager der einen Überblick über die verschiedenen VMs
gibt. Das Programm hat mir von Aufbau sehr gut gefallen und es lässt
sich remote über SSH benutzen. Ein integrierter VNC Viewer löst dann
auch die VNC Problematik ohne weitere Konfiguration. Leider war das
erstellen von Virtuellen Maschinen sehr mühsam und wenig
konfigurations-freundlich. Ich habe der VM meine Bridge einfach nicht
nahe legen können und das Programm hat z.B. auch die Checkbox ignoriert
die verhindern sollte gleich den ganzen Festplattenplatz zu allozieren.

Außerdem hatte das Programm große Probleme wenn man Vorgänge abbrechen
wollte. Es resultierte im Hängen des Clients. Der libvirtd vergaß dann
auch Informationen und merkte nicht, dass er bereits Laufwerke gelöscht
hat. Eigentlich sehr schade da das Programm sonst einen sehr guten
Eindruck machte.

Probleme mit KVM


Ich habe das Problem mit den VMs, dass sie bei intensivem
Netzwerkverkehr freezen. Ich verwenden den Debian Standardkernel auf dem
Host sowie in der VM (2.6.26.x). Das Problem ist bekannt und sollte
durch wesentlich neuere Kernel behebbar sein. Ich kam leider noch nicht
dazu es mit einem aktuellen Kernel auszuprobieren und baute erstmal
einen Workaround indem ich mit Traffic-Shaping die zur Verfügung
stehende Bandbreite auf dem tap Hostinterface senkte. Nach nur kurzem
Testen merkte ich, dass es mit 12 Mbit erstmal auch bei mehrstündigen
Übertragungen stabil läuft. Ob ich eine höhere Bandbreite benutzen kann
weis ich nicht, da ich wegen der Abschaltung unseres alten Servers etwas
unter Zeitdruck stehe und deswegen nicht allzu viel Zeit zum testen
hatte. Bei Gelegenheit werde ich aber auf jeden Fall neuere Kernel
verwenden.

Alternativen


Das Problem mit KVM trieb mich dazu zu überlegen ob ich OpenVZ
ausprobieren soll. OpenVZ ist keine richtige Virtualisierung sondern
stellt den Hostkernel für Virtual Environments bereit. Damit soll sich
ein sehr geringer Ressourcenverlust von gerade mal 1-3% bei IO Zugriffen
ergeben. OpenVZ bietet sehr feine Ressourcenverteilung. Man kann genau
angeben wie viel CPU Zeit eine VE bekommen soll. Dazu gibt es noch eine
Reihe anderer Performancewerte. Nachteil von OpenVZ ist, dass nur Linux
als Gast und Host unterstützt wird und man natürlich weniger Flexibel
ist. Außerdem müssen alle Gäste den gleichen Kernel haben. OpenVZ soll
aber sehr sicher sein was die Zugriffskontrolle aus den Gästen anbelangt
obwohl keine richtige Virtualisierung stattfindet. Dinge wie SELinux
sind dann aber, glaube ich, nicht mehr möglich.

Falls jemand Fragen oder Tipps hat: Immer her damit!

Autor: Gero Kriependorf

Thursday, September 17, 2009

Symbian C++-Anwendung unter Linux kompilieren

Da wir mit den Nokia 6720/6730-Geräten bald wieder Symbian-Handys im Produktiveinsatzes haben und zudem mit der Systemtastensperre unzufrieden sind (funktioniert nur auf der Startseite, nicht in factis!) habe ich zum einen eine Freeware-Anwendung installiert, die eine eigene Tastensperre implementiert als auch das Symbian SDK unter Linux installiert.

AutoLock



Gute Dienste leistet AutoLock: damit ist zu jedem Zeitpunkt eine
Tastensperre möglich. Die Anwendung startet per Autostart und läuft im Hintergrund.

Homepage
Support-Forum

Nach dem Herunterladen muss die Anwendung noch signiert werden. Dafür reicht ein selbstgeneriertes Zertifikat.

Symbian SDK unter Linux



Die Installation des Symbian-SDKs ging mit Hilfe der folgenden Anleitung
http://wiki.forum.nokia.com/index.php/Develop_Symbian_C%2B%2B_on_Linux_using_Gnupoc_and_Eclipse_CDT
bzw. darin verlinkt:
http://www.martin.st/symbian/
vollkommen problemlos.

Hier in Zusammenfassung meine Schritte:

1) GNUPOC herunterladen
http://www.martin.st/symbian/gnupoc-package-1.13.tar.gz
und nach ~/gnupoc entpacken

2) EKA2 toolchain installieren

Die Binaries herunterladen:
http://www.codesourcery.com/gnu_toolchains/arm/releases/2005Q1C
und installieren:
mkdir ~/csl-gcc
cd ~/csl-gcc
tar -jxvf
../gnu-csl-arm-2005Q1C-arm-none-symbianelf-i686-pc-linux-gnu.tar.bz2
cd ~/gnupoc/tools
./install_eka2_tools ~/csl-gcc

3) Symbian-SDK

Herunterladen von
http://www.forum.nokia.com

Ich habe S60 3rd Edition, FP 2 heruntergeladen und installiert:

mkdir ~/symbian-sdks
mkdir ~/symbian-sdks/s60_32
cd ~/gnupoc/sdks
./install_gnupoc_s60_32
/tmp/S60_3rd_Edition_SDK_Feature_Pack_2_v1_1_en.zip ~/symbian-sdks/s60_32
./install_wrapper ~/gnupoc

4) Hallo Welt-Anwendung

Ob alles geklappt hat, kann man mit der Hallo Welt-Anwendung prüfen:

export PATH=~/gnupoc:${PATH}
export EPOCROOT=~/symbian-sdks/s60_32/
cd ~/symbian-sdks/s60_32/s60cppexamples/helloworldbasic/group
bldmake bldfiles
abld build gcce urel
cd ../sis
makesis helloworldbasic_gcce.pkg helloworldbasic.sis

5) Signierung und Installation

Symbian-Anwendungen müssen vor der Installation signiert werden.

Zertifikat erstellen:
makekeys -cert -expdays 3650 -password mykey.key mycert.cer

Signieren:
signsis helloworldbasic.sis helloworldbasic.sisx mycert.cer mykey.key

Mit ussb-push läßt sich dann die .sisx-Dateien ans Handy schicken.

6) Links zum Thema Tastensperre:

http://wiki.forum.nokia.com/index.php/Locking_phone_keypad
http://wiki.forum.nokia.com/index.php/CS000932_-_Enabling_and_disabling_keypad_lock
http://wiki.forum.nokia.com/index.php/Detecting_keypad_lock/unlock_status

7) Und zum Thema Autostart:

http://wiki.forum.nokia.com/index.php/TSS000371_-_How_can_I_disable_autostart_if_it_is_enabled%3F_How_can_I_make_autostart_/autoboot_dynamic%3F

Insgesamt ist das Forum Nokia-Wiki wirklich hilfreich!

Autor: Dirk Spöri

Wednesday, September 9, 2009

Asterisk in 6h

Rene und ich haben gestern Abend in nur 6 Stunden von null auf fertig auf
dem rohen Asterisk uns unsere Telefonanlage programmiert. Das ist so
einfach und gut verständlich, dass ich die Config hier kurz erklären
möchte. Ich annotiere dazu eine Mail an Astrid und Harald, die
beschrieben hat, was wir alles umgesetzt haben.

Wir haben nur ca. 120 Zeilen für die gesamte Konfiguration gebraucht.

DIE TELEFONE


Aber zunächst braucht man mal Telefone. Der Abschnitt ist nicht so
spannend und ihr könnt gerne zum nächsten großen Abschnitt "Dialplan"
springen. Unsere Telefone sind alle gleich konfiguriert und haben alle
die gleichen Berechtigungen und unterscheiden sich also nur in den
Nebenstellennummern. Damit sich das Telefon an Asterisk anmelden kann
braucht man ein SIP Konto. Damit man nicht alle Parameter einzeln
definieren muss, legt man ein Template an, dass alle gemeinsamen
Einstellungen zusammenfasst, davon "leitet man dann ab", so dass Renes
Nebenstelle mit der Nummer 66 so aussieht:
v v  sip.conf   v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[66](defaults)
callerid=Rene

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Natürlich muss man das Template "defaults" mit den für alle geltenen
Einstellungen auch definieren (ws. sogar vorher):
v v  sip.conf   v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[66](defaults)
callerid=Rene

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Natürlich muss man das Template "defaults" mit den für alle geltenen
Einstellungen auch definieren (ws. sogar vorher):
v v  sip.conf   v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[defaults](!)
type=friend ; weiss nicht
secret=7531 ; SIP Passwort
host=dynamic ; jede IP darf
context=intern ; selbstdefinierter "Sicherheitsbereich"
subscribecontext=intern ; Tel. darf andere Tels in diesem Bereich abhören
call-limit=10 ; weiss nicht
pickupgroup=2 ; Tel. darf Rufe für Tels dieser Gruppe annehmen
callgroup=2 ; Gruppe dieses Telefons
mailbox=2000 ; Voicemailbox dieses Telefons

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Das "subscribecontext" ist wichtig, damit dieses Telefon sieht, was andere
Telefone im angegebenen Kontext gerade machen, also ob telefoniert wird,
ob es klingelt oder ob es frei ist. Das übernehmen von Anrufen anderer
Telefone geht über "callgroup" und "pickupgroup". Jedes Telefon gehört zu
einer Gruppe und darf für Anrufe von bestimmmten anderen Gruppe
"abgreifen". Hier gehören alle zu "2" und es dürfen auch alle Anrufe von
"2" annehmen.

Um nach draußen telefonieren zu können und von draußen Rufe annehmen zu
können brauchen wir noch ein Konto für unseren SIP-to-ISDN Gateway von
Patton:
v v  sip.conf   v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[gw_patton]
type = peer
host = patton.factis.lan
port = 5060

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Damit man überhaupt "subscriben" (also andere Telefone beobachten) darf
braucht's noch folgende allgemein Config:
v v  sip.conf   v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[general]
port=5060
bindaddr=0.0.0.0
allowsubscribe = yes
notifyringing = yes
notifyhold = yes
limitonpeers = yes

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Das war's bei der Definition der Telefone.

DER DIALPLAN


Der Dialplan bestimmt was passiert wenn man welche Nummer anruft. Wenn
man gar nichts definiert kann man GAR KEINE Nummern anrufen. Nicht mal
intern. Man muss also auch definieren, dass die eine Nebenstelle über die
Nummer der anderen Nebenstelle diese Nebenstelle auch tatsächlich anrufen
darf. Und damit sind wir beim ersten Punkt aus das oben genannten Mail:

Gespräche intern führen


v v  BEISPIEL v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => 11,1,Dial(SIP/11)
exten => 22,1,Dial(SIP/22)
exten => 33,1,Dial(SIP/33)
exten => 44,1,Dial(SIP/44)
exten => 55,1,Dial(SIP/55)
exten => 66,1,Dial(SIP/66)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Das bedeutet, dass Telefone, die im Kontext "intern" sind über wählen der
"11" eine Verbindung zum SIP Telefon mit der Nebenstellennummer "11"
herstellen. Die eins nach dem ersten Komma bedeutet, dass das die erste
Aktion ist, die ausgeführt werden soll, wenn die Nummer gewählt wird. Man
kann danach mit höheren Nummern die Aktionen angeben, die danach passieren
sollen. Das ganze gilt natürlich nicht nur für die 11 sondern analog für
alle anderen Telefone. Und weil es so mühsam ist, das für alle zu
definieren, kann man auch ein Muster angeben und wenn die gewählte Nummer
darauf passt, dann passiert etwas, bei uns also:
v v  extensions.conf  v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => _XX,1,Dial(SIP/${EXTEN})

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Der Unterstrich bedeutet, dass das folgende keine vollständige Nummer,
sondern ein Muster ist. Die beiden XX passen z.B. auf 83 oder auf 22 oder
auf 11 oder auf 30. Das ${EXTEN} ist eine Dialplan-Variable, die immer
die gewählte Nummer enthält, d.h. wenn die 22 gewählt wird, dann passt 22
auf das _XX Muster und es wird der Befehl Dial(SIP/${EXTEN}) ausgeführt,
wobei das ${EXTEN} vorher durch die gewählte Nummer 22 ersetzt wird.

Gespräche von extern annehmen und nach extern führen


Damit man auch nach draußen telefonieren kann muss man angeben, was mit
anderen Nummern passiert:
v v  extensions.conf  v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => _XX,1,Dial(SIP/${EXTEN})
exten => _XX.,1,Dial(SIP/${EXTEN}@gw_patton)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Das X steht wieder für eine Ziffer, der Punkt steht für ein oder mehrere
Ziffern, dass heisst die kürzeste Nummer, die passt ist dreistellig. Beim
Wählen muss man jetzt noch angeben, dass man nicht intern sondern über den
in sip.conf definierten Patton-Gateway rauswählen will. Und das war's.

Damit man Gespräche von außen annehmen kann muss man definieren, was
passiert, wenn ein Gespräch an die externe Rufnummer ankommt. Wir wollen
zum Beispiel, das Gespräche an die externe Nummer mit angehängter
Durchwahl direkt zur angewählten Nebenstelle durchgestellt werden:
v v  extensions.conf  v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => _8964560XX,1,Dial(SIP/${EXTEN:7})

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Diese Regel müssen wir im vordefinierten "default" Kontext definieren,
denn der Patton ist NICHT im Kontext "intern" und deswegen gelten für ihn
auch nicht die Regeln aus dem "intern" Kontext. Das Muster passt auf alle
Nummern, die mit unserer externen Nummer beginnen und bei denen noch zwei
beliebige Ziffern folgen, also z.B. 896456033 für die Durchwahl "33".
Wenn diese Nummer gewählt wird, soll wieder verbunden werden, aber diesmal
an ${EXTEN:7} wobei das :7 bedeutet, dass die ersten 7-Stellen von der
gewählten Nummer abgeschnitten werden sollen, bevor durchgestellt wird.
Für das Beispeil heisst das, dass für Asterisk dann Dial(SIP/33) da steht,
genau wie wenn man intern 33 gewählt hätte.

Gruppenrufe mit schrittweise größer werdender Gruppe



Wir wollen, dass bei eingehenden Anrufen auf die Hauptnummer 8964561 (ohne
weiter Durchwahl) erst einige wenige Telefone klingeln, aber nach kurzer
Zeit, wenn keiner dran geht, eine größere Gruppe von Telefonen klingelt.
Das geht so:


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => _8964561,1,Dial(SIP/22&SIP/44, 10)
exten => _8964561,2,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Das ist die erste zweistufige Regel. Erst wird bei 22 und 44
angeklingelt. Aber nur bis zum Timeout von 10 Sekunden. Danach ist die
erste Regel beendet und Regel mit Laufnummer 2 kommt dran: dort wird auf
22, 44 aber zusätzlich auf 55 und 66 angeklinglt.

Anrufbeantworter, der dran geht, wenn das Telefon innerhalb der
Geschäftszeiten zu lange klingelt und eine Nachricht spricht.



Aha, wenn also auch bei der zweite Gruppe keiner dran geht, soll der AB
dran gehen und einen Text aufsagen. Dann erweitern wir mal unsere Regel


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => _8964561,1,Dial(SIP/22&SIP/44, 10)
exten => _8964561,2,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66, 20)
exten => _8964561,3,Answer()
exten => _8964561,4,Playback(alle_mitarbeiter_im_gespraech)
exten => _8964561,5,Hangup()

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Jetzt gibt's zusätzlich in Zeile 2 einen Timeout von 20s und danach wird
der Anruf von der Telefonanlage angenommen und eine Nachricht
eingespielt. Danach wird aufgelegt.

Anrufbeantwortertext abhängig von angerufener Nummer (L&B MS, factis
Team oder factis research)



Na, das ist einfach, einfach nämlich das gleiche nochmal für die andere
Rufnummer mit anderem Dateinamen im Playback für eine andere Nachricht:


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => _8964560,1,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66, 30)
exten => _8964560,2,Answer()
exten => _8964560,2,Playback(lubms_sagt_hallo)
exten => _8964560,3,Playback(alle_mitarbeiter_im_gespraech)
exten => _8964560,4,Hangup()

exten => _8964561,1,Dial(SIP/22&SIP/44, 10)
exten => _8964561,2,Dial(SIP/22&SIP/44&SIP/33&SIP/55&SIP/66, 20)
exten => _8964561,3,Answer()
exten => _8964561,4,Playback(factisteam_sagt_hallo)
exten => _8964561,5,Playback(alle_mitarbeiter_im_gespraech)
exten => _8964561,6,Hangup()

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Kurzwahltasten, Busy-Lamps und Rufübernahme



Okay, erstmal die Anzeige. Damit dass funktioniert, muss Asterisk BEVOR
man eine angerufene Nummer bearbeitet, sagen welche Telefone klingeln
werden. Dieser Hinweis heisst "hint" und hat eine eigene
Reihenfolgenbezeichnung, die vor allen anderen stehen muss. Für interne
Anrufe geht das so:


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => _XX,hint,SIP/${EXTEN}
exten => _XX,1,Dial(SIP/${EXTEN})

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Und das war's (jedenfalls mit den Einstellungen, die wir oben in sip.conf
gemacht haben).


Für's übernehmen muss man für Snom Telefone Rufnummern der Form *8XX
definieren, wobei XX die Nebenstelle ist von der übernommen werden soll.
Denn diese Nummer wählt das Snom, wenn man auf die Nebenstellentaste der
Person drückt. Ein Gespräch kann man im Dialplan mit "Pickup" übernehmen.


Eigentlich sollte folgendes reichen:


v v BEISPIEL v v v v v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => _*8XX,1,Pickup(${EXTEN:2})

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Denn so würde der Ruf, der an der Nebenstelle XX anliegt angenommen
werden. Aber irgendwie meldet Asterisk dann immer, dass es keinen
solchen Channel findet. Mit folgendem Workaround, nämlich den Channel
erst in der globalen Variable PICKUPMARK zu speichern und dann wieder dort
auszulesen, geht's dann:


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => _*8X.,1,Set(GLOBAL(PICKUPMARK)=${EXTEN:2})
exten => _*8X.,n,Pickup(${EXTEN:2}@PICKUPMARK)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Halten, Durchstellen und Konferenz



Dazu braucht muss man eigentlich nichts weiter tun, als bei allen
Dial-Befehlen, bei denen das Gespräch übergeben werden darf hinten noch
"tT" als Option anzuhängen. Das eine steht für "attended transfer" und
das andere für "blind transfer" (also Übergabe ohne Rückfrage).

Richtig sieht also das Annehmen eines externen Anrufs so aus:

v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => 8964560,1,Dial(SIP/22&SIP/33&SIP/44&SIP/55, 30, tT)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

Beim Snom muss man noch konfigurieren was die Tasten jeweils genau machen
(d.h. wie man z.B. mehrere gehaltene Gespräche vermitteln will).
Ausserdem braucht man noch folgende Konfiguration in features.conf:

v v features.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v

[general]
parkext => 700
parkpos => 701-720
context => parkedcalls
pickupexten = *8

[featuremap]
blindxfer => #1
atxfer => *2

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Damit kann man dann auch durch wählen von *8 irgendeinen gerade
klingelnden Anruf annehmen, den man nach sip.conf "callgroup" und
"pickupgroup" Konfiguration annehmen darf. (Wenn mehrere klingeln,
bekommt man einen zufälligen zugewiesen.)


Wichtig für den Transfer sind die Werte unter "featuremap". Im Moment
geht das übergeben durch auflegen noch nicht, vielleicht braucht man da
doch noch was.

Unsere gewählten Klingeltöne für intern und extern



Damit die Telefone unterschiedlich klingeln muss man bei SIP einen
speziellen Snom Header setzen, das geht so:


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

[intern]
exten => _896456XXX,1,SIPAddHeader("Alert-Info:\;info=alert-external\;x-line-id=0")
exten => _896456XXX,n,Dial(SIP/${EXTEN:7})

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Der Klingelton "alert-external" wird im Telefon konfiguriert. Statt
"alert-external" gibt's noch "alert-group" und "alert-internal". Man kann
auch eine eigene Klingelton-URL angeben.

AB-Konfiguration



Wir wollen einen AB, der ausserhalb der Geschäftszeiten nach ca. 2x klingeln dran geht
und ja nach angerufener eine andere Meldung (auch anders als die
"keiner dran gegangen Meldung") abspielt und anbietet eine Nachricht zu
hinterlassen.


Das sind eigentlich zwei Sachen auf einmal. Einmal ein zeitabhängiger
Dialplan und einmal eine AB, der es erlaubt Nachrichten zu hinterlassen
und abzufragen. Erst der AB. Dazu legt man eine Datei "voicemail.conf" an:


v v voicemail.conf v v v v v v v v v v v v v v v v v v v v v v v v v v v

[general]
format = wav

[default]
2000 => 7531,factis mailbox

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Hier definieren wir die Mailbox 2000, die wir in der sip.conf allen
Benutzern zugewiesen haben. Um die Mailbox abfragen zu können braucht's
noch folgende Konfiguration im Dialplan:



v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => 800,1,VoicemailMain(2000, s)
exten => asterisk,1,VoicemailMain(s2000)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Ich glaube eigentlich braucht's nur die zweite Zeile für die Taste am
Snom. Aber die zweite Zeile ist nützlich, weil man die Nummer an jedem
Telefon wählen kann. Wenn wir die Nummer auf 80 verkürzen würden könnte
man sie wahrscheinlich sogar von extern abrufen. Allerdings sollten wir
dann das "s" weg machen, denn das sorgt dafür, dass man kein Passwort
eingeben muss zum abfragen. :-)


Damit man eine Nachricht hinterlassen kann, muss man bei statt "Playback"
das Kommando "VoiceMail" benutzen und sagen in welche Mailbox die
aufgenommene Nachricht gespeichert werden soll. Mit der Option "s" sorgt
man dafür, dass das VoiceMail-System "silent" ist und nicht erst dumm
quatscht. Lieber spielen wir vorher eine Nachricht ab, also:


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

exten => 8964560,1,SIPAddHeader("Alert-Info:\;info=alert-external\;x-line-id=0")
exten => 8964560,n,Dial(SIP/22&SIP/33&SIP/44&SIP/55, 5, tT)
exten => 8964560,n,Playback(lubms_begruessung)
exten => 8964560,n,Playback(lubms_ausserhalb)
exten => 8964560,n,VoiceMail(2000, s)

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Der zeitabhängig Dialplan ist auch einfach. Man kann im Dialplan einen
Kontext in einen anderen includen. Es wird dann immer die erste passende
Extension ausgewählt. Unser Hauptkontext "default" sieht im Moment so aus


v v extensions.conf v v v v v v v v v v v v v v v v v v v v v v v v v v

[default]
include => allgemein
include => innerhalb,08:00-17:30,mon-fri,*,*
include => ausserhalb

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^


Das heisst es werden "per Default" erst werden alle Regeln im Kontext
"allgemein" geprüft. Wenn es Montag bis Freitag zwischen 8 und 17:30 ist,
dann werden ausserdem die Regeln in "innerhalb" geprüft, sonst nur die in
"ausserhalb". Bei "innerhalb" sind die externen Extensions (mit 896456X)
so definiert, wie in den weiter oben stehenden Punkten. Im Kontext
ausserhalb sind die externen Nummern so wie hier oben mit "VoiceMail" und
kurzer Klingelzeit (5s) definiert.

Signalisierung von neuen Anrufen


Anrufbeantworter wird an allen Telefonen durch das blinkende Lämpchen
signalisiert und kann mit der Anrufbeantworter-Taste an jedem Telefon
abgehört werden

Das Abhören geht durch die "exten => asterisk,1,VoicemailMain(...)"
Extension, das Blinken kommt, glaube ich, deswegen automatisch, weil in
sip.conf die Mailbox 2000 eingetragen ist und diese Mailbox in
voicemail.conf definiert ist.

Direktes, zeitunabhängiges Anrufen einer Nebenstelle



Das geht indem im oben gezeigten Defaultkontext der eigene Kontext
"allgemein" inkludiert wird, der gerade die Regel zum direkten Anrufen
einer Nebenstelle von außen enthält. Die wird erst geprüft und ist damit
tageszeitunabhängig.

Extern wählen ohne Null



Wählen ohne Vorwahl einer Null, denn Nebenstellen sind genau
zweistellig und extern gibt es keine zweistelligen Nummern, so dass
alle Nummern, die länger als zwei Stellen sind extern gewählt werden.
War oben schon beschrieben in der Regel mit dem Pattern "_XX.", das auf
drei- oder mehrstellige Rufnummern matcht. Das Pattern "_XX" benutzen wir
für's interne Anrufen.

Autor: David Leuschner