Gemeinschaft Asterisk PBX ­čçę­čç¬

By | 8 Oct 2009
  • kempgen.net — Anleitung zur manuellen Installation
    • in der sounds-wav-to-alaw.sh muss beim sox-Befehl der Parameter -w in -2 ge├Ąndert werden
  • belug.de — Kompilieren des fcpci-Moduls
    • kerneltrap.orgcapi_ctr_reseted() hei├čt jetzt capi_ctr_down() (muss ge├Ąndert werden!)

Allgemeine Bedienung

Benutzer an Telefon anmelden

Bei den Provisioning-f├Ąhigen Telefonen:

  • H├Ârer abheben
  • *0<Durchwahl> eintippen
  • nach Aufforderung Kennwort eintippen (bei uns ├╝blicherweise 1234)
  • Telefon evtl. rebooten

Anrufergruppe beitreten

Damit das Telefon richtig klingelt, folgenderweise der Anrufergruppe 100 beitreten:

  • H├Ârer abheben
  • *5<Queue-Nr.> eintippen (bei uns die 100)
  • auflegen

Rausw├Ąhlen ohne 0

In der MySQL-Datenbank asterisk in der Tabelle gates sind die W├Ąhlstrings hinterlegt. Standard (und nicht ├╝ber GUI ├Ąnderbar) ist folgender:

mISDN/g:{gateway}/{number:1}

d.h., von der Rufnummer wird immer die erste Stelle abgeschnitten. In den neueren Versionen werden aber generell alle nicht intern vorhandenen Rufnummern an das ausgehende Routing ├╝bergeben. Somit kann man durch eine ├änderung in der Datenbank den W├Ąhlstring auf

mISDN/g:{gateway}/{number}

├Ąndern und hat dann den gew├╝nschten Effekt. Google Groups Thread

Anruferidentifizierung

Vorgesehen ist, dass dies auf dem Telefon passiert. Daher gibt es momentan keine Funktionalit├Ąt in dieser Richtung, die direkt im Asterisk den Anrufernamen aus einer Tabelle sucht.

