Next Previous Contents

3. configuration

3.1 mISDN

3.2 asterisk

capi.conf

[general]
nationalprefix=
internationalprefix=0
rxgain=0.8
txgain=0.8

[interfaces]
msn=5
incomingmsn=5
controller=1
softdtmf=0
context=in
devices=2

misdn.conf

[general]
context=misdn
; 0 - No Debug
; 1 - mISDN Messages and * - Messages, and * - State changes
; 2 - Messages + Message specific Informations (e.g. bearer capability)
; 3 - very Verbose, the above + lots of Driver specific infos
; 4 - even more Verbose than 3
debug=1

[intern]
ports=2
context=out  

extensions.conf

[general]
static=yes
writeprotect=no

[globals]
PHONE=mISDN/2
ISDNOUT=CAPI/5:b
NULL=
#include "macro_dial-result.inc"

[macro-process-call]
; ${ARG1} Device
; ${ARG1} MSN
exten => s,1,Ringing
exten => s,2,Wait,2
exten => s,3,agi,directory.agi
exten => s,4,Dial(${ARG1}/${ARG2})
exten => s,5,Hangup

[macro-dialout]
; ${ARG1} CIDNAME
; ${ARG2} Device
; ${ARG3} Num
; ${ARG4} SIP EXT
exten => s,1,SetCIDName(${ARG1})
exten => s,2,Dial(${ARG2}${ARG3}${ARG4},,t)
exten => s,3,Playback(invalid)
exten => s,4,Hangup

[sipgate-in]
exten => <sip-id-1>,1,Macro(process-call,${PHONE},<sip-id-1>)
exten => <sip-id-2>,1,Macro(process-call,${PHONE},<sip-id-2>)
exten => <freenet-id>,1,Macro(process-call,${PHONE},1)

[isdn-in]
exten => 5,1,Macro(process-call,${PHONE},5)

[sipgate-out]
exten => _1.,1,Macro(dialout,<Name ID 1>,SIP/,${EXTEN:1},@<sip-extension-1>)
exten => _2.,1,Macro(dialout,<Name ID 2>,SIP/,${EXTEN:1},@<sip-extension-2>)
exten => _3.,1,Macro(dialout,<Name ID 3>,SIP/,${EXTEN:1},@<sip-freenet-extension>)


[isdn-out]
;ISDN OUT
exten => _0.,1,Macro(dialout,<Name>,${ISDNOUT},${EXTEN},${NULL})
;ISDN-INTERN
exten => _8.,1,Macro(dialout,<Name>,${ISDNOUT},${EXTEN:1},${NULL})

[ip-out]
;IP DIAL
exten => _9.,1,SetCIDName(<Name>)
exten => _9.,2,AGI(parseExtension.agi)
exten => _9.,3,Dial(SIP/${CNUM}@${CIP},30,tr)
exten => _9.,4,Playback(invalid)
exten => _9.,5,Hangup

[in]
include => sipgate-in
include => isdn-in
exten => t,1,Macro(dial-result)

[out]
include => sipgate-out
include => isdn-out
include => ip-out
exten => s,1,Answer
exten => s,2,DigitTimeout,5
exten => s,3,ResponseTimeout,30
exten => i,1,Macro(dial-result,5)
exten => t,1,Macro(dial-result)
exten => T,2,PlayTones(congestion)
exten => T,3,Wait(5)
exten => T,4,Hangup

modules.conf

[modules]
autoload=yes
load => res_musiconhold.so
load => chan_misdn.so
load => chan_capi.so
noload => pbx_gtkconsole.so
noload => pbx_kdeconsole.so
noload => app_intercom.so
noload => chan_modem_i4l.so
noload => chan_modem_bestdata.so
noload => chan_modem_aopen.so
noload => chan_modem.so;
noload => chan_zap.so
noload => chan_alsa.so
noload => chan_oss.so
noload => app_groupcount.so
noload => chan_agent.so
noload => chan_iax.so
noload => app_txtcidname.so
noload => app_controlplayback.so
[global]
chan_capi.so=yes

sip.conf

[general]
port = 5060
bindaddr = 0.0.0.0
localnet = 192.168.0.0
localmask = 255.255.255.0
maxexpirey=3600
defaultexpirey=300
nat=no
disallow=all
allow=alaw
allow=ulaw
allow=g726
allow=gsm
allow=ilbc
musicclass=random
srvlookup=yes
tos=0x18
register => <sipgate-id-1>:<sipgate-password-1>@sipgate.de/<sipgate-id-1>
register => <sipgate-id-2>:<sipgate-password-2>@sipgate.de/<sipgate-id-2>
register => <freenet-id>:<freenet-password>@freenet.de/<freenet-id>

[<sip-extension-1>]
username=<sipgate-id-1>
fromuser=<sipgate-id-1>
fromdomain=sipgate.net
host=sipgate.de
secret=<sipgate-password-1>
type=friend
context=in
disallow=all
allow=gsm
allow=ilbc
allow=alaw
allow=ulaw
insecure=very

