我试着根据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]voicemain(“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})})
当我用DB中存在的数字调用时,我得到了无穷大的循环,如下所示。。根据我的理解,我应该在控制台输出中看到context
[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来检查用户。