; Disa using voicemail passowords via agi [custom-disa] exten => s,1,Set(LOOPCOUNT=0) exten => s,n,Answer exten => s,n,Wait(1) exten => s,n(begin),Set(TIMEOUT(digit)=3) exten => s,n,Set(TIMEOUT(response)=10) exten => s,n,Playback(please-enter-the&extension) exten => s,n,Read(ext_num,then-press-pound,,) exten => s,n,Wait(1) exten => s,n,Playback(pls-enter-vm-password) exten => s,n,Read(ext_pwd,then-press-pound,,) exten => s,n,Wait(1) exten => s,n,agi,chk_vm_pwd.agi|/etc/asterisk/voicemail.conf|${ext_num}|${ext_pwd} exten => s,n,GotoIf($["${result}" = "0"]?D:custom-disa,i,1) exten => s,n,Set(CALLERIDNUM=${ext_num}) exten => s,n(D),DISA(no-password|from-internal) exten => h,1,Hangup exten => i,1,Playback(invalid) exten => i,n,Goto(loop,1) exten => t,1,Goto(loop,1) exten => loop,1,Set(LOOPCOUNT=$[${LOOPCOUNT} + 1]) exten => loop,n,GotoIf($[${LOOPCOUNT} > 2]?hang,1) exten => loop,n,Goto(custom-disa,s,begin) exten => hang,1,Playback(vm-goodbye) exten => hang,n,Hangup ---------------------------------cut here------------------------------------------------- #!/usr/bin/perl # AGI script that searchs for a match on an extension and password in # a voicemail.conf file # # Parameters: | | # # # Written by: Andre D. Correa (03/jun/2005) # use Asterisk::AGI; $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); # Set variables according to supplied arquments # Variables sanitation is not an issue as it is being run from extentions.conf $vmconf = $ARGV[0]; $exten = $ARGV[1]; $pwd = $ARGV[2]; # Open VoiceMail configuration file read only open VMCONF, "<$vmconf"; @vmconf_lines = ; close VMCONF; &error_msg("Cannot open $vmconf file read only.") if $#vmconf_lines eq -1; foreach (@vmconf_lines){ next if $_ !~ /^\d/; $_ =~ s/\s//iog; $_ =~ s/=>/=/iog; $_ =~ s/=/\,/; (@line_args) = split(/\,/, $_); if ($exten eq $line_args[0]){ # We got the right extension if ($pwd eq $line_args[1]){ # User provided the right pwd $AGI->set_variable('result','0'); } else { # Wrong password - bye! $AGI->set_variable('result','1'); } } } exit; sub error_msg() { my($err_msg) = @_; $AGI->verbose($err_msg); $AGI->hangup(); die $err_msg; }