Weiterleitung bei Nichtereichbarkeit

frindly

Neuer User
Mitglied seit
4 Nov 2009
Beiträge
59
Punkte für Reaktionen
0
Punkte
0
Hallo,
auf einer Asterisk Anlage wird ein Telefon ab einer bestimmten Uhrzeit (Nachtschaltung) auf eine andere Nebenstelle geleitet (Anrufbeantworter).
Andere Nebenstellen sind so eingestellt, das sie nach einer bestimmten Zeit weiterleiten auf die Zentrale.
Wo werden all diese Einstellungen gepseichert?
In der extensions.conf habe icih nichts gefunden,
mittels database show hab ich versucht nen blick in die astdb zu werfen,
hier steht aber auch nichts drin.
Wo werden diese Informationen hinterlegt?
 
Hallo frindly,

Wo werden all diese Einstellungen gepseichert?

in der extensions.conf evtl. in Kombination mit AstDB, oder per Realtime.

Zeig uns bitte mal Deine extensions.conf, vielleicht findet sich darin doch ein Hinweis.

Rentier
 
Hier ist die extensions.conf.
Wenn weiter Dateien interessant sind... einfach bescheidgeben! :ziggi:

Code:
;-----------------------------------------------------------------------------
; File: extensions.conf
;
;             ---- Automatically generated, do not edit ----
;
; (c) IPTAM GmbH, Karsten Wemheuer, 2005 - 2008
;-----------------------------------------------------------------------------


[general]
static=yes
writeprotect=yes
priorityjumping=yes
clearglobalvars=yes

[globals]
HopCountMax = 7
DEF_MSN = 
USE_ORIGVM = 1
MonitorEnabled = 2
TrunkSelection = 0
SIPTrunkSelection = 0
OptionCD = 0
LAST_RESSORT = text,text,tone,tone
def_lang = de
TRUNKGRP = 1

#include "./inc/macros.inc"
#include "./inc/unlimited.inc"
#include "./inc/access.inc"
#include "./inc/services.inc"
#include "./inc/extensions.inc"
#include "./inc/incoming.inc"
#include "./inc/outgoing.inc"
#include "./inc/ntlines.inc"

[verkauf]
include => _clir
include => international        ; to permit this service
include => voting        ; to deny this service
include => buendel        ; to deny this service
include => emessage        ; to deny this service
include => premium        ; to deny this service
include => dialer        ; to deny this service
include => national        ; to permit this service
include => freecall        ; to permit this service
include => info        ; to deny this service
include => lokal        ; to permit this service
include => emergency        ; don't block emergency-calls
include => _invalid        ; catch not allowed numbers
include => extensions        ; to allow site-local calls
include => _iaxtrunk-out        ; connect to other IPTAM PBX
include => _services        ; to allow local services
include => _unknown        ; catch invalid local numbers
exten => i,1,Macro(dial-error,2)
exten => h,1,Noop
exten => T,1,hangup

[admin]
include => _clir
include => international        ; to permit this service
include => national        ; to permit this service
include => freecall        ; to permit this service
include => lokal        ; to permit this service
include => emergency        ; don't block emergency-calls
include => _invalid        ; catch not allowed numbers
include => extensions        ; to allow site-local calls
include => _iaxtrunk-out        ; connect to other IPTAM PBX
include => _services        ; to allow local services
include => _unknown        ; catch invalid local numbers
exten => i,1,Macro(dial-error,2)
exten => h,1,Noop
exten => T,1,hangup

[_iaxtrunk-out]

exten => h,1,Noop

