我正在尝试根据mysql响应制定带有条件的拨号计划。我想要实现的是当用户调用他的语音邮件脚本以检查是否有任何消息留给他/她时。如果没有消息转到其他菜单或其他菜单。
所以我有这个简单的 shell 脚本 check.sh
#!/bin/bash
# Check if user has any messages left to him
count=$(mysql -u mysql -pMYPASS -h xxx.xxx.xxx.xxx asterisk -se "select count(mailboxuser) from voicemessages where mailboxuser=8785;")
if [ $count -gt 0 ]
then
//echo " greater that 0 "
else
//echo " lower than 0 "
fi
到目前为止的拨号计划
[internal]
exten => 119,1,Set(CHANNEL(language)=en)
same => n, System(check.sh ${CALLERID})
same => n,VoicemailMain(${CALLERID(num)}@VoiceMail)
same => n,Hangup
当我拨打 119 时,我在控制台中看到这个
-- 在新堆栈中执行 [119@internal:1] Set("SIP/8785-00000058", "CHANNEL(language)=en")
-- 在新堆栈中执行 [119@internal:2] 系统("SIP/8785-00000058"、"check.sh 8785")
-- 在新堆栈中执行 [119@internal:3] VoiceMailMain("SIP/8785-00000058"、"8785@VoiceMail")
对于查询,我只想检查是否大于 0。如果更大,则表示用户有 1+ 条消息。问题是如何在此拨号计划中获取响应并正确构造if/then/gotoif条件。第一次处理这个,我不知道如何做到这一点。
当我在控制台中运行它时,我得到了这样的响应,这是正确的
*CLI> !/var/lib/asterisk/agi-bin/check.sh
lower than 0
这也是这样做的正确方法还是还有其他方法?
更新:
现在我func_odbc.conf
里有这个
[EXIST]
dsn=asterisk
readsql=SELECT COUNT(mailboxuser) FROM voicemessages WHERE mailboxuser='${SQL_ESC(${ARG1})}'
然后在我的扩展中
[internal]
exten => 119,1,Set(CHANNEL(language)=en)
same => n,GotoIf($[${ODBC_EXIST(${CALLERID(num)})}]?${test:4},1:${MAINMENU:3},1)
same => n,VoicemailMain(${CALLERID(num)}@VoiceMail)
same => n,Hangup
[test]
exten => _[a-z].,1,Set(SAFE_EXTEN=${FILTER(0-9,${EXTEN})})
当我调用数据库中存在的号码时,我有无穷大循环,它是波纹管。根据我的理解,我应该在控制台输出中看到上下文[test]
,对吧?我在这里搞砸了什么?
-- 在新堆栈中执行 [119@internal:1] Set("SIP/8785-00000061", "CHANNEL(language)=en")
-- 在新堆栈中执行 [119@internal:2] GotoIf("SIP/8785-00000061", "0?,1:,1")
-- 转到 (内部,119,1)
-- 在新堆栈中执行 [119@internal:1] Set("SIP/8785-00000061", "CHANNEL(language)=en")
-- 在新堆栈中执行 [119@internal:2] GotoIf("SIP/8785-00000061", "0?,1:,1")
-- 转到 (内部,119,1)
-- 在新堆栈中执行 [119@internal:1] Set("SIP/8785-00000061", "CHANNEL(language)=en")
-- 在新堆栈中执行 [119@internal:2] GotoIf("SIP/8785-00000061", "0?,1:,1")
-- 转到 (内部,119,1)
系统命令不返回任何星号。
您已使用AGI界面或(更好)使用func_ODBC来检查用户。