[Asterisk-Users] VM Outcall: Rube Goldberg Edition
Eric Wieling aka ManxPower
eric at fnords.org
Fri Jul 15 07:43:03 MST 2005
Kevin wrote:
> Is the pager filed in the vm config still for the outcall destination or
> where do you specify the number to call for the outcall?
Sorry.
You use notify= option in voicemail.conf:
3532 => 8711,Toni Hawkins,,,tz=central,notify=15045556389
> -----Original Message-----
> From: Eric Wieling aka ManxPower [mailto:eric at fnords.org]
> Sent: Sunday, July 10, 2005 5:11 PM
> To: Kevin; asterisk-users at lists.digium.com
> Subject: [Asterisk-Users] VM Outcall: Rube Goldberg Edition
>
> Resent to the list since I didn't think you would mind.
>
> Kevin wrote:
>
>>Eric,
>>
>>I have been using your vm outcall script for some time and it has
>
> worked
>
>>well. Thanks for your efforts.
>>
>>I am trying to re-install and I can't seem to get a call file
>
> generated.
>
>>I have set up postfix and in the log it appears that it pipes the
>>message to the vmoutcall script. But that's as far as I get.
>>
>>I was hopeful that you could offer a suggestion on how to debug the
>>activity of the script so I can try to figure out why it isn't
>
> working.
>
> I don't provide support for any of the sample scripts, etc that I write.
>
> The original VM Outcall was very primitive. Now that Asterisk has the
> externnotify= option I have a much better, but still pretty primitive,
> script.
>
> In /etc/voicemail.conf, in [general] put:
> ========================================================================
> ===
> externnotify=/usr/local/bin/vm-notify.pl
> ========================================================================
> ===
>
> Here is the vm-notify.pl script:
> ========================================================================
> ===
> #!/usr/bin/perl -w
> use Fcntl;
> use Fcntl ":flock";
>
> $dial_context="local-access";
>
> ($vm_box, $vm_context) = $ARGV[1] =~/(.*)\@(.*)/;
> $current_vm_context = "";
>
> if(!sysopen($vm_conf_file_handle, "/etc/asterisk/voicemail.conf",
> O_RDONLY))
> {
> printf("Cannot open /etc/asterisk/voicemail.conf!\n");
> exit(1);
> }
>
> while($vm_conf_line = <$vm_conf_file_handle>) {
> chomp($vm_conf_line);
> if((substr($vm_conf_line,0,1) eq ";") || (length($vm_conf_line) ==
> 0)) {
> next;
> }
> ($tmp_vm_context) = $vm_conf_line =~ /\[(.*)\]/;
> if(defined($tmp_vm_context)) {
> if($current_vm_context ne "") {
> exit(0);
> }
> if($tmp_vm_context eq $vm_context) {
> $current_vm_context = $vm_context;
> next;
> }
> } else {
> if($current_vm_context eq $vm_context) {
> ($tmp_vm_box) = $vm_conf_line =~ /(\d+)/;
> if($tmp_vm_box eq $vm_box) {
> ($dial_dest) = $vm_conf_line =~ /.*notify=(\d+)/;
> if(!defined($dial_dest)) {
> exit(0);
> }
> close($vm_conf_file_handle);
>
> # If there's already a .call file for this mailbox then don't
> do anything.
> # If there isn't already a .call file then create it.
> #$call_file_name = "/tmp/" . $vm_box . ".call";
> $call_file_name = "/var/spool/asterisk/outgoing/" . $vm_box .
> ".call";
> if(!sysopen($call_file_handle, "$call_file_name",
> O_WRONLY|O_CREAT|O_EXCL)) {
> exit(0);
> }
> flock($call_file_handle, LOCK_EX);
>
> # Set the access and modification times to be 10 years in the
> future so
> # Asterisk will ignore this file while we are doing stuff with
> it.
> $long_time = time() + (10 * 365 * 24 * 60 * 60);
> utime($long_time, $long_time, "$call_file_name");
>
> srand;
> $call_delay=300 + rand(120);
>
> # Build our .call file.
> printf($call_file_handle "Channel:
> Local/^%s^%s^%s^%s\@vm-notify\n", $vm_box, $vm_context, $dial_dest,
> $dial_context);
> printf($call_file_handle "WaitTime: 30\n");
> printf($call_file_handle "RetryTime: %i\n", 60 + rand(5));
> printf($call_file_handle "MaxRetries: 12\n");
> printf($call_file_handle "Context: vm-notify\n");
> printf($call_file_handle "Extension: s\n");
> printf($call_file_handle "Priority: 1\n");
> printf($call_file_handle "Callerid: Voicemail Notify
> \<9852463509\>\n");
> printf($call_file_handle "SetVar: VM_BOX=%s\n", $vm_box);
> printf($call_file_handle "SetVar: VM_CONTEXT=%s\n",
> $vm_context);
>
> # Unlock and close the file.
> flock($call_file_handle, LOCK_UN);
> close($call_file_handle);
>
> # Set the access and modification times to be 10 mins in the
> future so
> #Asterisk will delay for 10 mins before processing this .call
> file
> $short_time = time() + $call_delay;
> utime($short_time, $short_time, "$call_file_name");
>
> exit(0);
>
> }
> } else {
> next;
> }
> }
> }
>
> ========================================================================
> ===
>
> In /etc/asterisk/extensions.conf you need to put this:
> ========================================================================
> ===
> [vm-notify]
>
> exten => _^X.,1,Cut(VM_BOX=EXTEN,^,2)
> exten => _^X.,2,Cut(VM_CONTEXT=EXTEN,^,3)
> exten => _^X.,3,Cut(DIAL_DEST=EXTEN,^,4)
> exten => _^X.,4,Cut(DIAL_CONTEXT=EXTEN,^,5)
> exten => _^X.,5,HasNewVoiceMail(${VM_BOX}@${VM_CONTEXT})
> exten => _^X.,6,Answer
> exten => _^X.,7,Hangup
> exten => _^X.,106,Dial(Zap/g2/${DIAL_DEST},20)
> exten => _^X.,107,Noop(DIALSTATUS=${DIALSTATUS})
> exten => _^X.,108,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?111)
> exten => _^X.,109,GotoIf($[${DIALSTATUS} = CONGESTION]?111)
> exten => _^X.,110,Answer
> exten => _^X.,111,Hangup
>
> exten => s,1,Wait(1)
> exten => s,2,HasNewVoiceMail(${VM_BOX}@${VM_CONTEXT},VM_NUMBER)
> exten => s,3,Hangup
> exten => s,103,SetVar(LOOP=1)
> exten => s,104,ResponseTimeout(1)
> exten => s,105,Background(vm-youhave)
> exten => s,106,SayNumber(${VM_NUMBER})
> exten => s,107,Background(vm-INBOX)
> exten => s,108,Background(vm-messages)
> exten => s,109,Background(vm-for)
> exten => s,110,Background(extension)
> exten => s,111,SayDigits(${VM_BOX})
> exten => s,112,Background(vm-instructions)
>
> exten => 1,1,ResponseTimeout(0)
> exten => 1,2,VoicemailMain(${VM_BOX}@${VM_CONTEXT})
>
> exten => #,1,Playback(goodbye)
> exten => #,2,Hangup
>
> exten => t,1,GotoIf($[${LOOP} > 3]?#,1)
> exten => t,2,SetVar(LOOP=$[${LOOP} + 1])
> exten => t,3,Goto(s,104)
>
> ========================================================================
> ===
>
>
> Why all the crap with CUT and ^ asd that weird pattern match? Well, as
> far as I can tell when, in a .call file, you use SetVar, it does NOT set
>
> those variables for "Channel: Local/" leg of the call, only the
> "Context: Extension: Priority:" part of the call.
>
> This script, run by externnotify, creates a .call file that "calls" a
> Local/ channel. That channel runs an extension that checks to see if
> the user has new voicemail. Maybe they checked their voicemail between
> the time the .call file was created (when the message was left) and the
> time the .call file actually runs. The script makes sure the .call file
>
> will run about 10 mins in the future.
>
> If the user has no new voicemail, the extension answers and then hangs
> up the call. This makes sure the .call system knows that the call was
> "answered".
>
> If there is still new voicemail, then the call happens, and the person
> is told how many messages they have, and have a chance to log into
> voicemail. I would like to be able to detect voicemail answering and
> not start playing prompts unless a human answers.
>
> --Eric
--
Always do right. This will gratify some people and astonish the rest.
Mark Twain
More information about the asterisk-users
mailing list