[_iaxtrunk-in]
exten => _[0-9*].,1,Set(GROUP(SIPTRUNK)=SIPTRUNK)
exten => _[0-9*].,2,GotoIf($[${GROUP_COUNT(SIPTRUNK@SIPTRUNK)} > 4]?6)
exten => _[0-9*].,3,GotoIf($["${CALLERID(num)}" = "${EXTEN}"]?7)
exten => _[0-9*].,4,Set(CDR(userfield)=${CDR(userfield)}E:\;)
exten => _[0-9*].,5,Goto(_iaxtrunk-in2,${EXTEN},1)
exten => _[0-9*].,6,Congestion(2)
exten => _[0-9*].,7,NoCDR
exten => _[0-9*].,8,Set(CALLERID(name)="RR: ${CALLERID(name)})"
exten => _[0-9*].,9,Goto(_iaxtrunk-in2,${EXTEN},1)
exten => h,1,Noop

[_iaxtrunk-in2]
include => _iax_services
include => extensions
include => _unknown
Edit Guard-X: Code-Tags eingefügt!
 
Zuletzt bearbeitet:
Bitte nutze künftig Code-Tags, damit wird's übersichtlicher.

Die Nebenstellen scheinen in der inc/extensions.inc im Context [extensions] zu stecken. Poste die doch bitte auch noch, irgendwo werden wir schon was finden.
 
Das war wieder die extensions.conf, ich wollte eigentlich die inc/extensions.inc sehen.

Was anderes noch, was genau hast Du eigentlich vor? Die Konfiguration wurde von einem GUI oder was auch immer erzeugt. Kannst Du das, was Du ändern willst, nicht einfach dort ändern?
 
achja. :blonk:
Zunächst wollte ich wissen wo genau die Nachtschaltung hinterlegt ist.
Wenn ich das halbwegs verstanden hab, dann wollt ich das per Hand editieren!

Code:
;-----------------------------------------------------------------------------
; File: extensions.inc
;
;             ---- Automatically generated, do not edit ----
;
; (c) IPTAM GmbH, Karsten Wemheuer, 2005 - 2008
;-----------------------------------------------------------------------------


[extensions]
exten => XXX,1,Macro(dial-intern,XX)
exten => XX,1,Macro(dial-intern,XX)
exten => XX,hint,SIP/mh1
exten => zentrale,1,Macro(dial-intern,XX)
exten => XX,1,Macro(dial-intern,XX)
exten => XX,hint,SIP/zentrale
exten => XXX,1,Macro(dial-intern,XX)
exten => XX,1,Macro(dial-intern,XX)
exten => XX,hint,SIP/nt1
exten => XXX,1,Macro(dial-intern,XX)
exten => XX,1,Macro(dial-intern,XX)
exten => XX,hint,SIP/ph1
exten => XXX,1,Macro(dial-intern,XX)
exten => XX,1,Macro(dial-intern,XX)
exten => XX,hint,SIP/XXX
include => _faxextensions
include => _nt_lines

[_faxextensions]
exten => 59,1,Macro(fax,59)
exten => 32,1,Macro(fax,32)
exten => i,1,return
exten => h,1,Noop

[_local_lines]
include => extensions           ; to allow site-local calls
include => _iaxtrunk-out
include => _services            ; to allow local services
include => _unknown             ; catch invalid local numbers
exten => i,1,Macro(dial-error,2)
exten => h,1,Noop
exten => T,1,hangup

[_local_extens_no_sip]
include => _nt_lines
include => _faxextensions
include => _iaxtrunk-out
include => _services            ; to allow local services
include => _unknown             ; catch invalid local numbers
exten => i,1,Macro(dial-error,2)
exten => h,1,Noop
exten => T,1,hangup

[_local_iax_nt_lines]
include => _iaxtrunk-out
include => _nt_lines
exten => i,1,hangup
exten => h,1,Noop

[_nt_lines]
exten => 31,1,Macro(dial-ntline-mISDN,2,31)
exten => 31,1,Macro(dial-ntline-mISDN,9,31)
exten => i,1,return
exten => h,1,Noop

[_local_4originate]
exten => _X.,1,Set(CHANNEL(language)=${def_lang})
exten => _X.,n,Set(sip=${DB(SIPNAME/${EXTEN})})
exten => _X.,n,GotoIf($["${sip}foo" = "foo"]?nosip)
exten => _X.,n,Set(limit=${DB(LIMIT/${EXTEN})})
exten => _X.,n,GotoIf($[$["foo${limit}" != "foo"] & $["${limit}" != "1"]]?nolimit)
exten => _X.,n,GotoIf($[$["${DEVSTATE(${DIALEDACC})}" = "INUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGING"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGINUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "BUSY"]]?limit)
exten => _X.,n(nolimit),NoCDR
exten => _X.,n,Dial(SIP/${sip}||M(update_userfield^S:${EXTEN}\;D:${dialdest}))
exten => _X.,n(limit),hangup
exten => _X.,n(nosip),Set(DialDirect=1)
exten => _X.,n,Goto(_nt_lines,${EXTEN},1)
exten => _X,1,Set(CHANNEL(language)=${def_lang})
exten => _X,n,Set(sip=${DB(SIPNAME/${EXTEN})})
exten => _X,n,GotoIf($["${sip}foo" = "foo"]?nosip)
exten => _X,n,Set(limit=${DB(LIMIT/${EXTEN})})
exten => _X,n,GotoIf($[$["foo${limit}" != "foo"] & $["${limit}" != "1"]]?nolimit)
exten => _X,n,GotoIf($[$["${DEVSTATE(${DIALEDACC})}" = "INUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGING"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGINUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "BUSY"]]?limit)
exten => _X,n(nolimit),NoCDR
exten => _X,n,Dial(SIP/${sip}||M(update_userfield^S:${EXTEN}\;D:${dialdest}))
exten => _X,n(limit),hangup
exten => _X,n(nosip),Set(DialDirect=1)
exten => _X,n,Goto(_nt_lines,${EXTEN},1)

[_local_4callfiles]
exten => _X.,1,Set(CHANNEL(language)=${def_lang})
exten => _X.,n,Set(sip=${DB(SIPNAME/${EXTEN})})
exten => _X.,n,GotoIf($["${sip}foo" = "foo"]?nosip)
exten => _X.,n,Set(limit=${DB(LIMIT/${EXTEN})})
exten => _X.,n,GotoIf($[$["foo${limit}" != "foo"] & $["${limit}" != "1"]]?nolimit)
exten => _X.,n,GotoIf($[$["${DEVSTATE(${DIALEDACC})}" = "INUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGING"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGINUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "BUSY"]]?limit)
exten => _X.,n(nolimit),NoCDR
exten => _X.,n,Dial(SIP/${sip}||M(update_cid^${NewCallerId}^S:${EXTEN}\;D:${dialdest}))
exten => _X.,n(limit),hangup
exten => _X.,n(nosip),Set(DialDirect=1)
exten => _X.,n,Goto(_local_iax_nt_lines,${EXTEN},1)
exten => _X,1,Set(CHANNEL(language)=${def_lang})
exten => _X,n,Set(sip=${DB(SIPNAME/${EXTEN})})
exten => _X,n,GotoIf($["${sip}foo" = "foo"]?nosip)
exten => _X,n,Set(limit=${DB(LIMIT/${EXTEN})})
exten => _X,n,GotoIf($[$["foo${limit}" != "foo"] & $["${limit}" != "1"]]?nolimit)
exten => _X,n,GotoIf($[$["${DEVSTATE(${DIALEDACC})}" = "INUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGING"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGINUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "BUSY"]]?limit)
exten => _X,n(nolimit),NoCDR
exten => _X,n,Dial(SIP/${sip}||M(update_cid^${NewCallerId}^S:${EXTEN}\;D:${dialdest}))
exten => _X,n(limit),hangup
exten => _X,n(nosip),Set(DialDirect=1)
exten => _X,n,Goto(_local_iax_nt_lines,${EXTEN},1)

[_local_4iaxcallback]
exten => _X.,1,Set(CHANNEL(language)=${def_lang})
exten => _X.,n,Set(DialDirect=1)
exten => _X.,n,Goto(_local_iax_nt_lines,${EXTEN},1)

[macro-fax]
exten => s,1,GotoIf($["${CHANNEL(channeltype)}" != "mISDN"]?nomisdn)
exten => s,n,misdn_set_opt(!e)
exten => s,n(nomisdn),GotoIf($["${CHANNEL(channeltype)}" != "CAPI"]?nocapi)
exten => s,n,capicommand(echocancel|no)
exten => s,n(nocapi),Set(CDR(userfield)=f:${CALLERID(num)}-${ARG1})
exten => s,n,Dial(IAX2/iaxmodem00/${ARG1})
exten => s,n,Dial(IAX2/iaxmodem01/${ARG1})
exten => s,n,Dial(IAX2/iaxmodem02/${ARG1})
exten => s,n,Dial(IAX2/iaxmodem03/${ARG1})
exten => s,n,Hangup

[default]
include => extensions
 
... und weiter geht's, im [extensions] wird ein Macro aufgerufen, dass sich wahrscheinlich in inc/macros.inc verbirgt. Also die bitte auch noch. Eine Bitte, Du könntest zum zensieren bitte * verwenden statt einem X. Das X kann nämlich auch ein Pattern im Dialplan sein.
 
So das ist der Inhalt der macro.inc
aber ich sehe hier drin auch noch nix was nach nachtschaltung und uhrzeiten aussieht....
:confused:
Code:
;-----------------------------------------------------------------------------
; File: macros.inc
;
; (c) IPTAM GmbH, Karsten Wemheuer, 2004-2008
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
; This file is included into the dialplan "extensions.conf". It provides some 
; mandatory macros
;-----------------------------------------------------------------------------

;-----------------------------------------------------------------------------
; Macro: dial-intern
; Parameter: destination extension
;-----------------------------------------------------------------------------
[macro-dial-intern]
exten => s,1,Set(CDR(userfield)=${CDR(userfield)}D:${ARG1}\;)
exten => s,n,Set(CAUSE=)
exten => s,n(callagi),AGI,dial_local.agi

; Hier weiter, wenn eine Extension zu wählen ist (extern oder intern)
exten => s,n,Set(limit=${DB(LIMIT/${DIALEDEXT})})
exten => s,n,GotoIf($[$["foo${limit}" != "foo"] & $["${limit}" != "1"]]?nolimit)
exten => s,n,GotoIf($[$["${DEVSTATE(${DIALEDACC})}" = "INUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGING"] | $["${DEVSTATE(${DIALEDACC})}" = "RINGINUSE"] | $["${DEVSTATE(${DIALEDACC})}" = "BUSY"]]?busy)
exten => s,n(nolimit),UserEvent(CalledExt,Dst: ${DIALEDEXT})
exten => s,n,Set(_PICKUPMARK=${DIALEDEXT})
exten => s,n(dial),Dial(${DIAL_STRING})

; Hier weiter, um CFUN auszuwerten
exten => s,n,Set(CAUSE=Unavail)
exten => s,n,Goto(callagi)

; Hier weiter, wenn keine Umleitungen gefunden werden konnten.
; Die Prioritäten sind mit dem AGI-Skript abgestimmt!
exten => s,15,Busy

exten => s,16,Hangup

exten => s,20,Answer
exten => s,21,Wait(1)
exten => s,22,Playback(${LR_FILE})
exten => s,23,Wait(2)
exten => s,24,Goto(22)

exten => s,25,Answer
exten => s,26,Wait(1)
exten => s,27,Playback(vm-theperson)
exten => s,28,Saydigits(${ARG1})
exten => s,29,Playback(${LR_FILE})
exten => s,30,Wait(2)
exten => s,31,Goto(27)

exten => s,35,Goto(_cbonbusy1,s,1)

; Voicemail, VM_BOX enthält die Box-Nummer
exten => s,50,GotoIf($["${CBOnBusy}foo" = "foo"]?51:55)
exten => s,51,Answer
exten => s,52,Wait(1)
exten => s,53,Voicemail(${VM_BOX})
exten => s,54,hangup
exten => s,55,Goto(_cbonbusy2,s,1)

; Hier weiter, wenn Rufziel "Besetzt" war (Dial)
exten => s,dial+101(busy),Set(CAUSE=Busy)
exten => s,n,GotoIf($[${SIPPEER(${DIALEDACC:4}:curcalls)} = 0]?callagi)
exten => s,n,GotoIf($["${SourceIsExt}" = "1"]?callagi)
exten => s,n,Set(CBOnBusy=${DIALEDEXT})
exten => s,n,Goto(callagi)


;-----------------------------------------------------------------------------
; Macro: update_cid
; Parameter: Neue CallerID
;-----------------------------------------------------------------------------
[macro-update_cid]
exten => s,1,ForkCDR
exten => s,n,Set(CALLERID(all)=${ARG1})
exten => s,n,Set(CDR(userfield)=${ARG2})

;-----------------------------------------------------------------------------
; Macro: update_userfield
; Parameter: Daten fuer Userfield des CDR
;-----------------------------------------------------------------------------
[macro-update_userfield]
exten => s,1,ForkCDR
exten => s,n,Set(CDR(userfield)=${ARG1})

;-----------------------------------------------------------------------------
; Macro: dial-result
; Parameter: 
;-----------------------------------------------------------------------------
[macro-dial-result]
exten => s,1,NoOp(HANGUPCAUSE is ${HANGUPCAUSE} and DIALSTATUS is ${DIALSTATUS})
exten => s,2,Goto(s-${DIALSTATUS},1)

exten => s-NOANSWER,1,hangup

exten => s-BUSY,1,Busy

exten => s-CHANUNAVAIL,1,Goto(s-NOANSWER,1)

exten => s-ANSWERED,1,Hangup

exten => s-CONGESTION,1,Congestion

;-----------------------------------------------------------------------------
; Macro: dial-error
; Parameter: Errorcode, supported values:
;	1 Extension (lokal) nicht vergeben
;	2 Rufnummer nicht erlaubt
;	3 Kein Service, Rufnummern nicht vergeben
;-----------------------------------------------------------------------------
[macro-dial-error]
exten => s,1,Set(TIMEOUT(absolute)=35)
exten => s,2,Goto(cause_${ARG1},1)

exten => cause_1,1,Answer
exten => cause_1,2,Wait(1)
exten => cause_1,3,Playback(invalid,skip)
exten => cause_1,4,Wait(3)
exten => cause_1,5,Goto(3)

exten => cause_2,1,Answer
exten => cause_2,2,Wait(1)
exten => cause_2,3,Playback(call-forbidden,skip)
exten => cause_2,4,Wait(2)
exten => cause_2,5,Goto(3)

exten => cause_3,1,Answer
exten => cause_3,2,Wait(1)
exten => cause_3,3,PlayTones(info)
exten => cause_3,4,Wait(5)
exten => cause_3,5,Playback(ss-noservice,skip)
exten => cause_3,6,Wait(2)
exten => cause_3,7,Goto(3)
 
Code:
exten => s,n(callagi),AGI,dial_local.agi

Wahrscheinlich passiert das meiste in diesem AGI.
 
hier ist die agi datei.... aber auch hier keine spur von uhrzeiten...
wo könnte ich weiter suchen?

Code:
#!/usr/bin/perl -w
# Skript for calling local extensions. Checks call forwarding and do not
# disturb.
# Returns -1, if this script hangs up or directs to voicemail.
# Returns 0, if dialplan should dial any channel. The string to dial is placed
# in the channel variable "DIAL_STRING'. For further checking the resulting
# hop count is stored in 'HOPCOUNT'.
#
# History
# 2004-02-01  initial version
# 2004-02-07  using external dialcommand (in the dialplan)
# 2004-10-08  integrated into pbxconfig-package
# 2004-10-18  No CAPI-Calls, set context and extension instead. 
#             Don't call VM-Application directly, use dialplan
# 2004-11-09  Set User-Language, if possible
# 2004-11-14  Set Timeout-Value from database, every user gets his own value
# 2005-03-25  Use Call Deflection if CAPI-CAPI-Call
# 2005-03-30  Limit Call to sip phones (aka Zweitanruf)
# 2005-03-31  Callback on busy implemented
# 2005-05-05  Mehrfache Registrierung
# 2005-09-09  Anruferlisten (CDRUserField wird verwendet)
# 2005-11-20  Timeout auf 3 Minuten, wenn keine Weiterleitung bei 
#             Nichterreichbarkeit existiert
# 2005-12-28  Anpassungen an Asterisk 1.2
# 2007-01-02  Call-Pickup, geaenderte Kom.-Beziehung zum SER
# 2008-04-26  Zweitanruf jetzt mittels devstate realisiert
#
# Licence:
#
# Copyright (C) 2004-2008 Karsten Wemheuer <[email protected]>
#

use Asterisk::AGI;
use POSIX qw(mkfifo);
use strict;

################################################################################
# Functions
################################################################################
sub set_language($);
sub busy_unavail($);
sub forward ($ $);
sub call ($ $);
sub dial ($ $);
sub check_availability($);

################################################################################
# Globals
################################################################################
my $debug = 3;
my $EXIT_HANGUP = -1;       # Signal to dialplan: Hangup
my $EXIT_DIAL = 0;          # Signal to dialplan: dial
my $fifo = "/tmp/ser_fifo";
my $reply = "ser2agi-reply$$";
my $reply_path = "/tmp/".$reply;
my $CONTEXT_UNLIMITED = '_unlimited';
my $CONTEXT_NOSIP = '_local_extens_no_sip';
my $LANG = 'LANGUAGE';
my $PRIO_VM = 50;           # Priority for accessing mailbox
my $PRIO_LR_BUSY = 15;
my $PRIO_LR_UNAVAIL = 16;
my $PRIO_LR_FILE = 20;
my $PRIO_LR_TEXT = 25;
my $PRIO_LR_CB = 35;
my $LR_TONE = 'tone';
my $LR_TEXT = 'text';
my $cf_scheduler = "/var/lib/pbxmanager/agi-bin/cf-scheduler";
my $cidnum;

################################################################################
# Main program
################################################################################
my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();

if ($debug >= 2)
{
  foreach my $key (keys %input)
  {
    debug("$key = " . $input{$key},3);
  }
}
my $priority = $input{'priority'} + 1;

if ($input{'callerid'} =~  /^\"(.*)\"\s+\<(\d+)\>\s*$/)
{
  $cidnum  = $2;
  debug("Caller ID number is '$cidnum'", 1);
}
elsif ( $input{'callerid'} =~  /^(.*)\s+\<(\d+)\>\s*$/)
{
  $cidnum  = $2;
  debug("Caller ID number is '$cidnum'", 1);
}
elsif ( $input{'callerid'} =~  /^(\d+)$/ )
{
  $cidnum  = $1;
}
else
{
  $cidnum  = undef;
  debug("Caller ID is not set", 1);
}

my $type = $input{'type'};
my $orig_ext = $AGI->get_variable('ARG1') || '';
my $opt_cd = $AGI->get_variable('OptionCD') || 0;
my $trunk_sel = $AGI->get_variable('TrunkSelection') || 0;
my $siptrunk = $AGI->get_variable('SIPTrunkSelection');
my $hopcountMax = $AGI->get_variable('HopCountMax') || 1;
my $cause = $AGI->get_variable('CAUSE') || '';
debug ("Vars: cause: $cause, opt_cd $opt_cd, type $type, trunk_sel $trunk_sel, hopcountMax $hopcountMax", 1);

if ( $orig_ext eq '' )
{
  debug ("No extension given", 1);
  exit $EXIT_HANGUP;
}

if ( $cause ne '' )
{
  return busy_unavail($cause);
}

my $retval = forward($orig_ext, 0);    # Check forwarding and execute if possible
exit $retval;

################################################################################
# Functions
################################################################################

################################################################################
# Function: set_language
# Check, if called extension has any preference
# Could be extended to detect language of caller
################################################################################
sub set_language($)
{
  my $ext = shift;
  my $lang = $AGI->database_get($LANG, $ext);
  $AGI->exec('SetLanguage', $lang) if ($lang);
}

################################################################################
# Function: busy_unavail
# Check, wether there is a forwarding entry for the givven cause
################################################################################
sub busy_unavail($)
{
  my $cause = shift;
  my $hopcount = $AGI->get_variable('HOPCOUNT');
  
  debug ("DIALEDEXT ".($AGI->get_variable('DIALEDEXT') || ''), 1); 
  if ( $hopcount > $hopcountMax ) {
    # Exceeding hopcount limit. Forwarding to vm of orginal destination
    debug ("Hocount limit exceeded. Taking vm of original destination",1);
    my $box = $orig_ext.'|su';
    debug ("About to execute Voicemail($box)", 1);
    $AGI->set_variable('VM_BOX', $box);
    $AGI->set_priority($PRIO_VM);
    $AGI->exec('AppendCDRUserField', "C:VM\;");
    return $EXIT_DIAL;
  }
  my $called_ext = $AGI->get_variable('DIALEDEXT') || '';
  debug ("called_ext: $called_ext",1 );
  set_language($called_ext);
  my $key = ($cause eq "Busy") ? "CFBS" : "CFUN";
  my $cfsetting = $AGI->database_get($key, $called_ext);
  if ( $cfsetting )
  {
    # There is a forwarding entry in the database
		my ($cf, $to) = split /;/, $cfsetting;
    if ( $cf =~ /voicebox=/ )
    {
      # The forwarding directs to a voicebox. Check, if we are already forwarded...
      my $box;
      if ( $hopcount == 0 )
      {
        ($box) = (split /=/,$cf)[1];
				if ( $box =~ s/^([ub])([0-9]*)/$2/ ) {
					$box .= '|s'.$1;
				}
      }
      else
      {
        # Call forwarding to an extension which directs to vm. So we take
        # the unavailability-vm of the original destination
				my $use_origvm = $AGI->get_variable('USE_ORIGVM') || 0;
        $box = ($use_origvm ? $orig_ext : $called_ext).'|'.($cause eq "Busy" ? "sb" : "su");
      }
      debug ("About to execute Voicemail($box)", 1);
      $AGI->set_variable('VM_BOX', $box);
      $AGI->set_priority($PRIO_VM);
      $AGI->exec('AppendCDRUserField', "C:VM\;");
      return $EXIT_DIAL;
    }
    return forward ($cf, $hopcount+1);
  }
  
  # We finaly didn't find any forward entry
  # Auswerten globale Variable: LAST_RESSORT. Anschlie�end check, ob 
  # Anwender eine individuelle Einstellung vorgenommen hat. Ergebnis 
  # lastressort enth�lt eine Kommaseparierte Liste mit vier Eintragen:
  # Lokaler Anrufer-busy, Lokaler Anrufer-unavailable, Entfernter Anrufer...
  # Wert ist entweder ein Dateiname (Soundfile) oder der Wert
  # $LR_TONE:  Besetzt/Congestion-T�ne
  # $LR_TEXT:  Ansagen f�r diese F�lle
  my $lastressort = $AGI->get_variable('LAST_RESSORT') || "$LR_TONE,$LR_TONE,$LR_TONE,$LR_TONE";
  debug ("lastressort=$lastressort", 1);
  #  my $lr_indiv = $AGI->database_get('CFLR', $orig_ext);
  #  $lastressort = $lr_indiv if ( $lr_indiv );
  #  debug ("lastressort=$lastressort", 1);
  my @files = split( /,/, $lastressort);
  my $index;
  my $source_is_ext = $AGI->get_variable('SourceIsExt');
  $source_is_ext |= "";
  if ( !$source_is_ext )
  {
    # interner Anrufer
    $index = ($cause eq "Busy") ? 0 : 1;
  }
  else
  {
    $index = ($cause eq "Busy") ? 2 : 3;
  }
  my $file = $files[$index];
  debug ("file=$file", 1);
  if ( $file eq $LR_TONE )
  {
    if ( $cause eq "Busy" )
    {
      $AGI->set_priority($PRIO_LR_BUSY);
      $AGI->exec('AppendCDRUserField', "C:BUSY\;");
    }
    else
    {
      $AGI->set_priority($PRIO_LR_UNAVAIL);
      $AGI->exec('AppendCDRUserField', "C:UNAV\;");
    }
    return $EXIT_DIAL;
  }
  elsif ( $file eq $LR_TEXT )
  {
    if ( $cause eq "Busy" )
    {
      $AGI->set_variable('LR_FILE', "vm-isonphone");
      $AGI->exec('AppendCDRUserField', "C:BUSY\;");
    }
    else
    {
      $AGI->set_variable('LR_FILE',"vm-isunavail");
      $AGI->exec('AppendCDRUserField', "C:UNAV\;");
    }
    if ( $AGI->get_variable('CBOnBusy') )
    {
      $AGI->set_priority($PRIO_LR_CB);
    }
    else
    {
      $AGI->set_priority($PRIO_LR_TEXT);
    }
    return $EXIT_DIAL;
  }
  $AGI->set_variable('LR_FILE', $lastressort);
  $AGI->set_priority($PRIO_LR_FILE);
  return $EXIT_DIAL;
}


################################################################################
# Function: forward
# Check "CFIM" (call forward immediate)
# If CFIM call recursive, otherwise dial extension and check result for CFUN,
# CFBS
################################################################################
sub forward ($ $)
{
  my $ext = shift;
  my $hopcount = shift;

  debug ("Entering forward(): ext $ext, hopcount $hopcount", 3);

  set_language($ext);
  if ( $hopcount > $hopcountMax ) {
    # Exceeding hopcount limit. Forwarding to vm of orginal destination
    debug ("Hocount limit exceeded. Taking vm of original destination",1);
    my $box = $orig_ext.'|su';
    debug ("About to execute Voicemail($box)", 1);
    $AGI->set_variable('VM_BOX', $box);
    $AGI->set_priority($PRIO_VM);
    $AGI->exec('AppendCDRUserField', "C:VM\;");
    return $EXIT_DIAL;
  }
  
  # If not called the first time, check for external target
  if ( $hopcount != 0 )
  {
    # Check, if destination is outside
    if ( $ext =~ /^$trunk_sel[0-9]{3,}/ )
    {
      # Destination is external. Check if source is internal
      my $source_is_ext = $AGI->get_variable('SourceIsExt');
      $source_is_ext |= "";
      if ( !$source_is_ext )
      {
        $AGI->exec('AppendCDRUserField', "F:$ext\;");
				$AGI->set_context($CONTEXT_UNLIMITED);
	$AGI->set_extension($ext);
	$AGI->set_priority(1);
        return $EXIT_DIAL;
      }
			debug("siptrunk is set to $siptrunk", 1);
			if ( length($siptrunk) > 0 ) {
				if ( $opt_cd == 1 ) {
      		$opt_cd = 0 if (  $ext =~ /^$siptrunk[0-9]{3,}/ );
				}
			}
			debug("opt_cd is set to $opt_cd", 1);
      if ( $opt_cd )
      {
        $AGI->exec('AppendCDRUserField', "F:$ext\;");
				if ( $type =~ /mISDN/ )
				{
					$AGI->exec('Wait', 1);
					$AGI->exec('misdn_facility', 'calldeflect|'.substr($ext,1));
				}
				if ( $type =~ /CAPI/ )
        {
          # Redirect to an external destination. Source is external
          # CAPI Available => Use Call Deflection
          $AGI->exec('Wait', 1);
          $AGI->exec('capicommand', 'deflect|'.substr($ext,1));
          $AGI->hangup;
	  return $EXIT_HANGUP;
        }
        if ( $type =~ /Zap/ )
        {
          $AGI->exec('Wait', 1);
          $AGI->exec('zapCD', substr($ext,1));
          $AGI->hangup;
	  return $EXIT_HANGUP;
        }
      }

      # External->External, CD not possible
			$AGI->exec('AppendCDRUserField', "F:$ext\;");
      $AGI->set_context($CONTEXT_UNLIMITED);
      $AGI->set_extension($ext);
      $AGI->set_priority(1);
      if ( $orig_ext =~ /^$trunk_sel[0-9]{3,}/ ) {
        # Sicherheit: Kann eigentlich nicht passieren
        $AGI->exec('Set', "CALLERID(all)=0");
      } else {
        $AGI->exec('Set', "CALLERID(all)=$orig_ext");
      }
      return $EXIT_DIAL;
    }
  }

  # Hopcount is 0 or destination is inside
  # Check for immediate forwarding (CFIM)
  my $cfsetting = $AGI->database_get('CFIM', $ext);
  if ( $cfsetting && $cfsetting !~ /^;pos-/ )
  {
    debug("Extension $ext has CFIM set to $cfsetting", 1);
		my ($cf, $to) = split /;/, $cfsetting;
		if ( $to ) {
			if ( !timedependendcf($to) ) {
				debug("Timecheck negative, no forwarding", 1);
				return call($ext,$hopcount);
			}
		}

    if ( $cf =~ /voicebox=/ )
    {
      my $box;
      if ( $hopcount == 0 )
      {
        ($box) = (split /=/,$cf)[1];
				if ( $box =~ s/^([ub])([0-9]*)/$2/ ) {
					$box .= '|s'.$1;
				}
      }
      else
      {
        # Call forwarding to an extension which directs to vm. So we take
        # the unavailability-vm of the original destination
				my $use_origvm = $AGI->get_variable('USE_ORIGVM') || 0;
        $box = ($use_origvm ? $orig_ext : $ext).'|su';
      }
      debug ("About to execute Voicemail($box)", 1);
      $AGI->set_variable('VM_BOX', $box);
      $AGI->set_priority($PRIO_VM);
      $AGI->exec('AppendCDRUserField', "C:VM\;");
      return $EXIT_DIAL;
    }

    # Hier weiter: Loop-Detection? Eigentlich m�sste der Hopcount reichen
    return forward($cf, $hopcount+1);
  }
  else
  {
    debug("Extension $ext has CFIM disabled", 1);
    return call($ext,$hopcount);
  }
}

################################################################################
# Function: call
# Check if extension to ring has "Do Not Disturb" active. In this case check,
# if caller is allowed to disturb. Dials the extension or forwards to the
# do not disturb forwarding
################################################################################
sub call ($ $)
{
  my $ext = shift;
  my $hopcount = shift;

  debug ("Entering call(): ext $ext, hopcount $hopcount", 3);

  my $dnd = $AGI->database_get('DND', $ext);
  if ( $dnd )
  {
    # DND for the selected extension is active. Check if caller is on the
    # whitelist to disturb anyway
    debug("Extension $ext has DND set to $dnd", 1);
    my $allowed_list = $AGI->database_get('DND_ALLOW', $ext);
    my @allowed = split /,/, $allowed_list;
    foreach my $elem(@allowed)
    {
      debug ("Checking allowed disturbers: $elem",3);
      return (dial ($ext, $hopcount)) if ( $elem == $cidnum );
    }
    # caller is not on the whitelist. Forward to dnd-destination
    debug ("DND active and caller not allowed to disturb",3);
    return forward ($dnd, $hopcount+1);
  }
	
	if (!$cidnum) {
		debug ("Unknown caller, checking CFNOCID", 1);
		my $cfsetting = $AGI->database_get('CFNOCID', $ext);
		if ( $cfsetting )
		{
			my ($cf, $to) = split /;/, $cfsetting;
			if ( $cf =~ /voicebox=/ ) {
				# The forwarding directs to a voicebox. Check, if we are already forwarded...
				my $box;
				if ( $hopcount == 0) {
					($box) = (split /=/,$cf)[1];
					if ( $box =~ s/^([ub])([0-9]*)/$2/ ) {
						$box .= '|s'.$1;
					}
				} else {
					# Call forwarding to an extension which directs to vm. So we take
					# the unavailability-vm of the original destination
					my $use_origvm = $AGI->get_variable('USE_ORIGVM') || 0;
					$box = ($use_origvm ? $orig_ext : $ext).'|su';
				}
				debug ("About to execute Voicemail($box)", 1);
				$AGI->set_variable('VM_BOX', $box);
				$AGI->set_priority($PRIO_VM);
				$AGI->exec('AppendCDRUserField', "C:VM\;");
				return $EXIT_DIAL;
			}

			debug ("CFNOCID set to $cf",3);
			return forward($cf, $hopcount+1);
		}
	}
	debug("extension $ext has dnd disabled", 1);
	return (dial ($ext, $hopcount));
}

################################################################################
# Function: dial
# Checks if a valid SIP-Account for the destination exists. In this case
# setup dial-string in variable 'DIAL_STRING' and return. Dialing is done
# from within the dialplan to handle the various results correctly
################################################################################
sub dial ($ $)
{
  my $ext = shift;
  my $hopcount = shift;

  my $sip = $AGI->database_get('SIPNAME', $ext) || '';
  unless ($sip)
  {
    # No SIP extension: Forwarding SIP Dest. to exten on legacy-PBX
		$AGI->exec('AppendCDRUserField', "F:$ext\;") if ( $ext!=$orig_ext);
    $AGI->set_context($CONTEXT_NOSIP);
    $AGI->set_extension($ext);
    $AGI->set_priority(1);
    return $EXIT_DIAL;
  }
	if ( !check_availability($sip) )
	{
		debug ("Channel SIP/$sip not available", 1);
		$AGI->set_variable('HOPCOUNT', $hopcount);
		$AGI->set_variable('DIALEDEXT', $ext);	# 30.03.2005
		$AGI->exec('AppendCDRUserField', "F:$ext\;") if ( $ext!=$orig_ext);
		return busy_unavail('Unavail');
	}
	
  my $ds = "SIP/" . $sip . "|";
  my $priv_timeout = $AGI->database_get('TIMEOUT', $ext);
  my $timer = $priv_timeout if ($priv_timeout ne '' );
	if ($timer) {
		$ds .= $timer if ( $AGI->database_get('CFUN', $ext) );
	}
	if ( $AGI->get_variable('SourceIsExt') ) {
		my $moni = $AGI->get_variable('MonitorEnabled');
		if ( $moni == 2 ) {
			$AGI->exec('Monitor', "|auto-".time."-".$ext."-".$cidnum."|mb");
		} elsif ( $moni == 1) {
			$ds .= "|w";
		}
	}
  debug ("About to execute Dial($ds)", 1);
  $AGI->set_variable('HOPCOUNT', $hopcount);
  $AGI->set_variable('DIAL_STRING', $ds);
  $AGI->set_variable('DIALEDEXT', $ext);          # 30.03.2005
  $AGI->set_variable('DIALEDACC', "SIP/" . $sip); # 26.04.2008
  $AGI->exec('AppendCDRUserField', "F:$ext\;") if ( $ext!=$orig_ext);
  return $EXIT_DIAL;
}

################################################################################
# Function: check_availability
# Check, if SIP-Destination is registered at SER
################################################################################
sub check_availability($)
{
	my $sip = shift;
	
	unless (open FIFO, ">$fifo")
	{
		debug("Error open fifo", 0);
		return 1;
	}
	unless (POSIX::mkfifo($reply_path, 0666))
	{
		debug("Error calling mkfifo", 0);
		close(FIFO);
		return 1;
	}
	chmod 0666, $reply_path;
	my $fifo_cmd=":ul_show_contact:".$reply."\nlocation\n$sip\n\n";
	print FIFO $fifo_cmd;
	close(FIFO);
	unless ( open REPLY, "<$reply_path" )
	{
		unlink($reply_path);
		debug("Unable to open Reply", 0);
		return 1;
	}
	
	if ( <REPLY> =~ /^200/ )
	{
		close(REPLY);
		unlink($reply_path);
		debug("Found SIP/$sip in registry");
		return 1;
	}
	close(REPLY);
	unlink($reply_path);
	debug("SIP/$sip not found in registry");
	return 0;
}

################################################################################
# Function: timedependendcf
# Call forwarding during special periods of time only
# Returns 0 for no forwarding and 1 to follow the forwarding
################################################################################
sub timedependendcf
{
	my $options = shift;

	my ($opt, $index) = split /-/, $options;
	my $retval = 0xffff & system("$cf_scheduler $index");
	if ( $retval != 0 ) {
		if ($retval == 0xff00) {
			debug ("Error executing cf-scheduler", 1);
			return 0;   # No forwarding
		} elsif (($retval & 0xff) == 0) {
			$retval >>= 8;
			debug ("cf-scheduler terminates with $retval", 1);
			return $retval;
		}
	}
	return 0;
}

################################################################################
# Function: debug
# Sends Message at a given verbosity level to asterisk.
################################################################################
sub debug
{
  my $string = shift;
  my $level = shift || 3;

  if ($debug)
  {
    $AGI->verbose($string, $level);
  }
  return(0);
}
 
Das liest sich schon so, als ob das was damit zu tun hätte.

Code:
# Function: timedependendcf
# Call forwarding during special periods of time only
# Returns 0 for no forwarding and 1 to follow the forwarding

Darin wird auf
Code:
my $cf_scheduler = "/var/lib/pbxmanager/agi-bin/cf-scheduler";
verwiesen.

Die restlichen Rufumleitungen scheinen in der AstDB abgelegt zu werden. Zumindest verstehe ich die Abfragen so.
Code:
my $cfsetting = $AGI->database_get('CFIM', $ext);

Das AGI ist Perl, und ich bin zugegeben alles andere als eine Perl-Expertin.
 
Sehr interessant,
das ist eine Binärdatei. Also da liegt nix drin.
In der Astdb finde ich nichts, was auf Uhrzeiten hinweisst, nur die Telefonnummern und wo die Umleitung hingeht.
Weisst du, wie ich alle Infos aus der Datenbank herausbekomme???:rolleyes:
 
Das wundert mich nicht, dass da nichts direkt drin steht. Wahrscheinlich greift das Tool selber auch noch einmal auf eine externe Datenbank zu, sonst könntest Du die Nachtschaltungen nicht über das GUI einstellen.

AstDB anzeigen geht glaube ich mit database show auf der CLI.
 
Hallo,
ich hab einen Blick reingeworfen mit database show,
aber... nichts gefunden was mir weiterhilft.
Nur die Sip Nummern und anscheinend Sekunden bis zur Umschaltung bei Nichterreichbarkeit. Alle Geräte schalten bei uns bei nichterreichbarkeit auf die Zentrale. Dort liegt dann so eine Nachtschaltung, die für jeden Wochentag und Uhrzeit in dem Webfrontend eingegeben wurde.
Aber diese Daten Wochentage und Uhrzeiten find ich nirgends hinterlegt.
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,300
Beiträge
2,249,714
Mitglieder
373,904
Neuestes Mitglied
Elemir
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.