#!/usr/bin/perl # # Simple AGI calling card application with RADIUS authentication via agi-rad-auth.agi # (c) LANBilling (www.lanbilling.ru) # by Murashkin Artem # use Asterisk::AGI; $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); my ($try, $status, $pin, $num, $username); $try = 0; $status = 'REJECT'; # First we try ANI auth $username = $1 if $input{'callerid'} =~ /<(\d+)>/; $pin = 'qwerty'; $AGI->exec("agi","agi-rad-auth.agi|Mode=AuthOnly&Username=$username&Password=$pin&IfFailed=DoNotHangup"); $status = $AGI->get_variable('RADIUS_Status'); $status = 'NoResponce' unless defined $status; # Promt for card number and pin if failed ANI auth while (($try<3)&&($status eq 'REJECT')) { $username = $AGI->get_data("card-number", "10000"); $pin = $AGI->get_data("enter-password", "10000"); $AGI->exec("agi","agi-rad-auth.agi|Mode=AuthOnly&Username=$username&Password=$pin&IfFailed=DoNotHangup"); $status = $AGI->get_variable('RADIUS_Status'); $status = 'NoResponce' unless defined $status; $AGI->verbose("RADIUS status = $status", 3); $AGI->stream_file('wrong-try-again-smarty') if $status eq 'REJECT'; $try++; } if ($status eq 'REJECT'){ $AGI->stream_file('goodbye'); $AGI->hangup(); exit(0); } else { if ($status eq 'NoResponce'){ $AGI->stream_file('service'); $AGI->stream_file('unavailable'); $AGI->stream_file('pls-try-call-later'); $AGI->hangup(); exit(0); } else { if ($status ne 'ACCEPT'){ $AGI->stream_file('cannot-complete-temp-error'); $AGI->hangup(); exit(0); }}} my $balance = $AGI->get_variable('h323-credit-amount'); if (defined $balance){ my $dollars = int($balance); my $cents = int($balance*100)%100; $AGI->stream_file('vm-youhave'); $AGI->say_number($dollars); $AGI->stream_file('dollars'); $AGI->say_number($cents); $AGI->stream_file('cents'); } # Promt for telephone number to dial my $confirm = 0; my $confirm_try = 0; while ( ($confirm != 1) && ($confirm_try < 3) ){ $try = 0; $num=''; while (($try<3)&&($num eq '')) { $AGI->stream_file('talking-to-myself') if $try>0; $num = $AGI->get_data("telephone-number", "10000"); $try++; } if (($try >= 3)&&($num eq '')){ $AGI->stream_file('goodbye'); $AGI->hangup(); exit(0); } $try = 0; $confirm = 0; while (($confirm != 1)&&($confirm !=2)&&($try<3)){ $AGI->stream_file('you-entered'); $AGI->say_digits($num); $AGI->stream_file('if-correct-press'); $AGI->stream_file('digits/1'); $AGI->stream_file('otherwise-press'); $confirm = $AGI->get_data('digits/2',10000,1); $try++; } if (($try>=3)&&($confirm != 1)&&($confirm != 2)){ $confirm_try = 3; } else { $confirm_try++; } } if (($confirm_try >= 3)&&($confirm != 1)){ $AGI->stream_file('goodbye'); $AGI->hangup(); exit(0); } $AGI->set_variable('DNID2',$num); $AGI->exec("agi","agi-rad-auth.agi|Mode=Account&Username=$username&Password=$pin&IfFailed=DoNotHangup"); $status = $AGI->get_variable('RADIUS_Status'); $status = 'NoResponce' unless defined $status; $AGI->verbose("RADIUS status = $status", 3); if ($status eq 'REJECT'){ $AGI->stream_file('sorry-cant-let-you-do-that'); $AGI->stream_file('goodbye'); $AGI->hangup(); exit(0); } else { if ($status eq 'NoResponce'){ $AGI->stream_file('service'); $AGI->stream_file('unavailable'); $AGI->stream_file('pls-try-call-later'); $AGI->hangup(); exit(0); } else { if ($status ne 'ACCEPT'){ $AGI->stream_file('cannot-complete-temp-error'); $AGI->hangup(); exit(0); }}} my $ctime = $AGI->get_variable('Session-Time'); $ctime = $AGI->get_variable('h323-credit-time') unless defined $ctime; if(defined $ctime){ my $cmin = int($ctime/60); my $csec = $ctime%60; $AGI->stream_file('vm-youhave'); $AGI->say_number($cmin); $AGI->stream_file('minutes'); $AGI->say_number($csec); $AGI->stream_file('seconds'); } # Go on! '${DNID2}' is number to dial $AGI->stream_file('pls-wait-connect-call'); exit(0);