[<sip-extension-2>]
username=<sipgate-id-2>
fromuser=<sipgate-id-2>
fromdomain=sipgate.net
host=sipgate.de
secret=<sipgate-password-2>
type=friend
context=in
disallow=all
allow=gsm
allow=ilbc
allow=alaw
allow=ulaw
insecure=very

;ATTENTION!!! You have to add "194.97.54.97 freenet.de" to your /etc/hosts file
;194.97.54.97 is IP of "iphone.freenet.de" but the server accepts only "freenet.de" host...
[<sip-freenet-extension>]
username=<freenet-id>
fromuser=<freenet-id>
fromdomain=freenet.de
host=freenet.de
secret=<freenet-password>
type=friend
context=in
disallow=all
allow=gsm
allow=ilbc
allow=alaw
allow=ulaw
insecure=very

festival.conf

[general]
host=localhost
port=1314
festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n
usecache=yes
cachedir=/var/lib/asterisk/festivalcache/

macro_dial-result.inc

got this part from another page (works at least fine for me)

[macro-dial-result]
exten => s,1,AbsoluteTimeout(35)
exten => s,2,GotoIf($[foo${ARG1} != foo]?cause_${ARG1},1:cause_${HANGUPCAUSE},1)

; undefined error (mostly when an existing extension is currently unavailable)
exten => _cause_0,1,Answer
exten => _cause_0,2,Wait(1)
exten => _cause_0,3,Playback(the-number-u-dialed,skip)
exten => _cause_0,4,Playback(is-curntly-unavail,skip)
exten => _cause_0,5,Playback(pls-try-call-later,skip)
exten => _cause_0,6,Wait(3)
exten => _cause_0,7,Goto(3)

; normal call clearing
exten => _cause_1,1,Hangup

; extension currently busy
exten => _cause_2,1,Answer
exten => _cause_2,2,Wait(1)
exten => _cause_2,3,Playback(the-number-u-dialed,skip)
exten => _cause_2,4,Playback(is-curntly-busy,skip,skip)
exten => _cause_2,5,Playback(pls-try-call-later,skip)
exten => _cause_2,6,Wait(3)
exten => _cause_2,7,Goto(3)

; something failed
exten => _cause_3,1,Answer
exten => _cause_3,2,PlayTones(info)
exten => _cause_3,3,Wait(2)
exten => _cause_3,4,Playback(an-error-has-occured,skip)
exten => _cause_3,5,Playback(pls-try-call-later,skip)
exten => _cause_3,6,Wait(2)
exten => _cause_3,7,Goto(2)

; congestion
exten => _cause_4,1,Congestion

; unassigned number
exten => _cause_5,1,Answer
exten => _cause_5,2,PlayTones(info)
exten => _cause_5,3,Wait(2)
exten => _cause_5,4,Playback(ss-noservice,skip)
exten => _cause_5,5,Wait(2)
exten => _cause_5,6,Goto(2)

; unallowed number
exten => _cause_99,1,Answer
exten => _cause_99,2,PlayTones(info)
exten => _cause_99,3,Wait(2)
exten => _cause_99,4,Playback(discon-or-out-of-service,skip)
exten => _cause_99,5,Wait(2)
exten => _cause_99,6,Goto(2)

; unauthorized extension
exten => _cause_100,1,Answer
exten => _cause_100,2,PlayTones(info)
exten => _cause_100,3,Wait(2)
exten => _cause_100,4,Playback(im-sorry,skip)
exten => _cause_100,5,Playback(your,skip)
exten => _cause_100,6,Playback(extension,skip)
exten => _cause_100,7,Playback(not-yet-assigned,skip)
exten => _cause_100,8,Playback(please-contact-tech-supt,skip)
exten => _cause_100,9,Wait(2)
exten => _cause_100,10,Goto(2)

; all other errors
exten => _cause_X.,1,Answer
exten => _cause_X.,2,PlayTones(info)
exten => _cause_X.,3,Wait(2)
exten => _cause_X.,4,Playback(an-error-has-occured,skip)
exten => _cause_X.,5,Playback(error-number,skip)
exten => _cause_X.,6,GotoIf($[foo${ARG1} != foo]?7:11)
exten => _cause_X.,7,SayNumber(${ARG1})
exten => _cause_X.,8,Wait(1)
exten => _cause_X.,9,Playback(please-contact-tech-supt,skip)
exten => _cause_X.,10,Goto(14)
exten => _cause_X.,11,SayNumber(${HANGUPCAUSE})
exten => _cause_X.,12,Wait(1)
exten => _cause_X.,13,Playback(please-contact-tech-supt,skip)
exten => _cause_X.,14,Wait(2)
exten => _cause_X.,15,Goto(2)

exten => T,1,PlayTones(congestion)
exten => T,2,Wait(5)
exten => T,3,Hangup

3.3 asterisk-agi

IP Dialing (resolve 1234*111222333444 to 1234@111.222.333.444)

this script is used for ip dialing (prefix 9 here)
just dial the number, followed by a *, followed by the destination ip with leading zeros

parseExtension.agi

