Проблема в следующем... есть 2801 с AdvIPserv, в которую через FXO приходят аналоговые линии. Так вот не могу понять по какой причине не получается переключить пришедший звонок на другой внутренний номер (говорит unable to transfer). звонки между внутренними абонентами переключаются нормально. ХЕЛП!
moscow#sh telephony-service
CONFIG (Version=4.0(2))
=====================
Version 4.0(2)
Cisco Unified CallManager Express
For on-line documentation please see:
www.cisco.com/univercd/cc/td/doc/product/access/ip_ph/ip_ks/index.htmip source-address 10.126.1.254 port 2000
load ata ata18x-v2-16-ms-030327b
load 7905 CP7905060101SCCP050429A
load 7912 CP7912060101SCCP050429B
max-ephones 26
max-dn 150
max-conferences 6 gain -6
dspfarm units 0
dspfarm transcode sessions 0
hunt-group report delay 1 hours
hunt-group logout DND
max-redirect 20
cnf-file location: system:
cnf-file option: PER-PHONE-TYPE
network-locale[0] RU (This is the default network locale for this box)
network-locale[1] US
network-locale[2] US
network-locale[3] US
network-locale[4] US
user-locale[0] US (This is the default user locale for this box)
user-locale[1] US
user-locale[2] US
user-locale[3] US
user-locale[4] US
srst mode auto-provision is OFF
srst ephone template is 0
srst dn template is 0
srst dn line mode is single
moh flash:c0108_3.au
time-format 24
date-format dd-mm-yy
timezone 32 Russian Standard/Daylight Time
call-forward pattern .T
transfer-pattern .T
night-service day Sun 19:00 10:00
night-service day Mon 19:00 10:00
night-service day Tue 19:00 10:00
night-service day Wed 19:00 10:00
night-service day Thu 19:00 10:00
night-service day Fri 19:00 10:00
night-service day Sat 19:00 18:59
keepalive 30
timeout interdigit 5
timeout busy 10
timeout ringing 180
caller-id name-only: enable
web admin system name Admin
web admin customer name Customer
edit DN through Web: enabled.
edit TIME through web: disabled.
Log (table parameters):
max-size: 150
retain-timer: 15
create cnf-files version-stamp 7960 Aug 13 2007 13:13:44
transfer-system full-consult
local directory service: enabled.
выясняется, что проблема в tcl-скрипте, который роутит эти звонки - без него все ок! но tcl я не знаю, и разобраться в этом скрипте крайне сложно для меня... вот он.
proc init { } {
global isDebug
global param1
global callInfo
global legConnectedset param1(interruptPrompt) true
set param1(abortKey) *
set param1(terminationKey) #
set legConnected false
set isDebug false
}proc init_ConfigVars { } {
global isDebug
global aaParamsif [infotag get cfg_avpair_exists aa-pilot] {
set aaParams(aaPilot) [string trim [infotag get cfg_avpair aa-pilot]]
} else {
set aaParams(aaPilot) "NONE"
}
if [infotag get cfg_avpair_exists operator] {
set aaParams(oprtr) [string trim [infotag get cfg_avpair operator]]
} else {
set aaParams(oprtr) "NONE"
}
if [infotag get cfg_avpair_exists aa-fax] {
set aaParams(opfax) [string trim [infotag get cfg_avpair aa-fax]]
} else {
set aaParams(opfax) "NONE"
}
if [infotag get cfg_avpair_exists aa-allowdest] {
set aaParams(opallowed) [string trim [infotag get cfg_avpair aa-allowdest]]
} else {
set aaParams(opallowed) "NONE"
}
if [infotag get cfg_avpair_exists aa-hunt] {
set aaParams(list) [split [string trim [infotag get cfg_avpair aa-hunt]] ","]
} else {
set aaParams(list) $aaParams(oprtr)
}if { $isDebug == "true" } {
puts "\naa-hunt: $aaParams(list)"
}if [infotag get cfg_avpair_exists aa-moh] {
set aaParams(moh) [split [string trim [infotag get cfg_avpair aa-moh]] ","]
} else {
set aaParams(moh) "NONE"
}if [infotag get cfg_avpair_exists aa-htimeout] {
set aaParams(aa-htimeout) [split [string trim [infotag get cfg_avpair aa-htimeout]] ","]
} else {
set aaParams(aa-htimeout) 10
}if [infotag get cfg_avpair_exists aa-pass] {
set aaParams(aa-pass) [string trim [infotag get cfg_avpair aa-pass]]
} else {
set aaParams(aa-pass) 96661313
}
}proc init_perCallVars { } {
global isDebug
global fcnt
global retrycnt
global dnis
global aaParamsif { $isDebug == "true" } {
puts "\nproc init_perCallvars"
}set fcnt 0
set retrycnt 6
set dnis ""set dnis [infotag get leg_dnis]
if { $isDebug == "true" } {
puts "\nDNIS $dnis"
}set aaParams(admin) "NO"
}proc act_Setup { } {
global isDebug
global param1
global dest
global beep
global callInfo
global dnis
global fcnt
global busyPrompt
global legConnected
global aaParamsputs "Incoming call to: $aaParams(aaPilot)"
if { $isDebug == "true" } {
set leg_isdid [infotag get leg_isdid]
puts "proc act_Setup: $leg_isdid"
}set busyPrompt _dest_unreachable.au
set beep 0
init_perCallVars
infotag set med_language 1if { ($dnis == "") || ($dnis == $aaParams(aaPilot)) } {
leg setupack leg_incoming
leg proceeding leg_incoming
leg connect leg_incoming
set legConnected trueif { $isDebug == "true" } {
puts "\nNo DNIS\n"
}set param1(dialPlan) true
leg collectdigits leg_incoming param1set cweekday [clock format [clock seconds] -format "%a"]
set chour [clock format [clock seconds] -format "%H"]
if {
(
($cweekday == "Mon" ||
$cweekday == "Tue" ||
$cweekday == "Wen" ||
$cweekday == "Thu" ||
$cweekday == "Fri" ) &&
($chour < 10 || $chour > 19)
) ||
($cweekday == "Sat" && ($chour < 10 || $chour > 14)) ||
($cweekday == "Sun")
} {
media play leg_incoming %s1000 _welcome.au %s500 _working_hours.au %s500 _enter_dest_$aaParams(aaPilot).au
} else {
media play leg_incoming %s1000 _welcome.au %s500 _enter_dest_$aaParams(aaPilot).au
}
} else {
set fcnt 6
leg setupack leg_incoming
handoff callappl leg_incoming default "DESTINATION=$dnis"
fsm setstate HANDOFF
}
}proc act_GotDest { } {
global isDebug
global dest
global callInfo
global busyPrompt
global aaParams
global param1set status [infotag get evt_status]
set dest [infotag get evt_dcdigits]
set callInfo(alertTime) $aaParams(aa-htimeout)if { $isDebug == "true" } {
puts "\n proc act_GotDest: {$dest}"
}if { $dest != "" } {
if { $aaParams(admin) == "NO" } {
if { $dest == $aaParams(aa-pass) } {
puts "ADMIN mode turned on for caller."set aaParams(admin) "YES"
set param1(dialPlan) true
leg collectdigits leg_incoming param1media play leg_incoming %s1000 _welcome.au
fsm setstate GETDEST
return
}
set res ""
regexp $aaParams(opallowed) $dest res
if { $res == "" } {
set status "cd_006"
}
}
} else {
set dest 0
}if { ($status == "cd_004") } {
puts "Switching to $dest"
set callInfo(alertTime) 60
leg setup $dest callInfo leg_incoming
fsm setstate RINGING
# handoff callappl leg_incoming default "DESTINATION=$dest"
} else {
if { $status == "cd_006" } { set busyPrompt _dest_unreachable.au }
if { $isDebug == "true" } {
puts "\nCall [infotag get con_all] got event $status collecting destination"
}if { [string length $dest] == 1 } {
if { $aaParams(list) != "NONE" } {
puts "Switching to aa-hunt"
set aaParams(v_delay) 1
set aaParams(v_huntpos) 1
set aaParams(v_media_playing) 0
act_HuntAgain
} else {
set dest $aaParams(oprtr)
leg setup $aaParams(opfax) callInfo leg_incoming
fsm setstate RINGING
# handoff callappl leg_incoming default "DESTINATION=$dest"
}
} elseif { $dest == "401" } {
puts "Switching to fax"
set callInfo(alertTime) 60
set dest $aaParams(opfax)
leg setup $aaParams(opfax) callInfo leg_incoming
fsm setstate RINGING
# handoff callappl leg_incoming default "DESTINATION=$dest"
} elseif { $dest == "402" } {
act_JustMusic
} else {
act_Select
}
}
}proc act_JustMusic { } {
global isDebug
global aaParamsif { $isDebug == "true" } {
puts "\n proc act_JustMusic"
}media play leg_incoming %s1000 $aaParams(moh)
fsm setstate JUSTMUSIC
}proc act_MediaHunt { } {
global isDebugif { $isDebug == "true" } {
puts "\n proc act_MediaHunt"
}if { [infotag get evt_timer_name] == "waitwaitwait" } {
act_HuntAgain
}
}proc act_NoMediaHunt { } {
global isDebug
global aaParamsif { $isDebug == "true" } {
puts "\n proc act_NoMediaHunt"
}set aaParams(v_media_playing) 0
act_HuntAgain
}proc act_HuntAgain { } {
global isDebug
global aaParamsif { $isDebug == "true" } {
puts "\n proc act_HuntAgain"
}set current_ext [lindex $aaParams(list) [expr $aaParams(v_huntpos) - 1]]
set callInfo(alertTime) [expr $aaParams(v_delay) * $aaParams(aa-htimeout)]
leg setup $current_ext callInfo leg_incoming
fsm setstate CONTINUEincr aaParams(v_huntpos)
}proc act_LegDone { } {
global isDebug
global aaParamsset status [infotag get evt_status]
if { $isDebug == "true" } {
puts "\n proc act_LegDone: $status"
}regexp {([0-9][0-9][0-9])} $status StatusCode
if { $StatusCode != "000" } {
if { $StatusCode == "007" } { incr aaParams(v_delay) } else { set aaParams(v_delay) 1 }if { ($aaParams(v_huntpos) > [llength $aaParams(list)]) && ($aaParams(v_delay) <= [llength $aaParams(list)]) } {
set aaParams(v_media_playing) 0
set aaParams(v_huntpos) 1media play leg_incoming %s1000 _op_busy.au %s1500
fsm setstate MEDIAOUT
} elseif { ($aaParams(v_huntpos) > [llength $aaParams(list)]) && ($aaParams(v_delay) > [llength $aaParams(list)]) } {
set aaParams(v_huntpos) 1timer start named_timer 10 waitwaitwait
set aaParams(v_delay) 1
if { $aaParams(v_media_playing) == 0 } {
media play leg_incoming %s1000 _op_busy.au %s500 $aaParams(moh)
set aaParams(v_media_playing) 1
}fsm setstate WAITWAITWAIT
} else {
act_HuntAgain
}
}
}proc act_LegDoneRinging { } {
global isDebug
global aaParamsset status [infotag get evt_status]
if { $isDebug == "true" } {
puts "\n proc act_LegDoneRinging: $status"
}regexp {([0-9][0-9][0-9])} $status StatusCode
if { $StatusCode != "000" } {
act_Select
}
}proc act_Select { } {
global isDebug
global promptFlag2
global destBusy
global param1
global fcnt
global retrycnt
global busyPrompt
global aaParams
if { $isDebug == "true" } {
puts "\n proc act_Select"
}set promptFlag2 0
set param1(interruptPrompt) true
set param1(abortKey) *
set param1(terminationKey) #
set param1(dialPlan) true
set param1(dialPlanTerm) trueleg collectdigits leg_incoming param1
if { $fcnt < $retrycnt } {
media play leg_incoming $busyPrompt %s500 _enter_dest_$aaParams(aaPilot).au
incr fcnt
fsm setstate GETDEST
} else {
act_DestBusy
}
}proc act_DestBusy { } {
global isDebug
if { $isDebug == "true" } {
puts "\n proc act_DestBusy"
}media play leg_incoming _disconnect.au
fsm setstate CALLDISCONNECT
}proc act_Debug { } {
global isDebug
if { $isDebug == "true" } {
set evtName [infotag get evt_event]
puts "act_Debug got: $evtName"
}
}proc act_Cleanup { } {
puts "Call finished"
call close
}requiredversion 2.0
init
init_ConfigVarsset fsm(any_state,ev_disconnected) "act_Cleanup same_state"
set fsm(any_state,ev_disconnect_done) "act_Cleanup same_state"set fsm(any_state,ev_any_event) "act_Debug same_state"
set fsm(CONTINUE,ev_setup_done) "act_LegDone same_state"
set fsm(WAITWAITWAIT,ev_setup_done) "act_LegDone same_state"
set fsm(JUSTMUSIC,ev_setup_done) "act_LegDone same_state"
set fsm(RINGING,ev_setup_done) "act_LegDoneRinging same_state"set fsm(CALL_INIT,ev_setup_indication) "act_Setup GETDEST"
set fsm(GETDEST,ev_collectdigits_done) "act_GotDest HANDOFF"
set fsm(MEDIAOUT,ev_media_done) "act_HuntAgain CONTINUE"
set fsm(WAITWAITWAIT,ev_named_timer) "act_MediaHunt CONTINUE"
set fsm(WAITWAITWAIT,ev_media_done) "act_NoMediaHunt CONTINUE"
set fsm(CALLDISCONNECT,ev_media_done) "act_Cleanup same_state"
set fsm(JUSTMUSIC,ev_media_done) "act_JustMusic JUSTMUSIC"
fsm define fsm CALL_INIT