Da wir mit Queues arbeiten, muss dieser Aufruf vor dem Weiterleiten des ankommenden Anrufs in den Queue passieren. Ein geeigneter Ort ist der to_queue:-Abschnitt in der e-internal.ael – direkt ├╝ber dem Queue()-Aufruf: Google Groups Thread

                                else {
                                        Set(ring_instead_of_moh=);
                                        Progress();  // SIP: "183 Session Progress" with early media
                                }
                                // Die folgende Zeile ist neu:
                                AGI(/opt/gemeinschaft/dialplan-scripts/in-get-callerid.agi,${CALLERID(num)});
                                Set(queue_entertime=${EPOCH});
                                Queue(${EXTEN},${ring_instead_of_moh},,,${queuetimeout});
                                Set(queue_waittime=$[${EPOCH}-${queue_entertime}]);
                                Verbose(1,### Tried to enter queue ${EXTEN}\, result: ${QUEUESTATUS}\, waittime: ${queue_waittime});

Das Script in-get-callerid.agi sieht dann in etwa so aus:

#!/usr/bin/php -q
<?php

define( 'GS_VALID', true );  /// this is a parent file
require_once( dirName(__FILE__) .'/../inc/conf.php' );
require_once( GS_DIR .'inc/agi-fns.php' );

ini_set('implicit_flush', 1);
ob_implicit_flush(1);

$number = trim(@$argv[1]);
if (empty($number)) die();

gs_agi_verbose( '### Number identification for ' . $number );

// TODO: Identify number

echo 'SET VARIABLE CALLERID(name) ' . gs_agi_str_esc($neuer_name) . "\n";

?>

Wichtig ist noch, dass das AGI-Script ausf├╝hrbar (chmod a+x in-get-callerid.agi) sein und die magische erste Zeile haben muss.

Konferenzr├Ąume von au├čen

In der Grundkonfiguration gibt es nur dynamische Konferenzr├Ąume, die man mittels 88 + Raumnummer anlegen kann. Diese sind allerdings dann nicht von au├čen erreichbar. Folgenderweise kann man einen Raum von au├čen erreichbar machen: Google Groups Thread

In der meetme.conf einen neuen statischen Konferenzraum (hier: Nummer 888) anlegen:

[rooms]
conf => 888

In der e-internal.ael direkt im Kontext to-internal-users folgenden Eintrag machen:

        //----------------------------------------------------------
        // Direct to conference
        //----------------------------------------------------------
        20888 => {
                Answer();
                System(wget 'http://192.168.1.245/gemeinschaft/prov/call-init.php?user=ah&to=21888');
                Playback(silence/2);
                MeetMe(888, cM);
        }

        21888 => {
                Answer();
                MeetMe(888, cM);
        }

Dadurch werden Anrufe auf der 21888 direkt in den Konferenzraum 888 geschaltet. Anrufe auf der 20888 lassen das Telefon vom Benutzer ah den Konferenzraum anrufen und schicken den Anrufer danach erst in den Raum. Somit muss man nicht in einem stillen Raum auf die Teilnehmer warten.

Aussetzer beim Klingeln der Telefone

Die Telefone haben nach ca. 10 Sekunden pl├Âtzlich f├╝r ca. 2 Sekunden aufgeh├Ârt zu klingeln. In diesen 2 Sekunden kann man den Anruf auch nicht annehmen. Google Groups Thread

Ursache ist die Einstellung Klingelzeit pro Agent des Queues. Diese ist per default auf 10 Sekunden eingestellt, sollte allerdings bei der Einstellung Alle klingeln gleichzeitig nicht greifen. Dennoch mach die Anlage nach den 10 Sekunden eine kurze Pause. Erh├Âht man den Wert auf z.B. 60 Sekunden, sollte die Pause nicht mehr auftreten.

Status-Monitor

Es gibt 2 Status-Monitore:

Der erstere fragt Asterisk alle paar Sekunden ├╝ber das Manager-Interface ab und erzeugt somit pro Betrachter mehr Last. Der zweitere benutzt (via AJAX) den ExtStateDaemon, welcher wie folgt aktiviert werden muss:

Aktivieren des ExtStateD

  1. Kopieren des init-Scripts nach /etc/init.d: cp /usr/src/gemeinschaft/etc/init.d/gs-extstated /etc/init.d/
  2. Einrichten des automatischen Starts: update-rc.d gs-extstated defaults 90 10
  3. Starten des Daemons /etc/init.d/gs-extstated start

Google Groups Thread

Anrufbeantworter-Scripting

/opt/gemeinschaft/scripts/gs-vm-audio-set:

#!/usr/bin/php -q
<?php
/** @author Markus Birth <mab@silversolutions.de> */

define( 'GS_VALID', true );  /// this is a parent file
define( 'GS_VM_AUDIO_DIR', '/opt/gemeinschaft/vm-rec' ); // path to VM recordings
define( 'GS_VM_AUDIO_FILEFORMAT', '%1$s-%2$s.alaw' );  // %1$s = extension, %2$s = external|internal
define( 'GS_VM_AUDIO_SOURCE_DIR', '/ssl' );            // source dir for <filename> (will be appended to GS_VM_AUDIO_DIR)

require_once( dirName(__FILE__) .'/../inc/conf.php' );
include_once( GS_DIR .'lib/getopt.php' );
include_once( GS_DIR .'inc/gs-lib.php' );


/***********************************************************
*    the shell parameters
***********************************************************/
$usage = 'Usage: '. baseName(__FILE__) .' --user=<user> --source=internal|external --file=<filename>';

$opts = @getOptsNoMultiples( '',
    array(
        'user=',
        'source=',
        'file='
    ),
    $usage
);
if (! isSet( $opts['user'] )
 || ! isSet( $opts['source'] )
 || ! isSet( $opts['file'] )
 ) {
    gs_script_invalid_usage( $usage );
}


/***********************************************************
*    do stuff
***********************************************************/
if (!in_array($opts['source'], array('internal', 'external'))) {
    gs_script_error( 'Please specify only "external" or "internal" as source!' );
}

$srcPath = GS_VM_AUDIO_DIR . GS_VM_AUDIO_SOURCE_DIR . '/' . $opts['file'] . '.alaw';
if (!file_exists($srcPath)) {
    gs_script_error( 'File "' . $srcPath . '" not found!' );
}
$trgPath = GS_VM_AUDIO_DIR . '/' . sprintf(GS_VM_AUDIO_FILEFORMAT, $opts['user'], $opts['source']);

if (file_exists($trgPath)) {
    echo 'Warning. Target file "' . $trgPath . '" will be overwritten!' . PHP_EOL;
}

if ( !copy($srcPath, $trgPath) ) {
    gs_script_error( 'Failed to copy "' . $srcPath . '" to "' . $trgPath . '"!' );
}

echo 'Set VM announcement of user ' . $opts['user'] . ' for ' . $opts['source'] . ' calls to "' . $opts['file'] . '".' . PHP_EOL;

?>

/opt/gemeinschaft/sbin/do-event:

#!/bin/sh

GS_DIR=/opt/gemeinschaft/scripts
GS_USER=99
GS_QUEUE=100
GS_SOURCE=external
LOGFILE=/var/log/gemeinschaft/do-event.log

case "$1" in
    mittag)
        $GS_DIR/gs-vm-audio-set --user=$GS_USER --source=$GS_SOURCE --file=mittag 2>&1 >>$LOGFILE
        $GS_DIR/gs-queue-callforward-activate --queue=$GS_QUEUE --source=$GS_SOURCE --case=timeout --active=std 2>&1 >>$LOGFILE
        ;;
    momeeting)
        $GS_DIR/gs-vm-audio-set --user=$GS_USER --source=$GS_SOURCE --file=momeeting 2>&1 >>$LOGFILE
        $GS_DIR/gs-queue-callforward-activate --queue=$GS_QUEUE --source=$GS_SOURCE --case=timeout --active=std 2>&1 >>$LOGFILE
        ;;
    off)
        $GS_DIR/gs-queue-callforward-activate --queue=$GS_QUEUE --source=$GS_SOURCE --case=timeout --active=no 2>&1 >>$LOGFILE
        $GS_DIR/gs-vm-audio-set --user=$GS_USER --source=$GS_SOURCE --file=default 2>&1 >>$LOGFILE
        ;;
    *)
        echo "Usage: $0 {mittag|momeeting|off}"
        exit 1
        ;;
esac

exit 0

crontab:

MAILTO=mab@intranet.silversolutions.de
#m  h  dom mon dow   command
00 10   *   *   1    /opt/gemeinschaft/sbin/do-event momeeting
00 11   *   *   1    /opt/gemeinschaft/sbin/do-event off
00 13   *   *  1-5   /opt/gemeinschaft/sbin/do-event mittag
00 14   *   *  1-5   /opt/gemeinschaft/sbin/do-event off

Leave a Reply