#!/usr/local/bin/php -q
<?php
include("phpagi.php"); //see http://bcwireless.net/~matthewa/phpagi/
$agi=new AGI();


function stripZero($tmp) {
        return preg_replace("/^[0]*/","",$tmp);
}

//source
$CallerID = $agi->request["agi_callerid"];
//destination
$Extension = $agi->request["agi_extension"];

preg_match("/^[0-9]([0-9]*)\*([0-9]*)$/U",$Extension,$tmp);
$num = $tmp[1];
//IP
$p1 = stripZero(substr($tmp[2],0,3));
$p2 = stripZero(substr($tmp[2],3,3));
$p3 = stripZero(substr($tmp[2],6,3));
$p4 = stripZero(substr($tmp[2],9,3));
$IP = "$p1.$p2.$p3.$p4";

$agi->agi_exec("SET VARIABLE CNUM $num");
$agi->agi_exec("SET VARIABLE CIP $IP");

exit;

small phonebook application

searches callerid in a mysql database and sets "CIDName". if CID + Name is too long for your phone (eg. 20 char display) it will adapt the length (only firstname, only callerid, ...)
directory.agi is called from extension.conf (incoming calls)

table structure

create table directory (
  id int(14) auto_increment primary key,
  firstname varchar(200),
  lastname varchar(200),
  number varchar(50),
  display varchar(200)
);

directory.agi

#!/usr/local/bin/php -q
<?php
include("phpagi.php"); //see http://bcwireless.net/~matthewa/phpagi/
$agi=new AGI();
$dbconn = mysql_connect("localhost","root","");
mysql_select_db("asterisk");
$inDB = false;

function lookup($number) {
        $query = "SELECT firstname, lastname, display from directory where number='$number'";
        $tmp = mysql_query($query);
        if(mysql_num_rows($tmp) > 0) {
                list($firstname, $lastname, $display) = mysql_fetch_array($tmp);
                return $display ? $display : $firstname." ".$lastname;
        }
        else {
                return "";
        }
}

function parseCallerID($ID) {
        if(preg_match("/\"(.*)\"[ ]*\<(.*)\>/",$ID,$tmp)) {
                return array($tmp[1],$tmp[2]);
        }
        if(preg_match("/^[0-9]+$/",$ID,$tmp)) {
                return array("",$ID);
        }
}

function doCrop($Name, $ID) {
        global $inDB;
        //ID = 0
        if(strlen("\"$Name\" <0>") <= 20 && $inDB) {
                return array($Name, 0);
        }
        //only first name
        $tmp = split(" ",$Name);
        if(strlen("\"$tmp[0]\" <$ID>") <= 20) {
                return array($tmp[0],$ID);
        }

        //first name + ID = 0
        if(strlen("\"$tmp[0]\" <0>") <= 20 && $inDB) {
                return array($tmp[0],0);
        }

        //ID only
        return array("", $ID);
}

function getExtensionPrefix($Extension) {
        switch ($Extension) {
                case "4319000": //sipgate-hh
                        return 1;
                        break;
                case "8707000": //sipgate-b
                        return 2;
                        break;
                case "1": //freenet-muc
                        return 3;
                        break;
                case "5": //isdn
                        return 0;
                        break;
                default:
                        return -1;
                        break;
        }
}

$CallerID = $agi->request["agi_callerid"];
//$Extension = $agi->request["agi_extension"];
$Extension = $agi->get_var("MACRO_EXTEN");

//$agi->con_print_r($agi->request["agi_callerid"]);
list($Name,$ID) = parseCallerID($agi->request["agi_callerid"]);

if(!$Name && $ID == 0) { //isdn call - no caller id
        $agi->agi_exec("EXEC SetCallerID ".getExtensionPrefix($Extension));
        $agi->agi_exec("EXEC SetCIDName \"No CallerID\"");
        exit;
}
elseif($Extension == 5) {
        if(strlen($ID) == 1) {
                $ID = "8".$ID;
        }
        else {
                $ID = getExtensionPrefix($Extension).$ID;
        }
        $Name = "";
}
elseif($Name == "anonymous") {
        $agi->agi_exec("EXEC SetCallerID ".getExtensionPrefix($Extension));
        $agi->agi_exec("EXEC SetCIDName \"No CallerID\"");
        exit;
}
elseif(!preg_match("/^[0-9]*$/", $ID)) { //non-numeric callerid - freenet?
        $ID = 0;
}
elseif(($Name == $ID) || !$Name) { //format "number" <number> - so try to lookup...
        $Name = lookup($ID);
        $ID = getExtensionPrefix($Extension).$ID;
        $inDB = true;
}
else {
        $ID = getExtensionPrefix($Extension).$ID;
}

//phone limited to 20 chars - try to crop
$comp = "\"$Name\" <$ID>";
if(strlen($comp) > 20) {
        list($Name,$ID) = doCrop($Name, $ID);
}

$agi->agi_exec("EXEC SetCallerID $ID");
if($Name) {
        $agi->agi_exec("EXEC SetCIDName \"$Name\"");
}

exit;


Next Previous Contents